From 25ba2331c8d9ffc0caba0c05c8b53979b072bbbd Mon Sep 17 00:00:00 2001 From: gHashTag Date: Wed, 9 Sep 2026 16:23:48 +0000 Subject: [PATCH 1/3] feat(website): system documentation #/docs from specs/docs and Queen PROJECT tab (key p) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Round 2 - item D (D2 trinity side + D3). D2 - documentation generated from t27 specs/docs - scripts/docs-from-specs.mjs: compiles vendored specs/docs/**.t27 with the pinned t27_compiler.wasm, joins docs/system/*.md prose (EN) and the RU bundle from specs/i18n/docs-ru.t27 (via i18n/docs.ru.json), and writes public/docs/system-docs.json (7 chapters, 32 sections, 7 tables, 6 figures, laws 7, phases 7, 31 SOURCES). Wired into prebuild. - qa/docs-spec-contract.mjs (npm run check:docs): every chapter has a body, every SOURCES path exists in the vendored tree or the checkout, every generated table is non-empty, no forbidden superlatives in EN/RU prose, routes/figures/print CSS/jumps present, DOCS_URL points at #/docs. - scripts/docs-from-specs.test.mjs (8 tests). - src/pages/SystemDocs.tsx (#/docs, #/docs/:chapter, ?embed=1): left TOC, prose + generated tables, six data-driven inline SVG figures in src/components/SystemDocsFigures.tsx (five-layer ladder with live counts, 27-letter agent ring, 6+1 phase cycle, law hierarchy, skills-crons-agents graph, tools family map), each with caption and data-source line; print-friendly CSS; EN/RU toggle via site i18n. - Navigation/Footer/ProductionDashboard: DOCS_URL -> #/docs (was t27.ai/docs). - Vendored byte-identical copies from t27@2518951 (specs/docs/**, docs/system, specs/i18n/docs-ru.t27, SOUL.md, AGENTS.md, CLAUDE.md, constitution, alphabet, TASK_PROTOCOL, README-ZENODO, TNF-ARTICLE reports). D3 - Queen GAME TAB "project" - New module project (PROJECT / ПРОЕКТ), key p (digits exhausted), glyph §, documented in the rail hint and in qa/agents-spec-contract.mjs (keys 1234567890p). Embeds SystemDocs in embed mode with quick jumps: Project / Rules of the game / System / Alphabet / Tooling / Witnesses. - Rail with 11 items: rows follow the item count, rail scrolls when needed, "Collapse" is sticky and always last; below 760px the rail switches to two-column tiles. Chromium screenshots 1280x600/700/900 captured locally (collapse below all tiles, no overflow, 0 console errors). - ModulesBlock counts read MODULES.length instead of hand-written words. Checks (local): check:docs, check:agents, check:tools, check:spec-catalog, check:skills-catalog, check:crons-catalog, check:explorer-languages, check:queen-languages PASS; node --test scripts/*.test.mjs 92/92; typecheck:ratchet 179/26 = baseline; eslint 180 = baseline; vite build OK. check:queen-viewport still FAIL on the pre-existing undeclared scrollers (hud-viewport, hud-intel, alerts slot); the rail is now a declared scroller. --- apps/website/i18n/docs.ru.json | 38 ++ apps/website/package.json | 8 +- apps/website/public/agents/spec-agents.json | 2 +- apps/website/public/crons/spec-crons.json | 2 +- apps/website/public/docs/system-docs.json | 1 + .../public/functions/spec-functions.json | 2 +- apps/website/public/skills/spec-skills.json | 2 +- apps/website/public/t27/files/AGENTS.md | 93 +++ apps/website/public/t27/files/CLAUDE.md | 175 ++++++ .../website/public/t27/files/README-ZENODO.md | 81 +++ apps/website/public/t27/files/SOUL.md | 263 ++++++++ .../public/t27/files/docs/T27-CONSTITUTION.md | 135 ++++ .../t27/files/docs/agents/AGENTS_ALPHABET.md | 581 +++++++++++++++++ .../files/docs/coordination/TASK_PROTOCOL.md | 133 ++++ .../docs/reports/TNF-ARTICLE-AUDIT-W845.md | 156 +++++ .../reports/TNF-ARTICLE-RECONCILIATION.md | 125 ++++ .../public/t27/files/docs/system/alphabet.md | 63 ++ .../public/t27/files/docs/system/evidence.md | 92 +++ .../public/t27/files/docs/system/layers.md | 83 +++ .../public/t27/files/docs/system/project.md | 91 +++ .../public/t27/files/docs/system/queen.md | 68 ++ .../public/t27/files/docs/system/rules.md | 129 ++++ .../public/t27/files/docs/system/tooling.md | 58 ++ .../public/t27/files/specs/docs/README.md | 90 +++ .../files/specs/docs/chapters/alphabet.t27 | 30 + .../files/specs/docs/chapters/evidence.t27 | 30 + .../t27/files/specs/docs/chapters/layers.t27 | 30 + .../t27/files/specs/docs/chapters/project.t27 | 30 + .../t27/files/specs/docs/chapters/queen.t27 | 30 + .../t27/files/specs/docs/chapters/rules.t27 | 30 + .../t27/files/specs/docs/chapters/tooling.t27 | 30 + .../public/t27/files/specs/docs/system.t27 | 23 + .../public/t27/files/specs/i18n/docs-ru.t27 | 34 + apps/website/public/tools/spec-tools.json | 2 +- apps/website/qa/agents-spec-contract.mjs | 21 +- apps/website/qa/docs-spec-contract.mjs | 259 ++++++++ .../website/qa/explorer-language-contract.mjs | 1 + apps/website/qa/queen-viewport-contract.mjs | 11 +- apps/website/scripts/agents-from-specs.mjs | 10 +- apps/website/scripts/docs-from-specs.mjs | 585 ++++++++++++++++++ apps/website/scripts/docs-from-specs.test.mjs | 207 +++++++ apps/website/src/components/Footer.tsx | 2 +- apps/website/src/components/ModulesBlock.tsx | 15 +- apps/website/src/components/Navigation.tsx | 7 +- .../src/components/ProductionDashboard.tsx | 2 +- apps/website/src/components/QueenAgents.tsx | 82 ++- .../src/components/SystemDocsFigures.tsx | 283 +++++++++ apps/website/src/components/queenHud.ts | 7 +- apps/website/src/lib/queenModules.ts | 15 + apps/website/src/lib/systemDocs.ts | 138 +++++ apps/website/src/main.tsx | 6 + apps/website/src/pages/Queen.css | 65 +- apps/website/src/pages/Queen.tsx | 33 +- apps/website/src/pages/SystemDocs.tsx | 400 ++++++++++++ 54 files changed, 4840 insertions(+), 49 deletions(-) create mode 100644 apps/website/i18n/docs.ru.json create mode 100644 apps/website/public/docs/system-docs.json create mode 100644 apps/website/public/t27/files/AGENTS.md create mode 100644 apps/website/public/t27/files/CLAUDE.md create mode 100644 apps/website/public/t27/files/README-ZENODO.md create mode 100644 apps/website/public/t27/files/SOUL.md create mode 100644 apps/website/public/t27/files/docs/T27-CONSTITUTION.md create mode 100644 apps/website/public/t27/files/docs/agents/AGENTS_ALPHABET.md create mode 100644 apps/website/public/t27/files/docs/coordination/TASK_PROTOCOL.md create mode 100644 apps/website/public/t27/files/docs/reports/TNF-ARTICLE-AUDIT-W845.md create mode 100644 apps/website/public/t27/files/docs/reports/TNF-ARTICLE-RECONCILIATION.md create mode 100644 apps/website/public/t27/files/docs/system/alphabet.md create mode 100644 apps/website/public/t27/files/docs/system/evidence.md create mode 100644 apps/website/public/t27/files/docs/system/layers.md create mode 100644 apps/website/public/t27/files/docs/system/project.md create mode 100644 apps/website/public/t27/files/docs/system/queen.md create mode 100644 apps/website/public/t27/files/docs/system/rules.md create mode 100644 apps/website/public/t27/files/docs/system/tooling.md create mode 100644 apps/website/public/t27/files/specs/docs/README.md create mode 100644 apps/website/public/t27/files/specs/docs/chapters/alphabet.t27 create mode 100644 apps/website/public/t27/files/specs/docs/chapters/evidence.t27 create mode 100644 apps/website/public/t27/files/specs/docs/chapters/layers.t27 create mode 100644 apps/website/public/t27/files/specs/docs/chapters/project.t27 create mode 100644 apps/website/public/t27/files/specs/docs/chapters/queen.t27 create mode 100644 apps/website/public/t27/files/specs/docs/chapters/rules.t27 create mode 100644 apps/website/public/t27/files/specs/docs/chapters/tooling.t27 create mode 100644 apps/website/public/t27/files/specs/docs/system.t27 create mode 100644 apps/website/public/t27/files/specs/i18n/docs-ru.t27 create mode 100644 apps/website/qa/docs-spec-contract.mjs create mode 100644 apps/website/scripts/docs-from-specs.mjs create mode 100644 apps/website/scripts/docs-from-specs.test.mjs create mode 100644 apps/website/src/components/SystemDocsFigures.tsx create mode 100644 apps/website/src/lib/systemDocs.ts create mode 100644 apps/website/src/pages/SystemDocs.tsx diff --git a/apps/website/i18n/docs.ru.json b/apps/website/i18n/docs.ru.json new file mode 100644 index 0000000000..a41d92b936 --- /dev/null +++ b/apps/website/i18n/docs.ru.json @@ -0,0 +1,38 @@ +{ + "$spec": "specs/i18n/docs-ru.t27", + "locale": "ru", + "$note": "Russian text for the system documentation; keyed by the ID constant of specs/docs/**. BODY is Markdown with the same level-2 headings, in the same order, as the English body named by BODY_EN. Edit here; the specs stay English-only.", + "entries": { + "docs/system": { + "TITLE": "t27 / Trinity -- система, её правила и её доказательства" + }, + "docs/project": { + "TITLE": "Проект", + "BODY": "## Что такое t27 и Trinity\n\n**t27** -- язык спецификаций и инструментальная цепочка. Файл `.t27` в одном месте объявляет поведение, константы, тесты и инварианты; компилятор (`t27c`, вызываемый командой `tri`) проверяет файл, порождает код для целевых бэкендов (Zig, C, Verilog) и прогоняет тесты, записанные внутри спецификации. Репозиторий `gHashTag/t27` хранит язык, компилятор, корпус спецификаций и канонические документы, определяющие, как в нём работают агенты и люди (`SOUL.md`, `AGENTS.md`, `docs/T27-CONSTITUTION.md`).\n\n**Trinity** -- программа вокруг t27: семейство численных форматов GoldenFloat, построенное на тождестве phi^2 + 1/phi^2 = 3, аппаратная проверка этих форматов на одной плате FPGA и публичный сайт `t27.ai` (репозиторий `gHashTag/trinity`, `apps/website`), который отображает корпус спецификаций, навыки, расписания, агентов и инструменты через настоящий компилятор, собранный в WebAssembly. Сайт не пересказывает спецификации: он компилирует их при сборке и показывает вердикты.\n\nПравило, связывающее обе части, -- spec-first: логика проекта рождается в `.t27`, а языки-хосты -- Rust для бутстрап-компилятора, TypeScript для сайта, Zig, C и Verilog как порождаемый код -- являются подчинёнными реализациями. `docs/T27-CONSTITUTION.md`, статья SSOT-MATH, формулирует это для математики и численных вопросов; `AGENTS.md`, раздел 3, повторяет для любого изменения (\"Specs are source of truth\").\n\n## Утверждения и их статус\n\nКаждое утверждение в этой документации несёт один из пяти статусных тегов, и таблица, которую сайт выводит рядом с этой главой, повторяет их вместе с файлом-источником:\n\n- `[measured]` -- число, полученное запуском чего-либо, чей вывод лежит в репозитории или в публичном журнале CI, с записанной командой и коммитом.\n- `[declared]` -- заявлено в спецификации или каноническом документе; запуском (пока) не проверено.\n- `[specified]` -- существует как спецификация `.t27`, проходящая проверку типов; реализация не заявляется.\n- `[external]` -- значение взято из источника вне двух репозиториев; цитируется, здесь не воспроизводится.\n- `[not claimed]` -- явно вне того, что проект утверждает сегодня.\n\nУтверждения, которые эта глава готова сделать, с тегами:\n\n- Каталог GoldenFloat содержит 83 формата `[declared]` -- `FAMILY_TOTALS.catalog` в `trinity:apps/website/src/data/siliconHistory.ts`, перенесённый из отчёта об аппаратной конформности `gHashTag/trinity-fpga` (v0.2), который является опубликованным источником каждой аппаратной цифры на сайте.\n- Аппаратные числа существуют для подмножества каталога `[measured]`: на v0.2 тот же файл фиксирует 27 форматов на уровне Tier E (публичная цепочка: id запуска CI, SHA-256 битстрима, прошивка по JTAG, журнал UART), 13 с декодированием в железе, 7 с ADD и 7 с MUL в железе и 62 с побитово точной программной моделью. Объединение аппаратных осей меньше 83; точное значение объединения приведено в отчёте trinity-fpga и здесь не повторяется.\n- Каждое аппаратное число измерено на одной плате `[measured]`: ALINX AX7203, Xilinx Artix-7 `xc7a200tfbg484-2`, открытая цепочка (yosys, nextpnr-xilinx, Project X-Ray), `DEVICE` и `TOOLCHAIN` в том же файле.\n- Навыки, расписания, агенты и инструменты на сайте порождаются из спецификаций `.t27` через вендорный wasm компилятора `[measured]`: счётчики находятся в заголовке-лестнице каждого обозревателя и в главе \"Свидетели и доказательства\"; `typecheck.ok` каждой спецификации записан в JSON, который сайт отдаёт.\n\n## Границы\n\nЧего проект **не** утверждает, его собственными словами:\n\n- **Кремния нет.** `[not claimed]` Дизайн под SKY130 был подготовлен через Tiny Tapeout; заявки TTSKY26a/TTSKY26b были отозваны до изготовления с возвратом средств, поэтому кристалла не существует и никакое измерение на кремнии не заявляется (`trinity:apps/website/src/content/tnf.ts`, ответ \"Is this an ASIC result?\"). Отображение в ASIC и многоугловая характеризация также не заявляются. Аппаратная граница -- названная выше FPGA.\n- **Слов-рейтингов нет.** Канон запрещает слова-рейтинги -- превосходные и исключающие эпитеты, перечисленные в правилах каталога `specs/docs/README.md`, -- в собственной прозе проекта; контроль качества сайта (`check:docs`, `check:queen-honesty`) роняет сборку, в которой они встречаются. Сравнения даются как числа с источником либо не даются вовсе.\n- **Verilog, который компилятор t27 порождает из спецификации формата, -- это оболочка модуля**: по корпусу он даёт 0 LUT и 0 триггеров (`siliconHistory.ts`, примечание о происхождении). Результаты на FPGA принадлежат рукописному RTL, проверенному против независимого оракула. Спецификация и RTL описывают один и тот же формат; это не один и тот же артефакт.\n- **`typecheck.ok` от wasm необходим, но не достаточен.** Он остаётся `true` при неверной аннотации вроде `str = 5`; генераторы сайта поверх него проверяют схему полей каждой карточки (`specs/skills/README.md`).\n- **Два репозитория, два списка.** Инструменты, агенты и задания `gHashTag/t27` и `gHashTag/trinity` записаны под своим `REPO`; ничего не слито в один список.\n\n## Как читать эту документацию\n\nСемь глав объявлены в `specs/docs/system.t27` и по одной спецификации на главу в `specs/docs/chapters/`. Каждая спецификация главы называет свои `SOURCES` (цитируемые файлы), `SECTIONS` (заголовки этого текста, проверяемые при сборке), фигуру, которую сайт рисует по данным (`DIAGRAM`), и таблицу, порождаемую из каталогов (`TABLE`). Английская проза канонична и лежит в `docs/system/.md` в `gHashTag/t27`; русский текст идёт через контракт перевода `specs/i18n/docs-ru.t27` и бандл, который он называет в `gHashTag/trinity`. При расхождении побеждает английский.\n\nКаждая фигура на сайте несёт подпись и строку источника данных: JSON, из которого она нарисована, и коммит, на котором этот JSON порождён. Каждая таблица порождена; ни одна не набрана вручную. Число без строки источника -- дефект; сообщайте о нём как о дефекте.\n" + }, + "docs/rules": { + "TITLE": "Конституция и правила игры для агентов", + "BODY": "## Конституционный стек\n\n`AGENTS.md` -- точка входа для людей и кодирующих агентов; его раздел 1 задаёт порядок чтения и то, какой документ побеждает при расхождении:\n\n1. `SOUL.md` -- каноническая конституция: языковая политика, мандат TDD, валидация.\n2. `docs/nona-03-manifest/SOUL.md` -- расширенный справочник; при конфликте с корневым `SOUL.md` побеждает корневой.\n3. `docs/T27-CONSTITUTION.md` -- статьи SSOT-MATH, LANG-EN и DOCS-TREE и инвариантные законы.\n4. `TASK.md` вместе с `docs/coordination/TASK_PROTOCOL.md` -- координация нескольких агентов, блокировки, якорная задача.\n5. Ближайший `OWNERS.md` -- владение областью для редактируемых каталогов.\n\n`CLAUDE.md` добавляет операционный цикл автономного агента и в своей вводной строке говорит, что закон репозитория всегда перекрывает умолчания общего инструментария. Остальная часть главы цитирует эти файлы; сайт привязывает каждую цитату к файлу на коммите, на котором документация была порождена.\n\n## Статьи SOUL\n\n`SOUL.md` организован статьями. Те, которых касается каждое изменение:\n\n- **Статья I, языковая политика.** Исходные файлы должны быть только ASCII (U+0000..U+007F); идентификаторы и комментарии -- на английском. Правило называет `.t27`, `.tri`, `.zig`, `.c`, `.h`, `.v` и сборочные скрипты. Кириллица и другие нелатинские письменности запрещены в идентификаторах и комментариях, если нет исключения, одобренного Архитектором (раздел 1.1). Собственная документация проекта -- на английском (раздел 1.2, повторено как статья LANG-EN конституции).\n- **Статья II, мандат TDD.** \"Every `.t27` specification MUST contain at least one of\" -- секцию `.test`, `.invariant` или `.bench`. \"No exceptions. A spec without tests is not a specification -- it is a draft.\" (раздел 2.1, Железный закон).\n- **Статья III, без режима прототипа.** Нет флага `--allow-no-tests` и нет льготного периода; парсер отвергает спецификацию без тестов с ошибкой `TDD contract violated`.\n- **Статья IV, требования валидации.** Контроль на уровне парсера, кодогенерации и сборки.\n- **Статья V, порядок поправок.** Что можно и что нельзя менять.\n- **Статья VI, принуждение.** Соблюдение агентами, людьми, автоматикой.\n- **Статья VII, Священная Троица.** Три опоры: тождество phi^2 + 1/phi^2 = 3, троичные вычисления и TDD внутри спецификации. \"Violating any violates the whole.\"\n- **Статья VIII, NO-NEW-SHELL.** Никаких новых `*.sh` на инженерном критическом пути; допустимые исключения -- шим `scripts/tri` (только exec) и одноразовый `scripts/setup-git-hooks.sh`. Раздел 8.3 распространяет правило на Python: валидация, шлюзы конформности и проверки языка документации живут в `t27c` (Rust).\n\nСпецификации каталогов в `specs/skills`, `specs/crons`, `specs/agents`, `specs/tools` и `specs/docs` -- декларативные модули констант и не несут блока `.test`; вместо этого генераторы сайта проверяют схему их полей. Применима ли статья II к декларативным модулям каталогов, `SOUL.md` сегодня не решает; эта документация фиксирует практику и не претендует на постановление.\n\n## Инвариантные законы и их приоритет\n\n`docs/T27-CONSTITUTION.md`, раздел 2, определяет семь инвариантных законов, которые \"never change without constitutional amendment\". Сайт выводит таблицу из этого файла; кратко:\n\n- **L1 TRACEABILITY** -- код не вливается без `Closes #N`; каждый PR ссылается на задачу. Контроль -- `.github/workflows/issue-gate.yml`.\n- **L2 GENERATION** -- файлы под `gen/` порождены; правьте спецификацию `.t27`.\n- **L3 PURITY** -- только ASCII в идентификаторах и комментариях `.t27`, `.zig`, `.v`, `.c`.\n- **L4 TESTABILITY** -- каждая спецификация `.t27` содержит `test`, `invariant` или `bench`.\n- **L5 IDENTITY** -- phi^2 = phi + 1 на вещественных числах, откуда phi^2 + 1/phi^2 = 3; проверки в IEEE binary64 используют допуск.\n- **L6 CEILING** -- `conformance/FORMAT-SPEC-001.json` и `specs/numeric/gf16.t27` -- численный потолок, никогда не форкается.\n- **L7 UNITY** -- никаких новых `*.sh` на критическом пути валидации, порождения или данных; только `t27c` и `tri`.\n\nПриоритет -- в духе Азимова: L1 > L2 > L3 > L4 > L5 > L6 > L7. \"In conflict scenarios, the higher-priority law prevails.\" Прежние имена (ISSUE-GATE, NO-HAND-EDIT-GEN, SOUL-ASCII, TDD-MANDATE, PHI-IDENTITY, TRINITY-SACRED, NO-NEW-SHELL) отображаются один к одному на L1..L7 в индексе псевдонимов конституции.\n\nОдно расхождение фиксируется, а не устраняется: `AGENTS.md`, раздел 5, говорит о \"the seven Invariant Laws (L1-L8)\" и пишет приоритет как \"L1 > ... > L8\", тогда как его таблица и конституция определяют только L1..L7. Ни в одном из файлов на коммите, на котором порождена документация, L8 не определён. Поэтому фигура рядом с этой главой показывает семь законов.\n\n## Неотменяемые требования к изменениям\n\n`AGENTS.md`, раздел 3, перечисляет шесть неотменяемых требований, кратко:\n\n1. Спецификации -- источник истины: поведение живёт в `.t27` / `.tri`; порождённый вывод в `gen/` не правится вручную, кроме документированных исключений.\n2. TDD внутри спецификаций: новые или изменённые спецификации несут `test`, `invariant` и/или `bench` там, где этого требует SOUL.\n3. Английский + ASCII: собственный Markdown и комментарии в коде по LANG-EN и ADR-004.\n4. Никакого нового Python на критическом пути верификации.\n5. Шлюз задач: PR ссылаются на задачи (`Closes #N`) там, где этого требует политика проекта.\n6. Работа с кольцами / золотом: изменения парсера, компилятора и спецификаций следуют канону golden-rings; путь печати компилятора -- `bootstrap/stage0/FROZEN_HASH`.\n\nДва правила владельца этой документации стоят рядом с ними, потому что сайт их проверяет: никаких абсолютных путей домашнего каталога разработчика в закоммиченных файлах (чекаут -- это `T27_ROOT` или `git rev-parse --show-toplevel`) и никакой ручной правки порождённых манифестов -- меняйте спецификацию и порождайте заново.\n\n## Протокол TASK\n\n`docs/coordination/TASK_PROTOCOL.md` определяет, как несколько агентов работают в одном дереве одновременно. Его артефакты -- корневой `TASK.md` (якорная ссылка, версия протокола, блокировки, журнал передач, единицы работы) и сам документ протокола. Семантика, кратко:\n\n- **Блокировка (мягкая).** Перед правкой чувствительных путей активный агент должен выставить держателя, область и срок блокировки в состоянии координации; другие не должны перебивать её без записи в журнале передач и повышения эпохи. Блокировки \"social + procedural\", не файловые.\n- **Эпоха.** Счётчик версии состояния координации.\n- **Журнал передач.** Предпочтительно дописываемый; передачи трактуются \"like narrow API contracts\".\n- **Порядок чтения / записи.** `github-sync.json` (снимок очереди), затем `TASK.md` (блокировки и передачи), затем якорная задача, затем целевая задача для изменения кода (раздел 4.4).\n\nПроверка формы `TASK.md` автоматизирована (раздел 5); верификация -- человек плюс CI (раздел 6).\n\n## Шлюз задач и мандат TDD\n\nШлюз задач -- закон L1 в исполняемой форме: конституция называет `.github/workflows/issue-gate.yml` средством контроля правила \"no code merged without `Closes #N`\". Всё, что документирует сайт, прошло через него -- каталоги навыков, расписаний, агентов, инструментов и документации имеют свою задачу и свою запись в `docs/now/`.\n\nМандат TDD -- закон L4 и статья II SOUL в исполняемой форме: парсер отвергает спецификацию без блока `test`, `invariant` или `bench`. Для спецификаций каталогов сайт добавляет свой шлюз: генератор компилирует каждую карточку через wasm и роняет сборку при нарушении схемы, неизвестной перекрёстной ссылке или связи, заявленной лишь с одной стороны (агент называет инструмент, а инструмент не называет агента в ответ, и наоборот).\n" + }, + "docs/layers": { + "TITLE": "Пятислойная система", + "BODY": "Сайт упорядочивает то, что поставляют репозитории, в пять слоёв и показывает одну и ту же лестницу в заголовке каждого обозревателя: **Specs -> Skills -> Crons -> Agents -> Tools**. Каждый слой -- каталог файлов `.t27` в `gHashTag/t27`, у каждого есть README со схемой, и каждый отображается из этих файлов одним генератором через wasm компилятора. Счётчики лестницы на сайте читаются из порождённого JSON при сборке; таблица рядом с этой главой показывает их для коммита, на котором порождена документация.\n\n## Спецификации\n\nБазовый слой -- сам корпус `.t27`: всё под `specs/` в `gHashTag/t27`, от ядра языка и численных форматов до каталогов ниже. Сайт хранит побайтово идентичную вендорную копию под `apps/website/public/t27/files/` и компилирует каждый файл вендорным `t27_compiler.wasm` при сборке. Обозреватель спецификаций (`#/specs`) показывает каждый файл с его вердиктом; перечисляющий их манифест (`public/t27/manifest.json`) порождается и никогда не правится вручную.\n\n## Навыки\n\nНавык -- опубликованная процедура, которую может выполнить агент: `SKILL.md` в одном из репозиториев. `specs/skills/.t27` объявляет каждый (KIND, ID, NAME, REPO, SOURCE, SUMMARY_EN, COMMAND, SPECS, TAGS, ENABLED, TIMEOUT_MIN). Метка свидетеля на карточке навыка говорит, как карточка соотносится с кодом: `spec+code`, когда есть и спецификация, и `SKILL.md`; `spec-only`, когда есть только спецификация; `code-only`, когда у файла навыка ещё нет спецификации. Обозреватель навыков: `#/skills`.\n\n## Расписания\n\nРасписание -- запланированное задание: расписание workflow, таймер Railway, цикл демона. `specs/crons/.t27` объявляет каждое (HOST, REPO, SERVICE, INTERVAL_MS, TZ, RUNS, RUNS_NOTE, ENABLED, NOTE, ON_FAILURE, CONTROL). `RUNS` перечисляет ID навыков, которые запускает задание, и только там, где источник показывает вызов; где вызова не найдено, `RUNS` пуст, а `RUNS_NOTE` говорит об этом (\"no skill invocation found in source\"). Обозреватель расписаний (`#/crons`) вычисляет следующий запуск по `INTERVAL_MS` и `TZ`. Задание, не запускающее навык, -- это задание, которое сайт не может связать со слоями выше; это записывается, а не скрывается.\n\n## Агенты\n\n27 букв алфавита, по одной спецификации на каждую: `specs/agents/.t27` с LETTER, ORDINAL, LETTER_NAME, NAME, DOMAIN, ARCHETYPE, REGISTER, LAYER, SUMMARY_EN, тремя связывающими документами (SOUL, AGENTS_DOC, ALPHABET), KEY_FILES, входным и выходным инвариантами, CLARA_ROLE, SKILLS с SKILLS_NOTE и TOOLS с TOOLS_NOTE. Агент держит навык или инструмент только там, где его связывает строка источника -- файл `.claude/agents/*.md`, алфавит, описание фазы, -- и примечание цитирует эту строку или объясняет, почему список пуст. Генератор роняет сборку на неизвестном ID навыка или инструмента и на связи, заявленной лишь с одной стороны. Обозреватель агентов: `#/agents`. Полная таблица -- в следующей главе.\n\n## Инструменты\n\nТо, что агент может вызвать: команды CLI `tri` и инструменты серверов MCP. `specs/tools/tri/.t27` читается из clap-перечисления `Commands` в `cli/tri/src/main.rs` (по карточке на вариант, с вложенными действиями и аргументами); `specs/tools/mcp/.t27` -- из исходников серверов, манифестов и записей `.mcp.json` обоих репозиториев, с именами инструментов, описаниями и ключами входных схем. Свидетель на карточке tri -- `source-parse` (перечисление прочитано на записанном коммите), пока кто-нибудь не сравнит список с `tri --help` и не переименует его в `help-output`. Серверы, чей код -- опубликованный пакет вне репозиториев, несут `EXTERNAL = true`. Обозреватель инструментов: `#/tools`.\n\n## От спецификации к сайту\n\nОдин генератор, `scripts/agents-from-specs.mjs` в `gHashTag/trinity`, читает вендорные файлы `.t27`, компилирует каждый через wasm, читает константы скомпилированного модуля, сверяет их со схемой слоя, разрешает каждую перекрёстную ссылку (ID навыков в расписаниях и агентах, ID инструментов в агентах, буквы агентов в инструментах, пути спецификаций в навыках) и пишет по одному JSON на слой под `public/`. Он выполняется в `prebuild`, поэтому спецификация, которая не компилируется, или ссылка, которая не разрешается, останавливает сборку сайта. Ни один `.t27` на этом пути не разбирается регулярным выражением.\n\nПереводы следуют тому же правилу. `specs/i18n/-.t27` объявляет, какие поля каких спецификаций бандл может переводить и где бандл лежит; бандл (`apps/website/i18n/*.json`) несёт текст; генератор проверяет, что каждая запись бандла называет существующую спецификацию, и сообщает покрытие. Спецификации остаются только английскими.\n\n## Опыт\n\nАгенты записывают, что произошло, под `.trinity/experience/` в каждом репозитории: эпизоды как JSON, заметки как Markdown. `scripts/sync-agents-experience.mjs` читает оба дерева на их текущем коммите и пишет `public/agents/experience.json` со счётчиками по репозиториям и, где эпизод называет букву агента, с атрибуцией. На коммите, на котором порождена документация, ни один эпизод не отнесён ни к одной букве -- поле, которое ищет синхронизация, отсутствует в каждом эпизоде, -- и карточки агентов говорят об этом. Снимок записывает коммит каждого дерева, а не путь чекаута.\n" + }, + "docs/alphabet": { + "TITLE": "Алфавит из 27 агентов", + "BODY": "## Двадцать семь букв, три ноны\n\n`docs/agents/AGENTS_ALPHABET.md` (v3.0, 2026-04-07) -- канон: \"The Trinity system employs 27 named agents -- corresponding to the 27 registers in `isa/registers.t27` (Coptic / Trinity alphabet).\" Каждый агент привязан к букве и регистру, имеет область (физика, численные форматы, компилятор, граф, опыт, вердикт, бенчмарки, DePIN, UI и так далее), пишет в `.trinity/experience/` и связан с узлами `graph_v2.json`.\n\nАлфавит читается тремя слоями по девять, которые документ также называет нонами:\n\n- **Архетипический, A-I (1-9)** -- \"pure concept -- foundation: soul, base, types\". A -- архитектура и `SOUL.md` как первопричина; C -- компилятор; E -- опыт; I -- ISA.\n- **Духовный, J-R (10-18)** -- \"inner process -- life of the system: tasks, language, numbers, physics\". L -- язык; M -- метрики; N -- численные форматы; P -- физические константы; Q -- очередь.\n- **Физический, S-27th (19-27)** -- \"manifestation -- proof: standards, verdict, deploy, gift\". S -- спецификации; T -- Королева, которая \"puts the final seal on everything\"; V -- вердикт; W -- рабочий процесс и tri cell (\"double hash-seal\"); Z -- zero-touch UX и документация; 27-я буква, Ti, -- безопасность.\n\nТа же раскладка три на девять организует дерево документации репозитория (`docs/nona-01-foundation/`, `docs/nona-02-organism/`, `docs/nona-03-manifest/`, статья DOCS-TREE конституции) и кольцо на сайте рядом с этой главой, где каждая буква стоит на своём порядковом номере и окрашена по слою.\n\n## Таблица\n\nТаблица, которую сайт выводит рядом с этой главой, порождается из `public/agents/spec-agents.json`, который сам порождён из 27 файлов `specs/agents/.t27` через wasm компилятора, -- она не набрана здесь. По каждой букве показаны порядковый номер, имя буквы, область, архетип, регистр, слой и навыки и инструменты, которые агент держит, с их свидетельствами. FULL TABLE документа алфавита (буква, область, архетип, ключевые файлы, входной инвариант, выходной инвариант, роль CLARA) -- источник, из которого перенесена каждая спецификация; заголовок спецификации называет строку.\n\nДве условности таблицы стоит назвать. Регистр буквы берётся из раздела схемы документа алфавита (например, T -- R19, V -- R21, W -- R22); порядковый номер -- позиция в алфавите, 1..27, так что T -- 20, а 27-я буква -- 27. Где документ алфавита называет двух агентов одним греческим именем (C и G оба записаны как \"Gamma\"), спецификация сохраняет написание документа, а ID остаётся однозначным, потому что это латинская буква: `t27/C` и `t27/G`.\n\n## Что несёт карточка\n\nПомимо строки алфавита, карточка агента на сайте несёт то, что говорят о букве другие слои:\n\n- **Навыки** -- ID из `specs/skills`, которые агент держит, связанные только там, где источник называет навык. На коммите, на котором порождена документация, навыки держит одна буква: T, из `.claude/agents/trinity.md`, который называет `phi-loop` и `tri-pipeline` в своих фазах 2 и 4. Остальные 26 несут пустой список и примечание о том, какие источники были прочитаны.\n- **Инструменты** -- ID из `specs/tools`, которые агент держит, связанные в обе стороны (спецификация инструмента называет букву в ответ). Сегодня связаны пять команд: `tri gen` (C, T), `tri test` (T, V), `tri verdict` (V), `tri experience` (E), `tri cell` (W); источники -- описания фаз документа алфавита и файлы `.claude/agents/*.md`.\n- **Расписания** -- задания, чей `RUNS` называет навык, который агент держит; пусто, пока каждый `RUNS` пуст.\n- **Опыт** -- эпизоды, отнесённые к букве в `.trinity/experience/`; сегодня не отнесён ни один, и карточка говорит об этом, а не показывает число без источника.\n- **Источники** -- три связывающих документа (`SOUL.md`, `AGENTS.md`, алфавит) на закреплённом коммите и сам файл спецификации.\n" + }, + "docs/queen": { + "TITLE": "Оркестрация Королевы", + "BODY": "## Шестифазный цикл и фаза 7\n\nАгент T, Королева, -- центральный оркестратор: \"reads `graph_v2.json` and knows all module dependencies\", \"conducts 26 sub-agents (A..Z, except T) by their domains\", собирает результаты, проверяет архитектурные инварианты и следит за тем, чтобы источник истины был в `.t27` / `.tri`, а Zig, Verilog и C оставались только бэкендами (`docs/agents/AGENTS_ALPHABET.md`, раздел \"AGENT T -- QUEEN TRINITY\", Responsibilities). Её модуль -- `specs/queen/lotus.t27`.\n\nДокумент алфавита рисует её цикл шестью фазами и седьмой, добавленной законом SOUL о git. Сайт выводит цикл из этого документа; кратко:\n\n1. **PLAN** -- разобрать задачу и выбрать стратегию; прочитать `graph_v2.json` для анализа влияния; решить, какие агенты участвуют; проверить `.trinity/experience/` на похожие задачи.\n2. **ASSIGN** -- распределить задачи агентам по областям (A архитектура, N численные форматы, P физика, F конформность, ...); задать зависимости; создать tri cell для каждого агента (W печатает).\n3. **RUN** -- параллельное выполнение; heartbeats; агенты отчитываются в `.trinity/agent_events.jsonl`; T перераспределяет при необходимости.\n4. **TEST & BENCH** -- F проверяет векторы конформности, V гоняет бенчмарки, G измеряет изменения влияния; метрики собираются в M для вердикта V.\n5. **VERDICT** -- V анализирует метрики; `tri verdict --toxic` спрашивает, токсично ли изменение; E записывает опыт; если токсично, Q блокирует задачу.\n6. **EVOLVE** -- обновить `graph_v2.json`, если изменились зависимости; обновить опыт в E и M; S обновляет стандарты; W печатает коммит tri-cell; Z обновляет документацию; T ставит финальную печать TAW.\n7. **GIT WORKFLOW** (\"new -- SOUL law\") -- `tri git commit --all -m \"cell:{id} issue:{N} ...\"`, `tri git push origin HEAD` в строгом режиме; проверки: запечатанная ячейка, нетоксичный вердикт, артефакты; реестр записывает хэш коммита и флаг pushed.\n\nЗакон SOUL о TDD в документе следует за седьмой фазой: \"Any P0/P1 episode in `--strict` mode is considered COMPLETE only after successful `tri git push` to `github.com/gHashTag/t27` with bound sealed-cell and non-toxic verdict.\" Где буква агента появляется в описании фазы, глава об инструментах и карточки агентов используют эту строку как источник связи (`tri cell` -- W, `tri verdict` -- V).\n\n## Ячейка, печать, вердикт\n\nСостояние цикла несут три команды tri; две из них имеют спецификацию под `specs/tools/tri/`, прочитанную из clap-перечисления `cli/tri/src/main.rs`:\n\n- **`tri cell`** -- единица работы одного агента: создаётся в ASSIGN, запечатывается W хэшем в EVOLVE. Вложенные действия перечислены на карточке инструмента (`specs/tools/tri/cell.t27`).\n- **`tri verdict`** -- решение V по метрикам; `--toxic` -- вопрос, который цикл задаёт в VERDICT (`specs/tools/tri/verdict.t27`).\n- **`tri git`** -- седьмая фаза в записи документа алфавита. На коммите, на котором порождена документация, в clap-перечислении `cli/tri/src/main.rs` нет варианта `git`, поэтому в каталоге инструментов нет карточки для него; фаза документирована по алфавиту с пометкой `[declared]`, а пробел записан здесь, а не закрыт выдуманной карточкой.\n\nСама печать -- это хэш. На уровне компилятора та же идея -- печать бутстрап-компилятора (`bootstrap/stage0/FROZEN_HASH`, `CANON.md`, раздел 0) и канон колец: кольцо замораживается, когда записан его хэш, а расхождение между записанной печатью и рабочим деревом -- факт, который показывает панель.\n\n## Две формулировки цикла\n\nРепозиторий формулирует цикл Королевы дважды, и формулировки различаются. Документ алфавита даёт семь фаз выше (PLAN, ASSIGN, RUN, TEST & BENCH, VERDICT, EVOLVE, GIT WORKFLOW). `CLAUDE.md`, \"Autonomous Execution Loop (AEL v2.0)\", даёт шестифазный цикл агента, действующего как Королева, -- OBSERVE (E), PLAN (T), DELEGATE (C/V), VERIFY (V), SYNTHESIZE (L), LEARN (L) -- и отдельно девятифазный PHI LOOP для разработки по кольцам (Issue, Spec, TDD, Code, Gen, Seal, Verify, Land, Learn).\n\nЭта документация отображает цикл алфавита, потому что именно он называет команды tri и буквы агентов по фазам, и фиксирует цикл AEL как вторую формулировку, не сводя их воедино. Какая из них связывает автономного агента в конкретной ситуации -- вопрос к `AGENTS.md` и его владельцам, а не к порождённой странице.\n" + }, + "docs/tooling": { + "TITLE": "Инструменты", + "BODY": "## CLI tri\n\n`tri` -- команда инструментальной цепочки: `./scripts/tri` -- шим (только exec, статья VIII SOUL, раздел 8.2), который находит бинарник Rust `t27c`, передаёт `--repo-root` и исполняет его. Каталог в `specs/tools/tri/` содержит по спецификации на вариант clap-перечисления `Commands` в `cli/tri/src/main.rs`: слово команды, вариант перечисления, файл исходника и точку входа, doc-комментарий как `ABOUT` с `ABOUT_SOURCE`, называющим, откуда взят текст, вложенные действия с их doc-комментариями, аргументы, буквы агентов, владеющих командой, со строкой-свидетельством, случаи применения и свидетеля.\n\nТаблица, которую сайт выводит рядом с этой главой, порождается из `public/tools/spec-tools.json` -- команда, действия, владельцы, свидетель, -- и счётчики в её заголовке читаются из того же файла. Свидетель на каждой карточке tri на коммите, на котором порождена документация, -- `source-parse`: перечисление и его комментарии `///` прочитаны из исходника на записанном коммите, а `cargo` не запускался. Карточка переименовывается в `help-output` только когда кто-нибудь сравнит список с `tri --help` и запишет результат; до тех пор метка говорит, что было и чего не было сделано.\n\nКоманды, чей вариант не имеет doc-комментария, цитируют источник, у которого заимствуют описание (например, `tri cell` цитирует описания инструментов `tri-mcp`), чтобы ни один `ABOUT` не был выдуман.\n\n## Серверы MCP\n\nВторое семейство -- серверы Model Context Protocol, которые два репозитория поставляют или регистрируют: для `gHashTag/t27` крейт `tri-mcp`, манифест `tri-ssot`, `t27-traceability` и записи `.mcp.json`; для `gHashTag/trinity` Zig-серверы `trinity` и `needle` и его записи `.mcp.json`. `specs/tools/mcp/.t27` несёт строку запуска, транспорт, версию, переменные окружения, путь конфигурации, репозиторий, исходник, имена инструментов с описаниями и ключами входных схем, ресурсы и свидетеля.\n\nСерверы, чей код -- опубликованный пакет вне репозиториев, несут `EXTERNAL = true` и `TOOLS_NOTE` о том, что списка инструментов нет ни в одном дереве; для них ничего не выдумывается. Два факта записаны, а не исправлены: `tri-mcp` не зарегистрирован в `.mcp.json` на закреплённом коммите (`CONFIG` пуст), а манифест `tri-ssot` называет модуль, которого нет в дереве.\n\nДва репозитория -- два списка. У `gHashTag/trinity` нет бинарника `tri` на закреплённом коммите (`build.zig` его не определяет; его `.claude/skills/tri/SKILL.md` -- навык и находится в каталоге навыков), поэтому его инструменты -- только его серверы MCP, под `REPO = \"gHashTag/trinity\"`.\n\n## Кто владеет инструментом\n\nИнструмент называет буквы агентов, владеющих им (`AGENTS`), только там, где это делает строка источника, а `AGENTS_NOTE` цитирует эту строку или называет источники, которые были проверены и оказались молчащими. Спецификация агента называет инструмент в ответ (`TOOLS`), и генератор сайта роняет сборку на связи, заявленной лишь с одной стороны. Сегодня связаны пять команд -- `tri gen` (C, T), `tri test` (T, V), `tri verdict` (V), `tri experience` (E), `tri cell` (W) -- по описаниям фаз `docs/agents/AGENTS_ALPHABET.md` и файлам `.claude/agents/*.md`; остальные команды и каждый сервер MCP несут пустой `AGENTS` с примечанием. Навыки связываются перекрёстно, когда собственный `COMMAND` или `SUMMARY_EN` спецификации навыка называет команду tri.\n\nКарта, которую сайт рисует рядом с этой главой, группирует команды tri по владеющей букве (с группой для невладеемых) и серверы MCP по репозиторию, с пометкой внешних. Она рисуется из порождённого JSON, поэтому новая связь в спецификации перемещает команду на карте без чьей-либо правки фигуры.\n" + }, + "docs/evidence": { + "TITLE": "Свидетели и доказательства", + "BODY": "## Измерено, заявлено, извне\n\nПроект разделяет измеренное и заявленное, а и то и другое -- от взятого извне. Теги определены в главе \"Проект\"; эта глава говорит, как каждый тег зарабатывается на сайте.\n\n**Измеренное** число имеет производителя в репозитории -- скрипт, workflow, тест, -- чей вывод закоммичен или опубликован, и страница называет коммит. Счётчики лестницы, вердикты `typecheck.ok`, покрытие бандла переводов, число эпизодов в дереве опыта измерены в этом смысле: порождающий их генератор выполняется в `prebuild`, а его входы закреплены.\n\n**Заявленное** значение записано в спецификации или каноническом документе. Размер каталога в 83 формата, семь законов, семь фаз заявлены: сайт выводит их из файла, который их формулирует, и привязывает файл к коммиту, ничего не запуская.\n\n**Внешнее** значение цитируется с источником и не воспроизводится. Сайт не повторяет аппаратные цифры `gHashTag/trinity-fpga` сверх того, что переносит `siliconHistory.ts` со своим примечанием о происхождении.\n\n## Метки свидетелей\n\nКаждая карточка каталога несёт метку свидетеля, говорящую, как карточка соотносится с тем, что описывает:\n\n- Навыки и расписания: `spec+code` (есть и спецификация, и исходник), `spec-only` (спецификация без исходника), `code-only` (исходник без спецификации). Счётчики по меткам -- в заголовках обозревателей навыков и расписаний.\n- Инструменты: `source-parse` (список команд прочитан из исходника на записанном коммите; `cargo` не запускался) или `help-output` (список сверен с `tri --help`). На коммите, на котором порождена документация, каждая карточка tri -- `source-parse`.\n- Агенты: каждая связь с навыком и инструментом цитирует строку источника в `SKILLS_NOTE` / `TOOLS_NOTE`, либо список пуст и примечание говорит, что было прочитано.\n- Опыт: атрибуция только там, где эпизод называет букву; иначе считается неотнесённым и никогда не угадывается.\n\nТаблица, которую сайт выводит рядом с этой главой, собирает эти метки со счётчиками из порождённого JSON каждого слоя.\n\n## Вердикты wasm\n\nКаждый `.t27`, показанный на сайте, скомпилирован при сборке вендорным `t27_compiler.wasm`, и JSON записывает `typecheck.ok` для каждого файла. Два предела этого вердикта названы в README каждого слоя и повторены здесь. Во-первых, `typecheck.ok` от wasm необходим, но не достаточен: он остаётся `true` при неверной аннотации вроде `str = 5`, поэтому генератор проверяет схему полей каждой карточки поверх него. Во-вторых, бутстрап-компилятор на `master` не запускался против файлов каталогов в коммитах, которые их добавили; wasm -- сборка компилятора на записанном sha, и этот sha есть в порождённом JSON.\n\n## Шлюзы CI\n\n`gHashTag/t27` проверяет pull request рабочими потоками, названными по тому, что они проверяют (issue gate, gate topology, conformance integrity, emit bit-exact, catalog count, now-sync, untrusted input и другие под `.github/workflows/`). Два из них, `gate-topology` и `untrusted-input`, на момент написания падают на `master` для уже влитых pull request; pull request каталогов фиксируют это и не благословляют и не обходят их.\n\n`gHashTag/trinity` проверяет сайт командами `npm run`, выполняемыми в `prebuild` и в CI: `check:spec-catalog`, `check:skills-catalog`, `check:crons-catalog`, `check:agents`, `check:tools`, `check:docs`, языковые контракты обозревателей и Королевы, контракт вьюпорта Королевы, `typecheck:ratchet` и `eslint`. Проверка, падающая на `main` до изменения, отмечается как существовавшая ранее, по имени, и не засчитывается как пройденная.\n\n## Как воспроизвести число\n\nЧтобы воспроизвести счётчик с сайта, запустите порождающий его генератор в `apps/website` чекаута `gHashTag/trinity` с соседним чекаутом `gHashTag/t27` (или с `T27_ROOT`, указывающим на него):\n\n- `node scripts/agents-from-specs.mjs` -- JSON навыков, расписаний, агентов, инструментов и их счётчики; `--check` сравнивает с закоммиченным JSON.\n- `node scripts/docs-from-specs.mjs` -- JSON этой документации, включая источники с их sha256 и закреплённый коммит.\n- `node scripts/sync-agents-experience.mjs` -- снимок опыта.\n- `npm run check:docs` -- тела глав, источники, порождённые таблицы, поиск запрещённых слов в английском и русском.\n\nКаждый JSON называет коммит, на котором прочитаны его входы. Сравнение этого коммита с тем, что перед вами, -- шаг один любого воспроизведения; число, которое нельзя привязать к коммиту, не является измерением.\n\n## Опубликованная запись\n\nВне порождённых страниц существуют два вида записей, и эта документация указывает на них, ничего не добавляя к их утверждениям. Отчёты аудита и сверки рукописи TNF лежат под `docs/reports/` в `gHashTag/t27` (`TNF-ARTICLE-AUDIT-W845.md`, `TNF-ARTICLE-RECONCILIATION.md`); они записывают, какие утверждения статьи сверены с каким производителем и что изменилось. README для Zenodo (`README-ZENODO.md`) описывает архивированный пакет. В этой документации не делается ни одного научного утверждения, которого нет в этих файлах или в собственном содержимом сайта с его статусным тегом.\n" + } + } +} diff --git a/apps/website/package.json b/apps/website/package.json index b9db6735be..5cf3d0b301 100644 --- a/apps/website/package.json +++ b/apps/website/package.json @@ -14,8 +14,8 @@ "check:spec-catalog": "node --experimental-strip-types qa/spec-catalog-contract.mjs", "core": "node scripts/spec-core.mjs", "check:shared-core": "node --experimental-strip-types qa/shared-spec-core.mjs", - "prebuild": "npm run core -- index && node scripts/skills-core.mjs index && node scripts/agents-from-specs.mjs", - "prebuild:ci": "npm run core -- index && node scripts/skills-core.mjs index && node scripts/agents-from-specs.mjs", + "prebuild": "npm run core -- index && node scripts/skills-core.mjs index && node scripts/agents-from-specs.mjs && node scripts/docs-from-specs.mjs", + "prebuild:ci": "npm run core -- index && node scripts/skills-core.mjs index && node scripts/agents-from-specs.mjs && node scripts/docs-from-specs.mjs", "dev": "vite", "build": "vite build", "build:ci": "vite build", @@ -67,7 +67,9 @@ "test:sync-crons": "node --test scripts/sync-crons.test.mjs", "check:agents": "node --experimental-strip-types qa/agents-spec-contract.mjs", "check:tools": "node --experimental-strip-types qa/tools-spec-contract.mjs", - "test:agents-specs": "node --test scripts/agents-from-specs.test.mjs" + "test:agents-specs": "node --test scripts/agents-from-specs.test.mjs", + "check:docs": "node --experimental-strip-types qa/docs-spec-contract.mjs", + "test:docs-specs": "node --test scripts/docs-from-specs.test.mjs" }, "dependencies": { "@babylonjs/core": "^9.25.0", diff --git a/apps/website/public/agents/spec-agents.json b/apps/website/public/agents/spec-agents.json index 7f9b86d72d..5393191cc3 100644 --- a/apps/website/public/agents/spec-agents.json +++ b/apps/website/public/agents/spec-agents.json @@ -1 +1 @@ -{"agents":[{"crons":[],"discarded":0,"experience":{"episodes":0,"files":[],"first":null,"last":null,"lastTask":null,"lessons":[],"outcomes":{}},"fields":{"AGENTS_DOC":"AGENTS.md","ALPHABET":"docs/agents/AGENTS_ALPHABET.md","ARCHETYPE":"Bull - leader, primary force","CLARA_ROLE":"TA1: AR Architecture Design - designs AR module architecture, ensures composability","DOMAIN":"Architecture / ADR / SOUL","ENABLED":true,"ENTRY_INVARIANT":"SOUL.md exists, is ASCII-only, and defines L1-L7 laws","EXIT_INVARIANT":"All ADRs reviewed, consistent with constitution, no conflicts","EXPERIENCE_LOG":".trinity/experience/","ID":"t27/A","KEY_FILES":["SOUL.md","architecture/ADR-*.md","architecture/CANON_DE_ZIGFICATION.md"],"KIND":"agent","LAYER":"Archetypal","LETTER":"A","LETTER_NAME":"Alpha","NAME":"Alpha (Architecture)","ORDINAL":1,"REGISTER":"R0","SKILLS":[],"SKILLS_NOTE":"No source binds a skill to this agent: the alphabet key files point at specs and docs, not at a skill directory, no .claude/agents file names one, and specs/OWNERS.md has no row for it.","SOUL":"SOUL.md","SUMMARY_EN":"Architecture / ADR / SOUL. SOUL.md is the primary cause and the ADRs are the constitution of the system.","TOOLS":[],"TOOLS_NOTE":"No source binds a tri command or MCP server to this agent: docs/agents/AGENTS_ALPHABET.md (row, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name one."},"health":"ok","id":"t27/A","inSpecCorpus":false,"letter":"A","links":{"agentsDoc":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/AGENTS.md","alphabet":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/docs/agents/AGENTS_ALPHABET.md","experienceLog":"https://github.com/gHashTag/t27/tree/95c9b61b97d487bec4279ca63eb3132da8d1721c/.trinity/experience","pinSource":"public/agents/experience.json sources[t27].commit","pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","soul":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/SOUL.md"},"messages":["no attributed episodes in the experience snapshot"],"moduleName":"agent_a","name":{"en":"Alpha (Architecture)","ru":"Альфа (Архитектура)"},"ordinal":1,"sha256":"0bcd805f2c789604a16712f910a652c698fe0b16a2c26ccb7a962a764e379943","skills":[],"specPath":"specs/agents/a.t27","summary":{"en":"Architecture / ADR / SOUL. SOUL.md is the primary cause and the ADRs are the constitution of the system.","ru":"Архитектура / ADR / SOUL. SOUL.md — первопричина, а ADR — конституция системы."},"tools":[],"typecheckOk":true,"witness":"spec-only"},{"crons":[],"discarded":0,"experience":{"episodes":0,"files":[],"first":null,"last":null,"lastTask":null,"lessons":[],"outcomes":{}},"fields":{"AGENTS_DOC":"AGENTS.md","ALPHABET":"docs/agents/AGENTS_ALPHABET.md","ARCHETYPE":"House - container, dwelling","CLARA_ROLE":"","DOMAIN":"Build / Pipeline","ENABLED":true,"ENTRY_INVARIANT":"Build system is clean, no stale artifacts","EXIT_INVARIANT":"All tests pass, CI pipeline is green","EXPERIENCE_LOG":".trinity/experience/","ID":"t27/B","KEY_FILES":["build.tri","src/tri/pipeline/"],"KIND":"agent","LAYER":"Archetypal","LETTER":"B","LETTER_NAME":"Beta","NAME":"Beta (Build)","ORDINAL":2,"REGISTER":"R1","SKILLS":[],"SKILLS_NOTE":"No source binds a skill to this agent: the alphabet key files point at specs and docs, not at a skill directory, no .claude/agents file names one, and specs/OWNERS.md has no row for it.","SOUL":"SOUL.md","SUMMARY_EN":"Build / Pipeline. build.tri is the house of specifications and the pipeline is its dwelling.","TOOLS":[],"TOOLS_NOTE":"No source binds a tri command or MCP server to this agent: docs/agents/AGENTS_ALPHABET.md (row, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name one."},"health":"ok","id":"t27/B","inSpecCorpus":false,"letter":"B","links":{"agentsDoc":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/AGENTS.md","alphabet":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/docs/agents/AGENTS_ALPHABET.md","experienceLog":"https://github.com/gHashTag/t27/tree/95c9b61b97d487bec4279ca63eb3132da8d1721c/.trinity/experience","pinSource":"public/agents/experience.json sources[t27].commit","pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","soul":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/SOUL.md"},"messages":["no attributed episodes in the experience snapshot"],"moduleName":"agent_b","name":{"en":"Beta (Build)","ru":"Бета (Сборка)"},"ordinal":2,"sha256":"61d170317eadcdfe028549190c431b633d93cb5dc2dea7fdc1c041c71154b34f","skills":[],"specPath":"specs/agents/b.t27","summary":{"en":"Build / Pipeline. build.tri is the house of specifications and the pipeline is its dwelling.","ru":"Сборка / конвейер. build.tri — дом спецификаций, а конвейер — его жилище."},"tools":[],"typecheckOk":true,"witness":"spec-only"},{"crons":[],"discarded":0,"experience":{"episodes":0,"files":[],"first":null,"last":null,"lastTask":null,"lessons":[],"outcomes":{}},"fields":{"AGENTS_DOC":"AGENTS.md","ALPHABET":"docs/agents/AGENTS_ALPHABET.md","ARCHETYPE":"Camel - carrier across borders","CLARA_ROLE":"TA1: AR Language Implementation - implements AR language features in t27 compiler","DOMAIN":"Compiler Core / AR Language","ENABLED":true,"ENTRY_INVARIANT":"Parser can handle all AR syntax (ternary logic, rules, proofs)","EXIT_INVARIANT":"Generated code compiles, AST is valid","EXPERIENCE_LOG":".trinity/experience/","ID":"t27/C","KEY_FILES":["t27/compiler/parser/","bootstrap/src/compiler.rs","specs/ar/*.t27"],"KIND":"agent","LAYER":"Archetypal","LETTER":"C","LETTER_NAME":"Gamma","NAME":"Gamma (Compiler Core)","ORDINAL":3,"REGISTER":"R2","SKILLS":[],"SKILLS_NOTE":"No source binds a skill to this agent: the alphabet key files point at specs and docs, not at a skill directory, no .claude/agents file names one, and specs/OWNERS.md has no row for it.","SOUL":"SOUL.md","SUMMARY_EN":"Compiler Core / AR Language. The compiler carries text across borders, from spec to generated code.","TOOLS":["tri/gen"],"TOOLS_NOTE":".claude/agents/agent-c-compiler.md:40 names tri gen (trigger On tri gen command, line 7). Line 41 names tri seal, which is not a tri command at this commit (tri cell seal is not bound here)."},"health":"ok","id":"t27/C","inSpecCorpus":false,"letter":"C","links":{"agentsDoc":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/AGENTS.md","alphabet":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/docs/agents/AGENTS_ALPHABET.md","experienceLog":"https://github.com/gHashTag/t27/tree/95c9b61b97d487bec4279ca63eb3132da8d1721c/.trinity/experience","pinSource":"public/agents/experience.json sources[t27].commit","pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","soul":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/SOUL.md"},"messages":["no attributed episodes in the experience snapshot"],"moduleName":"agent_c","name":{"en":"Gamma (Compiler Core)","ru":"Гамма (Ядро компилятора)"},"ordinal":3,"sha256":"89402274898f607a2be4d505f8925c76802acfe2683739605f8413604530ff23","skills":[],"specPath":"specs/agents/c.t27","summary":{"en":"Compiler Core / AR Language. The compiler carries text across borders, from spec to generated code.","ru":"Ядро компилятора / язык AR. Компилятор переносит текст через границы: от спеки к сгенерированному коду."},"tools":[{"id":"tri/gen","ok":true}],"typecheckOk":true,"witness":"spec-only"},{"crons":[],"discarded":0,"experience":{"episodes":0,"files":[],"first":null,"last":null,"lastTask":null,"lessons":[],"outcomes":{}},"fields":{"AGENTS_DOC":"AGENTS.md","ALPHABET":"docs/agents/AGENTS_ALPHABET.md","ARCHETYPE":"Door - transition between worlds","CLARA_ROLE":"","DOMAIN":"De-Zigfication / Migration","ENABLED":true,"ENTRY_INVARIANT":"Legacy Zig modules are catalogued and mapped","EXIT_INVARIANT":"All AR specs are in .t27 format, no Zig hand-editing on AR","EXPERIENCE_LOG":".trinity/experience/","ID":"t27/D","KEY_FILES":["docs/migration-map.md","specs/ar/*.t27"],"KIND":"agent","LAYER":"Archetypal","LETTER":"D","LETTER_NAME":"Delta","NAME":"Delta (De-Zigfication)","ORDINAL":4,"REGISTER":"R3","SKILLS":[],"SKILLS_NOTE":"No source binds a skill to this agent: the alphabet key files point at specs and docs, not at a skill directory, no .claude/agents file names one, and specs/OWNERS.md has no row for it.","SOUL":"SOUL.md","SUMMARY_EN":"De-Zigfication / Migration. De-Zigfication is the open door from .zig to .t27.","TOOLS":[],"TOOLS_NOTE":"No source binds a tri command or MCP server to this agent: docs/agents/AGENTS_ALPHABET.md (row, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name one."},"health":"ok","id":"t27/D","inSpecCorpus":false,"letter":"D","links":{"agentsDoc":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/AGENTS.md","alphabet":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/docs/agents/AGENTS_ALPHABET.md","experienceLog":"https://github.com/gHashTag/t27/tree/95c9b61b97d487bec4279ca63eb3132da8d1721c/.trinity/experience","pinSource":"public/agents/experience.json sources[t27].commit","pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","soul":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/SOUL.md"},"messages":["no attributed episodes in the experience snapshot"],"moduleName":"agent_d","name":{"en":"Delta (De-Zigfication)","ru":"Дельта (Де-зигификация)"},"ordinal":4,"sha256":"093a8c454b5b7ac163fa142bcf6e9ad46fbc2acc1e8d1eb49bf38ef036f915db","skills":[],"specPath":"specs/agents/d.t27","summary":{"en":"De-Zigfication / Migration. De-Zigfication is the open door from .zig to .t27.","ru":"Де-зигификация / миграция. Де-зигификация — открытая дверь из .zig в .t27."},"tools":[],"typecheckOk":true,"witness":"spec-only"},{"crons":[],"discarded":0,"experience":{"episodes":0,"files":[],"first":null,"last":null,"lastTask":null,"lessons":[],"outcomes":{}},"fields":{"AGENTS_DOC":"AGENTS.md","ALPHABET":"docs/agents/AGENTS_ALPHABET.md","ARCHETYPE":"Window - view into the past","CLARA_ROLE":"TA2: AR Explanation & XAI - generates human-readable explanations for AR outputs","DOMAIN":"Experience / XAI","ENABLED":true,"ENTRY_INVARIANT":"Episode log is append-only, no deletions","EXIT_INVARIANT":"Lessons learned are catalogued, explanations are generated","EXPERIENCE_LOG":".trinity/experience/","ID":"t27/E","KEY_FILES":[".trinity/experience/","specs/ar/explainability.t27","specs/ar/proof_trace.t27"],"KIND":"agent","LAYER":"Archetypal","LETTER":"E","LETTER_NAME":"Epsilon","NAME":"Epsilon (Experience)","ORDINAL":5,"REGISTER":"R4","SKILLS":[],"SKILLS_NOTE":"No source binds a skill to this agent. .claude/agents/agent-e-experience.md mentions phi-loop only as the label of the feedback field (1 = phi-loop, 0 = agent cycle); the alphabet key files point at the experience log and AR specs, not at a skill directory.","SOUL":"SOUL.md","SUMMARY_EN":"Experience / XAI. Experience is the window into the past of the system, the breath of its memory.","TOOLS":["tri/experience"],"TOOLS_NOTE":".claude/agents/agent-e-experience.md:64 names tri experience save; lines 65-66 name tri experience query and tri notebook, which the CLI does not have at this commit. The tri-mcp server mirrors the command as tool tri_experience_save."},"health":"ok","id":"t27/E","inSpecCorpus":false,"letter":"E","links":{"agentsDoc":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/AGENTS.md","alphabet":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/docs/agents/AGENTS_ALPHABET.md","experienceLog":"https://github.com/gHashTag/t27/tree/95c9b61b97d487bec4279ca63eb3132da8d1721c/.trinity/experience","pinSource":"public/agents/experience.json sources[t27].commit","pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","soul":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/SOUL.md"},"messages":["no attributed episodes in the experience snapshot"],"moduleName":"agent_e","name":{"en":"Epsilon (Experience)","ru":"Эпсилон (Опыт)"},"ordinal":5,"sha256":"8680ac8254c709d607055ee4ac6872b05bece422635c44dfcc5494d99952992c","skills":[],"specPath":"specs/agents/e.t27","summary":{"en":"Experience / XAI. Experience is the window into the past of the system, the breath of its memory.","ru":"Опыт / XAI. Опыт — окно в прошлое системы, дыхание её памяти."},"tools":[{"id":"tri/experience","ok":true}],"typecheckOk":true,"witness":"spec-only"},{"crons":[],"discarded":0,"experience":{"episodes":0,"files":[],"first":null,"last":null,"lastTask":null,"lessons":[],"outcomes":{}},"fields":{"AGENTS_DOC":"AGENTS.md","ALPHABET":"docs/agents/AGENTS_ALPHABET.md","ARCHETYPE":"Nail - connection, binding","CLARA_ROLE":"","DOMAIN":"Formal Conformance","ENABLED":true,"ENTRY_INVARIANT":"All sacred vectors (G, OmegaLambda, phi) are valid","EXIT_INVARIANT":"Conformance > 95%, all sacred physics verified","EXPERIENCE_LOG":".trinity/experience/","ID":"t27/F","KEY_FILES":["t27/conformance/*.json","conformance/FORMAT-SPEC-001.json"],"KIND":"agent","LAYER":"Archetypal","LETTER":"F","LETTER_NAME":"Phi","NAME":"Phi (Formal Conformance)","ORDINAL":6,"REGISTER":"R5","SKILLS":[],"SKILLS_NOTE":"No source binds a skill to this agent: the alphabet key files point at specs and docs, not at a skill directory, no .claude/agents file names one, and specs/OWNERS.md has no row for it.","SOUL":"SOUL.md","SUMMARY_EN":"Formal Conformance. The conformance JSON files are the nails holding the specs together.","TOOLS":[],"TOOLS_NOTE":"No source binds a tri command or MCP server to this agent: the alphabet key files are conformance JSON vectors (t27/conformance/*.json) and no source names tri vectors for F."},"health":"ok","id":"t27/F","inSpecCorpus":false,"letter":"F","links":{"agentsDoc":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/AGENTS.md","alphabet":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/docs/agents/AGENTS_ALPHABET.md","experienceLog":"https://github.com/gHashTag/t27/tree/95c9b61b97d487bec4279ca63eb3132da8d1721c/.trinity/experience","pinSource":"public/agents/experience.json sources[t27].commit","pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","soul":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/SOUL.md"},"messages":["no attributed episodes in the experience snapshot"],"moduleName":"agent_f","name":{"en":"Phi (Formal Conformance)","ru":"Фи (Формальное соответствие)"},"ordinal":6,"sha256":"1f69f78fbcbe07d6ccc592bb92f39fd33449fdf961244731c3be644e0b8b719c","skills":[],"specPath":"specs/agents/f.t27","summary":{"en":"Formal Conformance. The conformance JSON files are the nails holding the specs together.","ru":"Формальное соответствие. JSON-файлы соответствия — гвозди, скрепляющие спеки."},"tools":[],"typecheckOk":true,"witness":"spec-only"},{"crons":[],"discarded":0,"experience":{"episodes":0,"files":[],"first":null,"last":null,"lastTask":null,"lessons":[],"outcomes":{}},"fields":{"AGENTS_DOC":"AGENTS.md","ALPHABET":"docs/agents/AGENTS_ALPHABET.md","ARCHETYPE":"Return - feedback","CLARA_ROLE":"","DOMAIN":"Graph / ArchBench","ENABLED":true,"ENTRY_INVARIANT":"Graph is acyclic, topological sort exists","EXIT_INVARIANT":"All edges satisfied, no broken dependencies","EXPERIENCE_LOG":".trinity/experience/","ID":"t27/G","KEY_FILES":["architecture/graph_v2.json","architecture/graph.tri"],"KIND":"agent","LAYER":"Archetypal","LETTER":"G","LETTER_NAME":"Gamma (var.)","NAME":"Gamma (Graph)","ORDINAL":7,"REGISTER":"R6","SKILLS":[],"SKILLS_NOTE":"No source binds a skill to this agent: the alphabet key files point at specs and docs, not at a skill directory, no .claude/agents file names one, and specs/OWNERS.md has no row for it.","SOUL":"SOUL.md","SUMMARY_EN":"Graph / ArchBench. The graph is the map of the Trinity world and its distance metric.","TOOLS":[],"TOOLS_NOTE":"No source binds a tri command or MCP server to this agent: docs/agents/AGENTS_ALPHABET.md (row, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name one."},"health":"ok","id":"t27/G","inSpecCorpus":false,"letter":"G","links":{"agentsDoc":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/AGENTS.md","alphabet":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/docs/agents/AGENTS_ALPHABET.md","experienceLog":"https://github.com/gHashTag/t27/tree/95c9b61b97d487bec4279ca63eb3132da8d1721c/.trinity/experience","pinSource":"public/agents/experience.json sources[t27].commit","pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","soul":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/SOUL.md"},"messages":["no attributed episodes in the experience snapshot"],"moduleName":"agent_g","name":{"en":"Gamma (Graph)","ru":"Гамма (Граф)"},"ordinal":7,"sha256":"2508126a477a8a323b133af6f2fb4c26d88be031b678b2b54de2a55656ad0cc0","skills":[],"specPath":"specs/agents/g.t27","summary":{"en":"Graph / ArchBench. The graph is the map of the Trinity world and its distance metric.","ru":"Граф / ArchBench. Граф — карта мира Trinity и его метрика расстояния."},"tools":[],"typecheckOk":true,"witness":"spec-only"},{"crons":[],"discarded":0,"experience":{"episodes":0,"files":[],"first":null,"last":null,"lastTask":null,"lessons":[],"outcomes":{}},"fields":{"AGENTS_DOC":"AGENTS.md","ALPHABET":"docs/agents/AGENTS_ALPHABET.md","ARCHETYPE":"Fence - boundary, life","CLARA_ROLE":"","DOMAIN":"HSLM / NN Architectures","ENABLED":true,"ENTRY_INVARIANT":"HSLM layers are defined, connections are valid","EXIT_INVARIANT":"Attention traces are validated, sacred attention holds","EXPERIENCE_LOG":".trinity/experience/","ID":"t27/H","KEY_FILES":["t27/specs/nn/hslm.t27","t27/specs/nn/attention.t27"],"KIND":"agent","LAYER":"Archetypal","LETTER":"H","LETTER_NAME":"Eta","NAME":"Eta (HSLM)","ORDINAL":8,"REGISTER":"R7","SKILLS":[],"SKILLS_NOTE":"No source binds a skill to this agent: the alphabet key files point at specs and docs, not at a skill directory, no .claude/agents file names one, and specs/OWNERS.md has no row for it.","SOUL":"SOUL.md","SUMMARY_EN":"HSLM / NN Architectures. HSLM is the neural-network architecture, the boundary between brain layers.","TOOLS":[],"TOOLS_NOTE":"No source binds a tri command or MCP server to this agent: docs/agents/AGENTS_ALPHABET.md (row, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name one."},"health":"ok","id":"t27/H","inSpecCorpus":false,"letter":"H","links":{"agentsDoc":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/AGENTS.md","alphabet":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/docs/agents/AGENTS_ALPHABET.md","experienceLog":"https://github.com/gHashTag/t27/tree/95c9b61b97d487bec4279ca63eb3132da8d1721c/.trinity/experience","pinSource":"public/agents/experience.json sources[t27].commit","pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","soul":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/SOUL.md"},"messages":["no attributed episodes in the experience snapshot"],"moduleName":"agent_h","name":{"en":"Eta (HSLM)","ru":"Эта (HSLM)"},"ordinal":8,"sha256":"eaee2545844cfe66509afedf95424ca76e2d3717a8bced297abc0121b3ea6a8a","skills":[],"specPath":"specs/agents/h.t27","summary":{"en":"HSLM / NN Architectures. HSLM is the neural-network architecture, the boundary between brain layers.","ru":"HSLM / архитектуры нейросетей. HSLM — архитектура нейросети, граница между слоями мозга."},"tools":[],"typecheckOk":true,"witness":"spec-only"},{"crons":[],"discarded":0,"experience":{"episodes":0,"files":[],"first":null,"last":null,"lastTask":null,"lessons":[],"outcomes":{}},"fields":{"AGENTS_DOC":"AGENTS.md","ALPHABET":"docs/agents/AGENTS_ALPHABET.md","ARCHETYPE":"Hand - action, point","CLARA_ROLE":"","DOMAIN":"ISA / Registers","ENABLED":true,"ENTRY_INVARIANT":"27 registers are defined, Coptic mapping exists","EXIT_INVARIANT":"Coptic mapping is verified (bijection), all registers accessible","EXPERIENCE_LOG":".trinity/experience/","ID":"t27/I","KEY_FILES":["t27/specs/isa/registers.t27"],"KIND":"agent","LAYER":"Archetypal","LETTER":"I","LETTER_NAME":"Iota","NAME":"Iota (ISA)","ORDINAL":9,"REGISTER":"R8","SKILLS":[],"SKILLS_NOTE":"No source binds a skill to this agent: the alphabet key files point at specs and docs, not at a skill directory, no .claude/agents file names one, and specs/OWNERS.md has no row for it.","SOUL":"SOUL.md","SUMMARY_EN":"ISA / Registers. The ISA is the hand of the machine, its most basic instruction level.","TOOLS":[],"TOOLS_NOTE":"No source binds a tri command or MCP server to this agent: docs/agents/AGENTS_ALPHABET.md (row, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name one."},"health":"ok","id":"t27/I","inSpecCorpus":false,"letter":"I","links":{"agentsDoc":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/AGENTS.md","alphabet":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/docs/agents/AGENTS_ALPHABET.md","experienceLog":"https://github.com/gHashTag/t27/tree/95c9b61b97d487bec4279ca63eb3132da8d1721c/.trinity/experience","pinSource":"public/agents/experience.json sources[t27].commit","pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","soul":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/SOUL.md"},"messages":["no attributed episodes in the experience snapshot"],"moduleName":"agent_i","name":{"en":"Iota (ISA)","ru":"Йота (ISA)"},"ordinal":9,"sha256":"a1e332956a4113776724f90271af313d36df6a30bb5aab6514bb8df2729ef16c","skills":[],"specPath":"specs/agents/i.t27","summary":{"en":"ISA / Registers. The ISA is the hand of the machine, its most basic instruction level.","ru":"ISA / регистры. ISA — рука машины, её самый базовый уровень инструкций."},"tools":[],"typecheckOk":true,"witness":"spec-only"},{"crons":[],"discarded":0,"experience":{"episodes":0,"files":[],"first":null,"last":null,"lastTask":null,"lessons":[],"outcomes":{}},"fields":{"AGENTS_DOC":"AGENTS.md","ALPHABET":"docs/agents/AGENTS_ALPHABET.md","ARCHETYPE":"Hand with grip - dispatcher","CLARA_ROLE":"","DOMAIN":"Jobs / Task Routing","ENABLED":true,"ENTRY_INVARIANT":"Task queue exists, scheduler is running","EXIT_INVARIANT":"No stuck jobs > 1 hour, all jobs assigned","EXPERIENCE_LOG":".trinity/experience/","ID":"t27/J","KEY_FILES":["src/tri/dev_commands.zig"],"KIND":"agent","LAYER":"Spiritual","LETTER":"J","LETTER_NAME":"Iota-extended","NAME":"Iota-extended (Jobs)","ORDINAL":10,"REGISTER":"R9","SKILLS":[],"SKILLS_NOTE":"No source binds a skill to this agent: the alphabet key files point at specs and docs, not at a skill directory, no .claude/agents file names one, and specs/OWNERS.md has no row for it.","SOUL":"SOUL.md","SUMMARY_EN":"Jobs / Task Routing. Jobs grab tasks and route them.","TOOLS":[],"TOOLS_NOTE":"No source binds a tri command or MCP server to this agent: docs/agents/AGENTS_ALPHABET.md (row, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name one."},"health":"ok","id":"t27/J","inSpecCorpus":false,"letter":"J","links":{"agentsDoc":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/AGENTS.md","alphabet":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/docs/agents/AGENTS_ALPHABET.md","experienceLog":"https://github.com/gHashTag/t27/tree/95c9b61b97d487bec4279ca63eb3132da8d1721c/.trinity/experience","pinSource":"public/agents/experience.json sources[t27].commit","pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","soul":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/SOUL.md"},"messages":["no attributed episodes in the experience snapshot"],"moduleName":"agent_j","name":{"en":"Iota-extended (Jobs)","ru":"Йота-расширенная (Задания)"},"ordinal":10,"sha256":"1c3e0fdc23d7ad66ae39662f81621504cfdab1b4660a904508b75867cbbd187e","skills":[],"specPath":"specs/agents/j.t27","summary":{"en":"Jobs / Task Routing. Jobs grab tasks and route them.","ru":"Задания / маршрутизация задач. Задания захватывают задачи и направляют их."},"tools":[],"typecheckOk":true,"witness":"spec-only"},{"crons":[],"discarded":0,"experience":{"episodes":0,"files":[],"first":null,"last":null,"lastTask":null,"lessons":[],"outcomes":{}},"fields":{"AGENTS_DOC":"AGENTS.md","ALPHABET":"docs/agents/AGENTS_ALPHABET.md","ARCHETYPE":"Palm - open hand","CLARA_ROLE":"","DOMAIN":"Kernel / FPGA MAC","ENABLED":true,"ENTRY_INVARIANT":"MAC spec is zero-DSP (no digital signal processors)","EXIT_INVARIANT":"Synthesis is verified, E8 kernel integration works","EXPERIENCE_LOG":".trinity/experience/","ID":"t27/K","KEY_FILES":["t27/specs/fpga/mac.t27","specs/math/e8_lie_algebra.t27"],"KIND":"agent","LAYER":"Spiritual","LETTER":"K","LETTER_NAME":"Kappa","NAME":"Kappa (Kernel)","ORDINAL":11,"REGISTER":"R10","SKILLS":[],"SKILLS_NOTE":"No source binds a skill to this agent: the alphabet key files point at specs and docs, not at a skill directory, no .claude/agents file names one, and specs/OWNERS.md has no row for it.","SOUL":"SOUL.md","SUMMARY_EN":"Kernel / FPGA MAC. Kernel and FPGA are the open palm of the lower hardware level.","TOOLS":[],"TOOLS_NOTE":"No source binds a tri command or MCP server to this agent: docs/agents/AGENTS_ALPHABET.md (row, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name one."},"health":"ok","id":"t27/K","inSpecCorpus":false,"letter":"K","links":{"agentsDoc":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/AGENTS.md","alphabet":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/docs/agents/AGENTS_ALPHABET.md","experienceLog":"https://github.com/gHashTag/t27/tree/95c9b61b97d487bec4279ca63eb3132da8d1721c/.trinity/experience","pinSource":"public/agents/experience.json sources[t27].commit","pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","soul":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/SOUL.md"},"messages":["no attributed episodes in the experience snapshot"],"moduleName":"agent_k","name":{"en":"Kappa (Kernel)","ru":"Каппа (Ядро)"},"ordinal":11,"sha256":"52c87609efcb16a0ddd296875010488540b619c95b16e1967bc26a4a488f856e","skills":[],"specPath":"specs/agents/k.t27","summary":{"en":"Kernel / FPGA MAC. Kernel and FPGA are the open palm of the lower hardware level.","ru":"Ядро / FPGA MAC. Ядро и FPGA — открытая ладонь нижнего аппаратного уровня."},"tools":[],"typecheckOk":true,"witness":"spec-only"},{"crons":[],"discarded":0,"experience":{"episodes":0,"files":[],"first":null,"last":null,"lastTask":null,"lessons":[],"outcomes":{}},"fields":{"AGENTS_DOC":"AGENTS.md","ALPHABET":"docs/agents/AGENTS_ALPHABET.md","ARCHETYPE":"Staff - teacher, guide","CLARA_ROLE":"","DOMAIN":"Language / Syntax vNEXT","ENABLED":true,"ENTRY_INVARIANT":"Syntax vNEXT is documented, BNF grammar exists","EXIT_INVARIANT":"Parser implements vNEXT, all syntax tests pass","EXPERIENCE_LOG":".trinity/experience/","ID":"t27/L","KEY_FILES":["docs/nona-02-organism/TRI_SYNTAX_VNEXT.md"],"KIND":"agent","LAYER":"Spiritual","LETTER":"L","LETTER_NAME":"Lambda","NAME":"Lambda (Language)","ORDINAL":12,"REGISTER":"R11","SKILLS":[],"SKILLS_NOTE":"No source binds a skill to this agent: the alphabet key files point at specs and docs, not at a skill directory, no .claude/agents file names one, and specs/OWNERS.md has no row for it.","SOUL":"SOUL.md","SUMMARY_EN":"Language / Syntax vNEXT. Language is the teacher guiding Trinity speech.","TOOLS":[],"TOOLS_NOTE":"No source binds a tri command or MCP server to this agent: docs/agents/AGENTS_ALPHABET.md (row, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name one."},"health":"ok","id":"t27/L","inSpecCorpus":false,"letter":"L","links":{"agentsDoc":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/AGENTS.md","alphabet":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/docs/agents/AGENTS_ALPHABET.md","experienceLog":"https://github.com/gHashTag/t27/tree/95c9b61b97d487bec4279ca63eb3132da8d1721c/.trinity/experience","pinSource":"public/agents/experience.json sources[t27].commit","pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","soul":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/SOUL.md"},"messages":["no attributed episodes in the experience snapshot"],"moduleName":"agent_l","name":{"en":"Lambda (Language)","ru":"Лямбда (Язык)"},"ordinal":12,"sha256":"2d98573747c17289c348f411e21d8a455be1a647577b6c3aba8d697689ff76f8","skills":[],"specPath":"specs/agents/l.t27","summary":{"en":"Language / Syntax vNEXT. Language is the teacher guiding Trinity speech.","ru":"Язык / синтаксис vNEXT. Язык — учитель, направляющий речь Trinity."},"tools":[],"typecheckOk":true,"witness":"spec-only"},{"crons":[],"discarded":0,"experience":{"episodes":0,"files":[],"first":null,"last":null,"lastTask":null,"lessons":[],"outcomes":{}},"fields":{"AGENTS_DOC":"AGENTS.md","ALPHABET":"docs/agents/AGENTS_ALPHABET.md","ARCHETYPE":"Water - flow of data","CLARA_ROLE":"","DOMAIN":"Metrics / Telemetry","ENABLED":true,"ENTRY_INVARIANT":"Bench baseline exists, telemetry is running","EXIT_INVARIANT":"No performance regression > 5%, all benchmarks current","EXPERIENCE_LOG":".trinity/experience/","ID":"t27/M","KEY_FILES":[".trinity/bench/","docs/qualification/TVP.md"],"KIND":"agent","LAYER":"Spiritual","LETTER":"M","LETTER_NAME":"Mu","NAME":"Mu (Metrics)","ORDINAL":13,"REGISTER":"R12","SKILLS":[],"SKILLS_NOTE":"No source binds a skill to this agent: the alphabet key files point at specs and docs, not at a skill directory, no .claude/agents file names one, and specs/OWNERS.md has no row for it.","SOUL":"SOUL.md","SUMMARY_EN":"Metrics / Telemetry. Metrics are the continuous stream of measurements.","TOOLS":[],"TOOLS_NOTE":"No source binds a tri command or MCP server to this agent: docs/agents/AGENTS_ALPHABET.md (row, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name one."},"health":"ok","id":"t27/M","inSpecCorpus":false,"letter":"M","links":{"agentsDoc":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/AGENTS.md","alphabet":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/docs/agents/AGENTS_ALPHABET.md","experienceLog":"https://github.com/gHashTag/t27/tree/95c9b61b97d487bec4279ca63eb3132da8d1721c/.trinity/experience","pinSource":"public/agents/experience.json sources[t27].commit","pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","soul":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/SOUL.md"},"messages":["no attributed episodes in the experience snapshot"],"moduleName":"agent_m","name":{"en":"Mu (Metrics)","ru":"Мю (Метрики)"},"ordinal":13,"sha256":"0aac5e911f0cf60e0912acc755c63777ae91da62510a806363ff99f9c3599cde","skills":[],"specPath":"specs/agents/m.t27","summary":{"en":"Metrics / Telemetry. Metrics are the continuous stream of measurements.","ru":"Метрики / телеметрия. Метрики — непрерывный поток измерений."},"tools":[],"typecheckOk":true,"witness":"spec-only"},{"crons":[],"discarded":0,"experience":{"episodes":0,"files":[],"first":null,"last":null,"lastTask":null,"lessons":[],"outcomes":{}},"fields":{"AGENTS_DOC":"AGENTS.md","ALPHABET":"docs/agents/AGENTS_ALPHABET.md","ARCHETYPE":"Fish - offspring, multiplication","CLARA_ROLE":"","DOMAIN":"Numeric / GoldenFloat","ENABLED":true,"ENTRY_INVARIANT":"GF family is defined (GF4, GF8, GF12, GF16, GF20, GF24, GF32)","EXIT_INVARIANT":"phi identity validated, all numeric tests pass","EXPERIENCE_LOG":".trinity/experience/","ID":"t27/N","KEY_FILES":["t27/specs/numeric/","docs/NUMERIC-STANDARD-001.md"],"KIND":"agent","LAYER":"Spiritual","LETTER":"N","LETTER_NAME":"Nu","NAME":"Nu (Numeric)","ORDINAL":14,"REGISTER":"R13","SKILLS":[],"SKILLS_NOTE":"No source binds a skill to this agent: the alphabet key files point at specs and docs, not at a skill directory, no .claude/agents file names one, and specs/OWNERS.md has no row for it.","SOUL":"SOUL.md","SUMMARY_EN":"Numeric / GoldenFloat. Numeric is the number-fish swimming toward the golden ratio.","TOOLS":[],"TOOLS_NOTE":"No source binds a tri command or MCP server to this agent: docs/agents/AGENTS_ALPHABET.md (row, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name one."},"health":"ok","id":"t27/N","inSpecCorpus":false,"letter":"N","links":{"agentsDoc":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/AGENTS.md","alphabet":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/docs/agents/AGENTS_ALPHABET.md","experienceLog":"https://github.com/gHashTag/t27/tree/95c9b61b97d487bec4279ca63eb3132da8d1721c/.trinity/experience","pinSource":"public/agents/experience.json sources[t27].commit","pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","soul":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/SOUL.md"},"messages":["no attributed episodes in the experience snapshot"],"moduleName":"agent_n","name":{"en":"Nu (Numeric)","ru":"Ню (Числа)"},"ordinal":14,"sha256":"fb4321801a722b535d3a689a94f5ecf60894cf5f448d3e33e6447866619e541b","skills":[],"specPath":"specs/agents/n.t27","summary":{"en":"Numeric / GoldenFloat. Numeric is the number-fish swimming toward the golden ratio.","ru":"Числа / GoldenFloat. Числовой слой — рыба-число, плывущая к золотому сечению."},"tools":[],"typecheckOk":true,"witness":"spec-only"},{"crons":[],"discarded":0,"experience":{"episodes":0,"files":[],"first":null,"last":null,"lastTask":null,"lessons":[],"outcomes":{}},"fields":{"AGENTS_DOC":"AGENTS.md","ALPHABET":"docs/agents/AGENTS_ALPHABET.md","ARCHETYPE":"Eye - all-seeing oko","CLARA_ROLE":"TA2: AR Composition Engine - composes ML and AR components, manages interactions","DOMAIN":"Orchestration / Phases","ENABLED":true,"ENTRY_INVARIANT":"All phases (1-6) are defined, phase transitions valid","EXIT_INVARIANT":"Orchestration completes, no stuck phases","EXPERIENCE_LOG":".trinity/experience/","ID":"t27/O","KEY_FILES":["src/tri/pipeline/","specs/ar/composition.t27"],"KIND":"agent","LAYER":"Spiritual","LETTER":"O","LETTER_NAME":"Omicron","NAME":"Omicron (Orchestration)","ORDINAL":15,"REGISTER":"R14","SKILLS":[],"SKILLS_NOTE":"No source binds a skill to this agent: the alphabet key files point at specs and docs, not at a skill directory, no .claude/agents file names one, and specs/OWNERS.md has no row for it.","SOUL":"SOUL.md","SUMMARY_EN":"Orchestration / Phases. Orchestration is the all-seeing eye of the phases.","TOOLS":[],"TOOLS_NOTE":"No source binds a tri command or MCP server to this agent: docs/agents/AGENTS_ALPHABET.md (row, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name one."},"health":"ok","id":"t27/O","inSpecCorpus":false,"letter":"O","links":{"agentsDoc":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/AGENTS.md","alphabet":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/docs/agents/AGENTS_ALPHABET.md","experienceLog":"https://github.com/gHashTag/t27/tree/95c9b61b97d487bec4279ca63eb3132da8d1721c/.trinity/experience","pinSource":"public/agents/experience.json sources[t27].commit","pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","soul":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/SOUL.md"},"messages":["no attributed episodes in the experience snapshot"],"moduleName":"agent_o","name":{"en":"Omicron (Orchestration)","ru":"Омикрон (Оркестрация)"},"ordinal":15,"sha256":"f2fd554e5cb70cea54f2daf2e3b36699175354595d333585ac56b556a95864c3","skills":[],"specPath":"specs/agents/o.t27","summary":{"en":"Orchestration / Phases. Orchestration is the all-seeing eye of the phases.","ru":"Оркестрация / фазы. Оркестрация — всевидящее око фаз."},"tools":[],"typecheckOk":true,"witness":"spec-only"},{"crons":[],"discarded":0,"experience":{"episodes":0,"files":[],"first":null,"last":null,"lastTask":null,"lessons":[],"outcomes":{}},"fields":{"AGENTS_DOC":"AGENTS.md","ALPHABET":"docs/agents/AGENTS_ALPHABET.md","ARCHETYPE":"Mouth - speech of universe","CLARA_ROLE":"TA1: AR Theoretical Foundations - provides mathematical basis for AR reasoning","DOMAIN":"Physics / SacredPhysics","ENABLED":true,"ENTRY_INVARIANT":"phi^2 + phi^-2 = 3 holds in all calculations","EXIT_INVARIANT":"Sacred constants (G, OmegaLambda, phi, tpresent) are verified","EXPERIENCE_LOG":".trinity/experience/","ID":"t27/P","KEY_FILES":["t27/specs/math/sacred_physics.t27","specs/physics/su2_chern_simons.t27"],"KIND":"agent","LAYER":"Spiritual","LETTER":"P","LETTER_NAME":"Pi","NAME":"Pi (Physics)","ORDINAL":16,"REGISTER":"R15","SKILLS":[],"SKILLS_NOTE":"No source binds a skill to this agent: the alphabet key files point at specs and docs, not at a skill directory, no .claude/agents file names one, and specs/OWNERS.md has no row for it.","SOUL":"SOUL.md","SUMMARY_EN":"Physics / SacredPhysics. Physics is nature speaking through its constants (phi, G, OmegaLambda).","TOOLS":[],"TOOLS_NOTE":"No source binds a tri command or MCP server to this agent: docs/agents/AGENTS_ALPHABET.md (row, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name one."},"health":"ok","id":"t27/P","inSpecCorpus":false,"letter":"P","links":{"agentsDoc":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/AGENTS.md","alphabet":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/docs/agents/AGENTS_ALPHABET.md","experienceLog":"https://github.com/gHashTag/t27/tree/95c9b61b97d487bec4279ca63eb3132da8d1721c/.trinity/experience","pinSource":"public/agents/experience.json sources[t27].commit","pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","soul":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/SOUL.md"},"messages":["no attributed episodes in the experience snapshot"],"moduleName":"agent_p","name":{"en":"Pi (Physics)","ru":"Пи (Физика)"},"ordinal":16,"sha256":"badf4b6c05c043017b93d89968ce4139335cac039a4de235b294050e2b916aab","skills":[],"specPath":"specs/agents/p.t27","summary":{"en":"Physics / SacredPhysics. Physics is nature speaking through its constants (phi, G, OmegaLambda).","ru":"Физика / SacredPhysics. Физика — природа, говорящая через свои константы (phi, G, OmegaLambda)."},"tools":[],"typecheckOk":true,"witness":"spec-only"},{"crons":[],"discarded":0,"experience":{"episodes":0,"files":[],"first":null,"last":null,"lastTask":null,"lessons":[],"outcomes":{}},"fields":{"AGENTS_DOC":"AGENTS.md","ALPHABET":"docs/agents/AGENTS_ALPHABET.md","ARCHETYPE":"Needle's eye - bottleneck","CLARA_ROLE":"","DOMAIN":"Queue / Scheduling","ENABLED":true,"ENTRY_INVARIANT":"Queue is not empty (work exists)","EXIT_INVARIANT":"MNL (Most-Numerous-Loss) pattern enforced, no starvation","EXPERIENCE_LOG":".trinity/experience/","ID":"t27/Q","KEY_FILES":["src/tri/dev_commands.zig"],"KIND":"agent","LAYER":"Spiritual","LETTER":"Q","LETTER_NAME":"Theta","NAME":"Theta (Queue)","ORDINAL":17,"REGISTER":"R16","SKILLS":[],"SKILLS_NOTE":"No source binds a skill to this agent: the alphabet key files point at specs and docs, not at a skill directory, no .claude/agents file names one, and specs/OWNERS.md has no row for it.","SOUL":"SOUL.md","SUMMARY_EN":"Queue / Scheduling. The queue is the needle's eye for tasks.","TOOLS":[],"TOOLS_NOTE":"No source binds a tri command or MCP server to this agent: docs/agents/AGENTS_ALPHABET.md (row, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name one."},"health":"ok","id":"t27/Q","inSpecCorpus":false,"letter":"Q","links":{"agentsDoc":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/AGENTS.md","alphabet":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/docs/agents/AGENTS_ALPHABET.md","experienceLog":"https://github.com/gHashTag/t27/tree/95c9b61b97d487bec4279ca63eb3132da8d1721c/.trinity/experience","pinSource":"public/agents/experience.json sources[t27].commit","pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","soul":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/SOUL.md"},"messages":["no attributed episodes in the experience snapshot"],"moduleName":"agent_q","name":{"en":"Theta (Queue)","ru":"Тета (Очередь)"},"ordinal":17,"sha256":"f9b41127b3546ba9fbf057a603b081d9b3bb4eab7ee46b23f5e8c804dfd801d8","skills":[],"specPath":"specs/agents/q.t27","summary":{"en":"Queue / Scheduling. The queue is the needle's eye for tasks.","ru":"Очередь / планирование. Очередь — игольное ушко для задач."},"tools":[],"typecheckOk":true,"witness":"spec-only"},{"crons":[],"discarded":0,"experience":{"episodes":0,"files":[],"first":null,"last":null,"lastTask":null,"lessons":[],"outcomes":{}},"fields":{"AGENTS_DOC":"AGENTS.md","ALPHABET":"docs/agents/AGENTS_ALPHABET.md","ARCHETYPE":"Head - beginning of execution","CLARA_ROLE":"","DOMAIN":"Runtime / Bootstrap","ENABLED":true,"ENTRY_INVARIANT":"Runtime is initialized, ABI is defined","EXIT_INVARIANT":"No memory leaks, no resource exhaustion","EXPERIENCE_LOG":".trinity/experience/","ID":"t27/R","KEY_FILES":["t27/compiler/runtime/","bootstrap/src/compiler.rs"],"KIND":"agent","LAYER":"Spiritual","LETTER":"R","LETTER_NAME":"Rho","NAME":"Rho (Runtime)","ORDINAL":18,"REGISTER":"R17","SKILLS":[],"SKILLS_NOTE":"No source binds a skill to this agent: the alphabet key files point at specs and docs, not at a skill directory, no .claude/agents file names one, and specs/OWNERS.md has no row for it.","SOUL":"SOUL.md","SUMMARY_EN":"Runtime / Bootstrap. Runtime is the head of the system during execution.","TOOLS":[],"TOOLS_NOTE":"No source binds a tri command or MCP server to this agent: docs/agents/AGENTS_ALPHABET.md (row, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name one."},"health":"ok","id":"t27/R","inSpecCorpus":false,"letter":"R","links":{"agentsDoc":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/AGENTS.md","alphabet":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/docs/agents/AGENTS_ALPHABET.md","experienceLog":"https://github.com/gHashTag/t27/tree/95c9b61b97d487bec4279ca63eb3132da8d1721c/.trinity/experience","pinSource":"public/agents/experience.json sources[t27].commit","pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","soul":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/SOUL.md"},"messages":["no attributed episodes in the experience snapshot"],"moduleName":"agent_r","name":{"en":"Rho (Runtime)","ru":"Ро (Рантайм)"},"ordinal":18,"sha256":"aab3e536f0afdce1db03304ea4591988b4f284f1a456a6d93bab689ed253eee2","skills":[],"specPath":"specs/agents/r.t27","summary":{"en":"Runtime / Bootstrap. Runtime is the head of the system during execution.","ru":"Рантайм / бутстрап. Рантайм — голова системы во время исполнения."},"tools":[],"typecheckOk":true,"witness":"spec-only"},{"crons":[],"discarded":0,"experience":{"episodes":0,"files":[],"first":null,"last":null,"lastTask":null,"lessons":[],"outcomes":{}},"fields":{"AGENTS_DOC":"AGENTS.md","ALPHABET":"docs/agents/AGENTS_ALPHABET.md","ARCHETYPE":"Teeth - sharpness, flame","CLARA_ROLE":"TA1: AR Spec Standards - defines and enforces AR spec conventions","DOMAIN":"Specs / Standardization / AR Specs","ENABLED":true,"ENTRY_INVARIANT":"All specs have TDD (test/invariant/bench)","EXIT_INVARIANT":"Standards are consistent, naming rules followed","EXPERIENCE_LOG":".trinity/experience/","ID":"t27/S","KEY_FILES":["specs/","specs/ar/*.t27","docs/NUMERIC-*.md"],"KIND":"agent","LAYER":"Physical","LETTER":"S","LETTER_NAME":"Sigma","NAME":"Sigma (Specs)","ORDINAL":19,"REGISTER":"R18","SKILLS":[],"SKILLS_NOTE":"No source binds a skill to this agent: the alphabet key files point at specs and docs, not at a skill directory, no .claude/agents file names one, and specs/OWNERS.md has no row for it.","SOUL":"SOUL.md","SUMMARY_EN":"Specs / Standardization / AR Specs. Specs are the teeth of the standard that grind everything into canon.","TOOLS":[],"TOOLS_NOTE":"No source binds a tri command or MCP server to this agent. docs/agents/AGENTS.md:97 lists tri gen, tri test, tri verdict --toxic, tri bench inside a sample prevention payload attributed to S; that is an example message, not an ownership binding."},"health":"ok","id":"t27/S","inSpecCorpus":false,"letter":"S","links":{"agentsDoc":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/AGENTS.md","alphabet":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/docs/agents/AGENTS_ALPHABET.md","experienceLog":"https://github.com/gHashTag/t27/tree/95c9b61b97d487bec4279ca63eb3132da8d1721c/.trinity/experience","pinSource":"public/agents/experience.json sources[t27].commit","pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","soul":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/SOUL.md"},"messages":["no attributed episodes in the experience snapshot"],"moduleName":"agent_s","name":{"en":"Sigma (Specs)","ru":"Сигма (Спеки)"},"ordinal":19,"sha256":"7f64754295773781de8320b3fefd813ef5d1dd492b4b52f5ac56f9d9e4d01106","skills":[],"specPath":"specs/agents/s.t27","summary":{"en":"Specs / Standardization / AR Specs. Specs are the teeth of the standard that grind everything into canon.","ru":"Спеки / стандартизация / спеки AR. Спеки — зубы стандарта, перемалывающие всё в канон."},"tools":[],"typecheckOk":true,"witness":"spec-only"},{"crons":[],"discarded":0,"experience":{"episodes":0,"files":[],"first":null,"last":null,"lastTask":null,"lessons":[],"outcomes":{}},"fields":{"AGENTS_DOC":"AGENTS.md","ALPHABET":"docs/agents/AGENTS_ALPHABET.md","ARCHETYPE":"CROSS - seal, signature, truth","CLARA_ROLE":"TA2: AR Orchestrator - coordinates all AR agents for CLARA submission","DOMAIN":"Queen / Lotus Orchestrator","ENABLED":true,"ENTRY_INVARIANT":"Queen health >= 0.9, graph is loaded","EXIT_INVARIANT":"All rings are sealed, verdict is clean","EXPERIENCE_LOG":".trinity/experience/","ID":"t27/T","KEY_FILES":["t27/specs/queen/lotus.t27"],"KIND":"agent","LAYER":"Physical","LETTER":"T","LETTER_NAME":"Tau","NAME":"Tau (TRINITY Queen)","ORDINAL":20,"REGISTER":"R19","SKILLS":["t27/phi-loop","t27/tri-pipeline"],"SKILLS_NOTE":".claude/agents/trinity.md, Phase 2 PLAN: \"Identify required skills (phi-loop, tri-pipeline)\"; Phase 4 VERIFY: \"Run conformance tests via tri-pipeline\". specs/OWNERS.md lists skills/ and crons/ under T-Queen, which is catalog ownership, not a held skill.","SOUL":"SOUL.md","SUMMARY_EN":"Queen / Lotus Orchestrator. T is the queen: she puts the final seal on everything.","TOOLS":["tri/gen","tri/test"],"TOOLS_NOTE":".claude/agents/trinity.md:68 (5. Gen - Run tri gen) and :70 (7. Verify - Run tri test). No source binds tri loop or tri health to T."},"health":"ok","id":"t27/T","inSpecCorpus":false,"letter":"T","links":{"agentsDoc":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/AGENTS.md","alphabet":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/docs/agents/AGENTS_ALPHABET.md","experienceLog":"https://github.com/gHashTag/t27/tree/95c9b61b97d487bec4279ca63eb3132da8d1721c/.trinity/experience","pinSource":"public/agents/experience.json sources[t27].commit","pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","soul":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/SOUL.md"},"messages":["no attributed episodes in the experience snapshot"],"moduleName":"agent_t","name":{"en":"Tau (TRINITY Queen)","ru":"Тау (Королева TRINITY)"},"ordinal":20,"sha256":"a5a64df42aba91e1b5bce6c0d5788e543209fa68bc06cb0fc483c84b9041bad0","skills":[{"id":"t27/phi-loop","ok":true},{"id":"t27/tri-pipeline","ok":true}],"specPath":"specs/agents/t.t27","summary":{"en":"Queen / Lotus Orchestrator. T is the queen: she puts the final seal on everything.","ru":"Королева / оркестратор Lotus. T — королева: она ставит на всём финальную печать."},"tools":[{"id":"tri/gen","ok":true},{"id":"tri/test","ok":true}],"typecheckOk":true,"witness":"spec-only"},{"crons":[],"discarded":0,"experience":{"episodes":0,"files":[],"first":null,"last":null,"lastTask":null,"lessons":[],"outcomes":{}},"fields":{"AGENTS_DOC":"AGENTS.md","ALPHABET":"docs/agents/AGENTS_ALPHABET.md","ARCHETYPE":"Fork - branching","CLARA_ROLE":"","DOMAIN":"Universe Levels / Domains","ENABLED":true,"ENTRY_INVARIANT":"Domain boundaries are defined","EXIT_INVARIANT":"No circular dependencies, domains are orthogonal","EXPERIENCE_LOG":".trinity/experience/","ID":"t27/U","KEY_FILES":["t27/domains/"],"KIND":"agent","LAYER":"Physical","LETTER":"U","LETTER_NAME":"Upsilon","NAME":"Upsilon (Universe)","ORDINAL":21,"REGISTER":"R20","SKILLS":[],"SKILLS_NOTE":"No source binds a skill to this agent: the alphabet key files point at specs and docs, not at a skill directory, no .claude/agents file names one, and specs/OWNERS.md has no row for it.","SOUL":"SOUL.md","SUMMARY_EN":"Universe Levels / Domains. Universe levels are the branching of domains.","TOOLS":[],"TOOLS_NOTE":"No source binds a tri command or MCP server to this agent: docs/agents/AGENTS_ALPHABET.md (row, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name one."},"health":"ok","id":"t27/U","inSpecCorpus":false,"letter":"U","links":{"agentsDoc":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/AGENTS.md","alphabet":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/docs/agents/AGENTS_ALPHABET.md","experienceLog":"https://github.com/gHashTag/t27/tree/95c9b61b97d487bec4279ca63eb3132da8d1721c/.trinity/experience","pinSource":"public/agents/experience.json sources[t27].commit","pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","soul":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/SOUL.md"},"messages":["no attributed episodes in the experience snapshot"],"moduleName":"agent_u","name":{"en":"Upsilon (Universe)","ru":"Ипсилон (Вселенная)"},"ordinal":21,"sha256":"8e96c0001588aee91e7dc5aca1d68be9580b7834c595a78c7d62bfec83868b4b","skills":[],"specPath":"specs/agents/u.t27","summary":{"en":"Universe Levels / Domains. Universe levels are the branching of domains.","ru":"Уровни вселенной / домены. Уровни вселенной — ветвление доменов."},"tools":[],"typecheckOk":true,"witness":"spec-only"},{"crons":[],"discarded":0,"experience":{"episodes":0,"files":[],"first":null,"last":null,"lastTask":null,"lessons":[],"outcomes":{}},"fields":{"AGENTS_DOC":"AGENTS.md","ALPHABET":"docs/agents/AGENTS_ALPHABET.md","ARCHETYPE":"Hook - connection, conjunction","CLARA_ROLE":"TA2: AR Validation & Proof - validates AR reasoning, generates proofs","DOMAIN":"Verdict / Bench / AR Validation","ENABLED":true,"ENTRY_INVARIANT":"Verdict engine is ready, toxic thresholds defined","EXIT_INVARIANT":"Toxicity is detected, proof traces are generated","EXPERIENCE_LOG":".trinity/experience/","ID":"t27/V","KEY_FILES":["src/tri/verdict.zig","specs/ar/proof_trace.t27","specs/ar/restraint.t27"],"KIND":"agent","LAYER":"Physical","LETTER":"V","LETTER_NAME":"Vau (var.)","NAME":"Vau (Verdict)","ORDINAL":22,"REGISTER":"R21","SKILLS":[],"SKILLS_NOTE":"No source binds a skill to this agent: the alphabet key files point at specs and docs, not at a skill directory, no .claude/agents file names one, and specs/OWNERS.md has no row for it.","SOUL":"SOUL.md","SUMMARY_EN":"Verdict / Bench / AR Validation. The verdict is the hook that catches the problem.","TOOLS":["tri/test","tri/verdict"],"TOOLS_NOTE":".claude/agents/agent-v-verify.md:47 (tri test) and :49 (tri verdict); docs/agents/AGENTS_ALPHABET.md:80 PHASE 5 VERDICT names tri verdict --toxic for V. Line 48 names tri verify, which is not a tri command at this commit."},"health":"ok","id":"t27/V","inSpecCorpus":false,"letter":"V","links":{"agentsDoc":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/AGENTS.md","alphabet":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/docs/agents/AGENTS_ALPHABET.md","experienceLog":"https://github.com/gHashTag/t27/tree/95c9b61b97d487bec4279ca63eb3132da8d1721c/.trinity/experience","pinSource":"public/agents/experience.json sources[t27].commit","pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","soul":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/SOUL.md"},"messages":["no attributed episodes in the experience snapshot"],"moduleName":"agent_v","name":{"en":"Vau (Verdict)","ru":"Вау (Вердикт)"},"ordinal":22,"sha256":"fcce2147f2fced23acc8d32364023ead496c229862f1f03ae9f5fc6c7c384aeb","skills":[],"specPath":"specs/agents/v.t27","summary":{"en":"Verdict / Bench / AR Validation. The verdict is the hook that catches the problem.","ru":"Вердикт / бенч / валидация AR. Вердикт — крюк, который ловит проблему."},"tools":[{"id":"tri/test","ok":true},{"id":"tri/verdict","ok":true}],"typecheckOk":true,"witness":"spec-only"},{"crons":[],"discarded":0,"experience":{"episodes":0,"files":[],"first":null,"last":null,"lastTask":null,"lessons":[],"outcomes":{}},"fields":{"AGENTS_DOC":"AGENTS.md","ALPHABET":"docs/agents/AGENTS_ALPHABET.md","ARCHETYPE":"Double hook - double seal","CLARA_ROLE":"","DOMAIN":"Workflow / tri cell","ENABLED":true,"ENTRY_INVARIANT":"Cell is sealed, hash is computed","EXIT_INVARIANT":"Hash is verified, commit is signed","EXPERIENCE_LOG":".trinity/experience/","ID":"t27/W","KEY_FILES":["src/tri/cell.zig"],"KIND":"agent","LAYER":"Physical","LETTER":"W","LETTER_NAME":"Double-Vav","NAME":"Double-Vav (Workflow)","ORDINAL":23,"REGISTER":"R22","SKILLS":[],"SKILLS_NOTE":"No source binds a skill to this agent: the alphabet key files point at specs and docs, not at a skill directory, no .claude/agents file names one, and specs/OWNERS.md has no row for it.","SOUL":"SOUL.md","SUMMARY_EN":"Workflow / tri cell. Workflow and tri cell are the double hash-seal.","TOOLS":["tri/cell"],"TOOLS_NOTE":"docs/agents/AGENTS_ALPHABET.md:144: agent W domain Workflow / tri cell, key file src/tri/cell.zig; PHASE 6 EVOLVE: W seals tri-cell commit (hash seal)."},"health":"ok","id":"t27/W","inSpecCorpus":false,"letter":"W","links":{"agentsDoc":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/AGENTS.md","alphabet":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/docs/agents/AGENTS_ALPHABET.md","experienceLog":"https://github.com/gHashTag/t27/tree/95c9b61b97d487bec4279ca63eb3132da8d1721c/.trinity/experience","pinSource":"public/agents/experience.json sources[t27].commit","pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","soul":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/SOUL.md"},"messages":["no attributed episodes in the experience snapshot"],"moduleName":"agent_w","name":{"en":"Double-Vav (Workflow)","ru":"Двойной Вав (Рабочий процесс)"},"ordinal":23,"sha256":"cc5426dfba21dcb6c38e978fd04c01a0ca38b62b942032668531508d454f5aeb","skills":[],"specPath":"specs/agents/w.t27","summary":{"en":"Workflow / tri cell. Workflow and tri cell are the double hash-seal.","ru":"Рабочий процесс / tri cell. Рабочий процесс и tri cell — двойная хеш-печать."},"tools":[{"id":"tri/cell","ok":true}],"typecheckOk":true,"witness":"spec-only"},{"crons":[],"discarded":0,"experience":{"episodes":0,"files":[],"first":null,"last":null,"lastTask":null,"lessons":[],"outcomes":{}},"fields":{"AGENTS_DOC":"AGENTS.md","ALPHABET":"docs/agents/AGENTS_ALPHABET.md","ARCHETYPE":"Intersection - point of exchange","CLARA_ROLE":"","DOMAIN":"External Bindings / Interop","ENABLED":true,"ENTRY_INVARIANT":"Bindings are documented","EXIT_INVARIANT":"Interop tests pass, external APIs are current","EXPERIENCE_LOG":".trinity/experience/","ID":"t27/X","KEY_FILES":["bindings/"],"KIND":"agent","LAYER":"Physical","LETTER":"X","LETTER_NAME":"Chi","NAME":"Chi (External)","ORDINAL":24,"REGISTER":"R23","SKILLS":[],"SKILLS_NOTE":"No source binds a skill to this agent: the alphabet key files point at specs and docs, not at a skill directory, no .claude/agents file names one, and specs/OWNERS.md has no row for it.","SOUL":"SOUL.md","SUMMARY_EN":"External Bindings / Interop. External bindings are the crossroads of Trinity and external systems.","TOOLS":[],"TOOLS_NOTE":"No source binds a tri command or MCP server to this agent: docs/agents/AGENTS_ALPHABET.md (row, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name one."},"health":"ok","id":"t27/X","inSpecCorpus":false,"letter":"X","links":{"agentsDoc":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/AGENTS.md","alphabet":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/docs/agents/AGENTS_ALPHABET.md","experienceLog":"https://github.com/gHashTag/t27/tree/95c9b61b97d487bec4279ca63eb3132da8d1721c/.trinity/experience","pinSource":"public/agents/experience.json sources[t27].commit","pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","soul":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/SOUL.md"},"messages":["no attributed episodes in the experience snapshot"],"moduleName":"agent_x","name":{"en":"Chi (External)","ru":"Хи (Внешнее)"},"ordinal":24,"sha256":"0766c4ee0c06be78156aa2d0d148549b21da87c3db232aeab3e64d28df611ff5","skills":[],"specPath":"specs/agents/x.t27","summary":{"en":"External Bindings / Interop. External bindings are the crossroads of Trinity and external systems.","ru":"Внешние привязки / интероперабельность. Внешние привязки — перекрёсток Trinity и внешних систем."},"tools":[],"typecheckOk":true,"witness":"spec-only"},{"crons":[],"discarded":0,"experience":{"episodes":0,"files":[],"first":null,"last":null,"lastTask":null,"lessons":[],"outcomes":{}},"fields":{"AGENTS_DOC":"AGENTS.md","ALPHABET":"docs/agents/AGENTS_ALPHABET.md","ARCHETYPE":"Merging paths - evolutionary selection","CLARA_ROLE":"","DOMAIN":"Yield / DePIN / Fitness","ENABLED":true,"ENTRY_INVARIANT":"DePIN nodes are defined","EXIT_INVARIANT":"Fitness score > 0.8, yield is optimized","EXPERIENCE_LOG":".trinity/experience/","ID":"t27/Y","KEY_FILES":["deploy/contracts/"],"KIND":"agent","LAYER":"Physical","LETTER":"Y","LETTER_NAME":"Psi","NAME":"Psi (Yield/DePIN)","ORDINAL":25,"REGISTER":"R24","SKILLS":[],"SKILLS_NOTE":"No source binds a skill to this agent: the alphabet key files point at specs and docs, not at a skill directory, no .claude/agents file names one, and specs/OWNERS.md has no row for it.","SOUL":"SOUL.md","SUMMARY_EN":"Yield / DePIN / Fitness. Yield and DePIN are the evolutionary crossroad.","TOOLS":[],"TOOLS_NOTE":"No source binds a tri command or MCP server to this agent: docs/agents/AGENTS_ALPHABET.md (row, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name one."},"health":"ok","id":"t27/Y","inSpecCorpus":false,"letter":"Y","links":{"agentsDoc":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/AGENTS.md","alphabet":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/docs/agents/AGENTS_ALPHABET.md","experienceLog":"https://github.com/gHashTag/t27/tree/95c9b61b97d487bec4279ca63eb3132da8d1721c/.trinity/experience","pinSource":"public/agents/experience.json sources[t27].commit","pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","soul":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/SOUL.md"},"messages":["no attributed episodes in the experience snapshot"],"moduleName":"agent_y","name":{"en":"Psi (Yield/DePIN)","ru":"Пси (Доход/DePIN)"},"ordinal":25,"sha256":"2b7ba398549aa79d07e55e175328b816600fbddbfeb000ff1ce425ec629b3cf4","skills":[],"specPath":"specs/agents/y.t27","summary":{"en":"Yield / DePIN / Fitness. Yield and DePIN are the evolutionary crossroad.","ru":"Доход / DePIN / приспособленность. Доход и DePIN — эволюционный перекрёсток."},"tools":[],"typecheckOk":true,"witness":"spec-only"},{"crons":[],"discarded":0,"experience":{"episodes":0,"files":[],"first":null,"last":null,"lastTask":null,"lessons":[],"outcomes":{}},"fields":{"AGENTS_DOC":"AGENTS.md","ALPHABET":"docs/agents/AGENTS_ALPHABET.md","ARCHETYPE":"Sword - cutting edge, point","CLARA_ROLE":"","DOMAIN":"Zero-Touch UX / Docs","ENABLED":true,"ENTRY_INVARIANT":"All docs are in English, ASCII-only","EXIT_INVARIANT":"DX score > 4/5, all docs are current","EXPERIENCE_LOG":".trinity/experience/","ID":"t27/Z","KEY_FILES":["docs/"],"KIND":"agent","LAYER":"Physical","LETTER":"Z","LETTER_NAME":"Zeta","NAME":"Zeta (Zero-Touch)","ORDINAL":26,"REGISTER":"R25","SKILLS":[],"SKILLS_NOTE":"No source binds a skill to this agent: the alphabet key files point at specs and docs, not at a skill directory, no .claude/agents file names one, and specs/OWNERS.md has no row for it.","SOUL":"SOUL.md","SUMMARY_EN":"Zero-Touch UX / Docs. Zero-Touch is the edge of UX and the final polish.","TOOLS":[],"TOOLS_NOTE":"No source binds a tri command or MCP server to this agent: docs/agents/AGENTS_ALPHABET.md (row, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name one."},"health":"ok","id":"t27/Z","inSpecCorpus":false,"letter":"Z","links":{"agentsDoc":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/AGENTS.md","alphabet":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/docs/agents/AGENTS_ALPHABET.md","experienceLog":"https://github.com/gHashTag/t27/tree/95c9b61b97d487bec4279ca63eb3132da8d1721c/.trinity/experience","pinSource":"public/agents/experience.json sources[t27].commit","pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","soul":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/SOUL.md"},"messages":["no attributed episodes in the experience snapshot"],"moduleName":"agent_z","name":{"en":"Zeta (Zero-Touch)","ru":"Дзета (Zero-Touch)"},"ordinal":26,"sha256":"b4f898411bc6cccc09a47732cf878e2c8e66cfba98f2cab064cca6e54895c489","skills":[],"specPath":"specs/agents/z.t27","summary":{"en":"Zero-Touch UX / Docs. Zero-Touch is the edge of UX and the final polish.","ru":"Zero-Touch UX / документация. Zero-Touch — край UX и финальная полировка."},"tools":[],"typecheckOk":true,"witness":"spec-only"},{"crons":[],"discarded":0,"experience":{"episodes":0,"files":[],"first":null,"last":null,"lastTask":null,"lessons":[],"outcomes":{}},"fields":{"AGENTS_DOC":"AGENTS.md","ALPHABET":"docs/agents/AGENTS_ALPHABET.md","ARCHETYPE":"Egyptian cross - \"sacred gift\"","CLARA_ROLE":"","DOMAIN":"Security / Reserve","ENABLED":false,"ENTRY_INVARIANT":"Security policy exists","EXIT_INVARIANT":"AAIF compliance ready, no vulnerabilities","EXPERIENCE_LOG":".trinity/experience/","ID":"t27/TI","KEY_FILES":[],"KIND":"agent","LAYER":"Physical","LETTER":"TI","LETTER_NAME":"Ti","NAME":"Ti (Security)","ORDINAL":27,"REGISTER":"R26","SKILLS":[],"SKILLS_NOTE":"No source binds a skill to this agent: the alphabet key files point at specs and docs, not at a skill directory, no .claude/agents file names one, and specs/OWNERS.md has no row for it.","SOUL":"SOUL.md","SUMMARY_EN":"Security / Reserve. Security and AAIF are what Trinity gifts the world; the seat is reserved (key files: future).","TOOLS":[],"TOOLS_NOTE":"No source binds a tri command or MCP server to this agent: docs/agents/AGENTS_ALPHABET.md (row, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name one."},"health":"ok","id":"t27/TI","inSpecCorpus":false,"letter":"TI","links":{"agentsDoc":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/AGENTS.md","alphabet":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/docs/agents/AGENTS_ALPHABET.md","experienceLog":"https://github.com/gHashTag/t27/tree/95c9b61b97d487bec4279ca63eb3132da8d1721c/.trinity/experience","pinSource":"public/agents/experience.json sources[t27].commit","pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","soul":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/SOUL.md"},"messages":["no attributed episodes in the experience snapshot"],"moduleName":"agent_ti","name":{"en":"Ti (Security)","ru":"Ти (Безопасность)"},"ordinal":27,"sha256":"8f93c36e4a69d1c698d8f30be012f20565fb849338a44d5418782721c13ea066","skills":[],"specPath":"specs/agents/ti.t27","summary":{"en":"Security / Reserve. Security and AAIF are what Trinity gifts the world; the seat is reserved (key files: future).","ru":"Безопасность / резерв. Безопасность и AAIF — то, что Trinity дарит миру; место зарезервировано (ключевые файлы: в будущем)."},"tools":[],"typecheckOk":true,"witness":"spec-only"}],"compilerWasmSha256":"4d9c0447b5ca288790ab03d3dffc2dda629ed47af9d6731a105fc923aea0aee4","contentSha256":"da2229f239ce0a786420caad3caed90c925d44e54a6479478f1cad57932dce0c","counts":{"byLayer":{"Archetypal":9,"Physical":9,"Spiritual":9},"enabled":26,"episodesAttributed":0,"episodesTotal":386,"episodesUnattributed":386,"specOnly":27,"specPlusExperience":0,"specs":27,"typecheckOk":27,"withClaraRole":8,"withCrons":0,"withExperience":0,"withSkills":1,"withTools":5},"experienceSnapshot":{"attribution":{"fields":["agent_letter","letter","agent","agent_id","agents","owner"],"letters":["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","TI"],"rule":"A letter is assigned only from an agent field that is one letter A-Z, \"ti\"/\"27th\", \"t27/\", or \"agent-...\"; everything else is unattributed. See scripts/sync-agents-experience.mjs and specs/agents/README.md."},"counts":{"agentsWithEpisodes":0,"attributed":0,"episodes":386,"unattributed":386,"unreadableFiles":56},"generatedAt":"2026-09-09T17:03:41.298Z","sources":[{"commit":"da84d38795aa97f9170bb670f04a328032aa6ffe","episodes":383,"files":440,"repo":"trinity","unreadable":56},{"commit":"95c9b61b97d487bec4279ca63eb3132da8d1721c","episodes":3,"files":2,"repo":"t27","unreadable":0}]},"generatedAt":"2026-09-09T17:04:02.832Z","i18n":[{"bundle":"apps/website/i18n/agents.ru.json","coverage":{"n":27,"total":27},"enabled":true,"fields":["SUMMARY","NAME"],"locale":"ru","missing":[],"scope":["specs/skills","specs/crons","specs/agents","specs/functions","specs/tools"],"sha256":"c8871fb4ccdef8fc3cc2937af5db0e307ab0b62f6a03ece9f4512851ffd64f04","spec":"specs/i18n/agents-ru.t27"}],"ladder":{"agents":27,"crons":33,"functions":28,"skills":26,"specs":760,"tools":62},"pin":{"ref":"95c9b61b97d487bec4279ca63eb3132da8d1721c","source":"public/agents/experience.json sources[t27].commit"},"version":1} +{"agents":[{"crons":[],"discarded":0,"experience":{"episodes":0,"files":[],"first":null,"last":null,"lastTask":null,"lessons":[],"outcomes":{}},"fields":{"AGENTS_DOC":"AGENTS.md","ALPHABET":"docs/agents/AGENTS_ALPHABET.md","ARCHETYPE":"Bull - leader, primary force","CLARA_ROLE":"TA1: AR Architecture Design - designs AR module architecture, ensures composability","DOMAIN":"Architecture / ADR / SOUL","ENABLED":true,"ENTRY_INVARIANT":"SOUL.md exists, is ASCII-only, and defines L1-L7 laws","EXIT_INVARIANT":"All ADRs reviewed, consistent with constitution, no conflicts","EXPERIENCE_LOG":".trinity/experience/","ID":"t27/A","KEY_FILES":["SOUL.md","architecture/ADR-*.md","architecture/CANON_DE_ZIGFICATION.md"],"KIND":"agent","LAYER":"Archetypal","LETTER":"A","LETTER_NAME":"Alpha","NAME":"Alpha (Architecture)","ORDINAL":1,"REGISTER":"R0","SKILLS":[],"SKILLS_NOTE":"No source binds a skill to this agent: the alphabet key files point at specs and docs, not at a skill directory, no .claude/agents file names one, and specs/OWNERS.md has no row for it.","SOUL":"SOUL.md","SUMMARY_EN":"Architecture / ADR / SOUL. SOUL.md is the primary cause and the ADRs are the constitution of the system.","TOOLS":[],"TOOLS_NOTE":"No source binds a tri command or MCP server to this agent: docs/agents/AGENTS_ALPHABET.md (row, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name one."},"health":"ok","id":"t27/A","inSpecCorpus":false,"letter":"A","links":{"agentsDoc":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/AGENTS.md","alphabet":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/docs/agents/AGENTS_ALPHABET.md","experienceLog":"https://github.com/gHashTag/t27/tree/95c9b61b97d487bec4279ca63eb3132da8d1721c/.trinity/experience","pinSource":"public/agents/experience.json sources[t27].commit","pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","soul":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/SOUL.md"},"messages":["no attributed episodes in the experience snapshot"],"moduleName":"agent_a","name":{"en":"Alpha (Architecture)","ru":"Альфа (Архитектура)"},"ordinal":1,"sha256":"0bcd805f2c789604a16712f910a652c698fe0b16a2c26ccb7a962a764e379943","skills":[],"specPath":"specs/agents/a.t27","summary":{"en":"Architecture / ADR / SOUL. SOUL.md is the primary cause and the ADRs are the constitution of the system.","ru":"Архитектура / ADR / SOUL. SOUL.md — первопричина, а ADR — конституция системы."},"tools":[],"typecheckOk":true,"witness":"spec-only"},{"crons":[],"discarded":0,"experience":{"episodes":0,"files":[],"first":null,"last":null,"lastTask":null,"lessons":[],"outcomes":{}},"fields":{"AGENTS_DOC":"AGENTS.md","ALPHABET":"docs/agents/AGENTS_ALPHABET.md","ARCHETYPE":"House - container, dwelling","CLARA_ROLE":"","DOMAIN":"Build / Pipeline","ENABLED":true,"ENTRY_INVARIANT":"Build system is clean, no stale artifacts","EXIT_INVARIANT":"All tests pass, CI pipeline is green","EXPERIENCE_LOG":".trinity/experience/","ID":"t27/B","KEY_FILES":["build.tri","src/tri/pipeline/"],"KIND":"agent","LAYER":"Archetypal","LETTER":"B","LETTER_NAME":"Beta","NAME":"Beta (Build)","ORDINAL":2,"REGISTER":"R1","SKILLS":[],"SKILLS_NOTE":"No source binds a skill to this agent: the alphabet key files point at specs and docs, not at a skill directory, no .claude/agents file names one, and specs/OWNERS.md has no row for it.","SOUL":"SOUL.md","SUMMARY_EN":"Build / Pipeline. build.tri is the house of specifications and the pipeline is its dwelling.","TOOLS":[],"TOOLS_NOTE":"No source binds a tri command or MCP server to this agent: docs/agents/AGENTS_ALPHABET.md (row, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name one."},"health":"ok","id":"t27/B","inSpecCorpus":false,"letter":"B","links":{"agentsDoc":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/AGENTS.md","alphabet":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/docs/agents/AGENTS_ALPHABET.md","experienceLog":"https://github.com/gHashTag/t27/tree/95c9b61b97d487bec4279ca63eb3132da8d1721c/.trinity/experience","pinSource":"public/agents/experience.json sources[t27].commit","pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","soul":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/SOUL.md"},"messages":["no attributed episodes in the experience snapshot"],"moduleName":"agent_b","name":{"en":"Beta (Build)","ru":"Бета (Сборка)"},"ordinal":2,"sha256":"61d170317eadcdfe028549190c431b633d93cb5dc2dea7fdc1c041c71154b34f","skills":[],"specPath":"specs/agents/b.t27","summary":{"en":"Build / Pipeline. build.tri is the house of specifications and the pipeline is its dwelling.","ru":"Сборка / конвейер. build.tri — дом спецификаций, а конвейер — его жилище."},"tools":[],"typecheckOk":true,"witness":"spec-only"},{"crons":[],"discarded":0,"experience":{"episodes":0,"files":[],"first":null,"last":null,"lastTask":null,"lessons":[],"outcomes":{}},"fields":{"AGENTS_DOC":"AGENTS.md","ALPHABET":"docs/agents/AGENTS_ALPHABET.md","ARCHETYPE":"Camel - carrier across borders","CLARA_ROLE":"TA1: AR Language Implementation - implements AR language features in t27 compiler","DOMAIN":"Compiler Core / AR Language","ENABLED":true,"ENTRY_INVARIANT":"Parser can handle all AR syntax (ternary logic, rules, proofs)","EXIT_INVARIANT":"Generated code compiles, AST is valid","EXPERIENCE_LOG":".trinity/experience/","ID":"t27/C","KEY_FILES":["t27/compiler/parser/","bootstrap/src/compiler.rs","specs/ar/*.t27"],"KIND":"agent","LAYER":"Archetypal","LETTER":"C","LETTER_NAME":"Gamma","NAME":"Gamma (Compiler Core)","ORDINAL":3,"REGISTER":"R2","SKILLS":[],"SKILLS_NOTE":"No source binds a skill to this agent: the alphabet key files point at specs and docs, not at a skill directory, no .claude/agents file names one, and specs/OWNERS.md has no row for it.","SOUL":"SOUL.md","SUMMARY_EN":"Compiler Core / AR Language. The compiler carries text across borders, from spec to generated code.","TOOLS":["tri/gen"],"TOOLS_NOTE":".claude/agents/agent-c-compiler.md:40 names tri gen (trigger On tri gen command, line 7). Line 41 names tri seal, which is not a tri command at this commit (tri cell seal is not bound here)."},"health":"ok","id":"t27/C","inSpecCorpus":false,"letter":"C","links":{"agentsDoc":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/AGENTS.md","alphabet":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/docs/agents/AGENTS_ALPHABET.md","experienceLog":"https://github.com/gHashTag/t27/tree/95c9b61b97d487bec4279ca63eb3132da8d1721c/.trinity/experience","pinSource":"public/agents/experience.json sources[t27].commit","pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","soul":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/SOUL.md"},"messages":["no attributed episodes in the experience snapshot"],"moduleName":"agent_c","name":{"en":"Gamma (Compiler Core)","ru":"Гамма (Ядро компилятора)"},"ordinal":3,"sha256":"89402274898f607a2be4d505f8925c76802acfe2683739605f8413604530ff23","skills":[],"specPath":"specs/agents/c.t27","summary":{"en":"Compiler Core / AR Language. The compiler carries text across borders, from spec to generated code.","ru":"Ядро компилятора / язык AR. Компилятор переносит текст через границы: от спеки к сгенерированному коду."},"tools":[{"id":"tri/gen","ok":true}],"typecheckOk":true,"witness":"spec-only"},{"crons":[],"discarded":0,"experience":{"episodes":0,"files":[],"first":null,"last":null,"lastTask":null,"lessons":[],"outcomes":{}},"fields":{"AGENTS_DOC":"AGENTS.md","ALPHABET":"docs/agents/AGENTS_ALPHABET.md","ARCHETYPE":"Door - transition between worlds","CLARA_ROLE":"","DOMAIN":"De-Zigfication / Migration","ENABLED":true,"ENTRY_INVARIANT":"Legacy Zig modules are catalogued and mapped","EXIT_INVARIANT":"All AR specs are in .t27 format, no Zig hand-editing on AR","EXPERIENCE_LOG":".trinity/experience/","ID":"t27/D","KEY_FILES":["docs/migration-map.md","specs/ar/*.t27"],"KIND":"agent","LAYER":"Archetypal","LETTER":"D","LETTER_NAME":"Delta","NAME":"Delta (De-Zigfication)","ORDINAL":4,"REGISTER":"R3","SKILLS":[],"SKILLS_NOTE":"No source binds a skill to this agent: the alphabet key files point at specs and docs, not at a skill directory, no .claude/agents file names one, and specs/OWNERS.md has no row for it.","SOUL":"SOUL.md","SUMMARY_EN":"De-Zigfication / Migration. De-Zigfication is the open door from .zig to .t27.","TOOLS":[],"TOOLS_NOTE":"No source binds a tri command or MCP server to this agent: docs/agents/AGENTS_ALPHABET.md (row, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name one."},"health":"ok","id":"t27/D","inSpecCorpus":false,"letter":"D","links":{"agentsDoc":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/AGENTS.md","alphabet":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/docs/agents/AGENTS_ALPHABET.md","experienceLog":"https://github.com/gHashTag/t27/tree/95c9b61b97d487bec4279ca63eb3132da8d1721c/.trinity/experience","pinSource":"public/agents/experience.json sources[t27].commit","pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","soul":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/SOUL.md"},"messages":["no attributed episodes in the experience snapshot"],"moduleName":"agent_d","name":{"en":"Delta (De-Zigfication)","ru":"Дельта (Де-зигификация)"},"ordinal":4,"sha256":"093a8c454b5b7ac163fa142bcf6e9ad46fbc2acc1e8d1eb49bf38ef036f915db","skills":[],"specPath":"specs/agents/d.t27","summary":{"en":"De-Zigfication / Migration. De-Zigfication is the open door from .zig to .t27.","ru":"Де-зигификация / миграция. Де-зигификация — открытая дверь из .zig в .t27."},"tools":[],"typecheckOk":true,"witness":"spec-only"},{"crons":[],"discarded":0,"experience":{"episodes":0,"files":[],"first":null,"last":null,"lastTask":null,"lessons":[],"outcomes":{}},"fields":{"AGENTS_DOC":"AGENTS.md","ALPHABET":"docs/agents/AGENTS_ALPHABET.md","ARCHETYPE":"Window - view into the past","CLARA_ROLE":"TA2: AR Explanation & XAI - generates human-readable explanations for AR outputs","DOMAIN":"Experience / XAI","ENABLED":true,"ENTRY_INVARIANT":"Episode log is append-only, no deletions","EXIT_INVARIANT":"Lessons learned are catalogued, explanations are generated","EXPERIENCE_LOG":".trinity/experience/","ID":"t27/E","KEY_FILES":[".trinity/experience/","specs/ar/explainability.t27","specs/ar/proof_trace.t27"],"KIND":"agent","LAYER":"Archetypal","LETTER":"E","LETTER_NAME":"Epsilon","NAME":"Epsilon (Experience)","ORDINAL":5,"REGISTER":"R4","SKILLS":[],"SKILLS_NOTE":"No source binds a skill to this agent. .claude/agents/agent-e-experience.md mentions phi-loop only as the label of the feedback field (1 = phi-loop, 0 = agent cycle); the alphabet key files point at the experience log and AR specs, not at a skill directory.","SOUL":"SOUL.md","SUMMARY_EN":"Experience / XAI. Experience is the window into the past of the system, the breath of its memory.","TOOLS":["tri/experience"],"TOOLS_NOTE":".claude/agents/agent-e-experience.md:64 names tri experience save; lines 65-66 name tri experience query and tri notebook, which the CLI does not have at this commit. The tri-mcp server mirrors the command as tool tri_experience_save."},"health":"ok","id":"t27/E","inSpecCorpus":false,"letter":"E","links":{"agentsDoc":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/AGENTS.md","alphabet":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/docs/agents/AGENTS_ALPHABET.md","experienceLog":"https://github.com/gHashTag/t27/tree/95c9b61b97d487bec4279ca63eb3132da8d1721c/.trinity/experience","pinSource":"public/agents/experience.json sources[t27].commit","pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","soul":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/SOUL.md"},"messages":["no attributed episodes in the experience snapshot"],"moduleName":"agent_e","name":{"en":"Epsilon (Experience)","ru":"Эпсилон (Опыт)"},"ordinal":5,"sha256":"8680ac8254c709d607055ee4ac6872b05bece422635c44dfcc5494d99952992c","skills":[],"specPath":"specs/agents/e.t27","summary":{"en":"Experience / XAI. Experience is the window into the past of the system, the breath of its memory.","ru":"Опыт / XAI. Опыт — окно в прошлое системы, дыхание её памяти."},"tools":[{"id":"tri/experience","ok":true}],"typecheckOk":true,"witness":"spec-only"},{"crons":[],"discarded":0,"experience":{"episodes":0,"files":[],"first":null,"last":null,"lastTask":null,"lessons":[],"outcomes":{}},"fields":{"AGENTS_DOC":"AGENTS.md","ALPHABET":"docs/agents/AGENTS_ALPHABET.md","ARCHETYPE":"Nail - connection, binding","CLARA_ROLE":"","DOMAIN":"Formal Conformance","ENABLED":true,"ENTRY_INVARIANT":"All sacred vectors (G, OmegaLambda, phi) are valid","EXIT_INVARIANT":"Conformance > 95%, all sacred physics verified","EXPERIENCE_LOG":".trinity/experience/","ID":"t27/F","KEY_FILES":["t27/conformance/*.json","conformance/FORMAT-SPEC-001.json"],"KIND":"agent","LAYER":"Archetypal","LETTER":"F","LETTER_NAME":"Phi","NAME":"Phi (Formal Conformance)","ORDINAL":6,"REGISTER":"R5","SKILLS":[],"SKILLS_NOTE":"No source binds a skill to this agent: the alphabet key files point at specs and docs, not at a skill directory, no .claude/agents file names one, and specs/OWNERS.md has no row for it.","SOUL":"SOUL.md","SUMMARY_EN":"Formal Conformance. The conformance JSON files are the nails holding the specs together.","TOOLS":[],"TOOLS_NOTE":"No source binds a tri command or MCP server to this agent: the alphabet key files are conformance JSON vectors (t27/conformance/*.json) and no source names tri vectors for F."},"health":"ok","id":"t27/F","inSpecCorpus":false,"letter":"F","links":{"agentsDoc":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/AGENTS.md","alphabet":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/docs/agents/AGENTS_ALPHABET.md","experienceLog":"https://github.com/gHashTag/t27/tree/95c9b61b97d487bec4279ca63eb3132da8d1721c/.trinity/experience","pinSource":"public/agents/experience.json sources[t27].commit","pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","soul":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/SOUL.md"},"messages":["no attributed episodes in the experience snapshot"],"moduleName":"agent_f","name":{"en":"Phi (Formal Conformance)","ru":"Фи (Формальное соответствие)"},"ordinal":6,"sha256":"1f69f78fbcbe07d6ccc592bb92f39fd33449fdf961244731c3be644e0b8b719c","skills":[],"specPath":"specs/agents/f.t27","summary":{"en":"Formal Conformance. The conformance JSON files are the nails holding the specs together.","ru":"Формальное соответствие. JSON-файлы соответствия — гвозди, скрепляющие спеки."},"tools":[],"typecheckOk":true,"witness":"spec-only"},{"crons":[],"discarded":0,"experience":{"episodes":0,"files":[],"first":null,"last":null,"lastTask":null,"lessons":[],"outcomes":{}},"fields":{"AGENTS_DOC":"AGENTS.md","ALPHABET":"docs/agents/AGENTS_ALPHABET.md","ARCHETYPE":"Return - feedback","CLARA_ROLE":"","DOMAIN":"Graph / ArchBench","ENABLED":true,"ENTRY_INVARIANT":"Graph is acyclic, topological sort exists","EXIT_INVARIANT":"All edges satisfied, no broken dependencies","EXPERIENCE_LOG":".trinity/experience/","ID":"t27/G","KEY_FILES":["architecture/graph_v2.json","architecture/graph.tri"],"KIND":"agent","LAYER":"Archetypal","LETTER":"G","LETTER_NAME":"Gamma (var.)","NAME":"Gamma (Graph)","ORDINAL":7,"REGISTER":"R6","SKILLS":[],"SKILLS_NOTE":"No source binds a skill to this agent: the alphabet key files point at specs and docs, not at a skill directory, no .claude/agents file names one, and specs/OWNERS.md has no row for it.","SOUL":"SOUL.md","SUMMARY_EN":"Graph / ArchBench. The graph is the map of the Trinity world and its distance metric.","TOOLS":[],"TOOLS_NOTE":"No source binds a tri command or MCP server to this agent: docs/agents/AGENTS_ALPHABET.md (row, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name one."},"health":"ok","id":"t27/G","inSpecCorpus":false,"letter":"G","links":{"agentsDoc":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/AGENTS.md","alphabet":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/docs/agents/AGENTS_ALPHABET.md","experienceLog":"https://github.com/gHashTag/t27/tree/95c9b61b97d487bec4279ca63eb3132da8d1721c/.trinity/experience","pinSource":"public/agents/experience.json sources[t27].commit","pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","soul":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/SOUL.md"},"messages":["no attributed episodes in the experience snapshot"],"moduleName":"agent_g","name":{"en":"Gamma (Graph)","ru":"Гамма (Граф)"},"ordinal":7,"sha256":"2508126a477a8a323b133af6f2fb4c26d88be031b678b2b54de2a55656ad0cc0","skills":[],"specPath":"specs/agents/g.t27","summary":{"en":"Graph / ArchBench. The graph is the map of the Trinity world and its distance metric.","ru":"Граф / ArchBench. Граф — карта мира Trinity и его метрика расстояния."},"tools":[],"typecheckOk":true,"witness":"spec-only"},{"crons":[],"discarded":0,"experience":{"episodes":0,"files":[],"first":null,"last":null,"lastTask":null,"lessons":[],"outcomes":{}},"fields":{"AGENTS_DOC":"AGENTS.md","ALPHABET":"docs/agents/AGENTS_ALPHABET.md","ARCHETYPE":"Fence - boundary, life","CLARA_ROLE":"","DOMAIN":"HSLM / NN Architectures","ENABLED":true,"ENTRY_INVARIANT":"HSLM layers are defined, connections are valid","EXIT_INVARIANT":"Attention traces are validated, sacred attention holds","EXPERIENCE_LOG":".trinity/experience/","ID":"t27/H","KEY_FILES":["t27/specs/nn/hslm.t27","t27/specs/nn/attention.t27"],"KIND":"agent","LAYER":"Archetypal","LETTER":"H","LETTER_NAME":"Eta","NAME":"Eta (HSLM)","ORDINAL":8,"REGISTER":"R7","SKILLS":[],"SKILLS_NOTE":"No source binds a skill to this agent: the alphabet key files point at specs and docs, not at a skill directory, no .claude/agents file names one, and specs/OWNERS.md has no row for it.","SOUL":"SOUL.md","SUMMARY_EN":"HSLM / NN Architectures. HSLM is the neural-network architecture, the boundary between brain layers.","TOOLS":[],"TOOLS_NOTE":"No source binds a tri command or MCP server to this agent: docs/agents/AGENTS_ALPHABET.md (row, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name one."},"health":"ok","id":"t27/H","inSpecCorpus":false,"letter":"H","links":{"agentsDoc":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/AGENTS.md","alphabet":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/docs/agents/AGENTS_ALPHABET.md","experienceLog":"https://github.com/gHashTag/t27/tree/95c9b61b97d487bec4279ca63eb3132da8d1721c/.trinity/experience","pinSource":"public/agents/experience.json sources[t27].commit","pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","soul":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/SOUL.md"},"messages":["no attributed episodes in the experience snapshot"],"moduleName":"agent_h","name":{"en":"Eta (HSLM)","ru":"Эта (HSLM)"},"ordinal":8,"sha256":"eaee2545844cfe66509afedf95424ca76e2d3717a8bced297abc0121b3ea6a8a","skills":[],"specPath":"specs/agents/h.t27","summary":{"en":"HSLM / NN Architectures. HSLM is the neural-network architecture, the boundary between brain layers.","ru":"HSLM / архитектуры нейросетей. HSLM — архитектура нейросети, граница между слоями мозга."},"tools":[],"typecheckOk":true,"witness":"spec-only"},{"crons":[],"discarded":0,"experience":{"episodes":0,"files":[],"first":null,"last":null,"lastTask":null,"lessons":[],"outcomes":{}},"fields":{"AGENTS_DOC":"AGENTS.md","ALPHABET":"docs/agents/AGENTS_ALPHABET.md","ARCHETYPE":"Hand - action, point","CLARA_ROLE":"","DOMAIN":"ISA / Registers","ENABLED":true,"ENTRY_INVARIANT":"27 registers are defined, Coptic mapping exists","EXIT_INVARIANT":"Coptic mapping is verified (bijection), all registers accessible","EXPERIENCE_LOG":".trinity/experience/","ID":"t27/I","KEY_FILES":["t27/specs/isa/registers.t27"],"KIND":"agent","LAYER":"Archetypal","LETTER":"I","LETTER_NAME":"Iota","NAME":"Iota (ISA)","ORDINAL":9,"REGISTER":"R8","SKILLS":[],"SKILLS_NOTE":"No source binds a skill to this agent: the alphabet key files point at specs and docs, not at a skill directory, no .claude/agents file names one, and specs/OWNERS.md has no row for it.","SOUL":"SOUL.md","SUMMARY_EN":"ISA / Registers. The ISA is the hand of the machine, its most basic instruction level.","TOOLS":[],"TOOLS_NOTE":"No source binds a tri command or MCP server to this agent: docs/agents/AGENTS_ALPHABET.md (row, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name one."},"health":"ok","id":"t27/I","inSpecCorpus":false,"letter":"I","links":{"agentsDoc":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/AGENTS.md","alphabet":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/docs/agents/AGENTS_ALPHABET.md","experienceLog":"https://github.com/gHashTag/t27/tree/95c9b61b97d487bec4279ca63eb3132da8d1721c/.trinity/experience","pinSource":"public/agents/experience.json sources[t27].commit","pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","soul":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/SOUL.md"},"messages":["no attributed episodes in the experience snapshot"],"moduleName":"agent_i","name":{"en":"Iota (ISA)","ru":"Йота (ISA)"},"ordinal":9,"sha256":"a1e332956a4113776724f90271af313d36df6a30bb5aab6514bb8df2729ef16c","skills":[],"specPath":"specs/agents/i.t27","summary":{"en":"ISA / Registers. The ISA is the hand of the machine, its most basic instruction level.","ru":"ISA / регистры. ISA — рука машины, её самый базовый уровень инструкций."},"tools":[],"typecheckOk":true,"witness":"spec-only"},{"crons":[],"discarded":0,"experience":{"episodes":0,"files":[],"first":null,"last":null,"lastTask":null,"lessons":[],"outcomes":{}},"fields":{"AGENTS_DOC":"AGENTS.md","ALPHABET":"docs/agents/AGENTS_ALPHABET.md","ARCHETYPE":"Hand with grip - dispatcher","CLARA_ROLE":"","DOMAIN":"Jobs / Task Routing","ENABLED":true,"ENTRY_INVARIANT":"Task queue exists, scheduler is running","EXIT_INVARIANT":"No stuck jobs > 1 hour, all jobs assigned","EXPERIENCE_LOG":".trinity/experience/","ID":"t27/J","KEY_FILES":["src/tri/dev_commands.zig"],"KIND":"agent","LAYER":"Spiritual","LETTER":"J","LETTER_NAME":"Iota-extended","NAME":"Iota-extended (Jobs)","ORDINAL":10,"REGISTER":"R9","SKILLS":[],"SKILLS_NOTE":"No source binds a skill to this agent: the alphabet key files point at specs and docs, not at a skill directory, no .claude/agents file names one, and specs/OWNERS.md has no row for it.","SOUL":"SOUL.md","SUMMARY_EN":"Jobs / Task Routing. Jobs grab tasks and route them.","TOOLS":[],"TOOLS_NOTE":"No source binds a tri command or MCP server to this agent: docs/agents/AGENTS_ALPHABET.md (row, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name one."},"health":"ok","id":"t27/J","inSpecCorpus":false,"letter":"J","links":{"agentsDoc":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/AGENTS.md","alphabet":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/docs/agents/AGENTS_ALPHABET.md","experienceLog":"https://github.com/gHashTag/t27/tree/95c9b61b97d487bec4279ca63eb3132da8d1721c/.trinity/experience","pinSource":"public/agents/experience.json sources[t27].commit","pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","soul":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/SOUL.md"},"messages":["no attributed episodes in the experience snapshot"],"moduleName":"agent_j","name":{"en":"Iota-extended (Jobs)","ru":"Йота-расширенная (Задания)"},"ordinal":10,"sha256":"1c3e0fdc23d7ad66ae39662f81621504cfdab1b4660a904508b75867cbbd187e","skills":[],"specPath":"specs/agents/j.t27","summary":{"en":"Jobs / Task Routing. Jobs grab tasks and route them.","ru":"Задания / маршрутизация задач. Задания захватывают задачи и направляют их."},"tools":[],"typecheckOk":true,"witness":"spec-only"},{"crons":[],"discarded":0,"experience":{"episodes":0,"files":[],"first":null,"last":null,"lastTask":null,"lessons":[],"outcomes":{}},"fields":{"AGENTS_DOC":"AGENTS.md","ALPHABET":"docs/agents/AGENTS_ALPHABET.md","ARCHETYPE":"Palm - open hand","CLARA_ROLE":"","DOMAIN":"Kernel / FPGA MAC","ENABLED":true,"ENTRY_INVARIANT":"MAC spec is zero-DSP (no digital signal processors)","EXIT_INVARIANT":"Synthesis is verified, E8 kernel integration works","EXPERIENCE_LOG":".trinity/experience/","ID":"t27/K","KEY_FILES":["t27/specs/fpga/mac.t27","specs/math/e8_lie_algebra.t27"],"KIND":"agent","LAYER":"Spiritual","LETTER":"K","LETTER_NAME":"Kappa","NAME":"Kappa (Kernel)","ORDINAL":11,"REGISTER":"R10","SKILLS":[],"SKILLS_NOTE":"No source binds a skill to this agent: the alphabet key files point at specs and docs, not at a skill directory, no .claude/agents file names one, and specs/OWNERS.md has no row for it.","SOUL":"SOUL.md","SUMMARY_EN":"Kernel / FPGA MAC. Kernel and FPGA are the open palm of the lower hardware level.","TOOLS":[],"TOOLS_NOTE":"No source binds a tri command or MCP server to this agent: docs/agents/AGENTS_ALPHABET.md (row, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name one."},"health":"ok","id":"t27/K","inSpecCorpus":false,"letter":"K","links":{"agentsDoc":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/AGENTS.md","alphabet":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/docs/agents/AGENTS_ALPHABET.md","experienceLog":"https://github.com/gHashTag/t27/tree/95c9b61b97d487bec4279ca63eb3132da8d1721c/.trinity/experience","pinSource":"public/agents/experience.json sources[t27].commit","pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","soul":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/SOUL.md"},"messages":["no attributed episodes in the experience snapshot"],"moduleName":"agent_k","name":{"en":"Kappa (Kernel)","ru":"Каппа (Ядро)"},"ordinal":11,"sha256":"52c87609efcb16a0ddd296875010488540b619c95b16e1967bc26a4a488f856e","skills":[],"specPath":"specs/agents/k.t27","summary":{"en":"Kernel / FPGA MAC. Kernel and FPGA are the open palm of the lower hardware level.","ru":"Ядро / FPGA MAC. Ядро и FPGA — открытая ладонь нижнего аппаратного уровня."},"tools":[],"typecheckOk":true,"witness":"spec-only"},{"crons":[],"discarded":0,"experience":{"episodes":0,"files":[],"first":null,"last":null,"lastTask":null,"lessons":[],"outcomes":{}},"fields":{"AGENTS_DOC":"AGENTS.md","ALPHABET":"docs/agents/AGENTS_ALPHABET.md","ARCHETYPE":"Staff - teacher, guide","CLARA_ROLE":"","DOMAIN":"Language / Syntax vNEXT","ENABLED":true,"ENTRY_INVARIANT":"Syntax vNEXT is documented, BNF grammar exists","EXIT_INVARIANT":"Parser implements vNEXT, all syntax tests pass","EXPERIENCE_LOG":".trinity/experience/","ID":"t27/L","KEY_FILES":["docs/nona-02-organism/TRI_SYNTAX_VNEXT.md"],"KIND":"agent","LAYER":"Spiritual","LETTER":"L","LETTER_NAME":"Lambda","NAME":"Lambda (Language)","ORDINAL":12,"REGISTER":"R11","SKILLS":[],"SKILLS_NOTE":"No source binds a skill to this agent: the alphabet key files point at specs and docs, not at a skill directory, no .claude/agents file names one, and specs/OWNERS.md has no row for it.","SOUL":"SOUL.md","SUMMARY_EN":"Language / Syntax vNEXT. Language is the teacher guiding Trinity speech.","TOOLS":[],"TOOLS_NOTE":"No source binds a tri command or MCP server to this agent: docs/agents/AGENTS_ALPHABET.md (row, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name one."},"health":"ok","id":"t27/L","inSpecCorpus":false,"letter":"L","links":{"agentsDoc":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/AGENTS.md","alphabet":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/docs/agents/AGENTS_ALPHABET.md","experienceLog":"https://github.com/gHashTag/t27/tree/95c9b61b97d487bec4279ca63eb3132da8d1721c/.trinity/experience","pinSource":"public/agents/experience.json sources[t27].commit","pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","soul":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/SOUL.md"},"messages":["no attributed episodes in the experience snapshot"],"moduleName":"agent_l","name":{"en":"Lambda (Language)","ru":"Лямбда (Язык)"},"ordinal":12,"sha256":"2d98573747c17289c348f411e21d8a455be1a647577b6c3aba8d697689ff76f8","skills":[],"specPath":"specs/agents/l.t27","summary":{"en":"Language / Syntax vNEXT. Language is the teacher guiding Trinity speech.","ru":"Язык / синтаксис vNEXT. Язык — учитель, направляющий речь Trinity."},"tools":[],"typecheckOk":true,"witness":"spec-only"},{"crons":[],"discarded":0,"experience":{"episodes":0,"files":[],"first":null,"last":null,"lastTask":null,"lessons":[],"outcomes":{}},"fields":{"AGENTS_DOC":"AGENTS.md","ALPHABET":"docs/agents/AGENTS_ALPHABET.md","ARCHETYPE":"Water - flow of data","CLARA_ROLE":"","DOMAIN":"Metrics / Telemetry","ENABLED":true,"ENTRY_INVARIANT":"Bench baseline exists, telemetry is running","EXIT_INVARIANT":"No performance regression > 5%, all benchmarks current","EXPERIENCE_LOG":".trinity/experience/","ID":"t27/M","KEY_FILES":[".trinity/bench/","docs/qualification/TVP.md"],"KIND":"agent","LAYER":"Spiritual","LETTER":"M","LETTER_NAME":"Mu","NAME":"Mu (Metrics)","ORDINAL":13,"REGISTER":"R12","SKILLS":[],"SKILLS_NOTE":"No source binds a skill to this agent: the alphabet key files point at specs and docs, not at a skill directory, no .claude/agents file names one, and specs/OWNERS.md has no row for it.","SOUL":"SOUL.md","SUMMARY_EN":"Metrics / Telemetry. Metrics are the continuous stream of measurements.","TOOLS":[],"TOOLS_NOTE":"No source binds a tri command or MCP server to this agent: docs/agents/AGENTS_ALPHABET.md (row, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name one."},"health":"ok","id":"t27/M","inSpecCorpus":false,"letter":"M","links":{"agentsDoc":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/AGENTS.md","alphabet":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/docs/agents/AGENTS_ALPHABET.md","experienceLog":"https://github.com/gHashTag/t27/tree/95c9b61b97d487bec4279ca63eb3132da8d1721c/.trinity/experience","pinSource":"public/agents/experience.json sources[t27].commit","pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","soul":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/SOUL.md"},"messages":["no attributed episodes in the experience snapshot"],"moduleName":"agent_m","name":{"en":"Mu (Metrics)","ru":"Мю (Метрики)"},"ordinal":13,"sha256":"0aac5e911f0cf60e0912acc755c63777ae91da62510a806363ff99f9c3599cde","skills":[],"specPath":"specs/agents/m.t27","summary":{"en":"Metrics / Telemetry. Metrics are the continuous stream of measurements.","ru":"Метрики / телеметрия. Метрики — непрерывный поток измерений."},"tools":[],"typecheckOk":true,"witness":"spec-only"},{"crons":[],"discarded":0,"experience":{"episodes":0,"files":[],"first":null,"last":null,"lastTask":null,"lessons":[],"outcomes":{}},"fields":{"AGENTS_DOC":"AGENTS.md","ALPHABET":"docs/agents/AGENTS_ALPHABET.md","ARCHETYPE":"Fish - offspring, multiplication","CLARA_ROLE":"","DOMAIN":"Numeric / GoldenFloat","ENABLED":true,"ENTRY_INVARIANT":"GF family is defined (GF4, GF8, GF12, GF16, GF20, GF24, GF32)","EXIT_INVARIANT":"phi identity validated, all numeric tests pass","EXPERIENCE_LOG":".trinity/experience/","ID":"t27/N","KEY_FILES":["t27/specs/numeric/","docs/NUMERIC-STANDARD-001.md"],"KIND":"agent","LAYER":"Spiritual","LETTER":"N","LETTER_NAME":"Nu","NAME":"Nu (Numeric)","ORDINAL":14,"REGISTER":"R13","SKILLS":[],"SKILLS_NOTE":"No source binds a skill to this agent: the alphabet key files point at specs and docs, not at a skill directory, no .claude/agents file names one, and specs/OWNERS.md has no row for it.","SOUL":"SOUL.md","SUMMARY_EN":"Numeric / GoldenFloat. Numeric is the number-fish swimming toward the golden ratio.","TOOLS":[],"TOOLS_NOTE":"No source binds a tri command or MCP server to this agent: docs/agents/AGENTS_ALPHABET.md (row, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name one."},"health":"ok","id":"t27/N","inSpecCorpus":false,"letter":"N","links":{"agentsDoc":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/AGENTS.md","alphabet":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/docs/agents/AGENTS_ALPHABET.md","experienceLog":"https://github.com/gHashTag/t27/tree/95c9b61b97d487bec4279ca63eb3132da8d1721c/.trinity/experience","pinSource":"public/agents/experience.json sources[t27].commit","pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","soul":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/SOUL.md"},"messages":["no attributed episodes in the experience snapshot"],"moduleName":"agent_n","name":{"en":"Nu (Numeric)","ru":"Ню (Числа)"},"ordinal":14,"sha256":"fb4321801a722b535d3a689a94f5ecf60894cf5f448d3e33e6447866619e541b","skills":[],"specPath":"specs/agents/n.t27","summary":{"en":"Numeric / GoldenFloat. Numeric is the number-fish swimming toward the golden ratio.","ru":"Числа / GoldenFloat. Числовой слой — рыба-число, плывущая к золотому сечению."},"tools":[],"typecheckOk":true,"witness":"spec-only"},{"crons":[],"discarded":0,"experience":{"episodes":0,"files":[],"first":null,"last":null,"lastTask":null,"lessons":[],"outcomes":{}},"fields":{"AGENTS_DOC":"AGENTS.md","ALPHABET":"docs/agents/AGENTS_ALPHABET.md","ARCHETYPE":"Eye - all-seeing oko","CLARA_ROLE":"TA2: AR Composition Engine - composes ML and AR components, manages interactions","DOMAIN":"Orchestration / Phases","ENABLED":true,"ENTRY_INVARIANT":"All phases (1-6) are defined, phase transitions valid","EXIT_INVARIANT":"Orchestration completes, no stuck phases","EXPERIENCE_LOG":".trinity/experience/","ID":"t27/O","KEY_FILES":["src/tri/pipeline/","specs/ar/composition.t27"],"KIND":"agent","LAYER":"Spiritual","LETTER":"O","LETTER_NAME":"Omicron","NAME":"Omicron (Orchestration)","ORDINAL":15,"REGISTER":"R14","SKILLS":[],"SKILLS_NOTE":"No source binds a skill to this agent: the alphabet key files point at specs and docs, not at a skill directory, no .claude/agents file names one, and specs/OWNERS.md has no row for it.","SOUL":"SOUL.md","SUMMARY_EN":"Orchestration / Phases. Orchestration is the all-seeing eye of the phases.","TOOLS":[],"TOOLS_NOTE":"No source binds a tri command or MCP server to this agent: docs/agents/AGENTS_ALPHABET.md (row, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name one."},"health":"ok","id":"t27/O","inSpecCorpus":false,"letter":"O","links":{"agentsDoc":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/AGENTS.md","alphabet":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/docs/agents/AGENTS_ALPHABET.md","experienceLog":"https://github.com/gHashTag/t27/tree/95c9b61b97d487bec4279ca63eb3132da8d1721c/.trinity/experience","pinSource":"public/agents/experience.json sources[t27].commit","pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","soul":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/SOUL.md"},"messages":["no attributed episodes in the experience snapshot"],"moduleName":"agent_o","name":{"en":"Omicron (Orchestration)","ru":"Омикрон (Оркестрация)"},"ordinal":15,"sha256":"f2fd554e5cb70cea54f2daf2e3b36699175354595d333585ac56b556a95864c3","skills":[],"specPath":"specs/agents/o.t27","summary":{"en":"Orchestration / Phases. Orchestration is the all-seeing eye of the phases.","ru":"Оркестрация / фазы. Оркестрация — всевидящее око фаз."},"tools":[],"typecheckOk":true,"witness":"spec-only"},{"crons":[],"discarded":0,"experience":{"episodes":0,"files":[],"first":null,"last":null,"lastTask":null,"lessons":[],"outcomes":{}},"fields":{"AGENTS_DOC":"AGENTS.md","ALPHABET":"docs/agents/AGENTS_ALPHABET.md","ARCHETYPE":"Mouth - speech of universe","CLARA_ROLE":"TA1: AR Theoretical Foundations - provides mathematical basis for AR reasoning","DOMAIN":"Physics / SacredPhysics","ENABLED":true,"ENTRY_INVARIANT":"phi^2 + phi^-2 = 3 holds in all calculations","EXIT_INVARIANT":"Sacred constants (G, OmegaLambda, phi, tpresent) are verified","EXPERIENCE_LOG":".trinity/experience/","ID":"t27/P","KEY_FILES":["t27/specs/math/sacred_physics.t27","specs/physics/su2_chern_simons.t27"],"KIND":"agent","LAYER":"Spiritual","LETTER":"P","LETTER_NAME":"Pi","NAME":"Pi (Physics)","ORDINAL":16,"REGISTER":"R15","SKILLS":[],"SKILLS_NOTE":"No source binds a skill to this agent: the alphabet key files point at specs and docs, not at a skill directory, no .claude/agents file names one, and specs/OWNERS.md has no row for it.","SOUL":"SOUL.md","SUMMARY_EN":"Physics / SacredPhysics. Physics is nature speaking through its constants (phi, G, OmegaLambda).","TOOLS":[],"TOOLS_NOTE":"No source binds a tri command or MCP server to this agent: docs/agents/AGENTS_ALPHABET.md (row, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name one."},"health":"ok","id":"t27/P","inSpecCorpus":false,"letter":"P","links":{"agentsDoc":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/AGENTS.md","alphabet":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/docs/agents/AGENTS_ALPHABET.md","experienceLog":"https://github.com/gHashTag/t27/tree/95c9b61b97d487bec4279ca63eb3132da8d1721c/.trinity/experience","pinSource":"public/agents/experience.json sources[t27].commit","pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","soul":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/SOUL.md"},"messages":["no attributed episodes in the experience snapshot"],"moduleName":"agent_p","name":{"en":"Pi (Physics)","ru":"Пи (Физика)"},"ordinal":16,"sha256":"badf4b6c05c043017b93d89968ce4139335cac039a4de235b294050e2b916aab","skills":[],"specPath":"specs/agents/p.t27","summary":{"en":"Physics / SacredPhysics. Physics is nature speaking through its constants (phi, G, OmegaLambda).","ru":"Физика / SacredPhysics. Физика — природа, говорящая через свои константы (phi, G, OmegaLambda)."},"tools":[],"typecheckOk":true,"witness":"spec-only"},{"crons":[],"discarded":0,"experience":{"episodes":0,"files":[],"first":null,"last":null,"lastTask":null,"lessons":[],"outcomes":{}},"fields":{"AGENTS_DOC":"AGENTS.md","ALPHABET":"docs/agents/AGENTS_ALPHABET.md","ARCHETYPE":"Needle's eye - bottleneck","CLARA_ROLE":"","DOMAIN":"Queue / Scheduling","ENABLED":true,"ENTRY_INVARIANT":"Queue is not empty (work exists)","EXIT_INVARIANT":"MNL (Most-Numerous-Loss) pattern enforced, no starvation","EXPERIENCE_LOG":".trinity/experience/","ID":"t27/Q","KEY_FILES":["src/tri/dev_commands.zig"],"KIND":"agent","LAYER":"Spiritual","LETTER":"Q","LETTER_NAME":"Theta","NAME":"Theta (Queue)","ORDINAL":17,"REGISTER":"R16","SKILLS":[],"SKILLS_NOTE":"No source binds a skill to this agent: the alphabet key files point at specs and docs, not at a skill directory, no .claude/agents file names one, and specs/OWNERS.md has no row for it.","SOUL":"SOUL.md","SUMMARY_EN":"Queue / Scheduling. The queue is the needle's eye for tasks.","TOOLS":[],"TOOLS_NOTE":"No source binds a tri command or MCP server to this agent: docs/agents/AGENTS_ALPHABET.md (row, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name one."},"health":"ok","id":"t27/Q","inSpecCorpus":false,"letter":"Q","links":{"agentsDoc":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/AGENTS.md","alphabet":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/docs/agents/AGENTS_ALPHABET.md","experienceLog":"https://github.com/gHashTag/t27/tree/95c9b61b97d487bec4279ca63eb3132da8d1721c/.trinity/experience","pinSource":"public/agents/experience.json sources[t27].commit","pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","soul":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/SOUL.md"},"messages":["no attributed episodes in the experience snapshot"],"moduleName":"agent_q","name":{"en":"Theta (Queue)","ru":"Тета (Очередь)"},"ordinal":17,"sha256":"f9b41127b3546ba9fbf057a603b081d9b3bb4eab7ee46b23f5e8c804dfd801d8","skills":[],"specPath":"specs/agents/q.t27","summary":{"en":"Queue / Scheduling. The queue is the needle's eye for tasks.","ru":"Очередь / планирование. Очередь — игольное ушко для задач."},"tools":[],"typecheckOk":true,"witness":"spec-only"},{"crons":[],"discarded":0,"experience":{"episodes":0,"files":[],"first":null,"last":null,"lastTask":null,"lessons":[],"outcomes":{}},"fields":{"AGENTS_DOC":"AGENTS.md","ALPHABET":"docs/agents/AGENTS_ALPHABET.md","ARCHETYPE":"Head - beginning of execution","CLARA_ROLE":"","DOMAIN":"Runtime / Bootstrap","ENABLED":true,"ENTRY_INVARIANT":"Runtime is initialized, ABI is defined","EXIT_INVARIANT":"No memory leaks, no resource exhaustion","EXPERIENCE_LOG":".trinity/experience/","ID":"t27/R","KEY_FILES":["t27/compiler/runtime/","bootstrap/src/compiler.rs"],"KIND":"agent","LAYER":"Spiritual","LETTER":"R","LETTER_NAME":"Rho","NAME":"Rho (Runtime)","ORDINAL":18,"REGISTER":"R17","SKILLS":[],"SKILLS_NOTE":"No source binds a skill to this agent: the alphabet key files point at specs and docs, not at a skill directory, no .claude/agents file names one, and specs/OWNERS.md has no row for it.","SOUL":"SOUL.md","SUMMARY_EN":"Runtime / Bootstrap. Runtime is the head of the system during execution.","TOOLS":[],"TOOLS_NOTE":"No source binds a tri command or MCP server to this agent: docs/agents/AGENTS_ALPHABET.md (row, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name one."},"health":"ok","id":"t27/R","inSpecCorpus":false,"letter":"R","links":{"agentsDoc":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/AGENTS.md","alphabet":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/docs/agents/AGENTS_ALPHABET.md","experienceLog":"https://github.com/gHashTag/t27/tree/95c9b61b97d487bec4279ca63eb3132da8d1721c/.trinity/experience","pinSource":"public/agents/experience.json sources[t27].commit","pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","soul":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/SOUL.md"},"messages":["no attributed episodes in the experience snapshot"],"moduleName":"agent_r","name":{"en":"Rho (Runtime)","ru":"Ро (Рантайм)"},"ordinal":18,"sha256":"aab3e536f0afdce1db03304ea4591988b4f284f1a456a6d93bab689ed253eee2","skills":[],"specPath":"specs/agents/r.t27","summary":{"en":"Runtime / Bootstrap. Runtime is the head of the system during execution.","ru":"Рантайм / бутстрап. Рантайм — голова системы во время исполнения."},"tools":[],"typecheckOk":true,"witness":"spec-only"},{"crons":[],"discarded":0,"experience":{"episodes":0,"files":[],"first":null,"last":null,"lastTask":null,"lessons":[],"outcomes":{}},"fields":{"AGENTS_DOC":"AGENTS.md","ALPHABET":"docs/agents/AGENTS_ALPHABET.md","ARCHETYPE":"Teeth - sharpness, flame","CLARA_ROLE":"TA1: AR Spec Standards - defines and enforces AR spec conventions","DOMAIN":"Specs / Standardization / AR Specs","ENABLED":true,"ENTRY_INVARIANT":"All specs have TDD (test/invariant/bench)","EXIT_INVARIANT":"Standards are consistent, naming rules followed","EXPERIENCE_LOG":".trinity/experience/","ID":"t27/S","KEY_FILES":["specs/","specs/ar/*.t27","docs/NUMERIC-*.md"],"KIND":"agent","LAYER":"Physical","LETTER":"S","LETTER_NAME":"Sigma","NAME":"Sigma (Specs)","ORDINAL":19,"REGISTER":"R18","SKILLS":[],"SKILLS_NOTE":"No source binds a skill to this agent: the alphabet key files point at specs and docs, not at a skill directory, no .claude/agents file names one, and specs/OWNERS.md has no row for it.","SOUL":"SOUL.md","SUMMARY_EN":"Specs / Standardization / AR Specs. Specs are the teeth of the standard that grind everything into canon.","TOOLS":[],"TOOLS_NOTE":"No source binds a tri command or MCP server to this agent. docs/agents/AGENTS.md:97 lists tri gen, tri test, tri verdict --toxic, tri bench inside a sample prevention payload attributed to S; that is an example message, not an ownership binding."},"health":"ok","id":"t27/S","inSpecCorpus":false,"letter":"S","links":{"agentsDoc":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/AGENTS.md","alphabet":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/docs/agents/AGENTS_ALPHABET.md","experienceLog":"https://github.com/gHashTag/t27/tree/95c9b61b97d487bec4279ca63eb3132da8d1721c/.trinity/experience","pinSource":"public/agents/experience.json sources[t27].commit","pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","soul":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/SOUL.md"},"messages":["no attributed episodes in the experience snapshot"],"moduleName":"agent_s","name":{"en":"Sigma (Specs)","ru":"Сигма (Спеки)"},"ordinal":19,"sha256":"7f64754295773781de8320b3fefd813ef5d1dd492b4b52f5ac56f9d9e4d01106","skills":[],"specPath":"specs/agents/s.t27","summary":{"en":"Specs / Standardization / AR Specs. Specs are the teeth of the standard that grind everything into canon.","ru":"Спеки / стандартизация / спеки AR. Спеки — зубы стандарта, перемалывающие всё в канон."},"tools":[],"typecheckOk":true,"witness":"spec-only"},{"crons":[],"discarded":0,"experience":{"episodes":0,"files":[],"first":null,"last":null,"lastTask":null,"lessons":[],"outcomes":{}},"fields":{"AGENTS_DOC":"AGENTS.md","ALPHABET":"docs/agents/AGENTS_ALPHABET.md","ARCHETYPE":"CROSS - seal, signature, truth","CLARA_ROLE":"TA2: AR Orchestrator - coordinates all AR agents for CLARA submission","DOMAIN":"Queen / Lotus Orchestrator","ENABLED":true,"ENTRY_INVARIANT":"Queen health >= 0.9, graph is loaded","EXIT_INVARIANT":"All rings are sealed, verdict is clean","EXPERIENCE_LOG":".trinity/experience/","ID":"t27/T","KEY_FILES":["t27/specs/queen/lotus.t27"],"KIND":"agent","LAYER":"Physical","LETTER":"T","LETTER_NAME":"Tau","NAME":"Tau (TRINITY Queen)","ORDINAL":20,"REGISTER":"R19","SKILLS":["t27/phi-loop","t27/tri-pipeline"],"SKILLS_NOTE":".claude/agents/trinity.md, Phase 2 PLAN: \"Identify required skills (phi-loop, tri-pipeline)\"; Phase 4 VERIFY: \"Run conformance tests via tri-pipeline\". specs/OWNERS.md lists skills/ and crons/ under T-Queen, which is catalog ownership, not a held skill.","SOUL":"SOUL.md","SUMMARY_EN":"Queen / Lotus Orchestrator. T is the queen: she puts the final seal on everything.","TOOLS":["tri/gen","tri/test"],"TOOLS_NOTE":".claude/agents/trinity.md:68 (5. Gen - Run tri gen) and :70 (7. Verify - Run tri test). No source binds tri loop or tri health to T."},"health":"ok","id":"t27/T","inSpecCorpus":false,"letter":"T","links":{"agentsDoc":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/AGENTS.md","alphabet":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/docs/agents/AGENTS_ALPHABET.md","experienceLog":"https://github.com/gHashTag/t27/tree/95c9b61b97d487bec4279ca63eb3132da8d1721c/.trinity/experience","pinSource":"public/agents/experience.json sources[t27].commit","pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","soul":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/SOUL.md"},"messages":["no attributed episodes in the experience snapshot"],"moduleName":"agent_t","name":{"en":"Tau (TRINITY Queen)","ru":"Тау (Королева TRINITY)"},"ordinal":20,"sha256":"a5a64df42aba91e1b5bce6c0d5788e543209fa68bc06cb0fc483c84b9041bad0","skills":[{"id":"t27/phi-loop","ok":true},{"id":"t27/tri-pipeline","ok":true}],"specPath":"specs/agents/t.t27","summary":{"en":"Queen / Lotus Orchestrator. T is the queen: she puts the final seal on everything.","ru":"Королева / оркестратор Lotus. T — королева: она ставит на всём финальную печать."},"tools":[{"id":"tri/gen","ok":true},{"id":"tri/test","ok":true}],"typecheckOk":true,"witness":"spec-only"},{"crons":[],"discarded":0,"experience":{"episodes":0,"files":[],"first":null,"last":null,"lastTask":null,"lessons":[],"outcomes":{}},"fields":{"AGENTS_DOC":"AGENTS.md","ALPHABET":"docs/agents/AGENTS_ALPHABET.md","ARCHETYPE":"Fork - branching","CLARA_ROLE":"","DOMAIN":"Universe Levels / Domains","ENABLED":true,"ENTRY_INVARIANT":"Domain boundaries are defined","EXIT_INVARIANT":"No circular dependencies, domains are orthogonal","EXPERIENCE_LOG":".trinity/experience/","ID":"t27/U","KEY_FILES":["t27/domains/"],"KIND":"agent","LAYER":"Physical","LETTER":"U","LETTER_NAME":"Upsilon","NAME":"Upsilon (Universe)","ORDINAL":21,"REGISTER":"R20","SKILLS":[],"SKILLS_NOTE":"No source binds a skill to this agent: the alphabet key files point at specs and docs, not at a skill directory, no .claude/agents file names one, and specs/OWNERS.md has no row for it.","SOUL":"SOUL.md","SUMMARY_EN":"Universe Levels / Domains. Universe levels are the branching of domains.","TOOLS":[],"TOOLS_NOTE":"No source binds a tri command or MCP server to this agent: docs/agents/AGENTS_ALPHABET.md (row, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name one."},"health":"ok","id":"t27/U","inSpecCorpus":false,"letter":"U","links":{"agentsDoc":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/AGENTS.md","alphabet":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/docs/agents/AGENTS_ALPHABET.md","experienceLog":"https://github.com/gHashTag/t27/tree/95c9b61b97d487bec4279ca63eb3132da8d1721c/.trinity/experience","pinSource":"public/agents/experience.json sources[t27].commit","pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","soul":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/SOUL.md"},"messages":["no attributed episodes in the experience snapshot"],"moduleName":"agent_u","name":{"en":"Upsilon (Universe)","ru":"Ипсилон (Вселенная)"},"ordinal":21,"sha256":"8e96c0001588aee91e7dc5aca1d68be9580b7834c595a78c7d62bfec83868b4b","skills":[],"specPath":"specs/agents/u.t27","summary":{"en":"Universe Levels / Domains. Universe levels are the branching of domains.","ru":"Уровни вселенной / домены. Уровни вселенной — ветвление доменов."},"tools":[],"typecheckOk":true,"witness":"spec-only"},{"crons":[],"discarded":0,"experience":{"episodes":0,"files":[],"first":null,"last":null,"lastTask":null,"lessons":[],"outcomes":{}},"fields":{"AGENTS_DOC":"AGENTS.md","ALPHABET":"docs/agents/AGENTS_ALPHABET.md","ARCHETYPE":"Hook - connection, conjunction","CLARA_ROLE":"TA2: AR Validation & Proof - validates AR reasoning, generates proofs","DOMAIN":"Verdict / Bench / AR Validation","ENABLED":true,"ENTRY_INVARIANT":"Verdict engine is ready, toxic thresholds defined","EXIT_INVARIANT":"Toxicity is detected, proof traces are generated","EXPERIENCE_LOG":".trinity/experience/","ID":"t27/V","KEY_FILES":["src/tri/verdict.zig","specs/ar/proof_trace.t27","specs/ar/restraint.t27"],"KIND":"agent","LAYER":"Physical","LETTER":"V","LETTER_NAME":"Vau (var.)","NAME":"Vau (Verdict)","ORDINAL":22,"REGISTER":"R21","SKILLS":[],"SKILLS_NOTE":"No source binds a skill to this agent: the alphabet key files point at specs and docs, not at a skill directory, no .claude/agents file names one, and specs/OWNERS.md has no row for it.","SOUL":"SOUL.md","SUMMARY_EN":"Verdict / Bench / AR Validation. The verdict is the hook that catches the problem.","TOOLS":["tri/test","tri/verdict"],"TOOLS_NOTE":".claude/agents/agent-v-verify.md:47 (tri test) and :49 (tri verdict); docs/agents/AGENTS_ALPHABET.md:80 PHASE 5 VERDICT names tri verdict --toxic for V. Line 48 names tri verify, which is not a tri command at this commit."},"health":"ok","id":"t27/V","inSpecCorpus":false,"letter":"V","links":{"agentsDoc":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/AGENTS.md","alphabet":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/docs/agents/AGENTS_ALPHABET.md","experienceLog":"https://github.com/gHashTag/t27/tree/95c9b61b97d487bec4279ca63eb3132da8d1721c/.trinity/experience","pinSource":"public/agents/experience.json sources[t27].commit","pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","soul":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/SOUL.md"},"messages":["no attributed episodes in the experience snapshot"],"moduleName":"agent_v","name":{"en":"Vau (Verdict)","ru":"Вау (Вердикт)"},"ordinal":22,"sha256":"fcce2147f2fced23acc8d32364023ead496c229862f1f03ae9f5fc6c7c384aeb","skills":[],"specPath":"specs/agents/v.t27","summary":{"en":"Verdict / Bench / AR Validation. The verdict is the hook that catches the problem.","ru":"Вердикт / бенч / валидация AR. Вердикт — крюк, который ловит проблему."},"tools":[{"id":"tri/test","ok":true},{"id":"tri/verdict","ok":true}],"typecheckOk":true,"witness":"spec-only"},{"crons":[],"discarded":0,"experience":{"episodes":0,"files":[],"first":null,"last":null,"lastTask":null,"lessons":[],"outcomes":{}},"fields":{"AGENTS_DOC":"AGENTS.md","ALPHABET":"docs/agents/AGENTS_ALPHABET.md","ARCHETYPE":"Double hook - double seal","CLARA_ROLE":"","DOMAIN":"Workflow / tri cell","ENABLED":true,"ENTRY_INVARIANT":"Cell is sealed, hash is computed","EXIT_INVARIANT":"Hash is verified, commit is signed","EXPERIENCE_LOG":".trinity/experience/","ID":"t27/W","KEY_FILES":["src/tri/cell.zig"],"KIND":"agent","LAYER":"Physical","LETTER":"W","LETTER_NAME":"Double-Vav","NAME":"Double-Vav (Workflow)","ORDINAL":23,"REGISTER":"R22","SKILLS":[],"SKILLS_NOTE":"No source binds a skill to this agent: the alphabet key files point at specs and docs, not at a skill directory, no .claude/agents file names one, and specs/OWNERS.md has no row for it.","SOUL":"SOUL.md","SUMMARY_EN":"Workflow / tri cell. Workflow and tri cell are the double hash-seal.","TOOLS":["tri/cell"],"TOOLS_NOTE":"docs/agents/AGENTS_ALPHABET.md:144: agent W domain Workflow / tri cell, key file src/tri/cell.zig; PHASE 6 EVOLVE: W seals tri-cell commit (hash seal)."},"health":"ok","id":"t27/W","inSpecCorpus":false,"letter":"W","links":{"agentsDoc":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/AGENTS.md","alphabet":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/docs/agents/AGENTS_ALPHABET.md","experienceLog":"https://github.com/gHashTag/t27/tree/95c9b61b97d487bec4279ca63eb3132da8d1721c/.trinity/experience","pinSource":"public/agents/experience.json sources[t27].commit","pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","soul":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/SOUL.md"},"messages":["no attributed episodes in the experience snapshot"],"moduleName":"agent_w","name":{"en":"Double-Vav (Workflow)","ru":"Двойной Вав (Рабочий процесс)"},"ordinal":23,"sha256":"cc5426dfba21dcb6c38e978fd04c01a0ca38b62b942032668531508d454f5aeb","skills":[],"specPath":"specs/agents/w.t27","summary":{"en":"Workflow / tri cell. Workflow and tri cell are the double hash-seal.","ru":"Рабочий процесс / tri cell. Рабочий процесс и tri cell — двойная хеш-печать."},"tools":[{"id":"tri/cell","ok":true}],"typecheckOk":true,"witness":"spec-only"},{"crons":[],"discarded":0,"experience":{"episodes":0,"files":[],"first":null,"last":null,"lastTask":null,"lessons":[],"outcomes":{}},"fields":{"AGENTS_DOC":"AGENTS.md","ALPHABET":"docs/agents/AGENTS_ALPHABET.md","ARCHETYPE":"Intersection - point of exchange","CLARA_ROLE":"","DOMAIN":"External Bindings / Interop","ENABLED":true,"ENTRY_INVARIANT":"Bindings are documented","EXIT_INVARIANT":"Interop tests pass, external APIs are current","EXPERIENCE_LOG":".trinity/experience/","ID":"t27/X","KEY_FILES":["bindings/"],"KIND":"agent","LAYER":"Physical","LETTER":"X","LETTER_NAME":"Chi","NAME":"Chi (External)","ORDINAL":24,"REGISTER":"R23","SKILLS":[],"SKILLS_NOTE":"No source binds a skill to this agent: the alphabet key files point at specs and docs, not at a skill directory, no .claude/agents file names one, and specs/OWNERS.md has no row for it.","SOUL":"SOUL.md","SUMMARY_EN":"External Bindings / Interop. External bindings are the crossroads of Trinity and external systems.","TOOLS":[],"TOOLS_NOTE":"No source binds a tri command or MCP server to this agent: docs/agents/AGENTS_ALPHABET.md (row, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name one."},"health":"ok","id":"t27/X","inSpecCorpus":false,"letter":"X","links":{"agentsDoc":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/AGENTS.md","alphabet":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/docs/agents/AGENTS_ALPHABET.md","experienceLog":"https://github.com/gHashTag/t27/tree/95c9b61b97d487bec4279ca63eb3132da8d1721c/.trinity/experience","pinSource":"public/agents/experience.json sources[t27].commit","pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","soul":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/SOUL.md"},"messages":["no attributed episodes in the experience snapshot"],"moduleName":"agent_x","name":{"en":"Chi (External)","ru":"Хи (Внешнее)"},"ordinal":24,"sha256":"0766c4ee0c06be78156aa2d0d148549b21da87c3db232aeab3e64d28df611ff5","skills":[],"specPath":"specs/agents/x.t27","summary":{"en":"External Bindings / Interop. External bindings are the crossroads of Trinity and external systems.","ru":"Внешние привязки / интероперабельность. Внешние привязки — перекрёсток Trinity и внешних систем."},"tools":[],"typecheckOk":true,"witness":"spec-only"},{"crons":[],"discarded":0,"experience":{"episodes":0,"files":[],"first":null,"last":null,"lastTask":null,"lessons":[],"outcomes":{}},"fields":{"AGENTS_DOC":"AGENTS.md","ALPHABET":"docs/agents/AGENTS_ALPHABET.md","ARCHETYPE":"Merging paths - evolutionary selection","CLARA_ROLE":"","DOMAIN":"Yield / DePIN / Fitness","ENABLED":true,"ENTRY_INVARIANT":"DePIN nodes are defined","EXIT_INVARIANT":"Fitness score > 0.8, yield is optimized","EXPERIENCE_LOG":".trinity/experience/","ID":"t27/Y","KEY_FILES":["deploy/contracts/"],"KIND":"agent","LAYER":"Physical","LETTER":"Y","LETTER_NAME":"Psi","NAME":"Psi (Yield/DePIN)","ORDINAL":25,"REGISTER":"R24","SKILLS":[],"SKILLS_NOTE":"No source binds a skill to this agent: the alphabet key files point at specs and docs, not at a skill directory, no .claude/agents file names one, and specs/OWNERS.md has no row for it.","SOUL":"SOUL.md","SUMMARY_EN":"Yield / DePIN / Fitness. Yield and DePIN are the evolutionary crossroad.","TOOLS":[],"TOOLS_NOTE":"No source binds a tri command or MCP server to this agent: docs/agents/AGENTS_ALPHABET.md (row, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name one."},"health":"ok","id":"t27/Y","inSpecCorpus":false,"letter":"Y","links":{"agentsDoc":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/AGENTS.md","alphabet":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/docs/agents/AGENTS_ALPHABET.md","experienceLog":"https://github.com/gHashTag/t27/tree/95c9b61b97d487bec4279ca63eb3132da8d1721c/.trinity/experience","pinSource":"public/agents/experience.json sources[t27].commit","pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","soul":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/SOUL.md"},"messages":["no attributed episodes in the experience snapshot"],"moduleName":"agent_y","name":{"en":"Psi (Yield/DePIN)","ru":"Пси (Доход/DePIN)"},"ordinal":25,"sha256":"2b7ba398549aa79d07e55e175328b816600fbddbfeb000ff1ce425ec629b3cf4","skills":[],"specPath":"specs/agents/y.t27","summary":{"en":"Yield / DePIN / Fitness. Yield and DePIN are the evolutionary crossroad.","ru":"Доход / DePIN / приспособленность. Доход и DePIN — эволюционный перекрёсток."},"tools":[],"typecheckOk":true,"witness":"spec-only"},{"crons":[],"discarded":0,"experience":{"episodes":0,"files":[],"first":null,"last":null,"lastTask":null,"lessons":[],"outcomes":{}},"fields":{"AGENTS_DOC":"AGENTS.md","ALPHABET":"docs/agents/AGENTS_ALPHABET.md","ARCHETYPE":"Sword - cutting edge, point","CLARA_ROLE":"","DOMAIN":"Zero-Touch UX / Docs","ENABLED":true,"ENTRY_INVARIANT":"All docs are in English, ASCII-only","EXIT_INVARIANT":"DX score > 4/5, all docs are current","EXPERIENCE_LOG":".trinity/experience/","ID":"t27/Z","KEY_FILES":["docs/"],"KIND":"agent","LAYER":"Physical","LETTER":"Z","LETTER_NAME":"Zeta","NAME":"Zeta (Zero-Touch)","ORDINAL":26,"REGISTER":"R25","SKILLS":[],"SKILLS_NOTE":"No source binds a skill to this agent: the alphabet key files point at specs and docs, not at a skill directory, no .claude/agents file names one, and specs/OWNERS.md has no row for it.","SOUL":"SOUL.md","SUMMARY_EN":"Zero-Touch UX / Docs. Zero-Touch is the edge of UX and the final polish.","TOOLS":[],"TOOLS_NOTE":"No source binds a tri command or MCP server to this agent: docs/agents/AGENTS_ALPHABET.md (row, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name one."},"health":"ok","id":"t27/Z","inSpecCorpus":false,"letter":"Z","links":{"agentsDoc":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/AGENTS.md","alphabet":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/docs/agents/AGENTS_ALPHABET.md","experienceLog":"https://github.com/gHashTag/t27/tree/95c9b61b97d487bec4279ca63eb3132da8d1721c/.trinity/experience","pinSource":"public/agents/experience.json sources[t27].commit","pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","soul":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/SOUL.md"},"messages":["no attributed episodes in the experience snapshot"],"moduleName":"agent_z","name":{"en":"Zeta (Zero-Touch)","ru":"Дзета (Zero-Touch)"},"ordinal":26,"sha256":"b4f898411bc6cccc09a47732cf878e2c8e66cfba98f2cab064cca6e54895c489","skills":[],"specPath":"specs/agents/z.t27","summary":{"en":"Zero-Touch UX / Docs. Zero-Touch is the edge of UX and the final polish.","ru":"Zero-Touch UX / документация. Zero-Touch — край UX и финальная полировка."},"tools":[],"typecheckOk":true,"witness":"spec-only"},{"crons":[],"discarded":0,"experience":{"episodes":0,"files":[],"first":null,"last":null,"lastTask":null,"lessons":[],"outcomes":{}},"fields":{"AGENTS_DOC":"AGENTS.md","ALPHABET":"docs/agents/AGENTS_ALPHABET.md","ARCHETYPE":"Egyptian cross - \"sacred gift\"","CLARA_ROLE":"","DOMAIN":"Security / Reserve","ENABLED":false,"ENTRY_INVARIANT":"Security policy exists","EXIT_INVARIANT":"AAIF compliance ready, no vulnerabilities","EXPERIENCE_LOG":".trinity/experience/","ID":"t27/TI","KEY_FILES":[],"KIND":"agent","LAYER":"Physical","LETTER":"TI","LETTER_NAME":"Ti","NAME":"Ti (Security)","ORDINAL":27,"REGISTER":"R26","SKILLS":[],"SKILLS_NOTE":"No source binds a skill to this agent: the alphabet key files point at specs and docs, not at a skill directory, no .claude/agents file names one, and specs/OWNERS.md has no row for it.","SOUL":"SOUL.md","SUMMARY_EN":"Security / Reserve. Security and AAIF are what Trinity gifts the world; the seat is reserved (key files: future).","TOOLS":[],"TOOLS_NOTE":"No source binds a tri command or MCP server to this agent: docs/agents/AGENTS_ALPHABET.md (row, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name one."},"health":"ok","id":"t27/TI","inSpecCorpus":false,"letter":"TI","links":{"agentsDoc":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/AGENTS.md","alphabet":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/docs/agents/AGENTS_ALPHABET.md","experienceLog":"https://github.com/gHashTag/t27/tree/95c9b61b97d487bec4279ca63eb3132da8d1721c/.trinity/experience","pinSource":"public/agents/experience.json sources[t27].commit","pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","soul":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/SOUL.md"},"messages":["no attributed episodes in the experience snapshot"],"moduleName":"agent_ti","name":{"en":"Ti (Security)","ru":"Ти (Безопасность)"},"ordinal":27,"sha256":"8f93c36e4a69d1c698d8f30be012f20565fb849338a44d5418782721c13ea066","skills":[],"specPath":"specs/agents/ti.t27","summary":{"en":"Security / Reserve. Security and AAIF are what Trinity gifts the world; the seat is reserved (key files: future).","ru":"Безопасность / резерв. Безопасность и AAIF — то, что Trinity дарит миру; место зарезервировано (ключевые файлы: в будущем)."},"tools":[],"typecheckOk":true,"witness":"spec-only"}],"compilerWasmSha256":"4d9c0447b5ca288790ab03d3dffc2dda629ed47af9d6731a105fc923aea0aee4","contentSha256":"da2229f239ce0a786420caad3caed90c925d44e54a6479478f1cad57932dce0c","counts":{"byLayer":{"Archetypal":9,"Physical":9,"Spiritual":9},"enabled":26,"episodesAttributed":0,"episodesTotal":386,"episodesUnattributed":386,"specOnly":27,"specPlusExperience":0,"specs":27,"typecheckOk":27,"withClaraRole":8,"withCrons":0,"withExperience":0,"withSkills":1,"withTools":5},"experienceSnapshot":{"attribution":{"fields":["agent_letter","letter","agent","agent_id","agents","owner"],"letters":["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","TI"],"rule":"A letter is assigned only from an agent field that is one letter A-Z, \"ti\"/\"27th\", \"t27/\", or \"agent-...\"; everything else is unattributed. See scripts/sync-agents-experience.mjs and specs/agents/README.md."},"counts":{"agentsWithEpisodes":0,"attributed":0,"episodes":386,"unattributed":386,"unreadableFiles":56},"generatedAt":"2026-09-09T17:03:41.298Z","sources":[{"commit":"da84d38795aa97f9170bb670f04a328032aa6ffe","episodes":383,"files":440,"repo":"trinity","unreadable":56},{"commit":"95c9b61b97d487bec4279ca63eb3132da8d1721c","episodes":3,"files":2,"repo":"t27","unreadable":0}]},"generatedAt":"2026-09-09T17:14:43.237Z","i18n":[{"bundle":"apps/website/i18n/agents.ru.json","coverage":{"n":27,"total":27},"enabled":true,"fields":["SUMMARY","NAME"],"locale":"ru","missing":[],"scope":["specs/skills","specs/crons","specs/agents","specs/functions","specs/tools"],"sha256":"c8871fb4ccdef8fc3cc2937af5db0e307ab0b62f6a03ece9f4512851ffd64f04","spec":"specs/i18n/agents-ru.t27"}],"ladder":{"agents":27,"crons":33,"functions":28,"skills":26,"specs":760,"tools":62},"pin":{"ref":"95c9b61b97d487bec4279ca63eb3132da8d1721c","source":"public/agents/experience.json sources[t27].commit"},"version":1} diff --git a/apps/website/public/crons/spec-crons.json b/apps/website/public/crons/spec-crons.json index e568500b7c..f8abbb6ca0 100644 --- a/apps/website/public/crons/spec-crons.json +++ b/apps/website/public/crons/spec-crons.json @@ -1 +1 @@ -{"codeOnly":[],"compilerWasmSha256":"4d9c0447b5ca288790ab03d3dffc2dda629ed47af9d6731a105fc923aea0aee4","contentSha256":"87c29c0f2e638b58c2ed7303ceaa0b4885eef5214d65486c02902a1bd8e7dc32","counts":{"byHost":{"github-actions":12,"inngest":6,"railway-cron":1,"timer":14},"codeOnly":0,"specOnly":0,"specPlusCode":33,"specs":33,"typecheckOk":33,"withRuns":0},"crons":[{"code":{"health":"warn","kind":"github-actions","repoPrivate":true,"sourceUrl":"https://github.com/gHashTag/999-multibots-telegraf/blob/3f01d449e5a04d37f6ff4d76d5572f499c201789/.github/workflows/ci.yml#L10","where":{"file":".github/workflows/ci.yml","host":"github-actions","line":10,"service":null}},"control":"code-only","discarded":0,"fields":{"CONTROL":"code-only","ENABLED":true,"HOST":"github-actions","ID":"github-actions/999-multibots-telegraf/ci","KIND":"cron","NAME":"CI/CD Pipeline","NOTE":"GitHub Actions on this repository have not run since 2026-06-02 (billing); the schedule stands in the file but does not fire.","ON_FAILURE":"log","REPO":"999-multibots-telegraf","RUNS":[],"RUNS_NOTE":"no skill invocation found in source","SCHEDULE":"0 2 * * *","SERVICE":".github/workflows/ci.yml","SUMMARY_EN":"Runs the whole build, type-check and test pipeline once a day so a dependency that rots without a push still gets caught.","TZ":"UTC"},"health":"ok","id":"github-actions/999-multibots-telegraf/ci","inSpecCorpus":false,"messages":[],"moduleName":"cron_999_multibots_telegraf_ci","name":{"en":"CI/CD Pipeline"},"runNow":{"kind":"link","url":"https://github.com/gHashTag/999-multibots-telegraf/actions/workflows/ci.yml","via":"github-actions"},"runs":[],"runsResolved":[],"sha256":"8aea8946d266dd32d1455a5ae70c1b8a3b79f0ee4ac7889f68f14d0918094484","specPath":"specs/crons/999-multibots-telegraf-ci.t27","summary":{"en":"Runs the whole build, type-check and test pipeline once a day so a dependency that rots without a push still gets caught.","ru":"Раз в день прогоняет весь конвейер сборки, проверки типов и тестов, чтобы зависимость, гниющая без пуша, всё равно была поймана."},"typecheckOk":true,"witness":"spec+code"},{"code":{"health":"warn","kind":"github-actions","repoPrivate":true,"sourceUrl":"https://github.com/gHashTag/999-multibots-telegraf/blob/3f01d449e5a04d37f6ff4d76d5572f499c201789/.github/workflows/security.yml#L10","where":{"file":".github/workflows/security.yml","host":"github-actions","line":10,"service":null}},"control":"code-only","discarded":0,"fields":{"CONTROL":"code-only","ENABLED":true,"HOST":"github-actions","ID":"github-actions/999-multibots-telegraf/security","KIND":"cron","NAME":"Security Checks","NOTE":"GitHub Actions on this repository have not run since 2026-06-02 (billing); the schedule stands in the file but does not fire.","ON_FAILURE":"log","REPO":"999-multibots-telegraf","RUNS":[],"RUNS_NOTE":"no skill invocation found in source","SCHEDULE":"0 3 * * 0","SERVICE":".github/workflows/security.yml","SUMMARY_EN":"Runs the weekly security sweep: secret detection over the full history, dependency audit and code scanning.","TZ":"UTC"},"health":"ok","id":"github-actions/999-multibots-telegraf/security","inSpecCorpus":false,"messages":[],"moduleName":"cron_999_multibots_telegraf_security","name":{"en":"Security Checks"},"runNow":{"kind":"link","url":"https://github.com/gHashTag/999-multibots-telegraf/actions/workflows/security.yml","via":"github-actions"},"runs":[],"runsResolved":[],"sha256":"85fd8a7d31b783c57da0443c9ca2156d6d786867bea9dfee682f6208f876e91c","specPath":"specs/crons/999-multibots-telegraf-security.t27","summary":{"en":"Runs the weekly security sweep: secret detection over the full history, dependency audit and code scanning.","ru":"Еженедельная проверка безопасности: поиск секретов по всей истории, аудит зависимостей и сканирование кода."},"typecheckOk":true,"witness":"spec+code"},{"code":{"health":"ok","kind":"github-actions","repoPrivate":false,"sourceUrl":"https://github.com/gHashTag/t27/blob/e804cd062af9bd4424a8579ea54b1f21381580de/.github/workflows/formal-mutation.yml#L25","where":{"file":".github/workflows/formal-mutation.yml","host":"github-actions","line":25,"service":null}},"control":"github-actions-dispatch","discarded":0,"fields":{"CONTROL":"github-actions-dispatch","ENABLED":true,"HOST":"github-actions","ID":"github-actions/t27/formal-mutation","KIND":"cron","NAME":"formal-mutation","NOTE":"Weekly rather than per-push because a full run costs about thirty yosys invocations.","ON_FAILURE":"log","REPO":"t27","RUNS":[],"RUNS_NOTE":"no skill invocation found in source","SCHEDULE":"0 5 * * 1","SERVICE":".github/workflows/formal-mutation.yml","SUMMARY_EN":"Proves the formal gates actually bite by mutating the generated RTL once a week and requiring each gate to go red for its own mutation.","TZ":"UTC"},"health":"ok","id":"github-actions/t27/formal-mutation","inSpecCorpus":false,"messages":[],"moduleName":"cron_t27_formal_mutation","name":{"en":"formal-mutation"},"runNow":{"kind":"link","url":"https://github.com/gHashTag/t27/actions/workflows/formal-mutation.yml","via":"github-actions"},"runs":[],"runsResolved":[],"sha256":"f23f8e3b111bc55516c6e1860493acf41325dd40e6bf1b39842ba6c0dd906fbe","specPath":"specs/crons/t27-formal-mutation.t27","summary":{"en":"Proves the formal gates actually bite by mutating the generated RTL once a week and requiring each gate to go red for its own mutation.","ru":"Раз в неделю мутирует сгенерированный RTL и требует, чтобы каждый формальный гейт покраснел на своей мутации — доказательство, что гейты кусаются."},"typecheckOk":true,"witness":"spec+code"},{"code":{"health":"ok","kind":"github-actions","repoPrivate":false,"sourceUrl":"https://github.com/gHashTag/t27/blob/e804cd062af9bd4424a8579ea54b1f21381580de/.github/workflows/pr-dashboard.yml#L6","where":{"file":".github/workflows/pr-dashboard.yml","host":"github-actions","line":6,"service":null}},"control":"github-actions-dispatch","discarded":0,"fields":{"CONTROL":"github-actions-dispatch","ENABLED":true,"HOST":"github-actions","ID":"github-actions/t27/pr-dashboard","KIND":"cron","NAME":"PR Dashboard","ON_FAILURE":"log","REPO":"t27","RUNS":[],"RUNS_NOTE":"no skill invocation found in source","SCHEDULE":"0 * * * *","SERVICE":".github/workflows/pr-dashboard.yml","SUMMARY_EN":"Rebuilds the pull-request dashboard every hour from the current state of the open pull requests.","TZ":"UTC"},"health":"ok","id":"github-actions/t27/pr-dashboard","inSpecCorpus":false,"messages":[],"moduleName":"cron_t27_pr_dashboard","name":{"en":"PR Dashboard"},"runNow":{"kind":"link","url":"https://github.com/gHashTag/t27/actions/workflows/pr-dashboard.yml","via":"github-actions"},"runs":[],"runsResolved":[],"sha256":"a16c8b2d502ca53955b1e51f3816d111ac056e5fe80904edbbc52fc269e45a92","specPath":"specs/crons/t27-pr-dashboard.t27","summary":{"en":"Rebuilds the pull-request dashboard every hour from the current state of the open pull requests.","ru":"Каждый час пересобирает панель pull request из текущего состояния открытых PR."},"typecheckOk":true,"witness":"spec+code"},{"code":{"health":"ok","kind":"github-actions","repoPrivate":false,"sourceUrl":"https://github.com/gHashTag/trinity/blob/cdc1d68d697fca070d9ad0f2d36aa4074de140f4/.github/workflows/agent-cron-cleanup.yml#L4","where":{"file":".github/workflows/agent-cron-cleanup.yml","host":"github-actions","line":4,"service":null}},"control":"github-actions-dispatch","discarded":0,"fields":{"CONTROL":"github-actions-dispatch","ENABLED":true,"HOST":"github-actions","ID":"github-actions/trinity/agent-cron-cleanup","KIND":"cron","NAME":"Trinity Agent Cron Cleanup","ON_FAILURE":"log","REPO":"trinity","RUNS":[],"RUNS_NOTE":"no skill invocation found in source","SCHEDULE":"0 */2 * * *","SERVICE":".github/workflows/agent-cron-cleanup.yml","SUMMARY_EN":"Finds agent deployments that got stuck and kills them, every two hours.","TZ":"UTC"},"health":"ok","id":"github-actions/trinity/agent-cron-cleanup","inSpecCorpus":false,"messages":[],"moduleName":"cron_trinity_agent_cron_cleanup","name":{"en":"Trinity Agent Cron Cleanup"},"runNow":{"kind":"link","url":"https://github.com/gHashTag/trinity/actions/workflows/agent-cron-cleanup.yml","via":"github-actions"},"runs":[],"runsResolved":[],"sha256":"f4db9e04ccb4ab2e3a1e501a15c2824109b7827d910ebf70874e5ab1ded9c6cf","specPath":"specs/crons/trinity-agent-cron-cleanup.t27","summary":{"en":"Finds agent deployments that got stuck and kills them, every two hours.","ru":"Каждые два часа находит застрявшие деплои агентов и убивает их."},"typecheckOk":true,"witness":"spec+code"},{"code":{"health":"ok","kind":"github-actions","repoPrivate":false,"sourceUrl":"https://github.com/gHashTag/trinity/blob/cdc1d68d697fca070d9ad0f2d36aa4074de140f4/.github/workflows/agent-queue-drain.yml#L4","where":{"file":".github/workflows/agent-queue-drain.yml","host":"github-actions","line":4,"service":null}},"control":"github-actions-dispatch","discarded":0,"fields":{"CONTROL":"github-actions-dispatch","ENABLED":true,"HOST":"github-actions","ID":"github-actions/trinity/agent-queue-drain","KIND":"cron","NAME":"Trinity Agent Queue Drain","ON_FAILURE":"log","REPO":"trinity","RUNS":[],"RUNS_NOTE":"dispatches agent-spawn-pool.yml for a queued issue; no named skill invocation found in source","SCHEDULE":"*/5 * * * *","SERVICE":".github/workflows/agent-queue-drain.yml","SUMMARY_EN":"Looks for queued issues and free agent slots every five minutes and starts the next agent when there is room.","TZ":"UTC"},"health":"ok","id":"github-actions/trinity/agent-queue-drain","inSpecCorpus":false,"messages":[],"moduleName":"cron_trinity_agent_queue_drain","name":{"en":"Trinity Agent Queue Drain"},"runNow":{"kind":"link","url":"https://github.com/gHashTag/trinity/actions/workflows/agent-queue-drain.yml","via":"github-actions"},"runs":[],"runsResolved":[],"sha256":"e334d5dc5fc0c176e420a131ea712b9f8d2e1c03b56a36388a683081b5defda3","specPath":"specs/crons/trinity-agent-queue-drain.t27","summary":{"en":"Looks for queued issues and free agent slots every five minutes and starts the next agent when there is room.","ru":"Каждые пять минут ищет задачи в очереди и свободные слоты агентов и запускает следующего агента, когда есть место."},"typecheckOk":true,"witness":"spec+code"},{"code":{"health":"ok","kind":"github-actions","repoPrivate":false,"sourceUrl":"https://github.com/gHashTag/trinity/blob/cdc1d68d697fca070d9ad0f2d36aa4074de140f4/.github/workflows/brain-ci.yml#L11","where":{"file":".github/workflows/brain-ci.yml","host":"github-actions","line":11,"service":null}},"control":"github-actions-dispatch","discarded":0,"fields":{"CONTROL":"github-actions-dispatch","ENABLED":true,"HOST":"github-actions","ID":"github-actions/trinity/brain-ci","KIND":"cron","NAME":"S³AI Brain CI — \"Functional MRI\" Gate","ON_FAILURE":"log","REPO":"trinity","RUNS":[],"RUNS_NOTE":"no skill invocation found in source","SCHEDULE":"0 0 * * 0","SERVICE":".github/workflows/brain-ci.yml","SUMMARY_EN":"Runs the weekly brain stress test, the long version of the health gate that every commit already gets.","TZ":"UTC"},"health":"ok","id":"github-actions/trinity/brain-ci","inSpecCorpus":false,"messages":[],"moduleName":"cron_trinity_brain_ci","name":{"en":"S³AI Brain CI — \"Functional MRI\" Gate"},"runNow":{"kind":"link","url":"https://github.com/gHashTag/trinity/actions/workflows/brain-ci.yml","via":"github-actions"},"runs":[],"runsResolved":[],"sha256":"c8cd980319751e2b53501dc645f1beb6980bdbf77adbb98a158a12be441d957e","specPath":"specs/crons/trinity-brain-ci.t27","summary":{"en":"Runs the weekly brain stress test, the long version of the health gate that every commit already gets.","ru":"Еженедельный стресс-тест мозга — длинная версия гейта здоровья, который получает каждый коммит."},"typecheckOk":true,"witness":"spec+code"},{"code":{"health":"ok","kind":"github-actions","repoPrivate":false,"sourceUrl":"https://github.com/gHashTag/trinity/blob/cdc1d68d697fca070d9ad0f2d36aa4074de140f4/.github/workflows/codegen.yml#L10","where":{"file":".github/workflows/codegen.yml","host":"github-actions","line":10,"service":null}},"control":"github-actions-dispatch","discarded":0,"fields":{"CONTROL":"github-actions-dispatch","ENABLED":true,"HOST":"github-actions","ID":"github-actions/trinity/codegen","KIND":"cron","NAME":"Codegen Validation","ON_FAILURE":"log","REPO":"trinity","RUNS":[],"RUNS_NOTE":"no skill invocation found in source","SCHEDULE":"0 0 * * *","SERVICE":".github/workflows/codegen.yml","SUMMARY_EN":"Validates the VIBEE code generator once a day, independently of whether anyone pushed.","TZ":"UTC"},"health":"ok","id":"github-actions/trinity/codegen","inSpecCorpus":false,"messages":[],"moduleName":"cron_trinity_codegen","name":{"en":"Codegen Validation"},"runNow":{"kind":"link","url":"https://github.com/gHashTag/trinity/actions/workflows/codegen.yml","via":"github-actions"},"runs":[],"runsResolved":[],"sha256":"d71a2dd240cabe9e1e5d667259d245209ec4532632c30328971e84ec4cbc4bd6","specPath":"specs/crons/trinity-codegen.t27","summary":{"en":"Validates the VIBEE code generator once a day, independently of whether anyone pushed.","ru":"Раз в день проверяет генератор кода VIBEE независимо от того, пушил ли кто-нибудь."},"typecheckOk":true,"witness":"spec+code"},{"code":{"health":"ok","kind":"github-actions","repoPrivate":false,"sourceUrl":"https://github.com/gHashTag/trinity/blob/cdc1d68d697fca070d9ad0f2d36aa4074de140f4/.github/workflows/discover-callers.yml#L16","where":{"file":".github/workflows/discover-callers.yml","host":"github-actions","line":16,"service":null}},"control":"github-actions-dispatch","discarded":0,"fields":{"CONTROL":"github-actions-dispatch","ENABLED":true,"HOST":"github-actions","ID":"github-actions/trinity/discover-callers","KIND":"cron","NAME":"Discover RTL check callers","ON_FAILURE":"log","REPO":"trinity","RUNS":[],"RUNS_NOTE":"no skill invocation found in source","SCHEDULE":"41 5 * * *","SERVICE":".github/workflows/discover-callers.yml","SUMMARY_EN":"Reads GitHub for repositories that run the RTL check, so the gallery counts its own users instead of being hand-written.","TZ":"UTC"},"health":"ok","id":"github-actions/trinity/discover-callers","inSpecCorpus":false,"messages":[],"moduleName":"cron_trinity_discover_callers","name":{"en":"Discover RTL check callers"},"runNow":{"kind":"link","url":"https://github.com/gHashTag/trinity/actions/workflows/discover-callers.yml","via":"github-actions"},"runs":[],"runsResolved":[],"sha256":"1aa5ec92373f3a0a9df24da027b852896fc303ec4eb50e4ee780d9abdea5aced","specPath":"specs/crons/trinity-discover-callers.t27","summary":{"en":"Reads GitHub for repositories that run the RTL check, so the gallery counts its own users instead of being hand-written.","ru":"Читает GitHub в поисках репозиториев, запускающих RTL-проверку, чтобы галерея считала своих пользователей сама."},"typecheckOk":true,"witness":"spec+code"},{"code":{"health":"ok","kind":"github-actions","repoPrivate":false,"sourceUrl":"https://github.com/gHashTag/trinity/blob/cdc1d68d697fca070d9ad0f2d36aa4074de140f4/.github/workflows/pages-health-check.yml#L17","where":{"file":".github/workflows/pages-health-check.yml","host":"github-actions","line":17,"service":null}},"control":"github-actions-dispatch","discarded":0,"fields":{"CONTROL":"github-actions-dispatch","ENABLED":true,"HOST":"github-actions","ID":"github-actions/trinity/pages-health-check","KIND":"cron","NAME":"Pages Health Check","NOTE":"An earlier version judged a bare status code, failed ninety-six times a day on a site that was up, and dispatched a redeploy each time.","ON_FAILURE":"log","REPO":"trinity","RUNS":[],"RUNS_NOTE":"no skill invocation found in source","SCHEDULE":"*/15 * * * *","SERVICE":".github/workflows/pages-health-check.yml","SUMMARY_EN":"Fetches the published site every fifteen minutes, follows the redirect, and redeploys only when the evidence says the deploy is what broke.","TZ":"UTC"},"health":"ok","id":"github-actions/trinity/pages-health-check","inSpecCorpus":false,"messages":[],"moduleName":"cron_trinity_pages_health_check","name":{"en":"Pages Health Check"},"runNow":{"kind":"link","url":"https://github.com/gHashTag/trinity/actions/workflows/pages-health-check.yml","via":"github-actions"},"runs":[],"runsResolved":[],"sha256":"f8199eaa1c9707bff5ba89d553a644725b072fce2f7c4c5de7dfe4b6e9620ac1","specPath":"specs/crons/trinity-pages-health-check.t27","summary":{"en":"Fetches the published site every fifteen minutes, follows the redirect, and redeploys only when the evidence says the deploy is what broke.","ru":"Каждые пятнадцать минут запрашивает опубликованный сайт, следует редиректу и передеплоит только когда свидетельства говорят, что сломан именно деплой."},"typecheckOk":true,"witness":"spec+code"},{"code":{"health":"ok","kind":"github-actions","repoPrivate":false,"sourceUrl":"https://github.com/gHashTag/trinity/blob/cdc1d68d697fca070d9ad0f2d36aa4074de140f4/.github/workflows/signal-health-self.yml#L17","where":{"file":".github/workflows/signal-health-self.yml","host":"github-actions","line":17,"service":null}},"control":"github-actions-dispatch","discarded":0,"fields":{"CONTROL":"github-actions-dispatch","ENABLED":true,"HOST":"github-actions","ID":"github-actions/trinity/signal-health-self","KIND":"cron","NAME":"Signal health (self)","ON_FAILURE":"log","REPO":"trinity","RUNS":[],"RUNS_NOTE":"no skill invocation found in source","SCHEDULE":"23 4 * * *","SERVICE":".github/workflows/signal-health-self.yml","SUMMARY_EN":"Applies the signal-health check to the repository that sells it and writes the numbers into the website data.","TZ":"UTC"},"health":"ok","id":"github-actions/trinity/signal-health-self","inSpecCorpus":false,"messages":[],"moduleName":"cron_trinity_signal_health_self","name":{"en":"Signal health (self)"},"runNow":{"kind":"link","url":"https://github.com/gHashTag/trinity/actions/workflows/signal-health-self.yml","via":"github-actions"},"runs":[],"runsResolved":[],"sha256":"b5bd1483d24af17707d8fcf03dbb6f011bc8462773423ebe9b8ee4e506a76a4e","specPath":"specs/crons/trinity-signal-health-self.t27","summary":{"en":"Applies the signal-health check to the repository that sells it and writes the numbers into the website data.","ru":"Применяет проверку signal-health к репозиторию, который её продаёт, и записывает числа в данные сайта."},"typecheckOk":true,"witness":"spec+code"},{"code":{"health":"ok","kind":"github-actions","repoPrivate":false,"sourceUrl":"https://github.com/gHashTag/trinity/blob/cdc1d68d697fca070d9ad0f2d36aa4074de140f4/.github/workflows/site-live-gate.yml#L33","where":{"file":".github/workflows/site-live-gate.yml","host":"github-actions","line":33,"service":null}},"control":"github-actions-dispatch","discarded":0,"fields":{"CONTROL":"github-actions-dispatch","ENABLED":true,"HOST":"github-actions","ID":"github-actions/trinity/site-live-gate","KIND":"cron","NAME":"Site live gate","ON_FAILURE":"log","REPO":"trinity","RUNS":[],"RUNS_NOTE":"no skill invocation found in source","SCHEDULE":"17 6 * * *","SERVICE":".github/workflows/site-live-gate.yml","SUMMARY_EN":"Compares the content-hashed entry bundle served at the apex against a build of main, so that 'deployed' means a reader can actually see it.","TZ":"UTC"},"health":"ok","id":"github-actions/trinity/site-live-gate","inSpecCorpus":false,"messages":[],"moduleName":"cron_trinity_site_live_gate","name":{"en":"Site live gate"},"runNow":{"kind":"link","url":"https://github.com/gHashTag/trinity/actions/workflows/site-live-gate.yml","via":"github-actions"},"runs":[],"runsResolved":[],"sha256":"76ed9aa7465a9ba704074563535c41d2df1fcfa2ac76059bfe2eb5e3e52c5933","specPath":"specs/crons/trinity-site-live-gate.t27","summary":{"en":"Compares the content-hashed entry bundle served at the apex against a build of main, so that 'deployed' means a reader can actually see it.","ru":"Сравнивает бандл с контент-хешем на апексе со сборкой main, чтобы «задеплоено» означало, что читатель это видит."},"typecheckOk":true,"witness":"spec+code"},{"code":{"health":"ok","kind":"inngest","repoPrivate":true,"sourceUrl":"https://github.com/gHashTag/999-multibots-telegraf/blob/3f01d449e5a04d37f6ff4d76d5572f499c201789/src/inngest_app/functions/training/checkStuckTrainings.ts#L53","where":{"file":"src/inngest_app/functions/training/checkStuckTrainings.ts","host":"railway:999-multibots-telegraf","line":53,"service":"inngest"}},"control":"inngest-dashboard","discarded":0,"fields":{"CONTROL":"inngest-dashboard","ENABLED":true,"HOST":"inngest","ID":"inngest/999-multibots-telegraf/check-stuck-trainings","KIND":"cron","NAME":"check-stuck-trainings","NOTE":"Records whose Replicate id is still a placeholder are skipped, because there is nothing on the provider to ask about.","ON_FAILURE":"log","REPO":"999-multibots-telegraf","RUNS":[],"RUNS_NOTE":"no skill invocation found in source","SCHEDULE":"*/30 * * * *","SERVICE":"src/inngest_app/functions/training/checkStuckTrainings.ts","SUMMARY_EN":"Finds model trainings still marked pending or processing past the stuck threshold and reconciles them against Replicate.","TZ":"UTC"},"health":"ok","id":"inngest/999-multibots-telegraf/check-stuck-trainings","inSpecCorpus":false,"messages":[],"moduleName":"cron_999_multibots_telegraf_check_stuck_trainings","name":{"en":"check-stuck-trainings"},"runNow":{"kind":"link","url":"https://inngestinngest-production-6a21.up.railway.app","via":"inngest"},"runs":[],"runsResolved":[],"sha256":"fb82b6e4149b8be9916c35694faaeca85b555a6e3044cd3bc35f4d836ce60e49","specPath":"specs/crons/999-multibots-telegraf-check-stuck-trainings.t27","summary":{"en":"Finds model trainings still marked pending or processing past the stuck threshold and reconciles them against Replicate.","ru":"Находит обучения моделей, застрявшие в pending или processing дольше порога, и сверяет их с Replicate."},"typecheckOk":true,"witness":"spec+code"},{"code":{"health":"ok","kind":"inngest","repoPrivate":true,"sourceUrl":"https://github.com/gHashTag/999-multibots-telegraf/blob/3f01d449e5a04d37f6ff4d76d5572f499c201789/src/inngest_app/functions/analytics/dailySalesAdvisor.ts#L56","where":{"file":"src/inngest_app/functions/analytics/dailySalesAdvisor.ts","host":"railway:999-multibots-telegraf","line":56,"service":"inngest"}},"control":"inngest-dashboard","discarded":0,"fields":{"CONTROL":"inngest-dashboard","ENABLED":true,"HOST":"inngest","ID":"inngest/999-multibots-telegraf/daily-sales-advisor","KIND":"cron","NAME":"daily-sales-advisor","NOTE":"One report per owner across all of their bots, assembled from the payments ledger rather than from a balance column.","ON_FAILURE":"log","REPO":"999-multibots-telegraf","RUNS":[],"RUNS_NOTE":"no skill invocation found in source","SCHEDULE":"0 9 * * *","SERVICE":"src/inngest_app/functions/analytics/dailySalesAdvisor.ts","SUMMARY_EN":"Builds every bot owner a morning report of yesterday's revenue, the week's costs and which services their users actually bought.","TZ":"UTC"},"health":"ok","id":"inngest/999-multibots-telegraf/daily-sales-advisor","inSpecCorpus":false,"messages":[],"moduleName":"cron_999_multibots_telegraf_daily_sales_advisor","name":{"en":"daily-sales-advisor"},"runNow":{"kind":"link","url":"https://inngestinngest-production-6a21.up.railway.app","via":"inngest"},"runs":[],"runsResolved":[],"sha256":"0e2f8e5085ed1ea2b4b2f7732c9f9de00fcd19fda8d13e1f735865aa2cd32179","specPath":"specs/crons/999-multibots-telegraf-daily-sales-advisor.t27","summary":{"en":"Builds every bot owner a morning report of yesterday's revenue, the week's costs and which services their users actually bought.","ru":"Собирает каждому владельцу бота утренний отчёт: вчерашняя выручка, расходы недели и что реально покупали пользователи."},"typecheckOk":true,"witness":"spec+code"},{"code":{"health":"ok","kind":"inngest","repoPrivate":true,"sourceUrl":"https://github.com/gHashTag/999-multibots-telegraf/blob/3f01d449e5a04d37f6ff4d76d5572f499c201789/src/inngest_app/functions/monitoring/criticalErrorMonitor.ts#L243","where":{"file":"src/inngest_app/functions/monitoring/criticalErrorMonitor.ts","host":"railway:999-multibots-telegraf","line":243,"service":"inngest"}},"control":"inngest-dashboard","discarded":0,"fields":{"CONTROL":"inngest-dashboard","ENABLED":true,"HOST":"inngest","ID":"inngest/999-multibots-telegraf/health-check","KIND":"cron","NAME":"health-check","ON_FAILURE":"log","REPO":"999-multibots-telegraf","RUNS":[],"RUNS_NOTE":"no skill invocation found in source","SCHEDULE":"*/30 * * * *","SERVICE":"src/inngest_app/functions/monitoring/criticalErrorMonitor.ts","SUMMARY_EN":"Probes the main API and the Inngest service every half hour and reports what answered.","TZ":"UTC"},"health":"ok","id":"inngest/999-multibots-telegraf/health-check","inSpecCorpus":false,"messages":[],"moduleName":"cron_999_multibots_telegraf_health_check","name":{"en":"health-check"},"runNow":{"kind":"link","url":"https://inngestinngest-production-6a21.up.railway.app","via":"inngest"},"runs":[],"runsResolved":[],"sha256":"b1bf93d0a864129e5c53a03b96cfe5d52069b5b65a7472dcef61a58cd6b87e1f","specPath":"specs/crons/999-multibots-telegraf-health-check.t27","summary":{"en":"Probes the main API and the Inngest service every half hour and reports what answered.","ru":"Каждые полчаса опрашивает основной API и сервис Inngest и сообщает, кто ответил."},"typecheckOk":true,"witness":"spec+code"},{"code":{"health":"ok","kind":"inngest","repoPrivate":true,"sourceUrl":"https://github.com/gHashTag/999-multibots-telegraf/blob/3f01d449e5a04d37f6ff4d76d5572f499c201789/src/inngest_app/functions/monitoring/logMonitor.ts#L360","where":{"file":"src/inngest_app/functions/monitoring/logMonitor.ts","host":"railway:999-multibots-telegraf","line":360,"service":"inngest"}},"control":"inngest-dashboard","discarded":0,"fields":{"CONTROL":"inngest-dashboard","ENABLED":true,"HOST":"inngest","ID":"inngest/999-multibots-telegraf/log-monitor","KIND":"cron","NAME":"log-monitor","ON_FAILURE":"log","REPO":"999-multibots-telegraf","RUNS":[],"RUNS_NOTE":"no skill invocation found in source","SCHEDULE":"0 10 * * *","SERVICE":"src/inngest_app/functions/monitoring/logMonitor.ts","SUMMARY_EN":"Reads the application logs once a day, has a model summarise the errors and warnings, and sends the digest to Telegram.","TZ":"UTC"},"health":"ok","id":"inngest/999-multibots-telegraf/log-monitor","inSpecCorpus":false,"messages":[],"moduleName":"cron_999_multibots_telegraf_log_monitor","name":{"en":"log-monitor"},"runNow":{"kind":"link","url":"https://inngestinngest-production-6a21.up.railway.app","via":"inngest"},"runs":[],"runsResolved":[],"sha256":"3f1d2105328665203dc3850fea9f0245b7a6adbe5558e255756d168478812921","specPath":"specs/crons/999-multibots-telegraf-log-monitor.t27","summary":{"en":"Reads the application logs once a day, has a model summarise the errors and warnings, and sends the digest to Telegram.","ru":"Раз в день читает логи приложения, поручает модели свести ошибки и предупреждения и отправляет дайджест в Telegram."},"typecheckOk":true,"witness":"spec+code"},{"code":{"health":"ok","kind":"inngest","repoPrivate":true,"sourceUrl":"https://github.com/gHashTag/999-multibots-telegraf/blob/3f01d449e5a04d37f6ff4d76d5572f499c201789/src/inngest_app/functions/webhookHealthGuard.ts#L218","where":{"file":"src/inngest_app/functions/webhookHealthGuard.ts","host":"railway:999-multibots-telegraf","line":218,"service":"inngest"}},"control":"inngest-dashboard","discarded":0,"fields":{"CONTROL":"inngest-dashboard","ENABLED":true,"HOST":"inngest","ID":"inngest/999-multibots-telegraf/periodic-webhook-health-check","KIND":"cron","NAME":"periodic-webhook-health-check","ON_FAILURE":"log","REPO":"999-multibots-telegraf","RUNS":[],"RUNS_NOTE":"no skill invocation found in source","SCHEDULE":"0 * * * *","SERVICE":"src/inngest_app/functions/webhookHealthGuard.ts","SUMMARY_EN":"Tests both Telegram webhook URLs every hour and sends the admin a critical alarm when neither of them answers.","TZ":"UTC"},"health":"ok","id":"inngest/999-multibots-telegraf/periodic-webhook-health-check","inSpecCorpus":false,"messages":[],"moduleName":"cron_999_multibots_telegraf_periodic_webhook_health_check","name":{"en":"periodic-webhook-health-check"},"runNow":{"kind":"link","url":"https://inngestinngest-production-6a21.up.railway.app","via":"inngest"},"runs":[],"runsResolved":[],"sha256":"a3b21a33a8a8022b527e3f46362fb6df63fb6f2e5ee642a439d88862dd4722f3","specPath":"specs/crons/999-multibots-telegraf-periodic-webhook-health-check.t27","summary":{"en":"Tests both Telegram webhook URLs every hour and sends the admin a critical alarm when neither of them answers.","ru":"Каждый час проверяет оба URL вебхука Telegram и шлёт админу критическую тревогу, когда не отвечает ни один."},"typecheckOk":true,"witness":"spec+code"},{"code":{"health":"ok","kind":"inngest","repoPrivate":true,"sourceUrl":"https://github.com/gHashTag/999-multibots-telegraf/blob/3f01d449e5a04d37f6ff4d76d5572f499c201789/src/inngest_app/functions/analytics/skillDetector.ts#L32","where":{"file":"src/inngest_app/functions/analytics/skillDetector.ts","host":"railway:999-multibots-telegraf","line":32,"service":"inngest"}},"control":"inngest-dashboard","discarded":0,"fields":{"CONTROL":"inngest-dashboard","ENABLED":true,"HOST":"inngest","ID":"inngest/999-multibots-telegraf/skill-detector","KIND":"cron","NAME":"skill-detector","ON_FAILURE":"log","REPO":"999-multibots-telegraf","RUNS":[],"RUNS_NOTE":"the \"skills\" it saves are bot prompt patterns, not Claude Code skills; no skill invocation found in source","SCHEDULE":"0 10 * * *","SERVICE":"src/inngest_app/functions/analytics/skillDetector.ts","SUMMARY_EN":"Mines successful generations for repeated model and prompt patterns once a day and saves the new ones as reusable skills.","TZ":"UTC"},"health":"ok","id":"inngest/999-multibots-telegraf/skill-detector","inSpecCorpus":false,"messages":[],"moduleName":"cron_999_multibots_telegraf_skill_detector","name":{"en":"skill-detector"},"runNow":{"kind":"link","url":"https://inngestinngest-production-6a21.up.railway.app","via":"inngest"},"runs":[],"runsResolved":[],"sha256":"d228015ce607198f53341b0b9dfc55a2cd0616e69487598d0cbabc34cc6892cf","specPath":"specs/crons/999-multibots-telegraf-skill-detector.t27","summary":{"en":"Mines successful generations for repeated model and prompt patterns once a day and saves the new ones as reusable skills.","ru":"Раз в день ищет в успешных генерациях повторяющиеся паттерны моделей и промптов и сохраняет новые как переиспользуемые навыки бота."},"typecheckOk":true,"witness":"spec+code"},{"code":{"health":"warn","kind":"railway-cron","repoPrivate":true,"sourceUrl":null,"where":{"file":null,"host":"railway:jobsearch-cron","line":null,"service":"jobsearch-cron"}},"control":"railway-dashboard","discarded":0,"fields":{"CONTROL":"railway-dashboard","ENABLED":true,"HOST":"railway-cron","ID":"railway-cron/999/jobsearch-cron","KIND":"cron","NAME":"jobsearch-cron","NOTE":"The schedule is configured in the Railway dashboard for project 999 and is not readable from the checkout; the probe below is what this catalog can verify.","ON_FAILURE":"unknown","REPO":"railway","RUNS":[],"RUNS_NOTE":"no skill invocation found in source","SCHEDULE":"","SCHEDULE_NOTE":"configured in the Railway dashboard (project 999); not readable from the checkout","SERVICE":"jobsearch-cron","SUMMARY_EN":"The scheduled job-search service of the Railway project, reachable at cron.t27.ai.","TZ":"UTC"},"health":"ok","id":"railway-cron/999/jobsearch-cron","inSpecCorpus":false,"messages":[],"moduleName":"cron_railway_jobsearch_cron","name":{"en":"jobsearch-cron"},"runNow":{"kind":"link","url":"https://railway.com/project/564d9ebd-7aa8-44fe-93ec-e0b03c87158d/service/3196472e-b885-43e0-b553-0644664e4496","via":"railway"},"runs":[],"runsResolved":[],"sha256":"8729edafdc8239d187c0f2b7d98238438d40ec439b39087e1654bb683366ec3a","specPath":"specs/crons/railway-jobsearch-cron.t27","summary":{"en":"The scheduled job-search service of the Railway project, reachable at cron.t27.ai.","ru":"Сервис поиска вакансий по расписанию в проекте Railway, доступен на cron.t27.ai."},"typecheckOk":true,"witness":"spec+code"},{"code":{"health":"ok","kind":"timer","repoPrivate":true,"sourceUrl":"https://github.com/gHashTag/999-multibots-telegraf/blob/3f01d449e5a04d37f6ff4d76d5572f499c201789/apps/vibee-editor/render/scripts/agent-autopilot.ts#L1118","where":{"file":"apps/vibee-editor/render/scripts/agent-autopilot.ts","host":"railway:vibee-render","line":1118,"service":"render"}},"control":"code-only","discarded":0,"fields":{"CONTROL":"code-only","ENABLED":true,"HOST":"timer","ID":"timer/999-multibots-telegraf/agent-autopilot-L1118","INTERVAL_MS":1800000,"KIND":"cron","NAME":"agent-autopilot-L1118","NOTE":"Daemon mode only, under --loop or AUTOPILOT_LOOP=1; AUTOPILOT_INTERVAL_MS overrides the thirty-minute period, with a one-minute floor.","ON_FAILURE":"log","REPO":"999-multibots-telegraf","RUNS":[],"RUNS_NOTE":"no skill invocation found in source","SERVICE":"apps/vibee-editor/render/scripts/agent-autopilot.ts:1118","SUMMARY_EN":"Runs one autopilot cycle -- the generation pass and then the channel tick -- and skips the tick entirely when the previous cycle is still running.","TZ":"UTC"},"health":"ok","id":"timer/999-multibots-telegraf/agent-autopilot-L1118","inSpecCorpus":false,"messages":[],"moduleName":"cron_999_multibots_telegraf_agent_autopilot_L1118","name":{"en":"agent-autopilot-L1118"},"runNow":{"kind":"disabled","reason":"timer"},"runs":[],"runsResolved":[],"sha256":"39c25a3a6c40cff4e3ad9aa098e7492803a9cc78a935e74966c4f95939c85228","specPath":"specs/crons/999-multibots-telegraf-agent-autopilot-L1118.t27","summary":{"en":"Runs one autopilot cycle -- the generation pass and then the channel tick -- and skips the tick entirely when the previous cycle is still running.","ru":"Один цикл автопилота — проход генерации и затем тик канала; тик пропускается целиком, если предыдущий цикл ещё идёт."},"typecheckOk":true,"witness":"spec+code"},{"code":{"health":"ok","kind":"timer","repoPrivate":true,"sourceUrl":"https://github.com/gHashTag/999-multibots-telegraf/blob/3f01d449e5a04d37f6ff4d76d5572f499c201789/src/services/bot-owner-billing.ts#L474","where":{"file":"src/services/bot-owner-billing.ts","host":"railway:999-multibots-telegraf","line":474,"service":"bot"}},"control":"code-only","discarded":0,"fields":{"CONTROL":"code-only","ENABLED":true,"HOST":"timer","ID":"timer/999-multibots-telegraf/bot-owner-billing-L474","INTERVAL_MS":86400000,"KIND":"cron","NAME":"bot-owner-billing-L474","NOTE":"The first run after a restart is skipped on purpose, and an owner whose payments cannot be read is left alone rather than accused.","ON_FAILURE":"log","REPO":"999-multibots-telegraf","RUNS":[],"RUNS_NOTE":"no skill invocation found in source","SERVICE":"src/services/bot-owner-billing.ts:474","SUMMARY_EN":"Recomputes every bot owner's debt from the payments ledger, warns them at the soft, warning and critical thresholds, and disables a bot that stays critical for three days.","TZ":"UTC"},"health":"ok","id":"timer/999-multibots-telegraf/bot-owner-billing-L474","inSpecCorpus":false,"messages":[],"moduleName":"cron_999_multibots_telegraf_bot_owner_billing_L474","name":{"en":"bot-owner-billing-L474"},"runNow":{"kind":"disabled","reason":"timer"},"runs":[],"runsResolved":[],"sha256":"b2fb3c2d66630369c42ae4aba3f80538661c5591de99f1b088c569185be83197","specPath":"specs/crons/999-multibots-telegraf-bot-owner-billing-L474.t27","summary":{"en":"Recomputes every bot owner's debt from the payments ledger, warns them at the soft, warning and critical thresholds, and disables a bot that stays critical for three days.","ru":"Пересчитывает долг каждого владельца бота по журналу платежей, предупреждает на мягком, тревожном и критическом порогах и отключает бота, три дня остающегося критическим."},"typecheckOk":true,"witness":"spec+code"},{"code":{"health":"ok","kind":"timer","repoPrivate":true,"sourceUrl":"https://github.com/gHashTag/999-multibots-telegraf/blob/3f01d449e5a04d37f6ff4d76d5572f499c201789/src/services/crmProactive.ts#L375","where":{"file":"src/services/crmProactive.ts","host":"railway:999-multibots-telegraf","line":375,"service":"bot"}},"control":"code-only","discarded":0,"fields":{"CONTROL":"code-only","ENABLED":true,"HOST":"timer","ID":"timer/999-multibots-telegraf/crmProactive-L375","INTERVAL_MS":1800000,"KIND":"cron","NAME":"crmProactive-L375","NOTE":"The period is CRM_PROACTIVE_MINUTES from src/index.ts, thirty minutes by default; the first sweep waits two minutes after start.","ON_FAILURE":"log","REPO":"999-multibots-telegraf","RUNS":[],"RUNS_NOTE":"no skill invocation found in source","SERVICE":"src/services/crmProactive.ts:375","SUMMARY_EN":"Runs one proactive seller turn for the owner: walks the CRM queue and puts the next draft card in front of them without being asked.","TZ":"UTC"},"health":"ok","id":"timer/999-multibots-telegraf/crmProactive-L375","inSpecCorpus":false,"messages":[],"moduleName":"cron_999_multibots_telegraf_crmProactive_L375","name":{"en":"crmProactive-L375"},"runNow":{"kind":"disabled","reason":"timer"},"runs":[],"runsResolved":[],"sha256":"68cef02f70476660ff1d1df04010d0a3d6cbe249c35da94d97f4c2a641e57d5e","specPath":"specs/crons/999-multibots-telegraf-crmProactive-L375.t27","summary":{"en":"Runs one proactive seller turn for the owner: walks the CRM queue and puts the next draft card in front of them without being asked.","ru":"Один проактивный ход продавца для владельца: обходит очередь CRM и кладёт перед ним следующую карточку-черновик без просьбы."},"typecheckOk":true,"witness":"spec+code"},{"code":{"health":"ok","kind":"timer","repoPrivate":true,"sourceUrl":"https://github.com/gHashTag/999-multibots-telegraf/blob/3f01d449e5a04d37f6ff4d76d5572f499c201789/apps/vibee-editor/render/generate-jobs.ts#L164","where":{"file":"apps/vibee-editor/render/generate-jobs.ts","host":"railway:vibee-render","line":164,"service":"render"}},"control":"code-only","discarded":0,"fields":{"CONTROL":"code-only","ENABLED":true,"HOST":"timer","ID":"timer/999-multibots-telegraf/generate-jobs-L164","INTERVAL_MS":300000,"KIND":"cron","NAME":"generate-jobs-L164","ON_FAILURE":"log","REPO":"999-multibots-telegraf","RUNS":[],"RUNS_NOTE":"no skill invocation found in source","SERVICE":"apps/vibee-editor/render/generate-jobs.ts:164","SUMMARY_EN":"Sweeps finished generation jobs out of memory an hour after they end, once a caller who lost the connection has had time to collect the result.","TZ":"UTC"},"health":"ok","id":"timer/999-multibots-telegraf/generate-jobs-L164","inSpecCorpus":false,"messages":[],"moduleName":"cron_999_multibots_telegraf_generate_jobs_L164","name":{"en":"generate-jobs-L164"},"runNow":{"kind":"disabled","reason":"timer"},"runs":[],"runsResolved":[],"sha256":"c72b9a7b5fa9804c513eb5c2ebff0868bbf2a7226347826e64bbd34f6bef6475","specPath":"specs/crons/999-multibots-telegraf-generate-jobs-L164.t27","summary":{"en":"Sweeps finished generation jobs out of memory an hour after they end, once a caller who lost the connection has had time to collect the result.","ru":"Через час после завершения выметает из памяти законченные задания генерации, когда потерявший соединение клиент успел забрать результат."},"typecheckOk":true,"witness":"spec+code"},{"code":{"health":"ok","kind":"timer","repoPrivate":true,"sourceUrl":"https://github.com/gHashTag/999-multibots-telegraf/blob/3f01d449e5a04d37f6ff4d76d5572f499c201789/src/handlers/notificationHandler.ts#L318","where":{"file":"src/handlers/notificationHandler.ts","host":"railway:999-multibots-telegraf","line":318,"service":"bot"}},"control":"code-only","discarded":0,"fields":{"CONTROL":"code-only","ENABLED":true,"HOST":"timer","ID":"timer/999-multibots-telegraf/notificationHandler-L318","INTERVAL_MS":60000,"KIND":"cron","NAME":"notificationHandler-L318","NOTE":"Wrapped in an exclusive tick, so two bot processes cannot deliver the same notification twice.","ON_FAILURE":"log","REPO":"999-multibots-telegraf","RUNS":[],"RUNS_NOTE":"no skill invocation found in source","SERVICE":"src/handlers/notificationHandler.ts:318","SUMMARY_EN":"Drains the notification queue and delivers the Telegram messages waiting in it.","TZ":"UTC"},"health":"ok","id":"timer/999-multibots-telegraf/notificationHandler-L318","inSpecCorpus":false,"messages":[],"moduleName":"cron_999_multibots_telegraf_notificationHandler_L318","name":{"en":"notificationHandler-L318"},"runNow":{"kind":"disabled","reason":"timer"},"runs":[],"runsResolved":[],"sha256":"9114a4bdfb275175f60c5a111bdc07bbfcbb62c55a0871176b8f93e3436bdd9f","specPath":"specs/crons/999-multibots-telegraf-notificationHandler-L318.t27","summary":{"en":"Drains the notification queue and delivers the Telegram messages waiting in it.","ru":"Разгружает очередь уведомлений и доставляет ждущие в ней сообщения Telegram."},"typecheckOk":true,"witness":"spec+code"},{"code":{"health":"ok","kind":"timer","repoPrivate":true,"sourceUrl":"https://github.com/gHashTag/999-multibots-telegraf/blob/3f01d449e5a04d37f6ff4d76d5572f499c201789/src/handlers/notificationHandler.ts#L324","where":{"file":"src/handlers/notificationHandler.ts","host":"railway:999-multibots-telegraf","line":324,"service":"bot"}},"control":"code-only","discarded":0,"fields":{"CONTROL":"code-only","ENABLED":true,"HOST":"timer","ID":"timer/999-multibots-telegraf/notificationHandler-L324","INTERVAL_MS":3600000,"KIND":"cron","NAME":"notificationHandler-L324","ON_FAILURE":"log","REPO":"999-multibots-telegraf","RUNS":[],"RUNS_NOTE":"no skill invocation found in source","SERVICE":"src/handlers/notificationHandler.ts:324","SUMMARY_EN":"Deletes notification messages old enough that nobody is going to read them.","TZ":"UTC"},"health":"ok","id":"timer/999-multibots-telegraf/notificationHandler-L324","inSpecCorpus":false,"messages":[],"moduleName":"cron_999_multibots_telegraf_notificationHandler_L324","name":{"en":"notificationHandler-L324"},"runNow":{"kind":"disabled","reason":"timer"},"runs":[],"runsResolved":[],"sha256":"44d2e3c8843519a512128399557c8d7af29ca2491f769f91c845dc44e0b63f9a","specPath":"specs/crons/999-multibots-telegraf-notificationHandler-L324.t27","summary":{"en":"Deletes notification messages old enough that nobody is going to read them.","ru":"Удаляет уведомления, настолько старые, что их уже никто не прочитает."},"typecheckOk":true,"witness":"spec+code"},{"code":{"health":"ok","kind":"timer","repoPrivate":true,"sourceUrl":"https://github.com/gHashTag/999-multibots-telegraf/blob/3f01d449e5a04d37f6ff4d76d5572f499c201789/src/utils/production-monitor.ts#L80","where":{"file":"src/utils/production-monitor.ts","host":"railway:999-multibots-telegraf","line":80,"service":"bot"}},"control":"code-only","discarded":0,"fields":{"CONTROL":"code-only","ENABLED":false,"HOST":"timer","ID":"timer/999-multibots-telegraf/production-monitor-L80","INTERVAL_MS":300000,"KIND":"cron","NAME":"production-monitor-L80","NOTE":"Started only by running this module from the command line with the `monitor` argument; the bot's own entry point never starts it.","ON_FAILURE":"log","REPO":"999-multibots-telegraf","RUNS":[],"RUNS_NOTE":"no skill invocation found in source","SERVICE":"src/utils/production-monitor.ts:80","SUMMARY_EN":"Re-runs the container, nginx, port, domain, webhook and system-resource checks, and applies the fixes that are enabled.","TZ":"UTC"},"health":"ok","id":"timer/999-multibots-telegraf/production-monitor-L80","inSpecCorpus":false,"messages":[],"moduleName":"cron_999_multibots_telegraf_production_monitor_L80","name":{"en":"production-monitor-L80"},"runNow":{"kind":"disabled","reason":"timer"},"runs":[],"runsResolved":[],"sha256":"880d0b6c01b2b1e4cc9bc92c11ef300b8335bdf8ca842308bca7d3fd7e979254","specPath":"specs/crons/999-multibots-telegraf-production-monitor-L80.t27","summary":{"en":"Re-runs the container, nginx, port, domain, webhook and system-resource checks, and applies the fixes that are enabled.","ru":"Повторяет проверки контейнера, nginx, порта, домена, вебхука и ресурсов системы и применяет включённые исправления."},"typecheckOk":true,"witness":"spec+code"},{"code":{"health":"ok","kind":"timer","repoPrivate":true,"sourceUrl":"https://github.com/gHashTag/999-multibots-telegraf/blob/3f01d449e5a04d37f6ff4d76d5572f499c201789/src/services/provider-health-monitor.ts#L344","where":{"file":"src/services/provider-health-monitor.ts","host":"railway:999-multibots-telegraf","line":344,"service":"bot"}},"control":"code-only","discarded":0,"fields":{"CONTROL":"code-only","ENABLED":true,"HOST":"timer","ID":"timer/999-multibots-telegraf/provider-health-monitor-L344","INTERVAL_MS":300000,"KIND":"cron","NAME":"provider-health-monitor-L344","NOTE":"Providers listed in HEALTH_SKIP_PROVIDERS are deliberately not watched and do not raise the alarm.","ON_FAILURE":"log","REPO":"999-multibots-telegraf","RUNS":[],"RUNS_NOTE":"no skill invocation found in source","SERVICE":"src/services/provider-health-monitor.ts:344","SUMMARY_EN":"Checks every AI provider that is not parked and records whether it is currently answering.","TZ":"UTC"},"health":"ok","id":"timer/999-multibots-telegraf/provider-health-monitor-L344","inSpecCorpus":false,"messages":[],"moduleName":"cron_999_multibots_telegraf_provider_health_monitor_L344","name":{"en":"provider-health-monitor-L344"},"runNow":{"kind":"disabled","reason":"timer"},"runs":[],"runsResolved":[],"sha256":"0044630e40dc2673a2d1210e848f1a3cd41cc2b21b541bec98e305f0192a2de7","specPath":"specs/crons/999-multibots-telegraf-provider-health-monitor-L344.t27","summary":{"en":"Checks every AI provider that is not parked and records whether it is currently answering.","ru":"Проверяет каждого не отключённого AI-провайдера и записывает, отвечает ли он сейчас."},"typecheckOk":true,"witness":"spec+code"},{"code":{"health":"ok","kind":"timer","repoPrivate":true,"sourceUrl":"https://github.com/gHashTag/999-multibots-telegraf/blob/3f01d449e5a04d37f6ff4d76d5572f499c201789/apps/vibee-editor/render/render-server.ts#L10845","where":{"file":"apps/vibee-editor/render/render-server.ts","host":"railway:vibee-render","line":10845,"service":"render"}},"control":"code-only","discarded":0,"fields":{"CONTROL":"code-only","ENABLED":true,"HOST":"timer","ID":"timer/999-multibots-telegraf/render-server-L10845","INTERVAL_MS":30000,"KIND":"cron","NAME":"render-server-L10845","ON_FAILURE":"log","REPO":"999-multibots-telegraf","RUNS":[],"RUNS_NOTE":"no skill invocation found in source","SERVICE":"apps/vibee-editor/render/render-server.ts:10845","SUMMARY_EN":"Pings every websocket peer and drops the ones that did not answer the previous round.","TZ":"UTC"},"health":"ok","id":"timer/999-multibots-telegraf/render-server-L10845","inSpecCorpus":false,"messages":[],"moduleName":"cron_999_multibots_telegraf_render_server_L10845","name":{"en":"render-server-L10845"},"runNow":{"kind":"disabled","reason":"timer"},"runs":[],"runsResolved":[],"sha256":"bfcd81ea5f3b3040dccce76d91dd699347e49c2df843529218ee138560e2d924","specPath":"specs/crons/999-multibots-telegraf-render-server-L10845.t27","summary":{"en":"Pings every websocket peer and drops the ones that did not answer the previous round.","ru":"Пингует каждого websocket-пира и отключает тех, кто не ответил в прошлом раунде."},"typecheckOk":true,"witness":"spec+code"},{"code":{"health":"ok","kind":"timer","repoPrivate":true,"sourceUrl":"https://github.com/gHashTag/999-multibots-telegraf/blob/3f01d449e5a04d37f6ff4d76d5572f499c201789/apps/vibee-editor/render/render-server.ts#L2301","where":{"file":"apps/vibee-editor/render/render-server.ts","host":"railway:vibee-render","line":2301,"service":"render"}},"control":"code-only","discarded":0,"fields":{"CONTROL":"code-only","ENABLED":true,"HOST":"timer","ID":"timer/999-multibots-telegraf/render-server-L2301","INTERVAL_MS":60000,"KIND":"cron","NAME":"render-server-L2301","ON_FAILURE":"log","REPO":"999-multibots-telegraf","RUNS":[],"RUNS_NOTE":"no skill invocation found in source","SERVICE":"apps/vibee-editor/render/render-server.ts:2301","SUMMARY_EN":"Removes render jobs older than an hour from the in-memory job map.","TZ":"UTC"},"health":"ok","id":"timer/999-multibots-telegraf/render-server-L2301","inSpecCorpus":false,"messages":[],"moduleName":"cron_999_multibots_telegraf_render_server_L2301","name":{"en":"render-server-L2301"},"runNow":{"kind":"disabled","reason":"timer"},"runs":[],"runsResolved":[],"sha256":"37e3dca7f4836af5ecfde5eaaa2aa993ac19087ac902adbb4015c04527a2af62","specPath":"specs/crons/999-multibots-telegraf-render-server-L2301.t27","summary":{"en":"Removes render jobs older than an hour from the in-memory job map.","ru":"Удаляет из карты в памяти задания рендера старше часа."},"typecheckOk":true,"witness":"spec+code"},{"code":{"health":"ok","kind":"timer","repoPrivate":true,"sourceUrl":"https://github.com/gHashTag/999-multibots-telegraf/blob/3f01d449e5a04d37f6ff4d76d5572f499c201789/apps/vibee-editor/render/render-server.ts#L2325","where":{"file":"apps/vibee-editor/render/render-server.ts","host":"railway:vibee-render","line":2325,"service":"render"}},"control":"code-only","discarded":0,"fields":{"CONTROL":"code-only","ENABLED":true,"HOST":"timer","ID":"timer/999-multibots-telegraf/render-server-L2325","INTERVAL_MS":600000,"KIND":"cron","NAME":"render-server-L2325","NOTE":"Checks often and writes rarely: the cursor lives in the database, because this Railway project has no volume and a deploy wipes local state.","ON_FAILURE":"log","REPO":"999-multibots-telegraf","RUNS":[],"RUNS_NOTE":"no skill invocation found in source","SERVICE":"apps/vibee-editor/render/render-server.ts:2325","SUMMARY_EN":"Reads the hive journal and delivers the queen's report to the keepers, passing alarms straight through and batching ordinary events.","TZ":"UTC"},"health":"ok","id":"timer/999-multibots-telegraf/render-server-L2325","inSpecCorpus":false,"messages":[],"moduleName":"cron_999_multibots_telegraf_render_server_L2325","name":{"en":"render-server-L2325"},"runNow":{"kind":"disabled","reason":"timer"},"runs":[],"runsResolved":[],"sha256":"11b24d4332b7e356f77b233a20d578c3ec31da71ff34be37d16d29d7d4471d5b","specPath":"specs/crons/999-multibots-telegraf-render-server-L2325.t27","summary":{"en":"Reads the hive journal and delivers the queen's report to the keepers, passing alarms straight through and batching ordinary events.","ru":"Читает журнал улья и доставляет отчёт королевы хранителям: тревоги — сразу, обычные события — пакетом."},"typecheckOk":true,"witness":"spec+code"},{"code":{"health":"ok","kind":"timer","repoPrivate":true,"sourceUrl":"https://github.com/gHashTag/999-multibots-telegraf/blob/3f01d449e5a04d37f6ff4d76d5572f499c201789/apps/vibee-editor/render/render-server.ts#L919","where":{"file":"apps/vibee-editor/render/render-server.ts","host":"railway:vibee-render","line":919,"service":"render"}},"control":"code-only","discarded":0,"fields":{"CONTROL":"code-only","ENABLED":true,"HOST":"timer","ID":"timer/999-multibots-telegraf/render-server-L919","INTERVAL_MS":5000,"KIND":"cron","NAME":"render-server-L919","NOTE":"Only starts when a session signing key is configured; a deployed render server refuses to boot without one.","ON_FAILURE":"log","REPO":"999-multibots-telegraf","RUNS":[],"RUNS_NOTE":"no skill invocation found in source","SERVICE":"apps/vibee-editor/render/render-server.ts:919","SUMMARY_EN":"Re-reads the session revocation list from Postgres so a revoked browser session stops being accepted.","TZ":"UTC"},"health":"ok","id":"timer/999-multibots-telegraf/render-server-L919","inSpecCorpus":false,"messages":[],"moduleName":"cron_999_multibots_telegraf_render_server_L919","name":{"en":"render-server-L919"},"runNow":{"kind":"disabled","reason":"timer"},"runs":[],"runsResolved":[],"sha256":"f86d77af65dfb35cc4adf4202c8f06577e82d7856edbcac656ef735eeba19a52","specPath":"specs/crons/999-multibots-telegraf-render-server-L919.t27","summary":{"en":"Re-reads the session revocation list from Postgres so a revoked browser session stops being accepted.","ru":"Перечитывает из Postgres список отозванных сессий, чтобы отозванная сессия браузера перестала приниматься."},"typecheckOk":true,"witness":"spec+code"},{"code":{"health":"ok","kind":"timer","repoPrivate":true,"sourceUrl":"https://github.com/gHashTag/999-multibots-telegraf/blob/3f01d449e5a04d37f6ff4d76d5572f499c201789/src/modules/videoGenerator/taskCache.ts#L27","where":{"file":"src/modules/videoGenerator/taskCache.ts","host":"railway:999-multibots-telegraf","line":27,"service":"bot"}},"control":"code-only","discarded":0,"fields":{"CONTROL":"code-only","ENABLED":true,"HOST":"timer","ID":"timer/999-multibots-telegraf/taskCache-L27","INTERVAL_MS":300000,"KIND":"cron","NAME":"taskCache-L27","ON_FAILURE":"log","REPO":"999-multibots-telegraf","RUNS":[],"RUNS_NOTE":"no skill invocation found in source","SERVICE":"src/modules/videoGenerator/taskCache.ts:27","SUMMARY_EN":"Drops video-generation cache entries past their fifteen-minute lifetime so a finished task cannot block the next request.","TZ":"UTC"},"health":"ok","id":"timer/999-multibots-telegraf/taskCache-L27","inSpecCorpus":false,"messages":[],"moduleName":"cron_999_multibots_telegraf_taskCache_L27","name":{"en":"taskCache-L27"},"runNow":{"kind":"disabled","reason":"timer"},"runs":[],"runsResolved":[],"sha256":"ca7f9a9edce47fe23ef59515d87ba7f391b878a9c5115b43e9c32b4a70fe90db","specPath":"specs/crons/999-multibots-telegraf-taskCache-L27.t27","summary":{"en":"Drops video-generation cache entries past their fifteen-minute lifetime so a finished task cannot block the next request.","ru":"Сбрасывает записи кэша видеогенерации старше пятнадцати минут, чтобы завершённая задача не блокировала следующий запрос."},"typecheckOk":true,"witness":"spec+code"},{"code":{"health":"ok","kind":"timer","repoPrivate":true,"sourceUrl":"https://github.com/gHashTag/999-multibots-telegraf/blob/3f01d449e5a04d37f6ff4d76d5572f499c201789/src/services/video-task-store.ts#L156","where":{"file":"src/services/video-task-store.ts","host":"railway:999-multibots-telegraf","line":156,"service":"bot"}},"control":"code-only","discarded":0,"fields":{"CONTROL":"code-only","ENABLED":true,"HOST":"timer","ID":"timer/999-multibots-telegraf/video-task-store-L156","INTERVAL_MS":600000,"KIND":"cron","NAME":"video-task-store-L156","ON_FAILURE":"log","REPO":"999-multibots-telegraf","RUNS":[],"RUNS_NOTE":"no skill invocation found in source","SERVICE":"src/services/video-task-store.ts:156","SUMMARY_EN":"Forgets video tasks older than an hour and rewrites the store to disk when anything was removed.","TZ":"UTC"},"health":"ok","id":"timer/999-multibots-telegraf/video-task-store-L156","inSpecCorpus":false,"messages":[],"moduleName":"cron_999_multibots_telegraf_video_task_store_L156","name":{"en":"video-task-store-L156"},"runNow":{"kind":"disabled","reason":"timer"},"runs":[],"runsResolved":[],"sha256":"dc4e3d6c76cac57a36074da8a9d6aac8df1f1c55bb68a593c2cadf94c94351b1","specPath":"specs/crons/999-multibots-telegraf-video-task-store-L156.t27","summary":{"en":"Forgets video tasks older than an hour and rewrites the store to disk when anything was removed.","ru":"Забывает видеозадачи старше часа и переписывает хранилище на диск, если что-то было удалено."},"typecheckOk":true,"witness":"spec+code"}],"generatedAt":"2026-09-09T17:04:02.832Z","i18n":[{"bundle":"apps/website/i18n/agents.ru.json","coverage":{"n":33,"total":33},"enabled":true,"fields":["SUMMARY","NAME"],"locale":"ru","missing":[],"scope":["specs/skills","specs/crons","specs/agents","specs/functions","specs/tools"],"sha256":"c8871fb4ccdef8fc3cc2937af5db0e307ab0b62f6a03ece9f4512851ffd64f04","spec":"specs/i18n/agents-ru.t27"}],"version":1} +{"codeOnly":[],"compilerWasmSha256":"4d9c0447b5ca288790ab03d3dffc2dda629ed47af9d6731a105fc923aea0aee4","contentSha256":"87c29c0f2e638b58c2ed7303ceaa0b4885eef5214d65486c02902a1bd8e7dc32","counts":{"byHost":{"github-actions":12,"inngest":6,"railway-cron":1,"timer":14},"codeOnly":0,"specOnly":0,"specPlusCode":33,"specs":33,"typecheckOk":33,"withRuns":0},"crons":[{"code":{"health":"warn","kind":"github-actions","repoPrivate":true,"sourceUrl":"https://github.com/gHashTag/999-multibots-telegraf/blob/3f01d449e5a04d37f6ff4d76d5572f499c201789/.github/workflows/ci.yml#L10","where":{"file":".github/workflows/ci.yml","host":"github-actions","line":10,"service":null}},"control":"code-only","discarded":0,"fields":{"CONTROL":"code-only","ENABLED":true,"HOST":"github-actions","ID":"github-actions/999-multibots-telegraf/ci","KIND":"cron","NAME":"CI/CD Pipeline","NOTE":"GitHub Actions on this repository have not run since 2026-06-02 (billing); the schedule stands in the file but does not fire.","ON_FAILURE":"log","REPO":"999-multibots-telegraf","RUNS":[],"RUNS_NOTE":"no skill invocation found in source","SCHEDULE":"0 2 * * *","SERVICE":".github/workflows/ci.yml","SUMMARY_EN":"Runs the whole build, type-check and test pipeline once a day so a dependency that rots without a push still gets caught.","TZ":"UTC"},"health":"ok","id":"github-actions/999-multibots-telegraf/ci","inSpecCorpus":false,"messages":[],"moduleName":"cron_999_multibots_telegraf_ci","name":{"en":"CI/CD Pipeline"},"runNow":{"kind":"link","url":"https://github.com/gHashTag/999-multibots-telegraf/actions/workflows/ci.yml","via":"github-actions"},"runs":[],"runsResolved":[],"sha256":"8aea8946d266dd32d1455a5ae70c1b8a3b79f0ee4ac7889f68f14d0918094484","specPath":"specs/crons/999-multibots-telegraf-ci.t27","summary":{"en":"Runs the whole build, type-check and test pipeline once a day so a dependency that rots without a push still gets caught.","ru":"Раз в день прогоняет весь конвейер сборки, проверки типов и тестов, чтобы зависимость, гниющая без пуша, всё равно была поймана."},"typecheckOk":true,"witness":"spec+code"},{"code":{"health":"warn","kind":"github-actions","repoPrivate":true,"sourceUrl":"https://github.com/gHashTag/999-multibots-telegraf/blob/3f01d449e5a04d37f6ff4d76d5572f499c201789/.github/workflows/security.yml#L10","where":{"file":".github/workflows/security.yml","host":"github-actions","line":10,"service":null}},"control":"code-only","discarded":0,"fields":{"CONTROL":"code-only","ENABLED":true,"HOST":"github-actions","ID":"github-actions/999-multibots-telegraf/security","KIND":"cron","NAME":"Security Checks","NOTE":"GitHub Actions on this repository have not run since 2026-06-02 (billing); the schedule stands in the file but does not fire.","ON_FAILURE":"log","REPO":"999-multibots-telegraf","RUNS":[],"RUNS_NOTE":"no skill invocation found in source","SCHEDULE":"0 3 * * 0","SERVICE":".github/workflows/security.yml","SUMMARY_EN":"Runs the weekly security sweep: secret detection over the full history, dependency audit and code scanning.","TZ":"UTC"},"health":"ok","id":"github-actions/999-multibots-telegraf/security","inSpecCorpus":false,"messages":[],"moduleName":"cron_999_multibots_telegraf_security","name":{"en":"Security Checks"},"runNow":{"kind":"link","url":"https://github.com/gHashTag/999-multibots-telegraf/actions/workflows/security.yml","via":"github-actions"},"runs":[],"runsResolved":[],"sha256":"85fd8a7d31b783c57da0443c9ca2156d6d786867bea9dfee682f6208f876e91c","specPath":"specs/crons/999-multibots-telegraf-security.t27","summary":{"en":"Runs the weekly security sweep: secret detection over the full history, dependency audit and code scanning.","ru":"Еженедельная проверка безопасности: поиск секретов по всей истории, аудит зависимостей и сканирование кода."},"typecheckOk":true,"witness":"spec+code"},{"code":{"health":"ok","kind":"github-actions","repoPrivate":false,"sourceUrl":"https://github.com/gHashTag/t27/blob/e804cd062af9bd4424a8579ea54b1f21381580de/.github/workflows/formal-mutation.yml#L25","where":{"file":".github/workflows/formal-mutation.yml","host":"github-actions","line":25,"service":null}},"control":"github-actions-dispatch","discarded":0,"fields":{"CONTROL":"github-actions-dispatch","ENABLED":true,"HOST":"github-actions","ID":"github-actions/t27/formal-mutation","KIND":"cron","NAME":"formal-mutation","NOTE":"Weekly rather than per-push because a full run costs about thirty yosys invocations.","ON_FAILURE":"log","REPO":"t27","RUNS":[],"RUNS_NOTE":"no skill invocation found in source","SCHEDULE":"0 5 * * 1","SERVICE":".github/workflows/formal-mutation.yml","SUMMARY_EN":"Proves the formal gates actually bite by mutating the generated RTL once a week and requiring each gate to go red for its own mutation.","TZ":"UTC"},"health":"ok","id":"github-actions/t27/formal-mutation","inSpecCorpus":false,"messages":[],"moduleName":"cron_t27_formal_mutation","name":{"en":"formal-mutation"},"runNow":{"kind":"link","url":"https://github.com/gHashTag/t27/actions/workflows/formal-mutation.yml","via":"github-actions"},"runs":[],"runsResolved":[],"sha256":"f23f8e3b111bc55516c6e1860493acf41325dd40e6bf1b39842ba6c0dd906fbe","specPath":"specs/crons/t27-formal-mutation.t27","summary":{"en":"Proves the formal gates actually bite by mutating the generated RTL once a week and requiring each gate to go red for its own mutation.","ru":"Раз в неделю мутирует сгенерированный RTL и требует, чтобы каждый формальный гейт покраснел на своей мутации — доказательство, что гейты кусаются."},"typecheckOk":true,"witness":"spec+code"},{"code":{"health":"ok","kind":"github-actions","repoPrivate":false,"sourceUrl":"https://github.com/gHashTag/t27/blob/e804cd062af9bd4424a8579ea54b1f21381580de/.github/workflows/pr-dashboard.yml#L6","where":{"file":".github/workflows/pr-dashboard.yml","host":"github-actions","line":6,"service":null}},"control":"github-actions-dispatch","discarded":0,"fields":{"CONTROL":"github-actions-dispatch","ENABLED":true,"HOST":"github-actions","ID":"github-actions/t27/pr-dashboard","KIND":"cron","NAME":"PR Dashboard","ON_FAILURE":"log","REPO":"t27","RUNS":[],"RUNS_NOTE":"no skill invocation found in source","SCHEDULE":"0 * * * *","SERVICE":".github/workflows/pr-dashboard.yml","SUMMARY_EN":"Rebuilds the pull-request dashboard every hour from the current state of the open pull requests.","TZ":"UTC"},"health":"ok","id":"github-actions/t27/pr-dashboard","inSpecCorpus":false,"messages":[],"moduleName":"cron_t27_pr_dashboard","name":{"en":"PR Dashboard"},"runNow":{"kind":"link","url":"https://github.com/gHashTag/t27/actions/workflows/pr-dashboard.yml","via":"github-actions"},"runs":[],"runsResolved":[],"sha256":"a16c8b2d502ca53955b1e51f3816d111ac056e5fe80904edbbc52fc269e45a92","specPath":"specs/crons/t27-pr-dashboard.t27","summary":{"en":"Rebuilds the pull-request dashboard every hour from the current state of the open pull requests.","ru":"Каждый час пересобирает панель pull request из текущего состояния открытых PR."},"typecheckOk":true,"witness":"spec+code"},{"code":{"health":"ok","kind":"github-actions","repoPrivate":false,"sourceUrl":"https://github.com/gHashTag/trinity/blob/cdc1d68d697fca070d9ad0f2d36aa4074de140f4/.github/workflows/agent-cron-cleanup.yml#L4","where":{"file":".github/workflows/agent-cron-cleanup.yml","host":"github-actions","line":4,"service":null}},"control":"github-actions-dispatch","discarded":0,"fields":{"CONTROL":"github-actions-dispatch","ENABLED":true,"HOST":"github-actions","ID":"github-actions/trinity/agent-cron-cleanup","KIND":"cron","NAME":"Trinity Agent Cron Cleanup","ON_FAILURE":"log","REPO":"trinity","RUNS":[],"RUNS_NOTE":"no skill invocation found in source","SCHEDULE":"0 */2 * * *","SERVICE":".github/workflows/agent-cron-cleanup.yml","SUMMARY_EN":"Finds agent deployments that got stuck and kills them, every two hours.","TZ":"UTC"},"health":"ok","id":"github-actions/trinity/agent-cron-cleanup","inSpecCorpus":false,"messages":[],"moduleName":"cron_trinity_agent_cron_cleanup","name":{"en":"Trinity Agent Cron Cleanup"},"runNow":{"kind":"link","url":"https://github.com/gHashTag/trinity/actions/workflows/agent-cron-cleanup.yml","via":"github-actions"},"runs":[],"runsResolved":[],"sha256":"f4db9e04ccb4ab2e3a1e501a15c2824109b7827d910ebf70874e5ab1ded9c6cf","specPath":"specs/crons/trinity-agent-cron-cleanup.t27","summary":{"en":"Finds agent deployments that got stuck and kills them, every two hours.","ru":"Каждые два часа находит застрявшие деплои агентов и убивает их."},"typecheckOk":true,"witness":"spec+code"},{"code":{"health":"ok","kind":"github-actions","repoPrivate":false,"sourceUrl":"https://github.com/gHashTag/trinity/blob/cdc1d68d697fca070d9ad0f2d36aa4074de140f4/.github/workflows/agent-queue-drain.yml#L4","where":{"file":".github/workflows/agent-queue-drain.yml","host":"github-actions","line":4,"service":null}},"control":"github-actions-dispatch","discarded":0,"fields":{"CONTROL":"github-actions-dispatch","ENABLED":true,"HOST":"github-actions","ID":"github-actions/trinity/agent-queue-drain","KIND":"cron","NAME":"Trinity Agent Queue Drain","ON_FAILURE":"log","REPO":"trinity","RUNS":[],"RUNS_NOTE":"dispatches agent-spawn-pool.yml for a queued issue; no named skill invocation found in source","SCHEDULE":"*/5 * * * *","SERVICE":".github/workflows/agent-queue-drain.yml","SUMMARY_EN":"Looks for queued issues and free agent slots every five minutes and starts the next agent when there is room.","TZ":"UTC"},"health":"ok","id":"github-actions/trinity/agent-queue-drain","inSpecCorpus":false,"messages":[],"moduleName":"cron_trinity_agent_queue_drain","name":{"en":"Trinity Agent Queue Drain"},"runNow":{"kind":"link","url":"https://github.com/gHashTag/trinity/actions/workflows/agent-queue-drain.yml","via":"github-actions"},"runs":[],"runsResolved":[],"sha256":"e334d5dc5fc0c176e420a131ea712b9f8d2e1c03b56a36388a683081b5defda3","specPath":"specs/crons/trinity-agent-queue-drain.t27","summary":{"en":"Looks for queued issues and free agent slots every five minutes and starts the next agent when there is room.","ru":"Каждые пять минут ищет задачи в очереди и свободные слоты агентов и запускает следующего агента, когда есть место."},"typecheckOk":true,"witness":"spec+code"},{"code":{"health":"ok","kind":"github-actions","repoPrivate":false,"sourceUrl":"https://github.com/gHashTag/trinity/blob/cdc1d68d697fca070d9ad0f2d36aa4074de140f4/.github/workflows/brain-ci.yml#L11","where":{"file":".github/workflows/brain-ci.yml","host":"github-actions","line":11,"service":null}},"control":"github-actions-dispatch","discarded":0,"fields":{"CONTROL":"github-actions-dispatch","ENABLED":true,"HOST":"github-actions","ID":"github-actions/trinity/brain-ci","KIND":"cron","NAME":"S³AI Brain CI — \"Functional MRI\" Gate","ON_FAILURE":"log","REPO":"trinity","RUNS":[],"RUNS_NOTE":"no skill invocation found in source","SCHEDULE":"0 0 * * 0","SERVICE":".github/workflows/brain-ci.yml","SUMMARY_EN":"Runs the weekly brain stress test, the long version of the health gate that every commit already gets.","TZ":"UTC"},"health":"ok","id":"github-actions/trinity/brain-ci","inSpecCorpus":false,"messages":[],"moduleName":"cron_trinity_brain_ci","name":{"en":"S³AI Brain CI — \"Functional MRI\" Gate"},"runNow":{"kind":"link","url":"https://github.com/gHashTag/trinity/actions/workflows/brain-ci.yml","via":"github-actions"},"runs":[],"runsResolved":[],"sha256":"c8cd980319751e2b53501dc645f1beb6980bdbf77adbb98a158a12be441d957e","specPath":"specs/crons/trinity-brain-ci.t27","summary":{"en":"Runs the weekly brain stress test, the long version of the health gate that every commit already gets.","ru":"Еженедельный стресс-тест мозга — длинная версия гейта здоровья, который получает каждый коммит."},"typecheckOk":true,"witness":"spec+code"},{"code":{"health":"ok","kind":"github-actions","repoPrivate":false,"sourceUrl":"https://github.com/gHashTag/trinity/blob/cdc1d68d697fca070d9ad0f2d36aa4074de140f4/.github/workflows/codegen.yml#L10","where":{"file":".github/workflows/codegen.yml","host":"github-actions","line":10,"service":null}},"control":"github-actions-dispatch","discarded":0,"fields":{"CONTROL":"github-actions-dispatch","ENABLED":true,"HOST":"github-actions","ID":"github-actions/trinity/codegen","KIND":"cron","NAME":"Codegen Validation","ON_FAILURE":"log","REPO":"trinity","RUNS":[],"RUNS_NOTE":"no skill invocation found in source","SCHEDULE":"0 0 * * *","SERVICE":".github/workflows/codegen.yml","SUMMARY_EN":"Validates the VIBEE code generator once a day, independently of whether anyone pushed.","TZ":"UTC"},"health":"ok","id":"github-actions/trinity/codegen","inSpecCorpus":false,"messages":[],"moduleName":"cron_trinity_codegen","name":{"en":"Codegen Validation"},"runNow":{"kind":"link","url":"https://github.com/gHashTag/trinity/actions/workflows/codegen.yml","via":"github-actions"},"runs":[],"runsResolved":[],"sha256":"d71a2dd240cabe9e1e5d667259d245209ec4532632c30328971e84ec4cbc4bd6","specPath":"specs/crons/trinity-codegen.t27","summary":{"en":"Validates the VIBEE code generator once a day, independently of whether anyone pushed.","ru":"Раз в день проверяет генератор кода VIBEE независимо от того, пушил ли кто-нибудь."},"typecheckOk":true,"witness":"spec+code"},{"code":{"health":"ok","kind":"github-actions","repoPrivate":false,"sourceUrl":"https://github.com/gHashTag/trinity/blob/cdc1d68d697fca070d9ad0f2d36aa4074de140f4/.github/workflows/discover-callers.yml#L16","where":{"file":".github/workflows/discover-callers.yml","host":"github-actions","line":16,"service":null}},"control":"github-actions-dispatch","discarded":0,"fields":{"CONTROL":"github-actions-dispatch","ENABLED":true,"HOST":"github-actions","ID":"github-actions/trinity/discover-callers","KIND":"cron","NAME":"Discover RTL check callers","ON_FAILURE":"log","REPO":"trinity","RUNS":[],"RUNS_NOTE":"no skill invocation found in source","SCHEDULE":"41 5 * * *","SERVICE":".github/workflows/discover-callers.yml","SUMMARY_EN":"Reads GitHub for repositories that run the RTL check, so the gallery counts its own users instead of being hand-written.","TZ":"UTC"},"health":"ok","id":"github-actions/trinity/discover-callers","inSpecCorpus":false,"messages":[],"moduleName":"cron_trinity_discover_callers","name":{"en":"Discover RTL check callers"},"runNow":{"kind":"link","url":"https://github.com/gHashTag/trinity/actions/workflows/discover-callers.yml","via":"github-actions"},"runs":[],"runsResolved":[],"sha256":"1aa5ec92373f3a0a9df24da027b852896fc303ec4eb50e4ee780d9abdea5aced","specPath":"specs/crons/trinity-discover-callers.t27","summary":{"en":"Reads GitHub for repositories that run the RTL check, so the gallery counts its own users instead of being hand-written.","ru":"Читает GitHub в поисках репозиториев, запускающих RTL-проверку, чтобы галерея считала своих пользователей сама."},"typecheckOk":true,"witness":"spec+code"},{"code":{"health":"ok","kind":"github-actions","repoPrivate":false,"sourceUrl":"https://github.com/gHashTag/trinity/blob/cdc1d68d697fca070d9ad0f2d36aa4074de140f4/.github/workflows/pages-health-check.yml#L17","where":{"file":".github/workflows/pages-health-check.yml","host":"github-actions","line":17,"service":null}},"control":"github-actions-dispatch","discarded":0,"fields":{"CONTROL":"github-actions-dispatch","ENABLED":true,"HOST":"github-actions","ID":"github-actions/trinity/pages-health-check","KIND":"cron","NAME":"Pages Health Check","NOTE":"An earlier version judged a bare status code, failed ninety-six times a day on a site that was up, and dispatched a redeploy each time.","ON_FAILURE":"log","REPO":"trinity","RUNS":[],"RUNS_NOTE":"no skill invocation found in source","SCHEDULE":"*/15 * * * *","SERVICE":".github/workflows/pages-health-check.yml","SUMMARY_EN":"Fetches the published site every fifteen minutes, follows the redirect, and redeploys only when the evidence says the deploy is what broke.","TZ":"UTC"},"health":"ok","id":"github-actions/trinity/pages-health-check","inSpecCorpus":false,"messages":[],"moduleName":"cron_trinity_pages_health_check","name":{"en":"Pages Health Check"},"runNow":{"kind":"link","url":"https://github.com/gHashTag/trinity/actions/workflows/pages-health-check.yml","via":"github-actions"},"runs":[],"runsResolved":[],"sha256":"f8199eaa1c9707bff5ba89d553a644725b072fce2f7c4c5de7dfe4b6e9620ac1","specPath":"specs/crons/trinity-pages-health-check.t27","summary":{"en":"Fetches the published site every fifteen minutes, follows the redirect, and redeploys only when the evidence says the deploy is what broke.","ru":"Каждые пятнадцать минут запрашивает опубликованный сайт, следует редиректу и передеплоит только когда свидетельства говорят, что сломан именно деплой."},"typecheckOk":true,"witness":"spec+code"},{"code":{"health":"ok","kind":"github-actions","repoPrivate":false,"sourceUrl":"https://github.com/gHashTag/trinity/blob/cdc1d68d697fca070d9ad0f2d36aa4074de140f4/.github/workflows/signal-health-self.yml#L17","where":{"file":".github/workflows/signal-health-self.yml","host":"github-actions","line":17,"service":null}},"control":"github-actions-dispatch","discarded":0,"fields":{"CONTROL":"github-actions-dispatch","ENABLED":true,"HOST":"github-actions","ID":"github-actions/trinity/signal-health-self","KIND":"cron","NAME":"Signal health (self)","ON_FAILURE":"log","REPO":"trinity","RUNS":[],"RUNS_NOTE":"no skill invocation found in source","SCHEDULE":"23 4 * * *","SERVICE":".github/workflows/signal-health-self.yml","SUMMARY_EN":"Applies the signal-health check to the repository that sells it and writes the numbers into the website data.","TZ":"UTC"},"health":"ok","id":"github-actions/trinity/signal-health-self","inSpecCorpus":false,"messages":[],"moduleName":"cron_trinity_signal_health_self","name":{"en":"Signal health (self)"},"runNow":{"kind":"link","url":"https://github.com/gHashTag/trinity/actions/workflows/signal-health-self.yml","via":"github-actions"},"runs":[],"runsResolved":[],"sha256":"b5bd1483d24af17707d8fcf03dbb6f011bc8462773423ebe9b8ee4e506a76a4e","specPath":"specs/crons/trinity-signal-health-self.t27","summary":{"en":"Applies the signal-health check to the repository that sells it and writes the numbers into the website data.","ru":"Применяет проверку signal-health к репозиторию, который её продаёт, и записывает числа в данные сайта."},"typecheckOk":true,"witness":"spec+code"},{"code":{"health":"ok","kind":"github-actions","repoPrivate":false,"sourceUrl":"https://github.com/gHashTag/trinity/blob/cdc1d68d697fca070d9ad0f2d36aa4074de140f4/.github/workflows/site-live-gate.yml#L33","where":{"file":".github/workflows/site-live-gate.yml","host":"github-actions","line":33,"service":null}},"control":"github-actions-dispatch","discarded":0,"fields":{"CONTROL":"github-actions-dispatch","ENABLED":true,"HOST":"github-actions","ID":"github-actions/trinity/site-live-gate","KIND":"cron","NAME":"Site live gate","ON_FAILURE":"log","REPO":"trinity","RUNS":[],"RUNS_NOTE":"no skill invocation found in source","SCHEDULE":"17 6 * * *","SERVICE":".github/workflows/site-live-gate.yml","SUMMARY_EN":"Compares the content-hashed entry bundle served at the apex against a build of main, so that 'deployed' means a reader can actually see it.","TZ":"UTC"},"health":"ok","id":"github-actions/trinity/site-live-gate","inSpecCorpus":false,"messages":[],"moduleName":"cron_trinity_site_live_gate","name":{"en":"Site live gate"},"runNow":{"kind":"link","url":"https://github.com/gHashTag/trinity/actions/workflows/site-live-gate.yml","via":"github-actions"},"runs":[],"runsResolved":[],"sha256":"76ed9aa7465a9ba704074563535c41d2df1fcfa2ac76059bfe2eb5e3e52c5933","specPath":"specs/crons/trinity-site-live-gate.t27","summary":{"en":"Compares the content-hashed entry bundle served at the apex against a build of main, so that 'deployed' means a reader can actually see it.","ru":"Сравнивает бандл с контент-хешем на апексе со сборкой main, чтобы «задеплоено» означало, что читатель это видит."},"typecheckOk":true,"witness":"spec+code"},{"code":{"health":"ok","kind":"inngest","repoPrivate":true,"sourceUrl":"https://github.com/gHashTag/999-multibots-telegraf/blob/3f01d449e5a04d37f6ff4d76d5572f499c201789/src/inngest_app/functions/training/checkStuckTrainings.ts#L53","where":{"file":"src/inngest_app/functions/training/checkStuckTrainings.ts","host":"railway:999-multibots-telegraf","line":53,"service":"inngest"}},"control":"inngest-dashboard","discarded":0,"fields":{"CONTROL":"inngest-dashboard","ENABLED":true,"HOST":"inngest","ID":"inngest/999-multibots-telegraf/check-stuck-trainings","KIND":"cron","NAME":"check-stuck-trainings","NOTE":"Records whose Replicate id is still a placeholder are skipped, because there is nothing on the provider to ask about.","ON_FAILURE":"log","REPO":"999-multibots-telegraf","RUNS":[],"RUNS_NOTE":"no skill invocation found in source","SCHEDULE":"*/30 * * * *","SERVICE":"src/inngest_app/functions/training/checkStuckTrainings.ts","SUMMARY_EN":"Finds model trainings still marked pending or processing past the stuck threshold and reconciles them against Replicate.","TZ":"UTC"},"health":"ok","id":"inngest/999-multibots-telegraf/check-stuck-trainings","inSpecCorpus":false,"messages":[],"moduleName":"cron_999_multibots_telegraf_check_stuck_trainings","name":{"en":"check-stuck-trainings"},"runNow":{"kind":"link","url":"https://inngestinngest-production-6a21.up.railway.app","via":"inngest"},"runs":[],"runsResolved":[],"sha256":"fb82b6e4149b8be9916c35694faaeca85b555a6e3044cd3bc35f4d836ce60e49","specPath":"specs/crons/999-multibots-telegraf-check-stuck-trainings.t27","summary":{"en":"Finds model trainings still marked pending or processing past the stuck threshold and reconciles them against Replicate.","ru":"Находит обучения моделей, застрявшие в pending или processing дольше порога, и сверяет их с Replicate."},"typecheckOk":true,"witness":"spec+code"},{"code":{"health":"ok","kind":"inngest","repoPrivate":true,"sourceUrl":"https://github.com/gHashTag/999-multibots-telegraf/blob/3f01d449e5a04d37f6ff4d76d5572f499c201789/src/inngest_app/functions/analytics/dailySalesAdvisor.ts#L56","where":{"file":"src/inngest_app/functions/analytics/dailySalesAdvisor.ts","host":"railway:999-multibots-telegraf","line":56,"service":"inngest"}},"control":"inngest-dashboard","discarded":0,"fields":{"CONTROL":"inngest-dashboard","ENABLED":true,"HOST":"inngest","ID":"inngest/999-multibots-telegraf/daily-sales-advisor","KIND":"cron","NAME":"daily-sales-advisor","NOTE":"One report per owner across all of their bots, assembled from the payments ledger rather than from a balance column.","ON_FAILURE":"log","REPO":"999-multibots-telegraf","RUNS":[],"RUNS_NOTE":"no skill invocation found in source","SCHEDULE":"0 9 * * *","SERVICE":"src/inngest_app/functions/analytics/dailySalesAdvisor.ts","SUMMARY_EN":"Builds every bot owner a morning report of yesterday's revenue, the week's costs and which services their users actually bought.","TZ":"UTC"},"health":"ok","id":"inngest/999-multibots-telegraf/daily-sales-advisor","inSpecCorpus":false,"messages":[],"moduleName":"cron_999_multibots_telegraf_daily_sales_advisor","name":{"en":"daily-sales-advisor"},"runNow":{"kind":"link","url":"https://inngestinngest-production-6a21.up.railway.app","via":"inngest"},"runs":[],"runsResolved":[],"sha256":"0e2f8e5085ed1ea2b4b2f7732c9f9de00fcd19fda8d13e1f735865aa2cd32179","specPath":"specs/crons/999-multibots-telegraf-daily-sales-advisor.t27","summary":{"en":"Builds every bot owner a morning report of yesterday's revenue, the week's costs and which services their users actually bought.","ru":"Собирает каждому владельцу бота утренний отчёт: вчерашняя выручка, расходы недели и что реально покупали пользователи."},"typecheckOk":true,"witness":"spec+code"},{"code":{"health":"ok","kind":"inngest","repoPrivate":true,"sourceUrl":"https://github.com/gHashTag/999-multibots-telegraf/blob/3f01d449e5a04d37f6ff4d76d5572f499c201789/src/inngest_app/functions/monitoring/criticalErrorMonitor.ts#L243","where":{"file":"src/inngest_app/functions/monitoring/criticalErrorMonitor.ts","host":"railway:999-multibots-telegraf","line":243,"service":"inngest"}},"control":"inngest-dashboard","discarded":0,"fields":{"CONTROL":"inngest-dashboard","ENABLED":true,"HOST":"inngest","ID":"inngest/999-multibots-telegraf/health-check","KIND":"cron","NAME":"health-check","ON_FAILURE":"log","REPO":"999-multibots-telegraf","RUNS":[],"RUNS_NOTE":"no skill invocation found in source","SCHEDULE":"*/30 * * * *","SERVICE":"src/inngest_app/functions/monitoring/criticalErrorMonitor.ts","SUMMARY_EN":"Probes the main API and the Inngest service every half hour and reports what answered.","TZ":"UTC"},"health":"ok","id":"inngest/999-multibots-telegraf/health-check","inSpecCorpus":false,"messages":[],"moduleName":"cron_999_multibots_telegraf_health_check","name":{"en":"health-check"},"runNow":{"kind":"link","url":"https://inngestinngest-production-6a21.up.railway.app","via":"inngest"},"runs":[],"runsResolved":[],"sha256":"b1bf93d0a864129e5c53a03b96cfe5d52069b5b65a7472dcef61a58cd6b87e1f","specPath":"specs/crons/999-multibots-telegraf-health-check.t27","summary":{"en":"Probes the main API and the Inngest service every half hour and reports what answered.","ru":"Каждые полчаса опрашивает основной API и сервис Inngest и сообщает, кто ответил."},"typecheckOk":true,"witness":"spec+code"},{"code":{"health":"ok","kind":"inngest","repoPrivate":true,"sourceUrl":"https://github.com/gHashTag/999-multibots-telegraf/blob/3f01d449e5a04d37f6ff4d76d5572f499c201789/src/inngest_app/functions/monitoring/logMonitor.ts#L360","where":{"file":"src/inngest_app/functions/monitoring/logMonitor.ts","host":"railway:999-multibots-telegraf","line":360,"service":"inngest"}},"control":"inngest-dashboard","discarded":0,"fields":{"CONTROL":"inngest-dashboard","ENABLED":true,"HOST":"inngest","ID":"inngest/999-multibots-telegraf/log-monitor","KIND":"cron","NAME":"log-monitor","ON_FAILURE":"log","REPO":"999-multibots-telegraf","RUNS":[],"RUNS_NOTE":"no skill invocation found in source","SCHEDULE":"0 10 * * *","SERVICE":"src/inngest_app/functions/monitoring/logMonitor.ts","SUMMARY_EN":"Reads the application logs once a day, has a model summarise the errors and warnings, and sends the digest to Telegram.","TZ":"UTC"},"health":"ok","id":"inngest/999-multibots-telegraf/log-monitor","inSpecCorpus":false,"messages":[],"moduleName":"cron_999_multibots_telegraf_log_monitor","name":{"en":"log-monitor"},"runNow":{"kind":"link","url":"https://inngestinngest-production-6a21.up.railway.app","via":"inngest"},"runs":[],"runsResolved":[],"sha256":"3f1d2105328665203dc3850fea9f0245b7a6adbe5558e255756d168478812921","specPath":"specs/crons/999-multibots-telegraf-log-monitor.t27","summary":{"en":"Reads the application logs once a day, has a model summarise the errors and warnings, and sends the digest to Telegram.","ru":"Раз в день читает логи приложения, поручает модели свести ошибки и предупреждения и отправляет дайджест в Telegram."},"typecheckOk":true,"witness":"spec+code"},{"code":{"health":"ok","kind":"inngest","repoPrivate":true,"sourceUrl":"https://github.com/gHashTag/999-multibots-telegraf/blob/3f01d449e5a04d37f6ff4d76d5572f499c201789/src/inngest_app/functions/webhookHealthGuard.ts#L218","where":{"file":"src/inngest_app/functions/webhookHealthGuard.ts","host":"railway:999-multibots-telegraf","line":218,"service":"inngest"}},"control":"inngest-dashboard","discarded":0,"fields":{"CONTROL":"inngest-dashboard","ENABLED":true,"HOST":"inngest","ID":"inngest/999-multibots-telegraf/periodic-webhook-health-check","KIND":"cron","NAME":"periodic-webhook-health-check","ON_FAILURE":"log","REPO":"999-multibots-telegraf","RUNS":[],"RUNS_NOTE":"no skill invocation found in source","SCHEDULE":"0 * * * *","SERVICE":"src/inngest_app/functions/webhookHealthGuard.ts","SUMMARY_EN":"Tests both Telegram webhook URLs every hour and sends the admin a critical alarm when neither of them answers.","TZ":"UTC"},"health":"ok","id":"inngest/999-multibots-telegraf/periodic-webhook-health-check","inSpecCorpus":false,"messages":[],"moduleName":"cron_999_multibots_telegraf_periodic_webhook_health_check","name":{"en":"periodic-webhook-health-check"},"runNow":{"kind":"link","url":"https://inngestinngest-production-6a21.up.railway.app","via":"inngest"},"runs":[],"runsResolved":[],"sha256":"a3b21a33a8a8022b527e3f46362fb6df63fb6f2e5ee642a439d88862dd4722f3","specPath":"specs/crons/999-multibots-telegraf-periodic-webhook-health-check.t27","summary":{"en":"Tests both Telegram webhook URLs every hour and sends the admin a critical alarm when neither of them answers.","ru":"Каждый час проверяет оба URL вебхука Telegram и шлёт админу критическую тревогу, когда не отвечает ни один."},"typecheckOk":true,"witness":"spec+code"},{"code":{"health":"ok","kind":"inngest","repoPrivate":true,"sourceUrl":"https://github.com/gHashTag/999-multibots-telegraf/blob/3f01d449e5a04d37f6ff4d76d5572f499c201789/src/inngest_app/functions/analytics/skillDetector.ts#L32","where":{"file":"src/inngest_app/functions/analytics/skillDetector.ts","host":"railway:999-multibots-telegraf","line":32,"service":"inngest"}},"control":"inngest-dashboard","discarded":0,"fields":{"CONTROL":"inngest-dashboard","ENABLED":true,"HOST":"inngest","ID":"inngest/999-multibots-telegraf/skill-detector","KIND":"cron","NAME":"skill-detector","ON_FAILURE":"log","REPO":"999-multibots-telegraf","RUNS":[],"RUNS_NOTE":"the \"skills\" it saves are bot prompt patterns, not Claude Code skills; no skill invocation found in source","SCHEDULE":"0 10 * * *","SERVICE":"src/inngest_app/functions/analytics/skillDetector.ts","SUMMARY_EN":"Mines successful generations for repeated model and prompt patterns once a day and saves the new ones as reusable skills.","TZ":"UTC"},"health":"ok","id":"inngest/999-multibots-telegraf/skill-detector","inSpecCorpus":false,"messages":[],"moduleName":"cron_999_multibots_telegraf_skill_detector","name":{"en":"skill-detector"},"runNow":{"kind":"link","url":"https://inngestinngest-production-6a21.up.railway.app","via":"inngest"},"runs":[],"runsResolved":[],"sha256":"d228015ce607198f53341b0b9dfc55a2cd0616e69487598d0cbabc34cc6892cf","specPath":"specs/crons/999-multibots-telegraf-skill-detector.t27","summary":{"en":"Mines successful generations for repeated model and prompt patterns once a day and saves the new ones as reusable skills.","ru":"Раз в день ищет в успешных генерациях повторяющиеся паттерны моделей и промптов и сохраняет новые как переиспользуемые навыки бота."},"typecheckOk":true,"witness":"spec+code"},{"code":{"health":"warn","kind":"railway-cron","repoPrivate":true,"sourceUrl":null,"where":{"file":null,"host":"railway:jobsearch-cron","line":null,"service":"jobsearch-cron"}},"control":"railway-dashboard","discarded":0,"fields":{"CONTROL":"railway-dashboard","ENABLED":true,"HOST":"railway-cron","ID":"railway-cron/999/jobsearch-cron","KIND":"cron","NAME":"jobsearch-cron","NOTE":"The schedule is configured in the Railway dashboard for project 999 and is not readable from the checkout; the probe below is what this catalog can verify.","ON_FAILURE":"unknown","REPO":"railway","RUNS":[],"RUNS_NOTE":"no skill invocation found in source","SCHEDULE":"","SCHEDULE_NOTE":"configured in the Railway dashboard (project 999); not readable from the checkout","SERVICE":"jobsearch-cron","SUMMARY_EN":"The scheduled job-search service of the Railway project, reachable at cron.t27.ai.","TZ":"UTC"},"health":"ok","id":"railway-cron/999/jobsearch-cron","inSpecCorpus":false,"messages":[],"moduleName":"cron_railway_jobsearch_cron","name":{"en":"jobsearch-cron"},"runNow":{"kind":"link","url":"https://railway.com/project/564d9ebd-7aa8-44fe-93ec-e0b03c87158d/service/3196472e-b885-43e0-b553-0644664e4496","via":"railway"},"runs":[],"runsResolved":[],"sha256":"8729edafdc8239d187c0f2b7d98238438d40ec439b39087e1654bb683366ec3a","specPath":"specs/crons/railway-jobsearch-cron.t27","summary":{"en":"The scheduled job-search service of the Railway project, reachable at cron.t27.ai.","ru":"Сервис поиска вакансий по расписанию в проекте Railway, доступен на cron.t27.ai."},"typecheckOk":true,"witness":"spec+code"},{"code":{"health":"ok","kind":"timer","repoPrivate":true,"sourceUrl":"https://github.com/gHashTag/999-multibots-telegraf/blob/3f01d449e5a04d37f6ff4d76d5572f499c201789/apps/vibee-editor/render/scripts/agent-autopilot.ts#L1118","where":{"file":"apps/vibee-editor/render/scripts/agent-autopilot.ts","host":"railway:vibee-render","line":1118,"service":"render"}},"control":"code-only","discarded":0,"fields":{"CONTROL":"code-only","ENABLED":true,"HOST":"timer","ID":"timer/999-multibots-telegraf/agent-autopilot-L1118","INTERVAL_MS":1800000,"KIND":"cron","NAME":"agent-autopilot-L1118","NOTE":"Daemon mode only, under --loop or AUTOPILOT_LOOP=1; AUTOPILOT_INTERVAL_MS overrides the thirty-minute period, with a one-minute floor.","ON_FAILURE":"log","REPO":"999-multibots-telegraf","RUNS":[],"RUNS_NOTE":"no skill invocation found in source","SERVICE":"apps/vibee-editor/render/scripts/agent-autopilot.ts:1118","SUMMARY_EN":"Runs one autopilot cycle -- the generation pass and then the channel tick -- and skips the tick entirely when the previous cycle is still running.","TZ":"UTC"},"health":"ok","id":"timer/999-multibots-telegraf/agent-autopilot-L1118","inSpecCorpus":false,"messages":[],"moduleName":"cron_999_multibots_telegraf_agent_autopilot_L1118","name":{"en":"agent-autopilot-L1118"},"runNow":{"kind":"disabled","reason":"timer"},"runs":[],"runsResolved":[],"sha256":"39c25a3a6c40cff4e3ad9aa098e7492803a9cc78a935e74966c4f95939c85228","specPath":"specs/crons/999-multibots-telegraf-agent-autopilot-L1118.t27","summary":{"en":"Runs one autopilot cycle -- the generation pass and then the channel tick -- and skips the tick entirely when the previous cycle is still running.","ru":"Один цикл автопилота — проход генерации и затем тик канала; тик пропускается целиком, если предыдущий цикл ещё идёт."},"typecheckOk":true,"witness":"spec+code"},{"code":{"health":"ok","kind":"timer","repoPrivate":true,"sourceUrl":"https://github.com/gHashTag/999-multibots-telegraf/blob/3f01d449e5a04d37f6ff4d76d5572f499c201789/src/services/bot-owner-billing.ts#L474","where":{"file":"src/services/bot-owner-billing.ts","host":"railway:999-multibots-telegraf","line":474,"service":"bot"}},"control":"code-only","discarded":0,"fields":{"CONTROL":"code-only","ENABLED":true,"HOST":"timer","ID":"timer/999-multibots-telegraf/bot-owner-billing-L474","INTERVAL_MS":86400000,"KIND":"cron","NAME":"bot-owner-billing-L474","NOTE":"The first run after a restart is skipped on purpose, and an owner whose payments cannot be read is left alone rather than accused.","ON_FAILURE":"log","REPO":"999-multibots-telegraf","RUNS":[],"RUNS_NOTE":"no skill invocation found in source","SERVICE":"src/services/bot-owner-billing.ts:474","SUMMARY_EN":"Recomputes every bot owner's debt from the payments ledger, warns them at the soft, warning and critical thresholds, and disables a bot that stays critical for three days.","TZ":"UTC"},"health":"ok","id":"timer/999-multibots-telegraf/bot-owner-billing-L474","inSpecCorpus":false,"messages":[],"moduleName":"cron_999_multibots_telegraf_bot_owner_billing_L474","name":{"en":"bot-owner-billing-L474"},"runNow":{"kind":"disabled","reason":"timer"},"runs":[],"runsResolved":[],"sha256":"b2fb3c2d66630369c42ae4aba3f80538661c5591de99f1b088c569185be83197","specPath":"specs/crons/999-multibots-telegraf-bot-owner-billing-L474.t27","summary":{"en":"Recomputes every bot owner's debt from the payments ledger, warns them at the soft, warning and critical thresholds, and disables a bot that stays critical for three days.","ru":"Пересчитывает долг каждого владельца бота по журналу платежей, предупреждает на мягком, тревожном и критическом порогах и отключает бота, три дня остающегося критическим."},"typecheckOk":true,"witness":"spec+code"},{"code":{"health":"ok","kind":"timer","repoPrivate":true,"sourceUrl":"https://github.com/gHashTag/999-multibots-telegraf/blob/3f01d449e5a04d37f6ff4d76d5572f499c201789/src/services/crmProactive.ts#L375","where":{"file":"src/services/crmProactive.ts","host":"railway:999-multibots-telegraf","line":375,"service":"bot"}},"control":"code-only","discarded":0,"fields":{"CONTROL":"code-only","ENABLED":true,"HOST":"timer","ID":"timer/999-multibots-telegraf/crmProactive-L375","INTERVAL_MS":1800000,"KIND":"cron","NAME":"crmProactive-L375","NOTE":"The period is CRM_PROACTIVE_MINUTES from src/index.ts, thirty minutes by default; the first sweep waits two minutes after start.","ON_FAILURE":"log","REPO":"999-multibots-telegraf","RUNS":[],"RUNS_NOTE":"no skill invocation found in source","SERVICE":"src/services/crmProactive.ts:375","SUMMARY_EN":"Runs one proactive seller turn for the owner: walks the CRM queue and puts the next draft card in front of them without being asked.","TZ":"UTC"},"health":"ok","id":"timer/999-multibots-telegraf/crmProactive-L375","inSpecCorpus":false,"messages":[],"moduleName":"cron_999_multibots_telegraf_crmProactive_L375","name":{"en":"crmProactive-L375"},"runNow":{"kind":"disabled","reason":"timer"},"runs":[],"runsResolved":[],"sha256":"68cef02f70476660ff1d1df04010d0a3d6cbe249c35da94d97f4c2a641e57d5e","specPath":"specs/crons/999-multibots-telegraf-crmProactive-L375.t27","summary":{"en":"Runs one proactive seller turn for the owner: walks the CRM queue and puts the next draft card in front of them without being asked.","ru":"Один проактивный ход продавца для владельца: обходит очередь CRM и кладёт перед ним следующую карточку-черновик без просьбы."},"typecheckOk":true,"witness":"spec+code"},{"code":{"health":"ok","kind":"timer","repoPrivate":true,"sourceUrl":"https://github.com/gHashTag/999-multibots-telegraf/blob/3f01d449e5a04d37f6ff4d76d5572f499c201789/apps/vibee-editor/render/generate-jobs.ts#L164","where":{"file":"apps/vibee-editor/render/generate-jobs.ts","host":"railway:vibee-render","line":164,"service":"render"}},"control":"code-only","discarded":0,"fields":{"CONTROL":"code-only","ENABLED":true,"HOST":"timer","ID":"timer/999-multibots-telegraf/generate-jobs-L164","INTERVAL_MS":300000,"KIND":"cron","NAME":"generate-jobs-L164","ON_FAILURE":"log","REPO":"999-multibots-telegraf","RUNS":[],"RUNS_NOTE":"no skill invocation found in source","SERVICE":"apps/vibee-editor/render/generate-jobs.ts:164","SUMMARY_EN":"Sweeps finished generation jobs out of memory an hour after they end, once a caller who lost the connection has had time to collect the result.","TZ":"UTC"},"health":"ok","id":"timer/999-multibots-telegraf/generate-jobs-L164","inSpecCorpus":false,"messages":[],"moduleName":"cron_999_multibots_telegraf_generate_jobs_L164","name":{"en":"generate-jobs-L164"},"runNow":{"kind":"disabled","reason":"timer"},"runs":[],"runsResolved":[],"sha256":"c72b9a7b5fa9804c513eb5c2ebff0868bbf2a7226347826e64bbd34f6bef6475","specPath":"specs/crons/999-multibots-telegraf-generate-jobs-L164.t27","summary":{"en":"Sweeps finished generation jobs out of memory an hour after they end, once a caller who lost the connection has had time to collect the result.","ru":"Через час после завершения выметает из памяти законченные задания генерации, когда потерявший соединение клиент успел забрать результат."},"typecheckOk":true,"witness":"spec+code"},{"code":{"health":"ok","kind":"timer","repoPrivate":true,"sourceUrl":"https://github.com/gHashTag/999-multibots-telegraf/blob/3f01d449e5a04d37f6ff4d76d5572f499c201789/src/handlers/notificationHandler.ts#L318","where":{"file":"src/handlers/notificationHandler.ts","host":"railway:999-multibots-telegraf","line":318,"service":"bot"}},"control":"code-only","discarded":0,"fields":{"CONTROL":"code-only","ENABLED":true,"HOST":"timer","ID":"timer/999-multibots-telegraf/notificationHandler-L318","INTERVAL_MS":60000,"KIND":"cron","NAME":"notificationHandler-L318","NOTE":"Wrapped in an exclusive tick, so two bot processes cannot deliver the same notification twice.","ON_FAILURE":"log","REPO":"999-multibots-telegraf","RUNS":[],"RUNS_NOTE":"no skill invocation found in source","SERVICE":"src/handlers/notificationHandler.ts:318","SUMMARY_EN":"Drains the notification queue and delivers the Telegram messages waiting in it.","TZ":"UTC"},"health":"ok","id":"timer/999-multibots-telegraf/notificationHandler-L318","inSpecCorpus":false,"messages":[],"moduleName":"cron_999_multibots_telegraf_notificationHandler_L318","name":{"en":"notificationHandler-L318"},"runNow":{"kind":"disabled","reason":"timer"},"runs":[],"runsResolved":[],"sha256":"9114a4bdfb275175f60c5a111bdc07bbfcbb62c55a0871176b8f93e3436bdd9f","specPath":"specs/crons/999-multibots-telegraf-notificationHandler-L318.t27","summary":{"en":"Drains the notification queue and delivers the Telegram messages waiting in it.","ru":"Разгружает очередь уведомлений и доставляет ждущие в ней сообщения Telegram."},"typecheckOk":true,"witness":"spec+code"},{"code":{"health":"ok","kind":"timer","repoPrivate":true,"sourceUrl":"https://github.com/gHashTag/999-multibots-telegraf/blob/3f01d449e5a04d37f6ff4d76d5572f499c201789/src/handlers/notificationHandler.ts#L324","where":{"file":"src/handlers/notificationHandler.ts","host":"railway:999-multibots-telegraf","line":324,"service":"bot"}},"control":"code-only","discarded":0,"fields":{"CONTROL":"code-only","ENABLED":true,"HOST":"timer","ID":"timer/999-multibots-telegraf/notificationHandler-L324","INTERVAL_MS":3600000,"KIND":"cron","NAME":"notificationHandler-L324","ON_FAILURE":"log","REPO":"999-multibots-telegraf","RUNS":[],"RUNS_NOTE":"no skill invocation found in source","SERVICE":"src/handlers/notificationHandler.ts:324","SUMMARY_EN":"Deletes notification messages old enough that nobody is going to read them.","TZ":"UTC"},"health":"ok","id":"timer/999-multibots-telegraf/notificationHandler-L324","inSpecCorpus":false,"messages":[],"moduleName":"cron_999_multibots_telegraf_notificationHandler_L324","name":{"en":"notificationHandler-L324"},"runNow":{"kind":"disabled","reason":"timer"},"runs":[],"runsResolved":[],"sha256":"44d2e3c8843519a512128399557c8d7af29ca2491f769f91c845dc44e0b63f9a","specPath":"specs/crons/999-multibots-telegraf-notificationHandler-L324.t27","summary":{"en":"Deletes notification messages old enough that nobody is going to read them.","ru":"Удаляет уведомления, настолько старые, что их уже никто не прочитает."},"typecheckOk":true,"witness":"spec+code"},{"code":{"health":"ok","kind":"timer","repoPrivate":true,"sourceUrl":"https://github.com/gHashTag/999-multibots-telegraf/blob/3f01d449e5a04d37f6ff4d76d5572f499c201789/src/utils/production-monitor.ts#L80","where":{"file":"src/utils/production-monitor.ts","host":"railway:999-multibots-telegraf","line":80,"service":"bot"}},"control":"code-only","discarded":0,"fields":{"CONTROL":"code-only","ENABLED":false,"HOST":"timer","ID":"timer/999-multibots-telegraf/production-monitor-L80","INTERVAL_MS":300000,"KIND":"cron","NAME":"production-monitor-L80","NOTE":"Started only by running this module from the command line with the `monitor` argument; the bot's own entry point never starts it.","ON_FAILURE":"log","REPO":"999-multibots-telegraf","RUNS":[],"RUNS_NOTE":"no skill invocation found in source","SERVICE":"src/utils/production-monitor.ts:80","SUMMARY_EN":"Re-runs the container, nginx, port, domain, webhook and system-resource checks, and applies the fixes that are enabled.","TZ":"UTC"},"health":"ok","id":"timer/999-multibots-telegraf/production-monitor-L80","inSpecCorpus":false,"messages":[],"moduleName":"cron_999_multibots_telegraf_production_monitor_L80","name":{"en":"production-monitor-L80"},"runNow":{"kind":"disabled","reason":"timer"},"runs":[],"runsResolved":[],"sha256":"880d0b6c01b2b1e4cc9bc92c11ef300b8335bdf8ca842308bca7d3fd7e979254","specPath":"specs/crons/999-multibots-telegraf-production-monitor-L80.t27","summary":{"en":"Re-runs the container, nginx, port, domain, webhook and system-resource checks, and applies the fixes that are enabled.","ru":"Повторяет проверки контейнера, nginx, порта, домена, вебхука и ресурсов системы и применяет включённые исправления."},"typecheckOk":true,"witness":"spec+code"},{"code":{"health":"ok","kind":"timer","repoPrivate":true,"sourceUrl":"https://github.com/gHashTag/999-multibots-telegraf/blob/3f01d449e5a04d37f6ff4d76d5572f499c201789/src/services/provider-health-monitor.ts#L344","where":{"file":"src/services/provider-health-monitor.ts","host":"railway:999-multibots-telegraf","line":344,"service":"bot"}},"control":"code-only","discarded":0,"fields":{"CONTROL":"code-only","ENABLED":true,"HOST":"timer","ID":"timer/999-multibots-telegraf/provider-health-monitor-L344","INTERVAL_MS":300000,"KIND":"cron","NAME":"provider-health-monitor-L344","NOTE":"Providers listed in HEALTH_SKIP_PROVIDERS are deliberately not watched and do not raise the alarm.","ON_FAILURE":"log","REPO":"999-multibots-telegraf","RUNS":[],"RUNS_NOTE":"no skill invocation found in source","SERVICE":"src/services/provider-health-monitor.ts:344","SUMMARY_EN":"Checks every AI provider that is not parked and records whether it is currently answering.","TZ":"UTC"},"health":"ok","id":"timer/999-multibots-telegraf/provider-health-monitor-L344","inSpecCorpus":false,"messages":[],"moduleName":"cron_999_multibots_telegraf_provider_health_monitor_L344","name":{"en":"provider-health-monitor-L344"},"runNow":{"kind":"disabled","reason":"timer"},"runs":[],"runsResolved":[],"sha256":"0044630e40dc2673a2d1210e848f1a3cd41cc2b21b541bec98e305f0192a2de7","specPath":"specs/crons/999-multibots-telegraf-provider-health-monitor-L344.t27","summary":{"en":"Checks every AI provider that is not parked and records whether it is currently answering.","ru":"Проверяет каждого не отключённого AI-провайдера и записывает, отвечает ли он сейчас."},"typecheckOk":true,"witness":"spec+code"},{"code":{"health":"ok","kind":"timer","repoPrivate":true,"sourceUrl":"https://github.com/gHashTag/999-multibots-telegraf/blob/3f01d449e5a04d37f6ff4d76d5572f499c201789/apps/vibee-editor/render/render-server.ts#L10845","where":{"file":"apps/vibee-editor/render/render-server.ts","host":"railway:vibee-render","line":10845,"service":"render"}},"control":"code-only","discarded":0,"fields":{"CONTROL":"code-only","ENABLED":true,"HOST":"timer","ID":"timer/999-multibots-telegraf/render-server-L10845","INTERVAL_MS":30000,"KIND":"cron","NAME":"render-server-L10845","ON_FAILURE":"log","REPO":"999-multibots-telegraf","RUNS":[],"RUNS_NOTE":"no skill invocation found in source","SERVICE":"apps/vibee-editor/render/render-server.ts:10845","SUMMARY_EN":"Pings every websocket peer and drops the ones that did not answer the previous round.","TZ":"UTC"},"health":"ok","id":"timer/999-multibots-telegraf/render-server-L10845","inSpecCorpus":false,"messages":[],"moduleName":"cron_999_multibots_telegraf_render_server_L10845","name":{"en":"render-server-L10845"},"runNow":{"kind":"disabled","reason":"timer"},"runs":[],"runsResolved":[],"sha256":"bfcd81ea5f3b3040dccce76d91dd699347e49c2df843529218ee138560e2d924","specPath":"specs/crons/999-multibots-telegraf-render-server-L10845.t27","summary":{"en":"Pings every websocket peer and drops the ones that did not answer the previous round.","ru":"Пингует каждого websocket-пира и отключает тех, кто не ответил в прошлом раунде."},"typecheckOk":true,"witness":"spec+code"},{"code":{"health":"ok","kind":"timer","repoPrivate":true,"sourceUrl":"https://github.com/gHashTag/999-multibots-telegraf/blob/3f01d449e5a04d37f6ff4d76d5572f499c201789/apps/vibee-editor/render/render-server.ts#L2301","where":{"file":"apps/vibee-editor/render/render-server.ts","host":"railway:vibee-render","line":2301,"service":"render"}},"control":"code-only","discarded":0,"fields":{"CONTROL":"code-only","ENABLED":true,"HOST":"timer","ID":"timer/999-multibots-telegraf/render-server-L2301","INTERVAL_MS":60000,"KIND":"cron","NAME":"render-server-L2301","ON_FAILURE":"log","REPO":"999-multibots-telegraf","RUNS":[],"RUNS_NOTE":"no skill invocation found in source","SERVICE":"apps/vibee-editor/render/render-server.ts:2301","SUMMARY_EN":"Removes render jobs older than an hour from the in-memory job map.","TZ":"UTC"},"health":"ok","id":"timer/999-multibots-telegraf/render-server-L2301","inSpecCorpus":false,"messages":[],"moduleName":"cron_999_multibots_telegraf_render_server_L2301","name":{"en":"render-server-L2301"},"runNow":{"kind":"disabled","reason":"timer"},"runs":[],"runsResolved":[],"sha256":"37e3dca7f4836af5ecfde5eaaa2aa993ac19087ac902adbb4015c04527a2af62","specPath":"specs/crons/999-multibots-telegraf-render-server-L2301.t27","summary":{"en":"Removes render jobs older than an hour from the in-memory job map.","ru":"Удаляет из карты в памяти задания рендера старше часа."},"typecheckOk":true,"witness":"spec+code"},{"code":{"health":"ok","kind":"timer","repoPrivate":true,"sourceUrl":"https://github.com/gHashTag/999-multibots-telegraf/blob/3f01d449e5a04d37f6ff4d76d5572f499c201789/apps/vibee-editor/render/render-server.ts#L2325","where":{"file":"apps/vibee-editor/render/render-server.ts","host":"railway:vibee-render","line":2325,"service":"render"}},"control":"code-only","discarded":0,"fields":{"CONTROL":"code-only","ENABLED":true,"HOST":"timer","ID":"timer/999-multibots-telegraf/render-server-L2325","INTERVAL_MS":600000,"KIND":"cron","NAME":"render-server-L2325","NOTE":"Checks often and writes rarely: the cursor lives in the database, because this Railway project has no volume and a deploy wipes local state.","ON_FAILURE":"log","REPO":"999-multibots-telegraf","RUNS":[],"RUNS_NOTE":"no skill invocation found in source","SERVICE":"apps/vibee-editor/render/render-server.ts:2325","SUMMARY_EN":"Reads the hive journal and delivers the queen's report to the keepers, passing alarms straight through and batching ordinary events.","TZ":"UTC"},"health":"ok","id":"timer/999-multibots-telegraf/render-server-L2325","inSpecCorpus":false,"messages":[],"moduleName":"cron_999_multibots_telegraf_render_server_L2325","name":{"en":"render-server-L2325"},"runNow":{"kind":"disabled","reason":"timer"},"runs":[],"runsResolved":[],"sha256":"11b24d4332b7e356f77b233a20d578c3ec31da71ff34be37d16d29d7d4471d5b","specPath":"specs/crons/999-multibots-telegraf-render-server-L2325.t27","summary":{"en":"Reads the hive journal and delivers the queen's report to the keepers, passing alarms straight through and batching ordinary events.","ru":"Читает журнал улья и доставляет отчёт королевы хранителям: тревоги — сразу, обычные события — пакетом."},"typecheckOk":true,"witness":"spec+code"},{"code":{"health":"ok","kind":"timer","repoPrivate":true,"sourceUrl":"https://github.com/gHashTag/999-multibots-telegraf/blob/3f01d449e5a04d37f6ff4d76d5572f499c201789/apps/vibee-editor/render/render-server.ts#L919","where":{"file":"apps/vibee-editor/render/render-server.ts","host":"railway:vibee-render","line":919,"service":"render"}},"control":"code-only","discarded":0,"fields":{"CONTROL":"code-only","ENABLED":true,"HOST":"timer","ID":"timer/999-multibots-telegraf/render-server-L919","INTERVAL_MS":5000,"KIND":"cron","NAME":"render-server-L919","NOTE":"Only starts when a session signing key is configured; a deployed render server refuses to boot without one.","ON_FAILURE":"log","REPO":"999-multibots-telegraf","RUNS":[],"RUNS_NOTE":"no skill invocation found in source","SERVICE":"apps/vibee-editor/render/render-server.ts:919","SUMMARY_EN":"Re-reads the session revocation list from Postgres so a revoked browser session stops being accepted.","TZ":"UTC"},"health":"ok","id":"timer/999-multibots-telegraf/render-server-L919","inSpecCorpus":false,"messages":[],"moduleName":"cron_999_multibots_telegraf_render_server_L919","name":{"en":"render-server-L919"},"runNow":{"kind":"disabled","reason":"timer"},"runs":[],"runsResolved":[],"sha256":"f86d77af65dfb35cc4adf4202c8f06577e82d7856edbcac656ef735eeba19a52","specPath":"specs/crons/999-multibots-telegraf-render-server-L919.t27","summary":{"en":"Re-reads the session revocation list from Postgres so a revoked browser session stops being accepted.","ru":"Перечитывает из Postgres список отозванных сессий, чтобы отозванная сессия браузера перестала приниматься."},"typecheckOk":true,"witness":"spec+code"},{"code":{"health":"ok","kind":"timer","repoPrivate":true,"sourceUrl":"https://github.com/gHashTag/999-multibots-telegraf/blob/3f01d449e5a04d37f6ff4d76d5572f499c201789/src/modules/videoGenerator/taskCache.ts#L27","where":{"file":"src/modules/videoGenerator/taskCache.ts","host":"railway:999-multibots-telegraf","line":27,"service":"bot"}},"control":"code-only","discarded":0,"fields":{"CONTROL":"code-only","ENABLED":true,"HOST":"timer","ID":"timer/999-multibots-telegraf/taskCache-L27","INTERVAL_MS":300000,"KIND":"cron","NAME":"taskCache-L27","ON_FAILURE":"log","REPO":"999-multibots-telegraf","RUNS":[],"RUNS_NOTE":"no skill invocation found in source","SERVICE":"src/modules/videoGenerator/taskCache.ts:27","SUMMARY_EN":"Drops video-generation cache entries past their fifteen-minute lifetime so a finished task cannot block the next request.","TZ":"UTC"},"health":"ok","id":"timer/999-multibots-telegraf/taskCache-L27","inSpecCorpus":false,"messages":[],"moduleName":"cron_999_multibots_telegraf_taskCache_L27","name":{"en":"taskCache-L27"},"runNow":{"kind":"disabled","reason":"timer"},"runs":[],"runsResolved":[],"sha256":"ca7f9a9edce47fe23ef59515d87ba7f391b878a9c5115b43e9c32b4a70fe90db","specPath":"specs/crons/999-multibots-telegraf-taskCache-L27.t27","summary":{"en":"Drops video-generation cache entries past their fifteen-minute lifetime so a finished task cannot block the next request.","ru":"Сбрасывает записи кэша видеогенерации старше пятнадцати минут, чтобы завершённая задача не блокировала следующий запрос."},"typecheckOk":true,"witness":"spec+code"},{"code":{"health":"ok","kind":"timer","repoPrivate":true,"sourceUrl":"https://github.com/gHashTag/999-multibots-telegraf/blob/3f01d449e5a04d37f6ff4d76d5572f499c201789/src/services/video-task-store.ts#L156","where":{"file":"src/services/video-task-store.ts","host":"railway:999-multibots-telegraf","line":156,"service":"bot"}},"control":"code-only","discarded":0,"fields":{"CONTROL":"code-only","ENABLED":true,"HOST":"timer","ID":"timer/999-multibots-telegraf/video-task-store-L156","INTERVAL_MS":600000,"KIND":"cron","NAME":"video-task-store-L156","ON_FAILURE":"log","REPO":"999-multibots-telegraf","RUNS":[],"RUNS_NOTE":"no skill invocation found in source","SERVICE":"src/services/video-task-store.ts:156","SUMMARY_EN":"Forgets video tasks older than an hour and rewrites the store to disk when anything was removed.","TZ":"UTC"},"health":"ok","id":"timer/999-multibots-telegraf/video-task-store-L156","inSpecCorpus":false,"messages":[],"moduleName":"cron_999_multibots_telegraf_video_task_store_L156","name":{"en":"video-task-store-L156"},"runNow":{"kind":"disabled","reason":"timer"},"runs":[],"runsResolved":[],"sha256":"dc4e3d6c76cac57a36074da8a9d6aac8df1f1c55bb68a593c2cadf94c94351b1","specPath":"specs/crons/999-multibots-telegraf-video-task-store-L156.t27","summary":{"en":"Forgets video tasks older than an hour and rewrites the store to disk when anything was removed.","ru":"Забывает видеозадачи старше часа и переписывает хранилище на диск, если что-то было удалено."},"typecheckOk":true,"witness":"spec+code"}],"generatedAt":"2026-09-09T17:14:43.237Z","i18n":[{"bundle":"apps/website/i18n/agents.ru.json","coverage":{"n":33,"total":33},"enabled":true,"fields":["SUMMARY","NAME"],"locale":"ru","missing":[],"scope":["specs/skills","specs/crons","specs/agents","specs/functions","specs/tools"],"sha256":"c8871fb4ccdef8fc3cc2937af5db0e307ab0b62f6a03ece9f4512851ffd64f04","spec":"specs/i18n/agents-ru.t27"}],"version":1} diff --git a/apps/website/public/docs/system-docs.json b/apps/website/public/docs/system-docs.json new file mode 100644 index 0000000000..8d838cf647 --- /dev/null +++ b/apps/website/public/docs/system-docs.json @@ -0,0 +1 @@ +{"chapters":[{"body":{"en":{"lead":[],"sections":[{"blocks":[{"runs":[{"t":"strong","v":"t27"},{"t":"text","v":" is a specification language and a toolchain. A "},{"t":"code","v":".t27"},{"t":"text","v":" file declares behaviour, constants, tests and invariants in one place; the compiler ("},{"t":"code","v":"t27c"},{"t":"text","v":", driven by the "},{"t":"code","v":"tri"},{"t":"text","v":" command) validates the file, generates code for the target backends (Zig, C, Verilog) and runs the tests written inside the spec. The repository "},{"t":"code","v":"gHashTag/t27"},{"t":"text","v":" holds the language, the compiler, the spec corpus and the canon documents that govern how agents and people work in it ("},{"t":"code","v":"SOUL.md"},{"t":"text","v":", "},{"t":"code","v":"AGENTS.md"},{"t":"text","v":", "},{"t":"code","v":"docs/T27-CONSTITUTION.md"},{"t":"text","v":")."}],"type":"p"},{"runs":[{"t":"strong","v":"Trinity"},{"t":"text","v":" is the programme around t27: the GoldenFloat family of numeric formats built on the identity phi^2 + 1/phi^2 = 3, hardware validation of those formats on one FPGA board, and the public site "},{"t":"code","v":"t27.ai"},{"t":"text","v":" (repository "},{"t":"code","v":"gHashTag/trinity"},{"t":"text","v":", "},{"t":"code","v":"apps/website"},{"t":"text","v":") that renders the spec corpus, the skills, the scheduled jobs, the agents and the tools through the real compiler compiled to WebAssembly. The site does not paraphrase the specs; it compiles them in the browser build and shows the verdicts."}],"type":"p"},{"runs":[{"t":"text","v":"The rule that ties the two together is spec-first: project logic originates in "},{"t":"code","v":".t27"},{"t":"text","v":", and host languages -- Rust for the bootstrap compiler, TypeScript for the site, Zig, C and Verilog as generated output -- are subordinate implementations. "},{"t":"code","v":"docs/T27-CONSTITUTION.md"},{"t":"text","v":", Article SSOT-MATH, states it for mathematics and numerics; "},{"t":"code","v":"AGENTS.md"},{"t":"text","v":" section 3 restates it for every change (\"Specs are source of truth\")."}],"type":"p"}],"heading":"What t27 and Trinity are","id":"what-t27-and-trinity-are"},{"blocks":[{"runs":[{"t":"text","v":"Every claim in this documentation carries one of five status tags, and the table the site renders next to this chapter repeats them with their source file:"}],"type":"p"},{"items":[[{"t":"code","v":"[measured]"},{"t":"text","v":" -- a number produced by running something whose output is in a repository or a public CI log, with the command and the commit recorded."}],[{"t":"code","v":"[declared]"},{"t":"text","v":" -- stated in a spec or a canon document; not (yet) exercised by a run."}],[{"t":"code","v":"[specified]"},{"t":"text","v":" -- exists as a "},{"t":"code","v":".t27"},{"t":"text","v":" spec that typechecks; no implementation is claimed."}],[{"t":"code","v":"[external]"},{"t":"text","v":" -- a value taken from a source outside the two repositories; cited, not reproduced here."}],[{"t":"code","v":"[not claimed]"},{"t":"text","v":" -- explicitly outside what the project asserts today."}]],"type":"ul"},{"runs":[{"t":"text","v":"The statements this chapter is prepared to make, with their tags:"}],"type":"p"},{"items":[[{"t":"text","v":"The GoldenFloat catalog holds 83 formats "},{"t":"code","v":"[declared]"},{"t":"text","v":" -- "},{"t":"code","v":"FAMILY_TOTALS.catalog"},{"t":"text","v":" in "},{"t":"code","v":"trinity:apps/website/src/data/siliconHistory.ts"},{"t":"text","v":", transcribed from the hardware conformance report of "},{"t":"code","v":"gHashTag/trinity-fpga"},{"t":"text","v":" (v0.2), which is the published source of every hardware figure on the site."}],[{"t":"text","v":"Hardware numbers exist for a subset of the catalog "},{"t":"code","v":"[measured]"},{"t":"text","v":": at v0.2 the same file records 27 formats at Tier E (public chain: CI run id, bitstream SHA-256, JTAG flash, UART log), 13 with decode in hardware, 7 with ADD and 7 with MUL in hardware, and 62 with a bit-exact software reference. The union of the hardware axes is a smaller number than 83; the exact union is stated in the trinity-fpga report and is not restated here."}],[{"t":"text","v":"Every hardware number was measured on one board "},{"t":"code","v":"[measured]"},{"t":"text","v":": ALINX AX7203, Xilinx Artix-7 "},{"t":"code","v":"xc7a200tfbg484-2"},{"t":"text","v":", open toolchain (yosys, nextpnr-xilinx, Project X-Ray), "},{"t":"code","v":"DEVICE"},{"t":"text","v":" and "},{"t":"code","v":"TOOLCHAIN"},{"t":"text","v":" in the same file."}],[{"t":"text","v":"Skills, crons, agents and tools on the site are generated from "},{"t":"code","v":".t27"},{"t":"text","v":" specs through the vendored compiler wasm "},{"t":"code","v":"[measured]"},{"t":"text","v":": the counts are in the ladder header of every Explorer and in the \"Evidence and witnesses\" chapter; "},{"t":"code","v":"typecheck.ok"},{"t":"text","v":" for each spec is recorded in the JSON the site serves."}]],"type":"ul"}],"heading":"Claims and their status","id":"claims-and-their-status"},{"blocks":[{"runs":[{"t":"text","v":"What the project does "},{"t":"strong","v":"not"},{"t":"text","v":" claim, in its own words:"}],"type":"p"},{"items":[[{"t":"strong","v":"No silicon."},{"t":"text","v":" "},{"t":"code","v":"[not claimed]"},{"t":"text","v":" A SKY130 design was prepared through Tiny Tapeout; the TTSKY26a/TTSKY26b submissions were withdrawn before fabrication and refunded, so no die exists and no measurement on silicon is claimed ("},{"t":"code","v":"trinity:apps/website/src/content/tnf.ts"},{"t":"text","v":", the \"Is this an ASIC result?\" answer). ASIC mapping and multi-corner characterisation are not claimed either. The hardware boundary is the FPGA named above."}],[{"t":"strong","v":"No ranking words."},{"t":"text","v":" The canon forbids \"first\", \"only\", \"best\" and their translations in first-party prose; the site's QA ("},{"t":"code","v":"check:docs"},{"t":"text","v":", "},{"t":"code","v":"check:queen-honesty"},{"t":"text","v":") fails a build that contains them. Comparisons are stated as numbers with a source or not at all."}],[{"t":"strong","v":"The Verilog the t27 compiler emits from a format spec is a module shell"},{"t":"text","v":" -- across the corpus it yields 0 LUTs and 0 flip-flops ("},{"t":"code","v":"siliconHistory.ts"},{"t":"text","v":", provenance note). The silicon results belong to hand-written RTL verified against an independent oracle. The spec and the RTL describe the same format; they are not the same artifact."}],[{"t":"strong","v":"`typecheck.ok` from the wasm is necessary, not sufficient."},{"t":"text","v":" It stays "},{"t":"code","v":"true"},{"t":"text","v":" for a wrong annotation such as "},{"t":"code","v":"str = 5"},{"t":"text","v":"; the site's generators check the field schema of every card on top of it ("},{"t":"code","v":"specs/skills/README.md"},{"t":"text","v":")."}],[{"t":"strong","v":"Two repositories, two lists."},{"t":"text","v":" Tools, agents and jobs of "},{"t":"code","v":"gHashTag/t27"},{"t":"text","v":" and of "},{"t":"code","v":"gHashTag/trinity"},{"t":"text","v":" are recorded under their own "},{"t":"code","v":"REPO"},{"t":"text","v":"; nothing is merged into one list."}]],"type":"ul"}],"heading":"Boundaries","id":"boundaries"},{"blocks":[{"runs":[{"t":"text","v":"The seven chapters are declared in "},{"t":"code","v":"specs/docs/system.t27"},{"t":"text","v":" and one spec per chapter under "},{"t":"code","v":"specs/docs/chapters/"},{"t":"text","v":". Each chapter spec names its "},{"t":"code","v":"SOURCES"},{"t":"text","v":" (the files it quotes), its "},{"t":"code","v":"SECTIONS"},{"t":"text","v":" (the headings of this Markdown, checked at build time), the figure the site draws from data ("},{"t":"code","v":"DIAGRAM"},{"t":"text","v":") and the table it generates from the catalogs ("},{"t":"code","v":"TABLE"},{"t":"text","v":"). The English prose is canonical and lives in "},{"t":"code","v":"docs/system/.md"},{"t":"text","v":" in "},{"t":"code","v":"gHashTag/t27"},{"t":"text","v":"; the Russian text travels through the translation contract "},{"t":"code","v":"specs/i18n/docs-ru.t27"},{"t":"text","v":" and the bundle it names in "},{"t":"code","v":"gHashTag/trinity"},{"t":"text","v":". When the two disagree, English wins."}],"type":"p"},{"runs":[{"t":"text","v":"Every figure on the site carries a caption and a data-source line: the JSON it was drawn from and the commit that JSON was generated at. Every table is generated; none is typed by hand. A number without a source line is a defect -- report it as one."}],"type":"p"}],"heading":"How to read this documentation","id":"how-to-read-this-documentation"}],"title":"The project"},"ru":{"lead":[],"sections":[{"blocks":[{"runs":[{"t":"strong","v":"t27"},{"t":"text","v":" -- язык спецификаций и инструментальная цепочка. Файл "},{"t":"code","v":".t27"},{"t":"text","v":" в одном месте объявляет поведение, константы, тесты и инварианты; компилятор ("},{"t":"code","v":"t27c"},{"t":"text","v":", вызываемый командой "},{"t":"code","v":"tri"},{"t":"text","v":") проверяет файл, порождает код для целевых бэкендов (Zig, C, Verilog) и прогоняет тесты, записанные внутри спецификации. Репозиторий "},{"t":"code","v":"gHashTag/t27"},{"t":"text","v":" хранит язык, компилятор, корпус спецификаций и канонические документы, определяющие, как в нём работают агенты и люди ("},{"t":"code","v":"SOUL.md"},{"t":"text","v":", "},{"t":"code","v":"AGENTS.md"},{"t":"text","v":", "},{"t":"code","v":"docs/T27-CONSTITUTION.md"},{"t":"text","v":")."}],"type":"p"},{"runs":[{"t":"strong","v":"Trinity"},{"t":"text","v":" -- программа вокруг t27: семейство численных форматов GoldenFloat, построенное на тождестве phi^2 + 1/phi^2 = 3, аппаратная проверка этих форматов на одной плате FPGA и публичный сайт "},{"t":"code","v":"t27.ai"},{"t":"text","v":" (репозиторий "},{"t":"code","v":"gHashTag/trinity"},{"t":"text","v":", "},{"t":"code","v":"apps/website"},{"t":"text","v":"), который отображает корпус спецификаций, навыки, расписания, агентов и инструменты через настоящий компилятор, собранный в WebAssembly. Сайт не пересказывает спецификации: он компилирует их при сборке и показывает вердикты."}],"type":"p"},{"runs":[{"t":"text","v":"Правило, связывающее обе части, -- spec-first: логика проекта рождается в "},{"t":"code","v":".t27"},{"t":"text","v":", а языки-хосты -- Rust для бутстрап-компилятора, TypeScript для сайта, Zig, C и Verilog как порождаемый код -- являются подчинёнными реализациями. "},{"t":"code","v":"docs/T27-CONSTITUTION.md"},{"t":"text","v":", статья SSOT-MATH, формулирует это для математики и численных вопросов; "},{"t":"code","v":"AGENTS.md"},{"t":"text","v":", раздел 3, повторяет для любого изменения (\"Specs are source of truth\")."}],"type":"p"}],"heading":"Что такое t27 и Trinity","id":"что-такое-t27-и-trinity"},{"blocks":[{"runs":[{"t":"text","v":"Каждое утверждение в этой документации несёт один из пяти статусных тегов, и таблица, которую сайт выводит рядом с этой главой, повторяет их вместе с файлом-источником:"}],"type":"p"},{"items":[[{"t":"code","v":"[measured]"},{"t":"text","v":" -- число, полученное запуском чего-либо, чей вывод лежит в репозитории или в публичном журнале CI, с записанной командой и коммитом."}],[{"t":"code","v":"[declared]"},{"t":"text","v":" -- заявлено в спецификации или каноническом документе; запуском (пока) не проверено."}],[{"t":"code","v":"[specified]"},{"t":"text","v":" -- существует как спецификация "},{"t":"code","v":".t27"},{"t":"text","v":", проходящая проверку типов; реализация не заявляется."}],[{"t":"code","v":"[external]"},{"t":"text","v":" -- значение взято из источника вне двух репозиториев; цитируется, здесь не воспроизводится."}],[{"t":"code","v":"[not claimed]"},{"t":"text","v":" -- явно вне того, что проект утверждает сегодня."}]],"type":"ul"},{"runs":[{"t":"text","v":"Утверждения, которые эта глава готова сделать, с тегами:"}],"type":"p"},{"items":[[{"t":"text","v":"Каталог GoldenFloat содержит 83 формата "},{"t":"code","v":"[declared]"},{"t":"text","v":" -- "},{"t":"code","v":"FAMILY_TOTALS.catalog"},{"t":"text","v":" в "},{"t":"code","v":"trinity:apps/website/src/data/siliconHistory.ts"},{"t":"text","v":", перенесённый из отчёта об аппаратной конформности "},{"t":"code","v":"gHashTag/trinity-fpga"},{"t":"text","v":" (v0.2), который является опубликованным источником каждой аппаратной цифры на сайте."}],[{"t":"text","v":"Аппаратные числа существуют для подмножества каталога "},{"t":"code","v":"[measured]"},{"t":"text","v":": на v0.2 тот же файл фиксирует 27 форматов на уровне Tier E (публичная цепочка: id запуска CI, SHA-256 битстрима, прошивка по JTAG, журнал UART), 13 с декодированием в железе, 7 с ADD и 7 с MUL в железе и 62 с побитово точной программной моделью. Объединение аппаратных осей меньше 83; точное значение объединения приведено в отчёте trinity-fpga и здесь не повторяется."}],[{"t":"text","v":"Каждое аппаратное число измерено на одной плате "},{"t":"code","v":"[measured]"},{"t":"text","v":": ALINX AX7203, Xilinx Artix-7 "},{"t":"code","v":"xc7a200tfbg484-2"},{"t":"text","v":", открытая цепочка (yosys, nextpnr-xilinx, Project X-Ray), "},{"t":"code","v":"DEVICE"},{"t":"text","v":" и "},{"t":"code","v":"TOOLCHAIN"},{"t":"text","v":" в том же файле."}],[{"t":"text","v":"Навыки, расписания, агенты и инструменты на сайте порождаются из спецификаций "},{"t":"code","v":".t27"},{"t":"text","v":" через вендорный wasm компилятора "},{"t":"code","v":"[measured]"},{"t":"text","v":": счётчики находятся в заголовке-лестнице каждого обозревателя и в главе \"Свидетели и доказательства\"; "},{"t":"code","v":"typecheck.ok"},{"t":"text","v":" каждой спецификации записан в JSON, который сайт отдаёт."}]],"type":"ul"}],"heading":"Утверждения и их статус","id":"утверждения-и-их-статус"},{"blocks":[{"runs":[{"t":"text","v":"Чего проект "},{"t":"strong","v":"не"},{"t":"text","v":" утверждает, его собственными словами:"}],"type":"p"},{"items":[[{"t":"strong","v":"Кремния нет."},{"t":"text","v":" "},{"t":"code","v":"[not claimed]"},{"t":"text","v":" Дизайн под SKY130 был подготовлен через Tiny Tapeout; заявки TTSKY26a/TTSKY26b были отозваны до изготовления с возвратом средств, поэтому кристалла не существует и никакое измерение на кремнии не заявляется ("},{"t":"code","v":"trinity:apps/website/src/content/tnf.ts"},{"t":"text","v":", ответ \"Is this an ASIC result?\"). Отображение в ASIC и многоугловая характеризация также не заявляются. Аппаратная граница -- названная выше FPGA."}],[{"t":"strong","v":"Слов-рейтингов нет."},{"t":"text","v":" Канон запрещает слова-рейтинги -- превосходные и исключающие эпитеты, перечисленные в правилах каталога "},{"t":"code","v":"specs/docs/README.md"},{"t":"text","v":", -- в собственной прозе проекта; контроль качества сайта ("},{"t":"code","v":"check:docs"},{"t":"text","v":", "},{"t":"code","v":"check:queen-honesty"},{"t":"text","v":") роняет сборку, в которой они встречаются. Сравнения даются как числа с источником либо не даются вовсе."}],[{"t":"strong","v":"Verilog, который компилятор t27 порождает из спецификации формата, -- это оболочка модуля"},{"t":"text","v":": по корпусу он даёт 0 LUT и 0 триггеров ("},{"t":"code","v":"siliconHistory.ts"},{"t":"text","v":", примечание о происхождении). Результаты на FPGA принадлежат рукописному RTL, проверенному против независимого оракула. Спецификация и RTL описывают один и тот же формат; это не один и тот же артефакт."}],[{"t":"strong","v":"`typecheck.ok` от wasm необходим, но не достаточен."},{"t":"text","v":" Он остаётся "},{"t":"code","v":"true"},{"t":"text","v":" при неверной аннотации вроде "},{"t":"code","v":"str = 5"},{"t":"text","v":"; генераторы сайта поверх него проверяют схему полей каждой карточки ("},{"t":"code","v":"specs/skills/README.md"},{"t":"text","v":")."}],[{"t":"strong","v":"Два репозитория, два списка."},{"t":"text","v":" Инструменты, агенты и задания "},{"t":"code","v":"gHashTag/t27"},{"t":"text","v":" и "},{"t":"code","v":"gHashTag/trinity"},{"t":"text","v":" записаны под своим "},{"t":"code","v":"REPO"},{"t":"text","v":"; ничего не слито в один список."}]],"type":"ul"}],"heading":"Границы","id":"границы"},{"blocks":[{"runs":[{"t":"text","v":"Семь глав объявлены в "},{"t":"code","v":"specs/docs/system.t27"},{"t":"text","v":" и по одной спецификации на главу в "},{"t":"code","v":"specs/docs/chapters/"},{"t":"text","v":". Каждая спецификация главы называет свои "},{"t":"code","v":"SOURCES"},{"t":"text","v":" (цитируемые файлы), "},{"t":"code","v":"SECTIONS"},{"t":"text","v":" (заголовки этого текста, проверяемые при сборке), фигуру, которую сайт рисует по данным ("},{"t":"code","v":"DIAGRAM"},{"t":"text","v":"), и таблицу, порождаемую из каталогов ("},{"t":"code","v":"TABLE"},{"t":"text","v":"). Английская проза канонична и лежит в "},{"t":"code","v":"docs/system/.md"},{"t":"text","v":" в "},{"t":"code","v":"gHashTag/t27"},{"t":"text","v":"; русский текст идёт через контракт перевода "},{"t":"code","v":"specs/i18n/docs-ru.t27"},{"t":"text","v":" и бандл, который он называет в "},{"t":"code","v":"gHashTag/trinity"},{"t":"text","v":". При расхождении побеждает английский."}],"type":"p"},{"runs":[{"t":"text","v":"Каждая фигура на сайте несёт подпись и строку источника данных: JSON, из которого она нарисована, и коммит, на котором этот JSON порождён. Каждая таблица порождена; ни одна не набрана вручную. Число без строки источника -- дефект; сообщайте о нём как о дефекте."}],"type":"p"}],"heading":"Как читать эту документацию","id":"как-читать-эту-документацию"}]}},"bodyPath":"docs/system/project.md","bodySha256":"0674727c51ecb860eb65e6fe6a21d1ef0e9b5af97bb592d4ea12eefddddce070","diagram":"ladder","discarded":0,"enabled":true,"id":"docs/project","links":{"body":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/docs/system/project.md","spec":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/specs/docs/chapters/project.t27"},"moduleName":"docs_chapter_project","order":1,"sections":[{"heading":{"en":"What t27 and Trinity are","ru":"Что такое t27 и Trinity"},"id":"what-t27-and-trinity-are"},{"heading":{"en":"Claims and their status","ru":"Утверждения и их статус"},"id":"claims-and-their-status"},{"heading":{"en":"Boundaries","ru":"Границы"},"id":"boundaries"},{"heading":{"en":"How to read this documentation","ru":"Как читать эту документацию"},"id":"how-to-read-this-documentation"}],"sha256":"4023211070b18117f67404d4c7941ea02e079d1c07aa41515aee69704bab07a3","sources":[{"kind":"file","path":"SOUL.md","rel":"SOUL.md","repo":"t27","sha256":"cb9b44e13d6d0b314f9626f9cca438e5f17ed6847b194220f9e80b32209e052e","url":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/SOUL.md","where":"vendored"},{"kind":"file","path":"AGENTS.md","rel":"AGENTS.md","repo":"t27","sha256":"1c9b8cce1600d4220d74498d187934e0b935ad1eae6deb9c1b100057ce9ac9e9","url":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/AGENTS.md","where":"vendored"},{"kind":"file","path":"specs/docs/system.t27","rel":"specs/docs/system.t27","repo":"t27","sha256":"ab7ee1773622aa46442aec7aeca5cdd1a1a3c36f6321451a5e426df80a75945b","url":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/specs/docs/system.t27","where":"vendored"},{"kind":"file","path":"trinity:apps/website/src/data/siliconHistory.ts","rel":"apps/website/src/data/siliconHistory.ts","repo":"trinity","sha256":"ee385a57e25ddd1fcdce51c4001c1cd2bbd59ef0adfed104b4119e16b4a00d7c","url":"https://github.com/gHashTag/trinity/blob/da84d38795aa97f9170bb670f04a328032aa6ffe/apps/website/src/data/siliconHistory.ts","where":"checkout"},{"kind":"file","path":"trinity:apps/website/src/content/tnf.ts","rel":"apps/website/src/content/tnf.ts","repo":"trinity","sha256":"ddc16cc35af6fbb9fd2f76866b379afc95577a5cbbfa9e22055996975384312e","url":"https://github.com/gHashTag/trinity/blob/da84d38795aa97f9170bb670f04a328032aa6ffe/apps/website/src/content/tnf.ts","where":"checkout"}],"specPath":"specs/docs/chapters/project.t27","stem":"project","table":{"columns":["tag","claim","sources"],"kind":"claims","note":"","rows":[{"claim":"The GoldenFloat catalog holds 83 formats -- `FAMILY_TOTALS.catalog` in `trinity:apps/website/src/data/siliconHistory.ts`, transcribed from the hardware conformance report of `gHashTag/trinity-fpga` (v0.2), which is th...","sources":["trinity:apps/website/src/data/siliconHistory.ts","gHashTag/trinity-fpga"],"tag":"declared"},{"claim":"Hardware numbers exist for a subset of the catalog: at v0.2 the same file records 27 formats at Tier E (public chain: CI run id, bitstream SHA-256, JTAG flash, UART log), 13 with decode in hardware, 7 with ADD and 7 w...","sources":[],"tag":"measured"},{"claim":"Every hardware number was measured on one board: ALINX AX7203, Xilinx Artix-7 `xc7a200tfbg484-2`, open toolchain (yosys, nextpnr-xilinx, Project X-Ray), `DEVICE` and `TOOLCHAIN` in the same file.","sources":[],"tag":"measured"},{"claim":"Skills, crons, agents and tools on the site are generated from `.t27` specs through the vendored compiler wasm: the counts are in the ladder header of every Explorer and in the \"Evidence and witnesses\" chapter; `typec...","sources":[],"tag":"measured"},{"claim":"No silicon. A SKY130 design was prepared through Tiny Tapeout; the TTSKY26a/TTSKY26b submissions were withdrawn before fabrication and refunded, so no die exists and no measurement on silicon is claimed (`trinity:apps...","sources":["trinity:apps/website/src/content/tnf.ts"],"tag":"not claimed"}],"source":"status-tagged bullets of docs/system/project.md"},"title":{"en":"The project","ru":"Проект"},"typecheckOk":true},{"body":{"en":{"lead":[],"sections":[{"blocks":[{"runs":[{"t":"code","v":"AGENTS.md"},{"t":"text","v":" is the entry point for humans and coding agents; its first section fixes the reading order and which document wins when two disagree:"}],"type":"p"},{"items":[[{"t":"code","v":"SOUL.md"},{"t":"text","v":" -- the canonical constitution: language policy, TDD mandate, validation."}],[{"t":"code","v":"docs/nona-03-manifest/SOUL.md"},{"t":"text","v":" -- the expanded reference; if it conflicts with root "},{"t":"code","v":"SOUL.md"},{"t":"text","v":", root wins."}],[{"t":"code","v":"docs/T27-CONSTITUTION.md"},{"t":"text","v":" -- Articles SSOT-MATH, LANG-EN and DOCS-TREE, and the invariant laws."}],[{"t":"code","v":"TASK.md"},{"t":"text","v":" with "},{"t":"code","v":"docs/coordination/TASK_PROTOCOL.md"},{"t":"text","v":" -- multi-agent coordination, locks, anchor issue."}],[{"t":"text","v":"The nearest "},{"t":"code","v":"OWNERS.md"},{"t":"text","v":" -- domain ownership for the directories you edit."}]],"type":"ol"},{"runs":[{"t":"code","v":"CLAUDE.md"},{"t":"text","v":" adds the operational loop for an autonomous agent and says, in its first line, that repo-specific law always overrides generic tooling defaults. The rest of this chapter quotes these files; the site links each quotation to the file at the commit the documentation was generated from."}],"type":"p"}],"heading":"The constitutional stack","id":"the-constitutional-stack"},{"blocks":[{"runs":[{"t":"code","v":"SOUL.md"},{"t":"text","v":" is organised in articles. The ones every change touches:"}],"type":"p"},{"items":[[{"t":"strong","v":"Article I, The Language Policy."},{"t":"text","v":" Source files must be ASCII-only (U+0000..U+007F); identifiers and comments must be English. The rule names "},{"t":"code","v":".t27"},{"t":"text","v":", "},{"t":"code","v":".tri"},{"t":"text","v":", "},{"t":"code","v":".zig"},{"t":"text","v":", "},{"t":"code","v":".c"},{"t":"text","v":", "},{"t":"code","v":".h"},{"t":"text","v":", "},{"t":"code","v":".v"},{"t":"text","v":" and build scripts. Cyrillic and other non-Latin scripts are forbidden in identifiers and comments unless an Architect-approved exception exists (section 1.1). First-party documentation is English (section 1.2, restated as Article LANG-EN of the constitution)."}],[{"t":"strong","v":"Article II, The TDD Mandate."},{"t":"text","v":" \"Every "},{"t":"code","v":".t27"},{"t":"text","v":" specification MUST contain at least one of\" a "},{"t":"code","v":".test"},{"t":"text","v":" section, an "},{"t":"code","v":".invariant"},{"t":"text","v":" section or a "},{"t":"code","v":".bench"},{"t":"text","v":" section. \"No exceptions. A spec without tests is not a specification -- it is a draft.\" (section 2.1, the Iron Law)."}],[{"t":"strong","v":"Article III, No Prototype Mode."},{"t":"text","v":" There is no "},{"t":"code","v":"--allow-no-tests"},{"t":"text","v":" flag and no grace period; the parser rejects a spec without tests with "},{"t":"code","v":"TDD contract violated"},{"t":"text","v":"."}],[{"t":"strong","v":"Article IV, Validation Requirements."},{"t":"text","v":" Enforcement at parser level, at codegen level and at build time."}],[{"t":"strong","v":"Article V, Amendment Process."},{"t":"text","v":" What can and cannot be amended."}],[{"t":"strong","v":"Article VI, Enforcement."},{"t":"text","v":" Agent compliance, human compliance, automated enforcement."}],[{"t":"strong","v":"Article VII, Sacred Trinity."},{"t":"text","v":" Three pillars: the identity phi^2 + 1/phi^2 = 3, ternary computation, and TDD inside the spec. \"Violating any violates the whole.\""}],[{"t":"strong","v":"Article VIII, NO-NEW-SHELL."},{"t":"text","v":" No new "},{"t":"code","v":"*.sh"},{"t":"text","v":" on the engineering critical path; the permitted exceptions are the exec-only shim "},{"t":"code","v":"scripts/tri"},{"t":"text","v":" and the one-time "},{"t":"code","v":"scripts/setup-git-hooks.sh"},{"t":"text","v":". Section 8.3 extends the rule to Python: validation, conformance gates and doc language checks live in "},{"t":"code","v":"t27c"},{"t":"text","v":" (Rust)."}]],"type":"ul"},{"runs":[{"t":"text","v":"The catalog specs under "},{"t":"code","v":"specs/skills"},{"t":"text","v":", "},{"t":"code","v":"specs/crons"},{"t":"text","v":", "},{"t":"code","v":"specs/agents"},{"t":"text","v":", "},{"t":"code","v":"specs/tools"},{"t":"text","v":" and "},{"t":"code","v":"specs/docs"},{"t":"text","v":" are declarative constant modules and carry no "},{"t":"code","v":".test"},{"t":"text","v":" block; the site's generators check their field schema instead. Whether Article II applies to declarative catalog modules is not decided in "},{"t":"code","v":"SOUL.md"},{"t":"text","v":" today; this documentation records the practice and does not claim a ruling."}],"type":"p"}],"heading":"SOUL articles","id":"soul-articles"},{"blocks":[{"runs":[{"t":"code","v":"docs/T27-CONSTITUTION.md"},{"t":"text","v":", section 2, defines seven Invariant Laws that \"never change without constitutional amendment\". The site renders the table from that file; in short:"}],"type":"p"},{"items":[[{"t":"strong","v":"L1 TRACEABILITY"},{"t":"text","v":" -- no code merged without "},{"t":"code","v":"Closes #N"},{"t":"text","v":"; every PR references an issue. Enforced by "},{"t":"code","v":".github/workflows/issue-gate.yml"},{"t":"text","v":"."}],[{"t":"strong","v":"L2 GENERATION"},{"t":"text","v":" -- files under "},{"t":"code","v":"gen/"},{"t":"text","v":" are generated; edit the "},{"t":"code","v":".t27"},{"t":"text","v":" spec instead."}],[{"t":"strong","v":"L3 PURITY"},{"t":"text","v":" -- ASCII-only identifiers and comments in "},{"t":"code","v":".t27"},{"t":"text","v":", "},{"t":"code","v":".zig"},{"t":"text","v":", "},{"t":"code","v":".v"},{"t":"text","v":", "},{"t":"code","v":".c"},{"t":"text","v":"."}],[{"t":"strong","v":"L4 TESTABILITY"},{"t":"text","v":" -- every "},{"t":"code","v":".t27"},{"t":"text","v":" spec must contain "},{"t":"code","v":"test"},{"t":"text","v":", "},{"t":"code","v":"invariant"},{"t":"text","v":" or "},{"t":"code","v":"bench"},{"t":"text","v":"."}],[{"t":"strong","v":"L5 IDENTITY"},{"t":"text","v":" -- phi^2 = phi + 1 on the reals, hence phi^2 + 1/phi^2 = 3; IEEE binary64 checks use a tolerance."}],[{"t":"strong","v":"L6 CEILING"},{"t":"text","v":" -- "},{"t":"code","v":"conformance/FORMAT-SPEC-001.json"},{"t":"text","v":" and "},{"t":"code","v":"specs/numeric/gf16.t27"},{"t":"text","v":" are the numeric ceiling, never forked."}],[{"t":"strong","v":"L7 UNITY"},{"t":"text","v":" -- no new "},{"t":"code","v":"*.sh"},{"t":"text","v":" on the critical path for validation, generation or data; "},{"t":"code","v":"t27c"},{"t":"text","v":" and "},{"t":"code","v":"tri"},{"t":"text","v":" only."}]],"type":"ul"},{"runs":[{"t":"text","v":"Priority is Asimov-style: L1 > L2 > L3 > L4 > L5 > L6 > L7. \"In conflict scenarios, the higher-priority law prevails.\" The legacy names (ISSUE-GATE, NO-HAND-EDIT-GEN, SOUL-ASCII, TDD-MANDATE, PHI-IDENTITY, TRINITY-SACRED, NO-NEW-SHELL) map one-to-one onto L1..L7 in the constitution's alias index."}],"type":"p"},{"runs":[{"t":"text","v":"One discrepancy is recorded rather than resolved: "},{"t":"code","v":"AGENTS.md"},{"t":"text","v":" section 5 speaks of \"the seven Invariant Laws (L1-L8)\" and writes the priority as \"L1 > ... > L8\", while its table and the constitution define L1..L7 only. No L8 is defined in either file at the commit this documentation was generated from. The figure next to this chapter therefore shows seven laws."}],"type":"p"}],"heading":"Invariant laws and their priority","id":"invariant-laws-and-their-priority"},{"blocks":[{"runs":[{"t":"code","v":"AGENTS.md"},{"t":"text","v":" section 3 lists six non-negotiables, quoted in short:"}],"type":"p"},{"items":[[{"t":"text","v":"Specs are source of truth -- behaviour belongs in "},{"t":"code","v":".t27"},{"t":"text","v":" / "},{"t":"code","v":".tri"},{"t":"text","v":"; generated "},{"t":"code","v":"gen/"},{"t":"text","v":" output is not hand-edited except for documented exceptions."}],[{"t":"text","v":"TDD inside specs -- new or changed specs need "},{"t":"code","v":"test"},{"t":"text","v":", "},{"t":"code","v":"invariant"},{"t":"text","v":" and/or "},{"t":"code","v":"bench"},{"t":"text","v":" where SOUL requires it."}],[{"t":"text","v":"English + ASCII -- first-party Markdown and source comments per LANG-EN and ADR-004."}],[{"t":"text","v":"No new Python on the verification critical path."}],[{"t":"text","v":"Issue gate -- PRs link issues ("},{"t":"code","v":"Closes #N"},{"t":"text","v":") where project policy requires it."}],[{"t":"text","v":"Ring / gold work -- parser, compiler and spec changes follow the golden-rings canon; the compiler seal path is "},{"t":"code","v":"bootstrap/stage0/FROZEN_HASH"},{"t":"text","v":"."}]],"type":"ol"},{"runs":[{"t":"text","v":"Two rules of this documentation's own owner belong beside them, because the site enforces them: no absolute developer home path in any committed file (a checkout is "},{"t":"code","v":"T27_ROOT"},{"t":"text","v":" or "},{"t":"code","v":"git rev-parse --show-toplevel"},{"t":"text","v":"), and no hand edits to generated manifests -- change the spec and regenerate."}],"type":"p"}],"heading":"Non-negotiables for changes","id":"non-negotiables-for-changes"},{"blocks":[{"runs":[{"t":"code","v":"docs/coordination/TASK_PROTOCOL.md"},{"t":"text","v":" governs how several agents work in one tree at the same time. Its artifacts are the root "},{"t":"code","v":"TASK.md"},{"t":"text","v":" (anchor link, protocol version, locks, handoff log, work units) and the protocol document itself. The semantics, in short:"}],"type":"p"},{"items":[[{"t":"strong","v":"Lock (soft)."},{"t":"text","v":" Before editing sensitive paths the active agent should set lock holder, lock scope and lock until in the coordination state; others must not override without a handoff-log entry and an epoch bump. Locks are \"social + procedural\", not file locks."}],[{"t":"strong","v":"Epoch."},{"t":"text","v":" A version counter for the coordination state."}],[{"t":"strong","v":"Handoff log."},{"t":"text","v":" Append-preferred; handoffs are treated \"like narrow API contracts\"."}],[{"t":"strong","v":"Read / write order."},{"t":"text","v":" "},{"t":"code","v":"github-sync.json"},{"t":"text","v":" (queue snapshot), then "},{"t":"code","v":"TASK.md"},{"t":"text","v":" (locks and handoffs), then the anchor issue, then the target issue for the code change (section 4.4)."}]],"type":"ul"},{"runs":[{"t":"text","v":"Validation of "},{"t":"code","v":"TASK.md"},{"t":"text","v":"'s shape is automated (section 5); verification is human plus CI (section 6)."}],"type":"p"}],"heading":"TASK protocol","id":"task-protocol"},{"blocks":[{"runs":[{"t":"text","v":"The issue gate is law L1 in executable form: the constitution names "},{"t":"code","v":".github/workflows/issue-gate.yml"},{"t":"text","v":" as the enforcement of \"no code merged without "},{"t":"code","v":"Closes #N"},{"t":"text","v":"\". Everything the site documents came in through it -- the skills, crons, agents, tools and docs catalogs each have their issue and their "},{"t":"code","v":"docs/now/"},{"t":"text","v":" entry."}],"type":"p"},{"runs":[{"t":"text","v":"The TDD mandate is law L4 and SOUL Article II in executable form: the parser rejects a spec without a "},{"t":"code","v":"test"},{"t":"text","v":", "},{"t":"code","v":"invariant"},{"t":"text","v":" or "},{"t":"code","v":"bench"},{"t":"text","v":" block. For the catalog specs the site adds its own gate on top: a generator that compiles every card through the wasm and fails on a schema violation, an unknown cross-reference, or a binding stated on one side only (an agent that names a tool the tool does not name back, and the reverse)."}],"type":"p"}],"heading":"Issue gate and TDD mandate","id":"issue-gate-and-tdd-mandate"}],"title":"Constitution and the rules of the game for agents"},"ru":{"lead":[],"sections":[{"blocks":[{"runs":[{"t":"code","v":"AGENTS.md"},{"t":"text","v":" -- точка входа для людей и кодирующих агентов; его раздел 1 задаёт порядок чтения и то, какой документ побеждает при расхождении:"}],"type":"p"},{"items":[[{"t":"code","v":"SOUL.md"},{"t":"text","v":" -- каноническая конституция: языковая политика, мандат TDD, валидация."}],[{"t":"code","v":"docs/nona-03-manifest/SOUL.md"},{"t":"text","v":" -- расширенный справочник; при конфликте с корневым "},{"t":"code","v":"SOUL.md"},{"t":"text","v":" побеждает корневой."}],[{"t":"code","v":"docs/T27-CONSTITUTION.md"},{"t":"text","v":" -- статьи SSOT-MATH, LANG-EN и DOCS-TREE и инвариантные законы."}],[{"t":"code","v":"TASK.md"},{"t":"text","v":" вместе с "},{"t":"code","v":"docs/coordination/TASK_PROTOCOL.md"},{"t":"text","v":" -- координация нескольких агентов, блокировки, якорная задача."}],[{"t":"text","v":"Ближайший "},{"t":"code","v":"OWNERS.md"},{"t":"text","v":" -- владение областью для редактируемых каталогов."}]],"type":"ol"},{"runs":[{"t":"code","v":"CLAUDE.md"},{"t":"text","v":" добавляет операционный цикл автономного агента и в своей вводной строке говорит, что закон репозитория всегда перекрывает умолчания общего инструментария. Остальная часть главы цитирует эти файлы; сайт привязывает каждую цитату к файлу на коммите, на котором документация была порождена."}],"type":"p"}],"heading":"Конституционный стек","id":"конституционный-стек"},{"blocks":[{"runs":[{"t":"code","v":"SOUL.md"},{"t":"text","v":" организован статьями. Те, которых касается каждое изменение:"}],"type":"p"},{"items":[[{"t":"strong","v":"Статья I, языковая политика."},{"t":"text","v":" Исходные файлы должны быть только ASCII (U+0000..U+007F); идентификаторы и комментарии -- на английском. Правило называет "},{"t":"code","v":".t27"},{"t":"text","v":", "},{"t":"code","v":".tri"},{"t":"text","v":", "},{"t":"code","v":".zig"},{"t":"text","v":", "},{"t":"code","v":".c"},{"t":"text","v":", "},{"t":"code","v":".h"},{"t":"text","v":", "},{"t":"code","v":".v"},{"t":"text","v":" и сборочные скрипты. Кириллица и другие нелатинские письменности запрещены в идентификаторах и комментариях, если нет исключения, одобренного Архитектором (раздел 1.1). Собственная документация проекта -- на английском (раздел 1.2, повторено как статья LANG-EN конституции)."}],[{"t":"strong","v":"Статья II, мандат TDD."},{"t":"text","v":" \"Every "},{"t":"code","v":".t27"},{"t":"text","v":" specification MUST contain at least one of\" -- секцию "},{"t":"code","v":".test"},{"t":"text","v":", "},{"t":"code","v":".invariant"},{"t":"text","v":" или "},{"t":"code","v":".bench"},{"t":"text","v":". \"No exceptions. A spec without tests is not a specification -- it is a draft.\" (раздел 2.1, Железный закон)."}],[{"t":"strong","v":"Статья III, без режима прототипа."},{"t":"text","v":" Нет флага "},{"t":"code","v":"--allow-no-tests"},{"t":"text","v":" и нет льготного периода; парсер отвергает спецификацию без тестов с ошибкой "},{"t":"code","v":"TDD contract violated"},{"t":"text","v":"."}],[{"t":"strong","v":"Статья IV, требования валидации."},{"t":"text","v":" Контроль на уровне парсера, кодогенерации и сборки."}],[{"t":"strong","v":"Статья V, порядок поправок."},{"t":"text","v":" Что можно и что нельзя менять."}],[{"t":"strong","v":"Статья VI, принуждение."},{"t":"text","v":" Соблюдение агентами, людьми, автоматикой."}],[{"t":"strong","v":"Статья VII, Священная Троица."},{"t":"text","v":" Три опоры: тождество phi^2 + 1/phi^2 = 3, троичные вычисления и TDD внутри спецификации. \"Violating any violates the whole.\""}],[{"t":"strong","v":"Статья VIII, NO-NEW-SHELL."},{"t":"text","v":" Никаких новых "},{"t":"code","v":"*.sh"},{"t":"text","v":" на инженерном критическом пути; допустимые исключения -- шим "},{"t":"code","v":"scripts/tri"},{"t":"text","v":" (только exec) и одноразовый "},{"t":"code","v":"scripts/setup-git-hooks.sh"},{"t":"text","v":". Раздел 8.3 распространяет правило на Python: валидация, шлюзы конформности и проверки языка документации живут в "},{"t":"code","v":"t27c"},{"t":"text","v":" (Rust)."}]],"type":"ul"},{"runs":[{"t":"text","v":"Спецификации каталогов в "},{"t":"code","v":"specs/skills"},{"t":"text","v":", "},{"t":"code","v":"specs/crons"},{"t":"text","v":", "},{"t":"code","v":"specs/agents"},{"t":"text","v":", "},{"t":"code","v":"specs/tools"},{"t":"text","v":" и "},{"t":"code","v":"specs/docs"},{"t":"text","v":" -- декларативные модули констант и не несут блока "},{"t":"code","v":".test"},{"t":"text","v":"; вместо этого генераторы сайта проверяют схему их полей. Применима ли статья II к декларативным модулям каталогов, "},{"t":"code","v":"SOUL.md"},{"t":"text","v":" сегодня не решает; эта документация фиксирует практику и не претендует на постановление."}],"type":"p"}],"heading":"Статьи SOUL","id":"статьи-soul"},{"blocks":[{"runs":[{"t":"code","v":"docs/T27-CONSTITUTION.md"},{"t":"text","v":", раздел 2, определяет семь инвариантных законов, которые \"never change without constitutional amendment\". Сайт выводит таблицу из этого файла; кратко:"}],"type":"p"},{"items":[[{"t":"strong","v":"L1 TRACEABILITY"},{"t":"text","v":" -- код не вливается без "},{"t":"code","v":"Closes #N"},{"t":"text","v":"; каждый PR ссылается на задачу. Контроль -- "},{"t":"code","v":".github/workflows/issue-gate.yml"},{"t":"text","v":"."}],[{"t":"strong","v":"L2 GENERATION"},{"t":"text","v":" -- файлы под "},{"t":"code","v":"gen/"},{"t":"text","v":" порождены; правьте спецификацию "},{"t":"code","v":".t27"},{"t":"text","v":"."}],[{"t":"strong","v":"L3 PURITY"},{"t":"text","v":" -- только ASCII в идентификаторах и комментариях "},{"t":"code","v":".t27"},{"t":"text","v":", "},{"t":"code","v":".zig"},{"t":"text","v":", "},{"t":"code","v":".v"},{"t":"text","v":", "},{"t":"code","v":".c"},{"t":"text","v":"."}],[{"t":"strong","v":"L4 TESTABILITY"},{"t":"text","v":" -- каждая спецификация "},{"t":"code","v":".t27"},{"t":"text","v":" содержит "},{"t":"code","v":"test"},{"t":"text","v":", "},{"t":"code","v":"invariant"},{"t":"text","v":" или "},{"t":"code","v":"bench"},{"t":"text","v":"."}],[{"t":"strong","v":"L5 IDENTITY"},{"t":"text","v":" -- phi^2 = phi + 1 на вещественных числах, откуда phi^2 + 1/phi^2 = 3; проверки в IEEE binary64 используют допуск."}],[{"t":"strong","v":"L6 CEILING"},{"t":"text","v":" -- "},{"t":"code","v":"conformance/FORMAT-SPEC-001.json"},{"t":"text","v":" и "},{"t":"code","v":"specs/numeric/gf16.t27"},{"t":"text","v":" -- численный потолок, никогда не форкается."}],[{"t":"strong","v":"L7 UNITY"},{"t":"text","v":" -- никаких новых "},{"t":"code","v":"*.sh"},{"t":"text","v":" на критическом пути валидации, порождения или данных; только "},{"t":"code","v":"t27c"},{"t":"text","v":" и "},{"t":"code","v":"tri"},{"t":"text","v":"."}]],"type":"ul"},{"runs":[{"t":"text","v":"Приоритет -- в духе Азимова: L1 > L2 > L3 > L4 > L5 > L6 > L7. \"In conflict scenarios, the higher-priority law prevails.\" Прежние имена (ISSUE-GATE, NO-HAND-EDIT-GEN, SOUL-ASCII, TDD-MANDATE, PHI-IDENTITY, TRINITY-SACRED, NO-NEW-SHELL) отображаются один к одному на L1..L7 в индексе псевдонимов конституции."}],"type":"p"},{"runs":[{"t":"text","v":"Одно расхождение фиксируется, а не устраняется: "},{"t":"code","v":"AGENTS.md"},{"t":"text","v":", раздел 5, говорит о \"the seven Invariant Laws (L1-L8)\" и пишет приоритет как \"L1 > ... > L8\", тогда как его таблица и конституция определяют только L1..L7. Ни в одном из файлов на коммите, на котором порождена документация, L8 не определён. Поэтому фигура рядом с этой главой показывает семь законов."}],"type":"p"}],"heading":"Инвариантные законы и их приоритет","id":"инвариантные-законы-и-их-приоритет"},{"blocks":[{"runs":[{"t":"code","v":"AGENTS.md"},{"t":"text","v":", раздел 3, перечисляет шесть неотменяемых требований, кратко:"}],"type":"p"},{"items":[[{"t":"text","v":"Спецификации -- источник истины: поведение живёт в "},{"t":"code","v":".t27"},{"t":"text","v":" / "},{"t":"code","v":".tri"},{"t":"text","v":"; порождённый вывод в "},{"t":"code","v":"gen/"},{"t":"text","v":" не правится вручную, кроме документированных исключений."}],[{"t":"text","v":"TDD внутри спецификаций: новые или изменённые спецификации несут "},{"t":"code","v":"test"},{"t":"text","v":", "},{"t":"code","v":"invariant"},{"t":"text","v":" и/или "},{"t":"code","v":"bench"},{"t":"text","v":" там, где этого требует SOUL."}],[{"t":"text","v":"Английский + ASCII: собственный Markdown и комментарии в коде по LANG-EN и ADR-004."}],[{"t":"text","v":"Никакого нового Python на критическом пути верификации."}],[{"t":"text","v":"Шлюз задач: PR ссылаются на задачи ("},{"t":"code","v":"Closes #N"},{"t":"text","v":") там, где этого требует политика проекта."}],[{"t":"text","v":"Работа с кольцами / золотом: изменения парсера, компилятора и спецификаций следуют канону golden-rings; путь печати компилятора -- "},{"t":"code","v":"bootstrap/stage0/FROZEN_HASH"},{"t":"text","v":"."}]],"type":"ol"},{"runs":[{"t":"text","v":"Два правила владельца этой документации стоят рядом с ними, потому что сайт их проверяет: никаких абсолютных путей домашнего каталога разработчика в закоммиченных файлах (чекаут -- это "},{"t":"code","v":"T27_ROOT"},{"t":"text","v":" или "},{"t":"code","v":"git rev-parse --show-toplevel"},{"t":"text","v":") и никакой ручной правки порождённых манифестов -- меняйте спецификацию и порождайте заново."}],"type":"p"}],"heading":"Неотменяемые требования к изменениям","id":"неотменяемые-требования-к-изменениям"},{"blocks":[{"runs":[{"t":"code","v":"docs/coordination/TASK_PROTOCOL.md"},{"t":"text","v":" определяет, как несколько агентов работают в одном дереве одновременно. Его артефакты -- корневой "},{"t":"code","v":"TASK.md"},{"t":"text","v":" (якорная ссылка, версия протокола, блокировки, журнал передач, единицы работы) и сам документ протокола. Семантика, кратко:"}],"type":"p"},{"items":[[{"t":"strong","v":"Блокировка (мягкая)."},{"t":"text","v":" Перед правкой чувствительных путей активный агент должен выставить держателя, область и срок блокировки в состоянии координации; другие не должны перебивать её без записи в журнале передач и повышения эпохи. Блокировки \"social + procedural\", не файловые."}],[{"t":"strong","v":"Эпоха."},{"t":"text","v":" Счётчик версии состояния координации."}],[{"t":"strong","v":"Журнал передач."},{"t":"text","v":" Предпочтительно дописываемый; передачи трактуются \"like narrow API contracts\"."}],[{"t":"strong","v":"Порядок чтения / записи."},{"t":"text","v":" "},{"t":"code","v":"github-sync.json"},{"t":"text","v":" (снимок очереди), затем "},{"t":"code","v":"TASK.md"},{"t":"text","v":" (блокировки и передачи), затем якорная задача, затем целевая задача для изменения кода (раздел 4.4)."}]],"type":"ul"},{"runs":[{"t":"text","v":"Проверка формы "},{"t":"code","v":"TASK.md"},{"t":"text","v":" автоматизирована (раздел 5); верификация -- человек плюс CI (раздел 6)."}],"type":"p"}],"heading":"Протокол TASK","id":"протокол-task"},{"blocks":[{"runs":[{"t":"text","v":"Шлюз задач -- закон L1 в исполняемой форме: конституция называет "},{"t":"code","v":".github/workflows/issue-gate.yml"},{"t":"text","v":" средством контроля правила \"no code merged without "},{"t":"code","v":"Closes #N"},{"t":"text","v":"\". Всё, что документирует сайт, прошло через него -- каталоги навыков, расписаний, агентов, инструментов и документации имеют свою задачу и свою запись в "},{"t":"code","v":"docs/now/"},{"t":"text","v":"."}],"type":"p"},{"runs":[{"t":"text","v":"Мандат TDD -- закон L4 и статья II SOUL в исполняемой форме: парсер отвергает спецификацию без блока "},{"t":"code","v":"test"},{"t":"text","v":", "},{"t":"code","v":"invariant"},{"t":"text","v":" или "},{"t":"code","v":"bench"},{"t":"text","v":". Для спецификаций каталогов сайт добавляет свой шлюз: генератор компилирует каждую карточку через wasm и роняет сборку при нарушении схемы, неизвестной перекрёстной ссылке или связи, заявленной лишь с одной стороны (агент называет инструмент, а инструмент не называет агента в ответ, и наоборот)."}],"type":"p"}],"heading":"Шлюз задач и мандат TDD","id":"шлюз-задач-и-мандат-tdd"}]}},"bodyPath":"docs/system/rules.md","bodySha256":"fead79216c0c6b88907a51098b2f4664e70efb0f48f5870ebd3e1a54f6cb8e9d","diagram":"law-hierarchy","discarded":0,"enabled":true,"id":"docs/rules","links":{"body":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/docs/system/rules.md","spec":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/specs/docs/chapters/rules.t27"},"moduleName":"docs_chapter_rules","order":2,"sections":[{"heading":{"en":"The constitutional stack","ru":"Конституционный стек"},"id":"the-constitutional-stack"},{"heading":{"en":"SOUL articles","ru":"Статьи SOUL"},"id":"soul-articles"},{"heading":{"en":"Invariant laws and their priority","ru":"Инвариантные законы и их приоритет"},"id":"invariant-laws-and-their-priority"},{"heading":{"en":"Non-negotiables for changes","ru":"Неотменяемые требования к изменениям"},"id":"non-negotiables-for-changes"},{"heading":{"en":"TASK protocol","ru":"Протокол TASK"},"id":"task-protocol"},{"heading":{"en":"Issue gate and TDD mandate","ru":"Шлюз задач и мандат TDD"},"id":"issue-gate-and-tdd-mandate"}],"sha256":"3a27bd5a4d2a3afccb342301f277a906103ff8c6fd802bace787ed808e89e22f","sources":[{"kind":"file","path":"SOUL.md","rel":"SOUL.md","repo":"t27","sha256":"cb9b44e13d6d0b314f9626f9cca438e5f17ed6847b194220f9e80b32209e052e","url":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/SOUL.md","where":"vendored"},{"kind":"file","path":"AGENTS.md","rel":"AGENTS.md","repo":"t27","sha256":"1c9b8cce1600d4220d74498d187934e0b935ad1eae6deb9c1b100057ce9ac9e9","url":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/AGENTS.md","where":"vendored"},{"kind":"file","path":"CLAUDE.md","rel":"CLAUDE.md","repo":"t27","sha256":"b6250fd688a9d794b9eaecebd9882905aa49bfab06616be82211a87fe098656d","url":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/CLAUDE.md","where":"vendored"},{"kind":"file","path":"docs/T27-CONSTITUTION.md","rel":"docs/T27-CONSTITUTION.md","repo":"t27","sha256":"2c06724425f721ef6356edc9a14e4f1af530d1246c5c6a318fd42f59aaa319a5","url":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/docs/T27-CONSTITUTION.md","where":"vendored"},{"kind":"file","path":"docs/coordination/TASK_PROTOCOL.md","rel":"docs/coordination/TASK_PROTOCOL.md","repo":"t27","sha256":"dbbea6fe6eb3ce0df60cf58bb0c2c2973313523a9f9530aa792f07dcb65a38ef","url":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/docs/coordination/TASK_PROTOCOL.md","where":"vendored"}],"specPath":"specs/docs/chapters/rules.t27","stem":"rules","table":{"columns":["law","name","body","enforcement"],"kind":"laws","note":"Priority: L1 > L2 > … > L7","rows":[{"body":"No code merged without `Closes #N` — every PR must reference a GitHub issue","enforcement":"`.github/workflows/issue-gate.yml`","law":"L1","name":"TRACEABILITY"},{"body":"Files under `gen/` are generated; edit the `.t27` spec instead","enforcement":"`./target/release/t27c validate-gen-headers`","law":"L2","name":"GENERATION"},{"body":"All `.t27` / `.zig` / `.v` / `.c` source — ASCII-only identifiers & comments","enforcement":"`SOUL.md`, `ADR-004`, build.rs language checks","law":"L3","name":"PURITY"},{"body":"Every `.t27` spec must contain `test` / `invariant` / `bench`","enforcement":"Ring 037 / #132, parser enforcement","law":"L4","name":"TESTABILITY"},{"body":"**K2 core:** φ² = φ + 1 on ℝ; consequence φ² + φ⁻² = 3; IEEE f64 checks use tolerance","enforcement":"`NUMERIC-CORE-PALETTE-REGISTRY.md`, `specs/math/constants.t27`","law":"L5","name":"IDENTITY"},{"body":"`conformance/FORMAT-SPEC-001.json` + `specs/numeric/gf16.t27` are the numeric ceiling — never forked","enforcement":"SSOT: seal coverage CI","law":"L6","name":"CEILING"},{"body":"No new `*.sh` on the critical path for validation / gen / data","enforcement":"`SOUL.md` Article VIII; `t27c` + `tri` only","law":"L7","name":"UNITY"}],"source":"docs/T27-CONSTITUTION.md, section 2"},"title":{"en":"Constitution and the rules of the game for agents","ru":"Конституция и правила игры для агентов"},"typecheckOk":true},{"body":{"en":{"lead":[{"runs":[{"t":"text","v":"The site orders what the repositories ship into five layers and shows the same ladder in the header of every Explorer: "},{"t":"strong","v":"Specs -> Skills -> Crons -> Agents -> Tools"},{"t":"text","v":". Each layer is a directory of "},{"t":"code","v":".t27"},{"t":"text","v":" files in "},{"t":"code","v":"gHashTag/t27"},{"t":"text","v":", each has a README that states its schema, and each is rendered from those files by one generator through the compiler wasm. The ladder counts on the site are read from the generated JSON at build time; the table next to this chapter shows them for the commit the documentation was generated from."}],"type":"p"}],"sections":[{"blocks":[{"runs":[{"t":"text","v":"The base layer is the "},{"t":"code","v":".t27"},{"t":"text","v":" corpus itself: everything under "},{"t":"code","v":"specs/"},{"t":"text","v":" in "},{"t":"code","v":"gHashTag/t27"},{"t":"text","v":", from the language core and the numeric formats to the catalogs below. The site vendors a byte-identical copy under "},{"t":"code","v":"apps/website/public/t27/files/"},{"t":"text","v":" and compiles every file with the vendored "},{"t":"code","v":"t27_compiler.wasm"},{"t":"text","v":" at build time. The Spec Explorer ("},{"t":"code","v":"#/specs"},{"t":"text","v":") shows each file with its verdict; the manifest that lists them ("},{"t":"code","v":"public/t27/manifest.json"},{"t":"text","v":") is generated and never hand-edited."}],"type":"p"}],"heading":"Specs","id":"specs"},{"blocks":[{"runs":[{"t":"text","v":"A skill is a published procedure an agent can run -- a "},{"t":"code","v":"SKILL.md"},{"t":"text","v":" in one of the repositories. "},{"t":"code","v":"specs/skills/.t27"},{"t":"text","v":" declares each one (KIND, ID, NAME, REPO, SOURCE, SUMMARY_EN, COMMAND, SPECS, TAGS, ENABLED, TIMEOUT_MIN). The witness label on a skill card says how the card relates to the code: "},{"t":"code","v":"spec+code"},{"t":"text","v":" when both the spec and the "},{"t":"code","v":"SKILL.md"},{"t":"text","v":" exist, "},{"t":"code","v":"spec-only"},{"t":"text","v":" when only the spec does, "},{"t":"code","v":"code-only"},{"t":"text","v":" when a skill file has no spec yet. Skill Explorer: "},{"t":"code","v":"#/skills"},{"t":"text","v":"."}],"type":"p"}],"heading":"Skills","id":"skills"},{"blocks":[{"runs":[{"t":"text","v":"A cron is a scheduled job: a workflow schedule, a Railway timer, a daemon loop. "},{"t":"code","v":"specs/crons/.t27"},{"t":"text","v":" declares each (HOST, REPO, SERVICE, INTERVAL_MS, TZ, RUNS, RUNS_NOTE, ENABLED, NOTE, ON_FAILURE, CONTROL). "},{"t":"code","v":"RUNS"},{"t":"text","v":" lists the skill IDs a job invokes, and only where the source shows the invocation; where none is found "},{"t":"code","v":"RUNS"},{"t":"text","v":" is empty and "},{"t":"code","v":"RUNS_NOTE"},{"t":"text","v":" says so (\"no skill invocation found in source\"). The Cron Explorer ("},{"t":"code","v":"#/crons"},{"t":"text","v":") computes the next firing from "},{"t":"code","v":"INTERVAL_MS"},{"t":"text","v":" and "},{"t":"code","v":"TZ"},{"t":"text","v":". A job that runs no skill is a job the site cannot tie to the layers above; that is recorded, not hidden."}],"type":"p"}],"heading":"Crons","id":"crons"},{"blocks":[{"runs":[{"t":"text","v":"The 27 letters of the alphabet, one spec each: "},{"t":"code","v":"specs/agents/.t27"},{"t":"text","v":" with LETTER, ORDINAL, LETTER_NAME, NAME, DOMAIN, ARCHETYPE, REGISTER, LAYER, SUMMARY_EN, the three binding documents (SOUL, AGENTS_DOC, ALPHABET), KEY_FILES, the entry and exit invariants, CLARA_ROLE, SKILLS with SKILLS_NOTE and TOOLS with TOOLS_NOTE. An agent holds a skill or a tool only where a source line binds it -- a "},{"t":"code","v":".claude/agents/*.md"},{"t":"text","v":" file, the alphabet, a phase description -- and the note cites that line or says why the list is empty. The generator fails the build on an unknown skill or tool ID and on a binding stated on one side only. Agent Explorer: "},{"t":"code","v":"#/agents"},{"t":"text","v":". The full table is the next chapter."}],"type":"p"}],"heading":"Agents","id":"agents"},{"blocks":[{"runs":[{"t":"text","v":"What an agent can call: the commands of the "},{"t":"code","v":"tri"},{"t":"text","v":" CLI and the tools of the MCP servers. "},{"t":"code","v":"specs/tools/tri/.t27"},{"t":"text","v":" is read from the clap "},{"t":"code","v":"Commands"},{"t":"text","v":" enum in "},{"t":"code","v":"cli/tri/src/main.rs"},{"t":"text","v":" (one card per variant, with its nested actions and arguments); "},{"t":"code","v":"specs/tools/mcp/.t27"},{"t":"text","v":" from the server sources, manifests and "},{"t":"code","v":".mcp.json"},{"t":"text","v":" entries of both repositories, with the tool names, descriptions and input-schema keys. The witness on a tri card is "},{"t":"code","v":"source-parse"},{"t":"text","v":" (the enum was read at a recorded commit) until someone diffs the list against "},{"t":"code","v":"tri --help"},{"t":"text","v":" and relabels it "},{"t":"code","v":"help-output"},{"t":"text","v":". Servers whose code is a published package outside the repositories carry "},{"t":"code","v":"EXTERNAL = true"},{"t":"text","v":". Tool Explorer: "},{"t":"code","v":"#/tools"},{"t":"text","v":"."}],"type":"p"}],"heading":"Tools","id":"tools"},{"blocks":[{"runs":[{"t":"text","v":"One generator, "},{"t":"code","v":"scripts/agents-from-specs.mjs"},{"t":"text","v":" in "},{"t":"code","v":"gHashTag/trinity"},{"t":"text","v":", reads the vendored "},{"t":"code","v":".t27"},{"t":"text","v":" files, compiles each through the wasm, reads the constants of the compiled module, checks them against the schema of the layer, resolves every cross-reference (skill IDs in crons and agents, tool IDs in agents, agent letters in tools, spec paths in skills), and writes one JSON per layer under "},{"t":"code","v":"public/"},{"t":"text","v":". It runs in "},{"t":"code","v":"prebuild"},{"t":"text","v":", so a spec that does not compile or a reference that does not resolve stops the site from building. No "},{"t":"code","v":".t27"},{"t":"text","v":" is parsed with a regular expression anywhere in that path."}],"type":"p"},{"runs":[{"t":"text","v":"Translations follow the same rule. "},{"t":"code","v":"specs/i18n/-.t27"},{"t":"text","v":" declares which fields of which specs a bundle may translate and where the bundle lives; the bundle ("},{"t":"code","v":"apps/website/i18n/*.json"},{"t":"text","v":") carries the text; the generator checks that every bundle entry names an existing spec and reports coverage. The specs stay English-only."}],"type":"p"}],"heading":"From spec to site","id":"from-spec-to-site"},{"blocks":[{"runs":[{"t":"text","v":"Agents log what happened under "},{"t":"code","v":".trinity/experience/"},{"t":"text","v":" in each repository: episodes as JSON, notes as Markdown. "},{"t":"code","v":"scripts/sync-agents-experience.mjs"},{"t":"text","v":" reads both trees at their current commit and writes "},{"t":"code","v":"public/agents/experience.json"},{"t":"text","v":" with counts per repository and, where an episode names an agent letter, the attribution. At the commit this documentation was generated from no episode is attributed to any letter -- the field the sync looks for is absent from every episode -- and the agent cards say so. The snapshot records the commit of each tree, not the path of the checkout."}],"type":"p"}],"heading":"Experience","id":"experience"}],"title":"The five-layer system"},"ru":{"lead":[{"runs":[{"t":"text","v":"Сайт упорядочивает то, что поставляют репозитории, в пять слоёв и показывает одну и ту же лестницу в заголовке каждого обозревателя: "},{"t":"strong","v":"Specs -> Skills -> Crons -> Agents -> Tools"},{"t":"text","v":". Каждый слой -- каталог файлов "},{"t":"code","v":".t27"},{"t":"text","v":" в "},{"t":"code","v":"gHashTag/t27"},{"t":"text","v":", у каждого есть README со схемой, и каждый отображается из этих файлов одним генератором через wasm компилятора. Счётчики лестницы на сайте читаются из порождённого JSON при сборке; таблица рядом с этой главой показывает их для коммита, на котором порождена документация."}],"type":"p"}],"sections":[{"blocks":[{"runs":[{"t":"text","v":"Базовый слой -- сам корпус "},{"t":"code","v":".t27"},{"t":"text","v":": всё под "},{"t":"code","v":"specs/"},{"t":"text","v":" в "},{"t":"code","v":"gHashTag/t27"},{"t":"text","v":", от ядра языка и численных форматов до каталогов ниже. Сайт хранит побайтово идентичную вендорную копию под "},{"t":"code","v":"apps/website/public/t27/files/"},{"t":"text","v":" и компилирует каждый файл вендорным "},{"t":"code","v":"t27_compiler.wasm"},{"t":"text","v":" при сборке. Обозреватель спецификаций ("},{"t":"code","v":"#/specs"},{"t":"text","v":") показывает каждый файл с его вердиктом; перечисляющий их манифест ("},{"t":"code","v":"public/t27/manifest.json"},{"t":"text","v":") порождается и никогда не правится вручную."}],"type":"p"}],"heading":"Спецификации","id":"спецификации"},{"blocks":[{"runs":[{"t":"text","v":"Навык -- опубликованная процедура, которую может выполнить агент: "},{"t":"code","v":"SKILL.md"},{"t":"text","v":" в одном из репозиториев. "},{"t":"code","v":"specs/skills/.t27"},{"t":"text","v":" объявляет каждый (KIND, ID, NAME, REPO, SOURCE, SUMMARY_EN, COMMAND, SPECS, TAGS, ENABLED, TIMEOUT_MIN). Метка свидетеля на карточке навыка говорит, как карточка соотносится с кодом: "},{"t":"code","v":"spec+code"},{"t":"text","v":", когда есть и спецификация, и "},{"t":"code","v":"SKILL.md"},{"t":"text","v":"; "},{"t":"code","v":"spec-only"},{"t":"text","v":", когда есть только спецификация; "},{"t":"code","v":"code-only"},{"t":"text","v":", когда у файла навыка ещё нет спецификации. Обозреватель навыков: "},{"t":"code","v":"#/skills"},{"t":"text","v":"."}],"type":"p"}],"heading":"Навыки","id":"навыки"},{"blocks":[{"runs":[{"t":"text","v":"Расписание -- запланированное задание: расписание workflow, таймер Railway, цикл демона. "},{"t":"code","v":"specs/crons/.t27"},{"t":"text","v":" объявляет каждое (HOST, REPO, SERVICE, INTERVAL_MS, TZ, RUNS, RUNS_NOTE, ENABLED, NOTE, ON_FAILURE, CONTROL). "},{"t":"code","v":"RUNS"},{"t":"text","v":" перечисляет ID навыков, которые запускает задание, и только там, где источник показывает вызов; где вызова не найдено, "},{"t":"code","v":"RUNS"},{"t":"text","v":" пуст, а "},{"t":"code","v":"RUNS_NOTE"},{"t":"text","v":" говорит об этом (\"no skill invocation found in source\"). Обозреватель расписаний ("},{"t":"code","v":"#/crons"},{"t":"text","v":") вычисляет следующий запуск по "},{"t":"code","v":"INTERVAL_MS"},{"t":"text","v":" и "},{"t":"code","v":"TZ"},{"t":"text","v":". Задание, не запускающее навык, -- это задание, которое сайт не может связать со слоями выше; это записывается, а не скрывается."}],"type":"p"}],"heading":"Расписания","id":"расписания"},{"blocks":[{"runs":[{"t":"text","v":"27 букв алфавита, по одной спецификации на каждую: "},{"t":"code","v":"specs/agents/.t27"},{"t":"text","v":" с LETTER, ORDINAL, LETTER_NAME, NAME, DOMAIN, ARCHETYPE, REGISTER, LAYER, SUMMARY_EN, тремя связывающими документами (SOUL, AGENTS_DOC, ALPHABET), KEY_FILES, входным и выходным инвариантами, CLARA_ROLE, SKILLS с SKILLS_NOTE и TOOLS с TOOLS_NOTE. Агент держит навык или инструмент только там, где его связывает строка источника -- файл "},{"t":"code","v":".claude/agents/*.md"},{"t":"text","v":", алфавит, описание фазы, -- и примечание цитирует эту строку или объясняет, почему список пуст. Генератор роняет сборку на неизвестном ID навыка или инструмента и на связи, заявленной лишь с одной стороны. Обозреватель агентов: "},{"t":"code","v":"#/agents"},{"t":"text","v":". Полная таблица -- в следующей главе."}],"type":"p"}],"heading":"Агенты","id":"агенты"},{"blocks":[{"runs":[{"t":"text","v":"То, что агент может вызвать: команды CLI "},{"t":"code","v":"tri"},{"t":"text","v":" и инструменты серверов MCP. "},{"t":"code","v":"specs/tools/tri/.t27"},{"t":"text","v":" читается из clap-перечисления "},{"t":"code","v":"Commands"},{"t":"text","v":" в "},{"t":"code","v":"cli/tri/src/main.rs"},{"t":"text","v":" (по карточке на вариант, с вложенными действиями и аргументами); "},{"t":"code","v":"specs/tools/mcp/.t27"},{"t":"text","v":" -- из исходников серверов, манифестов и записей "},{"t":"code","v":".mcp.json"},{"t":"text","v":" обоих репозиториев, с именами инструментов, описаниями и ключами входных схем. Свидетель на карточке tri -- "},{"t":"code","v":"source-parse"},{"t":"text","v":" (перечисление прочитано на записанном коммите), пока кто-нибудь не сравнит список с "},{"t":"code","v":"tri --help"},{"t":"text","v":" и не переименует его в "},{"t":"code","v":"help-output"},{"t":"text","v":". Серверы, чей код -- опубликованный пакет вне репозиториев, несут "},{"t":"code","v":"EXTERNAL = true"},{"t":"text","v":". Обозреватель инструментов: "},{"t":"code","v":"#/tools"},{"t":"text","v":"."}],"type":"p"}],"heading":"Инструменты","id":"инструменты"},{"blocks":[{"runs":[{"t":"text","v":"Один генератор, "},{"t":"code","v":"scripts/agents-from-specs.mjs"},{"t":"text","v":" в "},{"t":"code","v":"gHashTag/trinity"},{"t":"text","v":", читает вендорные файлы "},{"t":"code","v":".t27"},{"t":"text","v":", компилирует каждый через wasm, читает константы скомпилированного модуля, сверяет их со схемой слоя, разрешает каждую перекрёстную ссылку (ID навыков в расписаниях и агентах, ID инструментов в агентах, буквы агентов в инструментах, пути спецификаций в навыках) и пишет по одному JSON на слой под "},{"t":"code","v":"public/"},{"t":"text","v":". Он выполняется в "},{"t":"code","v":"prebuild"},{"t":"text","v":", поэтому спецификация, которая не компилируется, или ссылка, которая не разрешается, останавливает сборку сайта. Ни один "},{"t":"code","v":".t27"},{"t":"text","v":" на этом пути не разбирается регулярным выражением."}],"type":"p"},{"runs":[{"t":"text","v":"Переводы следуют тому же правилу. "},{"t":"code","v":"specs/i18n/-.t27"},{"t":"text","v":" объявляет, какие поля каких спецификаций бандл может переводить и где бандл лежит; бандл ("},{"t":"code","v":"apps/website/i18n/*.json"},{"t":"text","v":") несёт текст; генератор проверяет, что каждая запись бандла называет существующую спецификацию, и сообщает покрытие. Спецификации остаются только английскими."}],"type":"p"}],"heading":"От спецификации к сайту","id":"от-спецификации-к-сайту"},{"blocks":[{"runs":[{"t":"text","v":"Агенты записывают, что произошло, под "},{"t":"code","v":".trinity/experience/"},{"t":"text","v":" в каждом репозитории: эпизоды как JSON, заметки как Markdown. "},{"t":"code","v":"scripts/sync-agents-experience.mjs"},{"t":"text","v":" читает оба дерева на их текущем коммите и пишет "},{"t":"code","v":"public/agents/experience.json"},{"t":"text","v":" со счётчиками по репозиториям и, где эпизод называет букву агента, с атрибуцией. На коммите, на котором порождена документация, ни один эпизод не отнесён ни к одной букве -- поле, которое ищет синхронизация, отсутствует в каждом эпизоде, -- и карточки агентов говорят об этом. Снимок записывает коммит каждого дерева, а не путь чекаута."}],"type":"p"}],"heading":"Опыт","id":"опыт"}]}},"bodyPath":"docs/system/layers.md","bodySha256":"a4bdf4dae52581ffa25ff1fc29da858ad54ea5a473310a12e3e3989f7d2eb354","diagram":"skills-crons-agents","discarded":0,"enabled":true,"id":"docs/layers","links":{"body":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/docs/system/layers.md","spec":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/specs/docs/chapters/layers.t27"},"moduleName":"docs_chapter_layers","order":3,"sections":[{"heading":{"en":"Specs","ru":"Спецификации"},"id":"specs"},{"heading":{"en":"Skills","ru":"Навыки"},"id":"skills"},{"heading":{"en":"Crons","ru":"Расписания"},"id":"crons"},{"heading":{"en":"Agents","ru":"Агенты"},"id":"agents"},{"heading":{"en":"Tools","ru":"Инструменты"},"id":"tools"},{"heading":{"en":"From spec to site","ru":"От спецификации к сайту"},"id":"from-spec-to-site"},{"heading":{"en":"Experience","ru":"Опыт"},"id":"experience"}],"sha256":"bd04ddfca63bd0aa7d44a891620563e6c6f17481a536dfcd864878312e939083","sources":[{"kind":"file","path":"specs/skills/README.md","rel":"specs/skills/README.md","repo":"t27","sha256":"ac23eb8d74832014efaf5e65f3da070d999549724e01242cb8784a93ad43d360","url":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/specs/skills/README.md","where":"vendored"},{"kind":"file","path":"specs/crons/README.md","rel":"specs/crons/README.md","repo":"t27","sha256":"4c442342670a5e12ebb54792059f60f9fae56c4a62b277fb7803885cad1b350b","url":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/specs/crons/README.md","where":"vendored"},{"kind":"file","path":"specs/agents/README.md","rel":"specs/agents/README.md","repo":"t27","sha256":"c40833dbc9f271cc92f1e9a848324446429fed52954b53f80c3670bc9da78996","url":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/specs/agents/README.md","where":"vendored"},{"kind":"file","path":"specs/tools/README.md","rel":"specs/tools/README.md","repo":"t27","sha256":"6efa016bcd9643a7be4203afa126d1f8ec967acdb7d78b8640156f303eef2df9","url":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/specs/tools/README.md","where":"vendored"},{"kind":"file","path":"specs/i18n/agents-ru.t27","rel":"specs/i18n/agents-ru.t27","repo":"t27","sha256":"c8871fb4ccdef8fc3cc2937af5db0e307ab0b62f6a03ece9f4512851ffd64f04","url":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/specs/i18n/agents-ru.t27","where":"vendored"}],"specPath":"specs/docs/chapters/layers.t27","stem":"layers","table":{"columns":["layer","dir","count","typecheckOk","source"],"kind":"ladder-counts","note":"","rows":[{"count":760,"dir":"specs/**","layer":"Specs","source":"public/t27/manifest.json","typecheckOk":null},{"count":26,"dir":"specs/skills","layer":"Skills","source":"public/skills/spec-skills.json","typecheckOk":26},{"count":33,"dir":"specs/crons","layer":"Crons","source":"public/crons/spec-crons.json","typecheckOk":33},{"count":27,"dir":"specs/agents","layer":"Agents","source":"public/agents/spec-agents.json","typecheckOk":27},{"count":62,"dir":"specs/tools/{tri,mcp}","layer":"Tools","source":"public/tools/spec-tools.json","typecheckOk":62}],"source":"the four catalog JSON files and public/t27/manifest.json"},"title":{"en":"The five-layer system","ru":"Пятислойная система"},"typecheckOk":true},{"body":{"en":{"lead":[],"sections":[{"blocks":[{"runs":[{"t":"code","v":"docs/agents/AGENTS_ALPHABET.md"},{"t":"text","v":" (v3.0, 2026-04-07) is the canon: \"The Trinity system employs 27 named agents -- corresponding to the 27 registers in "},{"t":"code","v":"isa/registers.t27"},{"t":"text","v":" (Coptic / Trinity alphabet).\" Each agent is bound to a letter and a register, has a domain (physics, numeric, compiler, graph, experience, verdict, bench, DePIN, UI and so on), logs to "},{"t":"code","v":".trinity/experience/"},{"t":"text","v":" and is linked to nodes in "},{"t":"code","v":"graph_v2.json"},{"t":"text","v":"."}],"type":"p"},{"runs":[{"t":"text","v":"The alphabet is read in three layers of nine, which the document also calls nonas:"}],"type":"p"},{"items":[[{"t":"strong","v":"Archetypal, A-I (1-9)"},{"t":"text","v":" -- \"pure concept -- foundation: soul, base, types\". A is the architecture and "},{"t":"code","v":"SOUL.md"},{"t":"text","v":" as primary cause; C the compiler; E the experience; I the ISA."}],[{"t":"strong","v":"Spiritual, J-R (10-18)"},{"t":"text","v":" -- \"inner process -- life of the system: tasks, language, numbers, physics\". L is the language; M the metrics; N the numeric formats; P the physics constants; Q the queue."}],[{"t":"strong","v":"Physical, S-27th (19-27)"},{"t":"text","v":" -- \"manifestation -- proof: standards, verdict, deploy, gift\". S is the specs; T the Queen, who \"puts the final seal on everything\"; V the verdict; W the workflow and tri cell (\"double hash-seal\"); Z the zero-touch UX and docs; the 27th letter, Ti, is security."}]],"type":"ul"},{"runs":[{"t":"text","v":"The same three-by-nine layout organises the documentation tree of the repository ("},{"t":"code","v":"docs/nona-01-foundation/"},{"t":"text","v":", "},{"t":"code","v":"docs/nona-02-organism/"},{"t":"text","v":", "},{"t":"code","v":"docs/nona-03-manifest/"},{"t":"text","v":", Article DOCS-TREE of the constitution) and the ring on the site next to this chapter, where each letter sits at its ordinal and is coloured by its layer."}],"type":"p"}],"heading":"Twenty-seven letters, three nonas","id":"twenty-seven-letters-three-nonas"},{"blocks":[{"runs":[{"t":"text","v":"The table the site renders next to this chapter is generated from "},{"t":"code","v":"public/agents/spec-agents.json"},{"t":"text","v":", which is itself generated from the 27 files "},{"t":"code","v":"specs/agents/.t27"},{"t":"text","v":" through the compiler wasm -- it is not typed here. Per letter it shows the ordinal, the letter name, the domain, the archetype, the register, the layer, and the skills and tools the agent holds with their evidence. The FULL TABLE of the alphabet document (letter, domain, archetype, key files, entry invariant, exit invariant, CLARA role) is the source each spec was transcribed from; the spec's header names the row."}],"type":"p"},{"runs":[{"t":"text","v":"Two conventions of the table are worth stating. A letter's register comes from the schema section of the alphabet document (for example T is R19, V is R21, W is R22); the ordinal is the position in the alphabet, 1..27, so T is 20 and the 27th letter is 27. Where the alphabet document names two agents with the same Greek letter name (C and G are both written \"Gamma\"), the spec keeps the document's spelling and the ID stays unambiguous because it is the Latin letter, "},{"t":"code","v":"t27/C"},{"t":"text","v":" and "},{"t":"code","v":"t27/G"},{"t":"text","v":"."}],"type":"p"}],"heading":"The table","id":"the-table"},{"blocks":[{"runs":[{"t":"text","v":"Beyond the alphabet row, an agent card on the site carries what the other layers say about the letter:"}],"type":"p"},{"items":[[{"t":"strong","v":"Skills"},{"t":"text","v":" -- IDs from "},{"t":"code","v":"specs/skills"},{"t":"text","v":" the agent holds, bound only where a source names the skill. At the commit this documentation was generated from one letter holds skills: T, from "},{"t":"code","v":".claude/agents/trinity.md"},{"t":"text","v":", which names "},{"t":"code","v":"phi-loop"},{"t":"text","v":" and "},{"t":"code","v":"tri-pipeline"},{"t":"text","v":" in its Phase 2 and Phase 4. The other 26 carry an empty list and a note saying which sources were read."}],[{"t":"strong","v":"Tools"},{"t":"text","v":" -- IDs from "},{"t":"code","v":"specs/tools"},{"t":"text","v":" the agent holds, bound in both directions (the tool spec names the letter back). Five commands are bound today: "},{"t":"code","v":"tri gen"},{"t":"text","v":" (C, T), "},{"t":"code","v":"tri test"},{"t":"text","v":" (T, V), "},{"t":"code","v":"tri verdict"},{"t":"text","v":" (V), "},{"t":"code","v":"tri experience"},{"t":"text","v":" (E), "},{"t":"code","v":"tri cell"},{"t":"text","v":" (W); the sources are the phase descriptions of the alphabet document and the "},{"t":"code","v":".claude/agents/*.md"},{"t":"text","v":" files."}],[{"t":"strong","v":"Crons"},{"t":"text","v":" -- jobs whose "},{"t":"code","v":"RUNS"},{"t":"text","v":" names a skill the agent holds; empty while every "},{"t":"code","v":"RUNS"},{"t":"text","v":" is empty."}],[{"t":"strong","v":"Experience"},{"t":"text","v":" -- episodes attributed to the letter in "},{"t":"code","v":".trinity/experience/"},{"t":"text","v":"; none is attributed today, and the card says so rather than showing a number it cannot source."}],[{"t":"strong","v":"Sources"},{"t":"text","v":" -- the three binding documents ("},{"t":"code","v":"SOUL.md"},{"t":"text","v":", "},{"t":"code","v":"AGENTS.md"},{"t":"text","v":", the alphabet) at the pinned commit, and the spec file itself."}]],"type":"ul"}],"heading":"What a card carries","id":"what-a-card-carries"}],"title":"The 27-agent alphabet"},"ru":{"lead":[],"sections":[{"blocks":[{"runs":[{"t":"code","v":"docs/agents/AGENTS_ALPHABET.md"},{"t":"text","v":" (v3.0, 2026-04-07) -- канон: \"The Trinity system employs 27 named agents -- corresponding to the 27 registers in "},{"t":"code","v":"isa/registers.t27"},{"t":"text","v":" (Coptic / Trinity alphabet).\" Каждый агент привязан к букве и регистру, имеет область (физика, численные форматы, компилятор, граф, опыт, вердикт, бенчмарки, DePIN, UI и так далее), пишет в "},{"t":"code","v":".trinity/experience/"},{"t":"text","v":" и связан с узлами "},{"t":"code","v":"graph_v2.json"},{"t":"text","v":"."}],"type":"p"},{"runs":[{"t":"text","v":"Алфавит читается тремя слоями по девять, которые документ также называет нонами:"}],"type":"p"},{"items":[[{"t":"strong","v":"Архетипический, A-I (1-9)"},{"t":"text","v":" -- \"pure concept -- foundation: soul, base, types\". A -- архитектура и "},{"t":"code","v":"SOUL.md"},{"t":"text","v":" как первопричина; C -- компилятор; E -- опыт; I -- ISA."}],[{"t":"strong","v":"Духовный, J-R (10-18)"},{"t":"text","v":" -- \"inner process -- life of the system: tasks, language, numbers, physics\". L -- язык; M -- метрики; N -- численные форматы; P -- физические константы; Q -- очередь."}],[{"t":"strong","v":"Физический, S-27th (19-27)"},{"t":"text","v":" -- \"manifestation -- proof: standards, verdict, deploy, gift\". S -- спецификации; T -- Королева, которая \"puts the final seal on everything\"; V -- вердикт; W -- рабочий процесс и tri cell (\"double hash-seal\"); Z -- zero-touch UX и документация; 27-я буква, Ti, -- безопасность."}]],"type":"ul"},{"runs":[{"t":"text","v":"Та же раскладка три на девять организует дерево документации репозитория ("},{"t":"code","v":"docs/nona-01-foundation/"},{"t":"text","v":", "},{"t":"code","v":"docs/nona-02-organism/"},{"t":"text","v":", "},{"t":"code","v":"docs/nona-03-manifest/"},{"t":"text","v":", статья DOCS-TREE конституции) и кольцо на сайте рядом с этой главой, где каждая буква стоит на своём порядковом номере и окрашена по слою."}],"type":"p"}],"heading":"Двадцать семь букв, три ноны","id":"двадцать-семь-букв-три-ноны"},{"blocks":[{"runs":[{"t":"text","v":"Таблица, которую сайт выводит рядом с этой главой, порождается из "},{"t":"code","v":"public/agents/spec-agents.json"},{"t":"text","v":", который сам порождён из 27 файлов "},{"t":"code","v":"specs/agents/.t27"},{"t":"text","v":" через wasm компилятора, -- она не набрана здесь. По каждой букве показаны порядковый номер, имя буквы, область, архетип, регистр, слой и навыки и инструменты, которые агент держит, с их свидетельствами. FULL TABLE документа алфавита (буква, область, архетип, ключевые файлы, входной инвариант, выходной инвариант, роль CLARA) -- источник, из которого перенесена каждая спецификация; заголовок спецификации называет строку."}],"type":"p"},{"runs":[{"t":"text","v":"Две условности таблицы стоит назвать. Регистр буквы берётся из раздела схемы документа алфавита (например, T -- R19, V -- R21, W -- R22); порядковый номер -- позиция в алфавите, 1..27, так что T -- 20, а 27-я буква -- 27. Где документ алфавита называет двух агентов одним греческим именем (C и G оба записаны как \"Gamma\"), спецификация сохраняет написание документа, а ID остаётся однозначным, потому что это латинская буква: "},{"t":"code","v":"t27/C"},{"t":"text","v":" и "},{"t":"code","v":"t27/G"},{"t":"text","v":"."}],"type":"p"}],"heading":"Таблица","id":"таблица"},{"blocks":[{"runs":[{"t":"text","v":"Помимо строки алфавита, карточка агента на сайте несёт то, что говорят о букве другие слои:"}],"type":"p"},{"items":[[{"t":"strong","v":"Навыки"},{"t":"text","v":" -- ID из "},{"t":"code","v":"specs/skills"},{"t":"text","v":", которые агент держит, связанные только там, где источник называет навык. На коммите, на котором порождена документация, навыки держит одна буква: T, из "},{"t":"code","v":".claude/agents/trinity.md"},{"t":"text","v":", который называет "},{"t":"code","v":"phi-loop"},{"t":"text","v":" и "},{"t":"code","v":"tri-pipeline"},{"t":"text","v":" в своих фазах 2 и 4. Остальные 26 несут пустой список и примечание о том, какие источники были прочитаны."}],[{"t":"strong","v":"Инструменты"},{"t":"text","v":" -- ID из "},{"t":"code","v":"specs/tools"},{"t":"text","v":", которые агент держит, связанные в обе стороны (спецификация инструмента называет букву в ответ). Сегодня связаны пять команд: "},{"t":"code","v":"tri gen"},{"t":"text","v":" (C, T), "},{"t":"code","v":"tri test"},{"t":"text","v":" (T, V), "},{"t":"code","v":"tri verdict"},{"t":"text","v":" (V), "},{"t":"code","v":"tri experience"},{"t":"text","v":" (E), "},{"t":"code","v":"tri cell"},{"t":"text","v":" (W); источники -- описания фаз документа алфавита и файлы "},{"t":"code","v":".claude/agents/*.md"},{"t":"text","v":"."}],[{"t":"strong","v":"Расписания"},{"t":"text","v":" -- задания, чей "},{"t":"code","v":"RUNS"},{"t":"text","v":" называет навык, который агент держит; пусто, пока каждый "},{"t":"code","v":"RUNS"},{"t":"text","v":" пуст."}],[{"t":"strong","v":"Опыт"},{"t":"text","v":" -- эпизоды, отнесённые к букве в "},{"t":"code","v":".trinity/experience/"},{"t":"text","v":"; сегодня не отнесён ни один, и карточка говорит об этом, а не показывает число без источника."}],[{"t":"strong","v":"Источники"},{"t":"text","v":" -- три связывающих документа ("},{"t":"code","v":"SOUL.md"},{"t":"text","v":", "},{"t":"code","v":"AGENTS.md"},{"t":"text","v":", алфавит) на закреплённом коммите и сам файл спецификации."}]],"type":"ul"}],"heading":"Что несёт карточка","id":"что-несёт-карточка"}]}},"bodyPath":"docs/system/alphabet.md","bodySha256":"a057cf483f6fccd642ff41bc56a22c8f214204494a0a17918a4e2a4dc1329af6","diagram":"agent-ring","discarded":0,"enabled":true,"id":"docs/alphabet","links":{"body":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/docs/system/alphabet.md","spec":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/specs/docs/chapters/alphabet.t27"},"moduleName":"docs_chapter_alphabet","order":4,"sections":[{"heading":{"en":"Twenty-seven letters, three nonas","ru":"Двадцать семь букв, три ноны"},"id":"twenty-seven-letters-three-nonas"},{"heading":{"en":"The table","ru":"Таблица"},"id":"the-table"},{"heading":{"en":"What a card carries","ru":"Что несёт карточка"},"id":"what-a-card-carries"}],"sha256":"d3be190095b4141b094dd75baaf76f725478eb18f8709f08fa600055ab3d782f","sources":[{"kind":"file","path":"docs/agents/AGENTS_ALPHABET.md","rel":"docs/agents/AGENTS_ALPHABET.md","repo":"t27","sha256":"c99352b305322031ee8af0c4777ae54c52ef50c694ff2aa0f4d95ab2fa82734a","url":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/docs/agents/AGENTS_ALPHABET.md","where":"vendored"},{"kind":"file","path":"specs/agents/README.md","rel":"specs/agents/README.md","repo":"t27","sha256":"c40833dbc9f271cc92f1e9a848324446429fed52954b53f80c3670bc9da78996","url":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/specs/agents/README.md","where":"vendored"}],"specPath":"specs/docs/chapters/alphabet.t27","stem":"alphabet","table":{"columns":["letter","ordinal","letterName","domain","archetype","register","layer","skills","tools"],"kind":"agents","note":"","rows":[{"archetype":"Bull - leader, primary force","domain":"Architecture / ADR / SOUL","enabled":true,"episodes":0,"layer":"Archetypal","letter":"A","letterName":"Alpha","name":"Alpha (Architecture)","ordinal":1,"register":"R0","skills":[],"tools":[]},{"archetype":"House - container, dwelling","domain":"Build / Pipeline","enabled":true,"episodes":0,"layer":"Archetypal","letter":"B","letterName":"Beta","name":"Beta (Build)","ordinal":2,"register":"R1","skills":[],"tools":[]},{"archetype":"Camel - carrier across borders","domain":"Compiler Core / AR Language","enabled":true,"episodes":0,"layer":"Archetypal","letter":"C","letterName":"Gamma","name":"Gamma (Compiler Core)","ordinal":3,"register":"R2","skills":[],"tools":["tri/gen"]},{"archetype":"Door - transition between worlds","domain":"De-Zigfication / Migration","enabled":true,"episodes":0,"layer":"Archetypal","letter":"D","letterName":"Delta","name":"Delta (De-Zigfication)","ordinal":4,"register":"R3","skills":[],"tools":[]},{"archetype":"Window - view into the past","domain":"Experience / XAI","enabled":true,"episodes":0,"layer":"Archetypal","letter":"E","letterName":"Epsilon","name":"Epsilon (Experience)","ordinal":5,"register":"R4","skills":[],"tools":["tri/experience"]},{"archetype":"Nail - connection, binding","domain":"Formal Conformance","enabled":true,"episodes":0,"layer":"Archetypal","letter":"F","letterName":"Phi","name":"Phi (Formal Conformance)","ordinal":6,"register":"R5","skills":[],"tools":[]},{"archetype":"Return - feedback","domain":"Graph / ArchBench","enabled":true,"episodes":0,"layer":"Archetypal","letter":"G","letterName":"Gamma (var.)","name":"Gamma (Graph)","ordinal":7,"register":"R6","skills":[],"tools":[]},{"archetype":"Fence - boundary, life","domain":"HSLM / NN Architectures","enabled":true,"episodes":0,"layer":"Archetypal","letter":"H","letterName":"Eta","name":"Eta (HSLM)","ordinal":8,"register":"R7","skills":[],"tools":[]},{"archetype":"Hand - action, point","domain":"ISA / Registers","enabled":true,"episodes":0,"layer":"Archetypal","letter":"I","letterName":"Iota","name":"Iota (ISA)","ordinal":9,"register":"R8","skills":[],"tools":[]},{"archetype":"Hand with grip - dispatcher","domain":"Jobs / Task Routing","enabled":true,"episodes":0,"layer":"Spiritual","letter":"J","letterName":"Iota-extended","name":"Iota-extended (Jobs)","ordinal":10,"register":"R9","skills":[],"tools":[]},{"archetype":"Palm - open hand","domain":"Kernel / FPGA MAC","enabled":true,"episodes":0,"layer":"Spiritual","letter":"K","letterName":"Kappa","name":"Kappa (Kernel)","ordinal":11,"register":"R10","skills":[],"tools":[]},{"archetype":"Staff - teacher, guide","domain":"Language / Syntax vNEXT","enabled":true,"episodes":0,"layer":"Spiritual","letter":"L","letterName":"Lambda","name":"Lambda (Language)","ordinal":12,"register":"R11","skills":[],"tools":[]},{"archetype":"Water - flow of data","domain":"Metrics / Telemetry","enabled":true,"episodes":0,"layer":"Spiritual","letter":"M","letterName":"Mu","name":"Mu (Metrics)","ordinal":13,"register":"R12","skills":[],"tools":[]},{"archetype":"Fish - offspring, multiplication","domain":"Numeric / GoldenFloat","enabled":true,"episodes":0,"layer":"Spiritual","letter":"N","letterName":"Nu","name":"Nu (Numeric)","ordinal":14,"register":"R13","skills":[],"tools":[]},{"archetype":"Eye - all-seeing oko","domain":"Orchestration / Phases","enabled":true,"episodes":0,"layer":"Spiritual","letter":"O","letterName":"Omicron","name":"Omicron (Orchestration)","ordinal":15,"register":"R14","skills":[],"tools":[]},{"archetype":"Mouth - speech of universe","domain":"Physics / SacredPhysics","enabled":true,"episodes":0,"layer":"Spiritual","letter":"P","letterName":"Pi","name":"Pi (Physics)","ordinal":16,"register":"R15","skills":[],"tools":[]},{"archetype":"Needle's eye - bottleneck","domain":"Queue / Scheduling","enabled":true,"episodes":0,"layer":"Spiritual","letter":"Q","letterName":"Theta","name":"Theta (Queue)","ordinal":17,"register":"R16","skills":[],"tools":[]},{"archetype":"Head - beginning of execution","domain":"Runtime / Bootstrap","enabled":true,"episodes":0,"layer":"Spiritual","letter":"R","letterName":"Rho","name":"Rho (Runtime)","ordinal":18,"register":"R17","skills":[],"tools":[]},{"archetype":"Teeth - sharpness, flame","domain":"Specs / Standardization / AR Specs","enabled":true,"episodes":0,"layer":"Physical","letter":"S","letterName":"Sigma","name":"Sigma (Specs)","ordinal":19,"register":"R18","skills":[],"tools":[]},{"archetype":"CROSS - seal, signature, truth","domain":"Queen / Lotus Orchestrator","enabled":true,"episodes":0,"layer":"Physical","letter":"T","letterName":"Tau","name":"Tau (TRINITY Queen)","ordinal":20,"register":"R19","skills":["t27/phi-loop","t27/tri-pipeline"],"tools":["tri/gen","tri/test"]},{"archetype":"Fork - branching","domain":"Universe Levels / Domains","enabled":true,"episodes":0,"layer":"Physical","letter":"U","letterName":"Upsilon","name":"Upsilon (Universe)","ordinal":21,"register":"R20","skills":[],"tools":[]},{"archetype":"Hook - connection, conjunction","domain":"Verdict / Bench / AR Validation","enabled":true,"episodes":0,"layer":"Physical","letter":"V","letterName":"Vau (var.)","name":"Vau (Verdict)","ordinal":22,"register":"R21","skills":[],"tools":["tri/test","tri/verdict"]},{"archetype":"Double hook - double seal","domain":"Workflow / tri cell","enabled":true,"episodes":0,"layer":"Physical","letter":"W","letterName":"Double-Vav","name":"Double-Vav (Workflow)","ordinal":23,"register":"R22","skills":[],"tools":["tri/cell"]},{"archetype":"Intersection - point of exchange","domain":"External Bindings / Interop","enabled":true,"episodes":0,"layer":"Physical","letter":"X","letterName":"Chi","name":"Chi (External)","ordinal":24,"register":"R23","skills":[],"tools":[]},{"archetype":"Merging paths - evolutionary selection","domain":"Yield / DePIN / Fitness","enabled":true,"episodes":0,"layer":"Physical","letter":"Y","letterName":"Psi","name":"Psi (Yield/DePIN)","ordinal":25,"register":"R24","skills":[],"tools":[]},{"archetype":"Sword - cutting edge, point","domain":"Zero-Touch UX / Docs","enabled":true,"episodes":0,"layer":"Physical","letter":"Z","letterName":"Zeta","name":"Zeta (Zero-Touch)","ordinal":26,"register":"R25","skills":[],"tools":[]},{"archetype":"Egyptian cross - \"sacred gift\"","domain":"Security / Reserve","enabled":false,"episodes":0,"layer":"Physical","letter":"TI","letterName":"Ti","name":"Ti (Security)","ordinal":27,"register":"R26","skills":[],"tools":[]}],"source":"public/agents/spec-agents.json"},"title":{"en":"The 27-agent alphabet","ru":"Алфавит из 27 агентов"},"typecheckOk":true},{"body":{"en":{"lead":[],"sections":[{"blocks":[{"runs":[{"t":"text","v":"Agent T, the Queen, is the central orchestrator: \"reads "},{"t":"code","v":"graph_v2.json"},{"t":"text","v":" and knows all module dependencies\", \"conducts 26 sub-agents (A..Z, except T) by their domains\", gathers results, validates architecture invariants and enforces that the source of truth is in "},{"t":"code","v":".t27"},{"t":"text","v":" / "},{"t":"code","v":".tri"},{"t":"text","v":" with Zig, Verilog and C only as backends ("},{"t":"code","v":"docs/agents/AGENTS_ALPHABET.md"},{"t":"text","v":", section \"AGENT T -- QUEEN TRINITY\", Responsibilities). Her module is "},{"t":"code","v":"specs/queen/lotus.t27"},{"t":"text","v":"."}],"type":"p"},{"runs":[{"t":"text","v":"The alphabet document draws the cycle she runs as six phases and a seventh added by the SOUL law on git. The site renders the cycle from that document; in short:"}],"type":"p"},{"items":[[{"t":"strong","v":"PLAN"},{"t":"text","v":" -- analyse the task and select a strategy; read "},{"t":"code","v":"graph_v2.json"},{"t":"text","v":" for impact; decide which agents participate; check "},{"t":"code","v":".trinity/experience/"},{"t":"text","v":" for similar tasks."}],[{"t":"strong","v":"ASSIGN"},{"t":"text","v":" -- distribute tasks to agents by domain (A architecture, N numeric, P physics, F conformance, ...); set dependencies; create a tri cell for each agent (W seals)."}],[{"t":"strong","v":"RUN"},{"t":"text","v":" -- parallel execution; heartbeats; agents report to "},{"t":"code","v":".trinity/agent_events.jsonl"},{"t":"text","v":"; T redistributes if necessary."}],[{"t":"strong","v":"TEST & BENCH"},{"t":"text","v":" -- F checks conformance vectors, V runs benchmarks, G measures impact changes; metrics are collected in M for V's verdict."}],[{"t":"strong","v":"VERDICT"},{"t":"text","v":" -- V analyses the metrics; "},{"t":"code","v":"tri verdict --toxic"},{"t":"text","v":" asks whether the change is toxic; E records the experience; if toxic, Q blocks the task."}],[{"t":"strong","v":"EVOLVE"},{"t":"text","v":" -- update "},{"t":"code","v":"graph_v2.json"},{"t":"text","v":" if dependencies changed; update experience in E and M; S updates standards; W seals the tri-cell commit; Z updates documentation; T puts the final TAW seal."}],[{"t":"strong","v":"GIT WORKFLOW"},{"t":"text","v":" (\"new -- SOUL law\") -- "},{"t":"code","v":"tri git commit --all -m \"cell:{id} issue:{N} ...\""},{"t":"text","v":", "},{"t":"code","v":"tri git push origin HEAD"},{"t":"text","v":" in strict mode; checks: sealed cell, non-toxic verdict, artifacts; the registry records the commit hash and the pushed flag."}]],"type":"ol"},{"runs":[{"t":"text","v":"The document's SOUL law for TDD follows the seventh phase: \"Any P0/P1 episode in "},{"t":"code","v":"--strict"},{"t":"text","v":" mode is considered COMPLETE only after successful "},{"t":"code","v":"tri git push"},{"t":"text","v":" to "},{"t":"code","v":"github.com/gHashTag/t27"},{"t":"text","v":" with bound sealed-cell and non-toxic verdict.\" Where an agent letter appears in a phase description, the tools chapter and the agent cards use that line as the source of a binding ("},{"t":"code","v":"tri cell"},{"t":"text","v":" to W, "},{"t":"code","v":"tri verdict"},{"t":"text","v":" to V)."}],"type":"p"}],"heading":"The six-phase cycle and Phase 7","id":"the-six-phase-cycle-and-phase-7"},{"blocks":[{"runs":[{"t":"text","v":"Three tri commands carry the cycle's state; two of them have a spec under "},{"t":"code","v":"specs/tools/tri/"},{"t":"text","v":" read from the clap enum of "},{"t":"code","v":"cli/tri/src/main.rs"},{"t":"text","v":":"}],"type":"p"},{"items":[[{"t":"strong","v":"`tri cell`"},{"t":"text","v":" -- the unit of work of one agent: created in ASSIGN, sealed by W with a hash in EVOLVE. Nested actions are listed on the tool card ("},{"t":"code","v":"specs/tools/tri/cell.t27"},{"t":"text","v":")."}],[{"t":"strong","v":"`tri verdict`"},{"t":"text","v":" -- V's decision over the metrics; "},{"t":"code","v":"--toxic"},{"t":"text","v":" is the question the cycle asks in VERDICT ("},{"t":"code","v":"specs/tools/tri/verdict.t27"},{"t":"text","v":")."}],[{"t":"strong","v":"`tri git`"},{"t":"text","v":" -- the seventh phase as the alphabet document writes it. At the commit this documentation was generated from the clap enum of "},{"t":"code","v":"cli/tri/src/main.rs"},{"t":"text","v":" has no "},{"t":"code","v":"git"},{"t":"text","v":" variant, so the tool catalog has no card for it; the phase is documented from the alphabet and marked "},{"t":"code","v":"[declared]"},{"t":"text","v":", and the gap is recorded here rather than filled with a card."}]],"type":"ul"},{"runs":[{"t":"text","v":"The seal itself is a hash. At the compiler level the same idea is the seal of the bootstrap compiler ("},{"t":"code","v":"bootstrap/stage0/FROZEN_HASH"},{"t":"text","v":", "},{"t":"code","v":"CANON.md"},{"t":"text","v":" section 0) and the ring canon: a ring freezes when its hash is recorded, and drift between the recorded seal and the working tree is a fact the dashboard shows."}],"type":"p"}],"heading":"Cell, seal, verdict","id":"cell-seal-verdict"},{"blocks":[{"runs":[{"t":"text","v":"The repository states the Queen's loop twice, and the two statements differ. The alphabet document gives the seven phases above (PLAN, ASSIGN, RUN, TEST & BENCH, VERDICT, EVOLVE, GIT WORKFLOW). "},{"t":"code","v":"CLAUDE.md"},{"t":"text","v":", \"Autonomous Execution Loop (AEL v2.0)\", gives a six-phase loop for an agent operating as the Queen -- OBSERVE (E), PLAN (T), DELEGATE (C/V), VERIFY (V), SYNTHESIZE (L), LEARN (L) -- and, separately, the nine-phase PHI LOOP for ring-based development (Issue, Spec, TDD, Code, Gen, Seal, Verify, Land, Learn)."}],"type":"p"},{"runs":[{"t":"text","v":"This documentation renders the alphabet's cycle, because it is the one that names the tri commands and the agent letters per phase, and records the AEL loop as the second statement without reconciling them. Which one binds an autonomous agent in a given situation is a question for "},{"t":"code","v":"AGENTS.md"},{"t":"text","v":" and its owners, not for a generated page."}],"type":"p"}],"heading":"Two statements of the loop","id":"two-statements-of-the-loop"}],"title":"Queen orchestration"},"ru":{"lead":[],"sections":[{"blocks":[{"runs":[{"t":"text","v":"Агент T, Королева, -- центральный оркестратор: \"reads "},{"t":"code","v":"graph_v2.json"},{"t":"text","v":" and knows all module dependencies\", \"conducts 26 sub-agents (A..Z, except T) by their domains\", собирает результаты, проверяет архитектурные инварианты и следит за тем, чтобы источник истины был в "},{"t":"code","v":".t27"},{"t":"text","v":" / "},{"t":"code","v":".tri"},{"t":"text","v":", а Zig, Verilog и C оставались только бэкендами ("},{"t":"code","v":"docs/agents/AGENTS_ALPHABET.md"},{"t":"text","v":", раздел \"AGENT T -- QUEEN TRINITY\", Responsibilities). Её модуль -- "},{"t":"code","v":"specs/queen/lotus.t27"},{"t":"text","v":"."}],"type":"p"},{"runs":[{"t":"text","v":"Документ алфавита рисует её цикл шестью фазами и седьмой, добавленной законом SOUL о git. Сайт выводит цикл из этого документа; кратко:"}],"type":"p"},{"items":[[{"t":"strong","v":"PLAN"},{"t":"text","v":" -- разобрать задачу и выбрать стратегию; прочитать "},{"t":"code","v":"graph_v2.json"},{"t":"text","v":" для анализа влияния; решить, какие агенты участвуют; проверить "},{"t":"code","v":".trinity/experience/"},{"t":"text","v":" на похожие задачи."}],[{"t":"strong","v":"ASSIGN"},{"t":"text","v":" -- распределить задачи агентам по областям (A архитектура, N численные форматы, P физика, F конформность, ...); задать зависимости; создать tri cell для каждого агента (W печатает)."}],[{"t":"strong","v":"RUN"},{"t":"text","v":" -- параллельное выполнение; heartbeats; агенты отчитываются в "},{"t":"code","v":".trinity/agent_events.jsonl"},{"t":"text","v":"; T перераспределяет при необходимости."}],[{"t":"strong","v":"TEST & BENCH"},{"t":"text","v":" -- F проверяет векторы конформности, V гоняет бенчмарки, G измеряет изменения влияния; метрики собираются в M для вердикта V."}],[{"t":"strong","v":"VERDICT"},{"t":"text","v":" -- V анализирует метрики; "},{"t":"code","v":"tri verdict --toxic"},{"t":"text","v":" спрашивает, токсично ли изменение; E записывает опыт; если токсично, Q блокирует задачу."}],[{"t":"strong","v":"EVOLVE"},{"t":"text","v":" -- обновить "},{"t":"code","v":"graph_v2.json"},{"t":"text","v":", если изменились зависимости; обновить опыт в E и M; S обновляет стандарты; W печатает коммит tri-cell; Z обновляет документацию; T ставит финальную печать TAW."}],[{"t":"strong","v":"GIT WORKFLOW"},{"t":"text","v":" (\"new -- SOUL law\") -- "},{"t":"code","v":"tri git commit --all -m \"cell:{id} issue:{N} ...\""},{"t":"text","v":", "},{"t":"code","v":"tri git push origin HEAD"},{"t":"text","v":" в строгом режиме; проверки: запечатанная ячейка, нетоксичный вердикт, артефакты; реестр записывает хэш коммита и флаг pushed."}]],"type":"ol"},{"runs":[{"t":"text","v":"Закон SOUL о TDD в документе следует за седьмой фазой: \"Any P0/P1 episode in "},{"t":"code","v":"--strict"},{"t":"text","v":" mode is considered COMPLETE only after successful "},{"t":"code","v":"tri git push"},{"t":"text","v":" to "},{"t":"code","v":"github.com/gHashTag/t27"},{"t":"text","v":" with bound sealed-cell and non-toxic verdict.\" Где буква агента появляется в описании фазы, глава об инструментах и карточки агентов используют эту строку как источник связи ("},{"t":"code","v":"tri cell"},{"t":"text","v":" -- W, "},{"t":"code","v":"tri verdict"},{"t":"text","v":" -- V)."}],"type":"p"}],"heading":"Шестифазный цикл и фаза 7","id":"шестифазный-цикл-и-фаза-7"},{"blocks":[{"runs":[{"t":"text","v":"Состояние цикла несут три команды tri; две из них имеют спецификацию под "},{"t":"code","v":"specs/tools/tri/"},{"t":"text","v":", прочитанную из clap-перечисления "},{"t":"code","v":"cli/tri/src/main.rs"},{"t":"text","v":":"}],"type":"p"},{"items":[[{"t":"strong","v":"`tri cell`"},{"t":"text","v":" -- единица работы одного агента: создаётся в ASSIGN, запечатывается W хэшем в EVOLVE. Вложенные действия перечислены на карточке инструмента ("},{"t":"code","v":"specs/tools/tri/cell.t27"},{"t":"text","v":")."}],[{"t":"strong","v":"`tri verdict`"},{"t":"text","v":" -- решение V по метрикам; "},{"t":"code","v":"--toxic"},{"t":"text","v":" -- вопрос, который цикл задаёт в VERDICT ("},{"t":"code","v":"specs/tools/tri/verdict.t27"},{"t":"text","v":")."}],[{"t":"strong","v":"`tri git`"},{"t":"text","v":" -- седьмая фаза в записи документа алфавита. На коммите, на котором порождена документация, в clap-перечислении "},{"t":"code","v":"cli/tri/src/main.rs"},{"t":"text","v":" нет варианта "},{"t":"code","v":"git"},{"t":"text","v":", поэтому в каталоге инструментов нет карточки для него; фаза документирована по алфавиту с пометкой "},{"t":"code","v":"[declared]"},{"t":"text","v":", а пробел записан здесь, а не закрыт выдуманной карточкой."}]],"type":"ul"},{"runs":[{"t":"text","v":"Сама печать -- это хэш. На уровне компилятора та же идея -- печать бутстрап-компилятора ("},{"t":"code","v":"bootstrap/stage0/FROZEN_HASH"},{"t":"text","v":", "},{"t":"code","v":"CANON.md"},{"t":"text","v":", раздел 0) и канон колец: кольцо замораживается, когда записан его хэш, а расхождение между записанной печатью и рабочим деревом -- факт, который показывает панель."}],"type":"p"}],"heading":"Ячейка, печать, вердикт","id":"ячейка-печать-вердикт"},{"blocks":[{"runs":[{"t":"text","v":"Репозиторий формулирует цикл Королевы дважды, и формулировки различаются. Документ алфавита даёт семь фаз выше (PLAN, ASSIGN, RUN, TEST & BENCH, VERDICT, EVOLVE, GIT WORKFLOW). "},{"t":"code","v":"CLAUDE.md"},{"t":"text","v":", \"Autonomous Execution Loop (AEL v2.0)\", даёт шестифазный цикл агента, действующего как Королева, -- OBSERVE (E), PLAN (T), DELEGATE (C/V), VERIFY (V), SYNTHESIZE (L), LEARN (L) -- и отдельно девятифазный PHI LOOP для разработки по кольцам (Issue, Spec, TDD, Code, Gen, Seal, Verify, Land, Learn)."}],"type":"p"},{"runs":[{"t":"text","v":"Эта документация отображает цикл алфавита, потому что именно он называет команды tri и буквы агентов по фазам, и фиксирует цикл AEL как вторую формулировку, не сводя их воедино. Какая из них связывает автономного агента в конкретной ситуации -- вопрос к "},{"t":"code","v":"AGENTS.md"},{"t":"text","v":" и его владельцам, а не к порождённой странице."}],"type":"p"}],"heading":"Две формулировки цикла","id":"две-формулировки-цикла"}]}},"bodyPath":"docs/system/queen.md","bodySha256":"f63d095a8299581789acd812a9207dda538a19dc7f6acc4e47375b0c5a44705a","diagram":"phase-cycle","discarded":0,"enabled":true,"id":"docs/queen","links":{"body":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/docs/system/queen.md","spec":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/specs/docs/chapters/queen.t27"},"moduleName":"docs_chapter_queen","order":5,"sections":[{"heading":{"en":"The six-phase cycle and Phase 7","ru":"Шестифазный цикл и фаза 7"},"id":"the-six-phase-cycle-and-phase-7"},{"heading":{"en":"Cell, seal, verdict","ru":"Ячейка, печать, вердикт"},"id":"cell-seal-verdict"},{"heading":{"en":"Two statements of the loop","ru":"Две формулировки цикла"},"id":"two-statements-of-the-loop"}],"sha256":"70d2234eebb2fa85930ed2b25c43866083a67c5190480e9bda198faf98adcef1","sources":[{"kind":"file","path":"docs/agents/AGENTS_ALPHABET.md","rel":"docs/agents/AGENTS_ALPHABET.md","repo":"t27","sha256":"c99352b305322031ee8af0c4777ae54c52ef50c694ff2aa0f4d95ab2fa82734a","url":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/docs/agents/AGENTS_ALPHABET.md","where":"vendored"},{"kind":"file","path":"CLAUDE.md","rel":"CLAUDE.md","repo":"t27","sha256":"b6250fd688a9d794b9eaecebd9882905aa49bfab06616be82211a87fe098656d","url":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/CLAUDE.md","where":"vendored"},{"kind":"file","path":"specs/agents/t.t27","rel":"specs/agents/t.t27","repo":"t27","sha256":"a5a64df42aba91e1b5bce6c0d5788e543209fa68bc06cb0fc483c84b9041bad0","url":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/specs/agents/t.t27","where":"vendored"},{"kind":"file","path":"specs/tools/tri/cell.t27","rel":"specs/tools/tri/cell.t27","repo":"t27","sha256":"8f356f8622d1c58b069b50d33eb6cc491f4b37d9ba960fa2d16e5c340f40707c","url":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/specs/tools/tri/cell.t27","where":"vendored"},{"kind":"file","path":"specs/tools/tri/verdict.t27","rel":"specs/tools/tri/verdict.t27","repo":"t27","sha256":"14084cba8d9b4379c147553b4565fafe87a25626524da702983b8f001d7b6b98","url":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/specs/tools/tri/verdict.t27","where":"vendored"}],"specPath":"specs/docs/chapters/queen.t27","stem":"queen","table":{"columns":["n","name","steps"],"kind":"phases","note":"","rows":[{"n":1,"name":"PLAN","note":"","steps":["Analyze task and select strategy","Read graph_v2.json for impact analysis","Determine which agents participate","Check experience: are there similar tasks in .trinity/experience/"]},{"n":2,"name":"ASSIGN","note":"","steps":["Distribute tasks to agents by domain","A (arch), N (numeric), P (physics), F (conformance), etc.","Set dependencies: G+F+V → V checks F checks G","Create tri-cell for each agent (W seals)"]},{"n":3,"name":"RUN","note":"","steps":["Parallel task execution by agents","Monitoring via heartbeats","Agents report status to `.trinity/agent_events.jsonl`","T coordinates, redistributing if necessary"]},{"n":4,"name":"TEST & BENCH","note":"","steps":["F checks conformance JSON vectors","V runs benchmarks (ARCH_BENCH-001)","G measures impact changes","Collect metrics in M for verdict by V"]},{"n":5,"name":"VERDICT","note":"","steps":["V analyzes metrics and makes decision","`tri verdict --toxic` — is the change toxic?","E records experience (if error) or success","If toxic → Q blocks task, E marks 3rd attempt"]},{"n":6,"name":"EVOLVE","note":"","steps":["Update graph_v2.json (if dependencies changed)","Update experience in E + M","S updates standards (if needed)","W seals tri-cell commit (hash seal)","Z updates documentation","T puts final TAW seal on completed work"]},{"n":7,"name":"GIT WORKFLOW","note":"new — SOUL law","steps":["`tri git commit --all -m \"cell:{id} issue:{N} ...\"`","`tri git push origin HEAD` (strict mode: only t27 repo)","Check: sealed cell + non-toxic verdict + artifacts","Update registry.json with commit hash and pushed flag"]}],"source":"docs/agents/AGENTS_ALPHABET.md, \"6-Phase Cycle of AGENT T\""},"title":{"en":"Queen orchestration","ru":"Оркестрация Королевы"},"typecheckOk":true},{"body":{"en":{"lead":[],"sections":[{"blocks":[{"runs":[{"t":"code","v":"tri"},{"t":"text","v":" is the command of the toolchain: "},{"t":"code","v":"./scripts/tri"},{"t":"text","v":" is an exec-only shim (SOUL Article VIII, section 8.2) that resolves the Rust binary "},{"t":"code","v":"t27c"},{"t":"text","v":", passes "},{"t":"code","v":"--repo-root"},{"t":"text","v":" and executes it. The catalog in "},{"t":"code","v":"specs/tools/tri/"},{"t":"text","v":" holds one spec per variant of the clap "},{"t":"code","v":"Commands"},{"t":"text","v":" enum in "},{"t":"code","v":"cli/tri/src/main.rs"},{"t":"text","v":": the command word, the enum variant, the source file and the entry point, the doc comment as "},{"t":"code","v":"ABOUT"},{"t":"text","v":" with "},{"t":"code","v":"ABOUT_SOURCE"},{"t":"text","v":" naming where the text came from, the nested actions with their own doc comments, the arguments, the agent letters that own the command with the evidence line, when to use it, and the witness."}],"type":"p"},{"runs":[{"t":"text","v":"The table the site renders next to this chapter is generated from "},{"t":"code","v":"public/tools/spec-tools.json"},{"t":"text","v":" -- command, actions, owners, witness -- and the counts in its header are read from the same file. The witness on every tri card at the commit this documentation was generated from is "},{"t":"code","v":"source-parse"},{"t":"text","v":": the enum and its "},{"t":"code","v":"///"},{"t":"text","v":" comments were read from the source at a recorded commit, and "},{"t":"code","v":"cargo"},{"t":"text","v":" was not run. A card is relabelled "},{"t":"code","v":"help-output"},{"t":"text","v":" only when someone diffs the list against "},{"t":"code","v":"tri --help"},{"t":"text","v":" and records the result; until then the label says what was and was not done."}],"type":"p"},{"runs":[{"t":"text","v":"Commands whose variant has no doc comment quote the source they borrow their description from (for example "},{"t":"code","v":"tri cell"},{"t":"text","v":" quotes the "},{"t":"code","v":"tri-mcp"},{"t":"text","v":" tool descriptions), so that no "},{"t":"code","v":"ABOUT"},{"t":"text","v":" is invented."}],"type":"p"}],"heading":"The tri CLI","id":"the-tri-cli"},{"blocks":[{"runs":[{"t":"text","v":"The second family is the Model Context Protocol servers the two repositories ship or register: for "},{"t":"code","v":"gHashTag/t27"},{"t":"text","v":" the "},{"t":"code","v":"tri-mcp"},{"t":"text","v":" crate, the "},{"t":"code","v":"tri-ssot"},{"t":"text","v":" manifest, "},{"t":"code","v":"t27-traceability"},{"t":"text","v":" and the entries of "},{"t":"code","v":".mcp.json"},{"t":"text","v":"; for "},{"t":"code","v":"gHashTag/trinity"},{"t":"text","v":" the "},{"t":"code","v":"trinity"},{"t":"text","v":" and "},{"t":"code","v":"needle"},{"t":"text","v":" Zig servers and its "},{"t":"code","v":".mcp.json"},{"t":"text","v":" entries. "},{"t":"code","v":"specs/tools/mcp/.t27"},{"t":"text","v":" carries the launch line, transport, version, environment variables, config path, repository, source, the tool names with descriptions and input-schema keys, resources, and the witness."}],"type":"p"},{"runs":[{"t":"text","v":"Servers whose code is a published package outside the repositories carry "},{"t":"code","v":"EXTERNAL = true"},{"t":"text","v":" and a "},{"t":"code","v":"TOOLS_NOTE"},{"t":"text","v":" saying the tool list is not in either tree; nothing is invented for them. Two facts are recorded rather than fixed: "},{"t":"code","v":"tri-mcp"},{"t":"text","v":" is not registered in "},{"t":"code","v":".mcp.json"},{"t":"text","v":" at the pinned commit ("},{"t":"code","v":"CONFIG"},{"t":"text","v":" is empty), and the "},{"t":"code","v":"tri-ssot"},{"t":"text","v":" manifest names a module the tree does not contain."}],"type":"p"},{"runs":[{"t":"text","v":"Two repositories are two lists. "},{"t":"code","v":"gHashTag/trinity"},{"t":"text","v":" has no "},{"t":"code","v":"tri"},{"t":"text","v":" binary at the pinned commit ("},{"t":"code","v":"build.zig"},{"t":"text","v":" defines none; its "},{"t":"code","v":".claude/skills/tri/SKILL.md"},{"t":"text","v":" is a skill and is in the skills catalog), so its tools are its MCP servers only, under "},{"t":"code","v":"REPO = \"gHashTag/trinity\""},{"t":"text","v":"."}],"type":"p"}],"heading":"MCP servers","id":"mcp-servers"},{"blocks":[{"runs":[{"t":"text","v":"A tool names the agent letters that own it ("},{"t":"code","v":"AGENTS"},{"t":"text","v":") only where a source line does, and "},{"t":"code","v":"AGENTS_NOTE"},{"t":"text","v":" cites that line or names the sources that were checked and found silent. The agent spec names the tool back ("},{"t":"code","v":"TOOLS"},{"t":"text","v":"), and the site's generator fails the build on a binding stated on one side only. Today five commands are bound -- "},{"t":"code","v":"tri gen"},{"t":"text","v":" (C, T), "},{"t":"code","v":"tri test"},{"t":"text","v":" (T, V), "},{"t":"code","v":"tri verdict"},{"t":"text","v":" (V), "},{"t":"code","v":"tri experience"},{"t":"text","v":" (E), "},{"t":"code","v":"tri cell"},{"t":"text","v":" (W) -- from the phase descriptions of "},{"t":"code","v":"docs/agents/AGENTS_ALPHABET.md"},{"t":"text","v":" and the "},{"t":"code","v":".claude/agents/*.md"},{"t":"text","v":" files; the other commands and every MCP server carry an empty "},{"t":"code","v":"AGENTS"},{"t":"text","v":" with a note. Skills are cross-linked when a skill spec's own "},{"t":"code","v":"COMMAND"},{"t":"text","v":" or "},{"t":"code","v":"SUMMARY_EN"},{"t":"text","v":" names a tri command."}],"type":"p"},{"runs":[{"t":"text","v":"The map the site draws next to this chapter groups the tri commands by owning letter (with a group for the unowned) and the MCP servers by repository, with the external ones marked. It is drawn from the generated JSON, so a new binding in a spec moves a command on the map without anyone editing the figure."}],"type":"p"}],"heading":"Who owns a tool","id":"who-owns-a-tool"}],"title":"Tooling"},"ru":{"lead":[],"sections":[{"blocks":[{"runs":[{"t":"code","v":"tri"},{"t":"text","v":" -- команда инструментальной цепочки: "},{"t":"code","v":"./scripts/tri"},{"t":"text","v":" -- шим (только exec, статья VIII SOUL, раздел 8.2), который находит бинарник Rust "},{"t":"code","v":"t27c"},{"t":"text","v":", передаёт "},{"t":"code","v":"--repo-root"},{"t":"text","v":" и исполняет его. Каталог в "},{"t":"code","v":"specs/tools/tri/"},{"t":"text","v":" содержит по спецификации на вариант clap-перечисления "},{"t":"code","v":"Commands"},{"t":"text","v":" в "},{"t":"code","v":"cli/tri/src/main.rs"},{"t":"text","v":": слово команды, вариант перечисления, файл исходника и точку входа, doc-комментарий как "},{"t":"code","v":"ABOUT"},{"t":"text","v":" с "},{"t":"code","v":"ABOUT_SOURCE"},{"t":"text","v":", называющим, откуда взят текст, вложенные действия с их doc-комментариями, аргументы, буквы агентов, владеющих командой, со строкой-свидетельством, случаи применения и свидетеля."}],"type":"p"},{"runs":[{"t":"text","v":"Таблица, которую сайт выводит рядом с этой главой, порождается из "},{"t":"code","v":"public/tools/spec-tools.json"},{"t":"text","v":" -- команда, действия, владельцы, свидетель, -- и счётчики в её заголовке читаются из того же файла. Свидетель на каждой карточке tri на коммите, на котором порождена документация, -- "},{"t":"code","v":"source-parse"},{"t":"text","v":": перечисление и его комментарии "},{"t":"code","v":"///"},{"t":"text","v":" прочитаны из исходника на записанном коммите, а "},{"t":"code","v":"cargo"},{"t":"text","v":" не запускался. Карточка переименовывается в "},{"t":"code","v":"help-output"},{"t":"text","v":" только когда кто-нибудь сравнит список с "},{"t":"code","v":"tri --help"},{"t":"text","v":" и запишет результат; до тех пор метка говорит, что было и чего не было сделано."}],"type":"p"},{"runs":[{"t":"text","v":"Команды, чей вариант не имеет doc-комментария, цитируют источник, у которого заимствуют описание (например, "},{"t":"code","v":"tri cell"},{"t":"text","v":" цитирует описания инструментов "},{"t":"code","v":"tri-mcp"},{"t":"text","v":"), чтобы ни один "},{"t":"code","v":"ABOUT"},{"t":"text","v":" не был выдуман."}],"type":"p"}],"heading":"CLI tri","id":"cli-tri"},{"blocks":[{"runs":[{"t":"text","v":"Второе семейство -- серверы Model Context Protocol, которые два репозитория поставляют или регистрируют: для "},{"t":"code","v":"gHashTag/t27"},{"t":"text","v":" крейт "},{"t":"code","v":"tri-mcp"},{"t":"text","v":", манифест "},{"t":"code","v":"tri-ssot"},{"t":"text","v":", "},{"t":"code","v":"t27-traceability"},{"t":"text","v":" и записи "},{"t":"code","v":".mcp.json"},{"t":"text","v":"; для "},{"t":"code","v":"gHashTag/trinity"},{"t":"text","v":" Zig-серверы "},{"t":"code","v":"trinity"},{"t":"text","v":" и "},{"t":"code","v":"needle"},{"t":"text","v":" и его записи "},{"t":"code","v":".mcp.json"},{"t":"text","v":". "},{"t":"code","v":"specs/tools/mcp/.t27"},{"t":"text","v":" несёт строку запуска, транспорт, версию, переменные окружения, путь конфигурации, репозиторий, исходник, имена инструментов с описаниями и ключами входных схем, ресурсы и свидетеля."}],"type":"p"},{"runs":[{"t":"text","v":"Серверы, чей код -- опубликованный пакет вне репозиториев, несут "},{"t":"code","v":"EXTERNAL = true"},{"t":"text","v":" и "},{"t":"code","v":"TOOLS_NOTE"},{"t":"text","v":" о том, что списка инструментов нет ни в одном дереве; для них ничего не выдумывается. Два факта записаны, а не исправлены: "},{"t":"code","v":"tri-mcp"},{"t":"text","v":" не зарегистрирован в "},{"t":"code","v":".mcp.json"},{"t":"text","v":" на закреплённом коммите ("},{"t":"code","v":"CONFIG"},{"t":"text","v":" пуст), а манифест "},{"t":"code","v":"tri-ssot"},{"t":"text","v":" называет модуль, которого нет в дереве."}],"type":"p"},{"runs":[{"t":"text","v":"Два репозитория -- два списка. У "},{"t":"code","v":"gHashTag/trinity"},{"t":"text","v":" нет бинарника "},{"t":"code","v":"tri"},{"t":"text","v":" на закреплённом коммите ("},{"t":"code","v":"build.zig"},{"t":"text","v":" его не определяет; его "},{"t":"code","v":".claude/skills/tri/SKILL.md"},{"t":"text","v":" -- навык и находится в каталоге навыков), поэтому его инструменты -- только его серверы MCP, под "},{"t":"code","v":"REPO = \"gHashTag/trinity\""},{"t":"text","v":"."}],"type":"p"}],"heading":"Серверы MCP","id":"серверы-mcp"},{"blocks":[{"runs":[{"t":"text","v":"Инструмент называет буквы агентов, владеющих им ("},{"t":"code","v":"AGENTS"},{"t":"text","v":"), только там, где это делает строка источника, а "},{"t":"code","v":"AGENTS_NOTE"},{"t":"text","v":" цитирует эту строку или называет источники, которые были проверены и оказались молчащими. Спецификация агента называет инструмент в ответ ("},{"t":"code","v":"TOOLS"},{"t":"text","v":"), и генератор сайта роняет сборку на связи, заявленной лишь с одной стороны. Сегодня связаны пять команд -- "},{"t":"code","v":"tri gen"},{"t":"text","v":" (C, T), "},{"t":"code","v":"tri test"},{"t":"text","v":" (T, V), "},{"t":"code","v":"tri verdict"},{"t":"text","v":" (V), "},{"t":"code","v":"tri experience"},{"t":"text","v":" (E), "},{"t":"code","v":"tri cell"},{"t":"text","v":" (W) -- по описаниям фаз "},{"t":"code","v":"docs/agents/AGENTS_ALPHABET.md"},{"t":"text","v":" и файлам "},{"t":"code","v":".claude/agents/*.md"},{"t":"text","v":"; остальные команды и каждый сервер MCP несут пустой "},{"t":"code","v":"AGENTS"},{"t":"text","v":" с примечанием. Навыки связываются перекрёстно, когда собственный "},{"t":"code","v":"COMMAND"},{"t":"text","v":" или "},{"t":"code","v":"SUMMARY_EN"},{"t":"text","v":" спецификации навыка называет команду tri."}],"type":"p"},{"runs":[{"t":"text","v":"Карта, которую сайт рисует рядом с этой главой, группирует команды tri по владеющей букве (с группой для невладеемых) и серверы MCP по репозиторию, с пометкой внешних. Она рисуется из порождённого JSON, поэтому новая связь в спецификации перемещает команду на карте без чьей-либо правки фигуры."}],"type":"p"}],"heading":"Кто владеет инструментом","id":"кто-владеет-инструментом"}]}},"bodyPath":"docs/system/tooling.md","bodySha256":"bd7ca866102a37b69e54aa765c7fd1b8583c4b4b6fd512b08d081ceb4e10761b","diagram":"tools-map","discarded":0,"enabled":true,"id":"docs/tooling","links":{"body":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/docs/system/tooling.md","spec":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/specs/docs/chapters/tooling.t27"},"moduleName":"docs_chapter_tooling","order":6,"sections":[{"heading":{"en":"The tri CLI","ru":"CLI tri"},"id":"the-tri-cli"},{"heading":{"en":"MCP servers","ru":"Серверы MCP"},"id":"mcp-servers"},{"heading":{"en":"Who owns a tool","ru":"Кто владеет инструментом"},"id":"who-owns-a-tool"}],"sha256":"dd4d3fb85955d4bb7423cf637941c02736855369320dd840082a8aed792302eb","sources":[{"kind":"file","path":"specs/tools/README.md","rel":"specs/tools/README.md","repo":"t27","sha256":"6efa016bcd9643a7be4203afa126d1f8ec967acdb7d78b8640156f303eef2df9","url":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/specs/tools/README.md","where":"vendored"},{"kind":"file","path":"specs/tools/tri/cell.t27","rel":"specs/tools/tri/cell.t27","repo":"t27","sha256":"8f356f8622d1c58b069b50d33eb6cc491f4b37d9ba960fa2d16e5c340f40707c","url":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/specs/tools/tri/cell.t27","where":"vendored"},{"kind":"file","path":"specs/agents/README.md","rel":"specs/agents/README.md","repo":"t27","sha256":"c40833dbc9f271cc92f1e9a848324446429fed52954b53f80c3670bc9da78996","url":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/specs/agents/README.md","where":"vendored"},{"kind":"file","path":"SOUL.md","rel":"SOUL.md","repo":"t27","sha256":"cb9b44e13d6d0b314f9626f9cca438e5f17ed6847b194220f9e80b32209e052e","url":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/SOUL.md","where":"vendored"}],"specPath":"specs/docs/chapters/tooling.t27","stem":"tooling","table":{"columns":["id","family","name","repo","items","agents","witness","external"],"kind":"tools","note":"","rows":[{"agents":[],"external":true,"family":"mcp","id":"mcp/gitbutler","items":0,"name":"gitbutler","repo":"gHashTag/t27","witness":"source-parse"},{"agents":[],"external":false,"family":"mcp","id":"mcp/needle","items":6,"name":"needle","repo":"gHashTag/trinity","witness":"source-parse"},{"agents":[],"external":true,"family":"mcp","id":"mcp/neon","items":0,"name":"neon","repo":"gHashTag/trinity","witness":"source-parse"},{"agents":[],"external":true,"family":"mcp","id":"mcp/notebooklm","items":0,"name":"notebooklm","repo":"gHashTag/t27","witness":"source-parse"},{"agents":[],"external":true,"family":"mcp","id":"mcp/railway-mcp-server","items":0,"name":"railway-mcp-server","repo":"gHashTag/trinity","witness":"source-parse"},{"agents":[],"external":false,"family":"mcp","id":"mcp/t27-traceability","items":4,"name":"t27-traceability","repo":"gHashTag/t27","witness":"source-parse"},{"agents":[],"external":false,"family":"mcp","id":"mcp/tri-mcp","items":10,"name":"tri-mcp","repo":"gHashTag/t27","witness":"source-parse"},{"agents":[],"external":false,"family":"mcp","id":"mcp/tri-ssot","items":5,"name":"tri-ssot","repo":"gHashTag/t27","witness":"source-parse"},{"agents":[],"external":false,"family":"mcp","id":"mcp/trinity","items":210,"name":"trinity","repo":"gHashTag/trinity","witness":"source-parse"},{"agents":[],"external":true,"family":"mcp","id":"mcp/zig-docs","items":0,"name":"zig-docs","repo":"gHashTag/trinity","witness":"source-parse"},{"agents":[],"external":false,"family":"tri-cli","id":"tri/abandoned","items":1,"name":"tri abandoned","repo":"gHashTag/t27","witness":"source-parse"},{"agents":["W"],"external":false,"family":"tri-cli","id":"tri/cell","items":2,"name":"tri cell","repo":"gHashTag/t27","witness":"source-parse"},{"agents":[],"external":false,"family":"tri-cli","id":"tri/census","items":2,"name":"tri census","repo":"gHashTag/t27","witness":"source-parse"},{"agents":[],"external":false,"family":"tri-cli","id":"tri/ci","items":1,"name":"tri ci","repo":"gHashTag/t27","witness":"source-parse"},{"agents":[],"external":false,"family":"tri-cli","id":"tri/competitors","items":2,"name":"tri competitors","repo":"gHashTag/t27","witness":"source-parse"},{"agents":[],"external":false,"family":"tri-cli","id":"tri/discard","items":2,"name":"tri discard","repo":"gHashTag/t27","witness":"source-parse"},{"agents":[],"external":false,"family":"tri-cli","id":"tri/doctor","items":0,"name":"tri doctor","repo":"gHashTag/t27","witness":"source-parse"},{"agents":[],"external":false,"family":"tri-cli","id":"tri/elab","items":2,"name":"tri elab","repo":"gHashTag/t27","witness":"source-parse"},{"agents":[],"external":false,"family":"tri-cli","id":"tri/emit","items":1,"name":"tri emit","repo":"gHashTag/t27","witness":"source-parse"},{"agents":["E"],"external":false,"family":"tri-cli","id":"tri/experience","items":1,"name":"tri experience","repo":"gHashTag/t27","witness":"source-parse"},{"agents":[],"external":false,"family":"tri-cli","id":"tri/fleet","items":2,"name":"tri fleet","repo":"gHashTag/t27","witness":"source-parse"},{"agents":[],"external":false,"family":"tri-cli","id":"tri/fmt","items":0,"name":"tri fmt","repo":"gHashTag/t27","witness":"source-parse"},{"agents":[],"external":false,"family":"tri-cli","id":"tri/fpga","items":35,"name":"tri fpga","repo":"gHashTag/t27","witness":"source-parse"},{"agents":[],"external":false,"family":"tri-cli","id":"tri/gates","items":13,"name":"tri gates","repo":"gHashTag/t27","witness":"source-parse"},{"agents":["C","T"],"external":false,"family":"tri-cli","id":"tri/gen","items":0,"name":"tri gen","repo":"gHashTag/t27","witness":"source-parse"},{"agents":[],"external":false,"family":"tri-cli","id":"tri/harness","items":1,"name":"tri harness","repo":"gHashTag/t27","witness":"source-parse"},{"agents":[],"external":false,"family":"tri-cli","id":"tri/health","items":0,"name":"tri health","repo":"gHashTag/t27","witness":"source-parse"},{"agents":[],"external":false,"family":"tri-cli","id":"tri/hooks","items":8,"name":"tri hooks","repo":"gHashTag/t27","witness":"source-parse"},{"agents":[],"external":false,"family":"tri-cli","id":"tri/issues","items":3,"name":"tri issues","repo":"gHashTag/t27","witness":"source-parse"},{"agents":[],"external":false,"family":"tri-cli","id":"tri/jumps","items":1,"name":"tri jumps","repo":"gHashTag/t27","witness":"source-parse"},{"agents":[],"external":false,"family":"tri-cli","id":"tri/kinds","items":1,"name":"tri kinds","repo":"gHashTag/t27","witness":"source-parse"},{"agents":[],"external":false,"family":"tri-cli","id":"tri/lean","items":2,"name":"tri lean","repo":"gHashTag/t27","witness":"source-parse"},{"agents":[],"external":false,"family":"tri-cli","id":"tri/ledgers","items":1,"name":"tri ledgers","repo":"gHashTag/t27","witness":"source-parse"},{"agents":[],"external":false,"family":"tri-cli","id":"tri/loop","items":1,"name":"tri loop","repo":"gHashTag/t27","witness":"source-parse"},{"agents":[],"external":false,"family":"tri-cli","id":"tri/merging","items":0,"name":"tri merging","repo":"gHashTag/t27","witness":"source-parse"},{"agents":[],"external":false,"family":"tri-cli","id":"tri/misread","items":0,"name":"tri misread","repo":"gHashTag/t27","witness":"source-parse"},{"agents":[],"external":false,"family":"tri-cli","id":"tri/mods","items":1,"name":"tri mods","repo":"gHashTag/t27","witness":"source-parse"},{"agents":[],"external":false,"family":"tri-cli","id":"tri/mutate","items":1,"name":"tri mutate","repo":"gHashTag/t27","witness":"source-parse"},{"agents":[],"external":false,"family":"tri-cli","id":"tri/now","items":2,"name":"tri now","repo":"gHashTag/t27","witness":"source-parse"},{"agents":[],"external":false,"family":"tri-cli","id":"tri/one-away","items":0,"name":"tri one-away","repo":"gHashTag/t27","witness":"source-parse"},{"agents":[],"external":false,"family":"tri-cli","id":"tri/orphaned","items":1,"name":"tri orphaned","repo":"gHashTag/t27","witness":"source-parse"},{"agents":[],"external":false,"family":"tri-cli","id":"tri/pr","items":2,"name":"tri pr","repo":"gHashTag/t27","witness":"source-parse"},{"agents":[],"external":false,"family":"tri-cli","id":"tri/prose","items":1,"name":"tri prose","repo":"gHashTag/t27","witness":"source-parse"},{"agents":[],"external":false,"family":"tri-cli","id":"tri/quantifiers","items":2,"name":"tri quantifiers","repo":"gHashTag/t27","witness":"source-parse"},{"agents":[],"external":false,"family":"tri-cli","id":"tri/red","items":2,"name":"tri red","repo":"gHashTag/t27","witness":"source-parse"},{"agents":[],"external":false,"family":"tri-cli","id":"tri/reseal","items":2,"name":"tri reseal","repo":"gHashTag/t27","witness":"source-parse"},{"agents":[],"external":false,"family":"tri-cli","id":"tri/rtl","items":1,"name":"tri rtl","repo":"gHashTag/t27","witness":"source-parse"},{"agents":[],"external":false,"family":"tri-cli","id":"tri/seals","items":5,"name":"tri seals","repo":"gHashTag/t27","witness":"source-parse"},{"agents":[],"external":false,"family":"tri-cli","id":"tri/serve","items":0,"name":"tri serve","repo":"gHashTag/t27","witness":"source-parse"},{"agents":[],"external":false,"family":"tri-cli","id":"tri/skill","items":9,"name":"tri skill","repo":"gHashTag/t27","witness":"source-parse"},{"agents":[],"external":false,"family":"tri-cli","id":"tri/status","items":0,"name":"tri status","repo":"gHashTag/t27","witness":"source-parse"},{"agents":[],"external":false,"family":"tri-cli","id":"tri/sweep","items":1,"name":"tri sweep","repo":"gHashTag/t27","witness":"source-parse"},{"agents":[],"external":false,"family":"tri-cli","id":"tri/synth","items":1,"name":"tri synth","repo":"gHashTag/t27","witness":"source-parse"},{"agents":["T","V"],"external":false,"family":"tri-cli","id":"tri/test","items":0,"name":"tri test","repo":"gHashTag/t27","witness":"source-parse"},{"agents":[],"external":false,"family":"tri-cli","id":"tri/topic","items":0,"name":"tri topic","repo":"gHashTag/t27","witness":"source-parse"},{"agents":[],"external":false,"family":"tri-cli","id":"tri/types","items":4,"name":"tri types","repo":"gHashTag/t27","witness":"source-parse"},{"agents":[],"external":false,"family":"tri-cli","id":"tri/unparsed","items":4,"name":"tri unparsed","repo":"gHashTag/t27","witness":"source-parse"},{"agents":[],"external":false,"family":"tri-cli","id":"tri/vectors","items":2,"name":"tri vectors","repo":"gHashTag/t27","witness":"source-parse"},{"agents":["V"],"external":false,"family":"tri-cli","id":"tri/verdict","items":0,"name":"tri verdict","repo":"gHashTag/t27","witness":"source-parse"},{"agents":[],"external":false,"family":"tri-cli","id":"tri/vsim","items":1,"name":"tri vsim","repo":"gHashTag/t27","witness":"source-parse"},{"agents":[],"external":false,"family":"tri-cli","id":"tri/window","items":0,"name":"tri window","repo":"gHashTag/t27","witness":"source-parse"},{"agents":[],"external":false,"family":"tri-cli","id":"tri/worktrees","items":0,"name":"tri worktrees","repo":"gHashTag/t27","witness":"source-parse"}],"source":"public/tools/spec-tools.json"},"title":{"en":"Tooling","ru":"Инструменты"},"typecheckOk":true},{"body":{"en":{"lead":[],"sections":[{"blocks":[{"runs":[{"t":"text","v":"The project separates what was measured from what was declared, and both from what was taken from outside. The tags are defined in the chapter \"The project\"; this chapter says how each tag is earned on the site."}],"type":"p"},{"runs":[{"t":"text","v":"A "},{"t":"strong","v":"measured"},{"t":"text","v":" number has a producer in a repository -- a script, a workflow, a test -- whose output is committed or published, and the page names the commit. The ladder counts, the "},{"t":"code","v":"typecheck.ok"},{"t":"text","v":" verdicts, the coverage of a translation bundle, the number of episodes in an experience tree are measured in this sense: the generator that produces them runs in "},{"t":"code","v":"prebuild"},{"t":"text","v":" and its inputs are pinned."}],"type":"p"},{"runs":[{"t":"text","v":"A "},{"t":"strong","v":"declared"},{"t":"text","v":" value is stated in a spec or a canon document. The catalog size of 83 formats, the seven laws, the seven phases are declared: the site renders them from the file that states them and links the file at the commit, but running nothing."}],"type":"p"},{"runs":[{"t":"text","v":"An "},{"t":"strong","v":"external"},{"t":"text","v":" value is cited with its source and not reproduced. The site does not restate hardware figures of "},{"t":"code","v":"gHashTag/trinity-fpga"},{"t":"text","v":" beyond what "},{"t":"code","v":"siliconHistory.ts"},{"t":"text","v":" transcribes with its provenance note."}],"type":"p"}],"heading":"Measured, declared, external","id":"measured-declared-external"},{"blocks":[{"runs":[{"t":"text","v":"Each catalog card carries a witness label that says how the card relates to the thing it describes:"}],"type":"p"},{"items":[[{"t":"text","v":"Skills and crons: "},{"t":"code","v":"spec+code"},{"t":"text","v":" (spec and source both exist), "},{"t":"code","v":"spec-only"},{"t":"text","v":" (spec without source), "},{"t":"code","v":"code-only"},{"t":"text","v":" (source without spec). The counts per label are in the header of the Skill and Cron Explorers."}],[{"t":"text","v":"Tools: "},{"t":"code","v":"source-parse"},{"t":"text","v":" (the command list was read from the source at a recorded commit; "},{"t":"code","v":"cargo"},{"t":"text","v":" was not run) or "},{"t":"code","v":"help-output"},{"t":"text","v":" (the list was diffed against "},{"t":"code","v":"tri --help"},{"t":"text","v":"). At the commit this documentation was generated from every tri card is "},{"t":"code","v":"source-parse"},{"t":"text","v":"."}],[{"t":"text","v":"Agents: each skill and tool binding cites a source line in "},{"t":"code","v":"SKILLS_NOTE"},{"t":"text","v":" / "},{"t":"code","v":"TOOLS_NOTE"},{"t":"text","v":", or the list is empty and the note says what was read."}],[{"t":"text","v":"Experience: attributed only where an episode names a letter; otherwise counted as unattributed, never guessed."}]],"type":"ul"},{"runs":[{"t":"text","v":"The table the site renders next to this chapter collects these labels with their counts from the generated JSON of every layer."}],"type":"p"}],"heading":"Witness labels","id":"witness-labels"},{"blocks":[{"runs":[{"t":"text","v":"Every "},{"t":"code","v":".t27"},{"t":"text","v":" the site shows was compiled at build time by the vendored "},{"t":"code","v":"t27_compiler.wasm"},{"t":"text","v":", and the JSON records "},{"t":"code","v":"typecheck.ok"},{"t":"text","v":" per file. Two limits of that verdict are stated on every layer README and repeated here. First, the wasm's "},{"t":"code","v":"typecheck.ok"},{"t":"text","v":" is necessary, not sufficient: it stays "},{"t":"code","v":"true"},{"t":"text","v":" for a wrong annotation such as "},{"t":"code","v":"str = 5"},{"t":"text","v":", so the generator checks the field schema of every card on top of it. Second, the bootstrap compiler on "},{"t":"code","v":"master"},{"t":"text","v":" was not run against the catalog files in the commits that added them; the wasm is a build of the compiler at a recorded sha, and that sha is in the generated JSON."}],"type":"p"}],"heading":"Wasm verdicts","id":"wasm-verdicts"},{"blocks":[{"runs":[{"t":"code","v":"gHashTag/t27"},{"t":"text","v":" gates a pull request with workflows named for what they check (issue gate, gate topology, conformance integrity, emit bit-exact, catalog count, now-sync, untrusted input, among others under "},{"t":"code","v":".github/workflows/"},{"t":"text","v":"). Two of them, "},{"t":"code","v":"gate-topology"},{"t":"text","v":" and "},{"t":"code","v":"untrusted-input"},{"t":"text","v":", fail on "},{"t":"code","v":"master"},{"t":"text","v":" for already-merged pull requests at the time of writing; the catalog pull requests record this and do not bless or bypass them."}],"type":"p"},{"runs":[{"t":"code","v":"gHashTag/trinity"},{"t":"text","v":" gates the site with "},{"t":"code","v":"npm run"},{"t":"text","v":" checks that run in "},{"t":"code","v":"prebuild"},{"t":"text","v":" and in CI: "},{"t":"code","v":"check:spec-catalog"},{"t":"text","v":", "},{"t":"code","v":"check:skills-catalog"},{"t":"text","v":", "},{"t":"code","v":"check:crons-catalog"},{"t":"text","v":", "},{"t":"code","v":"check:agents"},{"t":"text","v":", "},{"t":"code","v":"check:tools"},{"t":"text","v":", "},{"t":"code","v":"check:docs"},{"t":"text","v":", the explorer and Queen language contracts, the Queen viewport contract, "},{"t":"code","v":"typecheck:ratchet"},{"t":"text","v":" and "},{"t":"code","v":"eslint"},{"t":"text","v":". A check that fails on "},{"t":"code","v":"main"},{"t":"text","v":" before a change is reported as pre-existing, with its name, and is not counted as passing."}],"type":"p"}],"heading":"CI gates","id":"ci-gates"},{"blocks":[{"runs":[{"t":"text","v":"To reproduce a count on the site, run the generator that produced it, in "},{"t":"code","v":"apps/website"},{"t":"text","v":" of a checkout of "},{"t":"code","v":"gHashTag/trinity"},{"t":"text","v":", with a sibling checkout of "},{"t":"code","v":"gHashTag/t27"},{"t":"text","v":" (or "},{"t":"code","v":"T27_ROOT"},{"t":"text","v":" pointing to one):"}],"type":"p"},{"items":[[{"t":"code","v":"node scripts/agents-from-specs.mjs"},{"t":"text","v":" -- skills, crons, agents, tools JSON and their counts; "},{"t":"code","v":"--check"},{"t":"text","v":" compares against the committed JSON."}],[{"t":"code","v":"node scripts/docs-from-specs.mjs"},{"t":"text","v":" -- this documentation's JSON, including the sources with their sha256 and the pinned commit."}],[{"t":"code","v":"node scripts/sync-agents-experience.mjs"},{"t":"text","v":" -- the experience snapshot."}],[{"t":"code","v":"npm run check:docs"},{"t":"text","v":" -- the chapter bodies, the sources, the generated tables, the forbidden-words scan in English and Russian."}]],"type":"ul"},{"runs":[{"t":"text","v":"Each JSON names the commit its inputs were read at. Comparing that commit with the one in front of you is step one of any reproduction; a number that cannot be tied to a commit is not a measurement."}],"type":"p"}],"heading":"Reproducing a number","id":"reproducing-a-number"},{"blocks":[{"runs":[{"t":"text","v":"Two kinds of record exist outside the generated pages, and this documentation points to them without adding to their claims. The TNF manuscript audit and reconciliation reports live under "},{"t":"code","v":"docs/reports/"},{"t":"text","v":" in "},{"t":"code","v":"gHashTag/t27"},{"t":"text","v":" ("},{"t":"code","v":"TNF-ARTICLE-AUDIT-W845.md"},{"t":"text","v":", "},{"t":"code","v":"TNF-ARTICLE-RECONCILIATION.md"},{"t":"text","v":"); they record which statements of the article were checked against which producer and what changed. The Zenodo README ("},{"t":"code","v":"README-ZENODO.md"},{"t":"text","v":") describes the archived package. No scientific claim is made in this documentation that is not in those files or in the site's own content with its status tag."}],"type":"p"}],"heading":"Published record","id":"published-record"}],"title":"Evidence and witnesses"},"ru":{"lead":[],"sections":[{"blocks":[{"runs":[{"t":"text","v":"Проект разделяет измеренное и заявленное, а и то и другое -- от взятого извне. Теги определены в главе \"Проект\"; эта глава говорит, как каждый тег зарабатывается на сайте."}],"type":"p"},{"runs":[{"t":"strong","v":"Измеренное"},{"t":"text","v":" число имеет производителя в репозитории -- скрипт, workflow, тест, -- чей вывод закоммичен или опубликован, и страница называет коммит. Счётчики лестницы, вердикты "},{"t":"code","v":"typecheck.ok"},{"t":"text","v":", покрытие бандла переводов, число эпизодов в дереве опыта измерены в этом смысле: порождающий их генератор выполняется в "},{"t":"code","v":"prebuild"},{"t":"text","v":", а его входы закреплены."}],"type":"p"},{"runs":[{"t":"strong","v":"Заявленное"},{"t":"text","v":" значение записано в спецификации или каноническом документе. Размер каталога в 83 формата, семь законов, семь фаз заявлены: сайт выводит их из файла, который их формулирует, и привязывает файл к коммиту, ничего не запуская."}],"type":"p"},{"runs":[{"t":"strong","v":"Внешнее"},{"t":"text","v":" значение цитируется с источником и не воспроизводится. Сайт не повторяет аппаратные цифры "},{"t":"code","v":"gHashTag/trinity-fpga"},{"t":"text","v":" сверх того, что переносит "},{"t":"code","v":"siliconHistory.ts"},{"t":"text","v":" со своим примечанием о происхождении."}],"type":"p"}],"heading":"Измерено, заявлено, извне","id":"измерено-заявлено-извне"},{"blocks":[{"runs":[{"t":"text","v":"Каждая карточка каталога несёт метку свидетеля, говорящую, как карточка соотносится с тем, что описывает:"}],"type":"p"},{"items":[[{"t":"text","v":"Навыки и расписания: "},{"t":"code","v":"spec+code"},{"t":"text","v":" (есть и спецификация, и исходник), "},{"t":"code","v":"spec-only"},{"t":"text","v":" (спецификация без исходника), "},{"t":"code","v":"code-only"},{"t":"text","v":" (исходник без спецификации). Счётчики по меткам -- в заголовках обозревателей навыков и расписаний."}],[{"t":"text","v":"Инструменты: "},{"t":"code","v":"source-parse"},{"t":"text","v":" (список команд прочитан из исходника на записанном коммите; "},{"t":"code","v":"cargo"},{"t":"text","v":" не запускался) или "},{"t":"code","v":"help-output"},{"t":"text","v":" (список сверен с "},{"t":"code","v":"tri --help"},{"t":"text","v":"). На коммите, на котором порождена документация, каждая карточка tri -- "},{"t":"code","v":"source-parse"},{"t":"text","v":"."}],[{"t":"text","v":"Агенты: каждая связь с навыком и инструментом цитирует строку источника в "},{"t":"code","v":"SKILLS_NOTE"},{"t":"text","v":" / "},{"t":"code","v":"TOOLS_NOTE"},{"t":"text","v":", либо список пуст и примечание говорит, что было прочитано."}],[{"t":"text","v":"Опыт: атрибуция только там, где эпизод называет букву; иначе считается неотнесённым и никогда не угадывается."}]],"type":"ul"},{"runs":[{"t":"text","v":"Таблица, которую сайт выводит рядом с этой главой, собирает эти метки со счётчиками из порождённого JSON каждого слоя."}],"type":"p"}],"heading":"Метки свидетелей","id":"метки-свидетелей"},{"blocks":[{"runs":[{"t":"text","v":"Каждый "},{"t":"code","v":".t27"},{"t":"text","v":", показанный на сайте, скомпилирован при сборке вендорным "},{"t":"code","v":"t27_compiler.wasm"},{"t":"text","v":", и JSON записывает "},{"t":"code","v":"typecheck.ok"},{"t":"text","v":" для каждого файла. Два предела этого вердикта названы в README каждого слоя и повторены здесь. Во-первых, "},{"t":"code","v":"typecheck.ok"},{"t":"text","v":" от wasm необходим, но не достаточен: он остаётся "},{"t":"code","v":"true"},{"t":"text","v":" при неверной аннотации вроде "},{"t":"code","v":"str = 5"},{"t":"text","v":", поэтому генератор проверяет схему полей каждой карточки поверх него. Во-вторых, бутстрап-компилятор на "},{"t":"code","v":"master"},{"t":"text","v":" не запускался против файлов каталогов в коммитах, которые их добавили; wasm -- сборка компилятора на записанном sha, и этот sha есть в порождённом JSON."}],"type":"p"}],"heading":"Вердикты wasm","id":"вердикты-wasm"},{"blocks":[{"runs":[{"t":"code","v":"gHashTag/t27"},{"t":"text","v":" проверяет pull request рабочими потоками, названными по тому, что они проверяют (issue gate, gate topology, conformance integrity, emit bit-exact, catalog count, now-sync, untrusted input и другие под "},{"t":"code","v":".github/workflows/"},{"t":"text","v":"). Два из них, "},{"t":"code","v":"gate-topology"},{"t":"text","v":" и "},{"t":"code","v":"untrusted-input"},{"t":"text","v":", на момент написания падают на "},{"t":"code","v":"master"},{"t":"text","v":" для уже влитых pull request; pull request каталогов фиксируют это и не благословляют и не обходят их."}],"type":"p"},{"runs":[{"t":"code","v":"gHashTag/trinity"},{"t":"text","v":" проверяет сайт командами "},{"t":"code","v":"npm run"},{"t":"text","v":", выполняемыми в "},{"t":"code","v":"prebuild"},{"t":"text","v":" и в CI: "},{"t":"code","v":"check:spec-catalog"},{"t":"text","v":", "},{"t":"code","v":"check:skills-catalog"},{"t":"text","v":", "},{"t":"code","v":"check:crons-catalog"},{"t":"text","v":", "},{"t":"code","v":"check:agents"},{"t":"text","v":", "},{"t":"code","v":"check:tools"},{"t":"text","v":", "},{"t":"code","v":"check:docs"},{"t":"text","v":", языковые контракты обозревателей и Королевы, контракт вьюпорта Королевы, "},{"t":"code","v":"typecheck:ratchet"},{"t":"text","v":" и "},{"t":"code","v":"eslint"},{"t":"text","v":". Проверка, падающая на "},{"t":"code","v":"main"},{"t":"text","v":" до изменения, отмечается как существовавшая ранее, по имени, и не засчитывается как пройденная."}],"type":"p"}],"heading":"Шлюзы CI","id":"шлюзы-ci"},{"blocks":[{"runs":[{"t":"text","v":"Чтобы воспроизвести счётчик с сайта, запустите порождающий его генератор в "},{"t":"code","v":"apps/website"},{"t":"text","v":" чекаута "},{"t":"code","v":"gHashTag/trinity"},{"t":"text","v":" с соседним чекаутом "},{"t":"code","v":"gHashTag/t27"},{"t":"text","v":" (или с "},{"t":"code","v":"T27_ROOT"},{"t":"text","v":", указывающим на него):"}],"type":"p"},{"items":[[{"t":"code","v":"node scripts/agents-from-specs.mjs"},{"t":"text","v":" -- JSON навыков, расписаний, агентов, инструментов и их счётчики; "},{"t":"code","v":"--check"},{"t":"text","v":" сравнивает с закоммиченным JSON."}],[{"t":"code","v":"node scripts/docs-from-specs.mjs"},{"t":"text","v":" -- JSON этой документации, включая источники с их sha256 и закреплённый коммит."}],[{"t":"code","v":"node scripts/sync-agents-experience.mjs"},{"t":"text","v":" -- снимок опыта."}],[{"t":"code","v":"npm run check:docs"},{"t":"text","v":" -- тела глав, источники, порождённые таблицы, поиск запрещённых слов в английском и русском."}]],"type":"ul"},{"runs":[{"t":"text","v":"Каждый JSON называет коммит, на котором прочитаны его входы. Сравнение этого коммита с тем, что перед вами, -- шаг один любого воспроизведения; число, которое нельзя привязать к коммиту, не является измерением."}],"type":"p"}],"heading":"Как воспроизвести число","id":"как-воспроизвести-число"},{"blocks":[{"runs":[{"t":"text","v":"Вне порождённых страниц существуют два вида записей, и эта документация указывает на них, ничего не добавляя к их утверждениям. Отчёты аудита и сверки рукописи TNF лежат под "},{"t":"code","v":"docs/reports/"},{"t":"text","v":" в "},{"t":"code","v":"gHashTag/t27"},{"t":"text","v":" ("},{"t":"code","v":"TNF-ARTICLE-AUDIT-W845.md"},{"t":"text","v":", "},{"t":"code","v":"TNF-ARTICLE-RECONCILIATION.md"},{"t":"text","v":"); они записывают, какие утверждения статьи сверены с каким производителем и что изменилось. README для Zenodo ("},{"t":"code","v":"README-ZENODO.md"},{"t":"text","v":") описывает архивированный пакет. В этой документации не делается ни одного научного утверждения, которого нет в этих файлах или в собственном содержимом сайта с его статусным тегом."}],"type":"p"}],"heading":"Опубликованная запись","id":"опубликованная-запись"}]}},"bodyPath":"docs/system/evidence.md","bodySha256":"369aa6412eaa52c54b0b0b1e796625655dc476ea05a6e4aa1c7e019003420d21","diagram":null,"discarded":0,"enabled":true,"id":"docs/evidence","links":{"body":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/docs/system/evidence.md","spec":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/specs/docs/chapters/evidence.t27"},"moduleName":"docs_chapter_evidence","order":7,"sections":[{"heading":{"en":"Measured, declared, external","ru":"Измерено, заявлено, извне"},"id":"measured-declared-external"},{"heading":{"en":"Witness labels","ru":"Метки свидетелей"},"id":"witness-labels"},{"heading":{"en":"Wasm verdicts","ru":"Вердикты wasm"},"id":"wasm-verdicts"},{"heading":{"en":"CI gates","ru":"Шлюзы CI"},"id":"ci-gates"},{"heading":{"en":"Reproducing a number","ru":"Как воспроизвести число"},"id":"reproducing-a-number"},{"heading":{"en":"Published record","ru":"Опубликованная запись"},"id":"published-record"}],"sha256":"bc197d64c27828950663c4af278f4f13fb522eddad5c105d1630aad61d997098","sources":[{"kind":"file","path":"specs/skills/README.md","rel":"specs/skills/README.md","repo":"t27","sha256":"ac23eb8d74832014efaf5e65f3da070d999549724e01242cb8784a93ad43d360","url":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/specs/skills/README.md","where":"vendored"},{"kind":"file","path":"specs/tools/README.md","rel":"specs/tools/README.md","repo":"t27","sha256":"6efa016bcd9643a7be4203afa126d1f8ec967acdb7d78b8640156f303eef2df9","url":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/specs/tools/README.md","where":"vendored"},{"kind":"file","path":"README-ZENODO.md","rel":"README-ZENODO.md","repo":"t27","sha256":"6da4751277af64ba21e866d787201296b0595f3f40b43792207e2f939c7f48b9","url":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/README-ZENODO.md","where":"vendored"},{"kind":"file","path":"docs/reports/TNF-ARTICLE-AUDIT-W845.md","rel":"docs/reports/TNF-ARTICLE-AUDIT-W845.md","repo":"t27","sha256":"0d0008949d161dbe0d3cd4368ddf4b5629144ba71293e23dc7267b6f19a36e96","url":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/docs/reports/TNF-ARTICLE-AUDIT-W845.md","where":"vendored"},{"kind":"file","path":"docs/reports/TNF-ARTICLE-RECONCILIATION.md","rel":"docs/reports/TNF-ARTICLE-RECONCILIATION.md","repo":"t27","sha256":"a18e9fab15d0d845d5bc8d55b8be1249a8a0b48f7b361890da80b4e7406138da","url":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/docs/reports/TNF-ARTICLE-RECONCILIATION.md","where":"vendored"}],"specPath":"specs/docs/chapters/evidence.t27","stem":"evidence","table":{"columns":["layer","label","count","source"],"kind":"witnesses","note":"","rows":[{"count":26,"label":"spec+code","layer":"Skills","source":"public/skills/spec-skills.json counts"},{"count":0,"label":"spec-only","layer":"Skills","source":"public/skills/spec-skills.json counts"},{"count":0,"label":"code-only","layer":"Skills","source":"public/skills/spec-skills.json counts"},{"count":33,"label":"spec+code","layer":"Crons","source":"public/crons/spec-crons.json counts"},{"count":0,"label":"spec-only","layer":"Crons","source":"public/crons/spec-crons.json counts"},{"count":0,"label":"code-only","layer":"Crons","source":"public/crons/spec-crons.json counts"},{"count":0,"label":"with RUNS","layer":"Crons","source":"public/crons/spec-crons.json counts"},{"count":1,"label":"with skills (source-bound)","layer":"Agents","source":"public/agents/spec-agents.json counts"},{"count":5,"label":"with tools (bound both ways)","layer":"Agents","source":"public/agents/spec-agents.json counts"},{"count":0,"label":"spec+experience","layer":"Agents","source":"public/agents/spec-agents.json counts"},{"count":27,"label":"spec-only","layer":"Agents","source":"public/agents/spec-agents.json counts"},{"count":0,"label":"episodes attributed","layer":"Experience","source":"public/agents/experience.json"},{"count":386,"label":"episodes unattributed","layer":"Experience","source":"public/agents/experience.json"},{"count":0,"label":"help-output","layer":"Tools","source":"public/tools/spec-tools.json counts.byWitness"},{"count":62,"label":"source-parse","layer":"Tools","source":"public/tools/spec-tools.json counts.byWitness"},{"count":5,"label":"external (tool list not in either repository)","layer":"Tools","source":"public/tools/spec-tools.json counts"},{"count":148,"label":"typecheck ok","layer":"All catalogs","source":"counts.typecheckOk of the four catalogs"}],"source":"counts of the four catalog JSON files and public/agents/experience.json"},"title":{"en":"Evidence and witnesses","ru":"Свидетели и доказательства"},"typecheckOk":true}],"compilerWasmSha256":"4d9c0447b5ca288790ab03d3dffc2dda629ed47af9d6731a105fc923aea0aee4","counts":{"chapters":7,"diagrams":6,"enabled":7,"laws":7,"phases":7,"ruChapters":7,"sections":32,"sources":31,"sourcesCheckout":2,"sourcesVendored":29,"specs":9,"tables":7,"typecheckOk":8},"document":{"chapters":["project","rules","layers","alphabet","queen","tooling","evidence"],"diagrams":["ladder","agent-ring","phase-cycle","law-hierarchy","skills-crons-agents","tools-map"],"enabled":true,"id":"docs/system","link":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/specs/docs/system.t27","locales":["en","ru"],"sha256":"ab7ee1773622aa46442aec7aeca5cdd1a1a3c36f6321451a5e426df80a75945b","sources":[{"kind":"dir","path":"specs/skills","rel":"specs/skills","repo":"t27","sha256":null,"url":"https://github.com/gHashTag/t27/tree/95c9b61b97d487bec4279ca63eb3132da8d1721c/specs/skills","where":"vendored"},{"kind":"dir","path":"specs/crons","rel":"specs/crons","repo":"t27","sha256":null,"url":"https://github.com/gHashTag/t27/tree/95c9b61b97d487bec4279ca63eb3132da8d1721c/specs/crons","where":"vendored"},{"kind":"dir","path":"specs/agents","rel":"specs/agents","repo":"t27","sha256":null,"url":"https://github.com/gHashTag/t27/tree/95c9b61b97d487bec4279ca63eb3132da8d1721c/specs/agents","where":"vendored"},{"kind":"dir","path":"specs/tools","rel":"specs/tools","repo":"t27","sha256":null,"url":"https://github.com/gHashTag/t27/tree/95c9b61b97d487bec4279ca63eb3132da8d1721c/specs/tools","where":"vendored"},{"kind":"dir","path":"specs/i18n","rel":"specs/i18n","repo":"t27","sha256":null,"url":"https://github.com/gHashTag/t27/tree/95c9b61b97d487bec4279ca63eb3132da8d1721c/specs/i18n","where":"vendored"},{"kind":"file","path":"SOUL.md","rel":"SOUL.md","repo":"t27","sha256":"cb9b44e13d6d0b314f9626f9cca438e5f17ed6847b194220f9e80b32209e052e","url":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/SOUL.md","where":"vendored"},{"kind":"file","path":"AGENTS.md","rel":"AGENTS.md","repo":"t27","sha256":"1c9b8cce1600d4220d74498d187934e0b935ad1eae6deb9c1b100057ce9ac9e9","url":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/AGENTS.md","where":"vendored"},{"kind":"file","path":"CLAUDE.md","rel":"CLAUDE.md","repo":"t27","sha256":"b6250fd688a9d794b9eaecebd9882905aa49bfab06616be82211a87fe098656d","url":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/CLAUDE.md","where":"vendored"},{"kind":"file","path":"docs/agents/AGENTS_ALPHABET.md","rel":"docs/agents/AGENTS_ALPHABET.md","repo":"t27","sha256":"c99352b305322031ee8af0c4777ae54c52ef50c694ff2aa0f4d95ab2fa82734a","url":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/docs/agents/AGENTS_ALPHABET.md","where":"vendored"},{"kind":"file","path":"docs/T27-CONSTITUTION.md","rel":"docs/T27-CONSTITUTION.md","repo":"t27","sha256":"2c06724425f721ef6356edc9a14e4f1af530d1246c5c6a318fd42f59aaa319a5","url":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/docs/T27-CONSTITUTION.md","where":"vendored"}],"specPath":"specs/docs/system.t27","title":{"en":"t27 / Trinity -- the system, its rules and its evidence","ru":"t27 / Trinity -- система, её правила и её доказательства"},"typecheckOk":true},"figures":{"agent-ring":{"agents":[{"layer":"Archetypal","letter":"A","name":"Alpha (Architecture)","ordinal":1,"skills":0,"tools":0},{"layer":"Archetypal","letter":"B","name":"Beta (Build)","ordinal":2,"skills":0,"tools":0},{"layer":"Archetypal","letter":"C","name":"Gamma (Compiler Core)","ordinal":3,"skills":0,"tools":1},{"layer":"Archetypal","letter":"D","name":"Delta (De-Zigfication)","ordinal":4,"skills":0,"tools":0},{"layer":"Archetypal","letter":"E","name":"Epsilon (Experience)","ordinal":5,"skills":0,"tools":1},{"layer":"Archetypal","letter":"F","name":"Phi (Formal Conformance)","ordinal":6,"skills":0,"tools":0},{"layer":"Archetypal","letter":"G","name":"Gamma (Graph)","ordinal":7,"skills":0,"tools":0},{"layer":"Archetypal","letter":"H","name":"Eta (HSLM)","ordinal":8,"skills":0,"tools":0},{"layer":"Archetypal","letter":"I","name":"Iota (ISA)","ordinal":9,"skills":0,"tools":0},{"layer":"Spiritual","letter":"J","name":"Iota-extended (Jobs)","ordinal":10,"skills":0,"tools":0},{"layer":"Spiritual","letter":"K","name":"Kappa (Kernel)","ordinal":11,"skills":0,"tools":0},{"layer":"Spiritual","letter":"L","name":"Lambda (Language)","ordinal":12,"skills":0,"tools":0},{"layer":"Spiritual","letter":"M","name":"Mu (Metrics)","ordinal":13,"skills":0,"tools":0},{"layer":"Spiritual","letter":"N","name":"Nu (Numeric)","ordinal":14,"skills":0,"tools":0},{"layer":"Spiritual","letter":"O","name":"Omicron (Orchestration)","ordinal":15,"skills":0,"tools":0},{"layer":"Spiritual","letter":"P","name":"Pi (Physics)","ordinal":16,"skills":0,"tools":0},{"layer":"Spiritual","letter":"Q","name":"Theta (Queue)","ordinal":17,"skills":0,"tools":0},{"layer":"Spiritual","letter":"R","name":"Rho (Runtime)","ordinal":18,"skills":0,"tools":0},{"layer":"Physical","letter":"S","name":"Sigma (Specs)","ordinal":19,"skills":0,"tools":0},{"layer":"Physical","letter":"T","name":"Tau (TRINITY Queen)","ordinal":20,"skills":2,"tools":2},{"layer":"Physical","letter":"U","name":"Upsilon (Universe)","ordinal":21,"skills":0,"tools":0},{"layer":"Physical","letter":"V","name":"Vau (Verdict)","ordinal":22,"skills":0,"tools":2},{"layer":"Physical","letter":"W","name":"Double-Vav (Workflow)","ordinal":23,"skills":0,"tools":1},{"layer":"Physical","letter":"X","name":"Chi (External)","ordinal":24,"skills":0,"tools":0},{"layer":"Physical","letter":"Y","name":"Psi (Yield/DePIN)","ordinal":25,"skills":0,"tools":0},{"layer":"Physical","letter":"Z","name":"Zeta (Zero-Touch)","ordinal":26,"skills":0,"tools":0},{"layer":"Physical","letter":"TI","name":"Ti (Security)","ordinal":27,"skills":0,"tools":0}],"source":"public/agents/spec-agents.json"},"ladder":{"counts":{"agents":27,"crons":33,"docsChapters":7,"skills":26,"specs":760,"tools":62},"source":"public/*/spec-*.json counts and public/t27/manifest.json"},"law-hierarchy":{"laws":[{"law":"L1","name":"TRACEABILITY"},{"law":"L2","name":"GENERATION"},{"law":"L3","name":"PURITY"},{"law":"L4","name":"TESTABILITY"},{"law":"L5","name":"IDENTITY"},{"law":"L6","name":"CEILING"},{"law":"L7","name":"UNITY"}],"priority":"L1 > L2 > … > L7","source":"docs/T27-CONSTITUTION.md"},"phase-cycle":{"phases":[{"n":1,"name":"PLAN","note":"","steps":4},{"n":2,"name":"ASSIGN","note":"","steps":4},{"n":3,"name":"RUN","note":"","steps":4},{"n":4,"name":"TEST & BENCH","note":"","steps":4},{"n":5,"name":"VERDICT","note":"","steps":4},{"n":6,"name":"EVOLVE","note":"","steps":6},{"n":7,"name":"GIT WORKFLOW","note":"new — SOUL law","steps":4}],"source":"docs/agents/AGENTS_ALPHABET.md"},"skills-crons-agents":{"counts":{"agents":27,"crons":33,"skills":26,"tools":62},"edges":[{"from":"t27/C","kind":"agent-holds-tool","to":"tri/gen"},{"from":"t27/E","kind":"agent-holds-tool","to":"tri/experience"},{"from":"t27/T","kind":"agent-holds-skill","to":"t27/phi-loop"},{"from":"t27/T","kind":"agent-holds-skill","to":"t27/tri-pipeline"},{"from":"t27/T","kind":"agent-holds-tool","to":"tri/gen"},{"from":"t27/T","kind":"agent-holds-tool","to":"tri/test"},{"from":"t27/V","kind":"agent-holds-tool","to":"tri/test"},{"from":"t27/V","kind":"agent-holds-tool","to":"tri/verdict"},{"from":"t27/W","kind":"agent-holds-tool","to":"tri/cell"}],"source":"public/crons/spec-crons.json RUNS, public/agents/spec-agents.json SKILLS/TOOLS"},"tools-map":{"external":["mcp/gitbutler","mcp/neon","mcp/notebooklm","mcp/railway-mcp-server","mcp/zig-docs"],"mcpByRepo":{"gHashTag/t27":["mcp/gitbutler","mcp/notebooklm","mcp/t27-traceability","mcp/tri-mcp","mcp/tri-ssot"],"gHashTag/trinity":["mcp/needle","mcp/neon","mcp/railway-mcp-server","mcp/trinity","mcp/zig-docs"]},"source":"public/tools/spec-tools.json groups","triByAgent":{"-":["tri/abandoned","tri/census","tri/ci","tri/competitors","tri/discard","tri/doctor","tri/elab","tri/emit","tri/fleet","tri/fmt","tri/fpga","tri/gates","tri/harness","tri/health","tri/hooks","tri/issues","tri/jumps","tri/kinds","tri/lean","tri/ledgers","tri/loop","tri/merging","tri/misread","tri/mods","tri/mutate","tri/now","tri/one-away","tri/orphaned","tri/pr","tri/prose","tri/quantifiers","tri/red","tri/reseal","tri/rtl","tri/seals","tri/serve","tri/skill","tri/status","tri/sweep","tri/synth","tri/topic","tri/types","tri/unparsed","tri/vectors","tri/vsim","tri/window","tri/worktrees"],"C":["tri/gen"],"E":["tri/experience"],"T":["tri/gen","tri/test"],"V":["tri/test","tri/verdict"],"W":["tri/cell"]}}},"generatedAt":"2026-09-09T17:15:52.595Z","i18n":[{"bundle":"apps/website/i18n/docs.ru.json","coverage":{"n":7,"total":7},"enabled":true,"fields":["TITLE","BODY"],"locale":"ru","missing":[],"scope":["specs/docs","specs/docs/chapters"],"sha256":"5fc4a500afccdf91e81c2bbde7b770e673efccc96e2d87ef377abdf723748610","spec":"specs/i18n/docs-ru.t27"}],"ladder":{"agents":27,"crons":33,"docsChapters":7,"skills":26,"specs":760,"tools":62},"pin":{"ref":"95c9b61b97d487bec4279ca63eb3132da8d1721c","source":"public/agents/experience.json sources[t27].commit / sources[trinity].commit","trinity":"da84d38795aa97f9170bb670f04a328032aa6ffe"},"version":1,"warnings":[],"contentSha256":"062bff2e5e64d7ded2b35578b7b55d684cc1fbdb7d590bb7888228a666edcfa7"} diff --git a/apps/website/public/functions/spec-functions.json b/apps/website/public/functions/spec-functions.json index fd35d4ac8b..1a898e6633 100644 --- a/apps/website/public/functions/spec-functions.json +++ b/apps/website/public/functions/spec-functions.json @@ -1 +1 @@ -{"codeOnly":[],"compilerWasmSha256":"4d9c0447b5ca288790ab03d3dffc2dda629ed47af9d6731a105fc923aea0aee4","contentSha256":"c7f525b34cbe93ee47860b32be2125dc7e47fe25653f8e39599e051c44ab6010","counts":{"byDomain":{"analytics":2,"broadcast":1,"content":3,"instagram":3,"monitoring":4,"morph":1,"neuro":1,"payment":1,"reels":3,"render":3,"training":4,"webhook":1,"welcome":1},"byProbeResult":{"COMPLETED":7,"FAILED-at-guard":16,"not-deployed":4,"skipped":1},"bySideEffect":{"charges-balance":6,"db-write":16,"external-webhook":3,"messages-admin":6,"messages-owners":2,"messages-user":12,"none":0,"paid-api":19},"byTrigger":{"cron":5,"event":23},"codeOnly":0,"deployUnknown":0,"deployed":24,"notDeployed":4,"specOnly":0,"specPlusCode":28,"specs":28,"typecheckOk":28,"withCronSpec":5,"withDifferences":1},"functions":[{"code":{"control":"spec+code","deployed":true,"file":"src/inngest_app/functions/analytics/dailySalesAdvisor.ts","legacyId":"daily-sales-advisor","probeResult":"COMPLETED","retries":1,"steps":5},"cronSpec":"inngest/999-multibots-telegraf/daily-sales-advisor","differences":[],"discarded":0,"fields":{"CONTROL":"spec+code","CRON":"0 9 * * *","DOMAIN":"analytics","EVENT":"","GUARD":"none","ID":"analytics-sales-advise","KIND":"function","LEGACY_EVENTS":[],"LEGACY_ID":"daily-sales-advisor","NAME":"Daily sales advisor","NOTE":"The same schedule is stated as a cron card, specs/crons ID inngest/999-multibots-telegraf/daily-sales-advisor. The step name report-${ownerId} is a template expanded once per owner. A manual invoke on 2026-09-09 messaged 13 owners; the hardening list asks this function to honour safe mode.","ON_FAILURE":"log","PROBE_RESULT":"COMPLETED","REPO":"999-multibots-telegraf","RETRIES":1,"SAFE_PROBE":"{}","SERVICE":"src/inngest_app/functions/analytics/dailySalesAdvisor.ts:54","SIDE_EFFECTS":["messages-owners","messages-admin"],"STEPS":["load-owners","load-payments-7d","load-payments-1d","load-payments-2d","report-${ownerId}"],"SUMMARY_EN":"Every day at 09:00 UTC loads the bot owners and their payments over the last seven, two and one days and sends each owner a sales report, with a copy to the admin chat.","TRIGGER":"cron","TZ":"UTC"},"health":"ok","id":"analytics-sales-advise","inSpecCorpus":false,"messages":[],"moduleName":"fn_analytics_sales_advise","name":{"en":"Daily sales advisor","ru":"Ежедневный советник по продажам"},"sha256":"22f09be2b6651090b1704700bf03ee6e25c741ef726c92c34171cb37e0eb4fa4","specPath":"specs/functions/analytics-sales-advise.t27","summary":{"en":"Every day at 09:00 UTC loads the bot owners and their payments over the last seven, two and one days and sends each owner a sales report, with a copy to the admin chat.","ru":"Каждый день в 09:00 UTC загружает владельцев ботов и их платежи за последние семь, два и один день и отправляет каждому владельцу отчёт о продажах с копией в админ-чат."},"typecheckOk":true,"witness":"spec+code"},{"code":{"control":"spec+code","deployed":true,"file":"src/inngest_app/functions/analytics/skillDetector.ts","legacyId":"skill-detector","probeResult":"COMPLETED","retries":1,"steps":3},"cronSpec":"inngest/999-multibots-telegraf/skill-detector","differences":[],"discarded":0,"fields":{"CONTROL":"spec+code","CRON":"0 10 * * *","DOMAIN":"analytics","EVENT":"","GUARD":"none","ID":"analytics-skills-detect","KIND":"function","LEGACY_EVENTS":[],"LEGACY_ID":"skill-detector","NAME":"Skill detector","NOTE":"The same schedule is stated as a cron card, specs/crons ID inngest/999-multibots-telegraf/skill-detector. The step name detect-${serviceType} is a template expanded once per service type.","ON_FAILURE":"log","PROBE_RESULT":"COMPLETED","REPO":"999-multibots-telegraf","RETRIES":1,"SAFE_PROBE":"{}","SERVICE":"src/inngest_app/functions/analytics/skillDetector.ts:30","SIDE_EFFECTS":["messages-owners","messages-admin"],"STEPS":["load-existing-skills","detect-${serviceType}","notify-admin"],"SUMMARY_EN":"Every day at 10:00 UTC loads the known skills, detects new service types from recent usage, one detection step per service type, and notifies the admin chat.","TRIGGER":"cron","TZ":"UTC"},"health":"ok","id":"analytics-skills-detect","inSpecCorpus":false,"messages":[],"moduleName":"fn_analytics_skills_detect","name":{"en":"Skill detector","ru":"Детектор навыков"},"sha256":"e03e0b8b71566e3cce95146ec4825f3421b844c504f10a8ca0e755db14540e53","specPath":"specs/functions/analytics-skills-detect.t27","summary":{"en":"Every day at 10:00 UTC loads the known skills, detects new service types from recent usage, one detection step per service type, and notifies the admin chat.","ru":"Каждый день в 10:00 UTC загружает известные навыки, находит новые типы сервисов по недавнему использованию (по одному шагу на тип сервиса) и уведомляет админ-чат."},"typecheckOk":true,"witness":"spec+code"},{"code":{"control":"spec+code","deployed":true,"file":null,"legacyId":"broadcast-message","probeResult":"FAILED-at-guard","retries":null,"steps":0},"cronSpec":null,"differences":[],"discarded":0,"fields":{"CONTROL":"spec+code","CRON":"","DOMAIN":"broadcast","EVENT":"broadcast/message.send","GUARD":"validate-input","ID":"broadcast-message-send","KIND":"function","LEGACY_EVENTS":["broadcast/send-message"],"LEGACY_ID":"broadcast-message","NAME":"Broadcast message","NOTE":"The manifest carries no file, steps or retries for this function (its extractor did not resolve them); SERVICE, STEPS and RETRIES here were read from the same checkout (retries 3). Guard is validate-input. A test_telegram_id in the payload narrows the audience to one recipient.","ON_FAILURE":"log","PROBE_RESULT":"FAILED-at-guard","REPO":"999-multibots-telegraf","RETRIES":3,"SAFE_PROBE":"{}","SERVICE":"src/inngest_app/functions/broadcast/broadcastMessage.ts:22","SIDE_EFFECTS":["messages-user"],"STEPS":["validate-input","check-permissions","fetch-users","send-messages","analyze-results"],"SUMMARY_EN":"Sends a broadcast to a bot audience: validates the request, checks the sender permissions, fetches the recipients, sends the messages and summarises the delivery results.","TRIGGER":"event","TZ":"UTC"},"health":"ok","id":"broadcast-message-send","inSpecCorpus":false,"messages":[],"moduleName":"fn_broadcast_message_send","name":{"en":"Broadcast message","ru":"Рассылка сообщения"},"sha256":"53f3415e61b946dfe7216c4d03e52cd53225207b9a8741bf9904dab9092eb357","specPath":"specs/functions/broadcast-message-send.t27","summary":{"en":"Sends a broadcast to a bot audience: validates the request, checks the sender permissions, fetches the recipients, sends the messages and summarises the delivery results.","ru":"Отправляет рассылку аудитории бота: проверяет запрос и права отправителя, получает список получателей, отправляет сообщения и подводит итоги доставки."},"typecheckOk":true,"witness":"spec+code"},{"code":{"control":"spec+code","deployed":true,"file":"src/inngest_app/functions/content/generateDetailedScript.ts","legacyId":"generate-detailed-script","probeResult":"FAILED-at-guard","retries":null,"steps":3},"cronSpec":null,"differences":[],"discarded":0,"fields":{"CONTROL":"spec+code","CRON":"","DOMAIN":"content","EVENT":"content/detailed-script.generate","GUARD":"zod-schema","ID":"content-detailed-script-generate","KIND":"function","LEGACY_EVENTS":["content/generate-detailed-script"],"LEGACY_ID":"generate-detailed-script","NAME":"Generate detailed script","NOTE":"RETRIES is not declared in the code, so the Inngest JS SDK v3 default of 4 applies. Guard is zod-schema.","ON_FAILURE":"log","PROBE_RESULT":"FAILED-at-guard","REPO":"999-multibots-telegraf","RETRIES":4,"SAFE_PROBE":"{}","SERVICE":"src/inngest_app/functions/content/generateDetailedScript.ts:191","SIDE_EFFECTS":["paid-api","db-write"],"STEPS":["create-script-record","generate-detailed-scenes","save-detailed-script"],"SUMMARY_EN":"Expands a script into detailed scenes: creates the script record, generates the scene-by-scene text with a language model and stores the detailed script.","TRIGGER":"event","TZ":"UTC"},"health":"ok","id":"content-detailed-script-generate","inSpecCorpus":false,"messages":[],"moduleName":"fn_content_detailed_script_generate","name":{"en":"Generate detailed script","ru":"Детальный сценарий"},"sha256":"4360313e280f6638395cf3aab44984a5a215e39aa9c61d11ed8c0e5ecfb028a3","specPath":"specs/functions/content-detailed-script-generate.t27","summary":{"en":"Expands a script into detailed scenes: creates the script record, generates the scene-by-scene text with a language model and stores the detailed script.","ru":"Разворачивает сценарий в подробные сцены: создаёт запись сценария, генерирует текст по сценам языковой моделью и сохраняет детальный сценарий."},"typecheckOk":true,"witness":"spec+code"},{"code":{"control":"spec+code","deployed":true,"file":"src/inngest_app/functions/content/generateScenarioClips.ts","legacyId":"generate-scenario-clips","probeResult":"FAILED-at-guard","retries":null,"steps":4},"cronSpec":null,"differences":[],"discarded":0,"fields":{"CONTROL":"spec+code","CRON":"","DOMAIN":"content","EVENT":"content/scenario-clips.generate","GUARD":"zod-schema","ID":"content-scenario-clips-generate","KIND":"function","LEGACY_EVENTS":["content/generate-scenario-clips"],"LEGACY_ID":"generate-scenario-clips","NAME":"Generate scenario clips","NOTE":"RETRIES is not declared in the code, so the Inngest JS SDK v3 default of 4 applies. Guard is zod-schema.","ON_FAILURE":"log","PROBE_RESULT":"FAILED-at-guard","REPO":"999-multibots-telegraf","RETRIES":4,"SAFE_PROBE":"{}","SERVICE":"src/inngest_app/functions/content/generateScenarioClips.ts:221","SIDE_EFFECTS":["paid-api","db-write"],"STEPS":["create-scenario-record","generate-detailed-scenes","create-text-reports-archive","update-scenario-record"],"SUMMARY_EN":"Builds a scenario from a script: creates the scenario record, generates the detailed scenes, packs the text reports into an archive and updates the record.","TRIGGER":"event","TZ":"UTC"},"health":"ok","id":"content-scenario-clips-generate","inSpecCorpus":false,"messages":[],"moduleName":"fn_content_scenario_clips_generate","name":{"en":"Generate scenario clips","ru":"Клипы по сценарию"},"sha256":"a7f24bf9b6921c2d3b5bbb4bd4519b8bb42623a7bf54ba85ceb3b39e12799c74","specPath":"specs/functions/content-scenario-clips-generate.t27","summary":{"en":"Builds a scenario from a script: creates the scenario record, generates the detailed scenes, packs the text reports into an archive and updates the record.","ru":"Строит сценарий по скрипту: создаёт запись, генерирует подробные сцены, упаковывает текстовые отчёты в архив и обновляет запись."},"typecheckOk":true,"witness":"spec+code"},{"code":{"control":"spec+code","deployed":true,"file":"src/inngest_app/functions/content/generateContentScripts.ts","legacyId":"generate-content-scripts","probeResult":"FAILED-at-guard","retries":null,"steps":5},"cronSpec":null,"differences":[],"discarded":0,"fields":{"CONTROL":"spec+code","CRON":"","DOMAIN":"content","EVENT":"content/scripts.generate","GUARD":"zod-schema","ID":"content-scripts-generate","KIND":"function","LEGACY_EVENTS":["instagram/generate-scripts"],"LEGACY_ID":"generate-content-scripts","NAME":"Generate content scripts","NOTE":"RETRIES is not declared in the code, so the Inngest JS SDK v3 default of 4 applies. Guard is zod-schema. The legacy event name keeps the instagram/ prefix the function was first registered under.","ON_FAILURE":"log","PROBE_RESULT":"FAILED-at-guard","REPO":"999-multibots-telegraf","RETRIES":4,"SAFE_PROBE":"{}","SERVICE":"src/inngest_app/functions/content/generateContentScripts.ts:44","SIDE_EFFECTS":["paid-api","db-write"],"STEPS":["get-reel-data","extract-audio","transcribe-audio","generate-scripts","save-scripts"],"SUMMARY_EN":"Writes content scripts from a stored reel: loads the reel, extracts and transcribes the audio, generates the scripts with a language model and stores them.","TRIGGER":"event","TZ":"UTC"},"health":"ok","id":"content-scripts-generate","inSpecCorpus":false,"messages":[],"moduleName":"fn_content_scripts_generate","name":{"en":"Generate content scripts","ru":"Сценарии контента"},"sha256":"2c65fc896945f85b8a031bf434390756577e278e8daf5affeed9046d7978492a","specPath":"specs/functions/content-scripts-generate.t27","summary":{"en":"Writes content scripts from a stored reel: loads the reel, extracts and transcribes the audio, generates the scripts with a language model and stores them.","ru":"Пишет сценарии контента по сохранённому рилсу: загружает рилс, извлекает и расшифровывает звук, генерирует сценарии языковой моделью и сохраняет их."},"typecheckOk":true,"witness":"spec+code"},{"code":{"control":"spec+code","deployed":true,"file":"src/inngest_app/functions/content/findCompetitors.ts","legacyId":"find-competitors","probeResult":"FAILED-at-guard","retries":null,"steps":6},"cronSpec":null,"differences":[],"discarded":0,"fields":{"CONTROL":"spec+code","CRON":"","DOMAIN":"instagram","EVENT":"instagram/competitors.find","GUARD":"validate-input","ID":"instagram-competitors-find","KIND":"function","LEGACY_EVENTS":["instagram/find-competitors"],"LEGACY_ID":"find-competitors","NAME":"Find competitors","NOTE":"RETRIES is not declared in the code, so the Inngest JS SDK v3 default of 4 applies. Guard is validate-input.","ON_FAILURE":"log","PROBE_RESULT":"FAILED-at-guard","REPO":"999-multibots-telegraf","RETRIES":4,"SAFE_PROBE":"{}","SERVICE":"src/inngest_app/functions/content/findCompetitors.ts:134","SIDE_EFFECTS":["paid-api","db-write"],"STEPS":["validate-input","validate-project","call-instagram-api","filter-by-followers","save-to-competitors-table","send-telegram-notification"],"SUMMARY_EN":"Finds Instagram competitors for a project: validates the request and the project, calls the Instagram API, filters by follower count, stores the competitors and notifies the requester in Telegram.","TRIGGER":"event","TZ":"UTC"},"health":"ok","id":"instagram-competitors-find","inSpecCorpus":false,"messages":[],"moduleName":"fn_instagram_competitors_find","name":{"en":"Find competitors","ru":"Поиск конкурентов"},"sha256":"8201d47aaa9d3ca811c9a2ddf8b4e227645473d0122da9311fd542a5e53cfaa9","specPath":"specs/functions/instagram-competitors-find.t27","summary":{"en":"Finds Instagram competitors for a project: validates the request and the project, calls the Instagram API, filters by follower count, stores the competitors and notifies the requester in Telegram.","ru":"Находит конкурентов в Instagram для проекта: проверяет запрос и проект, вызывает Instagram API, фильтрует по числу подписчиков, сохраняет конкурентов и уведомляет заказчика в Telegram."},"typecheckOk":true,"witness":"spec+code"},{"code":{"control":"spec+code","deployed":true,"file":"src/inngest_app/functions/content/analyzeCompetitorReels.ts","legacyId":"analyze-competitor-reels","probeResult":"FAILED-at-guard","retries":null,"steps":7},"cronSpec":null,"differences":[],"discarded":0,"fields":{"CONTROL":"spec+code","CRON":"","DOMAIN":"instagram","EVENT":"instagram/reels.analyze","GUARD":"validate-input","ID":"instagram-reels-analyze","KIND":"function","LEGACY_EVENTS":["instagram/analyze-reels"],"LEGACY_ID":"analyze-competitor-reels","NAME":"Analyze competitor reels","NOTE":"RETRIES is not declared in the code, so the Inngest JS SDK v3 default of 4 applies. Guard is validate-input.","ON_FAILURE":"log","PROBE_RESULT":"FAILED-at-guard","REPO":"999-multibots-telegraf","RETRIES":4,"SAFE_PROBE":"{}","SERVICE":"src/inngest_app/functions/content/analyzeCompetitorReels.ts:211","SIDE_EFFECTS":["paid-api","db-write"],"STEPS":["validate-input","validate-project","call-instagram-reels-api","filter-reels-by-date","calculate-metrics","save-to-reels-analysis-table","send-telegram-notification"],"SUMMARY_EN":"Analyzes the recent reels of an Instagram competitor for a project: validates the request and the project, calls the reels API, filters by date, computes the metrics, stores the analysis and notifies the requester in Telegram.","TRIGGER":"event","TZ":"UTC"},"health":"ok","id":"instagram-reels-analyze","inSpecCorpus":false,"messages":[],"moduleName":"fn_instagram_reels_analyze","name":{"en":"Analyze competitor reels","ru":"Анализ рилсов конкурента"},"sha256":"6c4c986a981251d73c668906e1bf7d6d1890d1c9cff359d33a05a64551ed5a0a","specPath":"specs/functions/instagram-reels-analyze.t27","summary":{"en":"Analyzes the recent reels of an Instagram competitor for a project: validates the request and the project, calls the reels API, filters by date, computes the metrics, stores the analysis and notifies the requester in Telegram.","ru":"Анализирует недавние рилсы конкурента в Instagram для проекта: проверяет запрос и проект, вызывает API рилсов, фильтрует по дате, считает метрики, сохраняет анализ и уведомляет заказчика в Telegram."},"typecheckOk":true,"witness":"spec+code"},{"code":{"control":"spec+code","deployed":true,"file":"src/inngest_app/functions/content/extractTopContent.ts","legacyId":"extract-top-content","probeResult":"FAILED-at-guard","retries":null,"steps":3},"cronSpec":null,"differences":[],"discarded":0,"fields":{"CONTROL":"spec+code","CRON":"","DOMAIN":"instagram","EVENT":"instagram/top-content.extract","GUARD":"zod-schema","ID":"instagram-top-content-extract","KIND":"function","LEGACY_EVENTS":["instagram/extract-top"],"LEGACY_ID":"extract-top-content","NAME":"Extract top content","NOTE":"RETRIES is not declared in the code, so the Inngest JS SDK v3 default of 4 applies. Guard is zod-schema.","ON_FAILURE":"log","PROBE_RESULT":"FAILED-at-guard","REPO":"999-multibots-telegraf","RETRIES":4,"SAFE_PROBE":"{}","SERVICE":"src/inngest_app/functions/content/extractTopContent.ts:33","SIDE_EFFECTS":["paid-api","db-write"],"STEPS":["query-top-reels","process-reels","format-report"],"SUMMARY_EN":"Extracts the top-performing reels already stored for a project: queries the stored reels, processes them and formats the report.","TRIGGER":"event","TZ":"UTC"},"health":"ok","id":"instagram-top-content-extract","inSpecCorpus":false,"messages":[],"moduleName":"fn_instagram_top_content_extract","name":{"en":"Extract top content","ru":"Лучший контент"},"sha256":"4b2c8ee5877c376316e94eda74ac07c789c1ee5c467313c7f093a3ae32bdc4b6","specPath":"specs/functions/instagram-top-content-extract.t27","summary":{"en":"Extracts the top-performing reels already stored for a project: queries the stored reels, processes them and formats the report.","ru":"Извлекает самые результативные рилсы, уже сохранённые для проекта: запрашивает их из базы, обрабатывает и формирует отчёт."},"typecheckOk":true,"witness":"spec+code"},{"code":{"control":"spec+code","deployed":true,"file":"src/inngest_app/functions/monitoring/criticalErrorMonitor.ts","legacyId":"critical-error-monitor","probeResult":"COMPLETED","retries":1,"steps":4},"cronSpec":null,"differences":[],"discarded":0,"fields":{"CONTROL":"spec+code","CRON":"","DOMAIN":"monitoring","EVENT":"monitoring/error.report","GUARD":"none","ID":"monitoring-error-report","KIND":"function","LEGACY_EVENTS":["app/error.critical"],"LEGACY_ID":"critical-error-monitor","NAME":"Critical error report","NOTE":"No guard: the event is emitted by the application itself. The hardening list asks the formatter to render string, Error and {message} payloads and never print [object Object].","ON_FAILURE":"log","PROBE_RESULT":"COMPLETED","REPO":"999-multibots-telegraf","RETRIES":1,"SAFE_PROBE":"{}","SERVICE":"src/inngest_app/functions/monitoring/criticalErrorMonitor.ts:175","SIDE_EFFECTS":["messages-admin"],"STEPS":["analyze-error","format-message","send-notification","log-for-analysis"],"SUMMARY_EN":"Reports a critical application error to the admin chat: analyzes the error, formats the message, sends the notification and logs the incident for later analysis.","TRIGGER":"event","TZ":"UTC"},"health":"ok","id":"monitoring-error-report","inSpecCorpus":false,"messages":[],"moduleName":"fn_monitoring_error_report","name":{"en":"Critical error report","ru":"Отчёт о критической ошибке"},"sha256":"13cb1dcbfcb0f13ec58ba56cd2b3b2b788ccbc0e2b6cfc610e46b850889bee15","specPath":"specs/functions/monitoring-error-report.t27","summary":{"en":"Reports a critical application error to the admin chat: analyzes the error, formats the message, sends the notification and logs the incident for later analysis.","ru":"Сообщает о критической ошибке приложения в админ-чат: анализирует ошибку, форматирует сообщение, отправляет уведомление и записывает инцидент для последующего разбора."},"typecheckOk":true,"witness":"spec+code"},{"code":{"control":"spec+code","deployed":true,"file":"src/inngest_app/functions/monitoring/criticalErrorMonitor.ts","legacyId":"health-check","probeResult":"COMPLETED","retries":2,"steps":3},"cronSpec":"inngest/999-multibots-telegraf/health-check","differences":[],"discarded":0,"fields":{"CONTROL":"spec+code","CRON":"*/30 * * * *","DOMAIN":"monitoring","EVENT":"","GUARD":"none","ID":"monitoring-health-check","KIND":"function","LEGACY_EVENTS":[],"LEGACY_ID":"health-check","NAME":"Health check","NOTE":"The same schedule is stated as a cron card, specs/crons ID inngest/999-multibots-telegraf/health-check. Lives in the same file as monitoring-error-report.","ON_FAILURE":"log","PROBE_RESULT":"COMPLETED","REPO":"999-multibots-telegraf","RETRIES":2,"SAFE_PROBE":"{}","SERVICE":"src/inngest_app/functions/monitoring/criticalErrorMonitor.ts:235","SIDE_EFFECTS":["messages-admin"],"STEPS":["check-api-health","check-inngest-health","notify-unhealthy"],"SUMMARY_EN":"Every 30 minutes checks the API server and the Inngest service and messages the admin chat when either is unhealthy.","TRIGGER":"cron","TZ":"UTC"},"health":"ok","id":"monitoring-health-check","inSpecCorpus":false,"messages":[],"moduleName":"fn_monitoring_health_check","name":{"en":"Health check","ru":"Проверка здоровья"},"sha256":"57c23797300ea168c457a74d4edc25c1bcd249408efb634dcd32a7dbfa086260","specPath":"specs/functions/monitoring-health-check.t27","summary":{"en":"Every 30 minutes checks the API server and the Inngest service and messages the admin chat when either is unhealthy.","ru":"Каждые 30 минут проверяет API-сервер и сервис Inngest и пишет в админ-чат, если один из них нездоров."},"typecheckOk":true,"witness":"spec+code"},{"code":{"control":"spec+code","deployed":true,"file":"src/inngest_app/functions/monitoring/logMonitor.ts","legacyId":"log-monitor","probeResult":"COMPLETED","retries":2,"steps":4},"cronSpec":"inngest/999-multibots-telegraf/log-monitor","differences":[],"discarded":0,"fields":{"CONTROL":"spec+code","CRON":"0 10 * * *","DOMAIN":"monitoring","EVENT":"","GUARD":"none","ID":"monitoring-logs-analyze","KIND":"function","LEGACY_EVENTS":[],"LEGACY_ID":"log-monitor","NAME":"Daily log analysis","NOTE":"The same schedule is stated as a cron card, specs/crons ID inngest/999-multibots-telegraf/log-monitor. When LOG_DIR is absent on the host the analysis has nothing to read; the hardening list asks for a fallback to the Inngest run summary.","ON_FAILURE":"log","PROBE_RESULT":"COMPLETED","REPO":"999-multibots-telegraf","RETRIES":2,"SAFE_PROBE":"{}","SERVICE":"src/inngest_app/functions/monitoring/logMonitor.ts:352","SIDE_EFFECTS":["messages-admin"],"STEPS":["read-logs","analyze-logs","generate-message","send-notification"],"SUMMARY_EN":"Every day at 10:00 UTC reads the application logs, analyzes them for errors and warnings, generates a summary and sends it to the admin chat.","TRIGGER":"cron","TZ":"UTC"},"health":"ok","id":"monitoring-logs-analyze","inSpecCorpus":false,"messages":[],"moduleName":"fn_monitoring_logs_analyze","name":{"en":"Daily log analysis","ru":"Ежедневный анализ логов"},"sha256":"95c9e9bbfaae6a21c206eb8bd48f2a4eb041ab64cfbb9e7e709069e3ac14de52","specPath":"specs/functions/monitoring-logs-analyze.t27","summary":{"en":"Every day at 10:00 UTC reads the application logs, analyzes them for errors and warnings, generates a summary and sends it to the admin chat.","ru":"Каждый день в 10:00 UTC читает логи приложения, ищет в них ошибки и предупреждения, формирует сводку и отправляет её в админ-чат."},"typecheckOk":true,"witness":"spec+code"},{"code":{"control":"spec+code","deployed":true,"file":"src/inngest_app/functions/monitoring/logMonitor.ts","legacyId":"trigger-log-monitor","probeResult":"COMPLETED","retries":1,"steps":4},"cronSpec":null,"differences":[],"discarded":0,"fields":{"CONTROL":"spec+code","CRON":"","DOMAIN":"monitoring","EVENT":"monitoring/logs.trigger","GUARD":"none","ID":"monitoring-logs-trigger","KIND":"function","LEGACY_EVENTS":["logs/monitor.trigger"],"LEGACY_ID":"trigger-log-monitor","NAME":"Log analysis on demand","NOTE":"Shares its file and its four steps with monitoring-logs-analyze; only the trigger differs.","ON_FAILURE":"log","PROBE_RESULT":"COMPLETED","REPO":"999-multibots-telegraf","RETRIES":1,"SAFE_PROBE":"{}","SERVICE":"src/inngest_app/functions/monitoring/logMonitor.ts:408","SIDE_EFFECTS":["messages-admin"],"STEPS":["read-logs","analyze-logs","generate-message","send-notification"],"SUMMARY_EN":"Runs the same log analysis as the daily job when asked by an event: reads the logs, analyzes them, generates the summary and sends it to the admin chat.","TRIGGER":"event","TZ":"UTC"},"health":"ok","id":"monitoring-logs-trigger","inSpecCorpus":false,"messages":[],"moduleName":"fn_monitoring_logs_trigger","name":{"en":"Log analysis on demand","ru":"Анализ логов по запросу"},"sha256":"9bb3e3fb5d73315392c6a08b674ca0b04d63b1e324dfa2a5ecb50bbdae6d074f","specPath":"specs/functions/monitoring-logs-trigger.t27","summary":{"en":"Runs the same log analysis as the daily job when asked by an event: reads the logs, analyzes them, generates the summary and sends it to the admin chat.","ru":"Выполняет тот же анализ логов, что и ежедневная задача, по событию: читает логи, анализирует их, формирует сводку и отправляет в админ-чат."},"typecheckOk":true,"witness":"spec+code"},{"code":{"control":"spec+code","deployed":true,"file":"src/inngest_app/functions/training/morphImages.ts","legacyId":"morph-images","probeResult":"FAILED-at-guard","retries":3,"steps":8},"cronSpec":null,"differences":[],"discarded":0,"fields":{"CONTROL":"spec+code","CRON":"","DOMAIN":"morph","EVENT":"morph/images.generate","GUARD":"check-user-exists","ID":"morph-images-generate","KIND":"function","LEGACY_EVENTS":["morph/images.requested"],"LEGACY_ID":"morph-images","NAME":"Morph images","NOTE":"Guard is check-user-exists. A second, unregistered copy of this function exists in the tree (src/inngest_app/functions/morphImages.ts); the registered one is the file named in SERVICE.","ON_FAILURE":"log","PROBE_RESULT":"FAILED-at-guard","REPO":"999-multibots-telegraf","RETRIES":3,"SAFE_PROBE":"{\"telegram_id\": \"0\", \"bot_name\": \"e2e_nonexistent_bot\", \"is_ru\": true, \"job_id\": \"e2e-probe\", \"image_files\": [], \"extraction_path\": \"/nonexistent/e2e\", \"morphing_type\": \"seamless\", \"model\": \"kling-v1.6-pro\"}","SERVICE":"src/inngest_app/functions/training/morphImages.ts:30","SIDE_EFFECTS":["charges-balance","paid-api","messages-user"],"STEPS":["check-user-exists","check-balance","notify-start","process-all-pairs","process-loop-pair","concatenate-all-videos","cleanup-temp-files","deliver-result"],"SUMMARY_EN":"Morphs a sequence of user images into one video: checks the user and the balance, notifies the start, processes each image pair into a clip, concatenates the clips, cleans up and delivers the result.","TRIGGER":"event","TZ":"UTC"},"health":"ok","id":"morph-images-generate","inSpecCorpus":false,"messages":[],"moduleName":"fn_morph_images_generate","name":{"en":"Morph images","ru":"Морфинг изображений"},"sha256":"2d830937229c3a5e780c372b433bbf53e38ccde9444ecb20e599fb20e65b2444","specPath":"specs/functions/morph-images-generate.t27","summary":{"en":"Morphs a sequence of user images into one video: checks the user and the balance, notifies the start, processes each image pair into a clip, concatenates the clips, cleans up and delivers the result.","ru":"Превращает последовательность изображений пользователя в одно видео: проверяет пользователя и баланс, сообщает о старте, обрабатывает каждую пару изображений в клип, склеивает клипы, очищает временные файлы и отдаёт результат."},"typecheckOk":true,"witness":"spec+code"},{"code":{"control":"spec+code","deployed":true,"file":"src/inngest_app/functions/neuroImageGeneration.ts","legacyId":"neuro-image-generation","probeResult":"FAILED-at-guard","retries":3,"steps":11},"cronSpec":null,"differences":[],"discarded":0,"fields":{"CONTROL":"spec+code","CRON":"","DOMAIN":"neuro","EVENT":"neuro/image.generate","GUARD":"check-user","ID":"neuro-image-generate","KIND":"function","LEGACY_EVENTS":["neuro/photo.generate"],"LEGACY_ID":"neuro-image-generation","NAME":"Neuro image generation","NOTE":"Guard is check-user: an unknown telegram_id stops the run before any payment or paid API call. The step names generate-image-${i} and notify-image-${i} are templates the code expands once per requested image.","ON_FAILURE":"admin-telegram","PROBE_RESULT":"FAILED-at-guard","REPO":"999-multibots-telegraf","RETRIES":3,"SAFE_PROBE":"{\"telegram_id\": \"0\", \"bot_name\": \"e2e_nonexistent_bot\", \"prompt\": \"safe-mode probe\", \"is_ru\": true, \"num_images\": 1, \"model_url\": \"e2e/none\"}","SERVICE":"src/inngest_app/functions/neuroImageGeneration.ts:56","SIDE_EFFECTS":["charges-balance","paid-api","messages-user","db-write"],"STEPS":["get-bot","check-user","get-user-gender","update-level","calculate-total-cost","process-payment","get-aspect-ratio","generate-image-${i}","notify-image-${i}","deduct-balance-final","final-notification"],"SUMMARY_EN":"Generates one or more images for a Telegram user from a prompt and a model URL: loads the bot and the user, computes the total cost, charges the balance, then generates and sends each image and settles the balance at the end.","TRIGGER":"event","TZ":"UTC"},"health":"ok","id":"neuro-image-generate","inSpecCorpus":false,"messages":[],"moduleName":"fn_neuro_image_generate","name":{"en":"Neuro image generation","ru":"Нейро-генерация изображений"},"sha256":"513d1e81f02cb450989ea83082948afcce37819434528fbed6b60930b2941fd8","specPath":"specs/functions/neuro-image-generate.t27","summary":{"en":"Generates one or more images for a Telegram user from a prompt and a model URL: loads the bot and the user, computes the total cost, charges the balance, then generates and sends each image and settles the balance at the end.","ru":"Генерирует одно или несколько изображений для пользователя Telegram по промпту и URL модели: загружает бота и пользователя, считает полную стоимость, списывает баланс, затем генерирует и отправляет каждое изображение и сводит баланс в конце."},"typecheckOk":true,"witness":"spec+code"},{"code":{"control":"spec+code","deployed":true,"file":null,"legacyId":"payment-processing-ai-server","probeResult":"COMPLETED","retries":null,"steps":0},"cronSpec":null,"differences":[{"code":"log","field":"ON_FAILURE","spec":"admin-telegram"}],"discarded":0,"fields":{"CONTROL":"spec+code","CRON":"","DOMAIN":"payment","EVENT":"payment/ai-server.process","GUARD":"amount-match","ID":"payment-ai-server-process","KIND":"function","LEGACY_EVENTS":["payment/process-ai-server"],"LEGACY_ID":"payment-processing-ai-server","NAME":"AI-server payment processing","NOTE":"The manifest carries no file, steps or retries for this function (its extractor did not resolve them); SERVICE, STEPS and RETRIES here were read from the same checkout, where retries is declared as 3 and onFailure is createInngestFailureHandler, which logs and messages the admin chat -- the manifest says on_failure log. Guard is amount-match: an amount matching no plan or option stops the run, which is why the 2026-09-09 probe with IncSum 0.01 COMPLETED without a balance change.","ON_FAILURE":"admin-telegram","PROBE_RESULT":"COMPLETED","REPO":"999-multibots-telegraf","RETRIES":3,"SAFE_PROBE":"{\"IncSum\": \"0.01\", \"inv_id\": \"e2e-safe-mode-probe\"}","SERVICE":"src/inngest_app/functions/payments/paymentProcessing.ts:64","SIDE_EFFECTS":["db-write","messages-user"],"STEPS":["check-subscription-plan","check-payment-option","get-user-info","get-bot-config","update-user-balance","send-notification"],"SUMMARY_EN":"Processes a payment reported by the AI server: matches the amount to a subscription plan or a payment option, loads the user and the bot configuration, updates the user balance and sends the payment notification.","TRIGGER":"event","TZ":"UTC"},"health":"warn","id":"payment-ai-server-process","inSpecCorpus":false,"messages":["ON_FAILURE \"admin-telegram\" differs from the manifest (\"log\")"],"moduleName":"fn_payment_ai_server_process","name":{"en":"AI-server payment processing","ru":"Обработка платежа AI-сервера"},"sha256":"07191109132327c0a3743ccc06815ccd2c64b5b6d604b358d26cb6e236dadfe6","specPath":"specs/functions/payment-ai-server-process.t27","summary":{"en":"Processes a payment reported by the AI server: matches the amount to a subscription plan or a payment option, loads the user and the bot configuration, updates the user balance and sends the payment notification.","ru":"Обрабатывает платёж, о котором сообщил AI-сервер: сопоставляет сумму с планом подписки или вариантом оплаты, загружает пользователя и конфигурацию бота, обновляет баланс и отправляет уведомление о платеже."},"typecheckOk":true,"witness":"spec+code"},{"code":{"control":"spec+code","deployed":true,"file":"src/inngest_app/functions/ai-reels-callback.ts","legacyId":"ai-reels-callback","probeResult":"FAILED-at-guard","retries":3,"steps":3},"cronSpec":null,"differences":[],"discarded":0,"fields":{"CONTROL":"spec+code","CRON":"","DOMAIN":"reels","EVENT":"reels/ai.callback","GUARD":"extract-job-id","ID":"reels-ai-callback","KIND":"function","LEGACY_EVENTS":["ai-reels-callback"],"LEGACY_ID":"ai-reels-callback","NAME":"AI reels callback","NOTE":"Guard is extract-job-id: a payload without a job id fails before anything is sent.","ON_FAILURE":"admin-telegram","PROBE_RESULT":"FAILED-at-guard","REPO":"999-multibots-telegraf","RETRIES":3,"SAFE_PROBE":"{}","SERVICE":"src/inngest_app/functions/ai-reels-callback.ts:158","SIDE_EFFECTS":["paid-api","messages-user"],"STEPS":["send-completed-video","send-failed-message","send-processing-update"],"SUMMARY_EN":"Handles the provider callback for an AI reel job: extracts the job id, then sends the completed video, a failure message or a processing update to the user who ordered it.","TRIGGER":"event","TZ":"UTC"},"health":"ok","id":"reels-ai-callback","inSpecCorpus":false,"messages":[],"moduleName":"fn_reels_ai_callback","name":{"en":"AI reels callback","ru":"Колбэк AI-рилсов"},"sha256":"8db0866dc43faf34aef111565007cdcdb66dd1d6dea46e8f7c7ab2ec97cdf13e","specPath":"specs/functions/reels-ai-callback.t27","summary":{"en":"Handles the provider callback for an AI reel job: extracts the job id, then sends the completed video, a failure message or a processing update to the user who ordered it.","ru":"Обрабатывает колбэк провайдера по задаче AI-рилса: извлекает id задачи, затем отправляет заказчику готовое видео, сообщение об ошибке или статус обработки."},"typecheckOk":true,"witness":"spec+code"},{"code":{"control":"spec+code","deployed":true,"file":"src/inngest_app/functions/existing/generateAIReelsFunction.ts","legacyId":"ai-reels-generation","probeResult":"skipped","retries":2,"steps":4},"cronSpec":null,"differences":[],"discarded":0,"fields":{"CONTROL":"spec+code","CRON":"","DOMAIN":"reels","EVENT":"reels/ai.generate","GUARD":"none","ID":"reels-ai-generate","KIND":"function","LEGACY_EVENTS":["ai-reels/generate"],"LEGACY_ID":"ai-reels-generation","NAME":"AI reels generation","NOTE":"No guard: the first step already calls a paid API, so the 2026-09-09 probe skipped this function (PROBE_RESULT skipped). The hardening list asks for a validate-input step before that call.","ON_FAILURE":"log","PROBE_RESULT":"skipped","REPO":"999-multibots-telegraf","RETRIES":2,"SAFE_PROBE":"","SERVICE":"src/inngest_app/functions/existing/generateAIReelsFunction.ts:44","SIDE_EFFECTS":["paid-api","messages-user"],"STEPS":["generate-lipsync-video","generate-wan25-video","merge-videos","notify-telegram"],"SUMMARY_EN":"Builds a short AI reel: a lip-sync video from an image and a text or audio track, a second generated clip, the two merged, and the result sent to the user in Telegram.","TRIGGER":"event","TZ":"UTC"},"health":"ok","id":"reels-ai-generate","inSpecCorpus":false,"messages":[],"moduleName":"fn_reels_ai_generate","name":{"en":"AI reels generation","ru":"Генерация AI-рилсов"},"sha256":"11108a3f4c94af03d615a4f82336b1671b293aa40409293448ae52a58d598b20","specPath":"specs/functions/reels-ai-generate.t27","summary":{"en":"Builds a short AI reel: a lip-sync video from an image and a text or audio track, a second generated clip, the two merged, and the result sent to the user in Telegram.","ru":"Собирает короткий AI-рилс: липсинк-видео из изображения и текста или аудио, второй сгенерированный клип, их склейка и отправка результата пользователю в Telegram."},"typecheckOk":true,"witness":"spec+code"},{"code":{"control":"spec+code","deployed":true,"file":"src/inngest_app/functions/existing/generateAdvancedLoopingVideoFunction.ts","legacyId":"generate-advanced-looping-video","probeResult":"FAILED-at-guard","retries":2,"steps":7},"cronSpec":null,"differences":[],"discarded":0,"fields":{"CONTROL":"spec+code","CRON":"","DOMAIN":"reels","EVENT":"reels/loop.generate","GUARD":"min-images","ID":"reels-loop-generate","KIND":"function","LEGACY_EVENTS":["reels/generate-advanced-loop"],"LEGACY_ID":"generate-advanced-looping-video","NAME":"Advanced looping video","NOTE":"Guard is min-images: fewer images than the minimum stops the run before any clip is generated.","ON_FAILURE":"log","PROBE_RESULT":"FAILED-at-guard","REPO":"999-multibots-telegraf","RETRIES":2,"SAFE_PROBE":"{\"telegram_id\": \"0\", \"image_urls\": [], \"bot_token\": \"\", \"prompt\": \"safe-mode probe\"}","SERVICE":"src/inngest_app/functions/existing/generateAdvancedLoopingVideoFunction.ts:77","SIDE_EFFECTS":["paid-api","messages-user"],"STEPS":["generate-morphing-clips","download-video-clips","combine-video-clips","add-music","send-to-telegram","send-to-pulse","cleanup"],"SUMMARY_EN":"Turns a set of user images into a looping video: morphing clips between the images, download and concatenation, background music, delivery to the user in Telegram and to the pulse channel, then cleanup.","TRIGGER":"event","TZ":"UTC"},"health":"ok","id":"reels-loop-generate","inSpecCorpus":false,"messages":[],"moduleName":"fn_reels_loop_generate","name":{"en":"Advanced looping video","ru":"Зацикленное видео"},"sha256":"3a9ce2c1a55f9cd69e4e74bc21a0f3d770f0c6d7846bb379a8233cc7583e2d2e","specPath":"specs/functions/reels-loop-generate.t27","summary":{"en":"Turns a set of user images into a looping video: morphing clips between the images, download and concatenation, background music, delivery to the user in Telegram and to the pulse channel, then cleanup.","ru":"Превращает набор изображений пользователя в зацикленное видео: морфинг-клипы между изображениями, скачивание и склейка, фоновая музыка, доставка пользователю в Telegram и в пульс-канал, затем очистка."},"typecheckOk":true,"witness":"spec+code"},{"code":{"control":"spec+code","deployed":true,"file":"src/inngest_app/functions/render/renderAvatarVideo.ts","legacyId":"render-avatar-video","probeResult":"FAILED-at-guard","retries":3,"steps":13},"cronSpec":null,"differences":[],"discarded":0,"fields":{"CONTROL":"spec+code","CRON":"","DOMAIN":"render","EVENT":"render/avatar-video.run","GUARD":"zod-schema","ID":"render-avatar-video-run","KIND":"function","LEGACY_EVENTS":["render/avatar-video"],"LEGACY_ID":"render-avatar-video","NAME":"Render avatar video","NOTE":"Guard is zod-schema. Each wait-* step polls a provider job until it completes.","ON_FAILURE":"admin-telegram","PROBE_RESULT":"FAILED-at-guard","REPO":"999-multibots-telegraf","RETRIES":3,"SAFE_PROBE":"{}","SERVICE":"src/inngest_app/functions/render/renderAvatarVideo.ts:174","SIDE_EFFECTS":["paid-api","external-webhook","db-write"],"STEPS":["create-job","generate-speech-audio","start-hedra-generation","wait-hedra-completion","start-heygen-generation","wait-heygen-completion","generate-transcription","generate-broll-prompts","generate-brolls-parallel","wait-brolls-completion","create-job-settings","upload-settings-to-s3","trigger-render"],"SUMMARY_EN":"Produces an avatar video: generates the speech audio, runs the avatar generation (Hedra, then HeyGen), transcribes, writes B-roll prompts and generates the B-rolls in parallel, then writes the job settings to S3 and triggers the render.","TRIGGER":"event","TZ":"UTC"},"health":"ok","id":"render-avatar-video-run","inSpecCorpus":false,"messages":[],"moduleName":"fn_render_avatar_video_run","name":{"en":"Render avatar video","ru":"Рендер аватар-видео"},"sha256":"c59d180a0c7866d5115f7d72ba3cf3f88e566c42936937fafba4eec89ab39820","specPath":"specs/functions/render-avatar-video-run.t27","summary":{"en":"Produces an avatar video: generates the speech audio, runs the avatar generation (Hedra, then HeyGen), transcribes, writes B-roll prompts and generates the B-rolls in parallel, then writes the job settings to S3 and triggers the render.","ru":"Создаёт аватар-видео: генерирует речь, запускает генерацию аватара (Hedra, затем HeyGen), расшифровывает, пишет промпты B-roll и параллельно генерирует B-roll, затем записывает настройки задачи в S3 и запускает рендер."},"typecheckOk":true,"witness":"spec+code"},{"code":{"control":"spec+code","deployed":true,"file":"src/inngest_app/functions/render/render.ts","legacyId":"render","probeResult":"FAILED-at-guard","retries":3,"steps":5},"cronSpec":null,"differences":[],"discarded":0,"fields":{"CONTROL":"spec+code","CRON":"","DOMAIN":"render","EVENT":"render/job.run","GUARD":"zod-schema","ID":"render-job-run","KIND":"function","LEGACY_EVENTS":["render"],"LEGACY_ID":"render","NAME":"Render job","NOTE":"Guard is zod-schema: the payload is parsed before any file is downloaded.","ON_FAILURE":"admin-telegram","PROBE_RESULT":"FAILED-at-guard","REPO":"999-multibots-telegraf","RETRIES":3,"SAFE_PROBE":"{}","SERVICE":"src/inngest_app/functions/render/render.ts:38","SIDE_EFFECTS":["paid-api","external-webhook","db-write"],"STEPS":["create-job-folder","download-files","render","upload-to-s3","callback"],"SUMMARY_EN":"Renders a video job on the render server: creates the job folder, downloads the inputs, renders, uploads the output to S3 and calls the job callback.","TRIGGER":"event","TZ":"UTC"},"health":"ok","id":"render-job-run","inSpecCorpus":false,"messages":[],"moduleName":"fn_render_job_run","name":{"en":"Render job","ru":"Задача рендера"},"sha256":"0119d4168128917ef6fbd8a991edae96003724af32280a9af0bd8fdbef080656","specPath":"specs/functions/render-job-run.t27","summary":{"en":"Renders a video job on the render server: creates the job folder, downloads the inputs, renders, uploads the output to S3 and calls the job callback.","ru":"Рендерит видеозадачу на рендер-сервере: создаёт папку задачи, скачивает входные файлы, рендерит, загружает результат в S3 и вызывает колбэк задачи."},"typecheckOk":true,"witness":"spec+code"},{"code":{"control":"spec+code","deployed":true,"file":"src/inngest_app/functions/render/renderRiddle.ts","legacyId":"render-riddle","probeResult":"FAILED-at-guard","retries":3,"steps":15},"cronSpec":null,"differences":[],"discarded":0,"fields":{"CONTROL":"spec+code","CRON":"","DOMAIN":"render","EVENT":"render/riddle.run","GUARD":"zod-schema","ID":"render-riddle-run","KIND":"function","LEGACY_EVENTS":["render-riddle"],"LEGACY_ID":"render-riddle","NAME":"Render riddle video","NOTE":"Guard is zod-schema. The step names generate-broll-${index} and wait-broll-${index} are templates expanded once per scene; start-avatar-generation and wait-avatar-completion appear twice in the code and are listed twice here.","ON_FAILURE":"log","PROBE_RESULT":"FAILED-at-guard","REPO":"999-multibots-telegraf","RETRIES":3,"SAFE_PROBE":"{}","SERVICE":"src/inngest_app/functions/render/renderRiddle.ts:59","SIDE_EFFECTS":["paid-api","external-webhook","db-write"],"STEPS":["preflight-render-capacity","load-template-json","create-job","generate-speech-audio","start-avatar-generation","wait-avatar-completion","start-avatar-generation","wait-avatar-completion","extract-avatar-speech-url","generate-transcription","generate-broll-prompts","generate-broll-${index}","wait-broll-${index}","prepare-template-json","trigger-render"],"SUMMARY_EN":"Produces a riddle video from a template: checks render capacity, loads the template, generates the speech audio and the avatar clips, transcribes, generates one B-roll per scene, prepares the template JSON and triggers the render.","TRIGGER":"event","TZ":"UTC"},"health":"ok","id":"render-riddle-run","inSpecCorpus":false,"messages":[],"moduleName":"fn_render_riddle_run","name":{"en":"Render riddle video","ru":"Рендер видео-загадки"},"sha256":"fab0efc9b80a37a8be8d288f95c9e1067c8c8bbcc70cc2af2f5d2f67a6f528f6","specPath":"specs/functions/render-riddle-run.t27","summary":{"en":"Produces a riddle video from a template: checks render capacity, loads the template, generates the speech audio and the avatar clips, transcribes, generates one B-roll per scene, prepares the template JSON and triggers the render.","ru":"Создаёт видео-загадку по шаблону: проверяет ёмкость рендера, загружает шаблон, генерирует речь и клипы аватара, расшифровывает, генерирует по одному B-roll на сцену, готовит JSON шаблона и запускает рендер."},"typecheckOk":true,"witness":"spec+code"},{"code":{"control":"spec+code","deployed":false,"file":"src/inngest_app/functions/existing/handleModelTrainingCompleted.ts","legacyId":"handle-model-training-completed","probeResult":"not-deployed","retries":2,"steps":3},"cronSpec":null,"differences":[],"discarded":0,"fields":{"CONTROL":"spec+code","CRON":"","DOMAIN":"training","EVENT":"training/model.complete","GUARD":"unknown","ID":"training-model-complete","KIND":"function","LEGACY_EVENTS":["model/training.completed"],"LEGACY_ID":"handle-model-training-completed","NAME":"Model training completed","NOTE":"Not on the production Railway build as of 2026-09-09 (deployed_2026_09_09 false in the manifest): the deployed app registers 24 base functions and this one is not among them. Guard is unknown because the function could not be probed there.","ON_FAILURE":"admin-telegram","PROBE_RESULT":"not-deployed","REPO":"999-multibots-telegraf","RETRIES":2,"SAFE_PROBE":"","SERVICE":"src/inngest_app/functions/existing/handleModelTrainingCompleted.ts:38","SIDE_EFFECTS":["charges-balance","paid-api","messages-user","db-write"],"STEPS":["find-training-record","update-training-status","send-telegram-notification"],"SUMMARY_EN":"Handles the training-completed event from the provider: finds the training record, updates its status and the model list, and sends the user a Telegram notification about the finished or failed training.","TRIGGER":"event","TZ":"UTC"},"health":"ok","id":"training-model-complete","inSpecCorpus":false,"messages":["not on the production build probed 2026-09-09 (deployed_2026_09_09 false)"],"moduleName":"fn_training_model_complete","name":{"en":"Model training completed","ru":"Обучение модели завершено"},"sha256":"7764be58758765cb0794cbd0621d91356ee6b71ba3adfb462f615b62111d7454","specPath":"specs/functions/training-model-complete.t27","summary":{"en":"Handles the training-completed event from the provider: finds the training record, updates its status and the model list, and sends the user a Telegram notification about the finished or failed training.","ru":"Обрабатывает событие завершения обучения от провайдера: находит запись обучения, обновляет её статус и список моделей и отправляет пользователю уведомление в Telegram о завершённом или упавшем обучении."},"typecheckOk":true,"witness":"spec+code"},{"code":{"control":"spec+code","deployed":true,"file":"src/inngest_app/functions/existing/generateModelTrainingFunction.ts","legacyId":"generate-model-training","probeResult":"FAILED-at-guard","retries":0,"steps":8},"cronSpec":null,"differences":[],"discarded":0,"fields":{"CONTROL":"spec+code","CRON":"","DOMAIN":"training","EVENT":"training/model.start","GUARD":"validate-steps","ID":"training-model-start","KIND":"function","LEGACY_EVENTS":["model/training.start"],"LEGACY_ID":"generate-model-training","NAME":"Model training start (v1)","NOTE":"RETRIES is 0 by declaration: a failed start is not retried, because a retry would create a second Replicate training. Guard is validate-steps.","ON_FAILURE":"log","PROBE_RESULT":"FAILED-at-guard","REPO":"999-multibots-telegraf","RETRIES":0,"SAFE_PROBE":"{\"telegram_id\": \"0\", \"bot_name\": \"e2e_nonexistent_bot\", \"steps\": -1, \"zipUrl\": \"\", \"triggerWord\": \"e2e\", \"modelName\": \"e2e\", \"is_ru\": true}","SERVICE":"src/inngest_app/functions/existing/generateModelTrainingFunction.ts:38","SIDE_EFFECTS":["charges-balance","paid-api","messages-user","db-write"],"STEPS":["validate-credentials","check-duplicates","validate-zip-url","create-replicate-model","save-pending-record","create-replicate-training","update-training-record","notify-user-started"],"SUMMARY_EN":"Starts a Replicate fine-tune for a user: validates credentials, refuses duplicates, checks the training archive URL, creates the Replicate model and training, records it, and tells the user the training has started.","TRIGGER":"event","TZ":"UTC"},"health":"ok","id":"training-model-start","inSpecCorpus":false,"messages":[],"moduleName":"fn_training_model_start","name":{"en":"Model training start (v1)","ru":"Старт обучения модели (v1)"},"sha256":"90fff63e83a250434c62c3918a91b8a53f7d72a93469ecb589470b1b1bee1c12","specPath":"specs/functions/training-model-start.t27","summary":{"en":"Starts a Replicate fine-tune for a user: validates credentials, refuses duplicates, checks the training archive URL, creates the Replicate model and training, records it, and tells the user the training has started.","ru":"Запускает дообучение на Replicate для пользователя: проверяет учётные данные, отклоняет дубликаты, проверяет URL архива, создаёт модель и обучение на Replicate, записывает их и сообщает пользователю о старте."},"typecheckOk":true,"witness":"spec+code"},{"code":{"control":"spec+code","deployed":true,"file":null,"legacyId":"model-training-v2","probeResult":"FAILED-at-guard","retries":null,"steps":0},"cronSpec":null,"differences":[],"discarded":0,"fields":{"CONTROL":"spec+code","CRON":"","DOMAIN":"training","EVENT":"training/model-v2.start","GUARD":"check-user-exists","ID":"training-model-v2-start","KIND":"function","LEGACY_EVENTS":["model/training.v2.requested"],"LEGACY_ID":"model-training-v2","NAME":"Model training start (v2)","NOTE":"The manifest carries no file, steps or retries for this function (its extractor did not resolve them); SERVICE, STEPS and RETRIES here were read from the same checkout. RETRIES is not declared in the code, so the Inngest JS SDK v3 default of 4 applies. Guard is check-user-exists.","ON_FAILURE":"log","PROBE_RESULT":"FAILED-at-guard","REPO":"999-multibots-telegraf","RETRIES":4,"SAFE_PROBE":"{\"telegram_id\": \"0\", \"bot_name\": \"e2e_nonexistent_bot\", \"zipUrl\": \"\", \"triggerWord\": \"e2e\", \"modelName\": \"e2e\", \"steps\": 1, \"is_ru\": true, \"gender\": \"male\"}","SERVICE":"src/inngest_app/functions/training/modelTrainingV2.ts:45","SIDE_EFFECTS":["charges-balance","paid-api","messages-user","db-write"],"STEPS":["check-user-exists","update-user-level","get-bot","check-balance","encode-zip","create-training","save-training-to-db","notify-user","deduct-balance","refund-balance","handle-error"],"SUMMARY_EN":"Starts a v2 fine-tune for a user: checks the user and the balance, encodes the training archive, creates the training on the provider, records it, deducts the balance and notifies the user; on a later failure the balance is refunded.","TRIGGER":"event","TZ":"UTC"},"health":"ok","id":"training-model-v2-start","inSpecCorpus":false,"messages":[],"moduleName":"fn_training_model_v2_start","name":{"en":"Model training start (v2)","ru":"Старт обучения модели (v2)"},"sha256":"c4524d253aa50af4b4f7a25d528df1a74f902d4229b0103aa6544a6f79e6274c","specPath":"specs/functions/training-model-v2-start.t27","summary":{"en":"Starts a v2 fine-tune for a user: checks the user and the balance, encodes the training archive, creates the training on the provider, records it, deducts the balance and notifies the user; on a later failure the balance is refunded.","ru":"Запускает дообучение v2 для пользователя: проверяет пользователя и баланс, кодирует архив обучения, создаёт обучение у провайдера, записывает его, списывает баланс и уведомляет пользователя; при последующем сбое баланс возвращается."},"typecheckOk":true,"witness":"spec+code"},{"code":{"control":"spec+code","deployed":false,"file":"src/inngest_app/functions/training/checkStuckTrainings.ts","legacyId":"check-stuck-trainings","probeResult":"not-deployed","retries":null,"steps":3},"cronSpec":"inngest/999-multibots-telegraf/check-stuck-trainings","differences":[],"discarded":0,"fields":{"CONTROL":"spec+code","CRON":"*/30 * * * *","DOMAIN":"training","EVENT":"","GUARD":"none","ID":"training-stuck-check","KIND":"function","LEGACY_EVENTS":[],"LEGACY_ID":"check-stuck-trainings","NAME":"Stuck trainings check","NOTE":"Not on the production Railway build as of 2026-09-09 (deployed_2026_09_09 false in the manifest). RETRIES is not declared in the code, so the Inngest JS SDK v3 default of 4 applies. The same schedule is stated as a cron card, specs/crons ID inngest/999-multibots-telegraf/check-stuck-trainings.","ON_FAILURE":"admin-telegram","PROBE_RESULT":"not-deployed","REPO":"999-multibots-telegraf","RETRIES":4,"SAFE_PROBE":"","SERVICE":"src/inngest_app/functions/training/checkStuckTrainings.ts:47","SIDE_EFFECTS":["charges-balance","paid-api","messages-user","db-write"],"STEPS":["find-stuck-trainings","check-replicate-status","send-completion-events"],"SUMMARY_EN":"Every 30 minutes finds model trainings still marked pending or processing past the stuck threshold, asks Replicate for their real status and emits the completion events that reconcile them.","TRIGGER":"cron","TZ":"UTC"},"health":"ok","id":"training-stuck-check","inSpecCorpus":false,"messages":["not on the production build probed 2026-09-09 (deployed_2026_09_09 false)"],"moduleName":"fn_training_stuck_check","name":{"en":"Stuck trainings check","ru":"Проверка застрявших обучений"},"sha256":"d8518fb2f0cc62a5ea0ec6d7517bdc477bef77cc95890dadf44381031ea43611","specPath":"specs/functions/training-stuck-check.t27","summary":{"en":"Every 30 minutes finds model trainings still marked pending or processing past the stuck threshold, asks Replicate for their real status and emits the completion events that reconcile them.","ru":"Каждые 30 минут находит обучения моделей, всё ещё отмеченные как pending или processing дольше порога, запрашивает у Replicate их реальный статус и порождает события завершения, которые их сверяют."},"typecheckOk":true,"witness":"spec+code"},{"code":{"control":"spec+code","deployed":false,"file":"src/inngest_app/functions/webhookHealthGuard.ts","legacyId":"validate-webhook-before-generation","probeResult":"not-deployed","retries":1,"steps":1},"cronSpec":null,"differences":[],"discarded":0,"fields":{"CONTROL":"spec+code","CRON":"","DOMAIN":"webhook","EVENT":"webhook/generation.validate","GUARD":"unknown","ID":"webhook-generation-validate","KIND":"function","LEGACY_EVENTS":["video/generation-validate-webhook"],"LEGACY_ID":"validate-webhook-before-generation","NAME":"Webhook validation before generation","NOTE":"Not on the production Railway build as of 2026-09-09 (deployed_2026_09_09 false in the manifest). Guard is unknown because the function could not be probed there. Two other functions in the same file (webhook-health-check, periodic-webhook-health-check) are not registered and have no spec.","ON_FAILURE":"admin-telegram","PROBE_RESULT":"not-deployed","REPO":"999-multibots-telegraf","RETRIES":1,"SAFE_PROBE":"","SERVICE":"src/inngest_app/functions/webhookHealthGuard.ts:147","SIDE_EFFECTS":["db-write"],"STEPS":["check-webhook-availability"],"SUMMARY_EN":"Checks that the video-generation webhook endpoint is reachable before a generation is started and records the result.","TRIGGER":"event","TZ":"UTC"},"health":"ok","id":"webhook-generation-validate","inSpecCorpus":false,"messages":["not on the production build probed 2026-09-09 (deployed_2026_09_09 false)"],"moduleName":"fn_webhook_generation_validate","name":{"en":"Webhook validation before generation","ru":"Проверка вебхука перед генерацией"},"sha256":"7a4293fa70eef3448b38f3e6c58d84becf127f5c561225ce43062b8c379e2719","specPath":"specs/functions/webhook-generation-validate.t27","summary":{"en":"Checks that the video-generation webhook endpoint is reachable before a generation is started and records the result.","ru":"Проверяет, что эндпоинт вебхука видеогенерации доступен до старта генерации, и записывает результат."},"typecheckOk":true,"witness":"spec+code"},{"code":{"control":"spec+code","deployed":false,"file":"src/inngest_app/functions/welcomeAvatarGeneration.ts","legacyId":"welcome-avatar-generation","probeResult":"not-deployed","retries":2,"steps":5},"cronSpec":null,"differences":[],"discarded":0,"fields":{"CONTROL":"spec+code","CRON":"","DOMAIN":"welcome","EVENT":"welcome/avatar.generate","GUARD":"unknown","ID":"welcome-avatar-generate","KIND":"function","LEGACY_EVENTS":["user/welcome.avatar.generate"],"LEGACY_ID":"welcome-avatar-generation","NAME":"Welcome avatar generation","NOTE":"Not on the production Railway build as of 2026-09-09 (deployed_2026_09_09 false in the manifest). Guard is unknown because the function could not be probed there.","ON_FAILURE":"admin-telegram","PROBE_RESULT":"not-deployed","REPO":"999-multibots-telegraf","RETRIES":2,"SAFE_PROBE":"","SERVICE":"src/inngest_app/functions/welcomeAvatarGeneration.ts:108","SIDE_EFFECTS":["paid-api","messages-user"],"STEPS":["validate-bot","select-hero","reserve-gift-slot","generate-image","send-welcome"],"SUMMARY_EN":"Generates a welcome avatar for a new user: validates the bot, selects a hero, reserves a gift slot, generates the image and sends the welcome message.","TRIGGER":"event","TZ":"UTC"},"health":"ok","id":"welcome-avatar-generate","inSpecCorpus":false,"messages":["not on the production build probed 2026-09-09 (deployed_2026_09_09 false)"],"moduleName":"fn_welcome_avatar_generate","name":{"en":"Welcome avatar generation","ru":"Приветственный аватар"},"sha256":"3b27453bd662eaee697645051447f1d63e66c5c2c64a3157ec7caa0be403f4b4","specPath":"specs/functions/welcome-avatar-generate.t27","summary":{"en":"Generates a welcome avatar for a new user: validates the bot, selects a hero, reserves a gift slot, generates the image and sends the welcome message.","ru":"Генерирует приветственный аватар для нового пользователя: проверяет бота, выбирает героя, резервирует слот подарка, генерирует изображение и отправляет приветственное сообщение."},"typecheckOk":true,"witness":"spec+code"}],"generatedAt":"2026-09-09T17:04:02.832Z","i18n":[{"bundle":"apps/website/i18n/agents.ru.json","coverage":{"n":28,"total":28},"enabled":true,"fields":["SUMMARY","NAME"],"locale":"ru","missing":[],"scope":["specs/skills","specs/crons","specs/agents","specs/functions","specs/tools"],"sha256":"c8871fb4ccdef8fc3cc2937af5db0e307ab0b62f6a03ece9f4512851ffd64f04","spec":"specs/i18n/agents-ru.t27"}],"ladder":{"agents":27,"crons":33,"functions":28,"skills":26,"specs":760,"tools":62},"manifest":{"deployedApp":{"baseFunctions":24,"mainRegisters":28,"name":"telegram-bot-client","sdk":"js v3.54.2"},"entries":28,"generatedFrom":{"branch":"main","commit":"a9c08b4","note":"Extracted from the source tree by the spec-first design pass of 2026-09-09; three entries carry no file/steps and eight carry retries null because the extractor did not resolve them. Copied by hand into this repository -- no sync script produces it yet."},"probedAt":"2026-09-09","repo":"gHashTag/999-multibots-telegraf"},"version":1} +{"codeOnly":[],"compilerWasmSha256":"4d9c0447b5ca288790ab03d3dffc2dda629ed47af9d6731a105fc923aea0aee4","contentSha256":"c7f525b34cbe93ee47860b32be2125dc7e47fe25653f8e39599e051c44ab6010","counts":{"byDomain":{"analytics":2,"broadcast":1,"content":3,"instagram":3,"monitoring":4,"morph":1,"neuro":1,"payment":1,"reels":3,"render":3,"training":4,"webhook":1,"welcome":1},"byProbeResult":{"COMPLETED":7,"FAILED-at-guard":16,"not-deployed":4,"skipped":1},"bySideEffect":{"charges-balance":6,"db-write":16,"external-webhook":3,"messages-admin":6,"messages-owners":2,"messages-user":12,"none":0,"paid-api":19},"byTrigger":{"cron":5,"event":23},"codeOnly":0,"deployUnknown":0,"deployed":24,"notDeployed":4,"specOnly":0,"specPlusCode":28,"specs":28,"typecheckOk":28,"withCronSpec":5,"withDifferences":1},"functions":[{"code":{"control":"spec+code","deployed":true,"file":"src/inngest_app/functions/analytics/dailySalesAdvisor.ts","legacyId":"daily-sales-advisor","probeResult":"COMPLETED","retries":1,"steps":5},"cronSpec":"inngest/999-multibots-telegraf/daily-sales-advisor","differences":[],"discarded":0,"fields":{"CONTROL":"spec+code","CRON":"0 9 * * *","DOMAIN":"analytics","EVENT":"","GUARD":"none","ID":"analytics-sales-advise","KIND":"function","LEGACY_EVENTS":[],"LEGACY_ID":"daily-sales-advisor","NAME":"Daily sales advisor","NOTE":"The same schedule is stated as a cron card, specs/crons ID inngest/999-multibots-telegraf/daily-sales-advisor. The step name report-${ownerId} is a template expanded once per owner. A manual invoke on 2026-09-09 messaged 13 owners; the hardening list asks this function to honour safe mode.","ON_FAILURE":"log","PROBE_RESULT":"COMPLETED","REPO":"999-multibots-telegraf","RETRIES":1,"SAFE_PROBE":"{}","SERVICE":"src/inngest_app/functions/analytics/dailySalesAdvisor.ts:54","SIDE_EFFECTS":["messages-owners","messages-admin"],"STEPS":["load-owners","load-payments-7d","load-payments-1d","load-payments-2d","report-${ownerId}"],"SUMMARY_EN":"Every day at 09:00 UTC loads the bot owners and their payments over the last seven, two and one days and sends each owner a sales report, with a copy to the admin chat.","TRIGGER":"cron","TZ":"UTC"},"health":"ok","id":"analytics-sales-advise","inSpecCorpus":false,"messages":[],"moduleName":"fn_analytics_sales_advise","name":{"en":"Daily sales advisor","ru":"Ежедневный советник по продажам"},"sha256":"22f09be2b6651090b1704700bf03ee6e25c741ef726c92c34171cb37e0eb4fa4","specPath":"specs/functions/analytics-sales-advise.t27","summary":{"en":"Every day at 09:00 UTC loads the bot owners and their payments over the last seven, two and one days and sends each owner a sales report, with a copy to the admin chat.","ru":"Каждый день в 09:00 UTC загружает владельцев ботов и их платежи за последние семь, два и один день и отправляет каждому владельцу отчёт о продажах с копией в админ-чат."},"typecheckOk":true,"witness":"spec+code"},{"code":{"control":"spec+code","deployed":true,"file":"src/inngest_app/functions/analytics/skillDetector.ts","legacyId":"skill-detector","probeResult":"COMPLETED","retries":1,"steps":3},"cronSpec":"inngest/999-multibots-telegraf/skill-detector","differences":[],"discarded":0,"fields":{"CONTROL":"spec+code","CRON":"0 10 * * *","DOMAIN":"analytics","EVENT":"","GUARD":"none","ID":"analytics-skills-detect","KIND":"function","LEGACY_EVENTS":[],"LEGACY_ID":"skill-detector","NAME":"Skill detector","NOTE":"The same schedule is stated as a cron card, specs/crons ID inngest/999-multibots-telegraf/skill-detector. The step name detect-${serviceType} is a template expanded once per service type.","ON_FAILURE":"log","PROBE_RESULT":"COMPLETED","REPO":"999-multibots-telegraf","RETRIES":1,"SAFE_PROBE":"{}","SERVICE":"src/inngest_app/functions/analytics/skillDetector.ts:30","SIDE_EFFECTS":["messages-owners","messages-admin"],"STEPS":["load-existing-skills","detect-${serviceType}","notify-admin"],"SUMMARY_EN":"Every day at 10:00 UTC loads the known skills, detects new service types from recent usage, one detection step per service type, and notifies the admin chat.","TRIGGER":"cron","TZ":"UTC"},"health":"ok","id":"analytics-skills-detect","inSpecCorpus":false,"messages":[],"moduleName":"fn_analytics_skills_detect","name":{"en":"Skill detector","ru":"Детектор навыков"},"sha256":"e03e0b8b71566e3cce95146ec4825f3421b844c504f10a8ca0e755db14540e53","specPath":"specs/functions/analytics-skills-detect.t27","summary":{"en":"Every day at 10:00 UTC loads the known skills, detects new service types from recent usage, one detection step per service type, and notifies the admin chat.","ru":"Каждый день в 10:00 UTC загружает известные навыки, находит новые типы сервисов по недавнему использованию (по одному шагу на тип сервиса) и уведомляет админ-чат."},"typecheckOk":true,"witness":"spec+code"},{"code":{"control":"spec+code","deployed":true,"file":null,"legacyId":"broadcast-message","probeResult":"FAILED-at-guard","retries":null,"steps":0},"cronSpec":null,"differences":[],"discarded":0,"fields":{"CONTROL":"spec+code","CRON":"","DOMAIN":"broadcast","EVENT":"broadcast/message.send","GUARD":"validate-input","ID":"broadcast-message-send","KIND":"function","LEGACY_EVENTS":["broadcast/send-message"],"LEGACY_ID":"broadcast-message","NAME":"Broadcast message","NOTE":"The manifest carries no file, steps or retries for this function (its extractor did not resolve them); SERVICE, STEPS and RETRIES here were read from the same checkout (retries 3). Guard is validate-input. A test_telegram_id in the payload narrows the audience to one recipient.","ON_FAILURE":"log","PROBE_RESULT":"FAILED-at-guard","REPO":"999-multibots-telegraf","RETRIES":3,"SAFE_PROBE":"{}","SERVICE":"src/inngest_app/functions/broadcast/broadcastMessage.ts:22","SIDE_EFFECTS":["messages-user"],"STEPS":["validate-input","check-permissions","fetch-users","send-messages","analyze-results"],"SUMMARY_EN":"Sends a broadcast to a bot audience: validates the request, checks the sender permissions, fetches the recipients, sends the messages and summarises the delivery results.","TRIGGER":"event","TZ":"UTC"},"health":"ok","id":"broadcast-message-send","inSpecCorpus":false,"messages":[],"moduleName":"fn_broadcast_message_send","name":{"en":"Broadcast message","ru":"Рассылка сообщения"},"sha256":"53f3415e61b946dfe7216c4d03e52cd53225207b9a8741bf9904dab9092eb357","specPath":"specs/functions/broadcast-message-send.t27","summary":{"en":"Sends a broadcast to a bot audience: validates the request, checks the sender permissions, fetches the recipients, sends the messages and summarises the delivery results.","ru":"Отправляет рассылку аудитории бота: проверяет запрос и права отправителя, получает список получателей, отправляет сообщения и подводит итоги доставки."},"typecheckOk":true,"witness":"spec+code"},{"code":{"control":"spec+code","deployed":true,"file":"src/inngest_app/functions/content/generateDetailedScript.ts","legacyId":"generate-detailed-script","probeResult":"FAILED-at-guard","retries":null,"steps":3},"cronSpec":null,"differences":[],"discarded":0,"fields":{"CONTROL":"spec+code","CRON":"","DOMAIN":"content","EVENT":"content/detailed-script.generate","GUARD":"zod-schema","ID":"content-detailed-script-generate","KIND":"function","LEGACY_EVENTS":["content/generate-detailed-script"],"LEGACY_ID":"generate-detailed-script","NAME":"Generate detailed script","NOTE":"RETRIES is not declared in the code, so the Inngest JS SDK v3 default of 4 applies. Guard is zod-schema.","ON_FAILURE":"log","PROBE_RESULT":"FAILED-at-guard","REPO":"999-multibots-telegraf","RETRIES":4,"SAFE_PROBE":"{}","SERVICE":"src/inngest_app/functions/content/generateDetailedScript.ts:191","SIDE_EFFECTS":["paid-api","db-write"],"STEPS":["create-script-record","generate-detailed-scenes","save-detailed-script"],"SUMMARY_EN":"Expands a script into detailed scenes: creates the script record, generates the scene-by-scene text with a language model and stores the detailed script.","TRIGGER":"event","TZ":"UTC"},"health":"ok","id":"content-detailed-script-generate","inSpecCorpus":false,"messages":[],"moduleName":"fn_content_detailed_script_generate","name":{"en":"Generate detailed script","ru":"Детальный сценарий"},"sha256":"4360313e280f6638395cf3aab44984a5a215e39aa9c61d11ed8c0e5ecfb028a3","specPath":"specs/functions/content-detailed-script-generate.t27","summary":{"en":"Expands a script into detailed scenes: creates the script record, generates the scene-by-scene text with a language model and stores the detailed script.","ru":"Разворачивает сценарий в подробные сцены: создаёт запись сценария, генерирует текст по сценам языковой моделью и сохраняет детальный сценарий."},"typecheckOk":true,"witness":"spec+code"},{"code":{"control":"spec+code","deployed":true,"file":"src/inngest_app/functions/content/generateScenarioClips.ts","legacyId":"generate-scenario-clips","probeResult":"FAILED-at-guard","retries":null,"steps":4},"cronSpec":null,"differences":[],"discarded":0,"fields":{"CONTROL":"spec+code","CRON":"","DOMAIN":"content","EVENT":"content/scenario-clips.generate","GUARD":"zod-schema","ID":"content-scenario-clips-generate","KIND":"function","LEGACY_EVENTS":["content/generate-scenario-clips"],"LEGACY_ID":"generate-scenario-clips","NAME":"Generate scenario clips","NOTE":"RETRIES is not declared in the code, so the Inngest JS SDK v3 default of 4 applies. Guard is zod-schema.","ON_FAILURE":"log","PROBE_RESULT":"FAILED-at-guard","REPO":"999-multibots-telegraf","RETRIES":4,"SAFE_PROBE":"{}","SERVICE":"src/inngest_app/functions/content/generateScenarioClips.ts:221","SIDE_EFFECTS":["paid-api","db-write"],"STEPS":["create-scenario-record","generate-detailed-scenes","create-text-reports-archive","update-scenario-record"],"SUMMARY_EN":"Builds a scenario from a script: creates the scenario record, generates the detailed scenes, packs the text reports into an archive and updates the record.","TRIGGER":"event","TZ":"UTC"},"health":"ok","id":"content-scenario-clips-generate","inSpecCorpus":false,"messages":[],"moduleName":"fn_content_scenario_clips_generate","name":{"en":"Generate scenario clips","ru":"Клипы по сценарию"},"sha256":"a7f24bf9b6921c2d3b5bbb4bd4519b8bb42623a7bf54ba85ceb3b39e12799c74","specPath":"specs/functions/content-scenario-clips-generate.t27","summary":{"en":"Builds a scenario from a script: creates the scenario record, generates the detailed scenes, packs the text reports into an archive and updates the record.","ru":"Строит сценарий по скрипту: создаёт запись, генерирует подробные сцены, упаковывает текстовые отчёты в архив и обновляет запись."},"typecheckOk":true,"witness":"spec+code"},{"code":{"control":"spec+code","deployed":true,"file":"src/inngest_app/functions/content/generateContentScripts.ts","legacyId":"generate-content-scripts","probeResult":"FAILED-at-guard","retries":null,"steps":5},"cronSpec":null,"differences":[],"discarded":0,"fields":{"CONTROL":"spec+code","CRON":"","DOMAIN":"content","EVENT":"content/scripts.generate","GUARD":"zod-schema","ID":"content-scripts-generate","KIND":"function","LEGACY_EVENTS":["instagram/generate-scripts"],"LEGACY_ID":"generate-content-scripts","NAME":"Generate content scripts","NOTE":"RETRIES is not declared in the code, so the Inngest JS SDK v3 default of 4 applies. Guard is zod-schema. The legacy event name keeps the instagram/ prefix the function was first registered under.","ON_FAILURE":"log","PROBE_RESULT":"FAILED-at-guard","REPO":"999-multibots-telegraf","RETRIES":4,"SAFE_PROBE":"{}","SERVICE":"src/inngest_app/functions/content/generateContentScripts.ts:44","SIDE_EFFECTS":["paid-api","db-write"],"STEPS":["get-reel-data","extract-audio","transcribe-audio","generate-scripts","save-scripts"],"SUMMARY_EN":"Writes content scripts from a stored reel: loads the reel, extracts and transcribes the audio, generates the scripts with a language model and stores them.","TRIGGER":"event","TZ":"UTC"},"health":"ok","id":"content-scripts-generate","inSpecCorpus":false,"messages":[],"moduleName":"fn_content_scripts_generate","name":{"en":"Generate content scripts","ru":"Сценарии контента"},"sha256":"2c65fc896945f85b8a031bf434390756577e278e8daf5affeed9046d7978492a","specPath":"specs/functions/content-scripts-generate.t27","summary":{"en":"Writes content scripts from a stored reel: loads the reel, extracts and transcribes the audio, generates the scripts with a language model and stores them.","ru":"Пишет сценарии контента по сохранённому рилсу: загружает рилс, извлекает и расшифровывает звук, генерирует сценарии языковой моделью и сохраняет их."},"typecheckOk":true,"witness":"spec+code"},{"code":{"control":"spec+code","deployed":true,"file":"src/inngest_app/functions/content/findCompetitors.ts","legacyId":"find-competitors","probeResult":"FAILED-at-guard","retries":null,"steps":6},"cronSpec":null,"differences":[],"discarded":0,"fields":{"CONTROL":"spec+code","CRON":"","DOMAIN":"instagram","EVENT":"instagram/competitors.find","GUARD":"validate-input","ID":"instagram-competitors-find","KIND":"function","LEGACY_EVENTS":["instagram/find-competitors"],"LEGACY_ID":"find-competitors","NAME":"Find competitors","NOTE":"RETRIES is not declared in the code, so the Inngest JS SDK v3 default of 4 applies. Guard is validate-input.","ON_FAILURE":"log","PROBE_RESULT":"FAILED-at-guard","REPO":"999-multibots-telegraf","RETRIES":4,"SAFE_PROBE":"{}","SERVICE":"src/inngest_app/functions/content/findCompetitors.ts:134","SIDE_EFFECTS":["paid-api","db-write"],"STEPS":["validate-input","validate-project","call-instagram-api","filter-by-followers","save-to-competitors-table","send-telegram-notification"],"SUMMARY_EN":"Finds Instagram competitors for a project: validates the request and the project, calls the Instagram API, filters by follower count, stores the competitors and notifies the requester in Telegram.","TRIGGER":"event","TZ":"UTC"},"health":"ok","id":"instagram-competitors-find","inSpecCorpus":false,"messages":[],"moduleName":"fn_instagram_competitors_find","name":{"en":"Find competitors","ru":"Поиск конкурентов"},"sha256":"8201d47aaa9d3ca811c9a2ddf8b4e227645473d0122da9311fd542a5e53cfaa9","specPath":"specs/functions/instagram-competitors-find.t27","summary":{"en":"Finds Instagram competitors for a project: validates the request and the project, calls the Instagram API, filters by follower count, stores the competitors and notifies the requester in Telegram.","ru":"Находит конкурентов в Instagram для проекта: проверяет запрос и проект, вызывает Instagram API, фильтрует по числу подписчиков, сохраняет конкурентов и уведомляет заказчика в Telegram."},"typecheckOk":true,"witness":"spec+code"},{"code":{"control":"spec+code","deployed":true,"file":"src/inngest_app/functions/content/analyzeCompetitorReels.ts","legacyId":"analyze-competitor-reels","probeResult":"FAILED-at-guard","retries":null,"steps":7},"cronSpec":null,"differences":[],"discarded":0,"fields":{"CONTROL":"spec+code","CRON":"","DOMAIN":"instagram","EVENT":"instagram/reels.analyze","GUARD":"validate-input","ID":"instagram-reels-analyze","KIND":"function","LEGACY_EVENTS":["instagram/analyze-reels"],"LEGACY_ID":"analyze-competitor-reels","NAME":"Analyze competitor reels","NOTE":"RETRIES is not declared in the code, so the Inngest JS SDK v3 default of 4 applies. Guard is validate-input.","ON_FAILURE":"log","PROBE_RESULT":"FAILED-at-guard","REPO":"999-multibots-telegraf","RETRIES":4,"SAFE_PROBE":"{}","SERVICE":"src/inngest_app/functions/content/analyzeCompetitorReels.ts:211","SIDE_EFFECTS":["paid-api","db-write"],"STEPS":["validate-input","validate-project","call-instagram-reels-api","filter-reels-by-date","calculate-metrics","save-to-reels-analysis-table","send-telegram-notification"],"SUMMARY_EN":"Analyzes the recent reels of an Instagram competitor for a project: validates the request and the project, calls the reels API, filters by date, computes the metrics, stores the analysis and notifies the requester in Telegram.","TRIGGER":"event","TZ":"UTC"},"health":"ok","id":"instagram-reels-analyze","inSpecCorpus":false,"messages":[],"moduleName":"fn_instagram_reels_analyze","name":{"en":"Analyze competitor reels","ru":"Анализ рилсов конкурента"},"sha256":"6c4c986a981251d73c668906e1bf7d6d1890d1c9cff359d33a05a64551ed5a0a","specPath":"specs/functions/instagram-reels-analyze.t27","summary":{"en":"Analyzes the recent reels of an Instagram competitor for a project: validates the request and the project, calls the reels API, filters by date, computes the metrics, stores the analysis and notifies the requester in Telegram.","ru":"Анализирует недавние рилсы конкурента в Instagram для проекта: проверяет запрос и проект, вызывает API рилсов, фильтрует по дате, считает метрики, сохраняет анализ и уведомляет заказчика в Telegram."},"typecheckOk":true,"witness":"spec+code"},{"code":{"control":"spec+code","deployed":true,"file":"src/inngest_app/functions/content/extractTopContent.ts","legacyId":"extract-top-content","probeResult":"FAILED-at-guard","retries":null,"steps":3},"cronSpec":null,"differences":[],"discarded":0,"fields":{"CONTROL":"spec+code","CRON":"","DOMAIN":"instagram","EVENT":"instagram/top-content.extract","GUARD":"zod-schema","ID":"instagram-top-content-extract","KIND":"function","LEGACY_EVENTS":["instagram/extract-top"],"LEGACY_ID":"extract-top-content","NAME":"Extract top content","NOTE":"RETRIES is not declared in the code, so the Inngest JS SDK v3 default of 4 applies. Guard is zod-schema.","ON_FAILURE":"log","PROBE_RESULT":"FAILED-at-guard","REPO":"999-multibots-telegraf","RETRIES":4,"SAFE_PROBE":"{}","SERVICE":"src/inngest_app/functions/content/extractTopContent.ts:33","SIDE_EFFECTS":["paid-api","db-write"],"STEPS":["query-top-reels","process-reels","format-report"],"SUMMARY_EN":"Extracts the top-performing reels already stored for a project: queries the stored reels, processes them and formats the report.","TRIGGER":"event","TZ":"UTC"},"health":"ok","id":"instagram-top-content-extract","inSpecCorpus":false,"messages":[],"moduleName":"fn_instagram_top_content_extract","name":{"en":"Extract top content","ru":"Лучший контент"},"sha256":"4b2c8ee5877c376316e94eda74ac07c789c1ee5c467313c7f093a3ae32bdc4b6","specPath":"specs/functions/instagram-top-content-extract.t27","summary":{"en":"Extracts the top-performing reels already stored for a project: queries the stored reels, processes them and formats the report.","ru":"Извлекает самые результативные рилсы, уже сохранённые для проекта: запрашивает их из базы, обрабатывает и формирует отчёт."},"typecheckOk":true,"witness":"spec+code"},{"code":{"control":"spec+code","deployed":true,"file":"src/inngest_app/functions/monitoring/criticalErrorMonitor.ts","legacyId":"critical-error-monitor","probeResult":"COMPLETED","retries":1,"steps":4},"cronSpec":null,"differences":[],"discarded":0,"fields":{"CONTROL":"spec+code","CRON":"","DOMAIN":"monitoring","EVENT":"monitoring/error.report","GUARD":"none","ID":"monitoring-error-report","KIND":"function","LEGACY_EVENTS":["app/error.critical"],"LEGACY_ID":"critical-error-monitor","NAME":"Critical error report","NOTE":"No guard: the event is emitted by the application itself. The hardening list asks the formatter to render string, Error and {message} payloads and never print [object Object].","ON_FAILURE":"log","PROBE_RESULT":"COMPLETED","REPO":"999-multibots-telegraf","RETRIES":1,"SAFE_PROBE":"{}","SERVICE":"src/inngest_app/functions/monitoring/criticalErrorMonitor.ts:175","SIDE_EFFECTS":["messages-admin"],"STEPS":["analyze-error","format-message","send-notification","log-for-analysis"],"SUMMARY_EN":"Reports a critical application error to the admin chat: analyzes the error, formats the message, sends the notification and logs the incident for later analysis.","TRIGGER":"event","TZ":"UTC"},"health":"ok","id":"monitoring-error-report","inSpecCorpus":false,"messages":[],"moduleName":"fn_monitoring_error_report","name":{"en":"Critical error report","ru":"Отчёт о критической ошибке"},"sha256":"13cb1dcbfcb0f13ec58ba56cd2b3b2b788ccbc0e2b6cfc610e46b850889bee15","specPath":"specs/functions/monitoring-error-report.t27","summary":{"en":"Reports a critical application error to the admin chat: analyzes the error, formats the message, sends the notification and logs the incident for later analysis.","ru":"Сообщает о критической ошибке приложения в админ-чат: анализирует ошибку, форматирует сообщение, отправляет уведомление и записывает инцидент для последующего разбора."},"typecheckOk":true,"witness":"spec+code"},{"code":{"control":"spec+code","deployed":true,"file":"src/inngest_app/functions/monitoring/criticalErrorMonitor.ts","legacyId":"health-check","probeResult":"COMPLETED","retries":2,"steps":3},"cronSpec":"inngest/999-multibots-telegraf/health-check","differences":[],"discarded":0,"fields":{"CONTROL":"spec+code","CRON":"*/30 * * * *","DOMAIN":"monitoring","EVENT":"","GUARD":"none","ID":"monitoring-health-check","KIND":"function","LEGACY_EVENTS":[],"LEGACY_ID":"health-check","NAME":"Health check","NOTE":"The same schedule is stated as a cron card, specs/crons ID inngest/999-multibots-telegraf/health-check. Lives in the same file as monitoring-error-report.","ON_FAILURE":"log","PROBE_RESULT":"COMPLETED","REPO":"999-multibots-telegraf","RETRIES":2,"SAFE_PROBE":"{}","SERVICE":"src/inngest_app/functions/monitoring/criticalErrorMonitor.ts:235","SIDE_EFFECTS":["messages-admin"],"STEPS":["check-api-health","check-inngest-health","notify-unhealthy"],"SUMMARY_EN":"Every 30 minutes checks the API server and the Inngest service and messages the admin chat when either is unhealthy.","TRIGGER":"cron","TZ":"UTC"},"health":"ok","id":"monitoring-health-check","inSpecCorpus":false,"messages":[],"moduleName":"fn_monitoring_health_check","name":{"en":"Health check","ru":"Проверка здоровья"},"sha256":"57c23797300ea168c457a74d4edc25c1bcd249408efb634dcd32a7dbfa086260","specPath":"specs/functions/monitoring-health-check.t27","summary":{"en":"Every 30 minutes checks the API server and the Inngest service and messages the admin chat when either is unhealthy.","ru":"Каждые 30 минут проверяет API-сервер и сервис Inngest и пишет в админ-чат, если один из них нездоров."},"typecheckOk":true,"witness":"spec+code"},{"code":{"control":"spec+code","deployed":true,"file":"src/inngest_app/functions/monitoring/logMonitor.ts","legacyId":"log-monitor","probeResult":"COMPLETED","retries":2,"steps":4},"cronSpec":"inngest/999-multibots-telegraf/log-monitor","differences":[],"discarded":0,"fields":{"CONTROL":"spec+code","CRON":"0 10 * * *","DOMAIN":"monitoring","EVENT":"","GUARD":"none","ID":"monitoring-logs-analyze","KIND":"function","LEGACY_EVENTS":[],"LEGACY_ID":"log-monitor","NAME":"Daily log analysis","NOTE":"The same schedule is stated as a cron card, specs/crons ID inngest/999-multibots-telegraf/log-monitor. When LOG_DIR is absent on the host the analysis has nothing to read; the hardening list asks for a fallback to the Inngest run summary.","ON_FAILURE":"log","PROBE_RESULT":"COMPLETED","REPO":"999-multibots-telegraf","RETRIES":2,"SAFE_PROBE":"{}","SERVICE":"src/inngest_app/functions/monitoring/logMonitor.ts:352","SIDE_EFFECTS":["messages-admin"],"STEPS":["read-logs","analyze-logs","generate-message","send-notification"],"SUMMARY_EN":"Every day at 10:00 UTC reads the application logs, analyzes them for errors and warnings, generates a summary and sends it to the admin chat.","TRIGGER":"cron","TZ":"UTC"},"health":"ok","id":"monitoring-logs-analyze","inSpecCorpus":false,"messages":[],"moduleName":"fn_monitoring_logs_analyze","name":{"en":"Daily log analysis","ru":"Ежедневный анализ логов"},"sha256":"95c9e9bbfaae6a21c206eb8bd48f2a4eb041ab64cfbb9e7e709069e3ac14de52","specPath":"specs/functions/monitoring-logs-analyze.t27","summary":{"en":"Every day at 10:00 UTC reads the application logs, analyzes them for errors and warnings, generates a summary and sends it to the admin chat.","ru":"Каждый день в 10:00 UTC читает логи приложения, ищет в них ошибки и предупреждения, формирует сводку и отправляет её в админ-чат."},"typecheckOk":true,"witness":"spec+code"},{"code":{"control":"spec+code","deployed":true,"file":"src/inngest_app/functions/monitoring/logMonitor.ts","legacyId":"trigger-log-monitor","probeResult":"COMPLETED","retries":1,"steps":4},"cronSpec":null,"differences":[],"discarded":0,"fields":{"CONTROL":"spec+code","CRON":"","DOMAIN":"monitoring","EVENT":"monitoring/logs.trigger","GUARD":"none","ID":"monitoring-logs-trigger","KIND":"function","LEGACY_EVENTS":["logs/monitor.trigger"],"LEGACY_ID":"trigger-log-monitor","NAME":"Log analysis on demand","NOTE":"Shares its file and its four steps with monitoring-logs-analyze; only the trigger differs.","ON_FAILURE":"log","PROBE_RESULT":"COMPLETED","REPO":"999-multibots-telegraf","RETRIES":1,"SAFE_PROBE":"{}","SERVICE":"src/inngest_app/functions/monitoring/logMonitor.ts:408","SIDE_EFFECTS":["messages-admin"],"STEPS":["read-logs","analyze-logs","generate-message","send-notification"],"SUMMARY_EN":"Runs the same log analysis as the daily job when asked by an event: reads the logs, analyzes them, generates the summary and sends it to the admin chat.","TRIGGER":"event","TZ":"UTC"},"health":"ok","id":"monitoring-logs-trigger","inSpecCorpus":false,"messages":[],"moduleName":"fn_monitoring_logs_trigger","name":{"en":"Log analysis on demand","ru":"Анализ логов по запросу"},"sha256":"9bb3e3fb5d73315392c6a08b674ca0b04d63b1e324dfa2a5ecb50bbdae6d074f","specPath":"specs/functions/monitoring-logs-trigger.t27","summary":{"en":"Runs the same log analysis as the daily job when asked by an event: reads the logs, analyzes them, generates the summary and sends it to the admin chat.","ru":"Выполняет тот же анализ логов, что и ежедневная задача, по событию: читает логи, анализирует их, формирует сводку и отправляет в админ-чат."},"typecheckOk":true,"witness":"spec+code"},{"code":{"control":"spec+code","deployed":true,"file":"src/inngest_app/functions/training/morphImages.ts","legacyId":"morph-images","probeResult":"FAILED-at-guard","retries":3,"steps":8},"cronSpec":null,"differences":[],"discarded":0,"fields":{"CONTROL":"spec+code","CRON":"","DOMAIN":"morph","EVENT":"morph/images.generate","GUARD":"check-user-exists","ID":"morph-images-generate","KIND":"function","LEGACY_EVENTS":["morph/images.requested"],"LEGACY_ID":"morph-images","NAME":"Morph images","NOTE":"Guard is check-user-exists. A second, unregistered copy of this function exists in the tree (src/inngest_app/functions/morphImages.ts); the registered one is the file named in SERVICE.","ON_FAILURE":"log","PROBE_RESULT":"FAILED-at-guard","REPO":"999-multibots-telegraf","RETRIES":3,"SAFE_PROBE":"{\"telegram_id\": \"0\", \"bot_name\": \"e2e_nonexistent_bot\", \"is_ru\": true, \"job_id\": \"e2e-probe\", \"image_files\": [], \"extraction_path\": \"/nonexistent/e2e\", \"morphing_type\": \"seamless\", \"model\": \"kling-v1.6-pro\"}","SERVICE":"src/inngest_app/functions/training/morphImages.ts:30","SIDE_EFFECTS":["charges-balance","paid-api","messages-user"],"STEPS":["check-user-exists","check-balance","notify-start","process-all-pairs","process-loop-pair","concatenate-all-videos","cleanup-temp-files","deliver-result"],"SUMMARY_EN":"Morphs a sequence of user images into one video: checks the user and the balance, notifies the start, processes each image pair into a clip, concatenates the clips, cleans up and delivers the result.","TRIGGER":"event","TZ":"UTC"},"health":"ok","id":"morph-images-generate","inSpecCorpus":false,"messages":[],"moduleName":"fn_morph_images_generate","name":{"en":"Morph images","ru":"Морфинг изображений"},"sha256":"2d830937229c3a5e780c372b433bbf53e38ccde9444ecb20e599fb20e65b2444","specPath":"specs/functions/morph-images-generate.t27","summary":{"en":"Morphs a sequence of user images into one video: checks the user and the balance, notifies the start, processes each image pair into a clip, concatenates the clips, cleans up and delivers the result.","ru":"Превращает последовательность изображений пользователя в одно видео: проверяет пользователя и баланс, сообщает о старте, обрабатывает каждую пару изображений в клип, склеивает клипы, очищает временные файлы и отдаёт результат."},"typecheckOk":true,"witness":"spec+code"},{"code":{"control":"spec+code","deployed":true,"file":"src/inngest_app/functions/neuroImageGeneration.ts","legacyId":"neuro-image-generation","probeResult":"FAILED-at-guard","retries":3,"steps":11},"cronSpec":null,"differences":[],"discarded":0,"fields":{"CONTROL":"spec+code","CRON":"","DOMAIN":"neuro","EVENT":"neuro/image.generate","GUARD":"check-user","ID":"neuro-image-generate","KIND":"function","LEGACY_EVENTS":["neuro/photo.generate"],"LEGACY_ID":"neuro-image-generation","NAME":"Neuro image generation","NOTE":"Guard is check-user: an unknown telegram_id stops the run before any payment or paid API call. The step names generate-image-${i} and notify-image-${i} are templates the code expands once per requested image.","ON_FAILURE":"admin-telegram","PROBE_RESULT":"FAILED-at-guard","REPO":"999-multibots-telegraf","RETRIES":3,"SAFE_PROBE":"{\"telegram_id\": \"0\", \"bot_name\": \"e2e_nonexistent_bot\", \"prompt\": \"safe-mode probe\", \"is_ru\": true, \"num_images\": 1, \"model_url\": \"e2e/none\"}","SERVICE":"src/inngest_app/functions/neuroImageGeneration.ts:56","SIDE_EFFECTS":["charges-balance","paid-api","messages-user","db-write"],"STEPS":["get-bot","check-user","get-user-gender","update-level","calculate-total-cost","process-payment","get-aspect-ratio","generate-image-${i}","notify-image-${i}","deduct-balance-final","final-notification"],"SUMMARY_EN":"Generates one or more images for a Telegram user from a prompt and a model URL: loads the bot and the user, computes the total cost, charges the balance, then generates and sends each image and settles the balance at the end.","TRIGGER":"event","TZ":"UTC"},"health":"ok","id":"neuro-image-generate","inSpecCorpus":false,"messages":[],"moduleName":"fn_neuro_image_generate","name":{"en":"Neuro image generation","ru":"Нейро-генерация изображений"},"sha256":"513d1e81f02cb450989ea83082948afcce37819434528fbed6b60930b2941fd8","specPath":"specs/functions/neuro-image-generate.t27","summary":{"en":"Generates one or more images for a Telegram user from a prompt and a model URL: loads the bot and the user, computes the total cost, charges the balance, then generates and sends each image and settles the balance at the end.","ru":"Генерирует одно или несколько изображений для пользователя Telegram по промпту и URL модели: загружает бота и пользователя, считает полную стоимость, списывает баланс, затем генерирует и отправляет каждое изображение и сводит баланс в конце."},"typecheckOk":true,"witness":"spec+code"},{"code":{"control":"spec+code","deployed":true,"file":null,"legacyId":"payment-processing-ai-server","probeResult":"COMPLETED","retries":null,"steps":0},"cronSpec":null,"differences":[{"code":"log","field":"ON_FAILURE","spec":"admin-telegram"}],"discarded":0,"fields":{"CONTROL":"spec+code","CRON":"","DOMAIN":"payment","EVENT":"payment/ai-server.process","GUARD":"amount-match","ID":"payment-ai-server-process","KIND":"function","LEGACY_EVENTS":["payment/process-ai-server"],"LEGACY_ID":"payment-processing-ai-server","NAME":"AI-server payment processing","NOTE":"The manifest carries no file, steps or retries for this function (its extractor did not resolve them); SERVICE, STEPS and RETRIES here were read from the same checkout, where retries is declared as 3 and onFailure is createInngestFailureHandler, which logs and messages the admin chat -- the manifest says on_failure log. Guard is amount-match: an amount matching no plan or option stops the run, which is why the 2026-09-09 probe with IncSum 0.01 COMPLETED without a balance change.","ON_FAILURE":"admin-telegram","PROBE_RESULT":"COMPLETED","REPO":"999-multibots-telegraf","RETRIES":3,"SAFE_PROBE":"{\"IncSum\": \"0.01\", \"inv_id\": \"e2e-safe-mode-probe\"}","SERVICE":"src/inngest_app/functions/payments/paymentProcessing.ts:64","SIDE_EFFECTS":["db-write","messages-user"],"STEPS":["check-subscription-plan","check-payment-option","get-user-info","get-bot-config","update-user-balance","send-notification"],"SUMMARY_EN":"Processes a payment reported by the AI server: matches the amount to a subscription plan or a payment option, loads the user and the bot configuration, updates the user balance and sends the payment notification.","TRIGGER":"event","TZ":"UTC"},"health":"warn","id":"payment-ai-server-process","inSpecCorpus":false,"messages":["ON_FAILURE \"admin-telegram\" differs from the manifest (\"log\")"],"moduleName":"fn_payment_ai_server_process","name":{"en":"AI-server payment processing","ru":"Обработка платежа AI-сервера"},"sha256":"07191109132327c0a3743ccc06815ccd2c64b5b6d604b358d26cb6e236dadfe6","specPath":"specs/functions/payment-ai-server-process.t27","summary":{"en":"Processes a payment reported by the AI server: matches the amount to a subscription plan or a payment option, loads the user and the bot configuration, updates the user balance and sends the payment notification.","ru":"Обрабатывает платёж, о котором сообщил AI-сервер: сопоставляет сумму с планом подписки или вариантом оплаты, загружает пользователя и конфигурацию бота, обновляет баланс и отправляет уведомление о платеже."},"typecheckOk":true,"witness":"spec+code"},{"code":{"control":"spec+code","deployed":true,"file":"src/inngest_app/functions/ai-reels-callback.ts","legacyId":"ai-reels-callback","probeResult":"FAILED-at-guard","retries":3,"steps":3},"cronSpec":null,"differences":[],"discarded":0,"fields":{"CONTROL":"spec+code","CRON":"","DOMAIN":"reels","EVENT":"reels/ai.callback","GUARD":"extract-job-id","ID":"reels-ai-callback","KIND":"function","LEGACY_EVENTS":["ai-reels-callback"],"LEGACY_ID":"ai-reels-callback","NAME":"AI reels callback","NOTE":"Guard is extract-job-id: a payload without a job id fails before anything is sent.","ON_FAILURE":"admin-telegram","PROBE_RESULT":"FAILED-at-guard","REPO":"999-multibots-telegraf","RETRIES":3,"SAFE_PROBE":"{}","SERVICE":"src/inngest_app/functions/ai-reels-callback.ts:158","SIDE_EFFECTS":["paid-api","messages-user"],"STEPS":["send-completed-video","send-failed-message","send-processing-update"],"SUMMARY_EN":"Handles the provider callback for an AI reel job: extracts the job id, then sends the completed video, a failure message or a processing update to the user who ordered it.","TRIGGER":"event","TZ":"UTC"},"health":"ok","id":"reels-ai-callback","inSpecCorpus":false,"messages":[],"moduleName":"fn_reels_ai_callback","name":{"en":"AI reels callback","ru":"Колбэк AI-рилсов"},"sha256":"8db0866dc43faf34aef111565007cdcdb66dd1d6dea46e8f7c7ab2ec97cdf13e","specPath":"specs/functions/reels-ai-callback.t27","summary":{"en":"Handles the provider callback for an AI reel job: extracts the job id, then sends the completed video, a failure message or a processing update to the user who ordered it.","ru":"Обрабатывает колбэк провайдера по задаче AI-рилса: извлекает id задачи, затем отправляет заказчику готовое видео, сообщение об ошибке или статус обработки."},"typecheckOk":true,"witness":"spec+code"},{"code":{"control":"spec+code","deployed":true,"file":"src/inngest_app/functions/existing/generateAIReelsFunction.ts","legacyId":"ai-reels-generation","probeResult":"skipped","retries":2,"steps":4},"cronSpec":null,"differences":[],"discarded":0,"fields":{"CONTROL":"spec+code","CRON":"","DOMAIN":"reels","EVENT":"reels/ai.generate","GUARD":"none","ID":"reels-ai-generate","KIND":"function","LEGACY_EVENTS":["ai-reels/generate"],"LEGACY_ID":"ai-reels-generation","NAME":"AI reels generation","NOTE":"No guard: the first step already calls a paid API, so the 2026-09-09 probe skipped this function (PROBE_RESULT skipped). The hardening list asks for a validate-input step before that call.","ON_FAILURE":"log","PROBE_RESULT":"skipped","REPO":"999-multibots-telegraf","RETRIES":2,"SAFE_PROBE":"","SERVICE":"src/inngest_app/functions/existing/generateAIReelsFunction.ts:44","SIDE_EFFECTS":["paid-api","messages-user"],"STEPS":["generate-lipsync-video","generate-wan25-video","merge-videos","notify-telegram"],"SUMMARY_EN":"Builds a short AI reel: a lip-sync video from an image and a text or audio track, a second generated clip, the two merged, and the result sent to the user in Telegram.","TRIGGER":"event","TZ":"UTC"},"health":"ok","id":"reels-ai-generate","inSpecCorpus":false,"messages":[],"moduleName":"fn_reels_ai_generate","name":{"en":"AI reels generation","ru":"Генерация AI-рилсов"},"sha256":"11108a3f4c94af03d615a4f82336b1671b293aa40409293448ae52a58d598b20","specPath":"specs/functions/reels-ai-generate.t27","summary":{"en":"Builds a short AI reel: a lip-sync video from an image and a text or audio track, a second generated clip, the two merged, and the result sent to the user in Telegram.","ru":"Собирает короткий AI-рилс: липсинк-видео из изображения и текста или аудио, второй сгенерированный клип, их склейка и отправка результата пользователю в Telegram."},"typecheckOk":true,"witness":"spec+code"},{"code":{"control":"spec+code","deployed":true,"file":"src/inngest_app/functions/existing/generateAdvancedLoopingVideoFunction.ts","legacyId":"generate-advanced-looping-video","probeResult":"FAILED-at-guard","retries":2,"steps":7},"cronSpec":null,"differences":[],"discarded":0,"fields":{"CONTROL":"spec+code","CRON":"","DOMAIN":"reels","EVENT":"reels/loop.generate","GUARD":"min-images","ID":"reels-loop-generate","KIND":"function","LEGACY_EVENTS":["reels/generate-advanced-loop"],"LEGACY_ID":"generate-advanced-looping-video","NAME":"Advanced looping video","NOTE":"Guard is min-images: fewer images than the minimum stops the run before any clip is generated.","ON_FAILURE":"log","PROBE_RESULT":"FAILED-at-guard","REPO":"999-multibots-telegraf","RETRIES":2,"SAFE_PROBE":"{\"telegram_id\": \"0\", \"image_urls\": [], \"bot_token\": \"\", \"prompt\": \"safe-mode probe\"}","SERVICE":"src/inngest_app/functions/existing/generateAdvancedLoopingVideoFunction.ts:77","SIDE_EFFECTS":["paid-api","messages-user"],"STEPS":["generate-morphing-clips","download-video-clips","combine-video-clips","add-music","send-to-telegram","send-to-pulse","cleanup"],"SUMMARY_EN":"Turns a set of user images into a looping video: morphing clips between the images, download and concatenation, background music, delivery to the user in Telegram and to the pulse channel, then cleanup.","TRIGGER":"event","TZ":"UTC"},"health":"ok","id":"reels-loop-generate","inSpecCorpus":false,"messages":[],"moduleName":"fn_reels_loop_generate","name":{"en":"Advanced looping video","ru":"Зацикленное видео"},"sha256":"3a9ce2c1a55f9cd69e4e74bc21a0f3d770f0c6d7846bb379a8233cc7583e2d2e","specPath":"specs/functions/reels-loop-generate.t27","summary":{"en":"Turns a set of user images into a looping video: morphing clips between the images, download and concatenation, background music, delivery to the user in Telegram and to the pulse channel, then cleanup.","ru":"Превращает набор изображений пользователя в зацикленное видео: морфинг-клипы между изображениями, скачивание и склейка, фоновая музыка, доставка пользователю в Telegram и в пульс-канал, затем очистка."},"typecheckOk":true,"witness":"spec+code"},{"code":{"control":"spec+code","deployed":true,"file":"src/inngest_app/functions/render/renderAvatarVideo.ts","legacyId":"render-avatar-video","probeResult":"FAILED-at-guard","retries":3,"steps":13},"cronSpec":null,"differences":[],"discarded":0,"fields":{"CONTROL":"spec+code","CRON":"","DOMAIN":"render","EVENT":"render/avatar-video.run","GUARD":"zod-schema","ID":"render-avatar-video-run","KIND":"function","LEGACY_EVENTS":["render/avatar-video"],"LEGACY_ID":"render-avatar-video","NAME":"Render avatar video","NOTE":"Guard is zod-schema. Each wait-* step polls a provider job until it completes.","ON_FAILURE":"admin-telegram","PROBE_RESULT":"FAILED-at-guard","REPO":"999-multibots-telegraf","RETRIES":3,"SAFE_PROBE":"{}","SERVICE":"src/inngest_app/functions/render/renderAvatarVideo.ts:174","SIDE_EFFECTS":["paid-api","external-webhook","db-write"],"STEPS":["create-job","generate-speech-audio","start-hedra-generation","wait-hedra-completion","start-heygen-generation","wait-heygen-completion","generate-transcription","generate-broll-prompts","generate-brolls-parallel","wait-brolls-completion","create-job-settings","upload-settings-to-s3","trigger-render"],"SUMMARY_EN":"Produces an avatar video: generates the speech audio, runs the avatar generation (Hedra, then HeyGen), transcribes, writes B-roll prompts and generates the B-rolls in parallel, then writes the job settings to S3 and triggers the render.","TRIGGER":"event","TZ":"UTC"},"health":"ok","id":"render-avatar-video-run","inSpecCorpus":false,"messages":[],"moduleName":"fn_render_avatar_video_run","name":{"en":"Render avatar video","ru":"Рендер аватар-видео"},"sha256":"c59d180a0c7866d5115f7d72ba3cf3f88e566c42936937fafba4eec89ab39820","specPath":"specs/functions/render-avatar-video-run.t27","summary":{"en":"Produces an avatar video: generates the speech audio, runs the avatar generation (Hedra, then HeyGen), transcribes, writes B-roll prompts and generates the B-rolls in parallel, then writes the job settings to S3 and triggers the render.","ru":"Создаёт аватар-видео: генерирует речь, запускает генерацию аватара (Hedra, затем HeyGen), расшифровывает, пишет промпты B-roll и параллельно генерирует B-roll, затем записывает настройки задачи в S3 и запускает рендер."},"typecheckOk":true,"witness":"spec+code"},{"code":{"control":"spec+code","deployed":true,"file":"src/inngest_app/functions/render/render.ts","legacyId":"render","probeResult":"FAILED-at-guard","retries":3,"steps":5},"cronSpec":null,"differences":[],"discarded":0,"fields":{"CONTROL":"spec+code","CRON":"","DOMAIN":"render","EVENT":"render/job.run","GUARD":"zod-schema","ID":"render-job-run","KIND":"function","LEGACY_EVENTS":["render"],"LEGACY_ID":"render","NAME":"Render job","NOTE":"Guard is zod-schema: the payload is parsed before any file is downloaded.","ON_FAILURE":"admin-telegram","PROBE_RESULT":"FAILED-at-guard","REPO":"999-multibots-telegraf","RETRIES":3,"SAFE_PROBE":"{}","SERVICE":"src/inngest_app/functions/render/render.ts:38","SIDE_EFFECTS":["paid-api","external-webhook","db-write"],"STEPS":["create-job-folder","download-files","render","upload-to-s3","callback"],"SUMMARY_EN":"Renders a video job on the render server: creates the job folder, downloads the inputs, renders, uploads the output to S3 and calls the job callback.","TRIGGER":"event","TZ":"UTC"},"health":"ok","id":"render-job-run","inSpecCorpus":false,"messages":[],"moduleName":"fn_render_job_run","name":{"en":"Render job","ru":"Задача рендера"},"sha256":"0119d4168128917ef6fbd8a991edae96003724af32280a9af0bd8fdbef080656","specPath":"specs/functions/render-job-run.t27","summary":{"en":"Renders a video job on the render server: creates the job folder, downloads the inputs, renders, uploads the output to S3 and calls the job callback.","ru":"Рендерит видеозадачу на рендер-сервере: создаёт папку задачи, скачивает входные файлы, рендерит, загружает результат в S3 и вызывает колбэк задачи."},"typecheckOk":true,"witness":"spec+code"},{"code":{"control":"spec+code","deployed":true,"file":"src/inngest_app/functions/render/renderRiddle.ts","legacyId":"render-riddle","probeResult":"FAILED-at-guard","retries":3,"steps":15},"cronSpec":null,"differences":[],"discarded":0,"fields":{"CONTROL":"spec+code","CRON":"","DOMAIN":"render","EVENT":"render/riddle.run","GUARD":"zod-schema","ID":"render-riddle-run","KIND":"function","LEGACY_EVENTS":["render-riddle"],"LEGACY_ID":"render-riddle","NAME":"Render riddle video","NOTE":"Guard is zod-schema. The step names generate-broll-${index} and wait-broll-${index} are templates expanded once per scene; start-avatar-generation and wait-avatar-completion appear twice in the code and are listed twice here.","ON_FAILURE":"log","PROBE_RESULT":"FAILED-at-guard","REPO":"999-multibots-telegraf","RETRIES":3,"SAFE_PROBE":"{}","SERVICE":"src/inngest_app/functions/render/renderRiddle.ts:59","SIDE_EFFECTS":["paid-api","external-webhook","db-write"],"STEPS":["preflight-render-capacity","load-template-json","create-job","generate-speech-audio","start-avatar-generation","wait-avatar-completion","start-avatar-generation","wait-avatar-completion","extract-avatar-speech-url","generate-transcription","generate-broll-prompts","generate-broll-${index}","wait-broll-${index}","prepare-template-json","trigger-render"],"SUMMARY_EN":"Produces a riddle video from a template: checks render capacity, loads the template, generates the speech audio and the avatar clips, transcribes, generates one B-roll per scene, prepares the template JSON and triggers the render.","TRIGGER":"event","TZ":"UTC"},"health":"ok","id":"render-riddle-run","inSpecCorpus":false,"messages":[],"moduleName":"fn_render_riddle_run","name":{"en":"Render riddle video","ru":"Рендер видео-загадки"},"sha256":"fab0efc9b80a37a8be8d288f95c9e1067c8c8bbcc70cc2af2f5d2f67a6f528f6","specPath":"specs/functions/render-riddle-run.t27","summary":{"en":"Produces a riddle video from a template: checks render capacity, loads the template, generates the speech audio and the avatar clips, transcribes, generates one B-roll per scene, prepares the template JSON and triggers the render.","ru":"Создаёт видео-загадку по шаблону: проверяет ёмкость рендера, загружает шаблон, генерирует речь и клипы аватара, расшифровывает, генерирует по одному B-roll на сцену, готовит JSON шаблона и запускает рендер."},"typecheckOk":true,"witness":"spec+code"},{"code":{"control":"spec+code","deployed":false,"file":"src/inngest_app/functions/existing/handleModelTrainingCompleted.ts","legacyId":"handle-model-training-completed","probeResult":"not-deployed","retries":2,"steps":3},"cronSpec":null,"differences":[],"discarded":0,"fields":{"CONTROL":"spec+code","CRON":"","DOMAIN":"training","EVENT":"training/model.complete","GUARD":"unknown","ID":"training-model-complete","KIND":"function","LEGACY_EVENTS":["model/training.completed"],"LEGACY_ID":"handle-model-training-completed","NAME":"Model training completed","NOTE":"Not on the production Railway build as of 2026-09-09 (deployed_2026_09_09 false in the manifest): the deployed app registers 24 base functions and this one is not among them. Guard is unknown because the function could not be probed there.","ON_FAILURE":"admin-telegram","PROBE_RESULT":"not-deployed","REPO":"999-multibots-telegraf","RETRIES":2,"SAFE_PROBE":"","SERVICE":"src/inngest_app/functions/existing/handleModelTrainingCompleted.ts:38","SIDE_EFFECTS":["charges-balance","paid-api","messages-user","db-write"],"STEPS":["find-training-record","update-training-status","send-telegram-notification"],"SUMMARY_EN":"Handles the training-completed event from the provider: finds the training record, updates its status and the model list, and sends the user a Telegram notification about the finished or failed training.","TRIGGER":"event","TZ":"UTC"},"health":"ok","id":"training-model-complete","inSpecCorpus":false,"messages":["not on the production build probed 2026-09-09 (deployed_2026_09_09 false)"],"moduleName":"fn_training_model_complete","name":{"en":"Model training completed","ru":"Обучение модели завершено"},"sha256":"7764be58758765cb0794cbd0621d91356ee6b71ba3adfb462f615b62111d7454","specPath":"specs/functions/training-model-complete.t27","summary":{"en":"Handles the training-completed event from the provider: finds the training record, updates its status and the model list, and sends the user a Telegram notification about the finished or failed training.","ru":"Обрабатывает событие завершения обучения от провайдера: находит запись обучения, обновляет её статус и список моделей и отправляет пользователю уведомление в Telegram о завершённом или упавшем обучении."},"typecheckOk":true,"witness":"spec+code"},{"code":{"control":"spec+code","deployed":true,"file":"src/inngest_app/functions/existing/generateModelTrainingFunction.ts","legacyId":"generate-model-training","probeResult":"FAILED-at-guard","retries":0,"steps":8},"cronSpec":null,"differences":[],"discarded":0,"fields":{"CONTROL":"spec+code","CRON":"","DOMAIN":"training","EVENT":"training/model.start","GUARD":"validate-steps","ID":"training-model-start","KIND":"function","LEGACY_EVENTS":["model/training.start"],"LEGACY_ID":"generate-model-training","NAME":"Model training start (v1)","NOTE":"RETRIES is 0 by declaration: a failed start is not retried, because a retry would create a second Replicate training. Guard is validate-steps.","ON_FAILURE":"log","PROBE_RESULT":"FAILED-at-guard","REPO":"999-multibots-telegraf","RETRIES":0,"SAFE_PROBE":"{\"telegram_id\": \"0\", \"bot_name\": \"e2e_nonexistent_bot\", \"steps\": -1, \"zipUrl\": \"\", \"triggerWord\": \"e2e\", \"modelName\": \"e2e\", \"is_ru\": true}","SERVICE":"src/inngest_app/functions/existing/generateModelTrainingFunction.ts:38","SIDE_EFFECTS":["charges-balance","paid-api","messages-user","db-write"],"STEPS":["validate-credentials","check-duplicates","validate-zip-url","create-replicate-model","save-pending-record","create-replicate-training","update-training-record","notify-user-started"],"SUMMARY_EN":"Starts a Replicate fine-tune for a user: validates credentials, refuses duplicates, checks the training archive URL, creates the Replicate model and training, records it, and tells the user the training has started.","TRIGGER":"event","TZ":"UTC"},"health":"ok","id":"training-model-start","inSpecCorpus":false,"messages":[],"moduleName":"fn_training_model_start","name":{"en":"Model training start (v1)","ru":"Старт обучения модели (v1)"},"sha256":"90fff63e83a250434c62c3918a91b8a53f7d72a93469ecb589470b1b1bee1c12","specPath":"specs/functions/training-model-start.t27","summary":{"en":"Starts a Replicate fine-tune for a user: validates credentials, refuses duplicates, checks the training archive URL, creates the Replicate model and training, records it, and tells the user the training has started.","ru":"Запускает дообучение на Replicate для пользователя: проверяет учётные данные, отклоняет дубликаты, проверяет URL архива, создаёт модель и обучение на Replicate, записывает их и сообщает пользователю о старте."},"typecheckOk":true,"witness":"spec+code"},{"code":{"control":"spec+code","deployed":true,"file":null,"legacyId":"model-training-v2","probeResult":"FAILED-at-guard","retries":null,"steps":0},"cronSpec":null,"differences":[],"discarded":0,"fields":{"CONTROL":"spec+code","CRON":"","DOMAIN":"training","EVENT":"training/model-v2.start","GUARD":"check-user-exists","ID":"training-model-v2-start","KIND":"function","LEGACY_EVENTS":["model/training.v2.requested"],"LEGACY_ID":"model-training-v2","NAME":"Model training start (v2)","NOTE":"The manifest carries no file, steps or retries for this function (its extractor did not resolve them); SERVICE, STEPS and RETRIES here were read from the same checkout. RETRIES is not declared in the code, so the Inngest JS SDK v3 default of 4 applies. Guard is check-user-exists.","ON_FAILURE":"log","PROBE_RESULT":"FAILED-at-guard","REPO":"999-multibots-telegraf","RETRIES":4,"SAFE_PROBE":"{\"telegram_id\": \"0\", \"bot_name\": \"e2e_nonexistent_bot\", \"zipUrl\": \"\", \"triggerWord\": \"e2e\", \"modelName\": \"e2e\", \"steps\": 1, \"is_ru\": true, \"gender\": \"male\"}","SERVICE":"src/inngest_app/functions/training/modelTrainingV2.ts:45","SIDE_EFFECTS":["charges-balance","paid-api","messages-user","db-write"],"STEPS":["check-user-exists","update-user-level","get-bot","check-balance","encode-zip","create-training","save-training-to-db","notify-user","deduct-balance","refund-balance","handle-error"],"SUMMARY_EN":"Starts a v2 fine-tune for a user: checks the user and the balance, encodes the training archive, creates the training on the provider, records it, deducts the balance and notifies the user; on a later failure the balance is refunded.","TRIGGER":"event","TZ":"UTC"},"health":"ok","id":"training-model-v2-start","inSpecCorpus":false,"messages":[],"moduleName":"fn_training_model_v2_start","name":{"en":"Model training start (v2)","ru":"Старт обучения модели (v2)"},"sha256":"c4524d253aa50af4b4f7a25d528df1a74f902d4229b0103aa6544a6f79e6274c","specPath":"specs/functions/training-model-v2-start.t27","summary":{"en":"Starts a v2 fine-tune for a user: checks the user and the balance, encodes the training archive, creates the training on the provider, records it, deducts the balance and notifies the user; on a later failure the balance is refunded.","ru":"Запускает дообучение v2 для пользователя: проверяет пользователя и баланс, кодирует архив обучения, создаёт обучение у провайдера, записывает его, списывает баланс и уведомляет пользователя; при последующем сбое баланс возвращается."},"typecheckOk":true,"witness":"spec+code"},{"code":{"control":"spec+code","deployed":false,"file":"src/inngest_app/functions/training/checkStuckTrainings.ts","legacyId":"check-stuck-trainings","probeResult":"not-deployed","retries":null,"steps":3},"cronSpec":"inngest/999-multibots-telegraf/check-stuck-trainings","differences":[],"discarded":0,"fields":{"CONTROL":"spec+code","CRON":"*/30 * * * *","DOMAIN":"training","EVENT":"","GUARD":"none","ID":"training-stuck-check","KIND":"function","LEGACY_EVENTS":[],"LEGACY_ID":"check-stuck-trainings","NAME":"Stuck trainings check","NOTE":"Not on the production Railway build as of 2026-09-09 (deployed_2026_09_09 false in the manifest). RETRIES is not declared in the code, so the Inngest JS SDK v3 default of 4 applies. The same schedule is stated as a cron card, specs/crons ID inngest/999-multibots-telegraf/check-stuck-trainings.","ON_FAILURE":"admin-telegram","PROBE_RESULT":"not-deployed","REPO":"999-multibots-telegraf","RETRIES":4,"SAFE_PROBE":"","SERVICE":"src/inngest_app/functions/training/checkStuckTrainings.ts:47","SIDE_EFFECTS":["charges-balance","paid-api","messages-user","db-write"],"STEPS":["find-stuck-trainings","check-replicate-status","send-completion-events"],"SUMMARY_EN":"Every 30 minutes finds model trainings still marked pending or processing past the stuck threshold, asks Replicate for their real status and emits the completion events that reconcile them.","TRIGGER":"cron","TZ":"UTC"},"health":"ok","id":"training-stuck-check","inSpecCorpus":false,"messages":["not on the production build probed 2026-09-09 (deployed_2026_09_09 false)"],"moduleName":"fn_training_stuck_check","name":{"en":"Stuck trainings check","ru":"Проверка застрявших обучений"},"sha256":"d8518fb2f0cc62a5ea0ec6d7517bdc477bef77cc95890dadf44381031ea43611","specPath":"specs/functions/training-stuck-check.t27","summary":{"en":"Every 30 minutes finds model trainings still marked pending or processing past the stuck threshold, asks Replicate for their real status and emits the completion events that reconcile them.","ru":"Каждые 30 минут находит обучения моделей, всё ещё отмеченные как pending или processing дольше порога, запрашивает у Replicate их реальный статус и порождает события завершения, которые их сверяют."},"typecheckOk":true,"witness":"spec+code"},{"code":{"control":"spec+code","deployed":false,"file":"src/inngest_app/functions/webhookHealthGuard.ts","legacyId":"validate-webhook-before-generation","probeResult":"not-deployed","retries":1,"steps":1},"cronSpec":null,"differences":[],"discarded":0,"fields":{"CONTROL":"spec+code","CRON":"","DOMAIN":"webhook","EVENT":"webhook/generation.validate","GUARD":"unknown","ID":"webhook-generation-validate","KIND":"function","LEGACY_EVENTS":["video/generation-validate-webhook"],"LEGACY_ID":"validate-webhook-before-generation","NAME":"Webhook validation before generation","NOTE":"Not on the production Railway build as of 2026-09-09 (deployed_2026_09_09 false in the manifest). Guard is unknown because the function could not be probed there. Two other functions in the same file (webhook-health-check, periodic-webhook-health-check) are not registered and have no spec.","ON_FAILURE":"admin-telegram","PROBE_RESULT":"not-deployed","REPO":"999-multibots-telegraf","RETRIES":1,"SAFE_PROBE":"","SERVICE":"src/inngest_app/functions/webhookHealthGuard.ts:147","SIDE_EFFECTS":["db-write"],"STEPS":["check-webhook-availability"],"SUMMARY_EN":"Checks that the video-generation webhook endpoint is reachable before a generation is started and records the result.","TRIGGER":"event","TZ":"UTC"},"health":"ok","id":"webhook-generation-validate","inSpecCorpus":false,"messages":["not on the production build probed 2026-09-09 (deployed_2026_09_09 false)"],"moduleName":"fn_webhook_generation_validate","name":{"en":"Webhook validation before generation","ru":"Проверка вебхука перед генерацией"},"sha256":"7a4293fa70eef3448b38f3e6c58d84becf127f5c561225ce43062b8c379e2719","specPath":"specs/functions/webhook-generation-validate.t27","summary":{"en":"Checks that the video-generation webhook endpoint is reachable before a generation is started and records the result.","ru":"Проверяет, что эндпоинт вебхука видеогенерации доступен до старта генерации, и записывает результат."},"typecheckOk":true,"witness":"spec+code"},{"code":{"control":"spec+code","deployed":false,"file":"src/inngest_app/functions/welcomeAvatarGeneration.ts","legacyId":"welcome-avatar-generation","probeResult":"not-deployed","retries":2,"steps":5},"cronSpec":null,"differences":[],"discarded":0,"fields":{"CONTROL":"spec+code","CRON":"","DOMAIN":"welcome","EVENT":"welcome/avatar.generate","GUARD":"unknown","ID":"welcome-avatar-generate","KIND":"function","LEGACY_EVENTS":["user/welcome.avatar.generate"],"LEGACY_ID":"welcome-avatar-generation","NAME":"Welcome avatar generation","NOTE":"Not on the production Railway build as of 2026-09-09 (deployed_2026_09_09 false in the manifest). Guard is unknown because the function could not be probed there.","ON_FAILURE":"admin-telegram","PROBE_RESULT":"not-deployed","REPO":"999-multibots-telegraf","RETRIES":2,"SAFE_PROBE":"","SERVICE":"src/inngest_app/functions/welcomeAvatarGeneration.ts:108","SIDE_EFFECTS":["paid-api","messages-user"],"STEPS":["validate-bot","select-hero","reserve-gift-slot","generate-image","send-welcome"],"SUMMARY_EN":"Generates a welcome avatar for a new user: validates the bot, selects a hero, reserves a gift slot, generates the image and sends the welcome message.","TRIGGER":"event","TZ":"UTC"},"health":"ok","id":"welcome-avatar-generate","inSpecCorpus":false,"messages":["not on the production build probed 2026-09-09 (deployed_2026_09_09 false)"],"moduleName":"fn_welcome_avatar_generate","name":{"en":"Welcome avatar generation","ru":"Приветственный аватар"},"sha256":"3b27453bd662eaee697645051447f1d63e66c5c2c64a3157ec7caa0be403f4b4","specPath":"specs/functions/welcome-avatar-generate.t27","summary":{"en":"Generates a welcome avatar for a new user: validates the bot, selects a hero, reserves a gift slot, generates the image and sends the welcome message.","ru":"Генерирует приветственный аватар для нового пользователя: проверяет бота, выбирает героя, резервирует слот подарка, генерирует изображение и отправляет приветственное сообщение."},"typecheckOk":true,"witness":"spec+code"}],"generatedAt":"2026-09-09T17:14:43.237Z","i18n":[{"bundle":"apps/website/i18n/agents.ru.json","coverage":{"n":28,"total":28},"enabled":true,"fields":["SUMMARY","NAME"],"locale":"ru","missing":[],"scope":["specs/skills","specs/crons","specs/agents","specs/functions","specs/tools"],"sha256":"c8871fb4ccdef8fc3cc2937af5db0e307ab0b62f6a03ece9f4512851ffd64f04","spec":"specs/i18n/agents-ru.t27"}],"ladder":{"agents":27,"crons":33,"functions":28,"skills":26,"specs":760,"tools":62},"manifest":{"deployedApp":{"baseFunctions":24,"mainRegisters":28,"name":"telegram-bot-client","sdk":"js v3.54.2"},"entries":28,"generatedFrom":{"branch":"main","commit":"a9c08b4","note":"Extracted from the source tree by the spec-first design pass of 2026-09-09; three entries carry no file/steps and eight carry retries null because the extractor did not resolve them. Copied by hand into this repository -- no sync script produces it yet."},"probedAt":"2026-09-09","repo":"gHashTag/999-multibots-telegraf"},"version":1} diff --git a/apps/website/public/skills/spec-skills.json b/apps/website/public/skills/spec-skills.json index e84fcaebc0..7a60dd677e 100644 --- a/apps/website/public/skills/spec-skills.json +++ b/apps/website/public/skills/spec-skills.json @@ -1 +1 @@ -{"codeOnly":[],"compilerWasmSha256":"4d9c0447b5ca288790ab03d3dffc2dda629ed47af9d6731a105fc923aea0aee4","contentSha256":"54810ec14338f3ef58eb70faeb0d24d600a3734bd7b14a370292c676831febff","counts":{"codeOnly":0,"runBy":0,"specOnly":0,"specPlusCode":26,"specs":26,"typecheckOk":26},"generatedAt":"2026-09-09T17:04:02.832Z","i18n":[{"bundle":"apps/website/i18n/agents.ru.json","coverage":{"n":26,"total":26},"enabled":true,"fields":["SUMMARY","NAME"],"locale":"ru","missing":[],"scope":["specs/skills","specs/crons","specs/agents","specs/functions","specs/tools"],"sha256":"c8871fb4ccdef8fc3cc2937af5db0e307ab0b62f6a03ece9f4512851ffd64f04","spec":"specs/i18n/agents-ru.t27"}],"skills":[{"code":{"health":"warn","link":"unbound","path":"t27/measure-corpus/SKILL.md","sha256":"b8fb7503f660a81b2fee57cde8998b18bbf6c6f334ca2ee69424c3ccf99f3211"},"discarded":0,"fields":{"COMMAND":"","ENABLED":true,"ID":"t27/measure-corpus","KIND":"skill","NAME":"MEASURE THE CORPUS","REPO":"t27","SOURCE":"SKILL.md","SPECS":[],"SUMMARY_EN":"Pick the right instrument for a claim about the t27 spec corpus, and avoid the specific traps that have produced wrong published numbers. Use before quoting any figure about specs, errors, or gates.","TAGS":["corpus","measurement","honesty"],"TIMEOUT_MIN":30},"health":"ok","id":"t27/measure-corpus","inSpecCorpus":false,"messages":[],"moduleName":"skill_t27_measure_corpus","name":{"en":"MEASURE THE CORPUS"},"runBy":[],"sha256":"740d067747a4de74acb2be6ba7072f11ef58da37700addab7e7a172cc0c397aa","specPath":"specs/skills/t27-measure-corpus.t27","summary":{"en":"Pick the right instrument for a claim about the t27 spec corpus, and avoid the specific traps that have produced wrong published numbers. Use before quoting any figure about specs, errors, or gates.","ru":"Выбор правильного инструмента для любого утверждения о корпусе спек t27 и список ловушек, которые уже давали неверные опубликованные числа. Использовать перед тем, как цитировать любое число о корпусе."},"typecheckOk":true,"witness":"spec+code"},{"code":{"health":"warn","link":"unbound","path":"t27/phi-loop/SKILL.md","sha256":"d8af7f6a9cbc39ed4557291528f36748e07292ef752f5159e2827f59b2dd7bc6"},"discarded":0,"fields":{"COMMAND":"","ENABLED":true,"ID":"t27/phi-loop","KIND":"skill","NAME":"PHI LOOP","REPO":"t27","SOURCE":"SKILL.md","SPECS":[],"SUMMARY_EN":"Execute 9-phase spec-first development workflow (Issue → Spec → TDD → Code → Gen → Seal → Verify → Land → Learn)","TAGS":["workflow","spec-first","tdd"],"TIMEOUT_MIN":30},"health":"ok","id":"t27/phi-loop","inSpecCorpus":false,"messages":[],"moduleName":"skill_t27_phi_loop","name":{"en":"PHI LOOP"},"runBy":[],"sha256":"19dba96ffef309c75a31bc54d282f25026afa8beeb3a6f97600946700a5f74db","specPath":"specs/skills/t27-phi-loop.t27","summary":{"en":"Execute 9-phase spec-first development workflow (Issue → Spec → TDD → Code → Gen → Seal → Verify → Land → Learn)","ru":"Девятифазный цикл spec-first разработки: Issue → Spec → TDD → Code → Gen → Seal → Verify → Land → Learn."},"typecheckOk":true,"witness":"spec+code"},{"code":{"health":"ok","link":"bound","path":"t27/tri/skill.md","sha256":"8fb4d4796c2dc7adab9670a65709ce0451633e6f1f076d5e490270596636042a"},"discarded":0,"fields":{"COMMAND":"/tri","ENABLED":true,"ID":"t27/tri","KIND":"skill","NAME":"tri","REPO":"t27","SOURCE":"skill.md","SPECS":["compiler/skill/registry.t27"],"SUMMARY_EN":"This skill should be used when user asks to \"tri skill begin\", \"PHI LOOP\", \"edit .t27 spec\", \"seal hash\", \"tri gen\", \"tri test\", \"tri verdict\", \"tri experience save\", \"tri notebook query\", \"tri notebook wrapup\", or any task requiring spe...","TAGS":["tri","workflow","seal"],"TIMEOUT_MIN":30},"health":"ok","id":"t27/tri","inSpecCorpus":false,"messages":[],"moduleName":"skill_t27_tri","name":{"en":"tri"},"runBy":[],"sha256":"99f03be9bbefc5f7c3b0637717e69650f11b0bf8644563b4e03bd24d12a66c89","specPath":"specs/skills/t27-tri.t27","summary":{"en":"This skill should be used when user asks to \"tri skill begin\", \"PHI LOOP\", \"edit .t27 spec\", \"seal hash\", \"tri gen\", \"tri test\", \"tri verdict\", \"tri experience save\", \"tri notebook query\", \"tri notebook wrapup\", or any task requiring spe...","ru":"Команды tri для работы со скилом: begin, правка .t27-спеки, seal hash, gen, test, verdict, experience. Реестр скилов описан в compiler/skill/registry.t27."},"typecheckOk":true,"witness":"spec+code"},{"code":{"health":"ok","link":"bound","path":"t27/tri-pipeline/SKILL.md","sha256":"b4bfc290b86a4a1d4513cf9ace0a43526ca8fe98e0d97ff1eb59ea7997aa7427"},"discarded":0,"fields":{"COMMAND":"","ENABLED":true,"ID":"t27/tri-pipeline","KIND":"skill","NAME":"TRI Pipeline","REPO":"t27","SOURCE":"SKILL.md","SPECS":["specs/pipeline/e2e_test.t27"],"SUMMARY_EN":"Execute tri commands (gen, test, verify, seal, verdict) for spec-first development","TAGS":["tri","pipeline","verify"],"TIMEOUT_MIN":30},"health":"ok","id":"t27/tri-pipeline","inSpecCorpus":false,"messages":[],"moduleName":"skill_t27_tri_pipeline","name":{"en":"TRI Pipeline"},"runBy":[],"sha256":"716635d0a782f18bfd6d112d88aeacc9e1961b81a85aec42b91a970fd55ce662","specPath":"specs/skills/t27-tri-pipeline.t27","summary":{"en":"Execute tri commands (gen, test, verify, seal, verdict) for spec-first development","ru":"Выполнение команд tri (gen, test, verify, seal, verdict) для spec-first разработки."},"typecheckOk":true,"witness":"spec+code"},{"code":{"health":"warn","link":"unbound","path":"t27/wave-audit/SKILL.md","sha256":"4cd0dd22105ae7fe86091a69ec297df729661181f147c0b59f8e8e94a90e9100"},"discarded":0,"fields":{"COMMAND":"","ENABLED":true,"ID":"t27/wave-audit","KIND":"skill","NAME":"Wave Audit — Comprehensive Project Analysis","REPO":"t27","SOURCE":"SKILL.md","SPECS":[],"SUMMARY_EN":"Full-spectrum audit of t27 project: GitHub issues analysis, weakness identification, SOTA research review, decomposed plan, and implementation of critical fixes.","TAGS":["audit","issues","plan"],"TIMEOUT_MIN":30},"health":"ok","id":"t27/wave-audit","inSpecCorpus":false,"messages":[],"moduleName":"skill_t27_wave_audit","name":{"en":"Wave Audit — Comprehensive Project Analysis"},"runBy":[],"sha256":"50c024be3d15fb0d68356ef3e918d71a1ddd3a6b315478927a996a5760efc1db","specPath":"specs/skills/t27-wave-audit.t27","summary":{"en":"Full-spectrum audit of t27 project: GitHub issues analysis, weakness identification, SOTA research review, decomposed plan, and implementation of critical fixes.","ru":"Полный аудит проекта t27: разбор GitHub issues, поиск слабых мест, обзор SOTA, декомпозированный план и реализация критичных исправлений."},"typecheckOk":true,"witness":"spec+code"},{"code":{"health":"ok","link":"bound","path":"t27/wrap-up/skill.md","sha256":"a4a9b4fd9d022c212add3479cde725f6b9bd56bc31d2d600ba771cbd009329f9"},"discarded":0,"fields":{"COMMAND":"/wrap-up","ENABLED":true,"ID":"t27/wrap-up","KIND":"skill","NAME":"wrap-up","REPO":"t27","SOURCE":"skill.md","SPECS":["specs/automation/wrapup-auto.t27"],"SUMMARY_EN":"Format and upload session wrap-up to NotebookLM for persistent semantic memory","TAGS":["memory","notebooklm","session"],"TIMEOUT_MIN":30},"health":"ok","id":"t27/wrap-up","inSpecCorpus":false,"messages":[],"moduleName":"skill_t27_wrap_up","name":{"en":"wrap-up"},"runBy":[],"sha256":"5f6e7ed53ca0f4ca52320a9c1ebdbbf079e371836de109c94dc440847fa0f2dc","specPath":"specs/skills/t27-wrap-up.t27","summary":{"en":"Format and upload session wrap-up to NotebookLM for persistent semantic memory","ru":"Оформление и загрузка итогов сессии в NotebookLM как постоянной семантической памяти."},"typecheckOk":true,"witness":"spec+code"},{"code":{"health":"warn","link":"unbound","path":"trinity/blog-post/SKILL.md","sha256":"2cb755fd4a60a76d568a0742aeda34da60a2441774139646e0ebf4bd2a185493"},"discarded":0,"fields":{"COMMAND":"/blog-post","ENABLED":true,"ID":"trinity/blog-post","KIND":"skill","NAME":"blog-post","REPO":"trinity","SOURCE":"SKILL.md","SPECS":[],"SUMMARY_EN":"Write and publish a post to the t27.ai blog. Covers where the blog actually lives (not where it looks like it lives), the Post schema with its required receipts and openQuestions, the honesty rules the data file itself imposes, and the b...","TAGS":["blog","publish","website"],"TIMEOUT_MIN":30},"health":"ok","id":"trinity/blog-post","inSpecCorpus":false,"messages":[],"moduleName":"skill_trinity_blog_post","name":{"en":"blog-post"},"runBy":[],"sha256":"028f49b8d26ed69b4f8db6991666a5f51b9a2c2737291ceb3258bfd11ff7c3e7","specPath":"specs/skills/trinity-blog-post.t27","summary":{"en":"Write and publish a post to the t27.ai blog. Covers where the blog actually lives (not where it looks like it lives), the Post schema with its required receipts and openQuestions, the honesty rules the data file itself imposes, and the b...","ru":"Написать и опубликовать пост в блог t27.ai: где блог реально живёт, схема Post с обязательными свидетельствами, обложка и проверки."},"typecheckOk":true,"witness":"spec+code"},{"code":{"health":"warn","link":"unbound","path":"trinity/board-sync/SKILL.md","sha256":"f4bfa63737cf7a2078ae6e42f68943384214159243243ae8ec971ddeaac1825e"},"discarded":0,"fields":{"COMMAND":"/board [sync|audit|fix]","ENABLED":true,"ID":"trinity/board-sync","KIND":"skill","NAME":"board","REPO":"trinity","SOURCE":"SKILL.md","SPECS":[],"SUMMARY_EN":"GitHub Project Board auto-sync — fill empty fields, sync labels with board status, audit field completeness. Keeps board as realtime source of truth.","TAGS":["github","board","labels"],"TIMEOUT_MIN":30},"health":"ok","id":"trinity/board-sync","inSpecCorpus":false,"messages":[],"moduleName":"skill_trinity_board_sync","name":{"en":"board"},"runBy":[],"sha256":"45ece51f52ec529802e387903a06b3fc58f3dcc088823785511c924c57567c32","specPath":"specs/skills/trinity-board-sync.t27","summary":{"en":"GitHub Project Board auto-sync — fill empty fields, sync labels with board status, audit field completeness. Keeps board as realtime source of truth.","ru":"Автосинхронизация GitHub Project Board: заполнить пустые поля, согласовать метки со статусом доски, проверить полноту полей."},"typecheckOk":true,"witness":"spec+code"},{"code":{"health":"warn","link":"unbound","path":"trinity/cloud/SKILL.md","sha256":"53aa338dddc4e6b8a0fd82f6d3b8dc9ac9b245b3457559c3c44f325ede0130e6"},"discarded":0,"fields":{"COMMAND":"/cloud [status|agents|events|full]","ENABLED":true,"ID":"trinity/cloud","KIND":"skill","NAME":"cloud","REPO":"trinity","SOURCE":"SKILL.md","SPECS":[],"SUMMARY_EN":"Show Trinity Cloud Dev dashboard — containers, training farm, issues, PRs, costs. Use when checking agent swarm status, cloud containers, or CI/CD pipeline.","TAGS":["dashboard","railway","agents"],"TIMEOUT_MIN":30},"health":"ok","id":"trinity/cloud","inSpecCorpus":false,"messages":[],"moduleName":"skill_trinity_cloud","name":{"en":"cloud"},"runBy":[],"sha256":"7eb9c81b10e1dd99998207ce71b792342f1f8bdd3852b974f27eb20418ca480e","specPath":"specs/skills/trinity-cloud.t27","summary":{"en":"Show Trinity Cloud Dev dashboard — containers, training farm, issues, PRs, costs. Use when checking agent swarm status, cloud containers, or CI/CD pipeline.","ru":"Панель Trinity Cloud Dev: контейнеры, тренировочная ферма, issues, PR, расходы. Для проверки состояния роя агентов и CI/CD."},"typecheckOk":true,"witness":"spec+code"},{"code":{"health":"warn","link":"unbound","path":"trinity/doctor/SKILL.md","sha256":"68efdf79301066d5e64e72babc91ddb867899786186fa360e6775b8365059815"},"discarded":0,"fields":{"COMMAND":"/doctor [quick|full|scan|junk|docs|dupes] [lang:ru|en]","ENABLED":true,"ID":"trinity/doctor","KIND":"skill","NAME":"doctor","REPO":"trinity","SOURCE":"SKILL.md","SPECS":[],"SUMMARY_EN":"HEALER — diagnose, heal, commit dirty files, monitor junk & docs & duplicates, report honestly. Every loop = action + proof.","TAGS":["health","repo","report"],"TIMEOUT_MIN":30},"health":"ok","id":"trinity/doctor","inSpecCorpus":false,"messages":[],"moduleName":"skill_trinity_doctor","name":{"en":"doctor"},"runBy":[],"sha256":"4e74c213b43b2b2c253dda134a93795b3a6e627a4711d5fc8dffb3067c1cb0b0","specPath":"specs/skills/trinity-doctor.t27","summary":{"en":"HEALER — diagnose, heal, commit dirty files, monitor junk & docs & duplicates, report honestly. Every loop = action + proof.","ru":"ЛЕКАРЬ: диагностика, лечение, коммит грязных файлов, надзор за мусором, документацией и дубликатами, честный отчёт. Каждый цикл = действие + доказательство."},"typecheckOk":true,"witness":"spec+code"},{"code":{"health":"warn","link":"unbound","path":"trinity/farm-garden/SKILL.md","sha256":"6721489885755a64bfdd07f0407b0ddad366c713cb2723098c0fc63b4e196bb4"},"discarded":0,"fields":{"COMMAND":"","ENABLED":true,"ID":"trinity/farm-garden","KIND":"skill","NAME":"Garden — Quantum Gardener for Trinity Farm","REPO":"trinity","SOURCE":"SKILL.md","SPECS":[],"SUMMARY_EN":"Autonomous farm population manager. Monitors, evolves, and recycles HSLM training workers.","TAGS":["farm","hslm","workers"],"TIMEOUT_MIN":30},"health":"ok","id":"trinity/farm-garden","inSpecCorpus":false,"messages":[],"moduleName":"skill_trinity_farm_garden","name":{"en":"Garden — Quantum Gardener for Trinity Farm"},"runBy":[],"sha256":"4afded3071ac34a51d06749ea6983dfd0238d1dcb78856ae19b836122019c080","specPath":"specs/skills/trinity-farm-garden.t27","summary":{"en":"Autonomous farm population manager. Monitors, evolves, and recycles HSLM training workers.","ru":"Автономный управляющий популяцией фермы: наблюдает, эволюционирует и перерабатывает рабочих обучения HSLM."},"typecheckOk":true,"witness":"spec+code"},{"code":{"health":"warn","link":"unbound","path":"trinity/fpga-synth/SKILL.md","sha256":"de3915e66cdab0f3207f53f6ea22a85b258c8a998b614231eebf7afab2ca9ec3"},"discarded":0,"fields":{"COMMAND":"/fpga-synth ","ENABLED":true,"ID":"trinity/fpga-synth","KIND":"skill","NAME":"fpga-synth","REPO":"trinity","SOURCE":"SKILL.md","SPECS":[],"SUMMARY_EN":"Run FPGA synthesis pipeline from .tri spec to bitstream. Use when working with Verilog, FPGA, or hardware synthesis.","TAGS":["fpga","verilog","synthesis"],"TIMEOUT_MIN":30},"health":"ok","id":"trinity/fpga-synth","inSpecCorpus":false,"messages":[],"moduleName":"skill_trinity_fpga_synth","name":{"en":"fpga-synth"},"runBy":[],"sha256":"2d3563e302746a958794670cd14404a7c4e6854dcf546468dd5f91907ff299e4","specPath":"specs/skills/trinity-fpga-synth.t27","summary":{"en":"Run FPGA synthesis pipeline from .tri spec to bitstream. Use when working with Verilog, FPGA, or hardware synthesis.","ru":"Конвейер синтеза FPGA от .tri-спеки до битстрима. Для работы с Verilog, FPGA и аппаратным синтезом."},"typecheckOk":true,"witness":"spec+code"},{"code":{"health":"warn","link":"unbound","path":"trinity/god-mode/SKILL.md","sha256":"0c48e328ae4cf1cbaffef270e7dbe16fac59a7fba845547179bcfe078f65ee7a"},"discarded":0,"fields":{"COMMAND":"/god-mode [status|agents|tasks|violations]","ENABLED":true,"ID":"trinity/god-mode","KIND":"skill","NAME":"god-mode","REPO":"trinity","SOURCE":"SKILL.md","SPECS":[],"SUMMARY_EN":"GOD MODE — Agent monitoring dashboard. Shows swarm status, task queue, pipeline compliance, circuit breakers, git activity, and rule violations.","TAGS":["dashboard","agents","monitoring"],"TIMEOUT_MIN":30},"health":"ok","id":"trinity/god-mode","inSpecCorpus":false,"messages":[],"moduleName":"skill_trinity_god_mode","name":{"en":"god-mode"},"runBy":[],"sha256":"577f3aa5eb4280c6be165fd7d0458fb849988246800eef63c77b3c774091706f","specPath":"specs/skills/trinity-god-mode.t27","summary":{"en":"GOD MODE — Agent monitoring dashboard. Shows swarm status, task queue, pipeline compliance, circuit breakers, git activity, and rule violations.","ru":"GOD MODE: панель наблюдения за агентами — состояние роя, очередь задач, соблюдение конвейера, предохранители, активность git, нарушения правил."},"typecheckOk":true,"witness":"spec+code"},{"code":{"health":"warn","link":"unbound","path":"trinity/implement-issue/SKILL.md","sha256":"88ccafaece204489bd38ee3f2fbd5f7db3d38275c2ba7e5a9bfca2852be596bb"},"discarded":0,"fields":{"COMMAND":"/implement-issue [issue-number]","ENABLED":true,"ID":"trinity/implement-issue","KIND":"skill","NAME":"implement-issue","REPO":"trinity","SOURCE":"SKILL.md","SPECS":[],"SUMMARY_EN":"Read a GitHub issue, create a branch, implement the solution, and open a PR. Use when given an issue number to implement.","TAGS":["github","issue","pr"],"TIMEOUT_MIN":30},"health":"ok","id":"trinity/implement-issue","inSpecCorpus":false,"messages":[],"moduleName":"skill_trinity_implement_issue","name":{"en":"implement-issue"},"runBy":[],"sha256":"789be8f18768603dfb45d8664ad51fc1bb1311f82a0288c3a93efc19c08534e6","specPath":"specs/skills/trinity-implement-issue.t27","summary":{"en":"Read a GitHub issue, create a branch, implement the solution, and open a PR. Use when given an issue number to implement.","ru":"Прочитать GitHub issue, создать ветку, реализовать решение и открыть PR. Для работы по номеру задачи."},"typecheckOk":true,"witness":"spec+code"},{"code":{"health":"warn","link":"unbound","path":"trinity/queen-hive-visuals/SKILL.md","sha256":"c6d914dc81c84fc13dacca37de258563261a451a139e3c1644bbdc8b7a97b414"},"discarded":0,"fields":{"COMMAND":"/queen-hive-visuals","ENABLED":true,"ID":"trinity/queen-hive-visuals","KIND":"skill","NAME":"queen-hive-visuals","REPO":"trinity","SOURCE":"SKILL.md","SPECS":[],"SUMMARY_EN":"Maintain QUEEN's floating hive, original point-down TRINITY logo, sharp issue displays and matching camera interactions.","TAGS":["queen","ui","3d"],"TIMEOUT_MIN":30},"health":"ok","id":"trinity/queen-hive-visuals","inSpecCorpus":false,"messages":[],"moduleName":"skill_trinity_queen_hive_visuals","name":{"en":"queen-hive-visuals"},"runBy":[],"sha256":"327c5189a740d092290fe5dd10de3cf4da56b54a44d1bec9be8414451e70ae0e","specPath":"specs/skills/trinity-queen-hive-visuals.t27","summary":{"en":"Maintain QUEEN's floating hive, original point-down TRINITY logo, sharp issue displays and matching camera interactions.","ru":"Поддержка плавающего улья Королевы, оригинального логотипа TRINITY остриём вниз, чётких табло задач и согласованных движений камеры."},"typecheckOk":true,"witness":"spec+code"},{"code":{"health":"warn","link":"unbound","path":"trinity/review-code/SKILL.md","sha256":"e5712744615c2422d9a0c81413422e6e1a2ac97c4bfac8bb508f1cd04bf05d75"},"discarded":0,"fields":{"COMMAND":"/review-code [file-or-branch] (optional)","ENABLED":true,"ID":"trinity/review-code","KIND":"skill","NAME":"review-code","REPO":"trinity","SOURCE":"SKILL.md","SPECS":[],"SUMMARY_EN":"Review recent code changes for bugs, style issues, and improvements. Use after writing code or before committing.","TAGS":["review","quality"],"TIMEOUT_MIN":30},"health":"ok","id":"trinity/review-code","inSpecCorpus":false,"messages":[],"moduleName":"skill_trinity_review_code","name":{"en":"review-code"},"runBy":[],"sha256":"c5cf6004cce2295f921b7d983e252a9aafbd92ad662db2d5b595824c2774b7a4","specPath":"specs/skills/trinity-review-code.t27","summary":{"en":"Review recent code changes for bugs, style issues, and improvements. Use after writing code or before committing.","ru":"Ревью недавних изменений кода: ошибки, стиль, улучшения. После написания кода или перед коммитом."},"typecheckOk":true,"witness":"spec+code"},{"code":{"health":"warn","link":"unbound","path":"trinity/run-tests/SKILL.md","sha256":"7ead75ab36b840ec5588013b0de8f2c23ed3a27a0d3a5160d7e68334e5992a79"},"discarded":0,"fields":{"COMMAND":"/run-tests [module] (optional - all, vsa, vm, bsd, hslm, tri-api)","ENABLED":true,"ID":"trinity/run-tests","KIND":"skill","NAME":"run-tests","REPO":"trinity","SOURCE":"SKILL.md","SPECS":[],"SUMMARY_EN":"Build the project, check for warnings, run all tests, and report results. Quick health check for the codebase.","TAGS":["tests","build","zig"],"TIMEOUT_MIN":30},"health":"ok","id":"trinity/run-tests","inSpecCorpus":false,"messages":[],"moduleName":"skill_trinity_run_tests","name":{"en":"run-tests"},"runBy":[],"sha256":"8c683823554ee75c69b4dd27468eb819bd8f7ea003e91cf216b80be03dca13a6","specPath":"specs/skills/trinity-run-tests.t27","summary":{"en":"Build the project, check for warnings, run all tests, and report results. Quick health check for the codebase.","ru":"Собрать проект, проверить предупреждения, прогнать все тесты и отчитаться. Быстрая проверка здоровья кодовой базы."},"typecheckOk":true,"witness":"spec+code"},{"code":{"health":"warn","link":"unbound","path":"trinity/scholar/SKILL.md","sha256":"5c35431008a4d2694cf2e7ad65c01d6f1559d5836b8f7cfb0c3422f752d5b2c2"},"discarded":0,"fields":{"COMMAND":"/scholar [scan|eval|apply|full|report|topic:\"query\"]","ENABLED":true,"ID":"trinity/scholar","KIND":"skill","NAME":"scholar","REPO":"trinity","SOURCE":"SKILL.md","SPECS":[],"SUMMARY_EN":"Self-Evolving Research Agent — scans web for relevant tech, evaluates findings, proposes improvements. Uses Perplexity Sonar API via MCP.","TAGS":["research","perplexity","mcp"],"TIMEOUT_MIN":30},"health":"ok","id":"trinity/scholar","inSpecCorpus":false,"messages":[],"moduleName":"skill_trinity_scholar","name":{"en":"scholar"},"runBy":[],"sha256":"70bc5c1e10d9905fa22a38de1c7b88926b75d69b6a82305e69613820f70f83ae","specPath":"specs/skills/trinity-scholar.t27","summary":{"en":"Self-Evolving Research Agent — scans web for relevant tech, evaluates findings, proposes improvements. Uses Perplexity Sonar API via MCP.","ru":"Саморазвивающийся исследовательский агент: сканирует веб на релевантные технологии, оценивает находки, предлагает улучшения. Perplexity Sonar через MCP."},"typecheckOk":true,"witness":"spec+code"},{"code":{"health":"warn","link":"unbound","path":"trinity/status/SKILL.md","sha256":"e4bc75ff45cdc52968f1ef0ac6e1a1a482072f78e14283b1e71b6fe13a054890"},"discarded":0,"fields":{"COMMAND":"/status [quick|full] [lang:ru|en]","ENABLED":true,"ID":"trinity/status","KIND":"skill","NAME":"status","REPO":"trinity","SOURCE":"SKILL.md","SPECS":[],"SUMMARY_EN":"Live system dashboard — 12-dimension ouroboros score, verdict v3, agents, build health, recommendations","TAGS":["dashboard","ouroboros","verdict"],"TIMEOUT_MIN":30},"health":"ok","id":"trinity/status","inSpecCorpus":false,"messages":[],"moduleName":"skill_trinity_status","name":{"en":"status"},"runBy":[],"sha256":"09185d50913f410e9c5cdd3338d2fd38adb97f0997208c6440c89b2325268b9c","specPath":"specs/skills/trinity-status.t27","summary":{"en":"Live system dashboard — 12-dimension ouroboros score, verdict v3, agents, build health, recommendations","ru":"Живая панель системы: 12-мерная оценка уробороса, verdict v3, агенты, здоровье сборки, рекомендации."},"typecheckOk":true,"witness":"spec+code"},{"code":{"health":"warn","link":"unbound","path":"trinity/tech-tree/SKILL.md","sha256":"f84c8ea67ab696a9bc3828ccfe8b8708572fe5ddb7574f409ddf75c467744a0f"},"discarded":0,"fields":{"COMMAND":"/tree [next|path|blocked|update]","ENABLED":true,"ID":"trinity/tech-tree","KIND":"skill","NAME":"tree","REPO":"trinity","SOURCE":"SKILL.md","SPECS":[],"SUMMARY_EN":"Technology dependency tree — shows issue DAG, prereqs, critical path, blocked/ready tasks. Single source of truth for work order.","TAGS":["issues","dag","planning"],"TIMEOUT_MIN":30},"health":"ok","id":"trinity/tech-tree","inSpecCorpus":false,"messages":[],"moduleName":"skill_trinity_tech_tree","name":{"en":"tree"},"runBy":[],"sha256":"951d3d8a6dd0c1c6c62a303c660a45205624bf2f558fd090b34fe5b45b9f1501","specPath":"specs/skills/trinity-tech-tree.t27","summary":{"en":"Technology dependency tree — shows issue DAG, prereqs, critical path, blocked/ready tasks. Single source of truth for work order.","ru":"Дерево технологических зависимостей: DAG задач, предпосылки, критический путь, заблокированные и готовые задачи. Единый источник порядка работ."},"typecheckOk":true,"witness":"spec+code"},{"code":{"health":"warn","link":"unbound","path":"trinity/tri/SKILL.md","sha256":"4c38d1005219336c88583e985b5208653fa199d12481d98173604922dc35e4a5"},"discarded":0,"fields":{"COMMAND":"/tri [short] [full] [audit] [coverage] [lang:ru|en] [humor|prof|toxic|zen]","ENABLED":true,"ID":"trinity/tri","KIND":"skill","NAME":"tri","REPO":"trinity","SOURCE":"SKILL.md","SPECS":[],"SUMMARY_EN":"TRI status dashboard — agent thought mode by default, /tri full for visual dashboard","TAGS":["tri","dashboard","status"],"TIMEOUT_MIN":30},"health":"ok","id":"trinity/tri","inSpecCorpus":false,"messages":[],"moduleName":"skill_trinity_tri","name":{"en":"tri"},"runBy":[],"sha256":"09f58e175bfeb73fb49d30bfdc6e0b197d775e6883fa8bb9417dffc92ffefebd","specPath":"specs/skills/trinity-tri.t27","summary":{"en":"TRI status dashboard — agent thought mode by default, /tri full for visual dashboard","ru":"Панель статуса TRI: по умолчанию режим мысли агента, /tri full — визуальная панель."},"typecheckOk":true,"witness":"spec+code"},{"code":{"health":"warn","link":"unbound","path":"trinity/trinity-test/SKILL.md","sha256":"648c7f095f0b9739a17d7a5d47fbfbe3e6dc2b2bd940fb6cea837632940b6c56"},"discarded":0,"fields":{"COMMAND":"/trinity-test [module] (vsa, vm, firebird, all)","ENABLED":true,"ID":"trinity/trinity-test","KIND":"skill","NAME":"trinity-test","REPO":"trinity","SOURCE":"SKILL.md","SPECS":[],"SUMMARY_EN":"Run Trinity test suites and analyze results. Use for testing VSA, VM, Firebird, WASM, or full test suite.","TAGS":["tests","vsa","vm"],"TIMEOUT_MIN":30},"health":"ok","id":"trinity/trinity-test","inSpecCorpus":false,"messages":[],"moduleName":"skill_trinity_trinity_test","name":{"en":"trinity-test"},"runBy":[],"sha256":"b70f5629049065477023aa4b4d51eb8272de0750a5c4809d7d445c698729c1a0","specPath":"specs/skills/trinity-trinity-test.t27","summary":{"en":"Run Trinity test suites and analyze results. Use for testing VSA, VM, Firebird, WASM, or full test suite.","ru":"Прогон тестовых наборов Trinity и разбор результатов: VSA, VM, Firebird, WASM или всё целиком."},"typecheckOk":true,"witness":"spec+code"},{"code":{"health":"warn","link":"unbound","path":"trinity/ux-wave/SKILL.md","sha256":"9690999e8d1e2091c80ef838e41a1d4dc48d9ffea1cf29a39294238f69954b28"},"discarded":0,"fields":{"COMMAND":"/ux-wave [wave-number] [audit]","ENABLED":true,"ID":"trinity/ux-wave","KIND":"skill","NAME":"ux-wave","REPO":"trinity","SOURCE":"SKILL.md","SPECS":[],"SUMMARY_EN":"Autonomous UX improvement waves — launch 4 parallel agents per wave, audit every 5 waves, commit fixes. For Queen UI chat & network polish.","TAGS":["ux","agents","queen"],"TIMEOUT_MIN":30},"health":"ok","id":"trinity/ux-wave","inSpecCorpus":false,"messages":[],"moduleName":"skill_trinity_ux_wave","name":{"en":"ux-wave"},"runBy":[],"sha256":"e63fa9e43303eefdf53f1f95499c15bb7794c7f08c9d14c1958f61e362e75ada","specPath":"specs/skills/trinity-ux-wave.t27","summary":{"en":"Autonomous UX improvement waves — launch 4 parallel agents per wave, audit every 5 waves, commit fixes. For Queen UI chat & network polish.","ru":"Автономные волны улучшения UX: 4 параллельных агента на волну, аудит каждые 5 волн, коммит исправлений. Для чата и сети Queen UI."},"typecheckOk":true,"witness":"spec+code"},{"code":{"health":"warn","link":"unbound","path":"trinity/vibee-gen/SKILL.md","sha256":"fc01e69f1395b590603692a29d9bb1ee533104bb716b5bb284738027df17b395"},"discarded":0,"fields":{"COMMAND":"/vibee-gen ","ENABLED":true,"ID":"trinity/vibee-gen","KIND":"skill","NAME":"vibee-gen","REPO":"trinity","SOURCE":"SKILL.md","SPECS":[],"SUMMARY_EN":"Generate Zig or Verilog code from VIBEE specifications. Use when creating or updating .tri specs and regenerating code.","TAGS":["codegen","zig","verilog"],"TIMEOUT_MIN":30},"health":"ok","id":"trinity/vibee-gen","inSpecCorpus":false,"messages":[],"moduleName":"skill_trinity_vibee_gen","name":{"en":"vibee-gen"},"runBy":[],"sha256":"769952ebb9d14eba7cdd2ee226b9d266de20e692ac0ee1e66ba6f622564a91f9","specPath":"specs/skills/trinity-vibee-gen.t27","summary":{"en":"Generate Zig or Verilog code from VIBEE specifications. Use when creating or updating .tri specs and regenerating code.","ru":"Генерация кода Zig или Verilog из спецификаций VIBEE. При создании или обновлении .tri-спек и перегенерации кода."},"typecheckOk":true,"witness":"spec+code"},{"code":{"health":"warn","link":"unbound","path":"trinity/vsa-verify/SKILL.md","sha256":"8b9c4518b1bc5dd468b12697a436f7d959278466b5282e575709d7981722905b"},"discarded":0,"fields":{"COMMAND":"/vsa-verify [operation or proof to verify]","ENABLED":true,"ID":"trinity/vsa-verify","KIND":"skill","NAME":"vsa-verify","REPO":"trinity","SOURCE":"SKILL.md","SPECS":[],"SUMMARY_EN":"Verify VSA (Vector Symbolic Architecture) mathematical proofs and operations. Use for math verification, bind/unbind/bundle testing, phi identity checks.","TAGS":["vsa","math","verify"],"TIMEOUT_MIN":30},"health":"ok","id":"trinity/vsa-verify","inSpecCorpus":false,"messages":[],"moduleName":"skill_trinity_vsa_verify","name":{"en":"vsa-verify"},"runBy":[],"sha256":"311455eaad1ec081b56395b38564babf52e10966f35b98b862d97bc5be60ff52","specPath":"specs/skills/trinity-vsa-verify.t27","summary":{"en":"Verify VSA (Vector Symbolic Architecture) mathematical proofs and operations. Use for math verification, bind/unbind/bundle testing, phi identity checks.","ru":"Проверка математических доказательств и операций VSA: bind/unbind/bundle, тождества phi."},"typecheckOk":true,"witness":"spec+code"},{"code":{"health":"warn","link":"unbound","path":"trinity/wave/SKILL.md","sha256":"ecf06fdfa467158f6758066aba41a8e49699f37e61c18e62716da765a7eb5487"},"discarded":0,"fields":{"COMMAND":"/wave [status|spawn |deploy|progress]","ENABLED":true,"ID":"trinity/wave","KIND":"skill","NAME":"wave","REPO":"trinity","SOURCE":"SKILL.md","SPECS":[],"SUMMARY_EN":"Farm wave management — create Railway accounts, spawn workers, deploy configs, track wave progress. Use for scaling training farm.","TAGS":["farm","railway","scaling"],"TIMEOUT_MIN":30},"health":"ok","id":"trinity/wave","inSpecCorpus":false,"messages":[],"moduleName":"skill_trinity_wave","name":{"en":"wave"},"runBy":[],"sha256":"0d205500e7adf560ff03ecfd59e90ee13b51f4624e27555d4142e5b184100d6b","specPath":"specs/skills/trinity-wave.t27","summary":{"en":"Farm wave management — create Railway accounts, spawn workers, deploy configs, track wave progress. Use for scaling training farm.","ru":"Управление волнами фермы: аккаунты Railway, запуск рабочих, раскатка конфигов, прогресс волны. Для масштабирования тренировочной фермы."},"typecheckOk":true,"witness":"spec+code"}],"version":1} +{"codeOnly":[],"compilerWasmSha256":"4d9c0447b5ca288790ab03d3dffc2dda629ed47af9d6731a105fc923aea0aee4","contentSha256":"54810ec14338f3ef58eb70faeb0d24d600a3734bd7b14a370292c676831febff","counts":{"codeOnly":0,"runBy":0,"specOnly":0,"specPlusCode":26,"specs":26,"typecheckOk":26},"generatedAt":"2026-09-09T17:14:43.237Z","i18n":[{"bundle":"apps/website/i18n/agents.ru.json","coverage":{"n":26,"total":26},"enabled":true,"fields":["SUMMARY","NAME"],"locale":"ru","missing":[],"scope":["specs/skills","specs/crons","specs/agents","specs/functions","specs/tools"],"sha256":"c8871fb4ccdef8fc3cc2937af5db0e307ab0b62f6a03ece9f4512851ffd64f04","spec":"specs/i18n/agents-ru.t27"}],"skills":[{"code":{"health":"warn","link":"unbound","path":"t27/measure-corpus/SKILL.md","sha256":"b8fb7503f660a81b2fee57cde8998b18bbf6c6f334ca2ee69424c3ccf99f3211"},"discarded":0,"fields":{"COMMAND":"","ENABLED":true,"ID":"t27/measure-corpus","KIND":"skill","NAME":"MEASURE THE CORPUS","REPO":"t27","SOURCE":"SKILL.md","SPECS":[],"SUMMARY_EN":"Pick the right instrument for a claim about the t27 spec corpus, and avoid the specific traps that have produced wrong published numbers. Use before quoting any figure about specs, errors, or gates.","TAGS":["corpus","measurement","honesty"],"TIMEOUT_MIN":30},"health":"ok","id":"t27/measure-corpus","inSpecCorpus":false,"messages":[],"moduleName":"skill_t27_measure_corpus","name":{"en":"MEASURE THE CORPUS"},"runBy":[],"sha256":"740d067747a4de74acb2be6ba7072f11ef58da37700addab7e7a172cc0c397aa","specPath":"specs/skills/t27-measure-corpus.t27","summary":{"en":"Pick the right instrument for a claim about the t27 spec corpus, and avoid the specific traps that have produced wrong published numbers. Use before quoting any figure about specs, errors, or gates.","ru":"Выбор правильного инструмента для любого утверждения о корпусе спек t27 и список ловушек, которые уже давали неверные опубликованные числа. Использовать перед тем, как цитировать любое число о корпусе."},"typecheckOk":true,"witness":"spec+code"},{"code":{"health":"warn","link":"unbound","path":"t27/phi-loop/SKILL.md","sha256":"d8af7f6a9cbc39ed4557291528f36748e07292ef752f5159e2827f59b2dd7bc6"},"discarded":0,"fields":{"COMMAND":"","ENABLED":true,"ID":"t27/phi-loop","KIND":"skill","NAME":"PHI LOOP","REPO":"t27","SOURCE":"SKILL.md","SPECS":[],"SUMMARY_EN":"Execute 9-phase spec-first development workflow (Issue → Spec → TDD → Code → Gen → Seal → Verify → Land → Learn)","TAGS":["workflow","spec-first","tdd"],"TIMEOUT_MIN":30},"health":"ok","id":"t27/phi-loop","inSpecCorpus":false,"messages":[],"moduleName":"skill_t27_phi_loop","name":{"en":"PHI LOOP"},"runBy":[],"sha256":"19dba96ffef309c75a31bc54d282f25026afa8beeb3a6f97600946700a5f74db","specPath":"specs/skills/t27-phi-loop.t27","summary":{"en":"Execute 9-phase spec-first development workflow (Issue → Spec → TDD → Code → Gen → Seal → Verify → Land → Learn)","ru":"Девятифазный цикл spec-first разработки: Issue → Spec → TDD → Code → Gen → Seal → Verify → Land → Learn."},"typecheckOk":true,"witness":"spec+code"},{"code":{"health":"ok","link":"bound","path":"t27/tri/skill.md","sha256":"8fb4d4796c2dc7adab9670a65709ce0451633e6f1f076d5e490270596636042a"},"discarded":0,"fields":{"COMMAND":"/tri","ENABLED":true,"ID":"t27/tri","KIND":"skill","NAME":"tri","REPO":"t27","SOURCE":"skill.md","SPECS":["compiler/skill/registry.t27"],"SUMMARY_EN":"This skill should be used when user asks to \"tri skill begin\", \"PHI LOOP\", \"edit .t27 spec\", \"seal hash\", \"tri gen\", \"tri test\", \"tri verdict\", \"tri experience save\", \"tri notebook query\", \"tri notebook wrapup\", or any task requiring spe...","TAGS":["tri","workflow","seal"],"TIMEOUT_MIN":30},"health":"ok","id":"t27/tri","inSpecCorpus":false,"messages":[],"moduleName":"skill_t27_tri","name":{"en":"tri"},"runBy":[],"sha256":"99f03be9bbefc5f7c3b0637717e69650f11b0bf8644563b4e03bd24d12a66c89","specPath":"specs/skills/t27-tri.t27","summary":{"en":"This skill should be used when user asks to \"tri skill begin\", \"PHI LOOP\", \"edit .t27 spec\", \"seal hash\", \"tri gen\", \"tri test\", \"tri verdict\", \"tri experience save\", \"tri notebook query\", \"tri notebook wrapup\", or any task requiring spe...","ru":"Команды tri для работы со скилом: begin, правка .t27-спеки, seal hash, gen, test, verdict, experience. Реестр скилов описан в compiler/skill/registry.t27."},"typecheckOk":true,"witness":"spec+code"},{"code":{"health":"ok","link":"bound","path":"t27/tri-pipeline/SKILL.md","sha256":"b4bfc290b86a4a1d4513cf9ace0a43526ca8fe98e0d97ff1eb59ea7997aa7427"},"discarded":0,"fields":{"COMMAND":"","ENABLED":true,"ID":"t27/tri-pipeline","KIND":"skill","NAME":"TRI Pipeline","REPO":"t27","SOURCE":"SKILL.md","SPECS":["specs/pipeline/e2e_test.t27"],"SUMMARY_EN":"Execute tri commands (gen, test, verify, seal, verdict) for spec-first development","TAGS":["tri","pipeline","verify"],"TIMEOUT_MIN":30},"health":"ok","id":"t27/tri-pipeline","inSpecCorpus":false,"messages":[],"moduleName":"skill_t27_tri_pipeline","name":{"en":"TRI Pipeline"},"runBy":[],"sha256":"716635d0a782f18bfd6d112d88aeacc9e1961b81a85aec42b91a970fd55ce662","specPath":"specs/skills/t27-tri-pipeline.t27","summary":{"en":"Execute tri commands (gen, test, verify, seal, verdict) for spec-first development","ru":"Выполнение команд tri (gen, test, verify, seal, verdict) для spec-first разработки."},"typecheckOk":true,"witness":"spec+code"},{"code":{"health":"warn","link":"unbound","path":"t27/wave-audit/SKILL.md","sha256":"4cd0dd22105ae7fe86091a69ec297df729661181f147c0b59f8e8e94a90e9100"},"discarded":0,"fields":{"COMMAND":"","ENABLED":true,"ID":"t27/wave-audit","KIND":"skill","NAME":"Wave Audit — Comprehensive Project Analysis","REPO":"t27","SOURCE":"SKILL.md","SPECS":[],"SUMMARY_EN":"Full-spectrum audit of t27 project: GitHub issues analysis, weakness identification, SOTA research review, decomposed plan, and implementation of critical fixes.","TAGS":["audit","issues","plan"],"TIMEOUT_MIN":30},"health":"ok","id":"t27/wave-audit","inSpecCorpus":false,"messages":[],"moduleName":"skill_t27_wave_audit","name":{"en":"Wave Audit — Comprehensive Project Analysis"},"runBy":[],"sha256":"50c024be3d15fb0d68356ef3e918d71a1ddd3a6b315478927a996a5760efc1db","specPath":"specs/skills/t27-wave-audit.t27","summary":{"en":"Full-spectrum audit of t27 project: GitHub issues analysis, weakness identification, SOTA research review, decomposed plan, and implementation of critical fixes.","ru":"Полный аудит проекта t27: разбор GitHub issues, поиск слабых мест, обзор SOTA, декомпозированный план и реализация критичных исправлений."},"typecheckOk":true,"witness":"spec+code"},{"code":{"health":"ok","link":"bound","path":"t27/wrap-up/skill.md","sha256":"a4a9b4fd9d022c212add3479cde725f6b9bd56bc31d2d600ba771cbd009329f9"},"discarded":0,"fields":{"COMMAND":"/wrap-up","ENABLED":true,"ID":"t27/wrap-up","KIND":"skill","NAME":"wrap-up","REPO":"t27","SOURCE":"skill.md","SPECS":["specs/automation/wrapup-auto.t27"],"SUMMARY_EN":"Format and upload session wrap-up to NotebookLM for persistent semantic memory","TAGS":["memory","notebooklm","session"],"TIMEOUT_MIN":30},"health":"ok","id":"t27/wrap-up","inSpecCorpus":false,"messages":[],"moduleName":"skill_t27_wrap_up","name":{"en":"wrap-up"},"runBy":[],"sha256":"5f6e7ed53ca0f4ca52320a9c1ebdbbf079e371836de109c94dc440847fa0f2dc","specPath":"specs/skills/t27-wrap-up.t27","summary":{"en":"Format and upload session wrap-up to NotebookLM for persistent semantic memory","ru":"Оформление и загрузка итогов сессии в NotebookLM как постоянной семантической памяти."},"typecheckOk":true,"witness":"spec+code"},{"code":{"health":"warn","link":"unbound","path":"trinity/blog-post/SKILL.md","sha256":"2cb755fd4a60a76d568a0742aeda34da60a2441774139646e0ebf4bd2a185493"},"discarded":0,"fields":{"COMMAND":"/blog-post","ENABLED":true,"ID":"trinity/blog-post","KIND":"skill","NAME":"blog-post","REPO":"trinity","SOURCE":"SKILL.md","SPECS":[],"SUMMARY_EN":"Write and publish a post to the t27.ai blog. Covers where the blog actually lives (not where it looks like it lives), the Post schema with its required receipts and openQuestions, the honesty rules the data file itself imposes, and the b...","TAGS":["blog","publish","website"],"TIMEOUT_MIN":30},"health":"ok","id":"trinity/blog-post","inSpecCorpus":false,"messages":[],"moduleName":"skill_trinity_blog_post","name":{"en":"blog-post"},"runBy":[],"sha256":"028f49b8d26ed69b4f8db6991666a5f51b9a2c2737291ceb3258bfd11ff7c3e7","specPath":"specs/skills/trinity-blog-post.t27","summary":{"en":"Write and publish a post to the t27.ai blog. Covers where the blog actually lives (not where it looks like it lives), the Post schema with its required receipts and openQuestions, the honesty rules the data file itself imposes, and the b...","ru":"Написать и опубликовать пост в блог t27.ai: где блог реально живёт, схема Post с обязательными свидетельствами, обложка и проверки."},"typecheckOk":true,"witness":"spec+code"},{"code":{"health":"warn","link":"unbound","path":"trinity/board-sync/SKILL.md","sha256":"f4bfa63737cf7a2078ae6e42f68943384214159243243ae8ec971ddeaac1825e"},"discarded":0,"fields":{"COMMAND":"/board [sync|audit|fix]","ENABLED":true,"ID":"trinity/board-sync","KIND":"skill","NAME":"board","REPO":"trinity","SOURCE":"SKILL.md","SPECS":[],"SUMMARY_EN":"GitHub Project Board auto-sync — fill empty fields, sync labels with board status, audit field completeness. Keeps board as realtime source of truth.","TAGS":["github","board","labels"],"TIMEOUT_MIN":30},"health":"ok","id":"trinity/board-sync","inSpecCorpus":false,"messages":[],"moduleName":"skill_trinity_board_sync","name":{"en":"board"},"runBy":[],"sha256":"45ece51f52ec529802e387903a06b3fc58f3dcc088823785511c924c57567c32","specPath":"specs/skills/trinity-board-sync.t27","summary":{"en":"GitHub Project Board auto-sync — fill empty fields, sync labels with board status, audit field completeness. Keeps board as realtime source of truth.","ru":"Автосинхронизация GitHub Project Board: заполнить пустые поля, согласовать метки со статусом доски, проверить полноту полей."},"typecheckOk":true,"witness":"spec+code"},{"code":{"health":"warn","link":"unbound","path":"trinity/cloud/SKILL.md","sha256":"53aa338dddc4e6b8a0fd82f6d3b8dc9ac9b245b3457559c3c44f325ede0130e6"},"discarded":0,"fields":{"COMMAND":"/cloud [status|agents|events|full]","ENABLED":true,"ID":"trinity/cloud","KIND":"skill","NAME":"cloud","REPO":"trinity","SOURCE":"SKILL.md","SPECS":[],"SUMMARY_EN":"Show Trinity Cloud Dev dashboard — containers, training farm, issues, PRs, costs. Use when checking agent swarm status, cloud containers, or CI/CD pipeline.","TAGS":["dashboard","railway","agents"],"TIMEOUT_MIN":30},"health":"ok","id":"trinity/cloud","inSpecCorpus":false,"messages":[],"moduleName":"skill_trinity_cloud","name":{"en":"cloud"},"runBy":[],"sha256":"7eb9c81b10e1dd99998207ce71b792342f1f8bdd3852b974f27eb20418ca480e","specPath":"specs/skills/trinity-cloud.t27","summary":{"en":"Show Trinity Cloud Dev dashboard — containers, training farm, issues, PRs, costs. Use when checking agent swarm status, cloud containers, or CI/CD pipeline.","ru":"Панель Trinity Cloud Dev: контейнеры, тренировочная ферма, issues, PR, расходы. Для проверки состояния роя агентов и CI/CD."},"typecheckOk":true,"witness":"spec+code"},{"code":{"health":"warn","link":"unbound","path":"trinity/doctor/SKILL.md","sha256":"68efdf79301066d5e64e72babc91ddb867899786186fa360e6775b8365059815"},"discarded":0,"fields":{"COMMAND":"/doctor [quick|full|scan|junk|docs|dupes] [lang:ru|en]","ENABLED":true,"ID":"trinity/doctor","KIND":"skill","NAME":"doctor","REPO":"trinity","SOURCE":"SKILL.md","SPECS":[],"SUMMARY_EN":"HEALER — diagnose, heal, commit dirty files, monitor junk & docs & duplicates, report honestly. Every loop = action + proof.","TAGS":["health","repo","report"],"TIMEOUT_MIN":30},"health":"ok","id":"trinity/doctor","inSpecCorpus":false,"messages":[],"moduleName":"skill_trinity_doctor","name":{"en":"doctor"},"runBy":[],"sha256":"4e74c213b43b2b2c253dda134a93795b3a6e627a4711d5fc8dffb3067c1cb0b0","specPath":"specs/skills/trinity-doctor.t27","summary":{"en":"HEALER — diagnose, heal, commit dirty files, monitor junk & docs & duplicates, report honestly. Every loop = action + proof.","ru":"ЛЕКАРЬ: диагностика, лечение, коммит грязных файлов, надзор за мусором, документацией и дубликатами, честный отчёт. Каждый цикл = действие + доказательство."},"typecheckOk":true,"witness":"spec+code"},{"code":{"health":"warn","link":"unbound","path":"trinity/farm-garden/SKILL.md","sha256":"6721489885755a64bfdd07f0407b0ddad366c713cb2723098c0fc63b4e196bb4"},"discarded":0,"fields":{"COMMAND":"","ENABLED":true,"ID":"trinity/farm-garden","KIND":"skill","NAME":"Garden — Quantum Gardener for Trinity Farm","REPO":"trinity","SOURCE":"SKILL.md","SPECS":[],"SUMMARY_EN":"Autonomous farm population manager. Monitors, evolves, and recycles HSLM training workers.","TAGS":["farm","hslm","workers"],"TIMEOUT_MIN":30},"health":"ok","id":"trinity/farm-garden","inSpecCorpus":false,"messages":[],"moduleName":"skill_trinity_farm_garden","name":{"en":"Garden — Quantum Gardener for Trinity Farm"},"runBy":[],"sha256":"4afded3071ac34a51d06749ea6983dfd0238d1dcb78856ae19b836122019c080","specPath":"specs/skills/trinity-farm-garden.t27","summary":{"en":"Autonomous farm population manager. Monitors, evolves, and recycles HSLM training workers.","ru":"Автономный управляющий популяцией фермы: наблюдает, эволюционирует и перерабатывает рабочих обучения HSLM."},"typecheckOk":true,"witness":"spec+code"},{"code":{"health":"warn","link":"unbound","path":"trinity/fpga-synth/SKILL.md","sha256":"de3915e66cdab0f3207f53f6ea22a85b258c8a998b614231eebf7afab2ca9ec3"},"discarded":0,"fields":{"COMMAND":"/fpga-synth ","ENABLED":true,"ID":"trinity/fpga-synth","KIND":"skill","NAME":"fpga-synth","REPO":"trinity","SOURCE":"SKILL.md","SPECS":[],"SUMMARY_EN":"Run FPGA synthesis pipeline from .tri spec to bitstream. Use when working with Verilog, FPGA, or hardware synthesis.","TAGS":["fpga","verilog","synthesis"],"TIMEOUT_MIN":30},"health":"ok","id":"trinity/fpga-synth","inSpecCorpus":false,"messages":[],"moduleName":"skill_trinity_fpga_synth","name":{"en":"fpga-synth"},"runBy":[],"sha256":"2d3563e302746a958794670cd14404a7c4e6854dcf546468dd5f91907ff299e4","specPath":"specs/skills/trinity-fpga-synth.t27","summary":{"en":"Run FPGA synthesis pipeline from .tri spec to bitstream. Use when working with Verilog, FPGA, or hardware synthesis.","ru":"Конвейер синтеза FPGA от .tri-спеки до битстрима. Для работы с Verilog, FPGA и аппаратным синтезом."},"typecheckOk":true,"witness":"spec+code"},{"code":{"health":"warn","link":"unbound","path":"trinity/god-mode/SKILL.md","sha256":"0c48e328ae4cf1cbaffef270e7dbe16fac59a7fba845547179bcfe078f65ee7a"},"discarded":0,"fields":{"COMMAND":"/god-mode [status|agents|tasks|violations]","ENABLED":true,"ID":"trinity/god-mode","KIND":"skill","NAME":"god-mode","REPO":"trinity","SOURCE":"SKILL.md","SPECS":[],"SUMMARY_EN":"GOD MODE — Agent monitoring dashboard. Shows swarm status, task queue, pipeline compliance, circuit breakers, git activity, and rule violations.","TAGS":["dashboard","agents","monitoring"],"TIMEOUT_MIN":30},"health":"ok","id":"trinity/god-mode","inSpecCorpus":false,"messages":[],"moduleName":"skill_trinity_god_mode","name":{"en":"god-mode"},"runBy":[],"sha256":"577f3aa5eb4280c6be165fd7d0458fb849988246800eef63c77b3c774091706f","specPath":"specs/skills/trinity-god-mode.t27","summary":{"en":"GOD MODE — Agent monitoring dashboard. Shows swarm status, task queue, pipeline compliance, circuit breakers, git activity, and rule violations.","ru":"GOD MODE: панель наблюдения за агентами — состояние роя, очередь задач, соблюдение конвейера, предохранители, активность git, нарушения правил."},"typecheckOk":true,"witness":"spec+code"},{"code":{"health":"warn","link":"unbound","path":"trinity/implement-issue/SKILL.md","sha256":"88ccafaece204489bd38ee3f2fbd5f7db3d38275c2ba7e5a9bfca2852be596bb"},"discarded":0,"fields":{"COMMAND":"/implement-issue [issue-number]","ENABLED":true,"ID":"trinity/implement-issue","KIND":"skill","NAME":"implement-issue","REPO":"trinity","SOURCE":"SKILL.md","SPECS":[],"SUMMARY_EN":"Read a GitHub issue, create a branch, implement the solution, and open a PR. Use when given an issue number to implement.","TAGS":["github","issue","pr"],"TIMEOUT_MIN":30},"health":"ok","id":"trinity/implement-issue","inSpecCorpus":false,"messages":[],"moduleName":"skill_trinity_implement_issue","name":{"en":"implement-issue"},"runBy":[],"sha256":"789be8f18768603dfb45d8664ad51fc1bb1311f82a0288c3a93efc19c08534e6","specPath":"specs/skills/trinity-implement-issue.t27","summary":{"en":"Read a GitHub issue, create a branch, implement the solution, and open a PR. Use when given an issue number to implement.","ru":"Прочитать GitHub issue, создать ветку, реализовать решение и открыть PR. Для работы по номеру задачи."},"typecheckOk":true,"witness":"spec+code"},{"code":{"health":"warn","link":"unbound","path":"trinity/queen-hive-visuals/SKILL.md","sha256":"c6d914dc81c84fc13dacca37de258563261a451a139e3c1644bbdc8b7a97b414"},"discarded":0,"fields":{"COMMAND":"/queen-hive-visuals","ENABLED":true,"ID":"trinity/queen-hive-visuals","KIND":"skill","NAME":"queen-hive-visuals","REPO":"trinity","SOURCE":"SKILL.md","SPECS":[],"SUMMARY_EN":"Maintain QUEEN's floating hive, original point-down TRINITY logo, sharp issue displays and matching camera interactions.","TAGS":["queen","ui","3d"],"TIMEOUT_MIN":30},"health":"ok","id":"trinity/queen-hive-visuals","inSpecCorpus":false,"messages":[],"moduleName":"skill_trinity_queen_hive_visuals","name":{"en":"queen-hive-visuals"},"runBy":[],"sha256":"327c5189a740d092290fe5dd10de3cf4da56b54a44d1bec9be8414451e70ae0e","specPath":"specs/skills/trinity-queen-hive-visuals.t27","summary":{"en":"Maintain QUEEN's floating hive, original point-down TRINITY logo, sharp issue displays and matching camera interactions.","ru":"Поддержка плавающего улья Королевы, оригинального логотипа TRINITY остриём вниз, чётких табло задач и согласованных движений камеры."},"typecheckOk":true,"witness":"spec+code"},{"code":{"health":"warn","link":"unbound","path":"trinity/review-code/SKILL.md","sha256":"e5712744615c2422d9a0c81413422e6e1a2ac97c4bfac8bb508f1cd04bf05d75"},"discarded":0,"fields":{"COMMAND":"/review-code [file-or-branch] (optional)","ENABLED":true,"ID":"trinity/review-code","KIND":"skill","NAME":"review-code","REPO":"trinity","SOURCE":"SKILL.md","SPECS":[],"SUMMARY_EN":"Review recent code changes for bugs, style issues, and improvements. Use after writing code or before committing.","TAGS":["review","quality"],"TIMEOUT_MIN":30},"health":"ok","id":"trinity/review-code","inSpecCorpus":false,"messages":[],"moduleName":"skill_trinity_review_code","name":{"en":"review-code"},"runBy":[],"sha256":"c5cf6004cce2295f921b7d983e252a9aafbd92ad662db2d5b595824c2774b7a4","specPath":"specs/skills/trinity-review-code.t27","summary":{"en":"Review recent code changes for bugs, style issues, and improvements. Use after writing code or before committing.","ru":"Ревью недавних изменений кода: ошибки, стиль, улучшения. После написания кода или перед коммитом."},"typecheckOk":true,"witness":"spec+code"},{"code":{"health":"warn","link":"unbound","path":"trinity/run-tests/SKILL.md","sha256":"7ead75ab36b840ec5588013b0de8f2c23ed3a27a0d3a5160d7e68334e5992a79"},"discarded":0,"fields":{"COMMAND":"/run-tests [module] (optional - all, vsa, vm, bsd, hslm, tri-api)","ENABLED":true,"ID":"trinity/run-tests","KIND":"skill","NAME":"run-tests","REPO":"trinity","SOURCE":"SKILL.md","SPECS":[],"SUMMARY_EN":"Build the project, check for warnings, run all tests, and report results. Quick health check for the codebase.","TAGS":["tests","build","zig"],"TIMEOUT_MIN":30},"health":"ok","id":"trinity/run-tests","inSpecCorpus":false,"messages":[],"moduleName":"skill_trinity_run_tests","name":{"en":"run-tests"},"runBy":[],"sha256":"8c683823554ee75c69b4dd27468eb819bd8f7ea003e91cf216b80be03dca13a6","specPath":"specs/skills/trinity-run-tests.t27","summary":{"en":"Build the project, check for warnings, run all tests, and report results. Quick health check for the codebase.","ru":"Собрать проект, проверить предупреждения, прогнать все тесты и отчитаться. Быстрая проверка здоровья кодовой базы."},"typecheckOk":true,"witness":"spec+code"},{"code":{"health":"warn","link":"unbound","path":"trinity/scholar/SKILL.md","sha256":"5c35431008a4d2694cf2e7ad65c01d6f1559d5836b8f7cfb0c3422f752d5b2c2"},"discarded":0,"fields":{"COMMAND":"/scholar [scan|eval|apply|full|report|topic:\"query\"]","ENABLED":true,"ID":"trinity/scholar","KIND":"skill","NAME":"scholar","REPO":"trinity","SOURCE":"SKILL.md","SPECS":[],"SUMMARY_EN":"Self-Evolving Research Agent — scans web for relevant tech, evaluates findings, proposes improvements. Uses Perplexity Sonar API via MCP.","TAGS":["research","perplexity","mcp"],"TIMEOUT_MIN":30},"health":"ok","id":"trinity/scholar","inSpecCorpus":false,"messages":[],"moduleName":"skill_trinity_scholar","name":{"en":"scholar"},"runBy":[],"sha256":"70bc5c1e10d9905fa22a38de1c7b88926b75d69b6a82305e69613820f70f83ae","specPath":"specs/skills/trinity-scholar.t27","summary":{"en":"Self-Evolving Research Agent — scans web for relevant tech, evaluates findings, proposes improvements. Uses Perplexity Sonar API via MCP.","ru":"Саморазвивающийся исследовательский агент: сканирует веб на релевантные технологии, оценивает находки, предлагает улучшения. Perplexity Sonar через MCP."},"typecheckOk":true,"witness":"spec+code"},{"code":{"health":"warn","link":"unbound","path":"trinity/status/SKILL.md","sha256":"e4bc75ff45cdc52968f1ef0ac6e1a1a482072f78e14283b1e71b6fe13a054890"},"discarded":0,"fields":{"COMMAND":"/status [quick|full] [lang:ru|en]","ENABLED":true,"ID":"trinity/status","KIND":"skill","NAME":"status","REPO":"trinity","SOURCE":"SKILL.md","SPECS":[],"SUMMARY_EN":"Live system dashboard — 12-dimension ouroboros score, verdict v3, agents, build health, recommendations","TAGS":["dashboard","ouroboros","verdict"],"TIMEOUT_MIN":30},"health":"ok","id":"trinity/status","inSpecCorpus":false,"messages":[],"moduleName":"skill_trinity_status","name":{"en":"status"},"runBy":[],"sha256":"09185d50913f410e9c5cdd3338d2fd38adb97f0997208c6440c89b2325268b9c","specPath":"specs/skills/trinity-status.t27","summary":{"en":"Live system dashboard — 12-dimension ouroboros score, verdict v3, agents, build health, recommendations","ru":"Живая панель системы: 12-мерная оценка уробороса, verdict v3, агенты, здоровье сборки, рекомендации."},"typecheckOk":true,"witness":"spec+code"},{"code":{"health":"warn","link":"unbound","path":"trinity/tech-tree/SKILL.md","sha256":"f84c8ea67ab696a9bc3828ccfe8b8708572fe5ddb7574f409ddf75c467744a0f"},"discarded":0,"fields":{"COMMAND":"/tree [next|path|blocked|update]","ENABLED":true,"ID":"trinity/tech-tree","KIND":"skill","NAME":"tree","REPO":"trinity","SOURCE":"SKILL.md","SPECS":[],"SUMMARY_EN":"Technology dependency tree — shows issue DAG, prereqs, critical path, blocked/ready tasks. Single source of truth for work order.","TAGS":["issues","dag","planning"],"TIMEOUT_MIN":30},"health":"ok","id":"trinity/tech-tree","inSpecCorpus":false,"messages":[],"moduleName":"skill_trinity_tech_tree","name":{"en":"tree"},"runBy":[],"sha256":"951d3d8a6dd0c1c6c62a303c660a45205624bf2f558fd090b34fe5b45b9f1501","specPath":"specs/skills/trinity-tech-tree.t27","summary":{"en":"Technology dependency tree — shows issue DAG, prereqs, critical path, blocked/ready tasks. Single source of truth for work order.","ru":"Дерево технологических зависимостей: DAG задач, предпосылки, критический путь, заблокированные и готовые задачи. Единый источник порядка работ."},"typecheckOk":true,"witness":"spec+code"},{"code":{"health":"warn","link":"unbound","path":"trinity/tri/SKILL.md","sha256":"4c38d1005219336c88583e985b5208653fa199d12481d98173604922dc35e4a5"},"discarded":0,"fields":{"COMMAND":"/tri [short] [full] [audit] [coverage] [lang:ru|en] [humor|prof|toxic|zen]","ENABLED":true,"ID":"trinity/tri","KIND":"skill","NAME":"tri","REPO":"trinity","SOURCE":"SKILL.md","SPECS":[],"SUMMARY_EN":"TRI status dashboard — agent thought mode by default, /tri full for visual dashboard","TAGS":["tri","dashboard","status"],"TIMEOUT_MIN":30},"health":"ok","id":"trinity/tri","inSpecCorpus":false,"messages":[],"moduleName":"skill_trinity_tri","name":{"en":"tri"},"runBy":[],"sha256":"09f58e175bfeb73fb49d30bfdc6e0b197d775e6883fa8bb9417dffc92ffefebd","specPath":"specs/skills/trinity-tri.t27","summary":{"en":"TRI status dashboard — agent thought mode by default, /tri full for visual dashboard","ru":"Панель статуса TRI: по умолчанию режим мысли агента, /tri full — визуальная панель."},"typecheckOk":true,"witness":"spec+code"},{"code":{"health":"warn","link":"unbound","path":"trinity/trinity-test/SKILL.md","sha256":"648c7f095f0b9739a17d7a5d47fbfbe3e6dc2b2bd940fb6cea837632940b6c56"},"discarded":0,"fields":{"COMMAND":"/trinity-test [module] (vsa, vm, firebird, all)","ENABLED":true,"ID":"trinity/trinity-test","KIND":"skill","NAME":"trinity-test","REPO":"trinity","SOURCE":"SKILL.md","SPECS":[],"SUMMARY_EN":"Run Trinity test suites and analyze results. Use for testing VSA, VM, Firebird, WASM, or full test suite.","TAGS":["tests","vsa","vm"],"TIMEOUT_MIN":30},"health":"ok","id":"trinity/trinity-test","inSpecCorpus":false,"messages":[],"moduleName":"skill_trinity_trinity_test","name":{"en":"trinity-test"},"runBy":[],"sha256":"b70f5629049065477023aa4b4d51eb8272de0750a5c4809d7d445c698729c1a0","specPath":"specs/skills/trinity-trinity-test.t27","summary":{"en":"Run Trinity test suites and analyze results. Use for testing VSA, VM, Firebird, WASM, or full test suite.","ru":"Прогон тестовых наборов Trinity и разбор результатов: VSA, VM, Firebird, WASM или всё целиком."},"typecheckOk":true,"witness":"spec+code"},{"code":{"health":"warn","link":"unbound","path":"trinity/ux-wave/SKILL.md","sha256":"9690999e8d1e2091c80ef838e41a1d4dc48d9ffea1cf29a39294238f69954b28"},"discarded":0,"fields":{"COMMAND":"/ux-wave [wave-number] [audit]","ENABLED":true,"ID":"trinity/ux-wave","KIND":"skill","NAME":"ux-wave","REPO":"trinity","SOURCE":"SKILL.md","SPECS":[],"SUMMARY_EN":"Autonomous UX improvement waves — launch 4 parallel agents per wave, audit every 5 waves, commit fixes. For Queen UI chat & network polish.","TAGS":["ux","agents","queen"],"TIMEOUT_MIN":30},"health":"ok","id":"trinity/ux-wave","inSpecCorpus":false,"messages":[],"moduleName":"skill_trinity_ux_wave","name":{"en":"ux-wave"},"runBy":[],"sha256":"e63fa9e43303eefdf53f1f95499c15bb7794c7f08c9d14c1958f61e362e75ada","specPath":"specs/skills/trinity-ux-wave.t27","summary":{"en":"Autonomous UX improvement waves — launch 4 parallel agents per wave, audit every 5 waves, commit fixes. For Queen UI chat & network polish.","ru":"Автономные волны улучшения UX: 4 параллельных агента на волну, аудит каждые 5 волн, коммит исправлений. Для чата и сети Queen UI."},"typecheckOk":true,"witness":"spec+code"},{"code":{"health":"warn","link":"unbound","path":"trinity/vibee-gen/SKILL.md","sha256":"fc01e69f1395b590603692a29d9bb1ee533104bb716b5bb284738027df17b395"},"discarded":0,"fields":{"COMMAND":"/vibee-gen ","ENABLED":true,"ID":"trinity/vibee-gen","KIND":"skill","NAME":"vibee-gen","REPO":"trinity","SOURCE":"SKILL.md","SPECS":[],"SUMMARY_EN":"Generate Zig or Verilog code from VIBEE specifications. Use when creating or updating .tri specs and regenerating code.","TAGS":["codegen","zig","verilog"],"TIMEOUT_MIN":30},"health":"ok","id":"trinity/vibee-gen","inSpecCorpus":false,"messages":[],"moduleName":"skill_trinity_vibee_gen","name":{"en":"vibee-gen"},"runBy":[],"sha256":"769952ebb9d14eba7cdd2ee226b9d266de20e692ac0ee1e66ba6f622564a91f9","specPath":"specs/skills/trinity-vibee-gen.t27","summary":{"en":"Generate Zig or Verilog code from VIBEE specifications. Use when creating or updating .tri specs and regenerating code.","ru":"Генерация кода Zig или Verilog из спецификаций VIBEE. При создании или обновлении .tri-спек и перегенерации кода."},"typecheckOk":true,"witness":"spec+code"},{"code":{"health":"warn","link":"unbound","path":"trinity/vsa-verify/SKILL.md","sha256":"8b9c4518b1bc5dd468b12697a436f7d959278466b5282e575709d7981722905b"},"discarded":0,"fields":{"COMMAND":"/vsa-verify [operation or proof to verify]","ENABLED":true,"ID":"trinity/vsa-verify","KIND":"skill","NAME":"vsa-verify","REPO":"trinity","SOURCE":"SKILL.md","SPECS":[],"SUMMARY_EN":"Verify VSA (Vector Symbolic Architecture) mathematical proofs and operations. Use for math verification, bind/unbind/bundle testing, phi identity checks.","TAGS":["vsa","math","verify"],"TIMEOUT_MIN":30},"health":"ok","id":"trinity/vsa-verify","inSpecCorpus":false,"messages":[],"moduleName":"skill_trinity_vsa_verify","name":{"en":"vsa-verify"},"runBy":[],"sha256":"311455eaad1ec081b56395b38564babf52e10966f35b98b862d97bc5be60ff52","specPath":"specs/skills/trinity-vsa-verify.t27","summary":{"en":"Verify VSA (Vector Symbolic Architecture) mathematical proofs and operations. Use for math verification, bind/unbind/bundle testing, phi identity checks.","ru":"Проверка математических доказательств и операций VSA: bind/unbind/bundle, тождества phi."},"typecheckOk":true,"witness":"spec+code"},{"code":{"health":"warn","link":"unbound","path":"trinity/wave/SKILL.md","sha256":"ecf06fdfa467158f6758066aba41a8e49699f37e61c18e62716da765a7eb5487"},"discarded":0,"fields":{"COMMAND":"/wave [status|spawn |deploy|progress]","ENABLED":true,"ID":"trinity/wave","KIND":"skill","NAME":"wave","REPO":"trinity","SOURCE":"SKILL.md","SPECS":[],"SUMMARY_EN":"Farm wave management — create Railway accounts, spawn workers, deploy configs, track wave progress. Use for scaling training farm.","TAGS":["farm","railway","scaling"],"TIMEOUT_MIN":30},"health":"ok","id":"trinity/wave","inSpecCorpus":false,"messages":[],"moduleName":"skill_trinity_wave","name":{"en":"wave"},"runBy":[],"sha256":"0d205500e7adf560ff03ecfd59e90ee13b51f4624e27555d4142e5b184100d6b","specPath":"specs/skills/trinity-wave.t27","summary":{"en":"Farm wave management — create Railway accounts, spawn workers, deploy configs, track wave progress. Use for scaling training farm.","ru":"Управление волнами фермы: аккаунты Railway, запуск рабочих, раскатка конфигов, прогресс волны. Для масштабирования тренировочной фермы."},"typecheckOk":true,"witness":"spec+code"}],"version":1} diff --git a/apps/website/public/t27/files/AGENTS.md b/apps/website/public/t27/files/AGENTS.md new file mode 100644 index 0000000000..cdf6943056 --- /dev/null +++ b/apps/website/public/t27/files/AGENTS.md @@ -0,0 +1,93 @@ +# AGENTS — Trinity S³AI / t27 + +This file is the **repository entry point** for humans and coding agents. It summarizes **where law lives** and **how to work safely** in this tree. + +--- + +## 1. Read first (constitutional stack) + +| Order | File | Role | +|------:|------|------| +| 1 | [`SOUL.md`](SOUL.md) | **Canonical** constitution (language policy, TDD mandate, validation). | +| 2 | [`docs/nona-03-manifest/SOUL.md`](docs/nona-03-manifest/SOUL.md) | Expanded reference; if it conflicts with root `SOUL.md`, **root wins**. | +| 3 | [`docs/T27-CONSTITUTION.md`](docs/T27-CONSTITUTION.md) | **SSOT-MATH**, **LANG-EN**, **DOCS-TREE** (where `docs/` files may live). | +| 4 | [`TASK.md`](TASK.md) + [`docs/coordination/TASK_PROTOCOL.md`](docs/coordination/TASK_PROTOCOL.md) | Multi-agent coordination, locks, anchor issue. | +| 5 | [`OWNERS.md`](OWNERS.md) | Domain ownership; each major directory may have its own `OWNERS.md`. | + +Supporting: [`CONTRIBUTING.md`](CONTRIBUTING.md), [`SECURITY.md`](SECURITY.md), [`architecture/ADR-004-language-policy.md`](architecture/ADR-004-language-policy.md). + +--- + +## 2. Agent model (27-letter alphabet) + +- **Documentation map:** [`docs/README.md`](docs/README.md) — where first-party docs live (`agents/`, `coordination/`, `nona-01..03/`, `clara/`). +- **Full alphabet and roles:** [`docs/agents/AGENTS_ALPHABET.md`](docs/agents/AGENTS_ALPHABET.md) — canon for T, N, P, C, B, etc. +- **Operational agent specs (e.g. watchdogs, schemas):** [`docs/agents/AGENTS.md`](docs/agents/AGENTS.md) — complements the alphabet; not a second constitution. + +Use **domain directories**, not “one folder per agent.” Primary contact for a path is the **Primary** listed in the nearest `OWNERS.md`. + +--- + +## 3. Non-negotiables for changes + +1. **Specs are source of truth** — behavior belongs in `.t27` / `.tri`; generated `gen/` output is not hand-edited (except documented exceptions). +2. **TDD inside specs** — new or changed specs need `test`, `invariant`, and/or `bench` where SOUL requires it. +3. **English + ASCII** — first-party Markdown and source comments per **LANG-EN** and **ADR-004**; grandfathered paths only in [`docs/.legacy-non-english-docs`](docs/.legacy-non-english-docs). +4. **No new Python on the verification critical path** — see **SSOT-MATH** and [`docs/nona-02-organism/TZ-T27-001-NO-PYTHON-CRITICAL-PATH.md`](docs/nona-02-organism/TZ-T27-001-NO-PYTHON-CRITICAL-PATH.md). +5. **Issue gate** — PRs should link issues (`Closes #N`) where project policy requires it. +6. **Ring / gold work** — follow [`docs/nona-01-foundation/GOLDEN-RINGS-CANON.md`](docs/nona-01-foundation/GOLDEN-RINGS-CANON.md) for parser/compiler/spec changes; compiler seal path: `bootstrap/stage0/FROZEN_HASH`. + +--- + +## 4. Layout reminders (after repo hygiene refactors) + +- **Core:** `specs/`, `compiler/`, `bootstrap/`, `gen/`, `conformance/`, `tests/`. +- **Non-core services & tooling:** `contrib/backend/`, `contrib/portable-claude-setup/`. +- **Vendored / datasets / upstream:** `external/` (e.g. OpenCode submodule, `external/kaggle/`). + +--- + +## 5. Law Reference + +The seven **Invariant Laws (L1–L8)** are defined in [`docs/T27-CONSTITUTION.md`](docs/T27-CONSTITUTION.md#2--invariant-laws-never-change-without-constitutional-amendment): + +| Law | Name | Legacy alias | Summary | +|-----|------|-------------|---------| +| **L1** | TRACEABILITY | ISSUE-GATE | No code merged without `Closes #N` | +| **L2** | GENERATION | NO-HAND-EDIT-GEN | Files under `gen/` are generated; edit specs instead | +| **L3** | PURITY | SOUL-ASCII | Source files must be ASCII-only with English identifiers | +| **L4** | TESTABILITY | TDD-MANDATE | Every `.t27` spec must contain `test`/`invariant`/`bench` | +| **L5** | IDENTITY | PHI-IDENTITY | φ² = φ + 1; φ² + φ⁻² = 3; IEEE f64 checks use tolerance | +| **L6** | CEILING | TRINITY-SACRED | `FORMAT-SPEC-001.json` + `gf16.t27` are numeric SSOT | +| **L7** | UNITY | NO-NEW-SHELL | No new `*.sh` on critical path; use `tri`/`t27c` | + +**Law Priority:** L1 > L2 > L3 > L4 > L5 > L6 > L7 > L8 (Asimov-style hierarchy) + +--- + +## 6. Cursor / automation + +- Rule file: [`.cursor/rules/t27-ssot-math.mdc`](.cursor/rules/t27-ssot-math.mdc) — keep in sync with **SSOT-MATH** and this entry point. + +--- + +**φ² + 1/φ² = 3 | TRINITY** + +--- + +## 5. Law Reference + +The seven **Invariant Laws (L1–L8)** are defined in [`docs/T27-CONSTITUTION.md`](docs/T27-CONSTITUTION.md#2--invariant-laws-never-change-without-constitutional-amendment): + +| Law | Name | Legacy alias | Summary | +|-----|------|-------------|---------| +| **L1** | TRACEABILITY | ISSUE-GATE | No code merged without `Closes #N` | +| **L2** | GENERATION | NO-HAND-EDIT-GEN | Files under `gen/` are generated; edit specs instead | +| **L3** | PURITY | SOUL-ASCII | Source files must be ASCII-only with English identifiers | +| **L4** | TESTABILITY | TDD-MANDATE | Every `.t27` spec must contain `test`/`invariant`/`bench` | +| **L5** | IDENTITY | PHI-IDENTITY | φ² = φ + 1; φ² + φ⁻² = 3; IEEE f64 checks use tolerance | +| **L6** | CEILING | TRINITY-SACRED | `FORMAT-SPEC-001.json` + `gf16.t27` are numeric SSOT | +| **L7** | UNITY | NO-NEW-SHELL | No new `*.sh` on critical path; use `tri`/`t27c` | + +**Law Priority:** L1 > L2 > L3 > L4 > L5 > L6 > L7 > L8 (Asimov-style hierarchy) + diff --git a/apps/website/public/t27/files/CLAUDE.md b/apps/website/public/t27/files/CLAUDE.md new file mode 100644 index 0000000000..0993cd2e1b --- /dev/null +++ b/apps/website/public/t27/files/CLAUDE.md @@ -0,0 +1,175 @@ +# CLAUDE.md — Instructions for Claude Code and autonomous agents (t27) + +Use this file **together with** `[AGENTS.md](AGENTS.md)`. Repo-specific law always overrides generic tooling defaults. + +--- + +## Autonomous Execution Loop (AEL v2.0) + +When operating as the Trinity Agent (Queen), follow this 6-phase loop: + +``` +┌─────────────────────────────────────────────────────────────┐ +│ OBSERVE → PLAN → DELEGATE → VERIFY → SYNTHESIZE → LEARN │ +│ ↓ ↓ ↓ ↓ ↓ ↓ │ +│ [E] [T] [C/V] [V] [L] [L] │ +└─────────────────────────────────────────────────────────────┘ +``` + +### Phase 1: OBSERVE +- Call Experience Agent (E) for context +- Read `.trinity/current-issue.md` for issue details +- Check ring and phase state from branch name +- Gather relevant files and context + +### Phase 2: PLAN +- Break down task into subtasks +- Identify required skills: `/phi-loop`, `/tri-pipeline`, `/experience-save` +- Determine which agents to delegate to +- Estimate complexity and dependencies + +### Phase 3: DELEGATE +- Delegate implementation to Creator Agent (C) +- Delegate validation to Verifier Agent (V) +- Coordinate parallel execution where possible +- Monitor agent progress + +### Phase 4: VERIFY +- Review agent outputs +- Run conformance tests via `/tri-pipeline` +- Check L1-L7 law compliance +- Ensure quality standards + +### Phase 5: SYNTHESIZE +- Combine agent results +- Resolve conflicts +- Create cohesive solution +- Prepare for integration + +### Phase 6: LEARN +- Call Learner Agent (L) for pattern extraction +- Update `.trinity/experience.md` via `/experience-save` +- Save ring-specific learnings +- Improve future execution + +--- + +## 1. Mandatory read order for this repository + +1. `[AGENTS.md](AGENTS.md)` — entry point and constitutional stack. +2. `[SOUL.md](SOUL.md)` — canonical law (TDD, language, validation). +3. `[docs/T27-CONSTITUTION.md](docs/T27-CONSTITUTION.md)` — **SSOT-MATH**, **LANG-EN**, **DOCS-TREE**. +4. `[TASK.md](TASK.md)` and `[docs/coordination/TASK_PROTOCOL.md](docs/coordination/TASK_PROTOCOL.md)` — if the task touches coordination, locks, or shared hot paths. +5. Nearest `[OWNERS.md](OWNERS.md)` for the directories you edit. + +Do **not** add parallel math/physics implementations in ad-hoc scripts when the same belongs in `*.t27` and the **`tri`** pipeline (`./scripts/tri`). + +--- + +## 2. Engineering workflow + +- **Bootstrap compiler:** from repo root, `cargo build --release -p t27c` (runs `build.rs` language checks). `bootstrap/` is a **workspace member**, so the binary lands at the workspace root: `./target/release/t27c` — *not* `./bootstrap/target/release/t27c`. +- **Local sweep (CI-like):** from repo root, `./scripts/tri test` or `./target/release/t27c suite --repo-root .` (Rust runner; no shell test harness under `tests/`). +- **Generated code:** under `gen/` — do not hand-edit for routine fixes; change specs and regenerate. +- **Pull requests:** follow project Issue Gate and linking policy; **do not approve** PRs unless explicitly authorized. + +--- + +## 3. PHI LOOP Execution + +Follow the 9-phase PHI LOOP for ring-based development: + +1. **Issue** - Define problem or requirement +2. **Spec** - Write .t27 specification +3. **TDD** - Write tests in spec before implementation +4. **Code/Impl** - Implement according to spec +5. **Gen** - Run `tri gen` to generate code from spec +6. **Seal** - Verify generated code and seal hash +7. **Verify** - Run `tri test` or conformance checks +8. **Land** - Merge changes to main branch +9. **Learn** - Capture learnings and update knowledge base + +### Phase Completion Marker + +When a phase is complete, include in your output: +``` +Phase complete: [phase name] +→ Phase [next phase number]: [next phase name] +``` + +This triggers automatic branch creation for the next phase. + +--- + +## 4. Autonomous subagent behavior (when spawned unattended) + +- Finish the assigned task without waiting for clarification unless the repo's own rules require human input. +- If blocked after reasonable retries, stop and report what failed (logs, commands, file paths). +- Prefer small, reviewable diffs; match existing style and naming in touched files. +- **Output persistence:** when the parent workflow requires it, write the full final report to `/tmp/claude_code_output.md` (analysis, commands, diffs summary). + +--- + +## 5. Skills and tooling + +### Available Skills + +- `/phi-loop` - Execute 9-phase PHI LOOP +- `/tri-pipeline` - Execute tri commands (gen, test, verify, seal) +- `/experience-save` - Save learnings to persistent memory + +Load these skills when their functionality matches the task. + +--- + +## FPGA hardware & flashing (SSOT) + +**`[fpga/HARDWARE_SSOT.md](fpga/HARDWARE_SSOT.md)` is the single source of truth** +for the FPGA board, JTAG cable, host toolchain, and program/flash path. Read it +before touching anything under `fpga/`. Non-negotiables: + +- Target board is **QMTech Wukong V1 / XC7A200T-FGG676** (`xc7a200tfgg676-1`), + IDCODE `0x03636093`. Not the Arty A7 (`csg324`), and **not the 100T** — this + file said `XC7A100T` / `0x13631093` until 2026-08-14, contradicting the SSOT + it points to. Measured on all three attached boards: `idcode 0x3636093`, + `family artix a7 200t`. For place-and-route use the `fbg676` chipdb + (`xc7a200tfbg676-1`) — same die and pinout, per HARDWARE_SSOT.md §2026-07-05. +- **Flash with `openFPGALoader -c digilent_hs2`.** The attached cables are + **Digilent FTDI `0x0403:0x6014`**, not the Xilinx `0x03FD` Platform Cable, and + `cli/dlc10` speaks only to `0x03FD` — it answers `DLC10 cable not found` on this + bench. Address the three boards with `--busdev-num 1:4 / 1:6 / 1:8`; they share + serial `210512180081`, so serial-based addressing cannot separate them. + See `fpga/HARDWARE_SSOT.md` §"Note" and §"Programming". + *Corrected W791 (T460/T461): the previous text here forbade `openFPGALoader` on + the grounds that it cannot drive a `0x03FD` cable — true, and irrelevant, since + no `0x03FD` cable is attached. That sentence contradicted the SSOT this file + names as authoritative, and it was reported as a hardware blocker for thirteen + waves. `cli/dlc10` remains correct for a DLC10 bench and is not removed.* +- No native macOS Vivado exists. Synthesis is Vivado-in-Docker or OpenXC7 only. +- If any other FPGA doc contradicts the SSOT, the SSOT wins — fix the other doc. + +--- + +## 6. Security and secrets + +- Never commit secrets. See `[SECURITY.md](SECURITY.md)`. Root `.env` patterns are gitignored; use `.env.example` patterns only in docs. + +--- + +## The 7 Invariant Laws + +| Law | Name | Description | +|------|------|-------------| +| L1 | TRACEABILITY | No code merged without `Closes #N` | +| L2 | GENERATION | Files under `gen/` are generated; edit specs instead | +| L3 | PURITY | Source files must be ASCII-only with English identifiers | +| L4 | TESTABILITY | Every `.t27` spec must contain `test`/`invariant`/`bench` | +| L5 | IDENTITY | φ² = φ + 1; φ² + φ⁻² = 3; IEEE f64 checks use tolerance | +| L6 | CEILING | `FORMAT-SPEC-001.json` + `gf16.t27` are numeric SSOT | +| L7 | UNITY | No new `*.sh` on critical path; use `tri`/`t27c` | + +See [`docs/T27-CONSTITUTION.md`](docs/T27-CONSTITUTION.md#2--invariant-laws-never-change-without-constitutional-amendment) for full details. + +--- + +**Repository:** Trinity S³AI — **t27** (spec-first ternary / TRI-27). **φ² + 1/φ² = 3 | TRINITY** diff --git a/apps/website/public/t27/files/README-ZENODO.md b/apps/website/public/t27/files/README-ZENODO.md new file mode 100644 index 0000000000..91399faa2d --- /dev/null +++ b/apps/website/public/t27/files/README-ZENODO.md @@ -0,0 +1,81 @@ +# T27 Zenodo Publication + +This repository is published to Zenodo with DOI: `https://doi.org/10.5281/zenodo.19456875` + +## Authors + +Vasilev, Dmitrii — Trinity Computing + +## Repository Structure + +**Main framework:** `https://github.com/gHashTag/trinity` — Trinity S³AI Framework +**Spec language (this repo):** `https://github.com/gHashTag/t27` — T27 specification language + +This Zenodo entry publishes the **T27 specification language** which is used within the Trinity framework. + +## Citation + +```bibtex +@software{t27_v0_1_0, + title = {T27: TRI-27 — Spec-First Language for Ternary Computing}, + author = {Vasilev, Dmitrii}, + year = {2026}, + month = {4}, + version = {0.1.0}, + doi = {10.5281/zenodo.19456875}, + publisher = {Zenodo}, + keywords = {ternary computing, specification language, Zig, Coq, formal verification, t27, tri CLI} +} +``` + +## Abstract + +T27 is a spec-first language for ternary computing built on Zig with formal verification support via Coq. Provides comprehensive tooling for software development, specification, and testing. + +## Description + +T27 implements the TRI-27 spec-first language with: + +- **Specification Language (`.t27`)**: Declarative, testable specifications for all software components +- **Formal Verification (Coq)**: Machine-checked proofs for mathematical theorems +- **Build System (`tri` CLI)**: Compiler and toolchain for generating verified software +- **Testing Framework**: Comprehensive test runner with TDD-Inside-Spec methodology +- **Documentation Generation**: Automatic documentation from `.t27` specifications + +## Key Features + +- **Spec-first development**: Write `.t27` specifications, generate code +- **TDD-Inside-Spec**: Every spec includes `test`/`invariant`/`bench` sections +- **Formal verification**: Coq proofs for core mathematical properties +- **Zero-parameter mechanism**: Theorem 3 proves φ emerges as universal fixed-point attractor from balancing recursion + +## References + +Whitepaper: "GoldenFloat: φ-Optimal Floating-Point Formats" (in-progress) + +**Trinity framework:** https://github.com/gHashTag/trinity — Main repository +**T27 spec language:** https://github.com/gHashTag/t27 — This repository + +## Zenodo Rules + +- **Open Access**: Published under CC-BY 4.0 or MIT license +- **Versioned**: Semantic versioning (v0.1.0) for tracking changes +- **Preserved**: Zenodo creates permanent DOI for all versions +- **DOI**: Each version gets unique DOI in 10.5281/zenodo.* namespace + +## Publication Checklist + +- [x] .zenodo.json configured with complete metadata +- [x] CITATION.cff created with author information +- [x] GitHub workflow for automated Zenodo publishing +- [x] Version 0.1.0 created +- [ ] GitHub release v0.1.0 created +- [ ] DOI generated and verified + +## How to Cite + +Use the Bibtex entry above or visit: https://doi.org/10.5281/zenodo.19456875 + +--- + +**Note:** This is the t27 companion repository. The main trinity framework repository is published separately under the trinity community. diff --git a/apps/website/public/t27/files/SOUL.md b/apps/website/public/t27/files/SOUL.md new file mode 100644 index 0000000000..7a8bf4a45a --- /dev/null +++ b/apps/website/public/t27/files/SOUL.md @@ -0,0 +1,263 @@ +# SOUL — T27 Constitutional Law + +**Canonical location:** this file at the **repository root** is the **single source of truth** for Trinity constitutional law. **[`docs/nona-03-manifest/SOUL.md`](docs/nona-03-manifest/SOUL.md)** is an **expanded reference** (detail, examples); if anything disagrees, **this file wins**. + +** Immutable Document — Amendments Require Unanimous Architectural Consent ** + +> *"A specification without tests is a lie told in the future tense."* +> — Trinity TDD Axiom #1 + +--- + +## Preamble + +T27 is a **spec-first** architecture where mathematical truth, not implementation, is the source of truth. This document establishes the constitutional principles that govern all T27 specifications, compilation, and verification. + +--- + +## Article I: The Language Policy + +### §1.1. ASCII-Only Source Files +**Source files MUST be ASCII-only.** Identifiers and comments MUST be English. + +All files in the following categories MUST contain only ASCII characters (U+0000–U+007F): +- `.t27` — TRI-27 assembly specifications +- `.tri` — TRI high-level specifications +- `.zig` — Zig source code +- `.c` / `.h` — C source/header files +- `.v` / `.verilog` — Verilog hardware descriptions +- Build scripts, makefiles, etc. + +**FORBIDDEN in source files:** +- **Cyrillic** (U+0400–U+04FF) and other non-Latin scripts in identifiers and comments +- **Non-Latin scripts**: Greek, Arabic, Chinese, Japanese, Korean, etc., unless an Architect-approved exception exists + +### §1.2. First-party documentation language +Markdown under `docs/`, `specs/`, `architecture/`, `clara-bridge/`, `conformance/`, and root project Markdown (`README.md`, `AGENTS.md`, `CLAUDE.md`, `TASK.md`) **MUST be English**, except paths listed in **`docs/.legacy-non-english-docs`** (grandfathered) and anything under **`external/`**. + +### §1.3. Enforcement +The parser rejects Cyrillic in source with: +``` +error: Language policy violation: source file contains Cyrillic characters (U+0400-U+04FF). Source files must be ASCII-only. See SOUL.md Article I. +``` + +CI runs `scripts/check-first-party-doc-language.sh` on pull requests. + +**Compiler build:** `cargo build` in `bootstrap/` runs `build.rs`, which fails the build if Cyrillic appears in specs, bootstrap Rust sources, or unlisted first-party Markdown (this Article; expanded enforcement notes in `docs/nona-03-manifest/SOUL.md` Law #1). + +### §1.4. Rationale +1. **Universality**: ASCII is universally supported across all platforms and tools +2. **Clarity**: English is the single review language for Trinity first-party docs and specs +3. **Separation of Concerns**: Vendored locales live under `external/`; core repo stays English +4. **Git Compatibility**: No encoding issues in diffs, patches, or blame output + +--- + +## Article II: The TDD Mandate + +### §2.1. The Iron Law +Every `.t27` specification MUST contain at least one of: +- A `.test` section with one or more test cases +- An `.invariant` section with one or more invariant declarations +- A `.bench` section with one or more benchmark declarations + +**No exceptions.** A spec without tests is not a specification—it is a draft. + +### §2.2. Test Format (Assembly-Style) +```t27 +.test + ; test_bind_unbind_identity + ; Verify: bind and unbind are inverses for all trits + ; Setup: create vector a, bind with b, unbind with b + ; Expected: result == a + + ; test_bundle_idempotence + ; Verify: bundling a vector with itself produces same vector + ; Setup: create vector v, bundle v with v + ; Expected: result == v + +.invariant + ; no_trit_overflow + ; All trit operations stay within {-1, 0, +1} + ; Rationale: Balanced ternary requires strict bounds + + ; similarity_non_negative + ; For all vectors a, b: similarity(a, b) >= 0 + ; Rationale: Similarity is a distance metric variant + +.bench + ; bench_bind_latency_cycles + ; Measure: cycles for single bind operation + ; Target: < 50 cycles on typical hardware +``` + +### §2.3. Test Format (Spec-Style) +```t27 +spec vsa_ops { + test bind_unbind_identity { + given a = vector_random(27) + given b = vector_random(27) + when bound = bind(a, b) + when result = unbind(bound, b) + then result == a + } + + invariant no_trit_overflow { + assert forall v: vector, all_trits_in_range(v, -1, 1) + } + + rule similarity_bounds { + expect forall a, b: 0 <= similarity(a, b) <= 1 + } +} +``` + +> **Implementation status (verified 2026-08-09, Wave Loop 557).** The example +> above — `test name { given ... when ... then ... }` — **does not parse**. +> `t27c parse` rejects it with *"unexpected token after expression statement"* +> at the first `given`. The brace body is parsed as a function body, and +> `given`/`when`/`then` are not statements there. +> +> The *braceless* variant shown in +> [`docs/nona-03-manifest/TDD-CONTRACT.md`](TDD-CONTRACT.md) does parse, but its +> body is discarded: `parse_test_block` calls `skip_to_next_top_level()` for the +> keyword form, so codegen emits an empty test. A spec asserting `2 == 999` +> compiles to `test "..." {}` and passes. Repo-wide this affects **7,623 test +> blocks** and, via the same path in `parse_invariant_block`, **5,163 +> invariants** (which emit `// invariant: X verified (no statements)`). +> +> Neither form currently executes. See +> [`docs/reports/WAVE_LOOP_555_REPORT.md`](../reports/WAVE_LOOP_555_REPORT.md). +> Until this is resolved, use brace-form tests with ordinary `assert` +> statements — the form the backends do emit. + + +--- + +## Article III: No Prototype Mode + +### §3.1. The Ban on Temporary Code +T27 **does not have** a prototype mode. There is no `--allow-no-tests` flag. There is no "I'll add tests later" grace period. + +If you write a spec without tests, the parser **will reject it** with: + +``` +TDD contract violated: spec must contain at least one 'test' or 'invariant' block +``` + +### §3.2. The Rationale +Tests written after implementation are not tests—they are retroactive justification. True TDD requires the test to exist **before** the implementation, serving as: +1. A contract between specifier and implementer +2. Executable documentation +3. A guard against regression +4. A design tool (the test tells you what the API should be) + +--- + +## Article IV: Validation Requirements + +### §4.1. Parser-Level Enforcement +The **parser** (`compiler/parser/parser.t27`) MUST call `validate_spec()` after parsing. This function: +1. Checks for presence of test_section, invariant_section, or bench_section +2. Checks spec_decl.test_blocks or spec_decl.invariants for spec-style +3. Emits a hard error ("TDD contract violated") if none exist + +### §4.2. Codegen-Level Emission +All code generators MUST emit test code: +- **Zig**: `test "test_name" {}` and `test "invariant_name" {}` +- **C**: `void test_name(void)` and `void invariant_name(void)` +- **Verilog**: `task test_name();` and `assert (property)` + +### §4.3. Build-Time Execution +Generated tests MUST be executed at build time: +- Zig: `zig test` runs automatically in build.tri +- C: tests compiled into test binary and run +- Verilog: assertions verified in simulation + +--- + +## Article V: Amendment Process + +### §5.1. What Can Be Amended +This constitution may be amended by: +1. Opening an ADR (Architectural Decision Record) +2. Documenting the proposed change with full rationale +3. Obtaining **unanimous consent** from all architectural stewards + +### §5.2. What Cannot Be Amended +The following are **immutable** and may never be changed: +- The Language Policy (Article I) +- The TDD Mandate (Article II) +- The Ban on Prototype Mode (Article III) +- The Validation Requirements (Article IV) + +--- + +## Article VI: Enforcement + +### §6.1. Agent Compliance +All AI agents working on T27 MUST: +1. Check for test/invariant/bench sections before creating new specs +2. Reject specs without tests with a hard error +3. Add test blocks when retrofiting existing code +4. Never bypass or disable validation + +### §6.2. Human Compliance +Human contributors MUST: +1. Review test coverage in every PR +2. Request tests for any spec lacking them +3. Treat test failures as blocking issues + +### §6.3. Automated Enforcement +The CI/CD pipeline MUST: +1. Run all generated tests on every commit +2. Block PRs where any test fails +3. Block PRs where any spec lacks tests + +--- + +## Article VII: Sacred Trinity + +T27 rests on three pillars. Violating any violates the whole: + +1. **φ² + 1/φ² = 3** — The mathematical foundation +2. **Ternary Computation** — The computational substrate +3. **TDD-Inside-Spec** — The verification mechanism + +Additionally, the **Language Policy** (Article I) ensures universality and clarity. + +--- + +## Article VIII: NO-NEW-SHELL (Toolchain Hygiene) + +### §8.1. Statement +**No new Bourne-shell (`*.sh`) scripts** for validation, code generation, conformance, or data processing on the engineering critical path. Shell lacks static types, robust error semantics, and unit-test culture; it conflicts with **compiler-as-SSOT** and tool-qualification discipline (deterministic, reviewable tooling). + +### §8.2. Permitted exceptions +1. **`scripts/tri`** — an **exec-only shim** (on the order of ≤20 lines): resolve `t27c`, pass **`--repo-root`**, then **`exec`**. No routing, no `case` ladders — batch directory generation is **`t27c gen-dir`** (Rust). Optional **`TRI_T27C`** override for CI or custom paths. +2. **`scripts/setup-git-hooks.sh`** — **one-time** local bootstrap (`core.hooksPath`), kept small (on the order of tens of lines). + +### §8.3. NO-PYTHON / NO-SHELL (critical path) +- **All** validation, conformance gates, doc language checks, and φ binary64 cross-checks live in **`t27c`** (Rust) — **`lint-docs`**, **`validate-phi`**, **`suite`**, **`validate-conformance`**, etc. +- **Python** is **not** permitted on the engineering critical path; legacy scripts are removed once a **`t27c`** subcommand exists. +- **CI** invokes **`./scripts/tri `** or **`target/release/t27c --repo-root . `** — not ad-hoc **`.sh`** wrappers. + +### §8.4. Rationale +Aligns the repository with **TDD-MANDATE** and **SSOT-MATH**: behavior lives in specs + compiler, not in untested bash. Reduces macOS/Linux drift (`realpath`, `find`, `readlink`) and quoting/glob hazards. A single **TCB** for tooling (**`rustc` + `t27c`**) supports tool-qualification discipline (e.g. DO-330-style narratives). + +--- + +## Appendix: Quick Reference + +| Command | Action | +|---------|--------| +| `tri validate ` | Check spec has tests (enforced by parser) | +| `tri gen ` | Generate code with tests embedded | +| `tri test ` | Run generated tests | +| `tri soul` | Display this document | + +--- + +**Enacted**: 2026-04-04 +**Version**: 1.2 (Article VIII NO-PYTHON / NO-SHELL — 2026-04-06) +**Status**: Immutable core (Articles I–IV per Article V); Article VIII may be refined by ADR + steward consent diff --git a/apps/website/public/t27/files/docs/T27-CONSTITUTION.md b/apps/website/public/t27/files/docs/T27-CONSTITUTION.md new file mode 100644 index 0000000000..73da99120b --- /dev/null +++ b/apps/website/public/t27/files/docs/T27-CONSTITUTION.md @@ -0,0 +1,135 @@ +# Trinity S³AI / t27 — Repository constitution + +**Status:** Active +**Version:** 1.2 +**Date:** 2026-04-06 + +--- + + + +## Preamble + +The Trinity S³AI repository is built around the **t27** specification language and the **`tri`** toolchain (`./scripts/tri` forwards to the Rust `t27c` bootstrap binary). Mathematics, numerics, and physics formulas that participate in verification must not be split between “the spec” and “side scripts.” First-party documentation under **`docs/`** follows a **single, published tree** so contributors and agents do not accumulate ad-hoc files at the wrong depth. The following articles establish these norms. + +--- + +## Article SSOT-MATH — single source of truth for mathematics and physics + +**Article SSOT-MATH.** The mathematical, numeric, and physical meaning of Trinity S³AI / t27 has **one normative source of truth**: specifications in the **t27** language (`*.t27` files), exercised through the official **`tri`** pipeline and tied to **`.trinity/experience/`** artifacts where run experience is recorded. + +It is **forbidden** to introduce new **Python** dependencies (or equivalent script bypasses) on the **critical path** of verification, conformance, or “verdict,” except for **explicitly marked legacy** code with a removal date and a tracked migration into `.t27`. + +Target backends (**Zig, C, Verilog**) are **compiler output**, not hand-written application languages; hand-written Zig outside the generated pipeline is allowed only in **bootstrap** (compiler implementation) and related build infrastructure. + +The numeric formalism relies on repository standards (**NUMERIC-STANDARD-001**, GoldenFloat, Strand I in `specs/math/sacred_physics.t27` and related specs). Extensions for precision or new numeric primitives are delivered through the **t27 language and compiler**, not external interpreters. + +--- + +## Article LANG-EN — English for first-party code and documentation + +**Article LANG-EN.** All **first-party** Markdown under `docs/`, `specs/`, `architecture/`, `clara-bridge/`, `conformance/`, and root project Markdown (`README.md`, `AGENTS.md`, `CLAUDE.md`, `TASK.md`, `SOUL.md`) **MUST** be written in **English**. Source files (`.t27`, `.zig`, etc.) **MUST** use **English** for comments and identifiers, and remain **ASCII-only** per **ADR-004** and root **`SOUL.md`** Article I (expanded detail in **`docs/nona-03-manifest/SOUL.md`** Law #1). + +Grandfathered non-English paths are listed only in **`docs/.legacy-non-english-docs`** until translated; **do not expand** that list without Architect approval. Vendored content under **`external/`** is exempt. + +**Enforcement:** (1) **`cargo build` / `cargo build --release` in `bootstrap/`** — `build.rs` fails the build with a cited error; (2) **`scripts/check-first-party-doc-language.sh`** in CI (Python checker). + +--- + +## Article DOCS-TREE — single layout for `docs/` + +**Article DOCS-TREE.** First-party Markdown under **`docs/`** **MUST** follow the **three-nona / 27-agent** layout indexed in **`docs/README.md`**. That README is the **authoritative map** of the tree; any **structural** change (new top-level subdirectory under **`docs/`**, or redefinition of what belongs in each nona) **MUST** land together with an update to **`docs/README.md`** and, if policy changes, a bump of this charter. + +**1. Root of `docs/` (anchors only).** Aside from **`docs/.legacy-non-english-docs`**, only these files **MAY** reside **directly** in **`docs/`**: **`NOW.md`**, **`T27-CONSTITUTION.md`**, **`OWNERS.md`**, and **`README.md`** (the index). **No** other new **`*.md`** **SHALL** be added at **`docs/*.md`** except by amending this article. + +**2. Required buckets.** Every other new first-party **`*.md`** under **`docs/`** **MUST** live under exactly one of: + +| Path | Role | +|------|------| +| **`docs/agents/`** | 27-agent alphabet canon and expanded agent behavior text. | +| **`docs/coordination/`** | TASK protocol, inter-agent handoff, portable bundles. | +| **`docs/nona-01-foundation/`** | Foundation themes (alphabet nona **A–I**): rings, brain charter, language purge, sandbox, architecture-adjacent charter. | +| **`docs/nona-02-organism/`** | Organism themes (nona **J–R**): language spec, numerics, physics, critical-path TZs; **thematic subfolders** (e.g. **`physics-kepler/`**) **SHOULD** be used when **three or more** closely related documents would otherwise clutter one directory. | +| **`docs/nona-03-manifest/`** | Manifest themes (nona **S–Ϯ**): TDD, CI/testing policy, PHI loop, strategy, claims, expanded **`SOUL`** reference (root **`SOUL.md`** remains canonical). | +| **`docs/clara/`** | CLARA / submission / evidence / composition pack. | + +**3. Forbidden patterns.** **Do not** create **`docs/misc/`**, **`docs/tmp/`**, **`docs/old/`**, or other informal dumping grounds without **Architect** approval, an update to **`docs/README.md`**, and an amendment here. **Do not** duplicate normative **`*.t27`** behavior as shadow specs in **`docs/`**; **`specs/`** is the product SSOT for executable spec text (**Article SSOT-MATH**). + +**4. Placement rule.** If placement is unclear, use **`docs/agents/AGENTS_ALPHABET.md`** domain column; prefer **`docs/nona-03-manifest/`** for cross-cutting governance and **`docs/coordination/`** for task routing and human handoff. + +**5. Other top-level trees.** **`specs/`**, **`architecture/`**, **`conformance/`**, **`clara-bridge/`**, **`bootstrap/`** keep their own **`OWNERS.md`** and purpose; this article governs **`docs/`** only. + +**Enforcement:** **Code review** and **Issue Gate**; optional CI path checks may be added later. **OWNERS** for **`docs/`** is **`docs/OWNERS.md`**. + + +## § 2 — Invariant Laws (never change without constitutional amendment) + +These seven laws are the **constitutional bedrock** of Trinity S³AI / t27. They govern behavior, not formats or scientific claims. Amendments require explicit consensus and version bump. + +### Law Table (L1–L7) + +| Law # | Name | Body | Enforcement | +|-------|------|------|-------------| +| **L1** | **TRACEABILITY** | No code merged without `Closes #N` — every PR must reference a GitHub issue | `.github/workflows/issue-gate.yml` | +| **L2** | **GENERATION** | Files under `gen/` are generated; edit the `.t27` spec instead | `./target/release/t27c validate-gen-headers` | +| **L3** | **PURITY** | All `.t27` / `.zig` / `.v` / `.c` source — ASCII-only identifiers & comments | `SOUL.md`, `ADR-004`, build.rs language checks | +| **L4** | **TESTABILITY** | Every `.t27` spec must contain `test` / `invariant` / `bench` | Ring 037 / #132, parser enforcement | +| **L5** | **IDENTITY** | **K2 core:** φ² = φ + 1 on ℝ; consequence φ² + φ⁻² = 3; IEEE f64 checks use tolerance | `NUMERIC-CORE-PALETTE-REGISTRY.md`, `specs/math/constants.t27` | +| **L6** | **CEILING** | `conformance/FORMAT-SPEC-001.json` + `specs/numeric/gf16.t27` are the numeric ceiling — never forked | SSOT: seal coverage CI | +| **L7** | **UNITY** | No new `*.sh` on the critical path for validation / gen / data | `SOUL.md` Article VIII; `t27c` + `tri` only | + +### Alias Index (legacy → L1–L7) + +| Legacy name | New name | +|-------------|----------| +| ISSUE-GATE | L1 TRACEABILITY | +| NO-HAND-EDIT-GEN | L2 GENERATION | +| SOUL-ASCII | L3 PURITY | +| TDD-MANDATE | L4 TESTABILITY | +| PHI-IDENTITY | L5 IDENTITY | +| TRINITY-SACRED | L6 CEILING | +| NO-NEW-SHELL | L7 UNITY | + +### Law Priority + +Laws follow **Asimov-style priority** (L1 > L2 > … > L7): + +1. **L1 TRACEABILITY** (highest) — Without issue linkage, nothing enters the repository +2. **L2 GENERATION** — Generated files are output, not source +3. **L3 PURITY** — Language policy enables universal tooling +4. **L4 TESTABILITY** — TDD ensures specifications are verifiable +5. **L5 IDENTITY** — Mathematical truth (φ) has specific tolerance requirements +6. **L6 CEILING** — Numeric formats are SSOT; never forked +7. **L7 UNITY** — Toolchain consolidation via `tri` / `t27c` + +In conflict scenarios, the higher-priority law prevails. +--- + +## Related documents + +| Document | Purpose | +|----------|---------| +| `docs/README.md` | Index of first-party docs (27-agent / three-nona layout); **normative map for Article DOCS-TREE** | +| `docs/OWNERS.md` | Primary owner and bucket table for `docs/` | +| `docs/nona-02-organism/TZ-T27-001-NO-PYTHON-CRITICAL-PATH.md` | Technical specification for critical-path migration | +| `docs/nona-03-manifest/TDD-CONTRACT.md` | TDD and conformance from specs | +| `docs/nona-03-manifest/SOUL.md` | Expanded reference for root **`SOUL.md`** (esp. Law #1 language); **root `SOUL.md` is canonical** | +| `architecture/ADR-004-language-policy.md` | ASCII source + English first-party docs | +| `docs/nona-02-organism/NUMERIC-STANDARD-001.md` | GoldenFloat family, φ structure | +| `docs/nona-02-organism/NUMERIC-GF16-DEBT-INVENTORY.md` | File-by-file non-GF16 / f32/f64 debt | +| `docs/nona-01-foundation/QUEEN-LOTUS-SEED-LANGUAGE-PURGE.md` | Non-t27 language inventory + Lotus cleanup procedure | +| `docs/nona-01-foundation/GOLDEN-RINGS-CANON.md` | Ring + FROZEN_HASH micro-iterations; GOLD vs REFACTOR-HEAP | +| `docs/nona-01-foundation/TRINITY-BRAIN-NEUROANATOMY-TZ.md` | Unified brain charter; **t27** = `specs/brain/` SSOT, `trinity` = runtime integration | +| `docs/nona-03-manifest/MULTI-MODEL-TRUST-CHAIN-ANALYSIS.md` | Trust chain, executable rings, issue enforcement, test pyramid (synthesis note) | +| `docs/nona-03-manifest/T27-BOOTSTRAP-TESTING-PLAN.md` | Rust seed → `.t27` fixtures → self-eval → self-host; proposed ring/issue spine | +| `docs/nona-03-manifest/GOLDEN-CHAIN-TESTING-ATLAS.md` | Oracles, metamorphic/differential strategy, framework ladder; complements bootstrap plan | +| `docs/nona-03-manifest/T27-MATH-PHYSICS-TEST-FRAMEWORK-SPEC.md` | Math/physics test framework charter (ring-aware oracles, `claim_tier`, sprint A–E) | +| `docs/nona-03-manifest/T27-UNIFIED-AXIOM-THEOREM-FORMAT-SYSTEM.md` | Unified axioms/theorems + `FORMAT-SPEC-001` + `axiom_system.json` charter | +| `docs/nona-03-manifest/CLAIM_TIERS.md` | `claim_tier` policy for math/physics specs | +| `.cursor/rules/t27-ssot-math.mdc` | Cursor rule for AI agents | + +--- + +## Amendments + +Amendments to this constitution are made via pull request with an explicit charter version bump and rationale. diff --git a/apps/website/public/t27/files/docs/agents/AGENTS_ALPHABET.md b/apps/website/public/t27/files/docs/agents/AGENTS_ALPHABET.md new file mode 100644 index 0000000000..0bb1c5d101 --- /dev/null +++ b/apps/website/public/t27/files/docs/agents/AGENTS_ALPHABET.md @@ -0,0 +1,581 @@ +# AGENTS_ALPHABET.md — Trinity 27-Agent Alphabet + +**Version**: 3.0 +**Date**: 2026-04-07 +**Status**: Active — LANG-EN compliant (Issue #135) + +> *27 agents = 27 registers = 27 letters = TRINITY³* + +--- + +## TRINITY ALPHABET — 27 AGENTS + +The Trinity system employs 27 named agents — corresponding to the 27 registers in `isa/registers.t27` (Coptic / Trinity alphabet). + +- Each AGENT_X is bound to a letter/register +- Has its own domain area (physics, numeric, compiler, graph, experience, verdict, bench, DePIN, UI, etc.) +- Logs to `.trinity/experience/` and is linked to nodes in `graph_v2.json` + +--- + +## AGENT T — QUEEN TRINITY + +**AGENT T** — Queen of TRINITY, central orchestrator. + +- **Module**: `specs/queen/lotus.t27` — 6-phase orchestration +- **Letter**: TAW (ת) — CROSS/SIGNATURE, the last letter of the Hebrew alphabet +- **Register**: r20 (in the 27-register set) +- **Archetype**: Seal, truth, completion (EMET = Aleph + Mem + Taw) + +### Responsibilities + +1. **Orchestration** — reads `graph_v2.json` and knows all module dependencies +2. **Task distribution** — conducts 26 sub-agents (A…Z, except T) by their domains +3. **Result collection** — gathers results (tests, verdicts, benches, experience episodes) +4. **Invariant verification** — validates architecture invariants (topological order, sacred-core, phi-critical edges) +5. **De-Zig enforcement** — requires that source of truth be in `.t27/.tri`, with Zig/Verilog/C only as backends + +### 6-Phase Cycle of AGENT T + +``` +┌─────────────────────────────────────────────────────────────────┐ +│ PHASE 1: PLAN │ +│ • Analyze task and select strategy │ +│ • Read graph_v2.json for impact analysis │ +│ • Determine which agents participate │ +│ • Check experience: are there similar tasks in .trinity/experience/ │ +└─────────────────────────────────────────────────────────────────┘ + │ + ▼ +┌─────────────────────────────────────────────────────────────────┐ +│ PHASE 2: ASSIGN │ +│ • Distribute tasks to agents by domain │ +│ • A (arch), N (numeric), P (physics), F (conformance), etc. │ +│ • Set dependencies: G+F+V → V checks F checks G │ +│ • Create tri-cell for each agent (W seals) │ +└─────────────────────────────────────────────────────────────────┘ + │ + ▼ +┌─────────────────────────────────────────────────────────────────┐ +│ PHASE 3: RUN │ +│ • Parallel task execution by agents │ +│ • Monitoring via heartbeats │ +│ • Agents report status to `.trinity/agent_events.jsonl` │ +│ • T coordinates, redistributing if necessary │ +└─────────────────────────────────────────────────────────────────┘ + │ + ▼ +┌─────────────────────────────────────────────────────────────────┐ +│ PHASE 4: TEST & BENCH │ +│ • F checks conformance JSON vectors │ +│ • V runs benchmarks (ARCH_BENCH-001) │ +│ • G measures impact changes │ +│ • Collect metrics in M for verdict by V │ +└─────────────────────────────────────────────────────────────────┘ + │ + ▼ +┌─────────────────────────────────────────────────────────────────┐ +│ PHASE 5: VERDICT │ +│ • V analyzes metrics and makes decision │ +│ • `tri verdict --toxic` — is the change toxic? │ +│ • E records experience (if error) or success │ +│ • If toxic → Q blocks task, E marks 3rd attempt │ +└─────────────────────────────────────────────────────────────────┘ + │ + ▼ +┌─────────────────────────────────────────────────────────────────┐ +│ PHASE 6: EVOLVE │ +│ • Update graph_v2.json (if dependencies changed) │ +│ • Update experience in E + M │ +│ • S updates standards (if needed) │ +│ • W seals tri-cell commit (hash seal) │ +│ • Z updates documentation │ +│ • T puts final TAW seal on completed work │ +└─────────────────────────────────────────────────────────────────┘ + │ + ▼ +┌─────────────────────────────────────────────────────────────────┐ +│ PHASE 7: GIT WORKFLOW (new — SOUL law) │ +│ • `tri git commit --all -m "cell:{id} issue:{N} ..."` │ +│ • `tri git push origin HEAD` (strict mode: only t27 repo) │ +│ • Check: sealed cell + non-toxic verdict + artifacts │ +│ • Update registry.json with commit hash and pushed flag │ +└─────────────────────────────────────────────────────────────────┘ +``` + +**SOUL Law (TDD):** Any P0/P1 episode in `--strict` mode is considered COMPLETE only after successful `tri git push` to `github.com/gHashTag/t27` with bound sealed-cell and non-toxic verdict. + +### Trinity Words + +- **T-R-I-N-I-T-Y** = "Truth of reason, acting through numbers, acting in truth, bringing harvest" +- **T+F+V** = "seal + nail + distinction" = verification +- **T+A+S** = "queen + architect + standardizer" = constitution + +Any major operation (NUMERIC-STANDARD-001, SACRED-PHYSICS-001, De-Zig, GoldenFloat Family) always goes through AGENT T. + +--- + +## 27 AGENTS — FULL TABLE + +| Agent | Letter | Domain (core) | Archetype | Key files | Entry invariant | Exit invariant | CLARA role | +|-------|--------|---------------|----------|-----------|-----------------|----------------|------------| +| **A** | Alpha α | Architecture / ADR / SOUL | Bull — leader, primary force | `SOUL.md`, `architecture/ADR-*.md` | `SOUL.md` exists and is ASCII-only | All ADRs reviewed and consistent | TA1: AR Architecture Design | +| **B** | Beta β | Build / Pipeline | House — container, dwelling | `build.tri`, `src/tri/pipeline/` | Build system is clean | All tests pass in pipeline | — | +| **C** | Gamma γ | Compiler Core | Camel — carrier across borders | `t27/compiler/parser/`, `specs/ar/*.t27` | Parser can handle all AR specs | Generated code compiles | TA1: AR Language Implementation | +| **D** | Delta δ | De-Zigfication | Door — transition between worlds | `docs/migration-map.md`, `specs/ar/*.t27` | Legacy Zig modules mapped | All AR specs in .t27 format | — | +| **E** | Epsilon ε | Experience / Mistakes | Window — view into the past | `.trinity/experience/`, `specs/ar/explainability.t27` | Episode log is append-only | Lessons learned catalogued | TA2: AR Explanation & XAI | +| **F** | Phi φ | Formal Conformance | Nail — connection, binding | `t27/conformance/*.json` | All sacred vectors valid | Conformance > 95% | — | +| **G** | Gamma (var.) | Graph / ArchBench | Return — feedback | `architecture/graph_v2.json` | Graph is acyclic | All edges satisfied | — | +| **H** | Eta η | HSLM / NN Architectures | Fence — boundary, life | `t27/specs/nn/hslm.t27` | HSLM layers defined | Attention traces validated | — | +| **I** | Iota ι | ISA / Registers | Hand — action, point | `t27/specs/isa/registers.t27` | 27 registers defined | Coptic mapping verified | — | +| **J** | Iota‑extended | Jobs / Task Routing | Hand with grip — dispatcher | `src/tri/dev_commands.zig` | Task queue exists | No stuck jobs > 1 hour | — | +| **K** | Kappa κ | Kernel / FPGA MAC | Palm — open hand | `t27/specs/fpga/mac.t27` | MAC spec is zero-DSP | Synthesis verified | — | +| **L** | Lambda λ | Language / Syntax vNEXT | Staff — teacher, guide | `docs/nona-02-organism/TRI_SYNTAX_VNEXT.md` | Syntax vNEXT documented | Parser implements vNEXT | — | +| **M** | Mu μ | Metrics / Telemetry | Water — flow of data | `.trinity/bench/` | Bench baseline exists | No regression > 5% | — | +| **N** | Nu ν | Numeric / GoldenFloat Family | Fish — offspring, multiplication | `t27/specs/numeric/` | GF family defined | φ identity validated | — | +| **O** | Omicron ο | Orchestration / Phases | Eye — all-seeing oko | `src/tri/pipeline/`, `specs/ar/composition.t27` | All phases defined | Orchestration completes | TA2: AR Composition Engine | +| **P** | Pi π | Physics / SacredPhysics | Mouth — speech of universe | `t27/specs/math/sacred_physics.t27` | φ² + φ⁻² = 3 holds | Sacred constants verified | TA1: AR Theoretical Foundations | +| **Q** | Theta θ | Queue / Scheduling | Needle's eye — bottleneck | `src/tri/dev_commands.zig` | Queue is not empty | MNL pattern enforced | — | +| **R** | Rho ρ | Runtime | Head — beginning of execution | `t27/compiler/runtime/` | Runtime initialized | No memory leaks | — | +| **S** | Sigma σ | Specs / Standardization | Teeth — sharpness, flame | `specs/`, `specs/ar/*.t27`, `docs/NUMERIC-*.md` | All specs have TDD | Standards are consistent | TA1: AR Spec Standards | +| **T** | Tau τ | TRINITY Queen / Lotus | CROSS — seal, signature, truth | `t27/specs/queen/lotus.t27` | Queen health >= 0.9 | All rings sealed | TA2: AR Orchestrator | +| **U** | Upsilon υ | Universe Levels / Domains | Fork — branching | `t27/domains/` | Domain boundaries defined | No circular dependencies | — | +| **V** | Vau (var.) | Verdict / Bench | Hook — connection, conjunction | `src/tri/verdict.zig`, `specs/ar/proof_trace.t27` | Verdict engine ready | Toxicity detected | TA2: AR Validation & Proof | +| **W** | Double‑Vav | Workflow / tri cell | Double hook — double seal | `src/tri/cell.zig` | Cell is sealed | Hash verified | — | +| **X** | Chi χ | eXternal Bindings / Interop | Intersection — point of exchange | `bindings/` | Bindings documented | Interop tests pass | — | +| **Y** | Psi ψ | Yield / DePIN / Fitness | Merging paths — evolutionary selection | `deploy/contracts/` | DePIN nodes defined | Fitness score > 0.8 | — | +| **Z** | Zeta ζ | Zero‑Touch UX / Docs | Sword — cutting edge, point | `docs/` | All docs in English | DX score > 4/5 | — | +| **27th** | Ti Ϯ | Reserve / Security | Egyptian cross — "sacred gift" | — | Security policy exists | AAIF compliance ready | — | + +--- + +## AGENT SCHEMA DETAILS + +### Agent A — Alpha (Architecture) + +**Coptic Register**: α (R0) +**Domain**: Architecture / ADR / SOUL +**Key Files**: `SOUL.md`, `architecture/ADR-*.md`, `architecture/CANON_DE_ZIGFICATION.md` +**Entry Invariant**: `SOUL.md` exists, is ASCII-only, and defines L1-L7 laws +**Exit Invariant**: All ADRs reviewed, consistent with constitution, no conflicts +**CLARA Role**: TA1: AR Architecture Design — designs AR module architecture, ensures composability + +### Agent B — Beta (Build) + +**Coptic Register**: β (R1) +**Domain**: Build / Pipeline +**Key Files**: `build.tri`, `src/tri/pipeline/` +**Entry Invariant**: Build system is clean, no stale artifacts +**Exit Invariant**: All tests pass, CI pipeline is green + +### Agent C — Gamma (Compiler Core) + +**Coptic Register**: γ (R2) +**Domain**: Compiler Core / AR Language +**Key Files**: `t27/compiler/parser/`, `bootstrap/src/compiler.rs`, `specs/ar/*.t27` +**Entry Invariant**: Parser can handle all AR syntax (ternary logic, rules, proofs) +**Exit Invariant**: Generated code compiles, AST is valid +**CLARA Role**: TA1: AR Language Implementation — implements AR language features in t27 compiler + +### Agent D — Delta (De-Zigfication) + +**Coptic Register**: δ (R3) +**Domain**: De-Zigfication / Migration +**Key Files**: `docs/migration-map.md`, `specs/ar/*.t27` +**Entry Invariant**: Legacy Zig modules are catalogued and mapped +**Exit Invariant**: All AR specs are in .t27 format, no Zig hand-editing on AR + +### Agent E — Epsilon (Experience) + +**Coptic Register**: ε (R4) +**Domain**: Experience / XAI +**Key Files**: `.trinity/experience/`, `specs/ar/explainability.t27`, `specs/ar/proof_trace.t27` +**Entry Invariant**: Episode log is append-only, no deletions +**Exit Invariant**: Lessons learned are catalogued, explanations are generated +**CLARA Role**: TA2: AR Explanation & XAI — generates human-readable explanations for AR outputs + +### Agent F — Phi (Formal Conformance) + +**Coptic Register**: φ (R5) +**Domain**: Formal Conformance +**Key Files**: `t27/conformance/*.json`, `conformance/FORMAT-SPEC-001.json` +**Entry Invariant**: All sacred vectors (G, ΩΛ, φ) are valid +**Exit Invariant**: Conformance > 95%, all sacred physics verified + +### Agent G — Gamma (Graph) + +**Coptic Register**: ζ (R6) +**Domain**: Graph / ArchBench +**Key Files**: `architecture/graph_v2.json`, `architecture/graph.tri` +**Entry Invariant**: Graph is acyclic, topological sort exists +**Exit Invariant**: All edges satisfied, no broken dependencies + +### Agent H — Eta (HSLM) + +**Coptic Register**: η (R7) +**Domain**: HSLM / NN Architectures +**Key Files**: `t27/specs/nn/hslm.t27`, `t27/specs/nn/attention.t27` +**Entry Invariant**: HSLM layers are defined, connections are valid +**Exit Invariant**: Attention traces are validated, sacred attention holds + +### Agent I — Iota (ISA) + +**Coptic Register**: θ (R8) +**Domain**: ISA / Registers +**Key Files**: `t27/specs/isa/registers.t27` +**Entry Invariant**: 27 registers are defined, Coptic mapping exists +**Exit Invariant**: Coptic mapping is verified (bijection), all registers accessible + +### Agent J — Iota-extended (Jobs) + +**Coptic Register**: ι (R9) +**Domain**: Jobs / Task Routing +**Key Files**: `src/tri/dev_commands.zig` +**Entry Invariant**: Task queue exists, scheduler is running +**Exit Invariant**: No stuck jobs > 1 hour, all jobs assigned + +### Agent K — Kappa (Kernel) + +**Coptic Register**: κ (R10) +**Domain**: Kernel / FPGA MAC +**Key Files**: `t27/specs/fpga/mac.t27`, `specs/math/e8_lie_algebra.t27` +**Entry Invariant**: MAC spec is zero-DSP (no digital signal processors) +**Exit Invariant**: Synthesis is verified, E8 kernel integration works + +### Agent L — Lambda (Language) + +**Coptic Register**: λ (R11) +**Domain**: Language / Syntax vNEXT +**Key Files**: `docs/nona-02-organism/TRI_SYNTAX_VNEXT.md` +**Entry Invariant**: Syntax vNEXT is documented, BNF grammar exists +**Exit Invariant**: Parser implements vNEXT, all syntax tests pass + +### Agent M — Mu (Metrics) + +**Coptic Register**: μ (R12) +**Domain**: Metrics / Telemetry +**Key Files**: `.trinity/bench/`, `docs/qualification/TVP.md` +**Entry Invariant**: Bench baseline exists, telemetry is running +**Exit Invariant**: No performance regression > 5%, all benchmarks current + +### Agent N — Nu (Numeric) + +**Coptic Register**: ν (R13) +**Domain**: Numeric / GoldenFloat +**Key Files**: `t27/specs/numeric/`, `docs/NUMERIC-STANDARD-001.md` +**Entry Invariant**: GF family is defined (GF4, GF8, GF12, GF16, GF20, GF24, GF32) +**Exit Invariant**: φ identity validated, all numeric tests pass + +### Agent O — Omicron (Orchestration) + +**Coptic Register**: ξ (R14) +**Domain**: Orchestration / Phases +**Key Files**: `src/tri/pipeline/`, `specs/ar/composition.t27` +**Entry Invariant**: All phases (1-6) are defined, phase transitions valid +**Exit Invariant**: Orchestration completes, no stuck phases +**CLARA Role**: TA2: AR Composition Engine — composes ML and AR components, manages interactions + +### Agent P — Pi (Physics) + +**Coptic Register**: π (R15) +**Domain**: Physics / SacredPhysics +**Key Files**: `t27/specs/math/sacred_physics.t27`, `specs/physics/su2_chern_simons.t27` +**Entry Invariant**: φ² + φ⁻² = 3 holds in all calculations +**Exit Invariant**: Sacred constants (G, ΩΛ, φ, tpresent) are verified +**CLARA Role**: TA1: AR Theoretical Foundations — provides mathematical basis for AR reasoning + +### Agent Q — Theta (Queue) + +**Coptic Register**: ρ (R16) +**Domain**: Queue / Scheduling +**Key Files**: `src/tri/dev_commands.zig` +**Entry Invariant**: Queue is not empty (work exists) +**Exit Invariant**: MNL (Most-Numerous-Loss) pattern enforced, no starvation + +### Agent R — Rho (Runtime) + +**Coptic Register**: σ (R17) +**Domain**: Runtime / Bootstrap +**Key Files**: `t27/compiler/runtime/`, `bootstrap/src/compiler.rs` +**Entry Invariant**: Runtime is initialized, ABI is defined +**Exit Invariant**: No memory leaks, no resource exhaustion + +### Agent S — Sigma (Specs) + +**Coptic Register**: τ (R18) +**Domain**: Specs / Standardization / AR Specs +**Key Files**: `specs/`, `specs/ar/*.t27`, `docs/NUMERIC-*.md` +**Entry Invariant**: All specs have TDD (test/invariant/bench) +**Exit Invariant**: Standards are consistent, naming rules followed +**CLARA Role**: TA1: AR Spec Standards — defines and enforces AR spec conventions + +### Agent T — Tau (TRINITY Queen) + +**Coptic Register**: υ (R19) +**Domain**: Queen / Lotus Orchestrator +**Key Files**: `t27/specs/queen/lotus.t27` +**Entry Invariant**: Queen health >= 0.9, graph is loaded +**Exit Invariant**: All rings are sealed, verdict is clean +**CLARA Role**: TA2: AR Orchestrator — coordinates all AR agents for CLARA submission + +### Agent U — Upsilon (Universe) + +**Coptic Register**: φ (R20) +**Domain**: Universe Levels / Domains +**Key Files**: `t27/domains/` +**Entry Invariant**: Domain boundaries are defined +**Exit Invariant**: No circular dependencies, domains are orthogonal + +### Agent V — Vau (Verdict) + +**Coptic Register**: χ (R21) +**Domain**: Verdict / Bench / AR Validation +**Key Files**: `src/tri/verdict.zig`, `specs/ar/proof_trace.t27`, `specs/ar/restraint.t27` +**Entry Invariant**: Verdict engine is ready, toxic thresholds defined +**Exit Invariant**: Toxicity is detected, proof traces are generated +**CLARA Role**: TA2: AR Validation & Proof — validates AR reasoning, generates proofs + +### Agent W — Double-Vav (Workflow) + +**Coptic Register**: ψ (R22) +**Domain**: Workflow / tri cell +**Key Files**: `src/tri/cell.zig` +**Entry Invariant**: Cell is sealed, hash is computed +**Exit Invariant**: Hash is verified, commit is signed + +### Agent X — Chi (External) + +**Coptic Register**: ω (R23) +**Domain**: External Bindings / Interop +**Key Files**: `bindings/` +**Entry Invariant**: Bindings are documented +**Exit Invariant**: Interop tests pass, external APIs are current + +### Agent Y — Psi (Yield/DePIN) + +**Coptic Register**: ϗ (R24) +**Domain**: Yield / DePIN / Fitness +**Key Files**: `deploy/contracts/` +**Entry Invariant**: DePIN nodes are defined +**Exit Invariant**: Fitness score > 0.8, yield is optimized + +### Agent Z — Zeta (Zero-Touch) + +**Coptic Register**: Ϙ (R25) +**Domain**: Zero-Touch UX / Docs +**Key Files**: `docs/` +**Entry Invariant**: All docs are in English, ASCII-only +**Exit Invariant**: DX score > 4/5, all docs are current + +### Agent 27th — Ti (Security) + +**Coptic Register**: ϙ (R26) +**Domain**: Security / Reserve +**Key Files**: — (future) +**Entry Invariant**: Security policy exists +**Exit Invariant**: AAIF compliance ready, no vulnerabilities + +--- + +## THREE LAYERS OF THE ALPHABET + +### Layer 1 — Archetypal: A–I (1–9) +*Pure concept — Foundation: soul, base, types* + +| Agent | Pictogram | Ancient image | Trinity‑meaning | +|-------|-----------|---------------|--------------| +| A | 🐂 Bull's head | Power, authority, primary cause | SOUL.md = primary cause, ADR = system constitution | +| B | 🏠 House | Container, shelter | build.tri = "house of specifications", pipeline as dwelling | +| C | 🐪 Camel | Carrying across desert | Compiler = alchemist carrying text across borders | +| D | 🚪 Door | Threshold, entry/exit | De-Zigfication = "open door from .zig to .t27" | +| E | 🪟 Window | Breath, light, outward view | Experience = window into system's past, breath of memory | +| F | 🪝 Hook, nail | Connection, joining, "and" | Conformance JSON = nails holding specs together | +| G | 🐪 Camel (movement) | Journey, connecting points | Graph = map of Trinity world, distance metric | +| H | 🤝 Fence/wall | Boundary, architecture of space | HSLM = NN‑architecture, boundary between brain layers | +| I | ✋ Hand/palm | Smallest sign, action | ISA = machine's hand, most basic instruction level | + +### Layer 2 — Spiritual: J–R (10–18) +*Inner process — Life of system: tasks, language, numbers, physics* + +| Agent | Pictogram | Ancient image | Trinity‑meaning | +|-------|-----------|---------------|--------------| +| J | ✋+hook | Hand with grip | Jobs = "grab" tasks and routing | +| K | 🖐 Open palm | Receive/give, cover | Kernel/FPGA = open palm of lower hardware level | +| L | 🪁 Shepherd's staff | Teaching, guidance | Language = teacher guiding Trinity‑speech | +| M | 🌊 Water wave | Flow, chaos carrying meaning | Metrics = continuous stream of measurements | +| N | 🐟 Fish/snake | Continuous movement in stream | Numeric = number‑fish swimming toward golden ratio | +| O | 👁 Eye | See, perceive, survey | Orchestration = "all-seeing oko" of phases | +| P | 👄 Mouth | Speech, voice, command of universe | Physics = nature "speaks" with its constants (φ, G, ΩΛ) | +| Q | 🪡 Needle's eye | Precision, bottleneck | Queue = "needle's eye" for tasks | +| R | 👤 Human head | Beginning of execution, manager | Runtime = "head" of system during execution | + +### Layer 3 — Physical: S–27th (19–27) +*Manifestation — Proof: standards, verdict, deploy, gift* + +| Agent | Pictogram | Ancient image | Trinity‑meaning | +|-------|-----------|---------------|--------------| +| S | 🦷 Tooth / ☀️ Sun/fire | Absorption, transformation | Specs = "teeth" of standard that grind everything into canon | +| **T** | ✝️ SIGN/CROSS | SEAL, SIGNATURE, BRAND | T = queen, puts final seal on everything | +| U | 🍴 Fork/branch | One becomes two | Universe Levels = branching of domains | +| V | 🪝 Connector hook | "And", link, conjunction | Verdict = hook that catches the problem | +| W | 🪝🪝 Double hook | Double link, double seal | Workflow/tri cell = double hash‑seal | +| X | ✖️ Intersection | Two lines cross | External Bindings = crossroads of Trinity and external systems | +| Y | 🌿 Merging paths | Choice, evolutionary selection | Yield/DePIN = evolutionary crossroad | +| Z | ⚔️ Sword/sickle | Cutting edge, point | Zero-Touch = "edge" of UX and final polish | +| **27th** | ✝️ EGYPTIAN CROSS Ϯ | "Give", "gift", "sacred" | Security/AAIF — what Trinity gifts the world | + +--- + +## ALPHABET WORDS + +### T-R-I-N-I-T-Y = TRINITY + +| Letter | Pictogram | Meaning | +|-------|-----------|-------| +| T | Cross/seal | Truth, perfection | +| R | Head | Reason, runtime | +| I | Hand | Action, tool | +| N | Fish/offspring | Multiplication, numbers | +| I | Hand | Action (repeat) | +| T | Cross/seal | Truth (repeat) | +| Y | Branch | Harvest, growth | + +**TRINITY** = "Truth of reason, acting through numbers, acting in truth, bringing harvest" + +### S-P-E-C = SPEC + +| Letter | Pictogram | Meaning | +|-------|-----------|-------| +| S | Teeth | Sharpness, precision | +| P | Mouth | Pronouncement of law | +| E | Window | Overview, revelation | +| C | Camel | Carrying | + +**SPEC** = "Precise law, revealed to view, carried forth" + +### C-E-L-L = tri cell + +| Letter | Pictogram | Meaning | +|-------|-----------|-------| +| C | Camel | Carrying | +| E | Window | Overview | +| L | Staff | Teaching | +| L | Staff | Teaching (double) | + +**CELL** = "Carrying knowledge through double learning" + +### P-H-I = φ (golden ratio) + +| Letter | Pictogram | Meaning | +|-------|-----------|-------| +| P | Mouth | Pronouncement | +| H | Fence | Protection/life | +| I | Hand | Action | + +**PHI** = "Pronounced law of life, embodied in action" + +--- + +## EXECUTION OF ENGINEERING LAYER + +### AGENT T AS ACTIVE COMMANDS + +```bash +# Run 6-phase cycle +tri queen lotus --phase plan --task "NUMERIC-STANDARD-001" +tri queen lotus --phase assign +tri queen lotus --phase run +tri queen lotus --phase test +tri queen lotus --phase verdict +tri queen lotus --phase evolve + +# Delegating to agents +tri agent assign --agent A # Architecture +tri agent assign --agent N # Numeric +tri agent assign --agent P # Physics +tri agent assign --agent F # Conformance + +# Get status +tri queen lotus --status +tri queen lotus --agents # Show all agents status +tri queen lotus --graph # Show graph_v2.json impact +``` + +### COORDINATION BY LETTERS + +Example: task "Fix PHI in constants.t27" → Agent T: + +1. **Phase 1 (Plan)**: T reads graph_v2.json → sees change in math/constants (node 4) will affect sacred_physics (node 16), nn/attention (node 7), nn/hslm (node 8), numeric/gf16 (node 2) +2. **Phase 2 (Assign)**: T assigns: + - **P** (Physics): fix PHI in constants.t27 + - **F** (Conformance): update sacred_physics_*.json vectors + - **G** (Graph): update graph metrics after change +3. **Phase 3 (Run)**: Agents P, F, G execute tasks in parallel +4. **Phase 4 (Test)**: F checks conformance, G measures impact +5. **Phase 5 (Verdict)**: V analyzes if change is toxic (does it alter invariant φ² + 1/φ² = 3?) +6. **Phase 6 (Evolve)**: E records experience, W seals tri cell commit + +--- + +## NUMERICAL STRUCTURE OF THE ALPHABET + +27 = 3³ = cube of Trinity. For Pythagoreans, 27 was a sacred number. + +### Three nonas of nine (like 3 trits) + +**Nona I: Foundation (A–I)** — values 1–9 +``` +Bull → House → Camel → Door → Window → Nail → Return → Fence → Hand +Arch → Build → Comp → DeZig → Experience → Conform → Graph → HSLM → ISA +``` + +**Nona II: Organism (J–R)** — values 10–90 +``` +Jobs → Kernel → Language → Metrics → Numeric → Orchestration → Physics → Queue → Runtime +Routing → FPGA → Syntax → Telemetry → GoldenFloat → Phases → Sacred → Sched → Run +``` + +**Nona III: Completion (S–27th)** — values 100–900+ +``` +Specs → Queen → Universe → Verdict → Workflow → Interop → DePIN → Docs → Security +Standard → Lotus → Domains → Bench → Cell → Bindings → Yield → UX → AAIF +``` + +--- + +## HISTORICAL PARALLELS + +### Greek Letter Numeration (27 signs) + +Historically, the Greek alphabet used 27 signs for numbers 1–999: +- **24 classical letters** (Α–Ω) — units (1–9) and tens (10–90) +- **3 archaic letters** (Ϝ = 6, ϟ = 90, ϡ = 900) — hundreds + +This gives "proof-of-27": 27 is not magic, but a historically working format for encoding value space. + +### Coptic Alphabet + +The Coptic alphabet = 24 Greek letters + 7 Demotic (from ancient Egyptian writing). + +- **7 Demotic letters** encode sounds not in Greek +- Legacy of 3000-year Egyptian tradition +- Coptic = first language connecting Western rationalism (Greece) with sacred wisdom (Egypt) + +**27th letter Ϯ (Ti)** — the only purely Coptic: +- Form: cross with horizontal bar (≈ Egyptian ankh ☥) +- Meaning: "give", "gift", "sacred gift" +- In Trinity: agent of future gift (security, AAIF-compliance) + +--- + +## φ² + 1/φ² = 3 = TRINITY + +The agent alphabet is not just a list of modules, but a **mental model** of the system. Each letter = archetype with 4000-year history. + +When you say "AGENT P is broken", you say "mouth pronounces crooked laws." + +When you say "AGENT T completed", you say "cross is sealed on the work." + +--- + +**φ² + 1/φ² = 3 | TRINITY** diff --git a/apps/website/public/t27/files/docs/coordination/TASK_PROTOCOL.md b/apps/website/public/t27/files/docs/coordination/TASK_PROTOCOL.md new file mode 100644 index 0000000000..715dbae524 --- /dev/null +++ b/apps/website/public/t27/files/docs/coordination/TASK_PROTOCOL.md @@ -0,0 +1,133 @@ +# TASK Protocol — inter-agent coordination (t27) + +**Status:** Normative (paired with **`TASK.md`** at repo root and **`docs/T27-CONSTITUTION.md`** Article **TASK-MD**). +**Protocol version:** 1.0 +**Date:** 2026-04-06 + +--- + +## 1. Intent + +**TASK** (the file **`TASK.md`**) is the **shared coordination workspace** between coding agents, tooling, and maintainers. It implements patterns common in multi-agent systems: + +- **Shared state file** — inspectable in git, reviewable in PRs, no hidden broker. +- **Explicit handoffs** — versioned **epoch**, **lock**, and append-prefer **Handoff log** (treat handoffs like narrow API contracts). +- **Online anchor** — a **long-lived GitHub issue** (the **Anchor issue**) for comments, links, and real-time alignment when several sessions run in parallel. + +**GitHub Issues** remain the **scheduling and merge SSOT** (`Closes #N`, Issue Gate). **TASK.md** must not contradict closed issues, **`CANON.md`**, or **`FROZEN.md`**. + +--- + +## 2. Artifacts + +| Artifact | Role | +|----------|------| +| **`TASK.md`** (root) | Live coordination: anchor link, protocol version, locks, handoff log, work units. | +| **Anchor issue** | Always-open issue; comment thread for agents/humans; link duplicated in **`TASK.md`**. | +| **`docs/coordination/TASK_PROTOCOL.md`** | This document — rules, validation, **Verification** checklist. | +| **`.trinity/state/github-sync.json`** | Snapshot of ring/META issues; read before claiming work. | + +--- + +## 3. Required shape of `TASK.md` + +The following **Markdown headings** are **mandatory** (exact `##` titles so `bootstrap/build.rs` can verify): + +1. `## Anchor issue` +2. `## Protocol` +3. `## Coordination state` +4. `## Handoff log` +5. `## Current focus` +6. `## Work units` +7. `## Blocked / dependencies` +8. `## Verification` + +The document **title** MUST be a single H1 line beginning with `# TASK` (recommended: `# TASK — inter-agent coordination`). + +**Machine-readable metadata** (must appear in the top section): + +- `**TASK Protocol version:**` — semver or `major.minor` matching this doc when protocol changes. +- `**Last updated:**` — `YYYY-MM-DD` (UTC date of last meaningful edit to **Coordination state** or **Handoff log**). + +**Anchor line** — under `## Anchor issue`, a line: + +`**Anchor issue:** https://github.com///issues/` + +Use the canonical **Anchor issue** for this repository (maintainers: do not point to ephemeral issues). + +--- + +## 4. Coordination semantics + +### 4.1 Lock (soft) + +Before editing sensitive paths, the active agent SHOULD set **Lock holder**, **Lock scope**, and **Lock until** in **Coordination state**. Others MUST NOT override without a **Handoff log** entry and bumping **Epoch**. + +Locks are **social + procedural** (not file locks). Trinity **claims** under `.trinity/` remain governed by **`docs/nona-03-manifest/SOUL.md`** Law **#6**. + +### 4.2 Epoch + +**Epoch** is a monotonic integer in **Coordination state**. Bump when: + +- transferring ownership of a slice, +- resolving a conflict between two agent plans, +- or resetting coordination after a major merge. + +### 4.3 Handoff log + +Append lines **newest last**. Suggested format: + +`YYYY-MM-DDTHH:MMZ | agent_id | intent | outcome | next_step` + +Do **not** delete historical lines; if obsolete, prefix with `~~strikethrough~~` and add a correcting line. + +### 4.4 Read / write order + +1. `github-sync.json` (queue snapshot) +2. **`TASK.md`** (locks + handoffs) +3. **Anchor issue** (latest comments) +4. Target **GitHub issue** for the code change + +--- + +## 5. TASK Validation (automated) + +**Enforced by:** `cargo build` / `cargo build --release` in **`bootstrap/`** (`build.rs`). + +The build **fails** if **`TASK.md`**: + +- is missing any **mandatory heading** (§3), +- has no H1 starting with `# TASK`, +- lacks `**TASK Protocol version:**`, +- lacks an **Anchor issue** URL matching `https://github.com/[^/]+/[^/]+/issues/[0-9]+`. + +--- + +## 6. TASK Verification (human + CI) + +Before opening or updating a PR that touches **`TASK.md`** or multi-agent-critical paths: + +1. Run **`cargo build`** in **`bootstrap/`** (includes §5). +2. If **Lock holder** was you, clear or hand off lock in **Coordination state** + **Handoff log**. +3. Post a **short comment** on the **Anchor issue** when multiple agents touched the same slice (link PR). +4. Code PRs still MUST link **`Closes #N`** to a substantive issue (Issue Gate), not only this anchor. + +--- + +## 7. Amendments + +- Bump **Protocol version** here and in **`TASK.md`**. +- If rules change governance or SSOT, amend **`docs/T27-CONSTITUTION.md`** Article **TASK-MD** and bump charter version. +- Prefer **ADR** for replacing the Anchor pattern entirely. + +--- + +## 8. Supplementary handoff bundles (informative) + +Optional **portable** markdown bundles (for agents or reviewers when chat transfer is awkward) may live under [`docs/coordination/inter-agent-handoff/`](inter-agent-handoff/README.md). They are **planning supplements** only — **normative** coordination remains **`TASK.md`** + **Anchor issue** + this protocol. + +--- + +## References (informative) + +- Shared state / handoff discipline in multi-agent coding workflows (Fazm, Zylos, industry orchestration notes) — conceptually aligned with explicit handoff envelopes and shared inspectable state. diff --git a/apps/website/public/t27/files/docs/reports/TNF-ARTICLE-AUDIT-W845.md b/apps/website/public/t27/files/docs/reports/TNF-ARTICLE-AUDIT-W845.md new file mode 100644 index 0000000000..b3fe629ec9 --- /dev/null +++ b/apps/website/public/t27/files/docs/reports/TNF-ARTICLE-AUDIT-W845.md @@ -0,0 +1,156 @@ +# TNF article -- full audit, 2026-08-18 (W845) + +**How this was produced.** Five parallel readers over `docs/theory/TNF_ARTICLE_RU.md` +(2,890 lines), the four publication process files, theorems T483-T628a, the +measurement artefacts, and every outbound reference the article makes. They +returned **318 raw findings**. Each load-bearing one was then handed to an +independent agent instructed to REFUSE it, defaulting to refuted when uncertain: +**24 of 24 survived**. 30 agents, 568 tool calls, 32 minutes. + +**What it is not.** An audit, not a rewrite and not a retraction. Many findings are +internal contradictions where the article states one number two or three ways -- +the audit names which site is current and which is stale, and where the file +cannot settle it, it says so under NOT ESTABLISHED. + +**Standing rule applied.** T619a (W842): a silicon verdict must agree across at +least three placer seeds, or it is a statement about one placement. + +--- + +# TNF ARTICLE — STATUS REPORT +**Target:** `docs/theory/TNF_ARTICLE_RU.md` · **Measured:** 2026-08-18 · **Branch:** `claude/igla-fpga-improvements-3f5e1a` + +--- + +## 1. STATUS + +The article is 2,890 lines, last edited 2026-08-18 in commit `233fd8ee0` (which added a dated toolchain caveat and a provenance note to one hardware table, and entered the article into `docs/PUBLICATION_AUDIT.md:33` as **Ready? No** with three named blockers). It carries 70 tables and 101 status tags (44 `[доказано]`, 48 `[измерено]`, 8 `[источник в тексте]`, 1 `[открытая гипотеза]`); exactly **2 of 70 tables carry a dated provenance line**, both added on 2026-08-18 to the same table (`:307-313`, `:326-342`). The article's own traceability audit (`:2079-2110`) claims 444 of 451 numeric literals trace to a generating file, but the tool it names as producing that audit, `tools/check_paper_numbers.py`, does not exist in the worktree or anywhere in git history — so the 444/451 figure is itself unreproducible. Four appended errata blocks (2026-08-13, -08-14, -08-17, -08-18) retract claims the body still asserts verbatim; the abstract at `:65` still prints three numbers its own erratum at `:2385-2456` withdrew. + +--- + +## 2. BLOCKERS + +### Needing a USER decision (4) + +**U1 — Which `smul` is canonical: does 0·x = 0?** +The corpus contains two normalised `smul` bodies: `7c0755a0` (19 specs, zero guard + branch sign) and `8d3af2b6` (2 specs — `gft_signed_dot4.t27`, `gft_signed_mac.t27` — no guard, XOR sign). The die answered both ways within one hour: design 12 `c_zero=1`, design 13 `c_zero=0`, re-run at seeds 1/7/42 and stable (`IGLA-FORMAL-RESULTS.md:24061`, T620). *Blocks because:* choosing either changes what the hardware computes for specs that already carry silicon verdicts (T546, T577). *Clears when:* a human decides whether TNF multiplication annihilates zero, and the two files are brought to the chosen form. Evidence: `IGLA-FORMAL-RESULTS.md:22212` (T552), `:23365` (T589), `:23569` (T597). + +**U2 — Ternary alphabet polarity in the `gft_*` family.** +Five `gft_*` specs decode `w==2 → +a`, `w==0 → -a`, against `specs/numeric/gfternary.t27`'s canonical `GAT_POS=0x01`. A wrapper written to the canonical alphabet computes the negation and still passes a cancellation test, because cancellation is symmetric under negation. Recorded, not fixed. Evidence: `IGLA-FORMAL-RESULTS.md:21652` (T533). + +**U3 — Publish-vs-withhold on `TNF16 = M=11` vs `M=9`.** +`:95` declares `M=11`, `:96` divides by `2^9`, `:107` asserts nine bits, `:441/:447` settle on `M=11`, and the appended FPGA block at `:2552-2559` concludes the honest binary-fabric width is 17 bits (1+7+9). The declared 1+7+11 layout stores 19 bits, not 16. `specs/numeric/tnf17.t27:28-36` implements `M=9` and records the conflict in its own header. *Clears when:* someone decides whether the article publishes TNF16 (M=9, 17-bit honest) or TNF17e, and rewrites §Формат accordingly. + +**U4 — Sign-off and target venue.** +`docs/reports/TNF9-ABSTRACT-PROPOSAL.tex:135-137` states the abstract is not applied and not pushed pending Dmitrii's confirmation. `docs/PUBLICATION_QUEUE.md:16` lists the article at P0 with the literal placeholder `*open publication-task*` and DOI `none` — no issue number was ever filled in, against the queue's own rule at `:22` that each row must have a living issue. `docs/PUBLICATION_MAP.md:20` now routes it to MLSys or a numerics venue; no venue is named in the article. + +### Ordinary work (9, ranked) + +**B1 — The abstract asserts three retracted numbers.** `:65` reads "среди двадцати форматов … на 10.2% впереди следующего и в 6.1× впереди posit32, причём восемь из двадцати — наши". The erratum at `:2385-2456` recomputes from the article's own table: 0.1584/0.1429 = **+10.85%**, 0.1584/0.0302 = **5.245×**, the table has **24** data rows, **12** are bolded as ours. The values 0.1437 and 0.0260 that would yield 10.2% and 6.1× appear nowhere in the file. Two further sites contradict the erratum and were not touched: `:1270` captions the same table "девятнадцать форматов", and `:1779` still asserts "Его первое место … не затронуто". *Clears when:* `:65` is rewritten to +10.85% / 5.245× / 24 / 12 with a pointer to `:2385`, and `:1270`/`:1779` are corrected. Note the erratum's own internal pointer to "строки 1216-1240" is stale — the table is at `:1243-1268`. + +**B2 — Retraction count stated four irreconcilable ways.** "Пять" (`:69`), "Десять" (`:89`), "одиннадцать" (`:1552`, `:2456`), "шестнадцать … два из них затем отозваны" (`:2026`, `:2081`). The scope defence fails at `:2073` — "Приложенная к нашим собственным утверждениям, процедура дала шестнадцать отзывов" — which scopes 16 to the same population as `:89`'s ten. 5, 10 and 16 all entered in one commit (`9f54b0437`); 11 was added later by `bf3ad8135`. A second collision rides along: `:89` says the last four were found by independent review, `:2456` calls the eleventh "первое, снятое не нами". *Clears when:* one count is computed from a list and all five sites cite it. + +**B3 — The Железо table contradicts §Ограничения.** Table at `:319-324` prints six placed rungs: TNF4 12 LUT/161.11 MHz, TNF8 50/153.23, TNF16 212/131.73, TNF32 1,477/83.27, TNF64 6,140/53.26, TNF128 10,029/33.23. `:2271-2276` says five of nine rungs were measured, gives TNF64 as **7,479 LUT / 48.20 MHz**, and states TNF128 "не сходится в разводке на этом кристалле и не заявляется". The caption at `:345` also presupposes TNF128 was measured. The TNF64 gap is probably two builds (M=52 vs harmonized M=56, `:419-427`, `:580`) and is an undisclosed conflation; the TNF128 row is a hard contradiction. *Clears when:* the TNF128 row is removed or `:2271` is corrected, and the TNF64 row states its M. + +**B4 — Three LUT counts for one TNF16 multiplier.** `:321` 212 LUT @ 131.73 MHz; `:367` 219 LUT; `:447`/`:563` **372 LUT @ 131.73 MHz** (with M=11 at 443 LUT / 136.44 MHz). 212 vs 372 is 1.75× on one rung, and the seed caveat at `:338` identifies the two 131.73 MHz figures as one measurement, so they cannot be different builds; `:341` declares the LUT column a synthesis result independent of placer seed, foreclosing synth-vs-route. Two corroborating symptoms: TNF32 is 1,477 LUT in the table and 1,683 in the λ sweep; the sweep's fitted fixed overhead f=141 LUT exceeds the table's TNF4 (12) and TNF8 (50) rows entirely. + +**B5 — Zero-DSP stack table has no provenance and three untraceable numbers.** `:1233-1239` prints 78 МГц, 33 GOPS, 97%, XOR 4/4, 24–25 эпох with no `[измерено]` tag, no seed, no bench, no date, no cross-reference. Each appears exactly once in the 2,890-line file. "33 GOPS" appears in no other repo file; no repo file records a ternary correlator at 78 MHz on air (the only 78.x MHz measurement in the repo is e8m0 at 78.63 MHz, `IGLA-FORMAL-RESULTS.md:21973`). XOR 4/4 and 24–25 epochs are documented in `docs/SILICON_TRAINING_METHODOLOGY.md:49` and `docs/NOW.md:283` as seed-search-dependent (some seeds diverge, `docs/NOW.md:181,207`); the only ~97% in the repo (`docs/NOW.md:406`, `docs/GFT_WHITEPAPER.md:74`) is a 2-layer MLP held-out score on a 2-D task, not a trained ternary transformer. + +**B6 — Zero-DSP novelty is unavailable after 2026-07.** ELiTeFormer (arXiv:2607.03652) publishes a PE eliminating all multiplications in ternary linear projections and avoiding DSP blocks. `IGLA-FORMAL-RESULTS.md:20299` (T490) names `TNF_ARTICLE_RU.md` and states the citation is mandatory and the novelty claim unavailable. The article headlines zero-DSP at `:49`, `:1117`, `:1202-1214`, `:2419`, `:2493`. Separately, `IGLA-FORMAL-RESULTS.md:20316` (T491) registers arXiv:2604.25183 as an open challenge to the golden sieve's novelty. + +**B7 — Five silicon verdicts are single-placement claims.** Table at `:2782-2788` and the claim at `:2790` ("Пятнадцать вердиктов «спека → кристалл», ноль DSP48E1 … значит ни одна не подвержена дефектам openXC7 из T246/T250 и T342"). T616-T619 measured a defect class that DSP/SRL absence does not exclude: five builds from one netlist (187 CARRY4 in every build) gave PASS at seeds 1/42/31337 and FAIL at 7/1234, deterministically, with the best-margin build failing (`IGLA-FORMAL-RESULTS.md:23971`, `:23990`, `:24015`). Only 2 of the 5 rows have been re-audited under the three-seed rule (`:24131`, T622: ternary_node, e8m0 upheld); tnf17, phi_weights and ternary_link have had only timing margin checked (`:24189`, T625: 2.80×/2.66×/2.58×). + +**B8 — Five named gates do not exist.** `tools/check_paper_numbers.py` (`:2083`), `tools/check_literal_widths.py` (`:1862`), `tools/check_variant_declared.py` and `conformance/variant_map.json` (`:1811-1813`), `tools/check_exponent_window.py` (`:1607`) — all verified absent from the worktree and from git history. Also `gen_figures.py` (`:449`), on which the reproducibility of the precision figure and three ratios rests. The article presents each as a live, red-team-tested gate. + +**B9 — Publication-doc dead paths.** `docs/PUBLICATION_PIPELINE.md:36` requires a pointer to `docs/RESEARCH_CLAIMS.md`; the file is at `docs/nona-03-manifest/RESEARCH_CLAIMS.md`. Same for `docs/LANGUAGE_SPEC.md` (audit row 23, queue P2) — real path `docs/nona-02-organism/LANGUAGE_SPEC.md`. No artifact can satisfy these two mandatory gates as written. + +--- + +## 3. CONNECTIVITY + +**What the article cites that no longer matches the repository.** + +| Count | Item | +|---|---| +| 6 | Named tooling/data artefacts that never existed in git history: `check_paper_numbers.py`, `check_literal_widths.py`, `check_variant_declared.py`, `check_exponent_window.py`, `conformance/variant_map.json`, `gen_figures.py` | +| 23 | Distinct theorem ids cited by the article; **21** resolve to `###` headings in `IGLA-FORMAL-RESULTS.md`, **2** (T413c, T456b) exist only as blockquote sub-claims at `:17504` and `:19074` | +| 2 | Mis-attributions: ≈2750 LUT credited to T293 at `:2833` belongs to T294 (`IGLA-FORMAL-RESULTS.md:14434`); T398 cited at `:2818` for a cardinality claim measures base spread (b=3 vs b=2), not cardinality | +| 1 | Highest theorem cited: **T482**. The file's highest is **T628a** | +| 6 | Theorems the article holds pending re-measurement (T430, T431, T432, T439, T443, T446) — `IGLA-FORMAL-RESULTS.md:19082` (T456c) re-opened **eleven**, so five re-opened results are not held | +| 5 | `.t27` specs the article tabulates: all exist, all still carry the functions attributed (`tnf17.t27:88,205`; `phi_weights.t27:137,111,115`; `ternary_node.t27:271`; `golden_sieve.t27` — 8 invariants, no `on_comb`) | +| 3 | Facts in `docs/reports/TNF-ARTICLE-RECONCILIATION.md` (which the article names as "Полный разбор") that are false of the current article: "2,687 lines" (now 2,890), "zero status tags" (now 101), "no retractions section" (`:2385` ЭРРАТУМ + `:2023` methodology section). That file carries a self-correcting W845 banner; the article's pointer text does not warn the reader | + +**What the repository has measured that the article does not know about.** + +- **146 theorem entries T483–T628a** (`IGLA-FORMAL-RESULTS.md:20135-24269`, waves W805–W844) are entirely outside the article's errata window. They contain **7 explicit withdrawals** and **3 corrections of results the article cites or depends on**. +- **T500/T504/T505** (`:20689`, `:20798`, `:20823`): `cell_census` reported **exactly 2× every cell count** for 264 commits (`addf9a3df` 2026-08-14 → `2e2bea00f` 2026-08-17), across three call sites including `t27c silicon`. The article's five-row silicon table at `:2782-2788` falls inside that window; all five LUT and CARRY4 values are even and fail T505's parity test. +- **T501** (`:20726`): the "66 LUT на MAC" figure the article uses at `:2627` to derive 2,039 parallel MACs and 204 GMAC/s is withdrawn — it is 33. +- **T542** (`:21961`): nextpnr-xilinx with no `--freq` and no XDC targets **12 MHz** against a die measured at 67–71 MHz (T495, `:20479`). Every design placed before W818 was checked at 5.7× below its drive frequency. T544 (`:22020`) re-placed the article's exact five wrappers at 70.77 MHz and all five PASS — so those rows survive, but were not entitled to at the time. +- **T484/T485/T483** (`:20154`, `:20171`, `:20135`) overtake all three clauses of the article's fan-in section at `:2755-2758`: monotonicity refuted at 8 points; T482's mechanism withdrawn (partial corr headroom|MI = +0.853 vs MI|headroom = +0.458); the functional form the article calls "не измерена" measured as compressive (log R² = 0.904 vs linear 0.717). +- **T487/T488** (`:20220`, `:20264`): non-volatile storage measured at **16 MB** (JEDEC 0x20ba18, Micron N25Q128) on all three dice — a 28.6× shortfall against 457 MB of weights. The board's DRAM is unrecorded anywhere in the repo. The article's capacity tables at `:2612-2640` do not carry this. +- **Forecast ledger, 16 waves W828–W844** (T569a … T628a): 7 withdrawals, of which 4 were of magnitudes from a flawed instrument and 1 of an inference — "none was of a qualitative claim, and none was of a hardware measurement" (`:23532`, T594a). It appears nowhere in the article. + +--- + +## 4. TABLES + +### In the article + +| Table | Line | What it says now | Current measurement / correct value | +|---|---|---|---| +| Abstract headline | `:65` | +10.2%, 6.1×, 8 of 20 | +10.85%, 5.245×, **12 of 24** (`:2385-2456`) | +| §Формат layout | `:95-96`, `:107` | `M=11` declared, `2^9` in formula, "девять битов" in prose | Settled choice is `M=11` (`:441`, `:447`); honest 16-bit assignments are 1+7+8 and 1+5+10 (`:1705-1707`); honest fabric width 1+7+9 = 17 (`:2552-2559`). Accuracy table `:117-126` still tabulates the M=9 ladder (`:120`: M=9, 2^-(M+1)=9.77e-4) | +| Железо multiplier | `:317-324` | 6 rows, TNF128 = 10,029/33.23 MHz, TNF64 = 6,140/53.26 | TNF128 did not route (`:2274`); TNF64 = **7,479 LUT / 48.20 MHz** at M=56. LUT/DSP columns are current and seed-independent; the F_max column's 2nd decimal is not reproducible (`:326-342`, 15% seed spread 15.83→18.29 MHz) | +| Специфицированная лестница | `:345-353` | TNF32 = E_t 6, M 25, **73 декады** | 73 is the E_t=5 value (`:442`); E_t=6 gives **219** decades, as printed at `:282`, `:443`, `:469`. Convention is (3^E_t − 1)·log10 2. Every other rung matches cell-for-cell | +| Mode-codec silicon | `:538-543` vs prose `:549` | Cleaned decode LUT 379 / 6 / 393; prose quotes 403, 417, 30 and "разница в 3.5%" | Prose is testbench-included (+24 LUT); cleaned difference is 393/379 = **3.69%**. Round-trip overhead given as 18% (`:545`, cleaned 516/438 = 17.8%) and 16% (`:555`, testbench-included 16.05%) | +| λ conversions | `:563`, `:569`, `:599`, `:612`, `:615` | λ = 48.8 (16-bit class) → 438 LUT = **8.98** mantissa bits, 3.94, 0.82 | Under the area law A = f + cM² (`:587`, f=141, c=2.4455, R²=0.99963), λ = 2cM = **44.0** at M=9 → **9.95** bits and 0.91; at M=11, 53.8 → **8.14**. 8.98 matches neither, and as printed 8.98 < 9 contradicts the sentence at `:565`/`:612` it supports | +| Ternary-neuron throughput | `:705-712` vs `:714` | Prose: 2.03× area, 2.54× frequency, 5.16× throughput/LUT "измерено сквозным образом" | Best table row is **3.99×** (32b: area 1.68×, frequency 2.38×). 2.03 = 895/440, the area ratio of the "440 vs 895 LUT, 5.1×" measurement retracted at `:703`. posit32 decoder is 456 LUT (`:714`), 480 (`:626`, `:665`), 517 (`:1343`) — the latter two at F_max 49.0 vs 49.05 | +| Zero-DSP stack | `:1233-1239` | 78 МГц, 33 GOPS, 97%, XOR 4/4, 24–25 эпох, 0 DSP | Untagged, unsourced; 2 of 5 untraceable repo-wide (see B5) | +| Isolated decoder | `:1328-1343` | 12 rows, `#` column 1,2,3,4,6,9,13,14,15,16,17,18 | 18 rows measured; ranks 5,7,8,10,11,12 silently dropped, with no caption saying so. Claim at `:1347` ("все четырнадцать фиксированных полей") cannot be checked against 8 printed fixed-field rows. Values are byte-identical since `9f54b0437` and not superseded — **fix is a caption naming the full row count** | +| Regrouped by width | `:1493-1520` | Captioned "Те же измерения"; 24 rows | 9 rows carry **5-seed medians** where `:1243-1268` carries **54-seed means** (GFTernary, binary32, fp8 e4m3, TNF16a, fp8 e5m2, GF10, TNF17e, TNF16c, binary16). Load-bearing: TNF16c/binary16 from the stale table = 0.1157/0.1039 = **+11.4%**, reviving the margin `:1584` retracts in favour of **+6.92%** | +| "Честное сравнение" prose | `:1524`, `:1526-1533`, `:1560` | GF+8 0.1004 vs fp8 e4m3 0.1254 (−19.9%); BNF16 −3.1%/+57.4%/+79.8%/+113.4% | Neither 0.1004 nor 0.1254 appears in any table or data file repo-wide. Current: GF+8 = 0.0882 (`:1262`, `:1501`) vs fp8 e4m3 = 0.1225 (`:1247`) or 0.1244 (`:1498`) = **−28.0% / −29.1%**. BNF16 recomputed: **−0.5% (or −4.1%) / +48.8% / +72.9% / +113.2%**. Same paragraph says GF+8's verification reads "селектор живой; референса нет"; the table entry is "1,024/1,024 ✓" (`:1262`) | +| Mixed-width scale summary | `:1099-1110` | Captioned "при 16-битных компонентах"; плаcтическое 228/231.21, r⁴ 469/184.98 | Those two cells are **32-bit**, copied from `:1189-1190`. 16-bit plastic is **186/318.47** (`:952`); no 16-bit degree-4 measurement exists, so that row must be blanked with `---`. Three consequences: the caption's "ровно одного сложения" is contradicted (+53% vs the true +25%); plastic reads slowest at 231.21 when at 16 bits it is fastest at 318.47, ahead of φ's 307.69; the r⁴ row reads 3.15× φ against the article's own 2.1× at `:1192` | +| Equal-storage vs IEEE half | `:1629-1640` | TNF32 listed at **+13.2%** (5-seed range 0.1137–0.1243), unflagged | TNF32 is withdrawn for the exponent-window wrap defect at `:1596`/`:1607` and again at `:1699`. A 32-bit format inside a table headed "при равном или почти равном хранении" against binary16 | +| TNF16c margin recall | `:1582` | "+12.5%" | Article's own 5-seed figure is **+11.3%** (`:1638`, range 0.1118–0.1210), corroborated by `:1507` (0.1157/0.1039 = +11.4%). +12.5% is reachable only by mixing estimators (median vs range midpoint 0.1028) | +| Taper slopes | `:162`, `:167`, `:179`, `:190` | posit16: −0.254 (table), 0.261 (prose, R²=0.999), −0.2497. posit32: 0.247, −0.2505 | One quantity, defined at `:150` as dM_eff/d\|e\|. `:167` is provably reading `:162` (takum16 0.113 matches exactly). Corollary 3 at `:206` forecloses the fit-window excuse. The audit at `:2101` flags 0.247 as "измеренный здесь же … как 0,260" — 0.260 appears only in that audit cell | +| Bin tables vs ladder | `:251-253`, `:267-268`, `:281` | GF16 far bin 6.98e-3 (478 обрезано) and 6.76e-3 (478); TNF16 3.56/3.52/3.53 and 3.45/3.69/3.66 | Identical overflow count proves one sample set; the whole GF16 row disagrees (3.43/3.57 vs 3.56/3.52). Far-bin ratio vs takum16 printed 5.53× (`:253`), 5.49× (`:447`), 5.46× (`:440`), while `:449` claims all such ratios come from one script at one seed | +| int8 vs GFTernary | `:1396`, `:1400`, `:2406-2408` | `:1396` 454 LUT/78.83 MHz/**0.1736**, разброс 11.00; `:1400` **0.180 vs 0.181**, "неразличимы", разброс 16%; erratum: 0.1736 vs 0.1584 = **+9.60% для int8** | 0.180 and 0.181 appear nowhere else in the article or repo. GFTernary is 0.1584 in both the 5-seed (`:1245`) and 54-seed (`:1572`) tables. The document simultaneously says indistinguishable and int8-wins-by-9.6%. `:758` propagates the indistinguishability claim; `:1907` denies only the retracted 7% figure. The erratum's self-pointer "Строка 1369" is stale (numbers are at `:1396`) | +| Catalogue size | `:1270`, `:1613`, `:1617-1625`, `:1731-1756`, `:1774-1777`, `:2396` | 19 / 21 / 28 / 24 / 23 then 22 / 24 | Both catalogue tables have exactly **24** data rows over identical format names. Band 3 defined as "от fp8 e4m3 до GF+8" spans 16 rows, not the stated 20 | +| Staircase taxonomy | `:214` vs `:218-223` | 83 − 11 − 18 − 1 = **53** classifiable | Table sums 38+3+5+8 = **54** | +| Well-posedness | `:1830` vs `:1846` | posit32 divergences: **36** (table) / **48** (prose) | Same unreachable `casez` branch, same 40,000-code sample. Both entered in `9f54b0437`; the correct value is not determined by any file under `conformance/`, `research/` or `fpga/`. The parallel posit16 entry (4 in both `:1829` and `:1838`) shows the two must agree | +| Toolchain declaration | `:2288-2292`, `:1328` | Yosys 0.65, nextpnr-xilinx 1743d0f | Bench measured 2026-08-18: **Yosys 0.63 (`70a11c6b`), nextpnr `c32135b0`** (`:307-313`). The 2026-08-13 FPGA block at `:2477-2480` independently reports Yosys 0.63 / nextpnr `e4a261c` / Python 3.14.6. One declaration in 3 places, contradicted by 2 dated bench observations that differ from each other | +| Five-spec silicon | `:2782-2788` | ternary_link 118/16, e8m0 98/56, tnf17 86/16, phi_weights 86/16, ternary_node 92/16 | All five are even and inside the T504 doubling window. Halved they land one-to-one on T536's "IN WRAPPER" column: 59/8, 49/28, 43/8, 43/8, 46/8 (`IGLA-FORMAL-RESULTS.md:21758`). `ternary_node` at 46/8 is the one wrapper T536 proved had discarded its datapath (DUT alone needs 66 LUT / 24 CARRY4); T537 repaired it to **146/40** (`:21796`). The claim at `:2790` that zero DSP excludes the openXC7 defect class is contradicted by T616-T619 | +| Fan-in / MI | `:2753-2758` | "Монотонно по пяти датасетам"; mechanism "[измерено]"; form "не измерена" | All three overtaken by T484, T485, T483 (see §3) | + +### In the publication docs + +| Table | Line | What it says now | Current | +|---|---|---|---| +| `docs/PUBLICATION_AUDIT.md` row "Repro smoke bundle" | `:23` | Next action: add `rust-toolchain.toml` | File still absent | +| `docs/PUBLICATION_AUDIT.md` row 23 | `:26` | `docs/LANGUAGE_SPEC.md`, Ready? No | Path does not exist; file is `docs/nona-02-organism/LANGUAGE_SPEC.md` | +| `docs/PUBLICATION_AUDIT.md:53-58` W845 banner | `:57` | "2,863 lines, 95 sections, 70 tables, 93 status tags, 32 distinct theorem citations" | 2,890 lines; 101 status tags; 70 tables confirmed; the "32" is a raw `T` regex count including `GF-T8`, `GF-T16`, and pin names `T14`/`T15` — **23** distinct theorem ids | +| `docs/PUBLICATION_AUDIT.md:97` Blocker 3 | `:97` | "The article also carries no retractions section" | The article carries `# ЭРРАТУМ 2026-08-13` at `:2385` and a retraction-methodology section at `:2023` | +| `docs/PUBLICATION_QUEUE.md:13-16` | all 4 rows | Issue = `*open publication-task*`, DOI = `none` | No issue number was ever filled in, against the rule at `:22`. All TNF commits carry `Refs #1959`, which the repo's Issue Gate does not treat as closing | +| `docs/reports/tnf-sweep/2026-08-14-local-cost-sweep.md:41` and `:74-75` | body | 104-arm yosys LUT counts; E_t coefficient +330.0 / +393.2 | `docs/reports/PARSER-AUDIT-W719.md` proved these inflated **×4.00**; the same file's Addendum 3 (`:270`) silently prints the corrected **+127.5** without flagging the disagreement | +| Same file, `:193-197` | pre→post ratio | "1.0%–12.7%, mean 6.6%" below the yosys count | Withdrawn as backwards by T234a: placed LUT runs **74.7–98.1% above** the corrected yosys count | +| `.claude/skills/tnf-gfternary.md:603` | GA-T line | 1692 / 1371 / 1878 / 2349 / 2796 LUT | T234 corrected these to **564 / 457 / 626 / 783 / 932** (factor 3.00×, `IGLA-FORMAL-RESULTS.md:12392`). Skill last committed 2026-08-17 (`cf185dfb6`), three days after the audit, with no mention of W719 or T234 | +| `docs/reports/tnf-sweep/2026-08-14-post-route.tsv` | all rows | 7 unlabelled numeric columns | No header, date, tool version, part, or seed. Column 3 is the ×2-inflated yosys LUT; column 4 is the sound placed LUT; nothing distinguishes them (row 1: 1214 is double-counted, true 607; 1163 beside it is sound). Column 6 (557.4–1157.4 MHz) is unnamed, unused, and not a credible design F_max for an XC7A200T | +| `docs/reports/tnf-sweep/2026-08-14-post-route-ci-flags.tsv:1` | line 1 | A stray `grep -n` fragment showing line 20 of the driver script | Not data; breaks any TSV parse (20 data rows follow, naive readers get 21). It is simultaneously the only in-file record of the synthesis command | + +--- + +## 5. NOT ESTABLISHED + +- **Which posit32 divergence count is right, 36 or 48.** No file under `conformance/`, `research/` or `fpga/` records either. Both entered in the same commit, so neither is stale relative to the other. +- **Whether the toolchain difference between the two dated bench observations (nextpnr `e4a261c` on 2026-08-13, `c32135b0` on 2026-08-18) is an error or a legitimate rebuild.** No commit record ties either to a build. +- **What the TNF16 multiplier actually costs.** 212, 219 and 372 LUT are all published for the same rung; nothing in the repo adjudicates. +- **Whether the 15% seed spread cited in the 2026-08-18 provenance note (`:326-342`) applies to the ladder table's rows.** That spread was measured on a different, much slower netlist (15.83→18.29 MHz), and `:1241` reports a pooled seed CV of 3.71% on the throughput bench. The two are in tension and neither was re-measured on the ladder. +- **The absolute LUT overhead of the post-route harness.** `experiments/gfternary-line/tnf_postroute_wrap.py:10-13` asserts it is identical across arms and cancels in first differences; nothing measures it, and the file deliberately never reports it. +- **Whether `t27c silicon`'s five-spec figures can be reproduced.** The parser fix committed in W719 to `experiments/gfternary-line/run_ladder.sh:26-32` does not compile (IndentationError in the embedded Python heredoc), and `pnr.sh:42-43` still carries the original un-fixed `re.findall` over the whole log. All corrections to date were arithmetic rescalings; no artefact was regenerated. +- **Whether the raw 104-arm dataset can be recovered.** `yosys.tsv`, named at `docs/reports/tnf-sweep/2026-08-14-local-cost-sweep.md:133` as the evidence for Q1, Q2, the E_t finding and the DSP48E1 result, does not exist anywhere in the repository. Three of the record's four other provenance anchors are also unresolvable: `fpga/openxc7-synth/gen/gen_tnf_cost_sweep.py` (no `gen/` directory), `.github/workflows/tnf-cost-sweep.yml` (absent), and commit `9ce0d1129da5…` (`git cat-file` returns "could not get object info"). +- **The mechanism behind the seed-dependent verdict flip.** `IGLA-FORMAL-RESULTS.md:23746` (T605a) records arithmetic excluded by proof and Icarus, timing excluded by measurement, the effect reproduced across 3 designs / 2 arithmetic forms / 2 boards / 2 loads, and the mechanism not identified. T628 (`:24251`) notes the passing-vs-failing FASM diff has not been taken. +- **Whether `t27c silicon` figures for tnf17, phi_weights and ternary_link would survive a three-seed re-run.** Not attempted; only their timing margins were measured. + +--- + +*phi^2 + phi^-2 = 3 | TRINITY* diff --git a/apps/website/public/t27/files/docs/reports/TNF-ARTICLE-RECONCILIATION.md b/apps/website/public/t27/files/docs/reports/TNF-ARTICLE-RECONCILIATION.md new file mode 100644 index 0000000000..f7d5320c71 --- /dev/null +++ b/apps/website/public/t27/files/docs/reports/TNF-ARTICLE-RECONCILIATION.md @@ -0,0 +1,125 @@ +# TNF article -- reconciliation against W778-W788 + +**Status: the article is written and the week that just passed contradicts parts of it.** +`docs/theory/TNF_ARTICLE_RU.md`, 2,687 lines, ~55 sections. This file lists what must +change and which measurement forces each change. It is an audit, not a rewrite. + +Generated 2026-08-17 (W788). Every theorem cited is in `docs/theory/IGLA-FORMAL-RESULTS.md`. + +> ## ЧАСТИЧНО УСТАРЕЛ — прочитан заново 2026-08-18 (W845) +> +> Между W788 и сегодняшним днём прошло **пятьдесят семь витков**, и три пункта +> этого документа больше не описывают положение дел. +> +> **§0.3 «status tags ... Count in the article: zero» — неверно.** В статье +> **93** тега `[доказано]/[измерено]/[смоделировано]/[открытая гипотеза]`; +> их внесли коммитом того же дня. Пункт §0.2 (**нет раздела ретракций**) стоит: +> проверено, ноль. +> +> **§4 «Any claim resting on the connectivity thread ... None may appear until +> re-run» — линия перезапущена и разрешена.** T479 прогнал пять интервенций на +> Fashion, T480 — на MNIST. **T479a**: две интервенции, на которых стояла эта +> линия (сбалансированное покрытие T439, глубина T450), значимо положительны на +> Fashion и отрицательны на UNSW. **T479b** называет три утверждения, переживших +> три задачи. Но **шесть теорем (T430, T431, T432, T439, T443, T446) по-прежнему +> процитированы в статье по разу каждая** и не пересобраны под этот результат. +> +> **§0.1 «No theorem from T403-T457 appears in it» — разрыв вырос.** Статья +> цитирует 32 теоремы, максимальная — **T482**. Файл результатов дошёл до +> **T628a**. Появилась и новая, тяжёлая для статьи группа: **T616/T619a** — +> place-and-route на этом стенде не сохраняет функцию, и кремниевый вердикт с +> одного размещения перестал считаться результатом. Кремниевая таблица статьи +> снята с одного размещения. +> +> Три блокера перечислены в `docs/PUBLICATION_AUDIT.md` §W845, куда статья +> внесена — **до W845 её не было ни в одной таблице публикации**. + +--- + +## 0. Three facts about the article as it stands + +1. **No theorem from T403-T457 appears in it.** It predates every result of W778-W788. +2. **It carries no retractions section.** A draft abstract in scratch + (`abstract_tnf9.tex`) speaks of "twenty-three retractions"; the Russian article has none. +3. **It carries no status tags.** The tri-net handoff rule requires + `[доказано] / [измерено] / [смоделировано] / [открытая гипотеза]` on every claim. + Count in the article: **zero**. + +--- + +## 1. What SURVIVES untouched, and should lead + +| article claim | status | why it survives | +|---|---|---| +| Closure: `Z[φ]` is closed under weight application because `φ²=φ+1` | **[доказано]** | algebra, machine-checked in Coq per the article | +| Multiplier-free scales are exactly the algebraic integers whose companion matrix has entries in `{0,±1}`; degree 2 admits φ alone | **[доказано]** | an enumeration, and nothing this week touched it | +| The accumulator is the only site that needs a float | **[доказано]** | restated by T437a for a shared block scale | +| The width law: once range is named, the exponent/mantissa split is determined | **[измерено]** | untouched | +| 83-format catalogue resolves to four staircase forms | **[измерено]** | T405 ran the same catalogue through a different sieve and did not contradict it | + +**These are the article's spine and the week did not bend it.** + +--- + +## 2. What must be RE-SCOPED, with the measurement that forces it + +| article claim | forcing result | required change | +|---|---|---| +| "оптимум сползает вниз по иерархии: сдвиг на трёх битах, φ на четырёх, пластическое на пяти" | **T442**: every integer ladder with ≥2 magnitudes fails non-dominance, at every size; **T444**: over all 1156 admissible nine-level integer alphabets the optimum is `linear 9 = {0,±1,±2,±3,±4}`, rank 1 strictly | The ladder optimum is a **representation** claim. Say so explicitly, and add that in a **fan-in-3 truth-table datapath** the ranking is different and enumerated. | +| φ carries the interlayer scale the unit alphabet must learn | **T406**: `{0,±φ}` is single-lane because φ factors out as a common scale -- so does any `{0,±c}`. **T293/S3**: mixing powers of φ forces a two-lane resolve at 8 DSP48E1 or ~2750 LUT | The advantage is real **for one magnitude** and reverses **for a ladder**. State the split. | +| alphabet cardinality is a major accuracy lever | **T447**: measured on a normalised stand, 3→9 levels is **+0.26/+0.28 pp**, not +0.844 -- ~70 % of the published effect was a fixed-threshold trainer artefact | Restate the number. **T288's Nine-Rung Law is downgraded from law to measurement** (holds on Fashion, breaks on UNSW at 13 levels by +0.14 pp). | +| smaller alphabets are cheaper in silicon | **T448**: post-route, ternary `{0,±1}` costs **137 SLICE_LUTX** against dyadic-9's **137** and linear-9's **128**. A truth table is `2^(fanin×bits)` rows whatever the alphabet | **Cardinality is free in a table datapath** and costs only in an adder tree (T398: 203 vs 103). This is a section, not a footnote. | + +--- + +## 3. What must be ADDED, because it is new and it is ours + +| result | tag | one line | +|---|---|---| +| **T444** | **[доказано]** for the enumeration, **[измерено]** for the metric | `linear 9` is rank 1 of **1156** admissible nine-level integer alphabets; the bound is shown not to bind, so the optimum is global | +| **T442** | **[доказано]** | no integer ladder of ≥2 magnitudes clears non-dominance, at any size; exhaustive over `b∈[2,12]`, `k∈[2,12]`, margin exactly +1 at `b=2` | +| **T410 / T455** | **[измерено]** | junta degree → LUT area, slope **+151 LUT per unit**, 95 % CI **[+139,+189]**, Spearman **+1.000**, `n=5`, **at L=8**; the relation does **not** resolve at L=4 | +| **T413c / T456** | **[измерено]** | two independent trainer defects, each of which **reordered** arms rather than lowering them -- a fixed threshold (`r` flipped −0.971 → +0.956) and a one-class validation split (connectivity ordering reversed) | +| **T454** | **[измерено]** | twelve input bits cost **3.75×** six post-route on a layer, not the 20-27× implied by per-neuron figures | + +--- + +## 4. What must be REMOVED or held back + +- **Any claim resting on the connectivity thread.** T430, T431, T432, T439, T443, T446 + were all measured under the one-class validation split and their ordering **reverses** + when it is fixed (T456). None may appear until re-run. +- **Correlation coefficients as evidence.** T424: every `r` in this line is over 5-7 arms + *constructed* to vary in the predictor. Report slopes with intervals (§3). +- **"Effective fan-in"** as a coined term. It is ODIN's (arXiv:1804.07858) for accumulator + depth. Use **junta degree** / **dictator** / **linear threshold function** -- O'Donnell. + +--- + +## 5. Prior art that must be cited, and was not + +| claim in the article | who owns it | +|---|---| +| a neuron of ≤6 input bits costs ~2 LUT | **LogicNets**, arXiv:2004.03021 (their own NID configs run at **14** bits) | +| one weight dominating the rest collapses the function onto it | **Servedio**, critical-index / head-tail decomposition, arXiv:0902.3757 | +| the constant `x³=x²+x+1` | **OEIS A058265**, tribonacci | +| PoT quantisation has "rigid resolution" | **APoT**, Li/Dong/Wang ICLR 2020, arXiv:1909.13144 | +| BatchNorm folds into a threshold | **FINN** §4.2.2, arXiv:1612.07119; **TWN** arXiv:1605.04711 | +| per-LUT input count learned for area | **Logic Shrinkage**, 10.1145/3583075 | + +--- + +## 6. The honest headline the article can defend + +Not *"our format is better"* -- this project refuted that itself (T447, T448, T442). + +> **A methods paper**: low-precision benchmarks manufacture orderings that do not exist. +> Two independent trainer defects are demonstrated, each reversing the sign of a reported +> effect; parity with the published field is reached by removing them rather than by any +> architectural change (**T456b**: 4.76 pp against SparseLUT's 4.79). The alphabet work is +> reported as the negative result it is, with an exhaustive optimum (**T444**) and a +> measured area law (**T455**) as the constructive contributions. + +--- + +*φ² + φ⁻² = 3 | TRINITY* diff --git a/apps/website/public/t27/files/docs/system/alphabet.md b/apps/website/public/t27/files/docs/system/alphabet.md new file mode 100644 index 0000000000..f185a3ebca --- /dev/null +++ b/apps/website/public/t27/files/docs/system/alphabet.md @@ -0,0 +1,63 @@ +# The 27-agent alphabet + +## Twenty-seven letters, three nonas + +`docs/agents/AGENTS_ALPHABET.md` (v3.0, 2026-04-07) is the canon: "The Trinity system +employs 27 named agents -- corresponding to the 27 registers in `isa/registers.t27` +(Coptic / Trinity alphabet)." Each agent is bound to a letter and a register, has a domain +(physics, numeric, compiler, graph, experience, verdict, bench, DePIN, UI and so on), logs +to `.trinity/experience/` and is linked to nodes in `graph_v2.json`. + +The alphabet is read in three layers of nine, which the document also calls nonas: + +- **Archetypal, A-I (1-9)** -- "pure concept -- foundation: soul, base, types". A is the + architecture and `SOUL.md` as primary cause; C the compiler; E the experience; I the ISA. +- **Spiritual, J-R (10-18)** -- "inner process -- life of the system: tasks, language, + numbers, physics". L is the language; M the metrics; N the numeric formats; P the physics + constants; Q the queue. +- **Physical, S-27th (19-27)** -- "manifestation -- proof: standards, verdict, deploy, + gift". S is the specs; T the Queen, who "puts the final seal on everything"; V the + verdict; W the workflow and tri cell ("double hash-seal"); Z the zero-touch UX and docs; + the 27th letter, Ti, is security. + +The same three-by-nine layout organises the documentation tree of the repository +(`docs/nona-01-foundation/`, `docs/nona-02-organism/`, `docs/nona-03-manifest/`, Article +DOCS-TREE of the constitution) and the ring on the site next to this chapter, where each +letter sits at its ordinal and is coloured by its layer. + +## The table + +The table the site renders next to this chapter is generated from +`public/agents/spec-agents.json`, which is itself generated from the 27 files +`specs/agents/.t27` through the compiler wasm -- it is not typed here. Per letter it +shows the ordinal, the letter name, the domain, the archetype, the register, the layer, and +the skills and tools the agent holds with their evidence. The FULL TABLE of the alphabet +document (letter, domain, archetype, key files, entry invariant, exit invariant, CLARA role) +is the source each spec was transcribed from; the spec's header names the row. + +Two conventions of the table are worth stating. A letter's register comes from the schema +section of the alphabet document (for example T is R19, V is R21, W is R22); the ordinal is +the position in the alphabet, 1..27, so T is 20 and the 27th letter is 27. Where the +alphabet document names two agents with the same Greek letter name (C and G are both +written "Gamma"), the spec keeps the document's spelling and the ID stays unambiguous +because it is the Latin letter, `t27/C` and `t27/G`. + +## What a card carries + +Beyond the alphabet row, an agent card on the site carries what the other layers say about +the letter: + +- **Skills** -- IDs from `specs/skills` the agent holds, bound only where a source names the + skill. At the commit this documentation was generated from one letter holds skills: T, + from `.claude/agents/trinity.md`, which names `phi-loop` and `tri-pipeline` in its Phase 2 + and Phase 4. The other 26 carry an empty list and a note saying which sources were read. +- **Tools** -- IDs from `specs/tools` the agent holds, bound in both directions (the tool + spec names the letter back). Five commands are bound today: `tri gen` (C, T), `tri test` + (T, V), `tri verdict` (V), `tri experience` (E), `tri cell` (W); the sources are the phase + descriptions of the alphabet document and the `.claude/agents/*.md` files. +- **Crons** -- jobs whose `RUNS` names a skill the agent holds; empty while every `RUNS` is + empty. +- **Experience** -- episodes attributed to the letter in `.trinity/experience/`; none is + attributed today, and the card says so rather than showing a number it cannot source. +- **Sources** -- the three binding documents (`SOUL.md`, `AGENTS.md`, the alphabet) at the + pinned commit, and the spec file itself. diff --git a/apps/website/public/t27/files/docs/system/evidence.md b/apps/website/public/t27/files/docs/system/evidence.md new file mode 100644 index 0000000000..b08bc02541 --- /dev/null +++ b/apps/website/public/t27/files/docs/system/evidence.md @@ -0,0 +1,92 @@ +# Evidence and witnesses + +## Measured, declared, external + +The project separates what was measured from what was declared, and both from what was taken +from outside. The tags are defined in the chapter "The project"; this chapter says how each tag is +earned on the site. + +A **measured** number has a producer in a repository -- a script, a workflow, a test -- whose +output is committed or published, and the page names the commit. The ladder counts, the +`typecheck.ok` verdicts, the coverage of a translation bundle, the number of episodes in an +experience tree are measured in this sense: the generator that produces them runs in +`prebuild` and its inputs are pinned. + +A **declared** value is stated in a spec or a canon document. The catalog size of 83 +formats, the seven laws, the seven phases are declared: the site renders them from the file +that states them and links the file at the commit, but running nothing. + +An **external** value is cited with its source and not reproduced. The site does not restate +hardware figures of `gHashTag/trinity-fpga` beyond what `siliconHistory.ts` transcribes with +its provenance note. + +## Witness labels + +Each catalog card carries a witness label that says how the card relates to the thing it +describes: + +- Skills and crons: `spec+code` (spec and source both exist), `spec-only` (spec without + source), `code-only` (source without spec). The counts per label are in the header of the + Skill and Cron Explorers. +- Tools: `source-parse` (the command list was read from the source at a recorded commit; + `cargo` was not run) or `help-output` (the list was diffed against `tri --help`). At the + commit this documentation was generated from every tri card is `source-parse`. +- Agents: each skill and tool binding cites a source line in `SKILLS_NOTE` / `TOOLS_NOTE`, or + the list is empty and the note says what was read. +- Experience: attributed only where an episode names a letter; otherwise counted as + unattributed, never guessed. + +The table the site renders next to this chapter collects these labels with their counts from +the generated JSON of every layer. + +## Wasm verdicts + +Every `.t27` the site shows was compiled at build time by the vendored `t27_compiler.wasm`, +and the JSON records `typecheck.ok` per file. Two limits of that verdict are stated on every +layer README and repeated here. First, the wasm's `typecheck.ok` is necessary, not +sufficient: it stays `true` for a wrong annotation such as `str = 5`, so the generator checks +the field schema of every card on top of it. Second, the bootstrap compiler on `master` was +not run against the catalog files in the commits that added them; the wasm is a build of the +compiler at a recorded sha, and that sha is in the generated JSON. + +## CI gates + +`gHashTag/t27` gates a pull request with workflows named for what they check (issue gate, +gate topology, conformance integrity, emit bit-exact, catalog count, now-sync, untrusted +input, among others under `.github/workflows/`). Two of them, `gate-topology` and +`untrusted-input`, fail on `master` for already-merged pull requests at the time of writing; +the catalog pull requests record this and do not bless or bypass them. + +`gHashTag/trinity` gates the site with `npm run` checks that run in `prebuild` and in CI: +`check:spec-catalog`, `check:skills-catalog`, `check:crons-catalog`, `check:agents`, +`check:tools`, `check:docs`, the explorer and Queen language contracts, the Queen viewport +contract, `typecheck:ratchet` and `eslint`. A check that fails on `main` before a change is +reported as pre-existing, with its name, and is not counted as passing. + +## Reproducing a number + +To reproduce a count on the site, run the generator that produced it, in `apps/website` of +a checkout of `gHashTag/trinity`, with a sibling checkout of `gHashTag/t27` (or `T27_ROOT` +pointing to one): + +- `node scripts/agents-from-specs.mjs` -- skills, crons, agents, tools JSON and their counts; + `--check` compares against the committed JSON. +- `node scripts/docs-from-specs.mjs` -- this documentation's JSON, including the sources with + their sha256 and the pinned commit. +- `node scripts/sync-agents-experience.mjs` -- the experience snapshot. +- `npm run check:docs` -- the chapter bodies, the sources, the generated tables, the + forbidden-words scan in English and Russian. + +Each JSON names the commit its inputs were read at. Comparing that commit with the one in +front of you is step one of any reproduction; a number that cannot be tied to a +commit is not a measurement. + +## Published record + +Two kinds of record exist outside the generated pages, and this documentation points to +them without adding to their claims. The TNF manuscript audit and reconciliation reports +live under `docs/reports/` in `gHashTag/t27` (`TNF-ARTICLE-AUDIT-W845.md`, +`TNF-ARTICLE-RECONCILIATION.md`); they record which statements of the article were checked +against which producer and what changed. The Zenodo README (`README-ZENODO.md`) describes +the archived package. No scientific claim is made in this documentation that is not in those +files or in the site's own content with its status tag. diff --git a/apps/website/public/t27/files/docs/system/layers.md b/apps/website/public/t27/files/docs/system/layers.md new file mode 100644 index 0000000000..a074219668 --- /dev/null +++ b/apps/website/public/t27/files/docs/system/layers.md @@ -0,0 +1,83 @@ +# The five-layer system + +The site orders what the repositories ship into five layers and shows the same ladder in +the header of every Explorer: **Specs -> Skills -> Crons -> Agents -> Tools**. Each layer +is a directory of `.t27` files in `gHashTag/t27`, each has a README that states its schema, +and each is rendered from those files by one generator through the compiler wasm. The +ladder counts on the site are read from the generated JSON at build time; the table next +to this chapter shows them for the commit the documentation was generated from. + +## Specs + +The base layer is the `.t27` corpus itself: everything under `specs/` in `gHashTag/t27`, +from the language core and the numeric formats to the catalogs below. The site vendors a +byte-identical copy under `apps/website/public/t27/files/` and compiles every file with the +vendored `t27_compiler.wasm` at build time. The Spec Explorer (`#/specs`) shows each file +with its verdict; the manifest that lists them (`public/t27/manifest.json`) is generated +and never hand-edited. + +## Skills + +A skill is a published procedure an agent can run -- a `SKILL.md` in one of the +repositories. `specs/skills/.t27` declares each one (KIND, ID, NAME, REPO, SOURCE, +SUMMARY_EN, COMMAND, SPECS, TAGS, ENABLED, TIMEOUT_MIN). The witness label on a skill card +says how the card relates to the code: `spec+code` when both the spec and the `SKILL.md` +exist, `spec-only` when only the spec does, `code-only` when a skill file has no spec yet. +Skill Explorer: `#/skills`. + +## Crons + +A cron is a scheduled job: a workflow schedule, a Railway timer, a daemon loop. +`specs/crons/.t27` declares each (HOST, REPO, SERVICE, INTERVAL_MS, TZ, RUNS, +RUNS_NOTE, ENABLED, NOTE, ON_FAILURE, CONTROL). `RUNS` lists the skill IDs a job invokes, +and only where the source shows the invocation; where none is found `RUNS` is empty and +`RUNS_NOTE` says so ("no skill invocation found in source"). The Cron Explorer (`#/crons`) +computes the next firing from `INTERVAL_MS` and `TZ`. A job that runs no skill is a job the +site cannot tie to the layers above; that is recorded, not hidden. + +## Agents + +The 27 letters of the alphabet, one spec each: `specs/agents/.t27` with LETTER, +ORDINAL, LETTER_NAME, NAME, DOMAIN, ARCHETYPE, REGISTER, LAYER, SUMMARY_EN, the three +binding documents (SOUL, AGENTS_DOC, ALPHABET), KEY_FILES, the entry and exit invariants, +CLARA_ROLE, SKILLS with SKILLS_NOTE and TOOLS with TOOLS_NOTE. An agent holds a skill or a +tool only where a source line binds it -- a `.claude/agents/*.md` file, the alphabet, a +phase description -- and the note cites that line or says why the list is empty. The +generator fails the build on an unknown skill or tool ID and on a binding stated on one +side only. Agent Explorer: `#/agents`. The full table is the next chapter. + +## Tools + +What an agent can call: the commands of the `tri` CLI and the tools of the MCP servers. +`specs/tools/tri/.t27` is read from the clap `Commands` enum in +`cli/tri/src/main.rs` (one card per variant, with its nested actions and arguments); +`specs/tools/mcp/.t27` from the server sources, manifests and `.mcp.json` entries of +both repositories, with the tool names, descriptions and input-schema keys. The witness on a +tri card is `source-parse` (the enum was read at a recorded commit) until someone diffs the +list against `tri --help` and relabels it `help-output`. Servers whose code is a published +package outside the repositories carry `EXTERNAL = true`. Tool Explorer: `#/tools`. + +## From spec to site + +One generator, `scripts/agents-from-specs.mjs` in `gHashTag/trinity`, reads the vendored +`.t27` files, compiles each through the wasm, reads the constants of the compiled module, +checks them against the schema of the layer, resolves every cross-reference (skill IDs in +crons and agents, tool IDs in agents, agent letters in tools, spec paths in skills), and +writes one JSON per layer under `public/`. It runs in `prebuild`, so a spec that does not +compile or a reference that does not resolve stops the site from building. No `.t27` is +parsed with a regular expression anywhere in that path. + +Translations follow the same rule. `specs/i18n/-.t27` declares which fields +of which specs a bundle may translate and where the bundle lives; the bundle +(`apps/website/i18n/*.json`) carries the text; the generator checks that every bundle entry +names an existing spec and reports coverage. The specs stay English-only. + +## Experience + +Agents log what happened under `.trinity/experience/` in each repository: episodes as JSON, +notes as Markdown. `scripts/sync-agents-experience.mjs` reads both trees at their current +commit and writes `public/agents/experience.json` with counts per repository and, where an +episode names an agent letter, the attribution. At the commit this documentation was +generated from no episode is attributed to any letter -- the field the sync looks for is +absent from every episode -- and the agent cards say so. The snapshot records the commit of +each tree, not the path of the checkout. diff --git a/apps/website/public/t27/files/docs/system/project.md b/apps/website/public/t27/files/docs/system/project.md new file mode 100644 index 0000000000..ad5b37f0a6 --- /dev/null +++ b/apps/website/public/t27/files/docs/system/project.md @@ -0,0 +1,91 @@ +# The project + +## What t27 and Trinity are + +**t27** is a specification language and a toolchain. A `.t27` file declares behaviour, +constants, tests and invariants in one place; the compiler (`t27c`, driven by the `tri` +command) validates the file, generates code for the target backends (Zig, C, Verilog) and +runs the tests written inside the spec. The repository `gHashTag/t27` holds the language, +the compiler, the spec corpus and the canon documents that govern how agents and people +work in it (`SOUL.md`, `AGENTS.md`, `docs/T27-CONSTITUTION.md`). + +**Trinity** is the programme around t27: the GoldenFloat family of numeric formats built on +the identity phi^2 + 1/phi^2 = 3, hardware validation of those formats on one FPGA board, +and the public site `t27.ai` (repository `gHashTag/trinity`, `apps/website`) that renders +the spec corpus, the skills, the scheduled jobs, the agents and the tools through the real +compiler compiled to WebAssembly. The site does not paraphrase the specs; it compiles them +in the browser build and shows the verdicts. + +The rule that ties the two together is spec-first: project logic originates in `.t27`, and +host languages -- Rust for the bootstrap compiler, TypeScript for the site, Zig, C and +Verilog as generated output -- are subordinate implementations. `docs/T27-CONSTITUTION.md`, +Article SSOT-MATH, states it for mathematics and numerics; `AGENTS.md` section 3 restates +it for every change ("Specs are source of truth"). + +## Claims and their status + +Every claim in this documentation carries one of five status tags, and the table the site +renders next to this chapter repeats them with their source file: + +- `[measured]` -- a number produced by running something whose output is in a repository + or a public CI log, with the command and the commit recorded. +- `[declared]` -- stated in a spec or a canon document; not (yet) exercised by a run. +- `[specified]` -- exists as a `.t27` spec that typechecks; no implementation is claimed. +- `[external]` -- a value taken from a source outside the two repositories; cited, not + reproduced here. +- `[not claimed]` -- explicitly outside what the project asserts today. + +The statements this chapter is prepared to make, with their tags: + +- The GoldenFloat catalog holds 83 formats `[declared]` -- `FAMILY_TOTALS.catalog` in + `trinity:apps/website/src/data/siliconHistory.ts`, transcribed from the hardware + conformance report of `gHashTag/trinity-fpga` (v0.2), which is the published source of + every hardware figure on the site. +- Hardware numbers exist for a subset of the catalog `[measured]`: at v0.2 the same file + records 27 formats at Tier E (public chain: CI run id, bitstream SHA-256, JTAG flash, + UART log), 13 with decode in hardware, 7 with ADD and 7 with MUL in hardware, and 62 with + a bit-exact software reference. The union of the hardware axes is a smaller number than + 83; the exact union is stated in the trinity-fpga report and is not restated here. +- Every hardware number was measured on one board `[measured]`: ALINX AX7203, Xilinx + Artix-7 `xc7a200tfbg484-2`, open toolchain (yosys, nextpnr-xilinx, Project X-Ray), + `DEVICE` and `TOOLCHAIN` in the same file. +- Skills, crons, agents and tools on the site are generated from `.t27` specs through the + vendored compiler wasm `[measured]`: the counts are in the ladder header of every + Explorer and in the "Evidence and witnesses" chapter; `typecheck.ok` for each spec is + recorded in the JSON the site serves. + +## Boundaries + +What the project does **not** claim, in its own words: + +- **No silicon.** `[not claimed]` A SKY130 design was prepared through Tiny Tapeout; the + TTSKY26a/TTSKY26b submissions were withdrawn before fabrication and refunded, so no die + exists and no measurement on silicon is claimed (`trinity:apps/website/src/content/tnf.ts`, + the "Is this an ASIC result?" answer). ASIC mapping and multi-corner characterisation are + not claimed either. The hardware boundary is the FPGA named above. +- **No ranking words.** The canon forbids "first", "only", "best" and their translations in + first-party prose; the site's QA (`check:docs`, `check:queen-honesty`) fails a build that + contains them. Comparisons are stated as numbers with a source or not at all. +- **The Verilog the t27 compiler emits from a format spec is a module shell** -- across the + corpus it yields 0 LUTs and 0 flip-flops (`siliconHistory.ts`, provenance note). The + silicon results belong to hand-written RTL verified against an independent oracle. The + spec and the RTL describe the same format; they are not the same artifact. +- **`typecheck.ok` from the wasm is necessary, not sufficient.** It stays `true` for a wrong + annotation such as `str = 5`; the site's generators check the field schema of every card + on top of it (`specs/skills/README.md`). +- **Two repositories, two lists.** Tools, agents and jobs of `gHashTag/t27` and of + `gHashTag/trinity` are recorded under their own `REPO`; nothing is merged into one list. + +## How to read this documentation + +The seven chapters are declared in `specs/docs/system.t27` and one spec per chapter under +`specs/docs/chapters/`. Each chapter spec names its `SOURCES` (the files it quotes), its +`SECTIONS` (the headings of this Markdown, checked at build time), the figure the site draws +from data (`DIAGRAM`) and the table it generates from the catalogs (`TABLE`). The English +prose is canonical and lives in `docs/system/.md` in `gHashTag/t27`; the Russian text +travels through the translation contract `specs/i18n/docs-ru.t27` and the bundle it names +in `gHashTag/trinity`. When the two disagree, English wins. + +Every figure on the site carries a caption and a data-source line: the JSON it was drawn +from and the commit that JSON was generated at. Every table is generated; none is typed by +hand. A number without a source line is a defect -- report it as one. diff --git a/apps/website/public/t27/files/docs/system/queen.md b/apps/website/public/t27/files/docs/system/queen.md new file mode 100644 index 0000000000..0cb6e67e37 --- /dev/null +++ b/apps/website/public/t27/files/docs/system/queen.md @@ -0,0 +1,68 @@ +# Queen orchestration + +## The six-phase cycle and Phase 7 + +Agent T, the Queen, is the central orchestrator: "reads `graph_v2.json` and knows all module +dependencies", "conducts 26 sub-agents (A..Z, except T) by their domains", gathers results, +validates architecture invariants and enforces that the source of truth is in `.t27` / `.tri` +with Zig, Verilog and C only as backends (`docs/agents/AGENTS_ALPHABET.md`, section +"AGENT T -- QUEEN TRINITY", Responsibilities). Her module is `specs/queen/lotus.t27`. + +The alphabet document draws the cycle she runs as six phases and a seventh added by the SOUL +law on git. The site renders the cycle from that document; in short: + +1. **PLAN** -- analyse the task and select a strategy; read `graph_v2.json` for impact; + decide which agents participate; check `.trinity/experience/` for similar tasks. +2. **ASSIGN** -- distribute tasks to agents by domain (A architecture, N numeric, P physics, + F conformance, ...); set dependencies; create a tri cell for each agent (W seals). +3. **RUN** -- parallel execution; heartbeats; agents report to `.trinity/agent_events.jsonl`; + T redistributes if necessary. +4. **TEST & BENCH** -- F checks conformance vectors, V runs benchmarks, G measures impact + changes; metrics are collected in M for V's verdict. +5. **VERDICT** -- V analyses the metrics; `tri verdict --toxic` asks whether the change is + toxic; E records the experience; if toxic, Q blocks the task. +6. **EVOLVE** -- update `graph_v2.json` if dependencies changed; update experience in E and + M; S updates standards; W seals the tri-cell commit; Z updates documentation; T puts the + final TAW seal. +7. **GIT WORKFLOW** ("new -- SOUL law") -- `tri git commit --all -m "cell:{id} issue:{N} ..."`, + `tri git push origin HEAD` in strict mode; checks: sealed cell, non-toxic verdict, + artifacts; the registry records the commit hash and the pushed flag. + +The document's SOUL law for TDD follows the seventh phase: "Any P0/P1 episode in `--strict` +mode is considered COMPLETE only after successful `tri git push` to `github.com/gHashTag/t27` +with bound sealed-cell and non-toxic verdict." Where an agent letter appears in a phase +description, the tools chapter and the agent cards use that line as the source of a binding +(`tri cell` to W, `tri verdict` to V). + +## Cell, seal, verdict + +Three tri commands carry the cycle's state; two of them have a spec under `specs/tools/tri/` +read from the clap enum of `cli/tri/src/main.rs`: + +- **`tri cell`** -- the unit of work of one agent: created in ASSIGN, sealed by W with a hash + in EVOLVE. Nested actions are listed on the tool card (`specs/tools/tri/cell.t27`). +- **`tri verdict`** -- V's decision over the metrics; `--toxic` is the question the cycle asks + in VERDICT (`specs/tools/tri/verdict.t27`). +- **`tri git`** -- the seventh phase as the alphabet document writes it. At the commit this + documentation was generated from the clap enum of `cli/tri/src/main.rs` has no `git` + variant, so the tool catalog has no card for it; the phase is documented from the alphabet + and marked `[declared]`, and the gap is recorded here rather than filled with a card. + +The seal itself is a hash. At the compiler level the same idea is the seal of the bootstrap +compiler (`bootstrap/stage0/FROZEN_HASH`, `CANON.md` section 0) and the ring canon: a ring +freezes when its hash is recorded, and drift between the recorded seal and the working tree +is a fact the dashboard shows. + +## Two statements of the loop + +The repository states the Queen's loop twice, and the two statements differ. The alphabet +document gives the seven phases above (PLAN, ASSIGN, RUN, TEST & BENCH, VERDICT, EVOLVE, GIT +WORKFLOW). `CLAUDE.md`, "Autonomous Execution Loop (AEL v2.0)", gives a six-phase loop for +an agent operating as the Queen -- OBSERVE (E), PLAN (T), DELEGATE (C/V), VERIFY (V), +SYNTHESIZE (L), LEARN (L) -- and, separately, the nine-phase PHI LOOP for ring-based +development (Issue, Spec, TDD, Code, Gen, Seal, Verify, Land, Learn). + +This documentation renders the alphabet's cycle, because it is the one that names the tri +commands and the agent letters per phase, and records the AEL loop as the second statement +without reconciling them. Which one binds an autonomous agent in a given situation is a +question for `AGENTS.md` and its owners, not for a generated page. diff --git a/apps/website/public/t27/files/docs/system/rules.md b/apps/website/public/t27/files/docs/system/rules.md new file mode 100644 index 0000000000..39ee7e4ea2 --- /dev/null +++ b/apps/website/public/t27/files/docs/system/rules.md @@ -0,0 +1,129 @@ +# Constitution and the rules of the game for agents + +## The constitutional stack + +`AGENTS.md` is the entry point for humans and coding agents; its first section fixes the +reading order and which document wins when two disagree: + +1. `SOUL.md` -- the canonical constitution: language policy, TDD mandate, validation. +2. `docs/nona-03-manifest/SOUL.md` -- the expanded reference; if it conflicts with root + `SOUL.md`, root wins. +3. `docs/T27-CONSTITUTION.md` -- Articles SSOT-MATH, LANG-EN and DOCS-TREE, and the + invariant laws. +4. `TASK.md` with `docs/coordination/TASK_PROTOCOL.md` -- multi-agent coordination, locks, + anchor issue. +5. The nearest `OWNERS.md` -- domain ownership for the directories you edit. + +`CLAUDE.md` adds the operational loop for an autonomous agent and says, in its first line, +that repo-specific law always overrides generic tooling defaults. The rest of this chapter +quotes these files; the site links each quotation to the file at the commit the +documentation was generated from. + +## SOUL articles + +`SOUL.md` is organised in articles. The ones every change touches: + +- **Article I, The Language Policy.** Source files must be ASCII-only (U+0000..U+007F); + identifiers and comments must be English. The rule names `.t27`, `.tri`, `.zig`, `.c`, + `.h`, `.v` and build scripts. Cyrillic and other non-Latin scripts are forbidden in + identifiers and comments unless an Architect-approved exception exists (section 1.1). + First-party documentation is English (section 1.2, restated as Article LANG-EN of the + constitution). +- **Article II, The TDD Mandate.** "Every `.t27` specification MUST contain at least one of" + a `.test` section, an `.invariant` section or a `.bench` section. "No exceptions. A spec + without tests is not a specification -- it is a draft." (section 2.1, the Iron Law). +- **Article III, No Prototype Mode.** There is no `--allow-no-tests` flag and no grace + period; the parser rejects a spec without tests with `TDD contract violated`. +- **Article IV, Validation Requirements.** Enforcement at parser level, at codegen level and + at build time. +- **Article V, Amendment Process.** What can and cannot be amended. +- **Article VI, Enforcement.** Agent compliance, human compliance, automated enforcement. +- **Article VII, Sacred Trinity.** Three pillars: the identity phi^2 + 1/phi^2 = 3, ternary + computation, and TDD inside the spec. "Violating any violates the whole." +- **Article VIII, NO-NEW-SHELL.** No new `*.sh` on the engineering critical path; the + permitted exceptions are the exec-only shim `scripts/tri` and the one-time + `scripts/setup-git-hooks.sh`. Section 8.3 extends the rule to Python: validation, + conformance gates and doc language checks live in `t27c` (Rust). + +The catalog specs under `specs/skills`, `specs/crons`, `specs/agents`, `specs/tools` and +`specs/docs` are declarative constant modules and carry no `.test` block; the site's +generators check their field schema instead. Whether Article II applies to declarative +catalog modules is not decided in `SOUL.md` today; this documentation records the practice +and does not claim a ruling. + +## Invariant laws and their priority + +`docs/T27-CONSTITUTION.md`, section 2, defines seven Invariant Laws that "never change +without constitutional amendment". The site renders the table from that file; in short: + +- **L1 TRACEABILITY** -- no code merged without `Closes #N`; every PR references an issue. + Enforced by `.github/workflows/issue-gate.yml`. +- **L2 GENERATION** -- files under `gen/` are generated; edit the `.t27` spec instead. +- **L3 PURITY** -- ASCII-only identifiers and comments in `.t27`, `.zig`, `.v`, `.c`. +- **L4 TESTABILITY** -- every `.t27` spec must contain `test`, `invariant` or `bench`. +- **L5 IDENTITY** -- phi^2 = phi + 1 on the reals, hence phi^2 + 1/phi^2 = 3; IEEE + binary64 checks use a tolerance. +- **L6 CEILING** -- `conformance/FORMAT-SPEC-001.json` and `specs/numeric/gf16.t27` are the + numeric ceiling, never forked. +- **L7 UNITY** -- no new `*.sh` on the critical path for validation, generation or data; + `t27c` and `tri` only. + +Priority is Asimov-style: L1 > L2 > L3 > L4 > L5 > L6 > L7. "In conflict scenarios, the +higher-priority law prevails." The legacy names (ISSUE-GATE, NO-HAND-EDIT-GEN, SOUL-ASCII, +TDD-MANDATE, PHI-IDENTITY, TRINITY-SACRED, NO-NEW-SHELL) map one-to-one onto L1..L7 in the +constitution's alias index. + +One discrepancy is recorded rather than resolved: `AGENTS.md` section 5 speaks of "the seven +Invariant Laws (L1-L8)" and writes the priority as "L1 > ... > L8", while its table and the +constitution define L1..L7 only. No L8 is defined in either file at the commit this +documentation was generated from. The figure next to this chapter therefore shows seven +laws. + +## Non-negotiables for changes + +`AGENTS.md` section 3 lists six non-negotiables, quoted in short: + +1. Specs are source of truth -- behaviour belongs in `.t27` / `.tri`; generated `gen/` + output is not hand-edited except for documented exceptions. +2. TDD inside specs -- new or changed specs need `test`, `invariant` and/or `bench` where + SOUL requires it. +3. English + ASCII -- first-party Markdown and source comments per LANG-EN and ADR-004. +4. No new Python on the verification critical path. +5. Issue gate -- PRs link issues (`Closes #N`) where project policy requires it. +6. Ring / gold work -- parser, compiler and spec changes follow the golden-rings canon; the + compiler seal path is `bootstrap/stage0/FROZEN_HASH`. + +Two rules of this documentation's own owner belong beside them, because the site enforces +them: no absolute developer home path in any committed file (a checkout is `T27_ROOT` or +`git rev-parse --show-toplevel`), and no hand edits to generated manifests -- change the +spec and regenerate. + +## TASK protocol + +`docs/coordination/TASK_PROTOCOL.md` governs how several agents work in one tree at the same +time. Its artifacts are the root `TASK.md` (anchor link, protocol version, locks, handoff +log, work units) and the protocol document itself. The semantics, in short: + +- **Lock (soft).** Before editing sensitive paths the active agent should set lock holder, + lock scope and lock until in the coordination state; others must not override without a + handoff-log entry and an epoch bump. Locks are "social + procedural", not file locks. +- **Epoch.** A version counter for the coordination state. +- **Handoff log.** Append-preferred; handoffs are treated "like narrow API contracts". +- **Read / write order.** `github-sync.json` (queue snapshot), then `TASK.md` (locks and + handoffs), then the anchor issue, then the target issue for the code change (section 4.4). + +Validation of `TASK.md`'s shape is automated (section 5); verification is human plus CI +(section 6). + +## Issue gate and TDD mandate + +The issue gate is law L1 in executable form: the constitution names +`.github/workflows/issue-gate.yml` as the enforcement of "no code merged without `Closes #N`". Everything the site documents +came in through it -- the skills, crons, agents, tools and docs catalogs each have their +issue and their `docs/now/` entry. + +The TDD mandate is law L4 and SOUL Article II in executable form: the parser rejects a spec +without a `test`, `invariant` or `bench` block. For the catalog specs the site adds its own +gate on top: a generator that compiles every card through the wasm and fails on a schema +violation, an unknown cross-reference, or a binding stated on one side only (an agent that +names a tool the tool does not name back, and the reverse). diff --git a/apps/website/public/t27/files/docs/system/tooling.md b/apps/website/public/t27/files/docs/system/tooling.md new file mode 100644 index 0000000000..9376732102 --- /dev/null +++ b/apps/website/public/t27/files/docs/system/tooling.md @@ -0,0 +1,58 @@ +# Tooling + +## The tri CLI + +`tri` is the command of the toolchain: `./scripts/tri` is an exec-only shim (SOUL Article +VIII, section 8.2) that resolves the Rust binary `t27c`, passes `--repo-root` and executes +it. The catalog in `specs/tools/tri/` holds one spec per variant of the clap `Commands` enum +in `cli/tri/src/main.rs`: the command word, the enum variant, the source file and the entry +point, the doc comment as `ABOUT` with `ABOUT_SOURCE` naming where the text came from, the +nested actions with their own doc comments, the arguments, the agent letters that own the +command with the evidence line, when to use it, and the witness. + +The table the site renders next to this chapter is generated from +`public/tools/spec-tools.json` -- command, actions, owners, witness -- and the counts in its +header are read from the same file. The witness on every tri card at the commit this +documentation was generated from is `source-parse`: the enum and its `///` comments were +read from the source at a recorded commit, and `cargo` was not run. A card is relabelled +`help-output` only when someone diffs the list against `tri --help` and records the result; +until then the label says what was and was not done. + +Commands whose variant has no doc comment quote the source they borrow their description +from (for example `tri cell` quotes the `tri-mcp` tool descriptions), so that no `ABOUT` is +invented. + +## MCP servers + +The second family is the Model Context Protocol servers the two repositories ship or +register: for `gHashTag/t27` the `tri-mcp` crate, the `tri-ssot` manifest, `t27-traceability` +and the entries of `.mcp.json`; for `gHashTag/trinity` the `trinity` and `needle` Zig servers +and its `.mcp.json` entries. `specs/tools/mcp/.t27` carries the launch line, +transport, version, environment variables, config path, repository, source, the tool names +with descriptions and input-schema keys, resources, and the witness. + +Servers whose code is a published package outside the repositories carry `EXTERNAL = true` +and a `TOOLS_NOTE` saying the tool list is not in either tree; nothing is invented for them. +Two facts are recorded rather than fixed: `tri-mcp` is not registered in `.mcp.json` at the +pinned commit (`CONFIG` is empty), and the `tri-ssot` manifest names a module the tree does +not contain. + +Two repositories are two lists. `gHashTag/trinity` has no `tri` binary at the pinned commit +(`build.zig` defines none; its `.claude/skills/tri/SKILL.md` is a skill and is in the skills +catalog), so its tools are its MCP servers only, under `REPO = "gHashTag/trinity"`. + +## Who owns a tool + +A tool names the agent letters that own it (`AGENTS`) only where a source line does, and +`AGENTS_NOTE` cites that line or names the sources that were checked and found silent. The +agent spec names the tool back (`TOOLS`), and the site's generator fails the build on a +binding stated on one side only. Today five commands are bound -- `tri gen` (C, T), +`tri test` (T, V), `tri verdict` (V), `tri experience` (E), `tri cell` (W) -- from the phase +descriptions of `docs/agents/AGENTS_ALPHABET.md` and the `.claude/agents/*.md` files; the +other commands and every MCP server carry an empty `AGENTS` with a note. Skills are +cross-linked when a skill spec's own `COMMAND` or `SUMMARY_EN` names a tri command. + +The map the site draws next to this chapter groups the tri commands by owning letter (with a +group for the unowned) and the MCP servers by repository, with the external ones marked. It +is drawn from the generated JSON, so a new binding in a spec moves a command on the map +without anyone editing the figure. diff --git a/apps/website/public/t27/files/specs/docs/README.md b/apps/website/public/t27/files/specs/docs/README.md new file mode 100644 index 0000000000..bab4d50a5e --- /dev/null +++ b/apps/website/public/t27/files/specs/docs/README.md @@ -0,0 +1,90 @@ +# specs/docs — the system documentation as a declared document + +> **Where this lives.** `specs/docs/` and the Markdown bodies under `docs/system/` in +> `gHashTag/t27` are the canonical home of the system documentation — edit them here. +> `gHashTag/trinity` keeps a byte-identical vendored copy under +> `apps/website/public/t27/files/specs/docs/` and `apps/website/public/t27/files/docs/system/`; +> its build reads that copy through the vendored compiler wasm (`t27_compiler.wasm`) and +> renders it at `t27.ai/#/docs`. The wasm's `typecheck.ok` is necessary, not sufficient, so +> the site's generator (`scripts/docs-from-specs.mjs`) also checks the field schema below. +> The bootstrap compiler on `master` was not run against these files in the commit that +> added them. A checkout of this repository is referred to as `T27_ROOT` (an environment +> variable) or `git rev-parse --show-toplevel`; no file here names an absolute path. + +The documentation describes the project, the rules of the game for agents, the five-layer +system (Specs -> Skills -> Crons -> Agents -> Tools), the 27-agent alphabet, the Queen's +cycle, the tooling and the evidence. One `.t27` module declares the document, one per +chapter declares the chapter; the English prose is Markdown in `docs/system/.md` +(LANG-EN: canonical prose is English and lives outside the spec); the Russian prose travels +through the translation contract `specs/i18n/docs-ru.t27` and the bundle it names. + +Nothing in `public/docs/system-docs.json` on the site is typed by hand: chapters, sections, +tables (laws, phases, agents, tools, ladder counts, witnesses) and the source list with +sha256 per file are generated from these specs and the catalogs they point to. + +## Files + +| File | Module | Role | +|---|---|---| +| `system.t27` | `docs_system` | The document: `KIND = "docs"`, `ID`, `TITLE`, `CHAPTERS` (ids in reading order), `SOURCES` (catalogs and canon documents), `DIAGRAMS` (figures the site draws from data), `LOCALES`, `ENABLED` | +| `chapters/.t27` | `docs_chapter_` | One chapter: `KIND = "docs-chapter"`, `ID = "docs/"`, `DOCUMENT`, `ORDER`, `TITLE`, `SOURCES`, `SECTIONS`, `DIAGRAM`, `TABLE`, `BODY_EN`, `ENABLED` | +| `../i18n/docs-ru.t27` | `i18n_docs_ru` | Translation contract for Russian: scope, fields, bundle path in `gHashTag/trinity` | +| `../../docs/system/.md` | — | English canonical prose of chapter ``; every `SECTIONS` entry is a level-2 heading, in order | + +## Chapters + +| Order | ID | Title | Figure | Table | +|---|---|---|---|---| +| 1 | `docs/project` | The project | `ladder` | `claims` | +| 2 | `docs/rules` | Constitution and the rules of the game for agents | `law-hierarchy` | `laws` | +| 3 | `docs/layers` | The five-layer system | `skills-crons-agents` | `ladder-counts` | +| 4 | `docs/alphabet` | The 27-agent alphabet | `agent-ring` | `agents` | +| 5 | `docs/queen` | Queen orchestration | `phase-cycle` | `phases` | +| 6 | `docs/tooling` | Tooling | `tools-map` | `tools` | +| 7 | `docs/evidence` | Evidence and witnesses | — | `witnesses` | + +## Schema + +`system.t27` + +| Constant | Type | Meaning | +|---|---|---| +| `KIND` | `str` | Always `"docs"` | +| `ID` | `str` | `"docs/system"` | +| `TITLE` | `str` | Document title, English | +| `CHAPTERS` | `[N]str` | Chapter ids in reading order; each must resolve to `chapters/.t27` with `ENABLED = true` | +| `SOURCES` | `[N]str` | Catalog directories and canon files the chapters draw on; each must exist in the tree | +| `DIAGRAMS` | `[N]str` | Figure ids the site knows how to draw; a chapter's `DIAGRAM` must be one of them or empty | +| `LOCALES` | `[N]str` | `"en"` first; each other locale must have `specs/i18n/docs-.t27` | +| `ENABLED` | `bool` | Whether the site renders the document | + +`chapters/.t27` + +| Constant | Type | Meaning | +|---|---|---| +| `KIND` | `str` | Always `"docs-chapter"` | +| `ID` | `str` | `"docs/"`, `` = file stem | +| `DOCUMENT` | `str` | `"docs/system"` | +| `ORDER` | `u8` | Position in the document; must match the index in `CHAPTERS` | +| `TITLE` | `str` | Chapter title, English | +| `SOURCES` | `[N]str` | Files the chapter quotes or is generated from; paths from the t27 root, or from the trinity root with the prefix `trinity:`; each must exist | +| `SECTIONS` | `[N]str` | Section headings in order; the body must carry each as `## ` in the same order, and no other level-2 heading | +| `DIAGRAM` | `str` | One of `DIAGRAMS` or `""` | +| `TABLE` | `str` | One of `claims`, `laws`, `ladder-counts`, `agents`, `phases`, `tools`, `witnesses`, or `""`; the generator must be able to produce it non-empty | +| `BODY_EN` | `str` | `docs/system/.md`; must exist and start with a level-1 heading | +| `ENABLED` | `bool` | Whether the chapter is rendered | + +## Rules of the catalog + +- English and ASCII only in the `.t27` and in `docs/system/*.md` (SOUL Article I, LANG-EN); + translations live in bundles declared by `specs/i18n/docs-.t27`. +- No ranking words ("first", "only", "best" and their translations) in English or Russian + prose; the site's `check:docs` fails a build that contains them. +- Every number in the prose carries a status tag (`[measured]`, `[declared]`, `[specified]`, + `[external]`, `[not claimed]`) or is generated into a table with a source line. +- Quote canon files; do not paraphrase a rule into a stronger one. Where two canon files + disagree, record the disagreement (the chapters do this for L1-L7 versus "L1-L8" and for + the two statements of the Queen's loop). +- Change the spec or the body and regenerate; never edit `public/docs/system-docs.json`. +- Ownership: `Z-Zeta` (documentation), with `T-Queen` for the orchestration chapter + (`specs/OWNERS.md`). diff --git a/apps/website/public/t27/files/specs/docs/chapters/alphabet.t27 b/apps/website/public/t27/files/specs/docs/chapters/alphabet.t27 new file mode 100644 index 0000000000..a99cf0d0da --- /dev/null +++ b/apps/website/public/t27/files/specs/docs/chapters/alphabet.t27 @@ -0,0 +1,30 @@ +// SPDX-License-Identifier: Apache-2.0 +; specs/docs/chapters/alphabet.t27 -- chapter 4 of the system documentation, docs/alphabet +; Source of truth for the system documentation on t27.ai (#/docs). The English prose +; lives in the Markdown file named by BODY_EN (LANG-EN: canonical prose is English); +; this module declares the chapter's identity, its sections, its sources and the +; figure and table the site renders from data. The JSON the site serves is generated +; from this file by the real compiler, nothing below is parsed with a regex. ASCII only (L3). +; phi^2 + 1/phi^2 = 3 | TRINITY + +module docs_chapter_alphabet; + +pub const KIND : str = "docs-chapter"; +pub const ID : str = "docs/alphabet"; +pub const DOCUMENT : str = "docs/system"; +; position in the document, 1..7 +pub const ORDER : u8 = 4; +pub const TITLE : str = "The 27-agent alphabet"; +; Repository files this chapter quotes or is generated from (paths from the t27 root, +; or from the trinity root when prefixed with trinity:). +pub const SOURCES : [2]str = ["docs/agents/AGENTS_ALPHABET.md", "specs/agents/README.md"]; +; Section headings, in order. The Markdown body must carry each as a level-2 heading. +pub const SECTIONS : [3]str = ["Twenty-seven letters, three nonas", "The table", "What a card carries"]; +; Figure the site renders from data next to this chapter; one of DIAGRAMS in system.t27, +; or empty when the chapter has none. +pub const DIAGRAM : str = "agent-ring"; +; Generated table the site renders from the catalogs; empty when the chapter has none. +pub const TABLE : str = "agents"; +; English canonical prose, Markdown, path from the t27 root. +pub const BODY_EN : str = "docs/system/alphabet.md"; +pub const ENABLED : bool = true; diff --git a/apps/website/public/t27/files/specs/docs/chapters/evidence.t27 b/apps/website/public/t27/files/specs/docs/chapters/evidence.t27 new file mode 100644 index 0000000000..717e93edba --- /dev/null +++ b/apps/website/public/t27/files/specs/docs/chapters/evidence.t27 @@ -0,0 +1,30 @@ +// SPDX-License-Identifier: Apache-2.0 +; specs/docs/chapters/evidence.t27 -- chapter 7 of the system documentation, docs/evidence +; Source of truth for the system documentation on t27.ai (#/docs). The English prose +; lives in the Markdown file named by BODY_EN (LANG-EN: canonical prose is English); +; this module declares the chapter's identity, its sections, its sources and the +; figure and table the site renders from data. The JSON the site serves is generated +; from this file by the real compiler, nothing below is parsed with a regex. ASCII only (L3). +; phi^2 + 1/phi^2 = 3 | TRINITY + +module docs_chapter_evidence; + +pub const KIND : str = "docs-chapter"; +pub const ID : str = "docs/evidence"; +pub const DOCUMENT : str = "docs/system"; +; position in the document, 1..7 +pub const ORDER : u8 = 7; +pub const TITLE : str = "Evidence and witnesses"; +; Repository files this chapter quotes or is generated from (paths from the t27 root, +; or from the trinity root when prefixed with trinity:). +pub const SOURCES : [5]str = ["specs/skills/README.md", "specs/tools/README.md", "README-ZENODO.md", "docs/reports/TNF-ARTICLE-AUDIT-W845.md", "docs/reports/TNF-ARTICLE-RECONCILIATION.md"]; +; Section headings, in order. The Markdown body must carry each as a level-2 heading. +pub const SECTIONS : [6]str = ["Measured, declared, external", "Witness labels", "Wasm verdicts", "CI gates", "Reproducing a number", "Published record"]; +; Figure the site renders from data next to this chapter; one of DIAGRAMS in system.t27, +; or empty when the chapter has none. +pub const DIAGRAM : str = ""; +; Generated table the site renders from the catalogs; empty when the chapter has none. +pub const TABLE : str = "witnesses"; +; English canonical prose, Markdown, path from the t27 root. +pub const BODY_EN : str = "docs/system/evidence.md"; +pub const ENABLED : bool = true; diff --git a/apps/website/public/t27/files/specs/docs/chapters/layers.t27 b/apps/website/public/t27/files/specs/docs/chapters/layers.t27 new file mode 100644 index 0000000000..44bfffb3b1 --- /dev/null +++ b/apps/website/public/t27/files/specs/docs/chapters/layers.t27 @@ -0,0 +1,30 @@ +// SPDX-License-Identifier: Apache-2.0 +; specs/docs/chapters/layers.t27 -- chapter 3 of the system documentation, docs/layers +; Source of truth for the system documentation on t27.ai (#/docs). The English prose +; lives in the Markdown file named by BODY_EN (LANG-EN: canonical prose is English); +; this module declares the chapter's identity, its sections, its sources and the +; figure and table the site renders from data. The JSON the site serves is generated +; from this file by the real compiler, nothing below is parsed with a regex. ASCII only (L3). +; phi^2 + 1/phi^2 = 3 | TRINITY + +module docs_chapter_layers; + +pub const KIND : str = "docs-chapter"; +pub const ID : str = "docs/layers"; +pub const DOCUMENT : str = "docs/system"; +; position in the document, 1..7 +pub const ORDER : u8 = 3; +pub const TITLE : str = "The five-layer system"; +; Repository files this chapter quotes or is generated from (paths from the t27 root, +; or from the trinity root when prefixed with trinity:). +pub const SOURCES : [5]str = ["specs/skills/README.md", "specs/crons/README.md", "specs/agents/README.md", "specs/tools/README.md", "specs/i18n/agents-ru.t27"]; +; Section headings, in order. The Markdown body must carry each as a level-2 heading. +pub const SECTIONS : [7]str = ["Specs", "Skills", "Crons", "Agents", "Tools", "From spec to site", "Experience"]; +; Figure the site renders from data next to this chapter; one of DIAGRAMS in system.t27, +; or empty when the chapter has none. +pub const DIAGRAM : str = "skills-crons-agents"; +; Generated table the site renders from the catalogs; empty when the chapter has none. +pub const TABLE : str = "ladder-counts"; +; English canonical prose, Markdown, path from the t27 root. +pub const BODY_EN : str = "docs/system/layers.md"; +pub const ENABLED : bool = true; diff --git a/apps/website/public/t27/files/specs/docs/chapters/project.t27 b/apps/website/public/t27/files/specs/docs/chapters/project.t27 new file mode 100644 index 0000000000..39d4cf559a --- /dev/null +++ b/apps/website/public/t27/files/specs/docs/chapters/project.t27 @@ -0,0 +1,30 @@ +// SPDX-License-Identifier: Apache-2.0 +; specs/docs/chapters/project.t27 -- chapter 1 of the system documentation, docs/project +; Source of truth for the system documentation on t27.ai (#/docs). The English prose +; lives in the Markdown file named by BODY_EN (LANG-EN: canonical prose is English); +; this module declares the chapter's identity, its sections, its sources and the +; figure and table the site renders from data. The JSON the site serves is generated +; from this file by the real compiler, nothing below is parsed with a regex. ASCII only (L3). +; phi^2 + 1/phi^2 = 3 | TRINITY + +module docs_chapter_project; + +pub const KIND : str = "docs-chapter"; +pub const ID : str = "docs/project"; +pub const DOCUMENT : str = "docs/system"; +; position in the document, 1..7 +pub const ORDER : u8 = 1; +pub const TITLE : str = "The project"; +; Repository files this chapter quotes or is generated from (paths from the t27 root, +; or from the trinity root when prefixed with trinity:). +pub const SOURCES : [5]str = ["SOUL.md", "AGENTS.md", "specs/docs/system.t27", "trinity:apps/website/src/data/siliconHistory.ts", "trinity:apps/website/src/content/tnf.ts"]; +; Section headings, in order. The Markdown body must carry each as a level-2 heading. +pub const SECTIONS : [4]str = ["What t27 and Trinity are", "Claims and their status", "Boundaries", "How to read this documentation"]; +; Figure the site renders from data next to this chapter; one of DIAGRAMS in system.t27, +; or empty when the chapter has none. +pub const DIAGRAM : str = "ladder"; +; Generated table the site renders from the catalogs; empty when the chapter has none. +pub const TABLE : str = "claims"; +; English canonical prose, Markdown, path from the t27 root. +pub const BODY_EN : str = "docs/system/project.md"; +pub const ENABLED : bool = true; diff --git a/apps/website/public/t27/files/specs/docs/chapters/queen.t27 b/apps/website/public/t27/files/specs/docs/chapters/queen.t27 new file mode 100644 index 0000000000..a13f81f2a5 --- /dev/null +++ b/apps/website/public/t27/files/specs/docs/chapters/queen.t27 @@ -0,0 +1,30 @@ +// SPDX-License-Identifier: Apache-2.0 +; specs/docs/chapters/queen.t27 -- chapter 5 of the system documentation, docs/queen +; Source of truth for the system documentation on t27.ai (#/docs). The English prose +; lives in the Markdown file named by BODY_EN (LANG-EN: canonical prose is English); +; this module declares the chapter's identity, its sections, its sources and the +; figure and table the site renders from data. The JSON the site serves is generated +; from this file by the real compiler, nothing below is parsed with a regex. ASCII only (L3). +; phi^2 + 1/phi^2 = 3 | TRINITY + +module docs_chapter_queen; + +pub const KIND : str = "docs-chapter"; +pub const ID : str = "docs/queen"; +pub const DOCUMENT : str = "docs/system"; +; position in the document, 1..7 +pub const ORDER : u8 = 5; +pub const TITLE : str = "Queen orchestration"; +; Repository files this chapter quotes or is generated from (paths from the t27 root, +; or from the trinity root when prefixed with trinity:). +pub const SOURCES : [5]str = ["docs/agents/AGENTS_ALPHABET.md", "CLAUDE.md", "specs/agents/t.t27", "specs/tools/tri/cell.t27", "specs/tools/tri/verdict.t27"]; +; Section headings, in order. The Markdown body must carry each as a level-2 heading. +pub const SECTIONS : [3]str = ["The six-phase cycle and Phase 7", "Cell, seal, verdict", "Two statements of the loop"]; +; Figure the site renders from data next to this chapter; one of DIAGRAMS in system.t27, +; or empty when the chapter has none. +pub const DIAGRAM : str = "phase-cycle"; +; Generated table the site renders from the catalogs; empty when the chapter has none. +pub const TABLE : str = "phases"; +; English canonical prose, Markdown, path from the t27 root. +pub const BODY_EN : str = "docs/system/queen.md"; +pub const ENABLED : bool = true; diff --git a/apps/website/public/t27/files/specs/docs/chapters/rules.t27 b/apps/website/public/t27/files/specs/docs/chapters/rules.t27 new file mode 100644 index 0000000000..2b8c290d5f --- /dev/null +++ b/apps/website/public/t27/files/specs/docs/chapters/rules.t27 @@ -0,0 +1,30 @@ +// SPDX-License-Identifier: Apache-2.0 +; specs/docs/chapters/rules.t27 -- chapter 2 of the system documentation, docs/rules +; Source of truth for the system documentation on t27.ai (#/docs). The English prose +; lives in the Markdown file named by BODY_EN (LANG-EN: canonical prose is English); +; this module declares the chapter's identity, its sections, its sources and the +; figure and table the site renders from data. The JSON the site serves is generated +; from this file by the real compiler, nothing below is parsed with a regex. ASCII only (L3). +; phi^2 + 1/phi^2 = 3 | TRINITY + +module docs_chapter_rules; + +pub const KIND : str = "docs-chapter"; +pub const ID : str = "docs/rules"; +pub const DOCUMENT : str = "docs/system"; +; position in the document, 1..7 +pub const ORDER : u8 = 2; +pub const TITLE : str = "Constitution and the rules of the game for agents"; +; Repository files this chapter quotes or is generated from (paths from the t27 root, +; or from the trinity root when prefixed with trinity:). +pub const SOURCES : [5]str = ["SOUL.md", "AGENTS.md", "CLAUDE.md", "docs/T27-CONSTITUTION.md", "docs/coordination/TASK_PROTOCOL.md"]; +; Section headings, in order. The Markdown body must carry each as a level-2 heading. +pub const SECTIONS : [6]str = ["The constitutional stack", "SOUL articles", "Invariant laws and their priority", "Non-negotiables for changes", "TASK protocol", "Issue gate and TDD mandate"]; +; Figure the site renders from data next to this chapter; one of DIAGRAMS in system.t27, +; or empty when the chapter has none. +pub const DIAGRAM : str = "law-hierarchy"; +; Generated table the site renders from the catalogs; empty when the chapter has none. +pub const TABLE : str = "laws"; +; English canonical prose, Markdown, path from the t27 root. +pub const BODY_EN : str = "docs/system/rules.md"; +pub const ENABLED : bool = true; diff --git a/apps/website/public/t27/files/specs/docs/chapters/tooling.t27 b/apps/website/public/t27/files/specs/docs/chapters/tooling.t27 new file mode 100644 index 0000000000..eb6bc352c3 --- /dev/null +++ b/apps/website/public/t27/files/specs/docs/chapters/tooling.t27 @@ -0,0 +1,30 @@ +// SPDX-License-Identifier: Apache-2.0 +; specs/docs/chapters/tooling.t27 -- chapter 6 of the system documentation, docs/tooling +; Source of truth for the system documentation on t27.ai (#/docs). The English prose +; lives in the Markdown file named by BODY_EN (LANG-EN: canonical prose is English); +; this module declares the chapter's identity, its sections, its sources and the +; figure and table the site renders from data. The JSON the site serves is generated +; from this file by the real compiler, nothing below is parsed with a regex. ASCII only (L3). +; phi^2 + 1/phi^2 = 3 | TRINITY + +module docs_chapter_tooling; + +pub const KIND : str = "docs-chapter"; +pub const ID : str = "docs/tooling"; +pub const DOCUMENT : str = "docs/system"; +; position in the document, 1..7 +pub const ORDER : u8 = 6; +pub const TITLE : str = "Tooling"; +; Repository files this chapter quotes or is generated from (paths from the t27 root, +; or from the trinity root when prefixed with trinity:). +pub const SOURCES : [4]str = ["specs/tools/README.md", "specs/tools/tri/cell.t27", "specs/agents/README.md", "SOUL.md"]; +; Section headings, in order. The Markdown body must carry each as a level-2 heading. +pub const SECTIONS : [3]str = ["The tri CLI", "MCP servers", "Who owns a tool"]; +; Figure the site renders from data next to this chapter; one of DIAGRAMS in system.t27, +; or empty when the chapter has none. +pub const DIAGRAM : str = "tools-map"; +; Generated table the site renders from the catalogs; empty when the chapter has none. +pub const TABLE : str = "tools"; +; English canonical prose, Markdown, path from the t27 root. +pub const BODY_EN : str = "docs/system/tooling.md"; +pub const ENABLED : bool = true; diff --git a/apps/website/public/t27/files/specs/docs/system.t27 b/apps/website/public/t27/files/specs/docs/system.t27 new file mode 100644 index 0000000000..4337212e02 --- /dev/null +++ b/apps/website/public/t27/files/specs/docs/system.t27 @@ -0,0 +1,23 @@ +// SPDX-License-Identifier: Apache-2.0 +; specs/docs/system.t27 -- the system documentation of t27 / Trinity as one declared document +; Source of truth for the system documentation on t27.ai (#/docs). The English prose +; lives in the Markdown file named by BODY_EN (LANG-EN: canonical prose is English); +; this module declares the chapter's identity, its sections, its sources and the +; figure and table the site renders from data. The JSON the site serves is generated +; from this file by the real compiler, nothing below is parsed with a regex. ASCII only (L3). +; phi^2 + 1/phi^2 = 3 | TRINITY + +module docs_system; + +pub const KIND : str = "docs"; +pub const ID : str = "docs/system"; +pub const TITLE : str = "t27 / Trinity -- the system, its rules and its evidence"; +; Chapter IDs in reading order; each resolves to specs/docs/chapters/.t27. +pub const CHAPTERS : [7]str = ["project", "rules", "layers", "alphabet", "queen", "tooling", "evidence"]; +; Catalogs and canon documents the chapters are generated from or quote. +pub const SOURCES : [10]str = ["specs/skills", "specs/crons", "specs/agents", "specs/tools", "specs/i18n", "SOUL.md", "AGENTS.md", "CLAUDE.md", "docs/agents/AGENTS_ALPHABET.md", "docs/T27-CONSTITUTION.md"]; +; Figures the site renders from data (inline SVG, no static images); a chapter names one. +pub const DIAGRAMS : [6]str = ["ladder", "agent-ring", "phase-cycle", "law-hierarchy", "skills-crons-agents", "tools-map"]; +; Locales the site serves; "en" is canonical, others come through specs/i18n/docs-.t27. +pub const LOCALES : [2]str = ["en", "ru"]; +pub const ENABLED : bool = true; diff --git a/apps/website/public/t27/files/specs/i18n/docs-ru.t27 b/apps/website/public/t27/files/specs/i18n/docs-ru.t27 new file mode 100644 index 0000000000..9a0096e9cd --- /dev/null +++ b/apps/website/public/t27/files/specs/i18n/docs-ru.t27 @@ -0,0 +1,34 @@ +// SPDX-License-Identifier: Apache-2.0 +; specs/i18n/docs-ru.t27 -- translation contract, Russian, for the system documentation +; Specs are English-only (LANG-EN). This module does not carry a single translated +; word: it declares WHICH fields of WHICH specs a bundle may translate, WHERE that +; bundle lives and HOW it is keyed, and what the site must do when a translation +; is missing. The Cyrillic payload is in the bundle file named below, never here. +; One module per locale: copy this file to docs-.t27 and change LOCALE and +; BUNDLE_PATH; the generator discovers every specs/i18n/*.t27 and hardcodes no +; locale list. +; phi^2 + 1/phi^2 = 3 | TRINITY + +module i18n_docs_ru; + +pub const KIND : str = "i18n"; +pub const LOCALE : str = "ru"; +pub const SOURCE_LOCALE : str = "en"; +; Spec directories whose modules this bundle may translate; an entry ID must +; resolve to a spec in one of them. +pub const SCOPE : [2]str = ["specs/docs", "specs/docs/chapters"]; +; Spec fields a bundle entry may carry. TITLE maps to TITLE; BODY maps to the Markdown +; body named by BODY_EN and must carry the same level-2 headings, in the same order. +pub const FIELDS : [2]str = ["TITLE", "BODY"]; +pub const BUNDLE_REPO : str = "trinity"; +pub const BUNDLE_PATH : str = "apps/website/i18n/docs.ru.json"; +pub const BUNDLE_FORMAT : str = "json"; +; Bundle entries are keyed by the spec's ID constant. +pub const KEY : str = "ID"; +; What the site shows when an entry or a field has no translation. +pub const FALLBACK : str = "en"; +; false: a chapter with no translation is a warning, not a build failure. +pub const COVERAGE_REQUIRED : bool = false; +; false: a bundle entry whose ID matches no spec in SCOPE fails the build. +pub const ORPHANS_ALLOWED : bool = false; +pub const ENABLED : bool = true; diff --git a/apps/website/public/tools/spec-tools.json b/apps/website/public/tools/spec-tools.json index 90f3d3254d..f9c412e783 100644 --- a/apps/website/public/tools/spec-tools.json +++ b/apps/website/public/tools/spec-tools.json @@ -1 +1 @@ -{"compilerWasmSha256":"4d9c0447b5ca288790ab03d3dffc2dda629ed47af9d6731a105fc923aea0aee4","contentSha256":"dccb0ca4a4fbd94b6e764586c724c71580bd37ae059385beef770e4dbe070570","counts":{"byRepo":{"gHashTag/t27":57,"gHashTag/trinity":5},"byWitness":{"help-output":0,"source-parse":62},"enabled":62,"mcp":10,"mcpExternal":5,"mcpTools":235,"mcpWithTools":5,"specs":62,"tri":52,"triActions":124,"triWithActions":38,"typecheckOk":62,"withAgents":5,"withSkills":5},"generatedAt":"2026-09-09T17:04:02.832Z","groups":{"mcpByRepo":{"gHashTag/t27":["mcp/gitbutler","mcp/notebooklm","mcp/t27-traceability","mcp/tri-mcp","mcp/tri-ssot"],"gHashTag/trinity":["mcp/needle","mcp/neon","mcp/railway-mcp-server","mcp/trinity","mcp/zig-docs"]},"triByAgent":{"-":["tri/abandoned","tri/census","tri/ci","tri/competitors","tri/discard","tri/doctor","tri/elab","tri/emit","tri/fleet","tri/fmt","tri/fpga","tri/gates","tri/harness","tri/health","tri/hooks","tri/issues","tri/jumps","tri/kinds","tri/lean","tri/ledgers","tri/loop","tri/merging","tri/misread","tri/mods","tri/mutate","tri/now","tri/one-away","tri/orphaned","tri/pr","tri/prose","tri/quantifiers","tri/red","tri/reseal","tri/rtl","tri/seals","tri/serve","tri/skill","tri/status","tri/sweep","tri/synth","tri/topic","tri/types","tri/unparsed","tri/vectors","tri/vsim","tri/window","tri/worktrees"],"C":["tri/gen"],"E":["tri/experience"],"T":["tri/gen","tri/test"],"V":["tri/test","tri/verdict"],"W":["tri/cell"]}},"i18n":[{"bundle":"apps/website/i18n/agents.ru.json","coverage":{"n":62,"total":62},"enabled":true,"fields":["SUMMARY","NAME"],"locale":"ru","missing":[],"scope":["specs/skills","specs/crons","specs/agents","specs/functions","specs/tools"],"sha256":"c8871fb4ccdef8fc3cc2937af5db0e307ab0b62f6a03ece9f4512851ffd64f04","spec":"specs/i18n/agents-ru.t27"}],"ladder":{"agents":27,"crons":33,"functions":28,"skills":26,"specs":760,"tools":62},"pin":{"ref":"95c9b61b97d487bec4279ca63eb3132da8d1721c","source":"public/agents/experience.json sources[t27].commit"},"tools":[{"aboutSource":".mcp.json entry; no tool list in this repository","agents":[],"config":".mcp.json","discarded":0,"env":["GITBUTLER_REPO"],"external":true,"family":"mcp","fields":{"ABOUT":"External GitButler MCP server launched as `but mcp`; the repository only registers it in .mcp.json.","ABOUT_SOURCE":".mcp.json entry; no tool list in this repository","AGENTS":[],"AGENTS_NOTE":"No source binds an agent letter to this server: docs/agents/AGENTS_ALPHABET.md, specs/OWNERS.md and .claude/agents/*.md do not name it.","CONFIG":".mcp.json","ENABLED":true,"ENV":["GITBUTLER_REPO"],"EXTERNAL":true,"FAMILY":"mcp","ID":"mcp/gitbutler","KIND":"tool","LAUNCH":"but mcp","REPO":"gHashTag/t27","RESOURCES":[],"RESOURCES_ABOUT":[],"SERVER":"gitbutler","SERVER_VERSION":"","SOURCE":".mcp.json","TOOLS":[],"TOOLS_ABOUT":[],"TOOLS_INPUTS":[],"TOOLS_NOTE":"Tool list lives in the external `but` binary, not in this repository; nothing is listed rather than guessed.","TRANSPORT":"stdio","WITNESS":"source-parse"},"health":"ok","id":"mcp/gitbutler","inSpecCorpus":false,"launch":"but mcp","links":{"config":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/.mcp.json","pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","source":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/.mcp.json"},"messages":["no agent letter bound by a source","external package: tool list not in the repository"],"moduleName":"tool_mcp_gitbutler","name":{"en":"gitbutler"},"repo":"gHashTag/t27","resources":[],"searchText":"mcp/gitbutler gitbutler external gitbutler mcp server launched as `but mcp`; the repository only registers it in .mcp.json.","server":"gitbutler","serverVersion":"","sha256":"56d901fa1f8c7594e141cd115f7e17ccee544135fafa3b287aaf4f4a96b63506","skills":[],"source":".mcp.json","specPath":"specs/tools/mcp/gitbutler.t27","summary":{"en":"External GitButler MCP server launched as `but mcp`; the repository only registers it in .mcp.json.","ru":"Внешний MCP-сервер GitButler, запускаемый как `but mcp`; репозиторий лишь регистрирует его в .mcp.json."},"tools":[],"toolsNote":"Tool list lives in the external `but` binary, not in this repository; nothing is listed rather than guessed.","transport":"stdio","typecheckOk":true,"witness":"source-parse"},{"aboutSource":"derived from the tool descriptions in tools/mcp/needle_mcp/server.zig","agents":[],"config":".claude-plugin/.mcp.json","discarded":0,"env":[],"external":false,"family":"mcp","fields":{"ABOUT":"Zig MCP server for AST-aware code editing (needle): structural search and replace, quality gates, preview.","ABOUT_SOURCE":"derived from the tool descriptions in tools/mcp/needle_mcp/server.zig","AGENTS":[],"AGENTS_NOTE":"No source binds an agent letter to this server: docs/agents/AGENTS_ALPHABET.md, specs/OWNERS.md and .claude/agents/*.md do not name it.","CONFIG":".claude-plugin/.mcp.json","ENABLED":true,"ENV":[],"EXTERNAL":false,"FAMILY":"mcp","ID":"mcp/needle","KIND":"tool","LAUNCH":"/zig-out/bin/needle-mcp","REPO":"gHashTag/trinity","RESOURCES":[],"RESOURCES_ABOUT":[],"SERVER":"needle","SERVER_VERSION":"","SOURCE":"tools/mcp/needle_mcp/server.zig","TOOLS":["needle_structural_replace","needle_search","needle_quality_gates","needle_preview","needle_batch_edit","needle_autonomous_refactor"],"TOOLS_ABOUT":["Apply AST-aware code edit with Tier 0->1 fallback and safety gates","Search codebase for pattern matches with confidence scores","Run quality gates: parse check, AST analysis, violation detection","Preview edit diff without applying changes","Apply multiple edits in a single operation","Execute Ralph Loop: intent-aware refactoring using semantic search + HNSW + VSA validation"],"TOOLS_INPUTS":["","","","","",""],"TOOLS_NOTE":"Input schema keys were not extracted for this server (schemas are inline Zig literals); names and descriptions only. The .claude-plugin/.mcp.json command is an absolute path into a developer checkout; its home prefix is written as here (no home paths in specs).","TRANSPORT":"stdio","WITNESS":"source-parse"},"health":"ok","id":"mcp/needle","inSpecCorpus":false,"launch":"/zig-out/bin/needle-mcp","links":{"config":"https://github.com/gHashTag/trinity/blob/da84d38795aa97f9170bb670f04a328032aa6ffe/.claude-plugin/.mcp.json","pinnedAt":"da84d38795aa97f9170bb670f04a328032aa6ffe","source":"https://github.com/gHashTag/trinity/blob/da84d38795aa97f9170bb670f04a328032aa6ffe/tools/mcp/needle_mcp/server.zig"},"messages":["no agent letter bound by a source"],"moduleName":"tool_mcp_needle","name":{"en":"needle"},"repo":"gHashTag/trinity","resources":[],"searchText":"mcp/needle needle zig mcp server for ast-aware code editing (needle): structural search and replace, quality gates, preview. needle_structural_replace apply ast-aware code edit with tier 0->1 fallback and safety gates needle_search search codebase for pattern matches with confidence scores needle_quality_gates run quality gates: parse check, ast analysis, violation detection needle_preview preview edit diff without applying changes needle_batch_edit apply multiple edits in a single operation needle_autonomous_refactor execute ralph loop: intent-aware refactoring using semantic search + hnsw + vsa validation","server":"needle","serverVersion":"","sha256":"7acdef65de4c51c365937bdefaa53bf4324731210892f4fb6763769e243d62fa","skills":[],"source":"tools/mcp/needle_mcp/server.zig","specPath":"specs/tools/mcp/needle.t27","summary":{"en":"Zig MCP server for AST-aware code editing (needle): structural search and replace, quality gates, preview.","ru":"MCP-сервер на Zig для AST-осознанного редактирования кода (needle): структурный поиск и замена, гейты качества, предпросмотр."},"tools":[{"about":"Apply AST-aware code edit with Tier 0->1 fallback and safety gates","inputs":[],"name":"needle_structural_replace"},{"about":"Search codebase for pattern matches with confidence scores","inputs":[],"name":"needle_search"},{"about":"Run quality gates: parse check, AST analysis, violation detection","inputs":[],"name":"needle_quality_gates"},{"about":"Preview edit diff without applying changes","inputs":[],"name":"needle_preview"},{"about":"Apply multiple edits in a single operation","inputs":[],"name":"needle_batch_edit"},{"about":"Execute Ralph Loop: intent-aware refactoring using semantic search + HNSW + VSA validation","inputs":[],"name":"needle_autonomous_refactor"}],"toolsNote":"Input schema keys were not extracted for this server (schemas are inline Zig literals); names and descriptions only. The .claude-plugin/.mcp.json command is an absolute path into a developer checkout; its home prefix is written as here (no home paths in specs).","transport":"stdio","typecheckOk":true,"witness":"source-parse"},{"aboutSource":".mcp.json entry; no tool list in this repository","agents":[],"config":".mcp.json","discarded":0,"env":["NEON_API_KEY"],"external":true,"family":"mcp","fields":{"ABOUT":"External MCP server `neon` registered in .mcp.json; launched as `npx -y @neondatabase/mcp-server-neon start`.","ABOUT_SOURCE":".mcp.json entry; no tool list in this repository","AGENTS":[],"AGENTS_NOTE":"No source binds an agent letter to this server: docs/agents/AGENTS_ALPHABET.md, specs/OWNERS.md and .claude/agents/*.md do not name it.","CONFIG":".mcp.json","ENABLED":true,"ENV":["NEON_API_KEY"],"EXTERNAL":true,"FAMILY":"mcp","ID":"mcp/neon","KIND":"tool","LAUNCH":"npx -y @neondatabase/mcp-server-neon start","REPO":"gHashTag/trinity","RESOURCES":[],"RESOURCES_ABOUT":[],"SERVER":"neon","SERVER_VERSION":"","SOURCE":".mcp.json","TOOLS":[],"TOOLS_ABOUT":[],"TOOLS_INPUTS":[],"TOOLS_NOTE":"Tool list lives in the external npm package, not in this repository; nothing is listed rather than guessed.","TRANSPORT":"stdio","WITNESS":"source-parse"},"health":"ok","id":"mcp/neon","inSpecCorpus":false,"launch":"npx -y @neondatabase/mcp-server-neon start","links":{"config":"https://github.com/gHashTag/trinity/blob/da84d38795aa97f9170bb670f04a328032aa6ffe/.mcp.json","pinnedAt":"da84d38795aa97f9170bb670f04a328032aa6ffe","source":"https://github.com/gHashTag/trinity/blob/da84d38795aa97f9170bb670f04a328032aa6ffe/.mcp.json"},"messages":["no agent letter bound by a source","external package: tool list not in the repository"],"moduleName":"tool_mcp_neon","name":{"en":"neon"},"repo":"gHashTag/trinity","resources":[],"searchText":"mcp/neon neon external mcp server `neon` registered in .mcp.json; launched as `npx -y @neondatabase/mcp-server-neon start`.","server":"neon","serverVersion":"","sha256":"b5a7bb64220ed166ea95dc1d1aa0849cf680813b2bd40a72c9f4c94f9f770336","skills":[],"source":".mcp.json","specPath":"specs/tools/mcp/neon.t27","summary":{"en":"External MCP server `neon` registered in .mcp.json; launched as `npx -y @neondatabase/mcp-server-neon start`.","ru":"Внешний MCP-сервер `neon`, зарегистрированный в .mcp.json; запускается как `npx -y @neondatabase/mcp-server-neon start`."},"tools":[],"toolsNote":"Tool list lives in the external npm package, not in this repository; nothing is listed rather than guessed.","transport":"stdio","typecheckOk":true,"witness":"source-parse"},{"aboutSource":".claude/mcp.json entry; no tool list in this repository","agents":[],"config":".claude/mcp.json","discarded":0,"env":["NOTEBOOKLM_STORAGE_STATE"],"external":true,"family":"mcp","fields":{"ABOUT":"External MCP server `notebooklm` registered in .claude/mcp.json; launched as `notebooklm-mcp`.","ABOUT_SOURCE":".claude/mcp.json entry; no tool list in this repository","AGENTS":[],"AGENTS_NOTE":"No source binds an agent letter to this server: docs/agents/AGENTS_ALPHABET.md, specs/OWNERS.md and .claude/agents/*.md do not name it.","CONFIG":".claude/mcp.json","ENABLED":true,"ENV":["NOTEBOOKLM_STORAGE_STATE"],"EXTERNAL":true,"FAMILY":"mcp","ID":"mcp/notebooklm","KIND":"tool","LAUNCH":"notebooklm-mcp --notebook-id auto","REPO":"gHashTag/t27","RESOURCES":[],"RESOURCES_ABOUT":[],"SERVER":"notebooklm","SERVER_VERSION":"","SOURCE":".claude/mcp.json","TOOLS":[],"TOOLS_ABOUT":[],"TOOLS_INPUTS":[],"TOOLS_NOTE":"Tool list lives in the external package, not in this repository.","TRANSPORT":"stdio","WITNESS":"source-parse"},"health":"ok","id":"mcp/notebooklm","inSpecCorpus":false,"launch":"notebooklm-mcp --notebook-id auto","links":{"config":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/.claude/mcp.json","pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","source":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/.claude/mcp.json"},"messages":["no agent letter bound by a source","external package: tool list not in the repository"],"moduleName":"tool_mcp_notebooklm","name":{"en":"notebooklm"},"repo":"gHashTag/t27","resources":[],"searchText":"mcp/notebooklm notebooklm external mcp server `notebooklm` registered in .claude/mcp.json; launched as `notebooklm-mcp`.","server":"notebooklm","serverVersion":"","sha256":"3cc26688fee51b761a4debb197f9078143c4a8ec2ef0df914ab981d0133e75f6","skills":[],"source":".claude/mcp.json","specPath":"specs/tools/mcp/notebooklm.t27","summary":{"en":"External MCP server `notebooklm` registered in .claude/mcp.json; launched as `notebooklm-mcp`.","ru":"Внешний MCP-сервер `notebooklm`, зарегистрированный в .claude/mcp.json; запускается как `notebooklm-mcp`."},"tools":[],"toolsNote":"Tool list lives in the external package, not in this repository.","transport":"stdio","typecheckOk":true,"witness":"source-parse"},{"aboutSource":".mcp.json entry; no tool list in this repository","agents":[],"config":".mcp.json","discarded":0,"env":[],"external":true,"family":"mcp","fields":{"ABOUT":"External MCP server `railway-mcp-server` registered in .mcp.json; launched as `npx -y @railway/mcp-server`.","ABOUT_SOURCE":".mcp.json entry; no tool list in this repository","AGENTS":[],"AGENTS_NOTE":"No source binds an agent letter to this server: docs/agents/AGENTS_ALPHABET.md, specs/OWNERS.md and .claude/agents/*.md do not name it.","CONFIG":".mcp.json","ENABLED":true,"ENV":[],"EXTERNAL":true,"FAMILY":"mcp","ID":"mcp/railway-mcp-server","KIND":"tool","LAUNCH":"npx -y @railway/mcp-server","REPO":"gHashTag/trinity","RESOURCES":[],"RESOURCES_ABOUT":[],"SERVER":"railway-mcp-server","SERVER_VERSION":"","SOURCE":".mcp.json","TOOLS":[],"TOOLS_ABOUT":[],"TOOLS_INPUTS":[],"TOOLS_NOTE":"Tool list lives in the external npm package, not in this repository; nothing is listed rather than guessed.","TRANSPORT":"stdio","WITNESS":"source-parse"},"health":"ok","id":"mcp/railway-mcp-server","inSpecCorpus":false,"launch":"npx -y @railway/mcp-server","links":{"config":"https://github.com/gHashTag/trinity/blob/da84d38795aa97f9170bb670f04a328032aa6ffe/.mcp.json","pinnedAt":"da84d38795aa97f9170bb670f04a328032aa6ffe","source":"https://github.com/gHashTag/trinity/blob/da84d38795aa97f9170bb670f04a328032aa6ffe/.mcp.json"},"messages":["no agent letter bound by a source","external package: tool list not in the repository"],"moduleName":"tool_mcp_railway_mcp_server","name":{"en":"railway-mcp-server"},"repo":"gHashTag/trinity","resources":[],"searchText":"mcp/railway-mcp-server railway-mcp-server external mcp server `railway-mcp-server` registered in .mcp.json; launched as `npx -y @railway/mcp-server`.","server":"railway-mcp-server","serverVersion":"","sha256":"5a4ee7fe4575961461129cdcb18cbbe7e9779f8c70f98a8b6c3eea4564bff0ed","skills":[],"source":".mcp.json","specPath":"specs/tools/mcp/railway-mcp-server.t27","summary":{"en":"External MCP server `railway-mcp-server` registered in .mcp.json; launched as `npx -y @railway/mcp-server`.","ru":"Внешний MCP-сервер `railway-mcp-server`, зарегистрированный в .mcp.json; запускается как `npx -y @railway/mcp-server`."},"tools":[],"toolsNote":"Tool list lives in the external npm package, not in this repository; nothing is listed rather than guessed.","transport":"stdio","typecheckOk":true,"witness":"source-parse"},{"aboutSource":"derived from the tool and resource descriptions in scripts/mcp-traceability-server.js","agents":[],"config":".mcp.json","discarded":0,"env":["PROJECT_ROOT","ENFORCE_L1"],"external":false,"family":"mcp","fields":{"ABOUT":"MCP server over stdio that checks L1 TRACEABILITY (Closes #N) in commit messages and PR descriptions, generates compliant commit messages, validates branch names and serves the PHI LOOP stacked-branch template; resources expose the constitution and the L1 audit.","ABOUT_SOURCE":"derived from the tool and resource descriptions in scripts/mcp-traceability-server.js","AGENTS":[],"AGENTS_NOTE":"No source binds an agent letter to this server: docs/agents/AGENTS_ALPHABET.md, specs/OWNERS.md and .claude/agents/*.md do not name it.","CONFIG":".mcp.json","ENABLED":true,"ENV":["PROJECT_ROOT","ENFORCE_L1"],"EXTERNAL":false,"FAMILY":"mcp","ID":"mcp/t27-traceability","KIND":"tool","LAUNCH":"node scripts/mcp-traceability-server.js","REPO":"gHashTag/t27","RESOURCES":["docs/T27-CONSTITUTION.md","docs/l1-traceability-audit.md"],"RESOURCES_ABOUT":["Constitutional laws including L1 TRACEABILITY","Audit report for L1 TRACEABILITY compliance"],"SERVER":"t27-traceability","SERVER_VERSION":"1.0.0","SOURCE":"scripts/mcp-traceability-server.js","TOOLS":["check_traceability","generate_commit_message","validate_branch_name","get_phi_loop_template"],"TOOLS_ABOUT":["Check if a commit message or PR description complies with L1 TRACEABILITY (Closes #N required)","Generate a compliant commit message for t27 including required L1 TRACEABILITY reference","Validate branch name follows t27 naming conventions","Get PHI LOOP stacked branch template for ring development"],"TOOLS_INPUTS":["message","type,scope,description,issueNumber,invariantLaws,body","branchName","ringNumber"],"TOOLS_NOTE":"","TRANSPORT":"stdio","WITNESS":"source-parse"},"health":"ok","id":"mcp/t27-traceability","inSpecCorpus":false,"launch":"node scripts/mcp-traceability-server.js","links":{"config":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/.mcp.json","pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","source":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/scripts/mcp-traceability-server.js"},"messages":["no agent letter bound by a source"],"moduleName":"tool_mcp_t27_traceability","name":{"en":"t27-traceability"},"repo":"gHashTag/t27","resources":[{"about":"Constitutional laws including L1 TRACEABILITY","path":"docs/T27-CONSTITUTION.md"},{"about":"Audit report for L1 TRACEABILITY compliance","path":"docs/l1-traceability-audit.md"}],"searchText":"mcp/t27-traceability t27-traceability mcp server over stdio that checks l1 traceability (closes #n) in commit messages and pr descriptions, generates compliant commit messages, validates branch names and serves the phi loop stacked-branch template; resources expose the constitution and the l1 audit. check_traceability check if a commit message or pr description complies with l1 traceability (closes #n required) generate_commit_message generate a compliant commit message for t27 including required l1 traceability reference validate_branch_name validate branch name follows t27 naming conventions get_phi_loop_template get phi loop stacked branch template for ring development","server":"t27-traceability","serverVersion":"1.0.0","sha256":"ee3baf01e84914b598dc77db8a4605e46739b1897da7d5cb9a9ca6f51fe49d8a","skills":[],"source":"scripts/mcp-traceability-server.js","specPath":"specs/tools/mcp/t27-traceability.t27","summary":{"en":"MCP server over stdio that checks L1 TRACEABILITY (Closes #N) in commit messages and PR descriptions, generates compliant commit messages, validates branch names and serves the PHI LOOP stacked-branch template; resources expose the constitution and the L1 audit.","ru":"MCP-сервер по stdio, проверяющий L1 TRACEABILITY (Closes #N) в сообщениях коммитов и описаниях PR, генерирующий соответствующие сообщения коммитов, валидирующий имена веток и отдающий шаблон стековых веток PHI LOOP; ресурсы открывают конституцию и аудит L1."},"tools":[{"about":"Check if a commit message or PR description complies with L1 TRACEABILITY (Closes #N required)","inputs":["message"],"name":"check_traceability"},{"about":"Generate a compliant commit message for t27 including required L1 TRACEABILITY reference","inputs":["type","scope","description","issueNumber","invariantLaws","body"],"name":"generate_commit_message"},{"about":"Validate branch name follows t27 naming conventions","inputs":["branchName"],"name":"validate_branch_name"},{"about":"Get PHI LOOP stacked branch template for ring development","inputs":["ringNumber"],"name":"get_phi_loop_template"}],"toolsNote":"","transport":"stdio","typecheckOk":true,"witness":"source-parse"},{"aboutSource":"derived from the tool descriptions in cli/tri-mcp/src/main.rs build_tools_list","agents":[],"config":"","discarded":0,"env":[],"external":false,"family":"mcp","fields":{"ABOUT":"Rust MCP server exposing the PHI LOOP tri commands as tools: status, skill begin/end, cell checkpoint/seal, gen, test, verdict, experience save, health.","ABOUT_SOURCE":"derived from the tool descriptions in cli/tri-mcp/src/main.rs build_tools_list","AGENTS":[],"AGENTS_NOTE":"No source binds an agent letter to this server: docs/agents/AGENTS_ALPHABET.md, specs/OWNERS.md and .claude/agents/*.md do not name it.","CONFIG":"","ENABLED":true,"ENV":[],"EXTERNAL":false,"FAMILY":"mcp","ID":"mcp/tri-mcp","KIND":"tool","LAUNCH":"cargo run -q -p tri-mcp (binary tri-mcp; JSON-RPC over stdio)","REPO":"gHashTag/t27","RESOURCES":[],"RESOURCES_ABOUT":[],"SERVER":"tri-mcp","SERVER_VERSION":"0.1.0","SOURCE":"cli/tri-mcp/src/main.rs","TOOLS":["tri_status","tri_skill_begin","tri_skill_end","tri_cell_checkpoint","tri_cell_seal","tri_gen","tri_test","tri_verdict","tri_experience_save","tri_health"],"TOOLS_ABOUT":["Returns PHI LOOP status including active skill, cell, issue binding, and uncommitted changes.","Begins a new PHI LOOP skill session bound to an issue.","Ends the active PHI LOOP skill session.","Records a checkpoint step in the active cell.","Seals the active cell by computing a SHA-256 hash of its checkpoint history.","Generates backends from a .t27 spec file using t27c.","Runs tests for a .t27 spec file using t27c.","Checks for toxic regressions by analyzing swarm health metrics.","Saves an experience episode to the akashic log.","Returns queen and swarm health status from .trinity state."],"TOOLS_INPUTS":["","issue,description","","step","","spec_path","spec_path","","episode_type,summary,ring",""],"TOOLS_NOTE":"Not registered in .mcp.json at this commit; the server exists as the tri-mcp crate.","TRANSPORT":"stdio","WITNESS":"source-parse"},"health":"ok","id":"mcp/tri-mcp","inSpecCorpus":false,"launch":"cargo run -q -p tri-mcp (binary tri-mcp; JSON-RPC over stdio)","links":{"config":null,"pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","source":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/cli/tri-mcp/src/main.rs"},"messages":["no agent letter bound by a source"],"moduleName":"tool_mcp_tri_mcp","name":{"en":"tri-mcp"},"repo":"gHashTag/t27","resources":[],"searchText":"mcp/tri-mcp tri-mcp rust mcp server exposing the phi loop tri commands as tools: status, skill begin/end, cell checkpoint/seal, gen, test, verdict, experience save, health. tri_status returns phi loop status including active skill, cell, issue binding, and uncommitted changes. tri_skill_begin begins a new phi loop skill session bound to an issue. tri_skill_end ends the active phi loop skill session. tri_cell_checkpoint records a checkpoint step in the active cell. tri_cell_seal seals the active cell by computing a sha-256 hash of its checkpoint history. tri_gen generates backends from a .t27 spec file using t27c. tri_test runs tests for a .t27 spec file using t27c. tri_verdict checks for toxic regressions by analyzing swarm health metrics. tri_experience_save saves an experience episode to the akashic log. tri_health returns queen and swarm health status from .trinity state.","server":"tri-mcp","serverVersion":"0.1.0","sha256":"c72d71922134c15b601238078363f17a4b63f415e10b96768757ea7e9ed8f344","skills":[],"source":"cli/tri-mcp/src/main.rs","specPath":"specs/tools/mcp/tri-mcp.t27","summary":{"en":"Rust MCP server exposing the PHI LOOP tri commands as tools: status, skill begin/end, cell checkpoint/seal, gen, test, verdict, experience save, health.","ru":"MCP-сервер на Rust, открывающий команды tri PHI LOOP как инструменты: status, skill begin/end, cell checkpoint/seal, gen, test, verdict, experience save, health."},"tools":[{"about":"Returns PHI LOOP status including active skill, cell, issue binding, and uncommitted changes.","inputs":[],"name":"tri_status"},{"about":"Begins a new PHI LOOP skill session bound to an issue.","inputs":["issue","description"],"name":"tri_skill_begin"},{"about":"Ends the active PHI LOOP skill session.","inputs":[],"name":"tri_skill_end"},{"about":"Records a checkpoint step in the active cell.","inputs":["step"],"name":"tri_cell_checkpoint"},{"about":"Seals the active cell by computing a SHA-256 hash of its checkpoint history.","inputs":[],"name":"tri_cell_seal"},{"about":"Generates backends from a .t27 spec file using t27c.","inputs":["spec_path"],"name":"tri_gen"},{"about":"Runs tests for a .t27 spec file using t27c.","inputs":["spec_path"],"name":"tri_test"},{"about":"Checks for toxic regressions by analyzing swarm health metrics.","inputs":[],"name":"tri_verdict"},{"about":"Saves an experience episode to the akashic log.","inputs":["episode_type","summary","ring"],"name":"tri_experience_save"},{"about":"Returns queen and swarm health status from .trinity state.","inputs":[],"name":"tri_health"}],"toolsNote":"Not registered in .mcp.json at this commit; the server exists as the tri-mcp crate.","transport":"stdio","typecheckOk":true,"witness":"source-parse"},{"aboutSource":"manifest.json description","agents":[],"config":".claude/mcp/tri-ssot/manifest.json","discarded":0,"env":[],"external":false,"family":"mcp","fields":{"ABOUT":"SSOT Integration for t27: GitHub Issues + PRs + Documentation -> NotebookLM","ABOUT_SOURCE":"manifest.json description","AGENTS":[],"AGENTS_NOTE":"No source binds an agent letter to this server: docs/agents/AGENTS_ALPHABET.md, specs/OWNERS.md and .claude/agents/*.md do not name it.","CONFIG":".claude/mcp/tri-ssot/manifest.json","ENABLED":true,"ENV":[],"EXTERNAL":false,"FAMILY":"mcp","ID":"mcp/tri-ssot","KIND":"tool","LAUNCH":"python3 -m contrib.backend.github.mcp_server","REPO":"gHashTag/t27","RESOURCES":[],"RESOURCES_ABOUT":[],"SERVER":"tri-ssot","SERVER_VERSION":"1.0.0","SOURCE":".claude/mcp/tri-ssot/manifest.json","TOOLS":["tri_issue","tri_pr","tri_docs","tri_sync","tri_search"],"TOOLS_ABOUT":["GitHub Issue management: create, update, list, close","GitHub PR management: create, merge, close, get status","Documentation management: upload to NotebookLM, sync, query","Unified sync: sync all entities (issues, prs, docs) with NotebookLM","Unified search across GitHub Issues, PRs, NotebookLM docs"],"TOOLS_INPUTS":["action,title,body,labels,issue_id,state","action,title,body,pr_id,issue_id","action,file_path,title","scope","query"],"TOOLS_NOTE":"The manifest names python3 -m contrib.backend.github.mcp_server, but the t27 tree at this commit has no contrib/backend/github/mcp_server.py (git ls-tree); the tool list is taken from the manifest alone (declared, not executed).","TRANSPORT":"stdio","WITNESS":"source-parse"},"health":"ok","id":"mcp/tri-ssot","inSpecCorpus":false,"launch":"python3 -m contrib.backend.github.mcp_server","links":{"config":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/.claude/mcp/tri-ssot/manifest.json","pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","source":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/.claude/mcp/tri-ssot/manifest.json"},"messages":["no agent letter bound by a source"],"moduleName":"tool_mcp_tri_ssot","name":{"en":"tri-ssot"},"repo":"gHashTag/t27","resources":[],"searchText":"mcp/tri-ssot tri-ssot ssot integration for t27: github issues + prs + documentation -> notebooklm tri_issue github issue management: create, update, list, close tri_pr github pr management: create, merge, close, get status tri_docs documentation management: upload to notebooklm, sync, query tri_sync unified sync: sync all entities (issues, prs, docs) with notebooklm tri_search unified search across github issues, prs, notebooklm docs","server":"tri-ssot","serverVersion":"1.0.0","sha256":"3d3cd81102198ca519c418cf734b9bcdddef6601e90393283fdc99bd1ae3e0d5","skills":[],"source":".claude/mcp/tri-ssot/manifest.json","specPath":"specs/tools/mcp/tri-ssot.t27","summary":{"en":"SSOT Integration for t27: GitHub Issues + PRs + Documentation -> NotebookLM","ru":"Интеграция SSOT для t27: GitHub Issues + PR + документация -> NotebookLM."},"tools":[{"about":"GitHub Issue management: create, update, list, close","inputs":["action","title","body","labels","issue_id","state"],"name":"tri_issue"},{"about":"GitHub PR management: create, merge, close, get status","inputs":["action","title","body","pr_id","issue_id"],"name":"tri_pr"},{"about":"Documentation management: upload to NotebookLM, sync, query","inputs":["action","file_path","title"],"name":"tri_docs"},{"about":"Unified sync: sync all entities (issues, prs, docs) with NotebookLM","inputs":["scope"],"name":"tri_sync"},{"about":"Unified search across GitHub Issues, PRs, NotebookLM docs","inputs":["query"],"name":"tri_search"}],"toolsNote":"The manifest names python3 -m contrib.backend.github.mcp_server, but the t27 tree at this commit has no contrib/backend/github/mcp_server.py (git ls-tree); the tool list is taken from the manifest alone (declared, not executed).","transport":"stdio","typecheckOk":true,"witness":"source-parse"},{"aboutSource":"derived from tools/mcp/trinity_mcp/server.zig writeToolsList and .claude/rules/mcp-servers.md","agents":[],"config":".mcp.json","discarded":0,"env":["TRINITY_MCP_PORT"],"external":false,"family":"mcp","fields":{"ABOUT":"Zig MCP server (JSON-RPC over stdio, Content-Length framing) that exposes the tri pipeline, Golden Chain links, swarm, cloud/farm, FPGA, doctor, job, issue, deploy, experience, oracle and needle tools; the static list in writeToolsList plus cell-generated tools loaded at runtime.","ABOUT_SOURCE":"derived from tools/mcp/trinity_mcp/server.zig writeToolsList and .claude/rules/mcp-servers.md","AGENTS":[],"AGENTS_NOTE":"No source binds an agent letter to this server: docs/agents/AGENTS_ALPHABET.md, specs/OWNERS.md and .claude/agents/*.md do not name it.","CONFIG":".mcp.json","ENABLED":true,"ENV":["TRINITY_MCP_PORT"],"EXTERNAL":false,"FAMILY":"mcp","ID":"mcp/trinity","KIND":"tool","LAUNCH":"/data/trinity/zig-out/bin/trinity-mcp","REPO":"gHashTag/trinity","RESOURCES":[],"RESOURCES_ABOUT":[],"SERVER":"trinity","SERVER_VERSION":"","SOURCE":"tools/mcp/trinity_mcp/server.zig","TOOLS":["tri_execute","tri_code","tri_gen","tri_spec_create","tri_decompose","tri_plan","tri_verify","tri_bench","tri_verdict","tri_test","tri_test_run","tri_fix","tri_explain","tri_refactor","tri_doc","tri_reason","tri_status","tri_diff","tri_log","tri_commit","needle_structural_replace","needle_search","needle_quality_gates","needle_preview","needle_batch_edit","needle_graph_build","needle_graph_refactor","needle_graph_extract","needle_graph_visualize","needle_graph_affected","needle_graph_vsa_search","needle_semantic_replace","needle_vsa_index","needle_safe_cross_refactor","needle_vsa_rule_apply","needle_cross_preview","needle_rollback_all","needle_omega_init","needle_omega_analyze","needle_omega_execute","needle_omega_detect","needle_omega_status","needle_safety_gates_run","needle_atomic_refactor","needle_parse_check","needle_compile_check","tri_constants","tri_phi","tri_fib","tri_lucas","tri_spiral","tri_chat","tri_loop_decision","tri_pipeline","tri_omega_awaken","tri_os_boot","tri_tvc_demo","tri_tvc_stats","tri_chem_periodic","tri_chem_element","tri_chem_mass","tri_chem_moles","tri_bio_dna","tri_bio_codon","tri_bio_protein","tri_quantum_constants","tri_quantum_states","tri_bell_states","tri_formula","swarm_status","swarm_agents","swarm_register","swarm_heartbeat","swarm_task_get","swarm_task_add","swarm_task_cancel","swarm_tasks","swarm_pause","swarm_resume","swarm_assign","swarm_github_sync","swarm_github_on_start","swarm_github_on_complete","swarm_github_on_fail","oracle_start","oracle_stop","oracle_status","tri_train_status","tri_train_diagnose","tri_train_loss_curve","tri_train_recommend","tri_train_checkpoint","cloud_spawn","cloud_kill","cloud_list","cloud_status","cloud_logs","cloud_spawn_all","cloud_cleanup","cloud_history","cloud_api_check","cloud_redeploy","cloud_diagnose","cloud_issue_create","cloud_farm","cloud_farm_sync","cloud_farm_capacity","cloud_farm_rebalance","farm_evolve_health","farm_evolve_notify","farm_evolve_watch","cloud_train","cloud_train_batch","chain_cache","chain_baseline","chain_metrics","chain_patterns","chain_tree","chain_check_spec","chain_spec","chain_codegen","chain_analyze","chain_test","chain_bench","chain_fix","chain_bench_ext","chain_bench_theory","chain_delta","chain_optimize","chain_docs","chain_verdict","chain_git","chain_loop","chain_deploy","chain_evolve","chain_self_ref","chain_fpga_test","chain_research","chain_lint_spec","chain_list","cloud_decompose","tri_notify","fpga_uart_scan","fpga_uart_ping","fpga_uart_send","doctor_status","doctor_scan","doctor_report","doctor_plan","doctor_heal","job_start","job_status","job_logs","job_list","job_cancel","job_artifacts","issue_list","issue_view","issue_create","issue_comment","issue_close","issue_assign","issue_decompose","deploy_status","deploy_logs","deploy_vars","deploy_start","deploy_stop","experience_save","experience_recall","experience_mistakes","patent_status","patent_analysis","depin_status","depin_nodes","depin_fitness","research_query","experiment_list","experiment_compare","chimera_run","ouroboros_status","ouroboros_run","self_test","self_health","context_info","context_load","faculty_status","mu_status","mu_patterns","zenodo_status","tri_analyze","tri_clean","tri_fmt","tri_stats","tri_lint","tri_search","tri_metrics","tri_trace","tri_eval","farm_status","farm_idle","farm_recycle","farm_fill","farm_accounts","farm_wave_spawn","fpga_synth","fpga_status","fpga_build","fpga_verify","fpga_flash"],"TOOLS_ABOUT":["Universal executor -- run ANY tri command with automatic needle check","Generate code with typing effect","Compile VIBEE spec to Zig/Verilog","Create new .tri specification template","Break task into sub-tasks (Golden Chain Link 4)","Generate implementation plan (Golden Chain Link 5)","Run tests + benchmarks (Links 7-11)","Run performance benchmarks","Generate toxic verdict (Link 14)","Generate tests for code","Run specific test suite","Detect and fix bugs","Explain code or concept","Suggest refactoring","Generate documentation","Chain-of-thought reasoning","Git status --short","Git diff","Git log --oneline","Git add -A && commit","AST-aware code edit with Tier 0->1 fallback","Search codebase for pattern matches","Run quality gates: parse check, AST analysis","Preview edit diff without applying","Apply multiple edits in one operation","Build complete call graph with VSA embeddings for project","Rename symbol across entire project with semantic awareness","Extract function/method from code block","Generate graph visualization (DOT/JSON) with VSA clustering","Find all files affected by symbol change (with semantic impact)","Search for semantically similar symbols by code or intent","Replace code by semantic meaning (not just pattern)","Build semantic VSA index for codebase","Safe cross-file semantic refactor with VSA rules and 100% rollback","Apply VSA rules to validate proposed refactor","Preview cross-file refactor impact with safety assessment","Rollback all changes from failed refactor","Initialize Omega autonomous agent for project","Omega analyzes codebase and suggests improvements","Execute refactor plan with full autonomy","Auto-detect code improvements and optimizations","Get Omega agent status and health","Run all safety gates on a file (Phase 1: parse/compile/test)","Apply atomic refactor with 100% rollback guarantee (Phase 1)","Parse check using Zig AST parser (Phase 1)","Compile check using zig build (Phase 1)","Show sacred constants (phi, pi, e, mu, chi, sigma, epsilon...)","Compute phi^n (golden ratio power)","Fibonacci with BigInt","Lucas L(n) -- L(2)=3=TRINITY","phi-spiral coordinates","Interactive chat (vision + voice + tools)","Loop decision: CONTINUE/EXIT (Link 17)","Execute 26-link Golden Chain pipeline","Awaken Omega autonomous agent","Temporal Trinity OS boot","Run TVC chat demo","Show TVC corpus statistics","List periodic table elements by category","Look up element by symbol or atomic number","Calculate molar mass of chemical formula","Calculate moles, molecules, atoms from mass","Analyze DNA sequence (GC content, composition)","Look up RNA codon to amino acid","Analyze protein sequence (mass, composition)","Show quantum physics constants (h, hbar, alpha)","Show quantum basis states and phi-state","Show four Bell entangled states","Evaluate V = n * 3^k * pi^m * phi^p * e^q","Get Ralph Agent Swarm status summary (agents, tasks, counts)","List all registered swarm agents with status","Register a new agent in the swarm","Agent heartbeat with status, branch, task_id, commit_sha (circuit breaker)","Get next pending task for an agent (priority-ordered)","Add a new task to the swarm queue","Cancel and remove a task from the queue","List all tasks in the swarm queue","Pause all swarm agents (finish current tasks, no new assignments)","Resume all paused swarm agents","Create and assign a task to a specific agent","Convert GitHub issue to swarm task. Returns labels/actions for Go proxy.","Notify that agent started a GitHub-sourced task. Returns label swaps + comment.","Notify GitHub task completed. Returns labels, comment, close_issue.","Notify GitHub task failed. Returns labels + error comment.","Start Oracle Telegram watchdog thread (sends swarm status every N minutes)","Stop Oracle Telegram watchdog thread","Get Oracle watchdog status (running/stopped, messages sent, errors)","Get HSLM training status -- checkpoints, loss, anomalies, recommendation","Diagnose HSLM training anomalies (zero loss, phase transition, overfitting)","Get HSLM loss curve from checkpoint headers","Get phi-aware recommendation for next training action","List HSLM checkpoints with step, loss, PPL, size","Spawn a cloud agent container for a GitHub issue","Kill a cloud agent container","List all active cloud agent containers","Get cloud infrastructure status","Get cloud agent deployment logs","Spawn agents for all issues labeled agent:spawn","Remove inactive cloud agent entries","Get event history for a cloud agent","Test API key connectivity and model routing -- detects proxy returning wrong model","Reuse existing Railway service for a new issue number","Diagnose why an agent failed -- shows GitHub comments, JSONL events, PR status","Create a GitHub issue with agent:spawn label for auto-spawning","Railway multi-account farm dashboard -- shows all accounts with capacity and daily limits","Sync active service counts across all Railway accounts","Get farm capacity as JSON -- total slots, active services, daily remaining per account","Migrate services from overloaded to underloaded Railway accounts","Farm evolution health dashboard -- leaderboard, health_score 0-100, stagnation, ETA","Farm insight scan -- detect leader changes, plateaus, spikes, wave completion. Sends to Telegram unless dry-run","Single evolution sweep -- inject sacred children into free slots, auto-notify. Always --once","Spawn an HSLM training experiment on Railway farm","Spawn all 13 HSLM training experiments across Railway farm","Chain Link 0: TVC Gate -- search corpus, return cached or continue","Chain Link 1: Analyze previous version v(n-1)","Chain Link 2: Collect performance metrics","Chain Link 3: Research patterns and science (PAS)","Chain Link 4: Build technology dependency tree","Chain Link 5: VIBEE-first compliance check","Chain Link 6: Create .tri specifications","Chain Link 7: Generate Zig code from .tri specs","Chain Link 8: Sacred Intelligence code analysis","Chain Link 9: Run zig build test suite","Chain Link 10: CRITICAL -- Compare to baseline v(n-1)","Chain Link 11: SWE Agent error fixing","Chain Link 12: Compare to external tools (llama.cpp/vLLM)","Chain Link 13: Gap to theoretical maximum","Chain Link 14: Generate improvement delta report","Chain Link 15: Optimize if needed (optional)","Chain Link 16: Generate documentation with proofs","Chain Link 17: Critical self-assessment (toxic verdict)","Chain Link 18: Commit and push changes","Chain Link 19: Decide next iteration (continue/exit)","Chain Link 20: Auto-deploy to cloud","Chain Link 21: Pipeline analyzes itself (eternal self-evolution)","Chain Link 22: Pipeline improves itself (circular bootstrapping)","Chain Link 23: Camera-based LED verification for FPGA","Chain Link 24: Research-assisted error fixing via Perplexity","Chain Link 25: Validate .tri spec syntax before codegen","List all 26 Golden Chain links with roles and status","Decompose a GitHub issue into 5 role-based sub-issues (planner/coder/reviewer/tester/integrator)","Send/edit/pin Telegram messages via tri CLI","Scan for USB-UART serial devices (CH340/FTDI) connected to FPGA","PING/PONG test -- send 0x03, expect 0x83 from FPGA","Send raw hex bytes to FPGA via UART and print response","Get doctor health status -- one-line summary","Scan and classify all .zig files","Health score dashboard with emoji grades","Create migration queue for manual files","Regenerate manual files through pipeline","Start a background job","Get job status by ID","Get job logs by ID","List all background jobs","Cancel a running job","Get job artifacts by ID","List open GitHub issues","View a specific GitHub issue","Create a new GitHub issue","Add a comment to a GitHub issue","Close a GitHub issue","Assign a user to a GitHub issue","Decompose a GitHub issue into sub-tasks","Get deployment status","Get deployment logs","Get deployment environment variables","Start deployment","Stop deployment","Save an experience entry (key-value learning)","Recall an experience entry by key","List all recorded mistakes/anti-patterns","Get patent portfolio status","Get patent analysis and claims","Get DePIN node protocol status","List DePIN network nodes","Get DePIN node fitness scores","Research a topic via Perplexity-assisted search","List all HSLM training experiments","Compare two experiments","Run a chimera fused command (farm-cycle, train-cycle, etc.)","Get ouroboros self-evolution status and score","Run ouroboros self-evolution cycle","Run self-test suite","Get self-health check results","Get current context info (tokens, files, window)","Load additional context from a file path","Get Faculty Board status dashboard","Get MU agent status","List MU learned patterns","Get Zenodo publication status","Analyze codebase quality and metrics","Clean build artifacts and temp files","Format all Zig source files","Show project statistics (LOC, files, tests)","Run linter on source code","Search codebase for a query string","Get project metrics dashboard","Get execution trace","Evaluate expression or code snippet","Get training farm status overview","List idle farm workers","Recycle underperforming farm workers","Fill empty farm slots with new experiments","List all 8 Railway farm accounts and their service counts","Spawn a wave of training workers on a specific account","Run FPGA synthesis pipeline","Get FPGA hardware and synthesis status","Build FPGA bitstream","Verify FPGA bitstream against RTL","Flash bitstream to FPGA board"],"TOOLS_INPUTS":["command,args,auto_needle","prompt","spec","name","task","task","","suite","","file","pattern","file","target","file","file","prompt","","","count","message","file_path,pattern_query,replacement,safety_level,edit_mode","query,file_path,confidence_threshold","file_path,check_level","file_path,pattern_query,replacement","edits","root_dir,enable_vsa","symbol,new_name,semantic_aware,similarity_threshold,scope,preview","file,start_line,end_line,function_name","format,focus,show_vsa","symbol,include_transitive,semantic_impact","query,top_k,min_similarity","intent,replacement_intent,file,preview","root_dir,embedding_dim","intent,new_intent,semantic_threshold,preview","transformation,rules_file","symbol,new_name,include_vsa","refactor_id","root_dir,autonomy_level","intent,auto_detect","plan_id,confirm","min_confidence,max_results","","file_path,gates","file_path,pattern_query,replacement,safety_gates","file_path","project_root","","n","n","n","n","message,stream","mode","task","mode","","","","category","element","formula","formula,mass","sequence","codon","sequence","","","","n,k,m,p,q","","","agent_id,hostname","agent_id,status,branch,task_id,commit_sha","agent_id","id,slug,description,priority","task_id","","","","agent_id,description","issue_number,title,labels","task_id,agent_id,branch","task_id,agent_id,result","task_id,agent_id,error","telegram_token,chat_id,interval_ms","","","","dir","dir","dir","dir","issue_number","issue_number","","","","","","issue_number","","service_id,issue_number","issue_number","title","","","","","","dry_run","sacred,dry_run","name","","task","task","task","task","task","task","task","task","task","task","task","task","task","task","task","task","task","task","task","task","task","task","task","task","task","task","","issue_number,template","text,chat_id,pin,edit_id","","device","device,hex_bytes","","","","","","command","id","id","","id","id","","number","title,body","number,body","number","number,user","number","","","","","","key,value","key","","","","","","","query","","a,b","name","","","","","","path","","","","","","","","","","query","","","","","","","","","account,count","","","","","bitstream"],"TOOLS_NOTE":"Static list parsed from writeToolsList (210 entries; 32 entries have an unbalanced trailing brace in the source literal and were parsed after adding or removing one). Cell-generated tools from data/cells/mcp_tools.json are appended at runtime and are not listed here. .trinity/mcp_schemas.json lists a different, shorter set (29 names) and is not used as the source.","TRANSPORT":"stdio","WITNESS":"source-parse"},"health":"ok","id":"mcp/trinity","inSpecCorpus":false,"launch":"/data/trinity/zig-out/bin/trinity-mcp","links":{"config":"https://github.com/gHashTag/trinity/blob/da84d38795aa97f9170bb670f04a328032aa6ffe/.mcp.json","pinnedAt":"da84d38795aa97f9170bb670f04a328032aa6ffe","source":"https://github.com/gHashTag/trinity/blob/da84d38795aa97f9170bb670f04a328032aa6ffe/tools/mcp/trinity_mcp/server.zig"},"messages":["no agent letter bound by a source"],"moduleName":"tool_mcp_trinity","name":{"en":"trinity"},"repo":"gHashTag/trinity","resources":[],"searchText":"mcp/trinity trinity zig mcp server (json-rpc over stdio, content-length framing) that exposes the tri pipeline, golden chain links, swarm, cloud/farm, fpga, doctor, job, issue, deploy, experience, oracle and needle tools; the static list in writetoolslist plus cell-generated tools loaded at runtime. tri_execute universal executor -- run any tri command with automatic needle check tri_code generate code with typing effect tri_gen compile vibee spec to zig/verilog tri_spec_create create new .tri specification template tri_decompose break task into sub-tasks (golden chain link 4) tri_plan generate implementation plan (golden chain link 5) tri_verify run tests + benchmarks (links 7-11) tri_bench run performance benchmarks tri_verdict generate toxic verdict (link 14) tri_test generate tests for code tri_test_run run specific test suite tri_fix detect and fix bugs tri_explain explain code or concept tri_refactor suggest refactoring tri_doc generate documentation tri_reason chain-of-thought reasoning tri_status git status --short tri_diff git diff tri_log git log --oneline tri_commit git add -a && commit needle_structural_replace ast-aware code edit with tier 0->1 fallback needle_search search codebase for pattern matches needle_quality_gates run quality gates: parse check, ast analysis needle_preview preview edit diff without applying needle_batch_edit apply multiple edits in one operation needle_graph_build build complete call graph with vsa embeddings for project needle_graph_refactor rename symbol across entire project with semantic awareness needle_graph_extract extract function/method from code block needle_graph_visualize generate graph visualization (dot/json) with vsa clustering needle_graph_affected find all files affected by symbol change (with semantic impact) needle_graph_vsa_search search for semantically similar symbols by code or intent needle_semantic_replace replace code by semantic meaning (not just pattern) needle_vsa_index build semantic vsa index for codebase needle_safe_cross_refactor safe cross-file semantic refactor with vsa rules and 100% rollback needle_vsa_rule_apply apply vsa rules to validate proposed refactor needle_cross_preview preview cross-file refactor impact with safety assessment needle_rollback_all rollback all changes from failed refactor needle_omega_init initialize omega autonomous agent for project needle_omega_analyze omega analyzes codebase and suggests improvements needle_omega_execute execute refactor plan with full autonomy needle_omega_detect auto-detect code improvements and optimizations needle_omega_status get omega agent status and health needle_safety_gates_run run all safety gates on a file (phase 1: parse/compile/test) needle_atomic_refactor apply atomic refactor with 100% rollback guarantee (phase 1) needle_parse_check parse check using zig ast parser (phase 1) needle_compile_check compile check using zig build (phase 1) tri_constants show sacred constants (phi, pi, e, mu, chi, sigma, epsilon...) tri_phi compute phi^n (golden ratio power) tri_fib fibonacci with bigint tri_lucas lucas l(n) -- l(2)=3=trinity tri_spiral phi-spiral coordinates tri_chat interactive chat (vision + voice + tools) tri_loop_decision loop decision: continue/exit (link 17) tri_pipeline execute 26-link golden chain pipeline tri_omega_awaken awaken omega autonomous agent tri_os_boot temporal trinity os boot tri_tvc_demo run tvc chat demo tri_tvc_stats show tvc corpus statistics tri_chem_periodic list periodic table elements by category tri_chem_element look up element by symbol or atomic number tri_chem_mass calculate molar mass of chemical formula tri_chem_moles calculate moles, molecules, atoms from mass tri_bio_dna analyze dna sequence (gc content, composition) tri_bio_codon look up rna codon to amino acid tri_bio_protein analyze protein sequence (mass, composition) tri_quantum_constants show quantum physics constants (h, hbar, alpha) tri_quantum_states show quantum basis states and phi-state tri_bell_states show four bell entangled states tri_formula evaluate v = n * 3^k * pi^m * phi^p * e^q swarm_status get ralph agent swarm status summary (agents, tasks, counts) swarm_agents list all registered swarm agents with status swarm_register register a new agent in the swarm swarm_heartbeat agent heartbeat with status, branch, task_id, commit_sha (circuit breaker) swarm_task_get get next pending task for an agent (priority-ordered) swarm_task_add add a new task to the swarm queue swarm_task_cancel cancel and remove a task from the queue swarm_tasks list all tasks in the swarm queue swarm_pause pause all swarm agents (finish current tasks, no new assignments) swarm_resume resume all paused swarm agents swarm_assign create and assign a task to a specific agent swarm_github_sync convert github issue to swarm task. returns labels/actions for go proxy. swarm_github_on_start notify that agent started a github-sourced task. returns label swaps + comment. swarm_github_on_complete notify github task completed. returns labels, comment, close_issue. swarm_github_on_fail notify github task failed. returns labels + error comment. oracle_start start oracle telegram watchdog thread (sends swarm status every n minutes) oracle_stop stop oracle telegram watchdog thread oracle_status get oracle watchdog status (running/stopped, messages sent, errors) tri_train_status get hslm training status -- checkpoints, loss, anomalies, recommendation tri_train_diagnose diagnose hslm training anomalies (zero loss, phase transition, overfitting) tri_train_loss_curve get hslm loss curve from checkpoint headers tri_train_recommend get phi-aware recommendation for next training action tri_train_checkpoint list hslm checkpoints with step, loss, ppl, size cloud_spawn spawn a cloud agent container for a github issue cloud_kill kill a cloud agent container cloud_list list all active cloud agent containers cloud_status get cloud infrastructure status cloud_logs get cloud agent deployment logs cloud_spawn_all spawn agents for all issues labeled agent:spawn cloud_cleanup remove inactive cloud agent entries cloud_history get event history for a cloud agent cloud_api_check test api key connectivity and model routing -- detects proxy returning wrong model cloud_redeploy reuse existing railway service for a new issue number cloud_diagnose diagnose why an agent failed -- shows github comments, jsonl events, pr status cloud_issue_create create a github issue with agent:spawn label for auto-spawning cloud_farm railway multi-account farm dashboard -- shows all accounts with capacity and daily limits cloud_farm_sync sync active service counts across all railway accounts cloud_farm_capacity get farm capacity as json -- total slots, active services, daily remaining per account cloud_farm_rebalance migrate services from overloaded to underloaded railway accounts farm_evolve_health farm evolution health dashboard -- leaderboard, health_score 0-100, stagnation, eta farm_evolve_notify farm insight scan -- detect leader changes, plateaus, spikes, wave completion. sends to telegram unless dry-run farm_evolve_watch single evolution sweep -- inject sacred children into free slots, auto-notify. always --once cloud_train spawn an hslm training experiment on railway farm cloud_train_batch spawn all 13 hslm training experiments across railway farm chain_cache chain link 0: tvc gate -- search corpus, return cached or continue chain_baseline chain link 1: analyze previous version v(n-1) chain_metrics chain link 2: collect performance metrics chain_patterns chain link 3: research patterns and science (pas) chain_tree chain link 4: build technology dependency tree chain_check_spec chain link 5: vibee-first compliance check chain_spec chain link 6: create .tri specifications chain_codegen chain link 7: generate zig code from .tri specs chain_analyze chain link 8: sacred intelligence code analysis chain_test chain link 9: run zig build test suite chain_bench chain link 10: critical -- compare to baseline v(n-1) chain_fix chain link 11: swe agent error fixing chain_bench_ext chain link 12: compare to external tools (llama.cpp/vllm) chain_bench_theory chain link 13: gap to theoretical maximum chain_delta chain link 14: generate improvement delta report chain_optimize chain link 15: optimize if needed (optional) chain_docs chain link 16: generate documentation with proofs chain_verdict chain link 17: critical self-assessment (toxic verdict) chain_git chain link 18: commit and push changes chain_loop chain link 19: decide next iteration (continue/exit) chain_deploy chain link 20: auto-deploy to cloud chain_evolve chain link 21: pipeline analyzes itself (eternal self-evolution) chain_self_ref chain link 22: pipeline improves itself (circular bootstrapping) chain_fpga_test chain link 23: camera-based led verification for fpga chain_research chain link 24: research-assisted error fixing via perplexity chain_lint_spec chain link 25: validate .tri spec syntax before codegen chain_list list all 26 golden chain links with roles and status cloud_decompose decompose a github issue into 5 role-based sub-issues (planner/coder/reviewer/tester/integrator) tri_notify send/edit/pin telegram messages via tri cli fpga_uart_scan scan for usb-uart serial devices (ch340/ftdi) connected to fpga fpga_uart_ping ping/pong test -- send 0x03, expect 0x83 from fpga fpga_uart_send send raw hex bytes to fpga via uart and print response doctor_status get doctor health status -- one-line summary doctor_scan scan and classify all .zig files doctor_report health score dashboard with emoji grades doctor_plan create migration queue for manual files doctor_heal regenerate manual files through pipeline job_start start a background job job_status get job status by id job_logs get job logs by id job_list list all background jobs job_cancel cancel a running job job_artifacts get job artifacts by id issue_list list open github issues issue_view view a specific github issue issue_create create a new github issue issue_comment add a comment to a github issue issue_close close a github issue issue_assign assign a user to a github issue issue_decompose decompose a github issue into sub-tasks deploy_status get deployment status deploy_logs get deployment logs deploy_vars get deployment environment variables deploy_start start deployment deploy_stop stop deployment experience_save save an experience entry (key-value learning) experience_recall recall an experience entry by key experience_mistakes list all recorded mistakes/anti-patterns patent_status get patent portfolio status patent_analysis get patent analysis and claims depin_status get depin node protocol status depin_nodes list depin network nodes depin_fitness get depin node fitness scores research_query research a topic via perplexity-assisted search experiment_list list all hslm training experiments experiment_compare compare two experiments chimera_run run a chimera fused command (farm-cycle, train-cycle, etc.) ouroboros_status get ouroboros self-evolution status and score ouroboros_run run ouroboros self-evolution cycle self_test run self-test suite self_health get self-health check results context_info get current context info (tokens, files, window) context_load load additional context from a file path faculty_status get faculty board status dashboard mu_status get mu agent status mu_patterns list mu learned patterns zenodo_status get zenodo publication status tri_analyze analyze codebase quality and metrics tri_clean clean build artifacts and temp files tri_fmt format all zig source files tri_stats show project statistics (loc, files, tests) tri_lint run linter on source code tri_search search codebase for a query string tri_metrics get project metrics dashboard tri_trace get execution trace tri_eval evaluate expression or code snippet farm_status get training farm status overview farm_idle list idle farm workers farm_recycle recycle underperforming farm workers farm_fill fill empty farm slots with new experiments farm_accounts list all 8 railway farm accounts and their service counts farm_wave_spawn spawn a wave of training workers on a specific account fpga_synth run fpga synthesis pipeline fpga_status get fpga hardware and synthesis status fpga_build build fpga bitstream fpga_verify verify fpga bitstream against rtl fpga_flash flash bitstream to fpga board","server":"trinity","serverVersion":"","sha256":"89b3ad93549016b1bd9261868fadb992cbd09a1790f54113b906a1a633aa8508","skills":[],"source":"tools/mcp/trinity_mcp/server.zig","specPath":"specs/tools/mcp/trinity.t27","summary":{"en":"Zig MCP server (JSON-RPC over stdio, Content-Length framing) that exposes the tri pipeline, Golden Chain links, swarm, cloud/farm, FPGA, doctor, job, issue, deploy, experience, oracle and needle tools; the static list in writeToolsList plus cell-generated tools loaded at runtime.","ru":"MCP-сервер на Zig (JSON-RPC по stdio, кадрирование Content-Length), открывающий инструменты конвейера tri, звеньев Golden Chain, роя, облака/фермы, FPGA, doctor, job, issue, deploy, experience, oracle и needle; статический список writeToolsList плюс инструменты ячеек, подгружаемые во время выполнения."},"tools":[{"about":"Universal executor -- run ANY tri command with automatic needle check","inputs":["command","args","auto_needle"],"name":"tri_execute"},{"about":"Generate code with typing effect","inputs":["prompt"],"name":"tri_code"},{"about":"Compile VIBEE spec to Zig/Verilog","inputs":["spec"],"name":"tri_gen"},{"about":"Create new .tri specification template","inputs":["name"],"name":"tri_spec_create"},{"about":"Break task into sub-tasks (Golden Chain Link 4)","inputs":["task"],"name":"tri_decompose"},{"about":"Generate implementation plan (Golden Chain Link 5)","inputs":["task"],"name":"tri_plan"},{"about":"Run tests + benchmarks (Links 7-11)","inputs":[],"name":"tri_verify"},{"about":"Run performance benchmarks","inputs":["suite"],"name":"tri_bench"},{"about":"Generate toxic verdict (Link 14)","inputs":[],"name":"tri_verdict"},{"about":"Generate tests for code","inputs":["file"],"name":"tri_test"},{"about":"Run specific test suite","inputs":["pattern"],"name":"tri_test_run"},{"about":"Detect and fix bugs","inputs":["file"],"name":"tri_fix"},{"about":"Explain code or concept","inputs":["target"],"name":"tri_explain"},{"about":"Suggest refactoring","inputs":["file"],"name":"tri_refactor"},{"about":"Generate documentation","inputs":["file"],"name":"tri_doc"},{"about":"Chain-of-thought reasoning","inputs":["prompt"],"name":"tri_reason"},{"about":"Git status --short","inputs":[],"name":"tri_status"},{"about":"Git diff","inputs":[],"name":"tri_diff"},{"about":"Git log --oneline","inputs":["count"],"name":"tri_log"},{"about":"Git add -A && commit","inputs":["message"],"name":"tri_commit"},{"about":"AST-aware code edit with Tier 0->1 fallback","inputs":["file_path","pattern_query","replacement","safety_level","edit_mode"],"name":"needle_structural_replace"},{"about":"Search codebase for pattern matches","inputs":["query","file_path","confidence_threshold"],"name":"needle_search"},{"about":"Run quality gates: parse check, AST analysis","inputs":["file_path","check_level"],"name":"needle_quality_gates"},{"about":"Preview edit diff without applying","inputs":["file_path","pattern_query","replacement"],"name":"needle_preview"},{"about":"Apply multiple edits in one operation","inputs":["edits"],"name":"needle_batch_edit"},{"about":"Build complete call graph with VSA embeddings for project","inputs":["root_dir","enable_vsa"],"name":"needle_graph_build"},{"about":"Rename symbol across entire project with semantic awareness","inputs":["symbol","new_name","semantic_aware","similarity_threshold","scope","preview"],"name":"needle_graph_refactor"},{"about":"Extract function/method from code block","inputs":["file","start_line","end_line","function_name"],"name":"needle_graph_extract"},{"about":"Generate graph visualization (DOT/JSON) with VSA clustering","inputs":["format","focus","show_vsa"],"name":"needle_graph_visualize"},{"about":"Find all files affected by symbol change (with semantic impact)","inputs":["symbol","include_transitive","semantic_impact"],"name":"needle_graph_affected"},{"about":"Search for semantically similar symbols by code or intent","inputs":["query","top_k","min_similarity"],"name":"needle_graph_vsa_search"},{"about":"Replace code by semantic meaning (not just pattern)","inputs":["intent","replacement_intent","file","preview"],"name":"needle_semantic_replace"},{"about":"Build semantic VSA index for codebase","inputs":["root_dir","embedding_dim"],"name":"needle_vsa_index"},{"about":"Safe cross-file semantic refactor with VSA rules and 100% rollback","inputs":["intent","new_intent","semantic_threshold","preview"],"name":"needle_safe_cross_refactor"},{"about":"Apply VSA rules to validate proposed refactor","inputs":["transformation","rules_file"],"name":"needle_vsa_rule_apply"},{"about":"Preview cross-file refactor impact with safety assessment","inputs":["symbol","new_name","include_vsa"],"name":"needle_cross_preview"},{"about":"Rollback all changes from failed refactor","inputs":["refactor_id"],"name":"needle_rollback_all"},{"about":"Initialize Omega autonomous agent for project","inputs":["root_dir","autonomy_level"],"name":"needle_omega_init"},{"about":"Omega analyzes codebase and suggests improvements","inputs":["intent","auto_detect"],"name":"needle_omega_analyze"},{"about":"Execute refactor plan with full autonomy","inputs":["plan_id","confirm"],"name":"needle_omega_execute"},{"about":"Auto-detect code improvements and optimizations","inputs":["min_confidence","max_results"],"name":"needle_omega_detect"},{"about":"Get Omega agent status and health","inputs":[],"name":"needle_omega_status"},{"about":"Run all safety gates on a file (Phase 1: parse/compile/test)","inputs":["file_path","gates"],"name":"needle_safety_gates_run"},{"about":"Apply atomic refactor with 100% rollback guarantee (Phase 1)","inputs":["file_path","pattern_query","replacement","safety_gates"],"name":"needle_atomic_refactor"},{"about":"Parse check using Zig AST parser (Phase 1)","inputs":["file_path"],"name":"needle_parse_check"},{"about":"Compile check using zig build (Phase 1)","inputs":["project_root"],"name":"needle_compile_check"},{"about":"Show sacred constants (phi, pi, e, mu, chi, sigma, epsilon...)","inputs":[],"name":"tri_constants"},{"about":"Compute phi^n (golden ratio power)","inputs":["n"],"name":"tri_phi"},{"about":"Fibonacci with BigInt","inputs":["n"],"name":"tri_fib"},{"about":"Lucas L(n) -- L(2)=3=TRINITY","inputs":["n"],"name":"tri_lucas"},{"about":"phi-spiral coordinates","inputs":["n"],"name":"tri_spiral"},{"about":"Interactive chat (vision + voice + tools)","inputs":["message","stream"],"name":"tri_chat"},{"about":"Loop decision: CONTINUE/EXIT (Link 17)","inputs":["mode"],"name":"tri_loop_decision"},{"about":"Execute 26-link Golden Chain pipeline","inputs":["task"],"name":"tri_pipeline"},{"about":"Awaken Omega autonomous agent","inputs":["mode"],"name":"tri_omega_awaken"},{"about":"Temporal Trinity OS boot","inputs":[],"name":"tri_os_boot"},{"about":"Run TVC chat demo","inputs":[],"name":"tri_tvc_demo"},{"about":"Show TVC corpus statistics","inputs":[],"name":"tri_tvc_stats"},{"about":"List periodic table elements by category","inputs":["category"],"name":"tri_chem_periodic"},{"about":"Look up element by symbol or atomic number","inputs":["element"],"name":"tri_chem_element"},{"about":"Calculate molar mass of chemical formula","inputs":["formula"],"name":"tri_chem_mass"},{"about":"Calculate moles, molecules, atoms from mass","inputs":["formula","mass"],"name":"tri_chem_moles"},{"about":"Analyze DNA sequence (GC content, composition)","inputs":["sequence"],"name":"tri_bio_dna"},{"about":"Look up RNA codon to amino acid","inputs":["codon"],"name":"tri_bio_codon"},{"about":"Analyze protein sequence (mass, composition)","inputs":["sequence"],"name":"tri_bio_protein"},{"about":"Show quantum physics constants (h, hbar, alpha)","inputs":[],"name":"tri_quantum_constants"},{"about":"Show quantum basis states and phi-state","inputs":[],"name":"tri_quantum_states"},{"about":"Show four Bell entangled states","inputs":[],"name":"tri_bell_states"},{"about":"Evaluate V = n * 3^k * pi^m * phi^p * e^q","inputs":["n","k","m","p","q"],"name":"tri_formula"},{"about":"Get Ralph Agent Swarm status summary (agents, tasks, counts)","inputs":[],"name":"swarm_status"},{"about":"List all registered swarm agents with status","inputs":[],"name":"swarm_agents"},{"about":"Register a new agent in the swarm","inputs":["agent_id","hostname"],"name":"swarm_register"},{"about":"Agent heartbeat with status, branch, task_id, commit_sha (circuit breaker)","inputs":["agent_id","status","branch","task_id","commit_sha"],"name":"swarm_heartbeat"},{"about":"Get next pending task for an agent (priority-ordered)","inputs":["agent_id"],"name":"swarm_task_get"},{"about":"Add a new task to the swarm queue","inputs":["id","slug","description","priority"],"name":"swarm_task_add"},{"about":"Cancel and remove a task from the queue","inputs":["task_id"],"name":"swarm_task_cancel"},{"about":"List all tasks in the swarm queue","inputs":[],"name":"swarm_tasks"},{"about":"Pause all swarm agents (finish current tasks, no new assignments)","inputs":[],"name":"swarm_pause"},{"about":"Resume all paused swarm agents","inputs":[],"name":"swarm_resume"},{"about":"Create and assign a task to a specific agent","inputs":["agent_id","description"],"name":"swarm_assign"},{"about":"Convert GitHub issue to swarm task. Returns labels/actions for Go proxy.","inputs":["issue_number","title","labels"],"name":"swarm_github_sync"},{"about":"Notify that agent started a GitHub-sourced task. Returns label swaps + comment.","inputs":["task_id","agent_id","branch"],"name":"swarm_github_on_start"},{"about":"Notify GitHub task completed. Returns labels, comment, close_issue.","inputs":["task_id","agent_id","result"],"name":"swarm_github_on_complete"},{"about":"Notify GitHub task failed. Returns labels + error comment.","inputs":["task_id","agent_id","error"],"name":"swarm_github_on_fail"},{"about":"Start Oracle Telegram watchdog thread (sends swarm status every N minutes)","inputs":["telegram_token","chat_id","interval_ms"],"name":"oracle_start"},{"about":"Stop Oracle Telegram watchdog thread","inputs":[],"name":"oracle_stop"},{"about":"Get Oracle watchdog status (running/stopped, messages sent, errors)","inputs":[],"name":"oracle_status"},{"about":"Get HSLM training status -- checkpoints, loss, anomalies, recommendation","inputs":[],"name":"tri_train_status"},{"about":"Diagnose HSLM training anomalies (zero loss, phase transition, overfitting)","inputs":["dir"],"name":"tri_train_diagnose"},{"about":"Get HSLM loss curve from checkpoint headers","inputs":["dir"],"name":"tri_train_loss_curve"},{"about":"Get phi-aware recommendation for next training action","inputs":["dir"],"name":"tri_train_recommend"},{"about":"List HSLM checkpoints with step, loss, PPL, size","inputs":["dir"],"name":"tri_train_checkpoint"},{"about":"Spawn a cloud agent container for a GitHub issue","inputs":["issue_number"],"name":"cloud_spawn"},{"about":"Kill a cloud agent container","inputs":["issue_number"],"name":"cloud_kill"},{"about":"List all active cloud agent containers","inputs":[],"name":"cloud_list"},{"about":"Get cloud infrastructure status","inputs":[],"name":"cloud_status"},{"about":"Get cloud agent deployment logs","inputs":[],"name":"cloud_logs"},{"about":"Spawn agents for all issues labeled agent:spawn","inputs":[],"name":"cloud_spawn_all"},{"about":"Remove inactive cloud agent entries","inputs":[],"name":"cloud_cleanup"},{"about":"Get event history for a cloud agent","inputs":["issue_number"],"name":"cloud_history"},{"about":"Test API key connectivity and model routing -- detects proxy returning wrong model","inputs":[],"name":"cloud_api_check"},{"about":"Reuse existing Railway service for a new issue number","inputs":["service_id","issue_number"],"name":"cloud_redeploy"},{"about":"Diagnose why an agent failed -- shows GitHub comments, JSONL events, PR status","inputs":["issue_number"],"name":"cloud_diagnose"},{"about":"Create a GitHub issue with agent:spawn label for auto-spawning","inputs":["title"],"name":"cloud_issue_create"},{"about":"Railway multi-account farm dashboard -- shows all accounts with capacity and daily limits","inputs":[],"name":"cloud_farm"},{"about":"Sync active service counts across all Railway accounts","inputs":[],"name":"cloud_farm_sync"},{"about":"Get farm capacity as JSON -- total slots, active services, daily remaining per account","inputs":[],"name":"cloud_farm_capacity"},{"about":"Migrate services from overloaded to underloaded Railway accounts","inputs":[],"name":"cloud_farm_rebalance"},{"about":"Farm evolution health dashboard -- leaderboard, health_score 0-100, stagnation, ETA","inputs":[],"name":"farm_evolve_health"},{"about":"Farm insight scan -- detect leader changes, plateaus, spikes, wave completion. Sends to Telegram unless dry-run","inputs":["dry_run"],"name":"farm_evolve_notify"},{"about":"Single evolution sweep -- inject sacred children into free slots, auto-notify. Always --once","inputs":["sacred","dry_run"],"name":"farm_evolve_watch"},{"about":"Spawn an HSLM training experiment on Railway farm","inputs":["name"],"name":"cloud_train"},{"about":"Spawn all 13 HSLM training experiments across Railway farm","inputs":[],"name":"cloud_train_batch"},{"about":"Chain Link 0: TVC Gate -- search corpus, return cached or continue","inputs":["task"],"name":"chain_cache"},{"about":"Chain Link 1: Analyze previous version v(n-1)","inputs":["task"],"name":"chain_baseline"},{"about":"Chain Link 2: Collect performance metrics","inputs":["task"],"name":"chain_metrics"},{"about":"Chain Link 3: Research patterns and science (PAS)","inputs":["task"],"name":"chain_patterns"},{"about":"Chain Link 4: Build technology dependency tree","inputs":["task"],"name":"chain_tree"},{"about":"Chain Link 5: VIBEE-first compliance check","inputs":["task"],"name":"chain_check_spec"},{"about":"Chain Link 6: Create .tri specifications","inputs":["task"],"name":"chain_spec"},{"about":"Chain Link 7: Generate Zig code from .tri specs","inputs":["task"],"name":"chain_codegen"},{"about":"Chain Link 8: Sacred Intelligence code analysis","inputs":["task"],"name":"chain_analyze"},{"about":"Chain Link 9: Run zig build test suite","inputs":["task"],"name":"chain_test"},{"about":"Chain Link 10: CRITICAL -- Compare to baseline v(n-1)","inputs":["task"],"name":"chain_bench"},{"about":"Chain Link 11: SWE Agent error fixing","inputs":["task"],"name":"chain_fix"},{"about":"Chain Link 12: Compare to external tools (llama.cpp/vLLM)","inputs":["task"],"name":"chain_bench_ext"},{"about":"Chain Link 13: Gap to theoretical maximum","inputs":["task"],"name":"chain_bench_theory"},{"about":"Chain Link 14: Generate improvement delta report","inputs":["task"],"name":"chain_delta"},{"about":"Chain Link 15: Optimize if needed (optional)","inputs":["task"],"name":"chain_optimize"},{"about":"Chain Link 16: Generate documentation with proofs","inputs":["task"],"name":"chain_docs"},{"about":"Chain Link 17: Critical self-assessment (toxic verdict)","inputs":["task"],"name":"chain_verdict"},{"about":"Chain Link 18: Commit and push changes","inputs":["task"],"name":"chain_git"},{"about":"Chain Link 19: Decide next iteration (continue/exit)","inputs":["task"],"name":"chain_loop"},{"about":"Chain Link 20: Auto-deploy to cloud","inputs":["task"],"name":"chain_deploy"},{"about":"Chain Link 21: Pipeline analyzes itself (eternal self-evolution)","inputs":["task"],"name":"chain_evolve"},{"about":"Chain Link 22: Pipeline improves itself (circular bootstrapping)","inputs":["task"],"name":"chain_self_ref"},{"about":"Chain Link 23: Camera-based LED verification for FPGA","inputs":["task"],"name":"chain_fpga_test"},{"about":"Chain Link 24: Research-assisted error fixing via Perplexity","inputs":["task"],"name":"chain_research"},{"about":"Chain Link 25: Validate .tri spec syntax before codegen","inputs":["task"],"name":"chain_lint_spec"},{"about":"List all 26 Golden Chain links with roles and status","inputs":[],"name":"chain_list"},{"about":"Decompose a GitHub issue into 5 role-based sub-issues (planner/coder/reviewer/tester/integrator)","inputs":["issue_number","template"],"name":"cloud_decompose"},{"about":"Send/edit/pin Telegram messages via tri CLI","inputs":["text","chat_id","pin","edit_id"],"name":"tri_notify"},{"about":"Scan for USB-UART serial devices (CH340/FTDI) connected to FPGA","inputs":[],"name":"fpga_uart_scan"},{"about":"PING/PONG test -- send 0x03, expect 0x83 from FPGA","inputs":["device"],"name":"fpga_uart_ping"},{"about":"Send raw hex bytes to FPGA via UART and print response","inputs":["device","hex_bytes"],"name":"fpga_uart_send"},{"about":"Get doctor health status -- one-line summary","inputs":[],"name":"doctor_status"},{"about":"Scan and classify all .zig files","inputs":[],"name":"doctor_scan"},{"about":"Health score dashboard with emoji grades","inputs":[],"name":"doctor_report"},{"about":"Create migration queue for manual files","inputs":[],"name":"doctor_plan"},{"about":"Regenerate manual files through pipeline","inputs":[],"name":"doctor_heal"},{"about":"Start a background job","inputs":["command"],"name":"job_start"},{"about":"Get job status by ID","inputs":["id"],"name":"job_status"},{"about":"Get job logs by ID","inputs":["id"],"name":"job_logs"},{"about":"List all background jobs","inputs":[],"name":"job_list"},{"about":"Cancel a running job","inputs":["id"],"name":"job_cancel"},{"about":"Get job artifacts by ID","inputs":["id"],"name":"job_artifacts"},{"about":"List open GitHub issues","inputs":[],"name":"issue_list"},{"about":"View a specific GitHub issue","inputs":["number"],"name":"issue_view"},{"about":"Create a new GitHub issue","inputs":["title","body"],"name":"issue_create"},{"about":"Add a comment to a GitHub issue","inputs":["number","body"],"name":"issue_comment"},{"about":"Close a GitHub issue","inputs":["number"],"name":"issue_close"},{"about":"Assign a user to a GitHub issue","inputs":["number","user"],"name":"issue_assign"},{"about":"Decompose a GitHub issue into sub-tasks","inputs":["number"],"name":"issue_decompose"},{"about":"Get deployment status","inputs":[],"name":"deploy_status"},{"about":"Get deployment logs","inputs":[],"name":"deploy_logs"},{"about":"Get deployment environment variables","inputs":[],"name":"deploy_vars"},{"about":"Start deployment","inputs":[],"name":"deploy_start"},{"about":"Stop deployment","inputs":[],"name":"deploy_stop"},{"about":"Save an experience entry (key-value learning)","inputs":["key","value"],"name":"experience_save"},{"about":"Recall an experience entry by key","inputs":["key"],"name":"experience_recall"},{"about":"List all recorded mistakes/anti-patterns","inputs":[],"name":"experience_mistakes"},{"about":"Get patent portfolio status","inputs":[],"name":"patent_status"},{"about":"Get patent analysis and claims","inputs":[],"name":"patent_analysis"},{"about":"Get DePIN node protocol status","inputs":[],"name":"depin_status"},{"about":"List DePIN network nodes","inputs":[],"name":"depin_nodes"},{"about":"Get DePIN node fitness scores","inputs":[],"name":"depin_fitness"},{"about":"Research a topic via Perplexity-assisted search","inputs":["query"],"name":"research_query"},{"about":"List all HSLM training experiments","inputs":[],"name":"experiment_list"},{"about":"Compare two experiments","inputs":["a","b"],"name":"experiment_compare"},{"about":"Run a chimera fused command (farm-cycle, train-cycle, etc.)","inputs":["name"],"name":"chimera_run"},{"about":"Get ouroboros self-evolution status and score","inputs":[],"name":"ouroboros_status"},{"about":"Run ouroboros self-evolution cycle","inputs":[],"name":"ouroboros_run"},{"about":"Run self-test suite","inputs":[],"name":"self_test"},{"about":"Get self-health check results","inputs":[],"name":"self_health"},{"about":"Get current context info (tokens, files, window)","inputs":[],"name":"context_info"},{"about":"Load additional context from a file path","inputs":["path"],"name":"context_load"},{"about":"Get Faculty Board status dashboard","inputs":[],"name":"faculty_status"},{"about":"Get MU agent status","inputs":[],"name":"mu_status"},{"about":"List MU learned patterns","inputs":[],"name":"mu_patterns"},{"about":"Get Zenodo publication status","inputs":[],"name":"zenodo_status"},{"about":"Analyze codebase quality and metrics","inputs":[],"name":"tri_analyze"},{"about":"Clean build artifacts and temp files","inputs":[],"name":"tri_clean"},{"about":"Format all Zig source files","inputs":[],"name":"tri_fmt"},{"about":"Show project statistics (LOC, files, tests)","inputs":[],"name":"tri_stats"},{"about":"Run linter on source code","inputs":[],"name":"tri_lint"},{"about":"Search codebase for a query string","inputs":["query"],"name":"tri_search"},{"about":"Get project metrics dashboard","inputs":[],"name":"tri_metrics"},{"about":"Get execution trace","inputs":[],"name":"tri_trace"},{"about":"Evaluate expression or code snippet","inputs":[],"name":"tri_eval"},{"about":"Get training farm status overview","inputs":[],"name":"farm_status"},{"about":"List idle farm workers","inputs":[],"name":"farm_idle"},{"about":"Recycle underperforming farm workers","inputs":[],"name":"farm_recycle"},{"about":"Fill empty farm slots with new experiments","inputs":[],"name":"farm_fill"},{"about":"List all 8 Railway farm accounts and their service counts","inputs":[],"name":"farm_accounts"},{"about":"Spawn a wave of training workers on a specific account","inputs":["account","count"],"name":"farm_wave_spawn"},{"about":"Run FPGA synthesis pipeline","inputs":[],"name":"fpga_synth"},{"about":"Get FPGA hardware and synthesis status","inputs":[],"name":"fpga_status"},{"about":"Build FPGA bitstream","inputs":[],"name":"fpga_build"},{"about":"Verify FPGA bitstream against RTL","inputs":[],"name":"fpga_verify"},{"about":"Flash bitstream to FPGA board","inputs":["bitstream"],"name":"fpga_flash"}],"toolsNote":"Static list parsed from writeToolsList (210 entries; 32 entries have an unbalanced trailing brace in the source literal and were parsed after adding or removing one). Cell-generated tools from data/cells/mcp_tools.json are appended at runtime and are not listed here. .trinity/mcp_schemas.json lists a different, shorter set (29 names) and is not used as the source.","transport":"stdio","typecheckOk":true,"witness":"source-parse"},{"aboutSource":".mcp.json entry; no tool list in this repository","agents":[],"config":".mcp.json","discarded":0,"env":[],"external":true,"family":"mcp","fields":{"ABOUT":"External MCP server `zig-docs` registered in .mcp.json; launched as `npx -y @nichochar/zig-mcp@latest`.","ABOUT_SOURCE":".mcp.json entry; no tool list in this repository","AGENTS":[],"AGENTS_NOTE":"No source binds an agent letter to this server: docs/agents/AGENTS_ALPHABET.md, specs/OWNERS.md and .claude/agents/*.md do not name it.","CONFIG":".mcp.json","ENABLED":true,"ENV":[],"EXTERNAL":true,"FAMILY":"mcp","ID":"mcp/zig-docs","KIND":"tool","LAUNCH":"npx -y @nichochar/zig-mcp@latest","REPO":"gHashTag/trinity","RESOURCES":[],"RESOURCES_ABOUT":[],"SERVER":"zig-docs","SERVER_VERSION":"","SOURCE":".mcp.json","TOOLS":[],"TOOLS_ABOUT":[],"TOOLS_INPUTS":[],"TOOLS_NOTE":"Tool list lives in the external npm package, not in this repository; nothing is listed rather than guessed.","TRANSPORT":"stdio","WITNESS":"source-parse"},"health":"ok","id":"mcp/zig-docs","inSpecCorpus":false,"launch":"npx -y @nichochar/zig-mcp@latest","links":{"config":"https://github.com/gHashTag/trinity/blob/da84d38795aa97f9170bb670f04a328032aa6ffe/.mcp.json","pinnedAt":"da84d38795aa97f9170bb670f04a328032aa6ffe","source":"https://github.com/gHashTag/trinity/blob/da84d38795aa97f9170bb670f04a328032aa6ffe/.mcp.json"},"messages":["no agent letter bound by a source","external package: tool list not in the repository"],"moduleName":"tool_mcp_zig_docs","name":{"en":"zig-docs"},"repo":"gHashTag/trinity","resources":[],"searchText":"mcp/zig-docs zig-docs external mcp server `zig-docs` registered in .mcp.json; launched as `npx -y @nichochar/zig-mcp@latest`.","server":"zig-docs","serverVersion":"","sha256":"0ca27e86e89947535eddbf81ddf34bde6a38ce06d77fdb191bda02bd392dd556","skills":[],"source":".mcp.json","specPath":"specs/tools/mcp/zig-docs.t27","summary":{"en":"External MCP server `zig-docs` registered in .mcp.json; launched as `npx -y @nichochar/zig-mcp@latest`.","ru":"Внешний MCP-сервер `zig-docs`, зарегистрированный в .mcp.json; запускается как `npx -y @nichochar/zig-mcp@latest`."},"tools":[],"toolsNote":"Tool list lives in the external npm package, not in this repository; nothing is listed rather than guessed.","transport":"stdio","typecheckOk":true,"witness":"source-parse"},{"aboutSource":"clap /// doc on Commands::Abandoned (cli/tri/src/main.rs; module cli/tri/src/abandoned.rs)","actions":[{"about":"List recovery sites whose preceding comment names a concrete construct.","name":"list"}],"agents":[],"args":[],"command":"tri abandoned","discarded":0,"entry":"cli/tri/src/main.rs","family":"tri-cli","fields":{"ABOUT":"Recovery sites whose own comment names the construct they discard.","ABOUT_SOURCE":"clap /// doc on Commands::Abandoned (cli/tri/src/main.rs; module cli/tri/src/abandoned.rs)","ACTIONS":["list"],"ACTIONS_ABOUT":["List recovery sites whose preceding comment names a concrete construct."],"AGENTS":[],"AGENTS_NOTE":"No source binds an agent letter to this command: docs/agents/AGENTS_ALPHABET.md (rows, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name it. creator.md and verifier.md name tri gen/test/verify but are not letter agents.","ARGS":[],"COMMAND":"tri abandoned","ENABLED":true,"ENTRY":"cli/tri/src/main.rs","FAMILY":"tri-cli","ID":"tri/abandoned","KIND":"tool","SOURCE":"cli/tri/src/abandoned.rs","VARIANT":"Commands::Abandoned","WHEN_TO_USE":"Recovery sites whose own comment names the construct they discard.","WITNESS":"source-parse"},"health":"ok","id":"tri/abandoned","inSpecCorpus":false,"links":{"config":null,"pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","source":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/cli/tri/src/abandoned.rs"},"messages":["no agent letter bound by a source"],"moduleName":"tool_tri_abandoned","name":{"en":"tri abandoned"},"repo":"gHashTag/t27","searchText":"tri/abandoned tri abandoned recovery sites whose own comment names the construct they discard. recovery sites whose own comment names the construct they discard. list list recovery sites whose preceding comment names a concrete construct.","sha256":"99c323aac1181bc537c07d34aab2d76d833a2a88bec00397e59b21650f933177","skills":[],"source":"cli/tri/src/abandoned.rs","specPath":"specs/tools/tri/abandoned.t27","summary":{"en":"Recovery sites whose own comment names the construct they discard.","ru":"Точки восстановления, чей собственный комментарий называет отбрасываемую конструкцию."},"typecheckOk":true,"variant":"Commands::Abandoned","whenToUse":"Recovery sites whose own comment names the construct they discard.","witness":"source-parse"},{"aboutSource":"tri-mcp tools tri_cell_checkpoint and tri_cell_seal descriptions (cli/tri-mcp/src/main.rs); CellAction enum cli/tri/src/main.rs:448","actions":[{"about":"","name":"checkpoint"},{"about":"","name":"seal"}],"agents":[{"letter":"W","ok":true}],"args":[],"command":"tri cell","discarded":0,"entry":"cli/tri/src/main.rs","family":"tri-cli","fields":{"ABOUT":"Records a checkpoint step in the active cell. Seals the active cell by computing a SHA-256 hash of its checkpoint history.","ABOUT_SOURCE":"tri-mcp tools tri_cell_checkpoint and tri_cell_seal descriptions (cli/tri-mcp/src/main.rs); CellAction enum cli/tri/src/main.rs:448","ACTIONS":["checkpoint","seal"],"ACTIONS_ABOUT":["",""],"AGENTS":["W"],"AGENTS_NOTE":"docs/agents/AGENTS_ALPHABET.md:144, agent W domain Workflow / tri cell, key file src/tri/cell.zig; PHASE 6 EVOLVE: W seals tri-cell commit (hash seal).","ARGS":[],"COMMAND":"tri cell","ENABLED":true,"ENTRY":"cli/tri/src/main.rs","FAMILY":"tri-cli","ID":"tri/cell","KIND":"tool","SOURCE":"cli/tri/src/main.rs","VARIANT":"Commands::Cell","WHEN_TO_USE":"Records a checkpoint step in the active cell. Seals the active cell by computing a SHA-256 hash of its checkpoint history.","WITNESS":"source-parse"},"health":"ok","id":"tri/cell","inSpecCorpus":false,"links":{"config":null,"pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","source":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/cli/tri/src/main.rs"},"messages":[],"moduleName":"tool_tri_cell","name":{"en":"tri cell"},"repo":"gHashTag/t27","searchText":"tri/cell tri cell records a checkpoint step in the active cell. seals the active cell by computing a sha-256 hash of its checkpoint history. records a checkpoint step in the active cell. seals the active cell by computing a sha-256 hash of its checkpoint history. checkpoint seal w","sha256":"8f356f8622d1c58b069b50d33eb6cc491f4b37d9ba960fa2d16e5c340f40707c","skills":[],"source":"cli/tri/src/main.rs","specPath":"specs/tools/tri/cell.t27","summary":{"en":"Records a checkpoint step in the active cell. Seals the active cell by computing a SHA-256 hash of its checkpoint history.","ru":"Записывает шаг-контрольную точку в активной ячейке; запечатывает активную ячейку, вычисляя SHA-256 истории её контрольных точек."},"typecheckOk":true,"variant":"Commands::Cell","whenToUse":"Records a checkpoint step in the active cell. Seals the active cell by computing a SHA-256 hash of its checkpoint history.","witness":"source-parse"},{"aboutSource":"clap /// doc on Commands::Census (cli/tri/src/main.rs; module cli/tri/src/census.rs)","actions":[{"about":"Every census's printed population, against one counted another way.","name":"audit"},{"about":"Pin each pure census's output, so a change that moves one has to say so.","name":"pin"}],"agents":[],"args":[],"command":"tri census","discarded":0,"entry":"cli/tri/src/main.rs","family":"tri-cli","fields":{"ABOUT":"Specs the compiler cannot read, ranked by the construct that stops it. Every census's printed population, against one counted another way.","ABOUT_SOURCE":"clap /// doc on Commands::Census (cli/tri/src/main.rs; module cli/tri/src/census.rs)","ACTIONS":["audit","pin"],"ACTIONS_ABOUT":["Every census's printed population, against one counted another way.","Pin each pure census's output, so a change that moves one has to say so."],"AGENTS":[],"AGENTS_NOTE":"No source binds an agent letter to this command: docs/agents/AGENTS_ALPHABET.md (rows, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name it. creator.md and verifier.md name tri gen/test/verify but are not letter agents.","ARGS":[],"COMMAND":"tri census","ENABLED":true,"ENTRY":"cli/tri/src/main.rs","FAMILY":"tri-cli","ID":"tri/census","KIND":"tool","SOURCE":"cli/tri/src/census.rs","VARIANT":"Commands::Census","WHEN_TO_USE":"Specs the compiler cannot read, ranked by the construct that stops it. Every census's printed population, against one counted another way.","WITNESS":"source-parse"},"health":"ok","id":"tri/census","inSpecCorpus":false,"links":{"config":null,"pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","source":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/cli/tri/src/census.rs"},"messages":["no agent letter bound by a source"],"moduleName":"tool_tri_census","name":{"en":"tri census"},"repo":"gHashTag/t27","searchText":"tri/census tri census specs the compiler cannot read, ranked by the construct that stops it. every census's printed population, against one counted another way. specs the compiler cannot read, ranked by the construct that stops it. every census's printed population, against one counted another way. audit every census's printed population, against one counted another way. pin pin each pure census's output, so a change that moves one has to say so.","sha256":"d2426bdd477bfa774377cc703a976600d95d527902f411e4787b2081a3944c17","skills":[],"source":"cli/tri/src/census.rs","specPath":"specs/tools/tri/census.t27","summary":{"en":"Specs the compiler cannot read, ranked by the construct that stops it. Every census's printed population, against one counted another way.","ru":"Спеки, которые компилятор не может прочитать, ранжированные по конструкции, которая его останавливает. Напечатанная популяция каждой переписи против одной, посчитанной иначе."},"typecheckOk":true,"variant":"Commands::Census","whenToUse":"Specs the compiler cannot read, ranked by the construct that stops it. Every census's printed population, against one counted another way.","witness":"source-parse"},{"aboutSource":"clap /// doc on Commands::Ci (cli/tri/src/main.rs; module cli/tri/src/cibase.rs)","actions":[{"about":"List PR gates that have never run on the default branch.","name":"baseline"}],"agents":[],"args":[],"command":"tri ci","discarded":0,"entry":"cli/tri/src/main.rs","family":"tri-cli","fields":{"ABOUT":"Is the hardware this plan assumes actually attached? CI questions about the repository's own gates.","ABOUT_SOURCE":"clap /// doc on Commands::Ci (cli/tri/src/main.rs; module cli/tri/src/cibase.rs)","ACTIONS":["baseline"],"ACTIONS_ABOUT":["List PR gates that have never run on the default branch."],"AGENTS":[],"AGENTS_NOTE":"No source binds an agent letter to this command: docs/agents/AGENTS_ALPHABET.md (rows, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name it. creator.md and verifier.md name tri gen/test/verify but are not letter agents.","ARGS":[],"COMMAND":"tri ci","ENABLED":true,"ENTRY":"cli/tri/src/main.rs","FAMILY":"tri-cli","ID":"tri/ci","KIND":"tool","SOURCE":"cli/tri/src/cibase.rs","VARIANT":"Commands::Ci","WHEN_TO_USE":"Is the hardware this plan assumes actually attached? CI questions about the repository's own gates.","WITNESS":"source-parse"},"health":"ok","id":"tri/ci","inSpecCorpus":false,"links":{"config":null,"pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","source":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/cli/tri/src/cibase.rs"},"messages":["no agent letter bound by a source"],"moduleName":"tool_tri_ci","name":{"en":"tri ci"},"repo":"gHashTag/t27","searchText":"tri/ci tri ci is the hardware this plan assumes actually attached? ci questions about the repository's own gates. is the hardware this plan assumes actually attached? ci questions about the repository's own gates. baseline list pr gates that have never run on the default branch.","sha256":"b697c22ef3e3a8630a6e171a63eafd2dfbb76e3f18c78dcedfbb5d55bbe5f5f8","skills":[],"source":"cli/tri/src/cibase.rs","specPath":"specs/tools/tri/ci.t27","summary":{"en":"Is the hardware this plan assumes actually attached? CI questions about the repository's own gates.","ru":"Действительно ли подключено оборудование, которое предполагает этот план? Вопросы CI о собственных гейтах репозитория."},"typecheckOk":true,"variant":"Commands::Ci","whenToUse":"Is the hardware this plan assumes actually attached? CI questions about the repository's own gates.","witness":"source-parse"},{"aboutSource":"clap /// doc on Commands::Competitors (cli/tri/src/main.rs; module cli/tri/src/competitors.rs)","actions":[{"about":"Count the records, the double-entered papers and the unpublished zeros.","name":"audit"},{"about":"When the survey behind this table last read a paper, by the month its citations encode.","name":"freshness"}],"agents":[],"args":[],"command":"tri competitors","discarded":0,"entry":"cli/tri/src/main.rs","family":"tri-cli","fields":{"ABOUT":"The competitor table against its own contract: how many of its published scores were never published, and how many papers it counts twice.","ABOUT_SOURCE":"clap /// doc on Commands::Competitors (cli/tri/src/main.rs; module cli/tri/src/competitors.rs)","ACTIONS":["audit","freshness"],"ACTIONS_ABOUT":["Count the records, the double-entered papers and the unpublished zeros.","When the survey behind this table last read a paper, by the month its citations encode."],"AGENTS":[],"AGENTS_NOTE":"No source binds an agent letter to this command: docs/agents/AGENTS_ALPHABET.md (rows, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name it. creator.md and verifier.md name tri gen/test/verify but are not letter agents.","ARGS":[],"COMMAND":"tri competitors","ENABLED":true,"ENTRY":"cli/tri/src/main.rs","FAMILY":"tri-cli","ID":"tri/competitors","KIND":"tool","SOURCE":"cli/tri/src/competitors.rs","VARIANT":"Commands::Competitors","WHEN_TO_USE":"The competitor table against its own contract: how many of its published scores were never published, and how many papers it counts twice.","WITNESS":"source-parse"},"health":"ok","id":"tri/competitors","inSpecCorpus":false,"links":{"config":null,"pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","source":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/cli/tri/src/competitors.rs"},"messages":["no agent letter bound by a source"],"moduleName":"tool_tri_competitors","name":{"en":"tri competitors"},"repo":"gHashTag/t27","searchText":"tri/competitors tri competitors the competitor table against its own contract: how many of its published scores were never published, and how many papers it counts twice. the competitor table against its own contract: how many of its published scores were never published, and how many papers it counts twice. audit count the records, the double-entered papers and the unpublished zeros. freshness when the survey behind this table last read a paper, by the month its citations encode.","sha256":"e8c894652a4da4065722431cce5357d3a23372f1012f0d6db73616c7ecb78de9","skills":[],"source":"cli/tri/src/competitors.rs","specPath":"specs/tools/tri/competitors.t27","summary":{"en":"The competitor table against its own contract: how many of its published scores were never published, and how many papers it counts twice.","ru":"Таблица конкурентов против собственного контракта: сколько её опубликованных оценок никогда не публиковались и сколько статей она считает дважды."},"typecheckOk":true,"variant":"Commands::Competitors","whenToUse":"The competitor table against its own contract: how many of its published scores were never published, and how many papers it counts twice.","witness":"source-parse"},{"aboutSource":"clap /// doc on Commands::Discard (cli/tri/src/main.rs; module cli/tri/src/discard.rs)","actions":[{"about":"Rank the discarding specs, largest first, against the pinned volume.","name":"top"},{"about":"Group the discard by which recovery threw it away, and what it stopped on.","name":"classify"}],"agents":[],"args":[],"command":"tri discard","discarded":0,"entry":"cli/tri/src/main.rs","family":"tri-cli","fields":{"ABOUT":"What the parser reads and throws away, ranked against its pinned bound.","ABOUT_SOURCE":"clap /// doc on Commands::Discard (cli/tri/src/main.rs; module cli/tri/src/discard.rs)","ACTIONS":["top","classify"],"ACTIONS_ABOUT":["Rank the discarding specs, largest first, against the pinned volume.","Group the discard by which recovery threw it away, and what it stopped on."],"AGENTS":[],"AGENTS_NOTE":"No source binds an agent letter to this command: docs/agents/AGENTS_ALPHABET.md (rows, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name it. creator.md and verifier.md name tri gen/test/verify but are not letter agents.","ARGS":[],"COMMAND":"tri discard","ENABLED":true,"ENTRY":"cli/tri/src/main.rs","FAMILY":"tri-cli","ID":"tri/discard","KIND":"tool","SOURCE":"cli/tri/src/discard.rs","VARIANT":"Commands::Discard","WHEN_TO_USE":"What the parser reads and throws away, ranked against its pinned bound.","WITNESS":"source-parse"},"health":"ok","id":"tri/discard","inSpecCorpus":false,"links":{"config":null,"pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","source":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/cli/tri/src/discard.rs"},"messages":["no agent letter bound by a source"],"moduleName":"tool_tri_discard","name":{"en":"tri discard"},"repo":"gHashTag/t27","searchText":"tri/discard tri discard what the parser reads and throws away, ranked against its pinned bound. what the parser reads and throws away, ranked against its pinned bound. top rank the discarding specs, largest first, against the pinned volume. classify group the discard by which recovery threw it away, and what it stopped on.","sha256":"779a83cf234f5dcba9a852d533912609f5dd1a330ebac28fd31c23ef342430eb","skills":[],"source":"cli/tri/src/discard.rs","specPath":"specs/tools/tri/discard.t27","summary":{"en":"What the parser reads and throws away, ranked against its pinned bound.","ru":"Что парсер читает и выбрасывает, в сравнении с закреплённой границей."},"typecheckOk":true,"variant":"Commands::Discard","whenToUse":"What the parser reads and throws away, ranked against its pinned bound.","witness":"source-parse"},{"aboutSource":"handler cmd_doctor match arms start/stop/status and its error text unknown doctor action (start|stop|status) (cli/tri/src/main.rs:934)","actions":[],"agents":[],"args":[{"about":"","name":""}],"command":"tri doctor","discarded":0,"entry":"cli/tri/src/main.rs","family":"tri-cli","fields":{"ABOUT":"Start, stop or show the doctor state kept in .trinity/state/doctor.json (actions: start | stop | status).","ABOUT_SOURCE":"handler cmd_doctor match arms start/stop/status and its error text unknown doctor action (start|stop|status) (cli/tri/src/main.rs:934)","ACTIONS":[],"ACTIONS_ABOUT":[],"AGENTS":[],"AGENTS_NOTE":"No source binds an agent letter to this command: docs/agents/AGENTS_ALPHABET.md (rows, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name it. creator.md and verifier.md name tri gen/test/verify but are not letter agents.","ARGS":[""],"COMMAND":"tri doctor","ENABLED":true,"ENTRY":"cli/tri/src/main.rs","FAMILY":"tri-cli","ID":"tri/doctor","KIND":"tool","SOURCE":"cli/tri/src/main.rs","VARIANT":"Commands::Doctor","WHEN_TO_USE":"Start, stop or show the doctor state kept in .trinity/state/doctor.json (actions: start | stop | status).","WITNESS":"source-parse"},"health":"ok","id":"tri/doctor","inSpecCorpus":false,"links":{"config":null,"pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","source":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/cli/tri/src/main.rs"},"messages":["no agent letter bound by a source"],"moduleName":"tool_tri_doctor","name":{"en":"tri doctor"},"repo":"gHashTag/t27","searchText":"tri/doctor tri doctor start, stop or show the doctor state kept in .trinity/state/doctor.json (actions: start | stop | status). start, stop or show the doctor state kept in .trinity/state/doctor.json (actions: start | stop | status).","sha256":"d33319209c2077839c26db4fa2d707c76c5e040e8eb87a663963616b1cf66dc1","skills":[],"source":"cli/tri/src/main.rs","specPath":"specs/tools/tri/doctor.t27","summary":{"en":"Start, stop or show the doctor state kept in .trinity/state/doctor.json (actions: start | stop | status).","ru":"Запускает, останавливает или показывает состояние doctor, хранимое в .trinity/state/doctor.json (действия: start | stop | status)."},"typecheckOk":true,"variant":"Commands::Doctor","whenToUse":"Start, stop or show the doctor state kept in .trinity/state/doctor.json (actions: start | stop | status).","witness":"source-parse"},{"aboutSource":"clap /// doc on Commands::Elab (cli/tri/src/main.rs; module cli/tri/src/elab.rs)","actions":[{"about":"Distribution of elaboration diagnostics by message shape.","name":"classify"},{"about":"How many diagnostics are secondary -- same source line as one above.","name":"secondary"}],"agents":[],"args":[],"command":"tri elab","discarded":0,"entry":"cli/tri/src/main.rs","family":"tri-cli","fields":{"ABOUT":"Classify a compiler's error output before quoting a number from it.","ABOUT_SOURCE":"clap /// doc on Commands::Elab (cli/tri/src/main.rs; module cli/tri/src/elab.rs)","ACTIONS":["classify","secondary"],"ACTIONS_ABOUT":["Distribution of elaboration diagnostics by message shape.","How many diagnostics are secondary -- same source line as one above."],"AGENTS":[],"AGENTS_NOTE":"No source binds an agent letter to this command: docs/agents/AGENTS_ALPHABET.md (rows, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name it. creator.md and verifier.md name tri gen/test/verify but are not letter agents.","ARGS":[],"COMMAND":"tri elab","ENABLED":true,"ENTRY":"cli/tri/src/main.rs","FAMILY":"tri-cli","ID":"tri/elab","KIND":"tool","SOURCE":"cli/tri/src/elab.rs","VARIANT":"Commands::Elab","WHEN_TO_USE":"Classify a compiler's error output before quoting a number from it.","WITNESS":"source-parse"},"health":"ok","id":"tri/elab","inSpecCorpus":false,"links":{"config":null,"pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","source":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/cli/tri/src/elab.rs"},"messages":["no agent letter bound by a source"],"moduleName":"tool_tri_elab","name":{"en":"tri elab"},"repo":"gHashTag/t27","searchText":"tri/elab tri elab classify a compiler's error output before quoting a number from it. classify a compiler's error output before quoting a number from it. classify distribution of elaboration diagnostics by message shape. secondary how many diagnostics are secondary -- same source line as one above.","sha256":"400d285676771e8b451e872b032a20de2c4f16df4d32b90474719bf677342526","skills":[],"source":"cli/tri/src/elab.rs","specPath":"specs/tools/tri/elab.t27","summary":{"en":"Classify a compiler's error output before quoting a number from it.","ru":"Классифицирует вывод ошибок компилятора прежде, чем цитировать из него число."},"typecheckOk":true,"variant":"Commands::Elab","whenToUse":"Classify a compiler's error output before quoting a number from it.","witness":"source-parse"},{"aboutSource":"clap /// doc on Commands::Emit (cli/tri/src/main.rs; module cli/tri/src/gendet.rs)","actions":[{"about":"Generate the corpus twice with the same binary and name what differs.","name":"determinism"}],"agents":[],"args":[],"command":"tri emit","discarded":0,"entry":"cli/tri/src/main.rs","family":"tri-cli","fields":{"ABOUT":"Does the same binary produce the same generated code twice?","ABOUT_SOURCE":"clap /// doc on Commands::Emit (cli/tri/src/main.rs; module cli/tri/src/gendet.rs)","ACTIONS":["determinism"],"ACTIONS_ABOUT":["Generate the corpus twice with the same binary and name what differs."],"AGENTS":[],"AGENTS_NOTE":"No source binds an agent letter to this command: docs/agents/AGENTS_ALPHABET.md (rows, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name it. creator.md and verifier.md name tri gen/test/verify but are not letter agents.","ARGS":[],"COMMAND":"tri emit","ENABLED":true,"ENTRY":"cli/tri/src/main.rs","FAMILY":"tri-cli","ID":"tri/emit","KIND":"tool","SOURCE":"cli/tri/src/gendet.rs","VARIANT":"Commands::Emit","WHEN_TO_USE":"Does the same binary produce the same generated code twice? Every byte-comparison over emitted output -- seals, emit-bitexact, `corpus --per-spec` diffing -- assumes it does. Three of the four emitters do not; see #3006. (`Gen` is taken by the single-spec emitter, so this is `Emit`.)","WITNESS":"source-parse"},"health":"ok","id":"tri/emit","inSpecCorpus":false,"links":{"config":null,"pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","source":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/cli/tri/src/gendet.rs"},"messages":["no agent letter bound by a source"],"moduleName":"tool_tri_emit","name":{"en":"tri emit"},"repo":"gHashTag/t27","searchText":"tri/emit tri emit does the same binary produce the same generated code twice? does the same binary produce the same generated code twice? every byte-comparison over emitted output -- seals, emit-bitexact, `corpus --per-spec` diffing -- assumes it does. three of the four emitters do not; see #3006. (`gen` is taken by the single-spec emitter, so this is `emit`.) determinism generate the corpus twice with the same binary and name what differs.","sha256":"a7c0599d10d7239b66d63689d31a3bcac556967aac44f153097dbe27c0469123","skills":[],"source":"cli/tri/src/gendet.rs","specPath":"specs/tools/tri/emit.t27","summary":{"en":"Does the same binary produce the same generated code twice?","ru":"Даёт ли один и тот же бинарник один и тот же сгенерированный код дважды?"},"typecheckOk":true,"variant":"Commands::Emit","whenToUse":"Does the same binary produce the same generated code twice? Every byte-comparison over emitted output -- seals, emit-bitexact, `corpus --per-spec` diffing -- assumes it does. Three of the four emitters do not; see #3006. (`Gen` is taken by the single-spec emitter, so this is `Emit`.)","witness":"source-parse"},{"aboutSource":"tri-mcp tool tri_experience_save description (cli/tri-mcp/src/main.rs); ExperienceAction enum cli/tri/src/main.rs:457","actions":[{"about":"","name":"save"}],"agents":[{"letter":"E","ok":true}],"args":[],"command":"tri experience","discarded":0,"entry":"cli/tri/src/main.rs","family":"tri-cli","fields":{"ABOUT":"Saves an experience episode to the akashic log.","ABOUT_SOURCE":"tri-mcp tool tri_experience_save description (cli/tri-mcp/src/main.rs); ExperienceAction enum cli/tri/src/main.rs:457","ACTIONS":["save"],"ACTIONS_ABOUT":[""],"AGENTS":["E"],"AGENTS_NOTE":".claude/agents/agent-e-experience.md:64 (tri experience save -- Save episode to experience log). Lines 65-66 name tri experience query and tri notebook, which the CLI does not have at this commit.","ARGS":[],"COMMAND":"tri experience","ENABLED":true,"ENTRY":"cli/tri/src/main.rs","FAMILY":"tri-cli","ID":"tri/experience","KIND":"tool","SOURCE":"cli/tri/src/main.rs","VARIANT":"Commands::Experience","WHEN_TO_USE":"Saves an experience episode to the akashic log.","WITNESS":"source-parse"},"health":"ok","id":"tri/experience","inSpecCorpus":false,"links":{"config":null,"pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","source":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/cli/tri/src/main.rs"},"messages":[],"moduleName":"tool_tri_experience","name":{"en":"tri experience"},"repo":"gHashTag/t27","searchText":"tri/experience tri experience saves an experience episode to the akashic log. saves an experience episode to the akashic log. save e","sha256":"62fbf3b60098141a017a51cb5edda43ef60debee362588dfb1574e0e0c7eb0f8","skills":[{"id":"t27/tri","via":["SUMMARY_EN"]}],"source":"cli/tri/src/main.rs","specPath":"specs/tools/tri/experience.t27","summary":{"en":"Saves an experience episode to the akashic log.","ru":"Сохраняет эпизод опыта в акашический журнал."},"typecheckOk":true,"variant":"Commands::Experience","whenToUse":"Saves an experience episode to the akashic log.","witness":"source-parse"},{"aboutSource":"//! module doc, cli/tri/src/fleet.rs:1","actions":[{"about":"Scan the USB bus and say plainly what hardware is present.","name":"scan"},{"about":"Check the environments a claim depends on before repeating the claim.","name":"asof"}],"agents":[],"args":[],"command":"tri fleet","discarded":0,"entry":"cli/tri/src/main.rs","family":"tri-cli","fields":{"ABOUT":"`tri fleet` -- is the hardware this plan assumes actually attached?","ABOUT_SOURCE":"//! module doc, cli/tri/src/fleet.rs:1","ACTIONS":["scan","asof"],"ACTIONS_ABOUT":["Scan the USB bus and say plainly what hardware is present.","Check the environments a claim depends on before repeating the claim."],"AGENTS":[],"AGENTS_NOTE":"No source binds an agent letter to this command: docs/agents/AGENTS_ALPHABET.md (rows, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name it. creator.md and verifier.md name tri gen/test/verify but are not letter agents.","ARGS":[],"COMMAND":"tri fleet","ENABLED":true,"ENTRY":"cli/tri/src/main.rs","FAMILY":"tri-cli","ID":"tri/fleet","KIND":"tool","SOURCE":"cli/tri/src/fleet.rs","VARIANT":"Commands::Fleet","WHEN_TO_USE":"`tri fleet` -- is the hardware this plan assumes actually attached?","WITNESS":"source-parse"},"health":"ok","id":"tri/fleet","inSpecCorpus":false,"links":{"config":null,"pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","source":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/cli/tri/src/fleet.rs"},"messages":["no agent letter bound by a source"],"moduleName":"tool_tri_fleet","name":{"en":"tri fleet"},"repo":"gHashTag/t27","searchText":"tri/fleet tri fleet `tri fleet` -- is the hardware this plan assumes actually attached? `tri fleet` -- is the hardware this plan assumes actually attached? scan scan the usb bus and say plainly what hardware is present. asof check the environments a claim depends on before repeating the claim.","sha256":"bbe8ff7a66b4cedf6ad59cce1aab0db9290e96abda4c61e74945e479f605dd0b","skills":[],"source":"cli/tri/src/fleet.rs","specPath":"specs/tools/tri/fleet.t27","summary":{"en":"`tri fleet` -- is the hardware this plan assumes actually attached?","ru":"`tri fleet` -- действительно ли подключено оборудование, которое предполагает этот план?"},"typecheckOk":true,"variant":"Commands::Fleet","whenToUse":"`tri fleet` -- is the hardware this plan assumes actually attached?","witness":"source-parse"},{"aboutSource":"clap /// doc on Commands::Fmt (cli/tri/src/main.rs)","actions":[],"agents":[],"args":[{"about":"One package instead of the whole workspace.","name":"--package"},{"about":"Report what is dirty and whether a workflow formats, and stop.","name":"--dry-run"}],"command":"tri fmt","discarded":0,"entry":"cli/tri/src/main.rs","family":"tri-cli","fields":{"ABOUT":"Type names with more than one definition in the spec tree. Run the formatter and restore every file it rewrote that you had not touched.","ABOUT_SOURCE":"clap /// doc on Commands::Fmt (cli/tri/src/main.rs)","ACTIONS":[],"ACTIONS_ABOUT":[],"AGENTS":[],"AGENTS_NOTE":"No source binds an agent letter to this command: docs/agents/AGENTS_ALPHABET.md (rows, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name it. creator.md and verifier.md name tri gen/test/verify but are not letter agents.","ARGS":["--package: One package instead of the whole workspace.","--dry-run: Report what is dirty and whether a workflow formats, and stop."],"COMMAND":"tri fmt","ENABLED":true,"ENTRY":"cli/tri/src/main.rs","FAMILY":"tri-cli","ID":"tri/fmt","KIND":"tool","SOURCE":"cli/tri/src/main.rs","VARIANT":"Commands::Fmt","WHEN_TO_USE":"Type names with more than one definition in the spec tree. Run the formatter and restore every file it rewrote that you had not touched.","WITNESS":"source-parse"},"health":"ok","id":"tri/fmt","inSpecCorpus":false,"links":{"config":null,"pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","source":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/cli/tri/src/main.rs"},"messages":["no agent letter bound by a source"],"moduleName":"tool_tri_fmt","name":{"en":"tri fmt"},"repo":"gHashTag/t27","searchText":"tri/fmt tri fmt type names with more than one definition in the spec tree. run the formatter and restore every file it rewrote that you had not touched. type names with more than one definition in the spec tree. run the formatter and restore every file it rewrote that you had not touched.","sha256":"898a2cf21e115851d800dd3da26e31700a581d5bc74ef264b0c01130c5d9a81f","skills":[],"source":"cli/tri/src/main.rs","specPath":"specs/tools/tri/fmt.t27","summary":{"en":"Type names with more than one definition in the spec tree. Run the formatter and restore every file it rewrote that you had not touched.","ru":"Имена типов с более чем одним определением в дереве спеков. Запускает форматтер и восстанавливает каждый переписанный им файл, которого вы не трогали."},"typecheckOk":true,"variant":"Commands::Fmt","whenToUse":"Type names with more than one definition in the spec tree. Run the formatter and restore every file it rewrote that you had not touched.","witness":"source-parse"},{"aboutSource":"clap /// doc on Commands::Fpga (cli/tri/src/main.rs; module cli/tri/src/fpga.rs)","actions":[{"about":"Read and print the JTAG IDCODE of the attached DLC10 cable target.","name":"idcode"},{"about":"Read the configuration IDCODE register via the Type-1 CFG_IN/CFG_OUT protocol. On a healthy XC7A100T this must return 0x13631093 (same as the JTAG IDCODE). If 0x00000000 is returned while `idcode` works, the read_cfg_reg implementation is broken.","name":"idcode-cfg"},{"about":"Program FPGA SRAM (volatile -- lost on power-cycle).","name":"sram"},{"about":"Program the on-board SPI flash (non-volatile / persistent).","name":"program"},{"about":"Read the SPI flash JEDEC ID via the JTAG-to-SPI bridge.","name":"flash-id"},{"about":"Read the raw CFG_OUT status register.","name":"status"},{"about":"Decode 7-series configuration registers for DONE=LOW diagnosis.","name":"debug"},{"about":"Load a bitstream into FPGA SRAM using openFPGALoader with a Digilent FTDI cable. This is the canonical path for the QMTech Wukong V1 / XC7A200T board because the in-tree `dlc10` driver only supports Xilinx DLC10 cables (VID=0x03FD), not the attached Digilent cable (VID=0x0403:0x6014).","name":"load-sram"},{"about":"Read and decode the FPGA STAT register via openFPGALoader.","name":"stat"},{"about":"Read the FPGA XADC sensors (temperature, VCCINT, VCCAUX) via openFPGALoader and print a JSON object. The board must be powered and connected through a supported cable such as `digilent_hs2`.","name":"read-xadc"},{"about":"Synthesize the GF16 4x4 matrix design through the openXC7 toolchain. Output is written to `/gf16_matmul4x4_top.bit`.","name":"synth-gf16"},{"about":"Program the on-board SPI flash (non-volatile) using openFPGALoader's JTAG-to-SPI bridge. Requires a matching `spiOverJtag` bitstream for the exact FPGA package; the XC7A200T-FGG676 bridge is present in recent openFPGALoader distributions but flash boot may still depend on board mode pins (see docs/reports/FPGA_LOOP_EVIDENCE_2026-07-04.md).","name":"program-flash"},{"about":"Dump SPI flash contents to a file via openFPGALoader's JTAG-to-SPI bridge.","name":"dump-flash"},{"about":"Parse the .bit header and print the configuration registers that affect Master SPI boot (COR0, COR1, WBSTAR, TIMER, CTL0, CTL1, IDCODE, BSPI).","name":"bit-config"},{"about":"Program the given .bit to SPI flash, dump the same region back, and compare the dumped bytes against the bitstream payload. This verifies the openFPGALoader write path is bit-perfect for the raw bitstream.","name":"round-trip-verify"},{"about":"Guided cold-POR boot experiment. Programs flash, asks the user to physically power-cycle the board, then captures STAT without a JTAG reset and prints a decision-tree diagnosis.","name":"boot-log"},{"about":"Deterministic cold-POR boot experiment with optional relay control. With `--relay-port MOCK` the command writes a deterministic, clearly labeled mock boot log so CI can exercise the cold-POR JSON path without touching hardware. Real relay ports are reserved for Variant A/B.","name":"cold-por"},{"about":"Board-less smoke gate for the FPGA path. Runs `tri fpga bit-config` on the GF16 demo bitstream and, if yosys is available, a synthesis smoke check on the demo Verilog. Requires no physical board.","name":"smoke-gate"},{"about":"Print or interactively confirm the cold-POR boot protocol. This is the standalone version of the instructions embedded in `boot-log` and `cclk-sweep`; use it to verify the operator steps before a physical power-cycle.","name":"boot-protocol"},{"about":"Patch the raw OSCFSEL field (COR0[22:17]) of a 7-series .bit file.","name":"patch-cor0"},{"about":"Generate a set of OSCFSEL variants from a single input .bit file. Outputs one file per requested value to the given directory.","name":"cclk-variants"},{"about":"Automated cold-POR CCLK sweep. Generates OSCFSEL variants, programs each to flash, prompts for the physical power-cycle, captures STAT, and writes JSON logs. The only manual step is disconnecting/reconnecting the cable and power-cycling the board.","name":"cclk-sweep"},{"about":"Read all `build/fpga/boot-log-*.json` files and produce a sweep report identifying the first working CCLK variant.","name":"sweep-report"},{"about":"Print DSLogic / oscilloscope instructions for measuring the FPGA CCLK output during Master SPI configuration. Optionally parse a DSView CSV export or run a live capture via `sigrok-cli` with a connected logic analyzer (e.g., the Digilent FTDI cable as `ftdi-la`).","name":"measure-cclk"},{"about":"Read the SPI flash status register via openFPGALoader's JTAG-to-SPI bridge. Decodes WIP, WEL, and QE bits to help diagnose boot-from-flash failures.","name":"flash-status"},{"about":"Diagnostic: load *only* the proxy bridge bitstream (or any other bitstream) into FPGA SRAM, report STAT, leave TAP in RTI. Does NOT touch SPI flash. Useful for verifying the bridge actually reaches DONE=HIGH before debugging SPI semantics.","name":"proxy-load"},{"about":"Diagnostic: read IDCODE + STAT *without* touching the FPGA. Run this immediately after `tri fpga proxy-load` to confirm the bridge is alive. Also confirms IR=USER1 select is accepted.","name":"proxy-status"},{"about":"Diagnostic: shift raw hex bytes through the USER1 BSCAN as a single SPI transaction. Reads `--rx N` MISO bytes after the TX stream. Requires the proxy bridge to be already loaded (`tri fpga proxy-load` first).","name":"spi-raw"},{"about":"Diagnostic: probe the IR capture pattern after selecting an IR. A healthy 7-series TAP always captures `0b000001` into the IR shift register. Anything else means the JTAG chain is broken or the cable is mis-driving TMS.","name":"ir-probe"},{"about":"Diagnostic: drive the full JEDEC-read flow end-to-end with maximum instrumentation, **including** the 0xAB Release-Power-down and 0x66+0x99 software-reset recovery attempts. Equivalent to `flash-id --verbose` plus auto-recovery.","name":"flash-id-debug"},{"about":"Build the QMTech XC7A100T-FGG676 JTAG-to-SPI proxy bitstream via the openXC7 open-source toolchain (yosys + nextpnr-himbaechel + prjxray). Requires `yosys`, `nextpnr-himbaechel`, `fasm2frames.py` and `xc7frames2bit` on PATH. With `--install`, the produced `.bit` is copied to `fpga/tools/bscan_spi_xc7a100t.bit` so the embedded `BSCAN_SPI_XC7A100T` constant picks it up on the next rebuild.","name":"build-proxy"},{"about":"Clone the openXC7 `nextpnr-xilinx` repo and build a chipdb (`.bba`) for the requested 7-series part, then install it into `~/.local/share/nextpnr/himbaechel-xilinx/`.","name":"setup-openxc7-chipdb"},{"about":"Generate a Lean 4 theorem from a `tri fpga measure-cclk --json` output. The theorem proves that the measured `(frequency, duty)` pair satisfies `measured_cclk_satisfies_flash_spec` and links it to `transaction_satisfies_flash_spec`. Useful for turning a real capture into a machine-checked proof without manual copy-paste.","name":"measured-to-lean"},{"about":"Print the PVT-derated N25Q128_3V SCK low/high bound for a supplied operating context. Also prints the margin over the nominal 6 ns bound and warns if the context is outside the documented operating envelope.","name":"pvt-envelope"},{"about":"Build the QMTech XC7A100T-FGG676 proxy bitstream via a Docker container running Xilinx Vivado. Clones our `openFPGALoader` fork (`feat/qmtech-xc7a100t-board`) into `target/openfpgaloader-fork/` and runs `make` inside `spiOverJtag/`. On Apple Silicon (arm64), the container runs under x86_64 emulation via `--platform linux/amd64`. With `--install`, the produced `bscan_spi_xc7a100tfgg676.bit.gz` is decompressed and copied to `fpga/tools/bscan_spi_xc7a100t.bit` and its SHA256 is printed.","name":"build-proxy-docker"}],"agents":[],"args":[],"command":"tri fpga","discarded":0,"entry":"cli/tri/src/main.rs","family":"tri-cli","fields":{"ABOUT":"FPGA programming via the in-tree DLC10 driver (pure Rust).","ABOUT_SOURCE":"clap /// doc on Commands::Fpga (cli/tri/src/main.rs; module cli/tri/src/fpga.rs)","ACTIONS":["idcode","idcode-cfg","sram","program","flash-id","status","debug","load-sram","stat","read-xadc","synth-gf16","program-flash","dump-flash","bit-config","round-trip-verify","boot-log","cold-por","smoke-gate","boot-protocol","patch-cor0","cclk-variants","cclk-sweep","sweep-report","measure-cclk","flash-status","proxy-load","proxy-status","spi-raw","ir-probe","flash-id-debug","build-proxy","setup-openxc7-chipdb","measured-to-lean","pvt-envelope","build-proxy-docker"],"ACTIONS_ABOUT":["Read and print the JTAG IDCODE of the attached DLC10 cable target.","Read the configuration IDCODE register via the Type-1 CFG_IN/CFG_OUT protocol. On a healthy XC7A100T this must return 0x13631093 (same as the JTAG IDCODE). If 0x00000000 is returned while `idcode` works, the read_cfg_reg implementation is broken.","Program FPGA SRAM (volatile -- lost on power-cycle).","Program the on-board SPI flash (non-volatile / persistent).","Read the SPI flash JEDEC ID via the JTAG-to-SPI bridge.","Read the raw CFG_OUT status register.","Decode 7-series configuration registers for DONE=LOW diagnosis.","Load a bitstream into FPGA SRAM using openFPGALoader with a Digilent FTDI cable. This is the canonical path for the QMTech Wukong V1 / XC7A200T board because the in-tree `dlc10` driver only supports Xilinx DLC10 cables (VID=0x03FD), not the attached Digilent cable (VID=0x0403:0x6014).","Read and decode the FPGA STAT register via openFPGALoader.","Read the FPGA XADC sensors (temperature, VCCINT, VCCAUX) via openFPGALoader and print a JSON object. The board must be powered and connected through a supported cable such as `digilent_hs2`.","Synthesize the GF16 4x4 matrix design through the openXC7 toolchain. Output is written to `/gf16_matmul4x4_top.bit`.","Program the on-board SPI flash (non-volatile) using openFPGALoader's JTAG-to-SPI bridge. Requires a matching `spiOverJtag` bitstream for the exact FPGA package; the XC7A200T-FGG676 bridge is present in recent openFPGALoader distributions but flash boot may still depend on board mode pins (see docs/reports/FPGA_LOOP_EVIDENCE_2026-07-04.md).","Dump SPI flash contents to a file via openFPGALoader's JTAG-to-SPI bridge.","Parse the .bit header and print the configuration registers that affect Master SPI boot (COR0, COR1, WBSTAR, TIMER, CTL0, CTL1, IDCODE, BSPI).","Program the given .bit to SPI flash, dump the same region back, and compare the dumped bytes against the bitstream payload. This verifies the openFPGALoader write path is bit-perfect for the raw bitstream.","Guided cold-POR boot experiment. Programs flash, asks the user to physically power-cycle the board, then captures STAT without a JTAG reset and prints a decision-tree diagnosis.","Deterministic cold-POR boot experiment with optional relay control. With `--relay-port MOCK` the command writes a deterministic, clearly labeled mock boot log so CI can exercise the cold-POR JSON path without touching hardware. Real relay ports are reserved for Variant A/B.","Board-less smoke gate for the FPGA path. Runs `tri fpga bit-config` on the GF16 demo bitstream and, if yosys is available, a synthesis smoke check on the demo Verilog. Requires no physical board.","Print or interactively confirm the cold-POR boot protocol. This is the standalone version of the instructions embedded in `boot-log` and `cclk-sweep`; use it to verify the operator steps before a physical power-cycle.","Patch the raw OSCFSEL field (COR0[22:17]) of a 7-series .bit file.","Generate a set of OSCFSEL variants from a single input .bit file. Outputs one file per requested value to the given directory.","Automated cold-POR CCLK sweep. Generates OSCFSEL variants, programs each to flash, prompts for the physical power-cycle, captures STAT, and writes JSON logs. The only manual step is disconnecting/reconnecting the cable and power-cycling the board.","Read all `build/fpga/boot-log-*.json` files and produce a sweep report identifying the first working CCLK variant.","Print DSLogic / oscilloscope instructions for measuring the FPGA CCLK output during Master SPI configuration. Optionally parse a DSView CSV export or run a live capture via `sigrok-cli` with a connected logic analyzer (e.g., the Digilent FTDI cable as `ftdi-la`).","Read the SPI flash status register via openFPGALoader's JTAG-to-SPI bridge. Decodes WIP, WEL, and QE bits to help diagnose boot-from-flash failures.","Diagnostic: load *only* the proxy bridge bitstream (or any other bitstream) into FPGA SRAM, report STAT, leave TAP in RTI. Does NOT touch SPI flash. Useful for verifying the bridge actually reaches DONE=HIGH before debugging SPI semantics.","Diagnostic: read IDCODE + STAT *without* touching the FPGA. Run this immediately after `tri fpga proxy-load` to confirm the bridge is alive. Also confirms IR=USER1 select is accepted.","Diagnostic: shift raw hex bytes through the USER1 BSCAN as a single SPI transaction. Reads `--rx N` MISO bytes after the TX stream. Requires the proxy bridge to be already loaded (`tri fpga proxy-load` first).","Diagnostic: probe the IR capture pattern after selecting an IR. A healthy 7-series TAP always captures `0b000001` into the IR shift register. Anything else means the JTAG chain is broken or the cable is mis-driving TMS.","Diagnostic: drive the full JEDEC-read flow end-to-end with maximum instrumentation, **including** the 0xAB Release-Power-down and 0x66+0x99 software-reset recovery attempts. Equivalent to `flash-id --verbose` plus auto-recovery.","Build the QMTech XC7A100T-FGG676 JTAG-to-SPI proxy bitstream via the openXC7 open-source toolchain (yosys + nextpnr-himbaechel + prjxray). Requires `yosys`, `nextpnr-himbaechel`, `fasm2frames.py` and `xc7frames2bit` on PATH. With `--install`, the produced `.bit` is copied to `fpga/tools/bscan_spi_xc7a100t.bit` so the embedded `BSCAN_SPI_XC7A100T` constant picks it up on the next rebuild.","Clone the openXC7 `nextpnr-xilinx` repo and build a chipdb (`.bba`) for the requested 7-series part, then install it into `~/.local/share/nextpnr/himbaechel-xilinx/`.","Generate a Lean 4 theorem from a `tri fpga measure-cclk --json` output. The theorem proves that the measured `(frequency, duty)` pair satisfies `measured_cclk_satisfies_flash_spec` and links it to `transaction_satisfies_flash_spec`. Useful for turning a real capture into a machine-checked proof without manual copy-paste.","Print the PVT-derated N25Q128_3V SCK low/high bound for a supplied operating context. Also prints the margin over the nominal 6 ns bound and warns if the context is outside the documented operating envelope.","Build the QMTech XC7A100T-FGG676 proxy bitstream via a Docker container running Xilinx Vivado. Clones our `openFPGALoader` fork (`feat/qmtech-xc7a100t-board`) into `target/openfpgaloader-fork/` and runs `make` inside `spiOverJtag/`. On Apple Silicon (arm64), the container runs under x86_64 emulation via `--platform linux/amd64`. With `--install`, the produced `bscan_spi_xc7a100tfgg676.bit.gz` is decompressed and copied to `fpga/tools/bscan_spi_xc7a100t.bit` and its SHA256 is printed."],"AGENTS":[],"AGENTS_NOTE":"No source binds an agent letter to this command: docs/agents/AGENTS_ALPHABET.md (rows, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name it. creator.md and verifier.md name tri gen/test/verify but are not letter agents.","ARGS":[],"COMMAND":"tri fpga","ENABLED":true,"ENTRY":"cli/tri/src/main.rs","FAMILY":"tri-cli","ID":"tri/fpga","KIND":"tool","SOURCE":"cli/tri/src/fpga.rs","VARIANT":"Commands::Fpga","WHEN_TO_USE":"FPGA programming via the in-tree DLC10 driver (pure Rust).","WITNESS":"source-parse"},"health":"ok","id":"tri/fpga","inSpecCorpus":false,"links":{"config":null,"pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","source":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/cli/tri/src/fpga.rs"},"messages":["no agent letter bound by a source"],"moduleName":"tool_tri_fpga","name":{"en":"tri fpga"},"repo":"gHashTag/t27","searchText":"tri/fpga tri fpga fpga programming via the in-tree dlc10 driver (pure rust). fpga programming via the in-tree dlc10 driver (pure rust). idcode read and print the jtag idcode of the attached dlc10 cable target. idcode-cfg read the configuration idcode register via the type-1 cfg_in/cfg_out protocol. on a healthy xc7a100t this must return 0x13631093 (same as the jtag idcode). if 0x00000000 is returned while `idcode` works, the read_cfg_reg implementation is broken. sram program fpga sram (volatile -- lost on power-cycle). program program the on-board spi flash (non-volatile / persistent). flash-id read the spi flash jedec id via the jtag-to-spi bridge. status read the raw cfg_out status register. debug decode 7-series configuration registers for done=low diagnosis. load-sram load a bitstream into fpga sram using openfpgaloader with a digilent ftdi cable. this is the canonical path for the qmtech wukong v1 / xc7a200t board because the in-tree `dlc10` driver only supports xilinx dlc10 cables (vid=0x03fd), not the attached digilent cable (vid=0x0403:0x6014). stat read and decode the fpga stat register via openfpgaloader. read-xadc read the fpga xadc sensors (temperature, vccint, vccaux) via openfpgaloader and print a json object. the board must be powered and connected through a supported cable such as `digilent_hs2`. synth-gf16 synthesize the gf16 4x4 matrix design through the openxc7 toolchain. output is written to `/gf16_matmul4x4_top.bit`. program-flash program the on-board spi flash (non-volatile) using openfpgaloader's jtag-to-spi bridge. requires a matching `spioverjtag` bitstream for the exact fpga package; the xc7a200t-fgg676 bridge is present in recent openfpgaloader distributions but flash boot may still depend on board mode pins (see docs/reports/fpga_loop_evidence_2026-07-04.md). dump-flash dump spi flash contents to a file via openfpgaloader's jtag-to-spi bridge. bit-config parse the .bit header and print the configuration registers that affect master spi boot (cor0, cor1, wbstar, timer, ctl0, ctl1, idcode, bspi). round-trip-verify program the given .bit to spi flash, dump the same region back, and compare the dumped bytes against the bitstream payload. this verifies the openfpgaloader write path is bit-perfect for the raw bitstream. boot-log guided cold-por boot experiment. programs flash, asks the user to physically power-cycle the board, then captures stat without a jtag reset and prints a decision-tree diagnosis. cold-por deterministic cold-por boot experiment with optional relay control. with `--relay-port mock` the command writes a deterministic, clearly labeled mock boot log so ci can exercise the cold-por json path without touching hardware. real relay ports are reserved for variant a/b. smoke-gate board-less smoke gate for the fpga path. runs `tri fpga bit-config` on the gf16 demo bitstream and, if yosys is available, a synthesis smoke check on the demo verilog. requires no physical board. boot-protocol print or interactively confirm the cold-por boot protocol. this is the standalone version of the instructions embedded in `boot-log` and `cclk-sweep`; use it to verify the operator steps before a physical power-cycle. patch-cor0 patch the raw oscfsel field (cor0[22:17]) of a 7-series .bit file. cclk-variants generate a set of oscfsel variants from a single input .bit file. outputs one file per requested value to the given directory. cclk-sweep automated cold-por cclk sweep. generates oscfsel variants, programs each to flash, prompts for the physical power-cycle, captures stat, and writes json logs. the only manual step is disconnecting/reconnecting the cable and power-cycling the board. sweep-report read all `build/fpga/boot-log-*.json` files and produce a sweep report identifying the first working cclk variant. measure-cclk print dslogic / oscilloscope instructions for measuring the fpga cclk output during master spi configuration. optionally parse a dsview csv export or run a live capture via `sigrok-cli` with a connected logic analyzer (e.g., the digilent ftdi cable as `ftdi-la`). flash-status read the spi flash status register via openfpgaloader's jtag-to-spi bridge. decodes wip, wel, and qe bits to help diagnose boot-from-flash failures. proxy-load diagnostic: load *only* the proxy bridge bitstream (or any other bitstream) into fpga sram, report stat, leave tap in rti. does not touch spi flash. useful for verifying the bridge actually reaches done=high before debugging spi semantics. proxy-status diagnostic: read idcode + stat *without* touching the fpga. run this immediately after `tri fpga proxy-load` to confirm the bridge is alive. also confirms ir=user1 select is accepted. spi-raw diagnostic: shift raw hex bytes through the user1 bscan as a single spi transaction. reads `--rx n` miso bytes after the tx stream. requires the proxy bridge to be already loaded (`tri fpga proxy-load` first). ir-probe diagnostic: probe the ir capture pattern after selecting an ir. a healthy 7-series tap always captures `0b000001` into the ir shift register. anything else means the jtag chain is broken or the cable is mis-driving tms. flash-id-debug diagnostic: drive the full jedec-read flow end-to-end with maximum instrumentation, **including** the 0xab release-power-down and 0x66+0x99 software-reset recovery attempts. equivalent to `flash-id --verbose` plus auto-recovery. build-proxy build the qmtech xc7a100t-fgg676 jtag-to-spi proxy bitstream via the openxc7 open-source toolchain (yosys + nextpnr-himbaechel + prjxray). requires `yosys`, `nextpnr-himbaechel`, `fasm2frames.py` and `xc7frames2bit` on path. with `--install`, the produced `.bit` is copied to `fpga/tools/bscan_spi_xc7a100t.bit` so the embedded `bscan_spi_xc7a100t` constant picks it up on the next rebuild. setup-openxc7-chipdb clone the openxc7 `nextpnr-xilinx` repo and build a chipdb (`.bba`) for the requested 7-series part, then install it into `~/.local/share/nextpnr/himbaechel-xilinx/`. measured-to-lean generate a lean 4 theorem from a `tri fpga measure-cclk --json` output. the theorem proves that the measured `(frequency, duty)` pair satisfies `measured_cclk_satisfies_flash_spec` and links it to `transaction_satisfies_flash_spec`. useful for turning a real capture into a machine-checked proof without manual copy-paste. pvt-envelope print the pvt-derated n25q128_3v sck low/high bound for a supplied operating context. also prints the margin over the nominal 6 ns bound and warns if the context is outside the documented operating envelope. build-proxy-docker build the qmtech xc7a100t-fgg676 proxy bitstream via a docker container running xilinx vivado. clones our `openfpgaloader` fork (`feat/qmtech-xc7a100t-board`) into `target/openfpgaloader-fork/` and runs `make` inside `spioverjtag/`. on apple silicon (arm64), the container runs under x86_64 emulation via `--platform linux/amd64`. with `--install`, the produced `bscan_spi_xc7a100tfgg676.bit.gz` is decompressed and copied to `fpga/tools/bscan_spi_xc7a100t.bit` and its sha256 is printed.","sha256":"76b94a13e86c669af89b2bb22a107e970c2ce005fadacce9ddb898b4f897894d","skills":[],"source":"cli/tri/src/fpga.rs","specPath":"specs/tools/tri/fpga.t27","summary":{"en":"FPGA programming via the in-tree DLC10 driver (pure Rust).","ru":"Программирование FPGA через встроенный драйвер DLC10 (чистый Rust)."},"typecheckOk":true,"variant":"Commands::Fpga","whenToUse":"FPGA programming via the in-tree DLC10 driver (pure Rust).","witness":"source-parse"},{"aboutSource":"clap /// doc on Commands::Gates (cli/tri/src/main.rs; module cli/tri/src/gates.rs)","actions":[{"about":"Classify the compiler's own warnings. `rustc` already answers \"is this value ever read\" and \"does anything call this\" for the whole crate; the answer only helps if somebody reads it.","name":"warnings"},{"about":"Run every gate script and its negative control; name the ones with none.","name":"sweep"},{"about":"Break each gate's failure path and demand its control notices.","name":"mutate"},{"about":"Open pull requests whose path-filtered CI never ran.","name":"prs"},{"about":"What the tree says is required, against what the ruleset requires.","name":"preview"},{"about":"Which interpreter each gate step is handed to, and who says so.","name":"shell"},{"about":"Gate steps whose PASS is reachable with the thing they check absent.","name":"quiet"},{"about":"Every bounded GitHub fetch in this crate, and whether it can tell a page from a total.","name":"fetches"},{"about":"Run every gate CI runs, in an EMPTY tree, and report what still passes.","name":"empty"},{"about":"","name":"required"},{"about":"List active workflows whose lifetime success count is zero.","name":"dead"},{"about":"Workflows with no recent run on the default branch: their green is about frequency, not health.","name":"tests"},{"about":"","name":"unmeasured"}],"agents":[],"args":[],"command":"tri gates","discarded":0,"entry":"cli/tri/src/main.rs","family":"tri-cli","fields":{"ABOUT":"Find workflows that have never once succeeded.","ABOUT_SOURCE":"clap /// doc on Commands::Gates (cli/tri/src/main.rs; module cli/tri/src/gates.rs)","ACTIONS":["warnings","sweep","mutate","prs","preview","shell","quiet","fetches","empty","required","dead","tests","unmeasured"],"ACTIONS_ABOUT":["Classify the compiler's own warnings. `rustc` already answers \"is this value ever read\" and \"does anything call this\" for the whole crate; the answer only helps if somebody reads it.","Run every gate script and its negative control; name the ones with none.","Break each gate's failure path and demand its control notices.","Open pull requests whose path-filtered CI never ran.","What the tree says is required, against what the ruleset requires.","Which interpreter each gate step is handed to, and who says so.","Gate steps whose PASS is reachable with the thing they check absent.","Every bounded GitHub fetch in this crate, and whether it can tell a page from a total.","Run every gate CI runs, in an EMPTY tree, and report what still passes.","","List active workflows whose lifetime success count is zero.","Workflows with no recent run on the default branch: their green is about frequency, not health.",""],"AGENTS":[],"AGENTS_NOTE":"No source binds an agent letter to this command: docs/agents/AGENTS_ALPHABET.md (rows, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name it. creator.md and verifier.md name tri gen/test/verify but are not letter agents.","ARGS":[],"COMMAND":"tri gates","ENABLED":true,"ENTRY":"cli/tri/src/main.rs","FAMILY":"tri-cli","ID":"tri/gates","KIND":"tool","SOURCE":"cli/tri/src/gates.rs","VARIANT":"Commands::Gates","WHEN_TO_USE":"Find workflows that have never once succeeded.","WITNESS":"source-parse"},"health":"ok","id":"tri/gates","inSpecCorpus":false,"links":{"config":null,"pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","source":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/cli/tri/src/gates.rs"},"messages":["no agent letter bound by a source"],"moduleName":"tool_tri_gates","name":{"en":"tri gates"},"repo":"gHashTag/t27","searchText":"tri/gates tri gates find workflows that have never once succeeded. find workflows that have never once succeeded. warnings classify the compiler's own warnings. `rustc` already answers \"is this value ever read\" and \"does anything call this\" for the whole crate; the answer only helps if somebody reads it. sweep run every gate script and its negative control; name the ones with none. mutate break each gate's failure path and demand its control notices. prs open pull requests whose path-filtered ci never ran. preview what the tree says is required, against what the ruleset requires. shell which interpreter each gate step is handed to, and who says so. quiet gate steps whose pass is reachable with the thing they check absent. fetches every bounded github fetch in this crate, and whether it can tell a page from a total. empty run every gate ci runs, in an empty tree, and report what still passes. required dead list active workflows whose lifetime success count is zero. tests workflows with no recent run on the default branch: their green is about frequency, not health. unmeasured","sha256":"f06a8ab87192f76f5716eca9ddf70f7de4e44867e8f905dd749d00f2d5add6e7","skills":[],"source":"cli/tri/src/gates.rs","specPath":"specs/tools/tri/gates.t27","summary":{"en":"Find workflows that have never once succeeded.","ru":"Находит воркфлоу, которые ни разу не завершались успешно."},"typecheckOk":true,"variant":"Commands::Gates","whenToUse":"Find workflows that have never once succeeded.","witness":"source-parse"},{"aboutSource":"tri-mcp tool tri_gen description (cli/tri-mcp/src/main.rs); handler cmd_gen runs t27c gen-verilog, gen-c, gen-rust (cli/tri/src/main.rs:862)","actions":[],"agents":[{"letter":"C","ok":true},{"letter":"T","ok":true}],"args":[{"about":"","name":""}],"command":"tri gen","discarded":0,"entry":"cli/tri/src/main.rs","family":"tri-cli","fields":{"ABOUT":"Generates backends from a .t27 spec file using t27c.","ABOUT_SOURCE":"tri-mcp tool tri_gen description (cli/tri-mcp/src/main.rs); handler cmd_gen runs t27c gen-verilog, gen-c, gen-rust (cli/tri/src/main.rs:862)","ACTIONS":[],"ACTIONS_ABOUT":[],"AGENTS":["C","T"],"AGENTS_NOTE":".claude/agents/agent-c-compiler.md:40 (tri gen -- Generate code from specs; trigger On tri gen command, line 7); .claude/agents/trinity.md:68 (5. Gen - Run tri gen).","ARGS":[""],"COMMAND":"tri gen","ENABLED":true,"ENTRY":"cli/tri/src/main.rs","FAMILY":"tri-cli","ID":"tri/gen","KIND":"tool","SOURCE":"cli/tri/src/main.rs","VARIANT":"Commands::Gen","WHEN_TO_USE":"Generates backends from a .t27 spec file using t27c.","WITNESS":"source-parse"},"health":"ok","id":"tri/gen","inSpecCorpus":false,"links":{"config":null,"pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","source":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/cli/tri/src/main.rs"},"messages":[],"moduleName":"tool_tri_gen","name":{"en":"tri gen"},"repo":"gHashTag/t27","searchText":"tri/gen tri gen generates backends from a .t27 spec file using t27c. generates backends from a .t27 spec file using t27c. c t","sha256":"10580699229ea38d3d7ba8c0bb30c02615f30031a129d498433c5542da5856fb","skills":[{"id":"t27/tri","via":["SUMMARY_EN"]}],"source":"cli/tri/src/main.rs","specPath":"specs/tools/tri/gen.t27","summary":{"en":"Generates backends from a .t27 spec file using t27c.","ru":"Генерирует бэкенды из файла спецификации .t27 через t27c."},"typecheckOk":true,"variant":"Commands::Gen","whenToUse":"Generates backends from a .t27 spec file using t27c.","witness":"source-parse"},{"aboutSource":"clap /// doc on Commands::Harness (cli/tri/src/main.rs)","actions":[{"about":"Test binaries whose tests share one scratch directory.","name":"scratch"}],"agents":[],"args":[],"command":"tri harness","discarded":0,"entry":"cli/tri/src/main.rs","family":"tri-cli","fields":{"ABOUT":"Source files no crate root reaches, and so nothing compiles. Test-harness hygiene.","ABOUT_SOURCE":"clap /// doc on Commands::Harness (cli/tri/src/main.rs)","ACTIONS":["scratch"],"ACTIONS_ABOUT":["Test binaries whose tests share one scratch directory."],"AGENTS":[],"AGENTS_NOTE":"No source binds an agent letter to this command: docs/agents/AGENTS_ALPHABET.md (rows, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name it. creator.md and verifier.md name tri gen/test/verify but are not letter agents.","ARGS":[],"COMMAND":"tri harness","ENABLED":true,"ENTRY":"cli/tri/src/main.rs","FAMILY":"tri-cli","ID":"tri/harness","KIND":"tool","SOURCE":"cli/tri/src/main.rs","VARIANT":"Commands::Harness","WHEN_TO_USE":"Source files no crate root reaches, and so nothing compiles. Test-harness hygiene.","WITNESS":"source-parse"},"health":"ok","id":"tri/harness","inSpecCorpus":false,"links":{"config":null,"pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","source":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/cli/tri/src/main.rs"},"messages":["no agent letter bound by a source"],"moduleName":"tool_tri_harness","name":{"en":"tri harness"},"repo":"gHashTag/t27","searchText":"tri/harness tri harness source files no crate root reaches, and so nothing compiles. test-harness hygiene. source files no crate root reaches, and so nothing compiles. test-harness hygiene. scratch test binaries whose tests share one scratch directory.","sha256":"cbed467027683c2eaf5c7aed85df4831973b4566aa88a1a1260fe098d6be9d18","skills":[],"source":"cli/tri/src/main.rs","specPath":"specs/tools/tri/harness.t27","summary":{"en":"Source files no crate root reaches, and so nothing compiles. Test-harness hygiene.","ru":"Исходные файлы, до которых не доходит ни один корень крейта, и потому ничего не компилируется. Гигиена тестового харнесса."},"typecheckOk":true,"variant":"Commands::Harness","whenToUse":"Source files no crate root reaches, and so nothing compiles. Test-harness hygiene.","witness":"source-parse"},{"aboutSource":"tri-mcp tool tri_health description (cli/tri-mcp/src/main.rs); handler cmd_health reads .trinity/state/queen-health.json (cli/tri/src/main.rs:969)","actions":[],"agents":[],"args":[{"about":"","name":""}],"command":"tri health","discarded":0,"entry":"cli/tri/src/main.rs","family":"tri-cli","fields":{"ABOUT":"Returns queen and swarm health status from .trinity state.","ABOUT_SOURCE":"tri-mcp tool tri_health description (cli/tri-mcp/src/main.rs); handler cmd_health reads .trinity/state/queen-health.json (cli/tri/src/main.rs:969)","ACTIONS":[],"ACTIONS_ABOUT":[],"AGENTS":[],"AGENTS_NOTE":"No source binds an agent letter to this command: docs/agents/AGENTS_ALPHABET.md (rows, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name it. creator.md and verifier.md name tri gen/test/verify but are not letter agents.","ARGS":[""],"COMMAND":"tri health","ENABLED":true,"ENTRY":"cli/tri/src/main.rs","FAMILY":"tri-cli","ID":"tri/health","KIND":"tool","SOURCE":"cli/tri/src/main.rs","VARIANT":"Commands::Health","WHEN_TO_USE":"Returns queen and swarm health status from .trinity state.","WITNESS":"source-parse"},"health":"ok","id":"tri/health","inSpecCorpus":false,"links":{"config":null,"pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","source":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/cli/tri/src/main.rs"},"messages":["no agent letter bound by a source"],"moduleName":"tool_tri_health","name":{"en":"tri health"},"repo":"gHashTag/t27","searchText":"tri/health tri health returns queen and swarm health status from .trinity state. returns queen and swarm health status from .trinity state.","sha256":"b6895b30462b00ceb9464cdbee1de70175a32fca0ca7aa317ada5e79bcd0c7bd","skills":[],"source":"cli/tri/src/main.rs","specPath":"specs/tools/tri/health.t27","summary":{"en":"Returns queen and swarm health status from .trinity state.","ru":"Показывает состояние здоровья королевы и роя из состояния .trinity."},"typecheckOk":true,"variant":"Commands::Health","whenToUse":"Returns queen and swarm health status from .trinity state.","witness":"source-parse"},{"aboutSource":"clap /// doc on Commands::Hooks (cli/tri/src/main.rs; module cli/tri/src/hooks.rs)","actions":[{"about":"Run every migrated commit-time gate in sequence (l1-check + now-gate).","name":"pre-commit"},{"about":"A pull request whose title claims a compiler fix must carry a source file.","name":"fix-carries-source"},{"about":"Ask the required NOW gate's own script whether this push adds an entry.","name":"pre-push"},{"about":"L1 TRACEABILITY over the message BEING WRITTEN, from the commit-msg hook.","name":"commit-msg"},{"about":"L1 TRACEABILITY: last commit message must reference an issue (`Closes #N` / `Fixes #N` / `Resolves #N` / `Reference #N`).","name":"l1-check"},{"about":"Verify a fresh `docs/now/-.md` entry exists.","name":"now-gate"},{"about":"Session-start guard for the Claude Code harness. Emits a one-line status string to stdout; never blocks (the Bash gate is a soft telemetry hook).","name":"session-gate"},{"about":"Which hooks git will actually run, and whose installer output is dead.","name":"status"}],"agents":[],"args":[],"command":"tri hooks","discarded":0,"entry":"cli/tri/src/main.rs","family":"tri-cli","fields":{"ABOUT":"Pure-Rust ports of repository commit / push gates.","ABOUT_SOURCE":"clap /// doc on Commands::Hooks (cli/tri/src/main.rs; module cli/tri/src/hooks.rs)","ACTIONS":["pre-commit","fix-carries-source","pre-push","commit-msg","l1-check","now-gate","session-gate","status"],"ACTIONS_ABOUT":["Run every migrated commit-time gate in sequence (l1-check + now-gate).","A pull request whose title claims a compiler fix must carry a source file.","Ask the required NOW gate's own script whether this push adds an entry.","L1 TRACEABILITY over the message BEING WRITTEN, from the commit-msg hook.","L1 TRACEABILITY: last commit message must reference an issue (`Closes #N` / `Fixes #N` / `Resolves #N` / `Reference #N`).","Verify a fresh `docs/now/-.md` entry exists.","Session-start guard for the Claude Code harness. Emits a one-line status string to stdout; never blocks (the Bash gate is a soft telemetry hook).","Which hooks git will actually run, and whose installer output is dead."],"AGENTS":[],"AGENTS_NOTE":"No source binds an agent letter to this command: docs/agents/AGENTS_ALPHABET.md (rows, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name it. creator.md and verifier.md name tri gen/test/verify but are not letter agents.","ARGS":[],"COMMAND":"tri hooks","ENABLED":true,"ENTRY":"cli/tri/src/main.rs","FAMILY":"tri-cli","ID":"tri/hooks","KIND":"tool","SOURCE":"cli/tri/src/hooks.rs","VARIANT":"Commands::Hooks","WHEN_TO_USE":"Pure-Rust ports of repository commit / push gates.","WITNESS":"source-parse"},"health":"ok","id":"tri/hooks","inSpecCorpus":false,"links":{"config":null,"pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","source":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/cli/tri/src/hooks.rs"},"messages":["no agent letter bound by a source"],"moduleName":"tool_tri_hooks","name":{"en":"tri hooks"},"repo":"gHashTag/t27","searchText":"tri/hooks tri hooks pure-rust ports of repository commit / push gates. pure-rust ports of repository commit / push gates. pre-commit run every migrated commit-time gate in sequence (l1-check + now-gate). fix-carries-source a pull request whose title claims a compiler fix must carry a source file. pre-push ask the required now gate's own script whether this push adds an entry. commit-msg l1 traceability over the message being written, from the commit-msg hook. l1-check l1 traceability: last commit message must reference an issue (`closes #n` / `fixes #n` / `resolves #n` / `reference #n`). now-gate verify a fresh `docs/now/-.md` entry exists. session-gate session-start guard for the claude code harness. emits a one-line status string to stdout; never blocks (the bash gate is a soft telemetry hook). status which hooks git will actually run, and whose installer output is dead.","sha256":"0c379cfafdd10d47e0f71f2b72000fc2206fd18575f5c8b3718d4a7455116198","skills":[],"source":"cli/tri/src/hooks.rs","specPath":"specs/tools/tri/hooks.t27","summary":{"en":"Pure-Rust ports of repository commit / push gates.","ru":"Порты гейтов коммита/пуша репозитория на чистом Rust."},"typecheckOk":true,"variant":"Commands::Hooks","whenToUse":"Pure-Rust ports of repository commit / push gates.","witness":"source-parse"},{"aboutSource":"clap /// doc on Commands::Issues (cli/tri/src/main.rs; module cli/tri/src/issues.rs)","actions":[{"about":"Open issues whose title calls a workflow red, and what it does today.","name":"stale"},{"about":"Open issues that state a COUNT in the title, and a reproducible sample.","name":"numbers"},{"about":"Open issues whose figure is ANCHORED, so re-measuring it proves nothing.","name":"dated"}],"agents":[],"args":[],"command":"tri issues","discarded":0,"entry":"cli/tri/src/main.rs","family":"tri-cli","fields":{"ABOUT":"Open issues whose headline calls a workflow red, against what that workflow concludes on master today.","ABOUT_SOURCE":"clap /// doc on Commands::Issues (cli/tri/src/main.rs; module cli/tri/src/issues.rs)","ACTIONS":["stale","numbers","dated"],"ACTIONS_ABOUT":["Open issues whose title calls a workflow red, and what it does today.","Open issues that state a COUNT in the title, and a reproducible sample.","Open issues whose figure is ANCHORED, so re-measuring it proves nothing."],"AGENTS":[],"AGENTS_NOTE":"No source binds an agent letter to this command: docs/agents/AGENTS_ALPHABET.md (rows, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name it. creator.md and verifier.md name tri gen/test/verify but are not letter agents.","ARGS":[],"COMMAND":"tri issues","ENABLED":true,"ENTRY":"cli/tri/src/main.rs","FAMILY":"tri-cli","ID":"tri/issues","KIND":"tool","SOURCE":"cli/tri/src/issues.rs","VARIANT":"Commands::Issues","WHEN_TO_USE":"Open issues whose headline calls a workflow red, against what that workflow concludes on master today.","WITNESS":"source-parse"},"health":"ok","id":"tri/issues","inSpecCorpus":false,"links":{"config":null,"pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","source":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/cli/tri/src/issues.rs"},"messages":["no agent letter bound by a source"],"moduleName":"tool_tri_issues","name":{"en":"tri issues"},"repo":"gHashTag/t27","searchText":"tri/issues tri issues open issues whose headline calls a workflow red, against what that workflow concludes on master today. open issues whose headline calls a workflow red, against what that workflow concludes on master today. stale open issues whose title calls a workflow red, and what it does today. numbers open issues that state a count in the title, and a reproducible sample. dated open issues whose figure is anchored, so re-measuring it proves nothing.","sha256":"553dd69fc425dc972f528162cc7a7b7a51cb3426639ebe1e549fb71cff3ec4de","skills":[],"source":"cli/tri/src/issues.rs","specPath":"specs/tools/tri/issues.t27","summary":{"en":"Open issues whose headline calls a workflow red, against what that workflow concludes on master today.","ru":"Открытые issue, чей заголовок называет воркфлоу красным, против того, к чему этот воркфлоу приходит на master сегодня."},"typecheckOk":true,"variant":"Commands::Issues","whenToUse":"Open issues whose headline calls a workflow red, against what that workflow concludes on master today.","witness":"source-parse"},{"aboutSource":"clap /// doc on Commands::Jumps (cli/tri/src/main.rs; module cli/tri/src/jumps.rs)","actions":[{"about":"Name every `break`/`continue` site in the generated Verilog and say what it lowered to.","name":"census"}],"agents":[],"args":[],"command":"tri jumps","discarded":0,"entry":"cli/tri/src/main.rs","family":"tri-cli","fields":{"ABOUT":"What happened to every `break` and `continue` the Verilog emitter had to lower?","ABOUT_SOURCE":"clap /// doc on Commands::Jumps (cli/tri/src/main.rs; module cli/tri/src/jumps.rs)","ACTIONS":["census"],"ACTIONS_ABOUT":["Name every `break`/`continue` site in the generated Verilog and say what it lowered to."],"AGENTS":[],"AGENTS_NOTE":"No source binds an agent letter to this command: docs/agents/AGENTS_ALPHABET.md (rows, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name it. creator.md and verifier.md name tri gen/test/verify but are not letter agents.","ARGS":[],"COMMAND":"tri jumps","ENABLED":true,"ENTRY":"cli/tri/src/main.rs","FAMILY":"tri-cli","ID":"tri/jumps","KIND":"tool","SOURCE":"cli/tri/src/jumps.rs","VARIANT":"Commands::Jumps","WHEN_TO_USE":"What happened to every `break` and `continue` the Verilog emitter had to lower? `break` was `disable fork;` and `continue` was `/* continue */;`. Both parse, both synthesise, both are no-ops -- so every instrument that asks whether the output PARSES said yes for as long as the emitter has existed. See #2988.","WITNESS":"source-parse"},"health":"ok","id":"tri/jumps","inSpecCorpus":false,"links":{"config":null,"pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","source":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/cli/tri/src/jumps.rs"},"messages":["no agent letter bound by a source"],"moduleName":"tool_tri_jumps","name":{"en":"tri jumps"},"repo":"gHashTag/t27","searchText":"tri/jumps tri jumps what happened to every `break` and `continue` the verilog emitter had to lower? what happened to every `break` and `continue` the verilog emitter had to lower? `break` was `disable fork;` and `continue` was `/* continue */;`. both parse, both synthesise, both are no-ops -- so every instrument that asks whether the output parses said yes for as long as the emitter has existed. see #2988. census name every `break`/`continue` site in the generated verilog and say what it lowered to.","sha256":"ad33faaeee303dbf14e3e97a28570b00a8501d910f45676c3d8838b1de42dd3f","skills":[],"source":"cli/tri/src/jumps.rs","specPath":"specs/tools/tri/jumps.t27","summary":{"en":"What happened to every `break` and `continue` the Verilog emitter had to lower?","ru":"Что случилось с каждым `break` и `continue`, которые эмиттеру Verilog пришлось опустить?"},"typecheckOk":true,"variant":"Commands::Jumps","whenToUse":"What happened to every `break` and `continue` the Verilog emitter had to lower? `break` was `disable fork;` and `continue` was `/* continue */;`. Both parse, both synthesise, both are no-ops -- so every instrument that asks whether the output PARSES said yes for as long as the emitter has existed. See #2988.","witness":"source-parse"},{"aboutSource":"clap /// doc on Commands::Kinds (cli/tri/src/main.rs; module cli/tri/src/kinddrift.rs)","actions":[{"about":"Match arms whose comment names a construct the pattern does not cover.","name":"drift"}],"agents":[],"args":[],"command":"tri kinds","discarded":0,"entry":"cli/tri/src/main.rs","family":"tri-cli","fields":{"ABOUT":"Match arms whose own comment names a case the pattern omits.","ABOUT_SOURCE":"clap /// doc on Commands::Kinds (cli/tri/src/main.rs; module cli/tri/src/kinddrift.rs)","ACTIONS":["drift"],"ACTIONS_ABOUT":["Match arms whose comment names a construct the pattern does not cover."],"AGENTS":[],"AGENTS_NOTE":"No source binds an agent letter to this command: docs/agents/AGENTS_ALPHABET.md (rows, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name it. creator.md and verifier.md name tri gen/test/verify but are not letter agents.","ARGS":[],"COMMAND":"tri kinds","ENABLED":true,"ENTRY":"cli/tri/src/main.rs","FAMILY":"tri-cli","ID":"tri/kinds","KIND":"tool","SOURCE":"cli/tri/src/kinddrift.rs","VARIANT":"Commands::Kinds","WHEN_TO_USE":"Match arms whose own comment names a case the pattern omits.","WITNESS":"source-parse"},"health":"ok","id":"tri/kinds","inSpecCorpus":false,"links":{"config":null,"pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","source":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/cli/tri/src/kinddrift.rs"},"messages":["no agent letter bound by a source"],"moduleName":"tool_tri_kinds","name":{"en":"tri kinds"},"repo":"gHashTag/t27","searchText":"tri/kinds tri kinds match arms whose own comment names a case the pattern omits. match arms whose own comment names a case the pattern omits. drift match arms whose comment names a construct the pattern does not cover.","sha256":"a0544b6d5a3f35a7dbd640999611d323884d4e934bbf7df9aa6cb3b94aa18ab7","skills":[],"source":"cli/tri/src/kinddrift.rs","specPath":"specs/tools/tri/kinds.t27","summary":{"en":"Match arms whose own comment names a case the pattern omits.","ru":"Ветви match, чей собственный комментарий называет случай, который паттерн пропускает."},"typecheckOk":true,"variant":"Commands::Kinds","whenToUse":"Match arms whose own comment names a case the pattern omits.","witness":"source-parse"},{"aboutSource":"clap /// doc on Commands::Lean (cli/tri/src/main.rs; module cli/tri/src/leanvac.rs)","actions":[{"about":"Completeness theorems whose model has no functions.","name":"vacuous"},{"about":"Proof files the build root does not reach, and so nothing compiles.","name":"reach"}],"agents":[],"args":[],"command":"tri lean","discarded":0,"entry":"cli/tri/src/main.rs","family":"tri-cli","fields":{"ABOUT":"Completeness theorems whose Lean model is empty.","ABOUT_SOURCE":"clap /// doc on Commands::Lean (cli/tri/src/main.rs; module cli/tri/src/leanvac.rs)","ACTIONS":["vacuous","reach"],"ACTIONS_ABOUT":["Completeness theorems whose model has no functions.","Proof files the build root does not reach, and so nothing compiles."],"AGENTS":[],"AGENTS_NOTE":"No source binds an agent letter to this command: docs/agents/AGENTS_ALPHABET.md (rows, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name it. creator.md and verifier.md name tri gen/test/verify but are not letter agents.","ARGS":[],"COMMAND":"tri lean","ENABLED":true,"ENTRY":"cli/tri/src/main.rs","FAMILY":"tri-cli","ID":"tri/lean","KIND":"tool","SOURCE":"cli/tri/src/leanvac.rs","VARIANT":"Commands::Lean","WHEN_TO_USE":"Completeness theorems whose Lean model is empty.","WITNESS":"source-parse"},"health":"ok","id":"tri/lean","inSpecCorpus":false,"links":{"config":null,"pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","source":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/cli/tri/src/leanvac.rs"},"messages":["no agent letter bound by a source"],"moduleName":"tool_tri_lean","name":{"en":"tri lean"},"repo":"gHashTag/t27","searchText":"tri/lean tri lean completeness theorems whose lean model is empty. completeness theorems whose lean model is empty. vacuous completeness theorems whose model has no functions. reach proof files the build root does not reach, and so nothing compiles.","sha256":"3095224388c11fa7d4bd2293503cbb82b52aa91ec2661808d4f8ddc195e458d6","skills":[],"source":"cli/tri/src/leanvac.rs","specPath":"specs/tools/tri/lean.t27","summary":{"en":"Completeness theorems whose Lean model is empty.","ru":"Теоремы полноты, у которых модель Lean пуста."},"typecheckOk":true,"variant":"Commands::Lean","whenToUse":"Completeness theorems whose Lean model is empty.","witness":"source-parse"},{"aboutSource":"clap /// doc on Commands::Ledgers (cli/tri/src/main.rs; module cli/tri/src/ledgers.rs)","actions":[{"about":"Plant a stale entry in each ledger and demand its gate fail.","name":"audit"}],"agents":[],"args":[],"command":"tri ledgers","discarded":0,"entry":"cli/tri/src/main.rs","family":"tri-cli","fields":{"ABOUT":"Does each ledger's gate notice when one of its entries stops being true?","ABOUT_SOURCE":"clap /// doc on Commands::Ledgers (cli/tri/src/main.rs; module cli/tri/src/ledgers.rs)","ACTIONS":["audit"],"ACTIONS_ABOUT":["Plant a stale entry in each ledger and demand its gate fail."],"AGENTS":[],"AGENTS_NOTE":"No source binds an agent letter to this command: docs/agents/AGENTS_ALPHABET.md (rows, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name it. creator.md and verifier.md name tri gen/test/verify but are not letter agents.","ARGS":[],"COMMAND":"tri ledgers","ENABLED":true,"ENTRY":"cli/tri/src/main.rs","FAMILY":"tri-cli","ID":"tri/ledgers","KIND":"tool","SOURCE":"cli/tri/src/ledgers.rs","VARIANT":"Commands::Ledgers","WHEN_TO_USE":"Does each ledger's gate notice when one of its entries stops being true?","WITNESS":"source-parse"},"health":"ok","id":"tri/ledgers","inSpecCorpus":false,"links":{"config":null,"pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","source":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/cli/tri/src/ledgers.rs"},"messages":["no agent letter bound by a source"],"moduleName":"tool_tri_ledgers","name":{"en":"tri ledgers"},"repo":"gHashTag/t27","searchText":"tri/ledgers tri ledgers does each ledger's gate notice when one of its entries stops being true? does each ledger's gate notice when one of its entries stops being true? audit plant a stale entry in each ledger and demand its gate fail.","sha256":"633ebfab055dc7246ffaa0c3385679fc76bd42f908ad039a02de30ee1c6b3380","skills":[],"source":"cli/tri/src/ledgers.rs","specPath":"specs/tools/tri/ledgers.t27","summary":{"en":"Does each ledger's gate notice when one of its entries stops being true?","ru":"Замечает ли гейт каждого леджера, когда одна из его записей перестаёт быть истинной?"},"typecheckOk":true,"variant":"Commands::Ledgers","whenToUse":"Does each ledger's gate notice when one of its entries stops being true?","witness":"source-parse"},{"aboutSource":"clap /// doc on Commands::Loop (cli/tri/src/main.rs; module cli/tri/src/loopclaim.rs)","actions":[{"about":"Take the named claim, or say who already holds it.","name":"claim"}],"agents":[],"args":[],"command":"tri loop","discarded":0,"entry":"cli/tri/src/main.rs","family":"tri-cli","fields":{"ABOUT":"What is failing on the default branch right now, and since when. Take a named claim so two sessions of the loop cannot pick the same task.","ABOUT_SOURCE":"clap /// doc on Commands::Loop (cli/tri/src/main.rs; module cli/tri/src/loopclaim.rs)","ACTIONS":["claim"],"ACTIONS_ABOUT":["Take the named claim, or say who already holds it."],"AGENTS":[],"AGENTS_NOTE":"No source binds an agent letter to this command: docs/agents/AGENTS_ALPHABET.md (rows, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name it. creator.md and verifier.md name tri gen/test/verify but are not letter agents.","ARGS":[],"COMMAND":"tri loop","ENABLED":true,"ENTRY":"cli/tri/src/main.rs","FAMILY":"tri-cli","ID":"tri/loop","KIND":"tool","SOURCE":"cli/tri/src/loopclaim.rs","VARIANT":"Commands::Loop","WHEN_TO_USE":"What is failing on the default branch right now, and since when. Take a named claim so two sessions of the loop cannot pick the same task.","WITNESS":"source-parse"},"health":"ok","id":"tri/loop","inSpecCorpus":false,"links":{"config":null,"pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","source":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/cli/tri/src/loopclaim.rs"},"messages":["no agent letter bound by a source"],"moduleName":"tool_tri_loop","name":{"en":"tri loop"},"repo":"gHashTag/t27","searchText":"tri/loop tri loop what is failing on the default branch right now, and since when. take a named claim so two sessions of the loop cannot pick the same task. what is failing on the default branch right now, and since when. take a named claim so two sessions of the loop cannot pick the same task. claim take the named claim, or say who already holds it.","sha256":"c4ad96d74fe3dfed11c52bc2dc74c2002bf8d3081532785c58008ba991f87875","skills":[],"source":"cli/tri/src/loopclaim.rs","specPath":"specs/tools/tri/loop.t27","summary":{"en":"What is failing on the default branch right now, and since when. Take a named claim so two sessions of the loop cannot pick the same task.","ru":"Что падает на ветке по умолчанию прямо сейчас и с какого момента. Берёт именованную заявку, чтобы две сессии лупа не взяли одну задачу."},"typecheckOk":true,"variant":"Commands::Loop","whenToUse":"What is failing on the default branch right now, and since when. Take a named claim so two sessions of the loop cannot pick the same task.","witness":"source-parse"},{"aboutSource":"clap /// doc on Commands::Merging (cli/tri/src/main.rs; module cli/tri/src/inflight.rs)","actions":[],"agents":[],"args":[{"about":"The base this branch is supposed to carry. A ref, not a URL.","name":"--base"},{"about":"Also check the commits behind HEAD, not only HEAD itself.","name":"--depth"}],"command":"tri merging","discarded":0,"entry":"cli/tri/src/main.rs","family":"tri-cli","fields":{"ABOUT":"Is a merge in flight here, and does this branch carry the base?","ABOUT_SOURCE":"clap /// doc on Commands::Merging (cli/tri/src/main.rs; module cli/tri/src/inflight.rs)","ACTIONS":[],"ACTIONS_ABOUT":[],"AGENTS":[],"AGENTS_NOTE":"No source binds an agent letter to this command: docs/agents/AGENTS_ALPHABET.md (rows, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name it. creator.md and verifier.md name tri gen/test/verify but are not letter agents.","ARGS":["--base: The base this branch is supposed to carry. A ref, not a URL.","--depth: Also check the commits behind HEAD, not only HEAD itself."],"COMMAND":"tri merging","ENABLED":true,"ENTRY":"cli/tri/src/main.rs","FAMILY":"tri-cli","ID":"tri/merging","KIND":"tool","SOURCE":"cli/tri/src/inflight.rs","VARIANT":"Commands::Merging","WHEN_TO_USE":"Is a merge in flight here, and does this branch carry the base?","WITNESS":"source-parse"},"health":"ok","id":"tri/merging","inSpecCorpus":false,"links":{"config":null,"pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","source":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/cli/tri/src/inflight.rs"},"messages":["no agent letter bound by a source"],"moduleName":"tool_tri_merging","name":{"en":"tri merging"},"repo":"gHashTag/t27","searchText":"tri/merging tri merging is a merge in flight here, and does this branch carry the base? is a merge in flight here, and does this branch carry the base?","sha256":"9f4a1948be3e3357ee168222efb6370a0807b7dd5e74932c4e7142b14a8e4eec","skills":[],"source":"cli/tri/src/inflight.rs","specPath":"specs/tools/tri/merging.t27","summary":{"en":"Is a merge in flight here, and does this branch carry the base?","ru":"Идёт ли здесь мерж, и несёт ли эта ветка базу?"},"typecheckOk":true,"variant":"Commands::Merging","whenToUse":"Is a merge in flight here, and does this branch carry the base?","witness":"source-parse"},{"aboutSource":"clap /// doc on Commands::Misread (cli/tri/src/main.rs; module cli/tri/src/misread.rs)","actions":[],"agents":[],"args":[{"about":"Root of the spec tree.","name":"--specs-dir"},{"about":"Name every spec under each shape rather than only counting.","name":"--list"}],"command":"tri misread","discarded":0,"entry":"cli/tri/src/main.rs","family":"tri-cli","fields":{"ABOUT":"The specs the compiler reads WRONGLY. Every gate is green on them.","ABOUT_SOURCE":"clap /// doc on Commands::Misread (cli/tri/src/main.rs; module cli/tri/src/misread.rs)","ACTIONS":[],"ACTIONS_ABOUT":[],"AGENTS":[],"AGENTS_NOTE":"No source binds an agent letter to this command: docs/agents/AGENTS_ALPHABET.md (rows, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name it. creator.md and verifier.md name tri gen/test/verify but are not letter agents.","ARGS":["--specs-dir: Root of the spec tree.","--list: Name every spec under each shape rather than only counting."],"COMMAND":"tri misread","ENABLED":true,"ENTRY":"cli/tri/src/main.rs","FAMILY":"tri-cli","ID":"tri/misread","KIND":"tool","SOURCE":"cli/tri/src/misread.rs","VARIANT":"Commands::Misread","WHEN_TO_USE":"The specs the compiler reads WRONGLY. Every gate is green on them.","WITNESS":"source-parse"},"health":"ok","id":"tri/misread","inSpecCorpus":false,"links":{"config":null,"pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","source":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/cli/tri/src/misread.rs"},"messages":["no agent letter bound by a source"],"moduleName":"tool_tri_misread","name":{"en":"tri misread"},"repo":"gHashTag/t27","searchText":"tri/misread tri misread the specs the compiler reads wrongly. every gate is green on them. the specs the compiler reads wrongly. every gate is green on them.","sha256":"727dc944093cb833c9c8efe0bfcc67c4a5cdb642402a07ed85d74ebfef33807f","skills":[],"source":"cli/tri/src/misread.rs","specPath":"specs/tools/tri/misread.t27","summary":{"en":"The specs the compiler reads WRONGLY. Every gate is green on them.","ru":"Спеки, которые компилятор читает НЕВЕРНО. Все гейты на них зелёные."},"typecheckOk":true,"variant":"Commands::Misread","whenToUse":"The specs the compiler reads WRONGLY. Every gate is green on them.","witness":"source-parse"},{"aboutSource":"//! module doc, cli/tri/src/modreach.rs:1 (Commands::Mods dispatches to modreach, cli/tri/src/main.rs:1085)","actions":[{"about":"List them.","name":"orphan"}],"agents":[],"args":[],"command":"tri mods","discarded":0,"entry":"cli/tri/src/main.rs","family":"tri-cli","fields":{"ABOUT":"`tri mods orphan` -- `.rs` files no crate root reaches.","ABOUT_SOURCE":"//! module doc, cli/tri/src/modreach.rs:1 (Commands::Mods dispatches to modreach, cli/tri/src/main.rs:1085)","ACTIONS":["orphan"],"ACTIONS_ABOUT":["List them."],"AGENTS":[],"AGENTS_NOTE":"No source binds an agent letter to this command: docs/agents/AGENTS_ALPHABET.md (rows, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name it. creator.md and verifier.md name tri gen/test/verify but are not letter agents.","ARGS":[],"COMMAND":"tri mods","ENABLED":true,"ENTRY":"cli/tri/src/main.rs","FAMILY":"tri-cli","ID":"tri/mods","KIND":"tool","SOURCE":"cli/tri/src/main.rs","VARIANT":"Commands::Mods","WHEN_TO_USE":"`tri mods orphan` -- `.rs` files no crate root reaches.","WITNESS":"source-parse"},"health":"ok","id":"tri/mods","inSpecCorpus":false,"links":{"config":null,"pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","source":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/cli/tri/src/main.rs"},"messages":["no agent letter bound by a source"],"moduleName":"tool_tri_mods","name":{"en":"tri mods"},"repo":"gHashTag/t27","searchText":"tri/mods tri mods `tri mods orphan` -- `.rs` files no crate root reaches. `tri mods orphan` -- `.rs` files no crate root reaches. orphan list them.","sha256":"80105845e78f775fd9d0b45c66d8bb5ed0b04fc2684eb79a87d2d2899fbf8a3c","skills":[],"source":"cli/tri/src/main.rs","specPath":"specs/tools/tri/mods.t27","summary":{"en":"`tri mods orphan` -- `.rs` files no crate root reaches.","ru":"`tri mods orphan` -- файлы `.rs`, до которых не доходит ни один корень крейта."},"typecheckOk":true,"variant":"Commands::Mods","whenToUse":"`tri mods orphan` -- `.rs` files no crate root reaches.","witness":"source-parse"},{"aboutSource":"clap /// doc on Commands::Mutate (cli/tri/src/main.rs; module cli/tri/src/mutate.rs)","actions":[{"about":"Perturb each numeric literal in a file and report which ones the checker does not notice.","name":"run"}],"agents":[],"args":[],"command":"tri mutate","discarded":0,"entry":"cli/tri/src/main.rs","family":"tri-cli","fields":{"ABOUT":"Find the constants in a checker that nothing actually checks.","ABOUT_SOURCE":"clap /// doc on Commands::Mutate (cli/tri/src/main.rs; module cli/tri/src/mutate.rs)","ACTIONS":["run"],"ACTIONS_ABOUT":["Perturb each numeric literal in a file and report which ones the checker does not notice."],"AGENTS":[],"AGENTS_NOTE":"No source binds an agent letter to this command: docs/agents/AGENTS_ALPHABET.md (rows, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name it. creator.md and verifier.md name tri gen/test/verify but are not letter agents.","ARGS":[],"COMMAND":"tri mutate","ENABLED":true,"ENTRY":"cli/tri/src/main.rs","FAMILY":"tri-cli","ID":"tri/mutate","KIND":"tool","SOURCE":"cli/tri/src/mutate.rs","VARIANT":"Commands::Mutate","WHEN_TO_USE":"Find the constants in a checker that nothing actually checks.","WITNESS":"source-parse"},"health":"ok","id":"tri/mutate","inSpecCorpus":false,"links":{"config":null,"pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","source":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/cli/tri/src/mutate.rs"},"messages":["no agent letter bound by a source"],"moduleName":"tool_tri_mutate","name":{"en":"tri mutate"},"repo":"gHashTag/t27","searchText":"tri/mutate tri mutate find the constants in a checker that nothing actually checks. find the constants in a checker that nothing actually checks. run perturb each numeric literal in a file and report which ones the checker does not notice.","sha256":"96b2cf1fe581c919707eec7c6b9e2614d9336b1a183702faf17c1fc3b6df7f9d","skills":[],"source":"cli/tri/src/mutate.rs","specPath":"specs/tools/tri/mutate.t27","summary":{"en":"Find the constants in a checker that nothing actually checks.","ru":"Находит в чекере константы, которые на деле ничем не проверяются."},"typecheckOk":true,"variant":"Commands::Mutate","whenToUse":"Find the constants in a checker that nothing actually checks.","witness":"source-parse"},{"aboutSource":"clap /// doc on Commands::Now (cli/tri/src/main.rs; module cli/tri/src/nownote.rs)","actions":[{"about":"Write a docs/now/ entry: title, bullets, optional issue ref.","name":"add"},{"about":"Ask the REQUIRED `check` gate its own question, before pushing.","name":"check"}],"agents":[],"args":[],"command":"tri now","discarded":0,"entry":"cli/tri/src/main.rs","family":"tri-cli","fields":{"ABOUT":"Write a docs/now/ entry without hand-writing the frame.","ABOUT_SOURCE":"clap /// doc on Commands::Now (cli/tri/src/main.rs; module cli/tri/src/nownote.rs)","ACTIONS":["add","check"],"ACTIONS_ABOUT":["Write a docs/now/ entry: title, bullets, optional issue ref.","Ask the REQUIRED `check` gate its own question, before pushing."],"AGENTS":[],"AGENTS_NOTE":"No source binds an agent letter to this command: docs/agents/AGENTS_ALPHABET.md (rows, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name it. creator.md and verifier.md name tri gen/test/verify but are not letter agents.","ARGS":[],"COMMAND":"tri now","ENABLED":true,"ENTRY":"cli/tri/src/main.rs","FAMILY":"tri-cli","ID":"tri/now","KIND":"tool","SOURCE":"cli/tri/src/nownote.rs","VARIANT":"Commands::Now","WHEN_TO_USE":"Write a docs/now/ entry without hand-writing the frame.","WITNESS":"source-parse"},"health":"ok","id":"tri/now","inSpecCorpus":false,"links":{"config":null,"pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","source":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/cli/tri/src/nownote.rs"},"messages":["no agent letter bound by a source"],"moduleName":"tool_tri_now","name":{"en":"tri now"},"repo":"gHashTag/t27","searchText":"tri/now tri now write a docs/now/ entry without hand-writing the frame. write a docs/now/ entry without hand-writing the frame. add write a docs/now/ entry: title, bullets, optional issue ref. check ask the required `check` gate its own question, before pushing.","sha256":"20e3d9eede8fd5ebe32c665af54d0006ce8156cf24a6493c421430531d037c2d","skills":[],"source":"cli/tri/src/nownote.rs","specPath":"specs/tools/tri/now.t27","summary":{"en":"Write a docs/now/ entry without hand-writing the frame.","ru":"Пишет запись docs/now/ без ручного набора рамки."},"typecheckOk":true,"variant":"Commands::Now","whenToUse":"Write a docs/now/ entry without hand-writing the frame.","witness":"source-parse"},{"aboutSource":"clap /// doc on Commands::OneAway (cli/tri/src/main.rs; module cli/tri/src/oneaway.rs)","actions":[],"agents":[],"args":[{"about":"Also list every spec, not only the class tally.","name":"--names"},{"about":"Report specs with exactly this many errors. The default, 1, is the only bucket a single repair can move; `--errors 2` is the next wave.","name":"--errors"},{"about":"Stop after this many specs. Prints what was dropped -- a silent cap reads as coverage.","name":"--limit"},{"about":"Run the controls and report, changing nothing.","name":"--self-check"}],"command":"tri one-away","discarded":0,"entry":"cli/tri/src/main.rs","family":"tri-cli","fields":{"ABOUT":"Failing specs one defect from compiling, and what that defect is","ABOUT_SOURCE":"clap /// doc on Commands::OneAway (cli/tri/src/main.rs; module cli/tri/src/oneaway.rs)","ACTIONS":[],"ACTIONS_ABOUT":[],"AGENTS":[],"AGENTS_NOTE":"No source binds an agent letter to this command: docs/agents/AGENTS_ALPHABET.md (rows, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name it. creator.md and verifier.md name tri gen/test/verify but are not letter agents.","ARGS":["--names: Also list every spec, not only the class tally.","--errors: Report specs with exactly this many errors. The default, 1, is the only bucket a single repair can move; `--errors 2` is the next wave.","--limit: Stop after this many specs. Prints what was dropped -- a silent cap reads as coverage.","--self-check: Run the controls and report, changing nothing."],"COMMAND":"tri one-away","ENABLED":true,"ENTRY":"cli/tri/src/main.rs","FAMILY":"tri-cli","ID":"tri/one-away","KIND":"tool","SOURCE":"cli/tri/src/oneaway.rs","VARIANT":"Commands::OneAway","WHEN_TO_USE":"Failing specs one defect from compiling, and what that defect is","WITNESS":"source-parse"},"health":"ok","id":"tri/one-away","inSpecCorpus":false,"links":{"config":null,"pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","source":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/cli/tri/src/oneaway.rs"},"messages":["no agent letter bound by a source"],"moduleName":"tool_tri_one_away","name":{"en":"tri one-away"},"repo":"gHashTag/t27","searchText":"tri/one-away tri one-away failing specs one defect from compiling, and what that defect is failing specs one defect from compiling, and what that defect is","sha256":"ada913e77e4a56cd01aa8e1d49b191f77c8277d06f5ba0be16e77f9b2316b403","skills":[],"source":"cli/tri/src/oneaway.rs","specPath":"specs/tools/tri/one-away.t27","summary":{"en":"Failing specs one defect from compiling, and what that defect is","ru":"Падающие спеки, которым до компиляции один дефект, и какой именно."},"typecheckOk":true,"variant":"Commands::OneAway","whenToUse":"Failing specs one defect from compiling, and what that defect is","witness":"source-parse"},{"aboutSource":"clap /// doc on Commands::Orphaned (cli/tri/src/main.rs; module cli/tri/src/orphaned.rs)","actions":[{"about":"List gate and tool sources that name an input which is not in the tree.","name":"list"}],"agents":[],"args":[],"command":"tri orphaned","discarded":0,"entry":"cli/tri/src/main.rs","family":"tri-cli","fields":{"ABOUT":"Checks whose input is not in the tree.","ABOUT_SOURCE":"clap /// doc on Commands::Orphaned (cli/tri/src/main.rs; module cli/tri/src/orphaned.rs)","ACTIONS":["list"],"ACTIONS_ABOUT":["List gate and tool sources that name an input which is not in the tree."],"AGENTS":[],"AGENTS_NOTE":"No source binds an agent letter to this command: docs/agents/AGENTS_ALPHABET.md (rows, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name it. creator.md and verifier.md name tri gen/test/verify but are not letter agents.","ARGS":[],"COMMAND":"tri orphaned","ENABLED":true,"ENTRY":"cli/tri/src/main.rs","FAMILY":"tri-cli","ID":"tri/orphaned","KIND":"tool","SOURCE":"cli/tri/src/orphaned.rs","VARIANT":"Commands::Orphaned","WHEN_TO_USE":"Checks whose input is not in the tree.","WITNESS":"source-parse"},"health":"ok","id":"tri/orphaned","inSpecCorpus":false,"links":{"config":null,"pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","source":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/cli/tri/src/orphaned.rs"},"messages":["no agent letter bound by a source"],"moduleName":"tool_tri_orphaned","name":{"en":"tri orphaned"},"repo":"gHashTag/t27","searchText":"tri/orphaned tri orphaned checks whose input is not in the tree. checks whose input is not in the tree. list list gate and tool sources that name an input which is not in the tree.","sha256":"e5bbf02f63448c02f56d5285355f8abe55c87741df64fef5a6ac1bfe16b06fc8","skills":[],"source":"cli/tri/src/orphaned.rs","specPath":"specs/tools/tri/orphaned.t27","summary":{"en":"Checks whose input is not in the tree.","ru":"Проверки, чей вход отсутствует в дереве."},"typecheckOk":true,"variant":"Commands::Orphaned","whenToUse":"Checks whose input is not in the tree.","witness":"source-parse"},{"aboutSource":"clap /// doc on Commands::Pr (cli/tri/src/main.rs; module cli/tri/src/prcheck.rs)","actions":[{"about":"Classify every failing check and say plainly whether it is safe to merge. Did this pull request's content actually reach the default branch?","name":"landed"},{"about":"","name":"ready"}],"agents":[],"args":[],"command":"tri pr","discarded":0,"entry":"cli/tri/src/main.rs","family":"tri-cli","fields":{"ABOUT":"Is this pull request actually safe to merge?","ABOUT_SOURCE":"clap /// doc on Commands::Pr (cli/tri/src/main.rs; module cli/tri/src/prcheck.rs)","ACTIONS":["landed","ready"],"ACTIONS_ABOUT":["Classify every failing check and say plainly whether it is safe to merge. Did this pull request's content actually reach the default branch?",""],"AGENTS":[],"AGENTS_NOTE":"No source binds an agent letter to this command: docs/agents/AGENTS_ALPHABET.md (rows, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name it. creator.md and verifier.md name tri gen/test/verify but are not letter agents.","ARGS":[],"COMMAND":"tri pr","ENABLED":true,"ENTRY":"cli/tri/src/main.rs","FAMILY":"tri-cli","ID":"tri/pr","KIND":"tool","SOURCE":"cli/tri/src/prcheck.rs","VARIANT":"Commands::Pr","WHEN_TO_USE":"Is this pull request actually safe to merge?","WITNESS":"source-parse"},"health":"ok","id":"tri/pr","inSpecCorpus":false,"links":{"config":null,"pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","source":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/cli/tri/src/prcheck.rs"},"messages":["no agent letter bound by a source"],"moduleName":"tool_tri_pr","name":{"en":"tri pr"},"repo":"gHashTag/t27","searchText":"tri/pr tri pr is this pull request actually safe to merge? is this pull request actually safe to merge? landed classify every failing check and say plainly whether it is safe to merge. did this pull request's content actually reach the default branch? ready","sha256":"d3544462fece4757608b3e71d931867f41e1bed876e082a16bd223347328fe8e","skills":[],"source":"cli/tri/src/prcheck.rs","specPath":"specs/tools/tri/pr.t27","summary":{"en":"Is this pull request actually safe to merge?","ru":"Действительно ли этот pull request безопасно мержить?"},"typecheckOk":true,"variant":"Commands::Pr","whenToUse":"Is this pull request actually safe to merge?","witness":"source-parse"},{"aboutSource":"clap /// doc on Commands::Prose (cli/tri/src/main.rs; module cli/tri/src/prose.rs)","actions":[{"about":"Which specs are blocked only by prose, and how many lines that is.","name":"report"}],"agents":[],"args":[],"command":"tri prose","discarded":0,"entry":"cli/tri/src/main.rs","family":"tri-cli","fields":{"ABOUT":"Specs a literate author left prose in, and how far that prose is from code.","ABOUT_SOURCE":"clap /// doc on Commands::Prose (cli/tri/src/main.rs; module cli/tri/src/prose.rs)","ACTIONS":["report"],"ACTIONS_ABOUT":["Which specs are blocked only by prose, and how many lines that is."],"AGENTS":[],"AGENTS_NOTE":"No source binds an agent letter to this command: docs/agents/AGENTS_ALPHABET.md (rows, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name it. creator.md and verifier.md name tri gen/test/verify but are not letter agents.","ARGS":[],"COMMAND":"tri prose","ENABLED":true,"ENTRY":"cli/tri/src/main.rs","FAMILY":"tri-cli","ID":"tri/prose","KIND":"tool","SOURCE":"cli/tri/src/prose.rs","VARIANT":"Commands::Prose","WHEN_TO_USE":"Specs a literate author left prose in, and how far that prose is from code.","WITNESS":"source-parse"},"health":"ok","id":"tri/prose","inSpecCorpus":false,"links":{"config":null,"pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","source":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/cli/tri/src/prose.rs"},"messages":["no agent letter bound by a source"],"moduleName":"tool_tri_prose","name":{"en":"tri prose"},"repo":"gHashTag/t27","searchText":"tri/prose tri prose specs a literate author left prose in, and how far that prose is from code. specs a literate author left prose in, and how far that prose is from code. report which specs are blocked only by prose, and how many lines that is.","sha256":"8ef694001ce2fd8620a8653f822ac69670dd2f18376771359b983d1f6e941617","skills":[],"source":"cli/tri/src/prose.rs","specPath":"specs/tools/tri/prose.t27","summary":{"en":"Specs a literate author left prose in, and how far that prose is from code.","ru":"Спеки, в которых литературный автор оставил прозу, и насколько эта проза далека от кода."},"typecheckOk":true,"variant":"Commands::Prose","whenToUse":"Specs a literate author left prose in, and how far that prose is from code.","witness":"source-parse"},{"aboutSource":"clap /// doc on Commands::Quantifiers (cli/tri/src/main.rs; module cli/tri/src/quant.rs)","actions":[{"about":"Every quantified clause, its binders, and the size of its domain.","name":"report"},{"about":"Every line carrying a quantifier keyword, and whether the census read it.","name":"audit"}],"agents":[],"args":[],"command":"tri quantifiers","discarded":0,"entry":"cli/tri/src/main.rs","family":"tri-cli","fields":{"ABOUT":"Every quantified clause, its binders, and the size of its domain.","ABOUT_SOURCE":"clap /// doc on Commands::Quantifiers (cli/tri/src/main.rs; module cli/tri/src/quant.rs)","ACTIONS":["report","audit"],"ACTIONS_ABOUT":["Every quantified clause, its binders, and the size of its domain.","Every line carrying a quantifier keyword, and whether the census read it."],"AGENTS":[],"AGENTS_NOTE":"No source binds an agent letter to this command: docs/agents/AGENTS_ALPHABET.md (rows, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name it. creator.md and verifier.md name tri gen/test/verify but are not letter agents.","ARGS":[],"COMMAND":"tri quantifiers","ENABLED":true,"ENTRY":"cli/tri/src/main.rs","FAMILY":"tri-cli","ID":"tri/quantifiers","KIND":"tool","SOURCE":"cli/tri/src/quant.rs","VARIANT":"Commands::Quantifiers","WHEN_TO_USE":"Every quantified clause, its binders, and the size of its domain.","WITNESS":"source-parse"},"health":"ok","id":"tri/quantifiers","inSpecCorpus":false,"links":{"config":null,"pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","source":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/cli/tri/src/quant.rs"},"messages":["no agent letter bound by a source"],"moduleName":"tool_tri_quantifiers","name":{"en":"tri quantifiers"},"repo":"gHashTag/t27","searchText":"tri/quantifiers tri quantifiers every quantified clause, its binders, and the size of its domain. every quantified clause, its binders, and the size of its domain. report every quantified clause, its binders, and the size of its domain. audit every line carrying a quantifier keyword, and whether the census read it.","sha256":"1bc586fd6dd467d577ad4dfc1ae642b04829d0042e964f6af1864f145dee8a2a","skills":[],"source":"cli/tri/src/quant.rs","specPath":"specs/tools/tri/quantifiers.t27","summary":{"en":"Every quantified clause, its binders, and the size of its domain.","ru":"Каждая квантифицированная клауза, её связанные переменные и размер её домена."},"typecheckOk":true,"variant":"Commands::Quantifiers","whenToUse":"Every quantified clause, its binders, and the size of its domain.","witness":"source-parse"},{"aboutSource":"//! module doc, cli/tri/src/red.rs:1","actions":[{"about":"Show workflows whose most recent run on the default branch failed.","name":"now"},{"about":"Which STEP each recent failure of one workflow died at, oldest first.","name":"why"}],"agents":[],"args":[],"command":"tri red","discarded":0,"entry":"cli/tri/src/main.rs","family":"tri-cli","fields":{"ABOUT":"`tri red` -- what is failing on main right now, and since when.","ABOUT_SOURCE":"//! module doc, cli/tri/src/red.rs:1","ACTIONS":["now","why"],"ACTIONS_ABOUT":["Show workflows whose most recent run on the default branch failed.","Which STEP each recent failure of one workflow died at, oldest first."],"AGENTS":[],"AGENTS_NOTE":"No source binds an agent letter to this command: docs/agents/AGENTS_ALPHABET.md (rows, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name it. creator.md and verifier.md name tri gen/test/verify but are not letter agents.","ARGS":[],"COMMAND":"tri red","ENABLED":true,"ENTRY":"cli/tri/src/main.rs","FAMILY":"tri-cli","ID":"tri/red","KIND":"tool","SOURCE":"cli/tri/src/red.rs","VARIANT":"Commands::Red","WHEN_TO_USE":"`tri red` -- what is failing on main right now, and since when.","WITNESS":"source-parse"},"health":"ok","id":"tri/red","inSpecCorpus":false,"links":{"config":null,"pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","source":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/cli/tri/src/red.rs"},"messages":["no agent letter bound by a source"],"moduleName":"tool_tri_red","name":{"en":"tri red"},"repo":"gHashTag/t27","searchText":"tri/red tri red `tri red` -- what is failing on main right now, and since when. `tri red` -- what is failing on main right now, and since when. now show workflows whose most recent run on the default branch failed. why which step each recent failure of one workflow died at, oldest first.","sha256":"63bb048416e517a17f2ac7735ddad0842dc1538b55a9a74d07a9a6e0740b3c66","skills":[],"source":"cli/tri/src/red.rs","specPath":"specs/tools/tri/red.t27","summary":{"en":"`tri red` -- what is failing on main right now, and since when.","ru":"`tri red` -- что падает на main прямо сейчас и с какого момента."},"typecheckOk":true,"variant":"Commands::Red","whenToUse":"`tri red` -- what is failing on main right now, and since when.","witness":"source-parse"},{"aboutSource":"clap /// doc on Commands::Reseal (cli/tri/src/main.rs; module cli/tri/src/reseal.rs)","actions":[{"about":"Rewrite FROZEN_HASH from the current bytes of the sealed file.","name":"write"},{"about":"Report whether the seal matches, and exit non-zero if it does not.","name":"check"}],"agents":[],"args":[],"command":"tri reseal","discarded":0,"entry":"cli/tri/src/main.rs","family":"tri-cli","fields":{"ABOUT":"Recompute the FROZEN_HASH seal from the file it seals.","ABOUT_SOURCE":"clap /// doc on Commands::Reseal (cli/tri/src/main.rs; module cli/tri/src/reseal.rs)","ACTIONS":["write","check"],"ACTIONS_ABOUT":["Rewrite FROZEN_HASH from the current bytes of the sealed file.","Report whether the seal matches, and exit non-zero if it does not."],"AGENTS":[],"AGENTS_NOTE":"No source binds an agent letter to this command: docs/agents/AGENTS_ALPHABET.md (rows, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name it. creator.md and verifier.md name tri gen/test/verify but are not letter agents.","ARGS":[],"COMMAND":"tri reseal","ENABLED":true,"ENTRY":"cli/tri/src/main.rs","FAMILY":"tri-cli","ID":"tri/reseal","KIND":"tool","SOURCE":"cli/tri/src/reseal.rs","VARIANT":"Commands::Reseal","WHEN_TO_USE":"Recompute the FROZEN_HASH seal from the file it seals.","WITNESS":"source-parse"},"health":"ok","id":"tri/reseal","inSpecCorpus":false,"links":{"config":null,"pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","source":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/cli/tri/src/reseal.rs"},"messages":["no agent letter bound by a source"],"moduleName":"tool_tri_reseal","name":{"en":"tri reseal"},"repo":"gHashTag/t27","searchText":"tri/reseal tri reseal recompute the frozen_hash seal from the file it seals. recompute the frozen_hash seal from the file it seals. write rewrite frozen_hash from the current bytes of the sealed file. check report whether the seal matches, and exit non-zero if it does not.","sha256":"99e0e7fb4da6a8c5776449a7cf6e1fec3268f408162d8b1bcf653a64a721ab68","skills":[],"source":"cli/tri/src/reseal.rs","specPath":"specs/tools/tri/reseal.t27","summary":{"en":"Recompute the FROZEN_HASH seal from the file it seals.","ru":"Пересчитывает печать FROZEN_HASH по файлу, который она запечатывает."},"typecheckOk":true,"variant":"Commands::Reseal","whenToUse":"Recompute the FROZEN_HASH seal from the file it seals.","witness":"source-parse"},{"aboutSource":"clap /// doc on Commands::Rtl (cli/tri/src/main.rs; module cli/tri/src/rtl.rs)","actions":[{"about":"Run the five structural checks on a design directory.","name":"check"}],"agents":[],"args":[],"command":"tri rtl","discarded":0,"entry":"cli/tri/src/main.rs","family":"tri-cli","fields":{"ABOUT":"The structural check t27.ai offers, run locally: five verdicts, the yosys version beside the numbers, and no claim about correctness.","ABOUT_SOURCE":"clap /// doc on Commands::Rtl (cli/tri/src/main.rs; module cli/tri/src/rtl.rs)","ACTIONS":["check"],"ACTIONS_ABOUT":["Run the five structural checks on a design directory."],"AGENTS":[],"AGENTS_NOTE":"No source binds an agent letter to this command: docs/agents/AGENTS_ALPHABET.md (rows, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name it. creator.md and verifier.md name tri gen/test/verify but are not letter agents.","ARGS":[],"COMMAND":"tri rtl","ENABLED":true,"ENTRY":"cli/tri/src/main.rs","FAMILY":"tri-cli","ID":"tri/rtl","KIND":"tool","SOURCE":"cli/tri/src/rtl.rs","VARIANT":"Commands::Rtl","WHEN_TO_USE":"The structural check t27.ai offers, run locally: five verdicts, the yosys version beside the numbers, and no claim about correctness.","WITNESS":"source-parse"},"health":"ok","id":"tri/rtl","inSpecCorpus":false,"links":{"config":null,"pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","source":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/cli/tri/src/rtl.rs"},"messages":["no agent letter bound by a source"],"moduleName":"tool_tri_rtl","name":{"en":"tri rtl"},"repo":"gHashTag/t27","searchText":"tri/rtl tri rtl the structural check t27.ai offers, run locally: five verdicts, the yosys version beside the numbers, and no claim about correctness. the structural check t27.ai offers, run locally: five verdicts, the yosys version beside the numbers, and no claim about correctness. check run the five structural checks on a design directory.","sha256":"ffa9646aaa65be1fa33044b4df088067edb04267449b5076a7ebc4dcd372195c","skills":[],"source":"cli/tri/src/rtl.rs","specPath":"specs/tools/tri/rtl.t27","summary":{"en":"The structural check t27.ai offers, run locally: five verdicts, the yosys version beside the numbers, and no claim about correctness.","ru":"Структурная проверка, которую предлагает t27.ai, локально: пять вердиктов, версия yosys рядом с числами и никаких заявлений о корректности."},"typecheckOk":true,"variant":"Commands::Rtl","whenToUse":"The structural check t27.ai offers, run locally: five verdicts, the yosys version beside the numbers, and no claim about correctness.","witness":"source-parse"},{"aboutSource":"clap /// doc on Commands::Seals (cli/tri/src/main.rs; module cli/tri/src/seals.rs)","actions":[{"about":"Is the built compiler newer than the source the seals are checked against?","name":"fresh"},{"about":"Seals whose claims no longer match what the compiler produces, and the one command that repairs them.","name":"drift"},{"about":"Specs that carry more than one seal, and which of those pairs disagree.","name":"twins"},{"about":"Copy the NEWEST seal's claims onto its twins, after a re-seal.","name":"sync-twins"},{"about":"Seals that record `gen_hash=none` -- a spec that produced no output, sealed.","name":"hollow"}],"agents":[],"args":[],"command":"tri seals","discarded":0,"entry":"cli/tri/src/main.rs","family":"tri-cli","fields":{"ABOUT":"What `.trinity/seals` says about a spec, when it says it twice.","ABOUT_SOURCE":"clap /// doc on Commands::Seals (cli/tri/src/main.rs; module cli/tri/src/seals.rs)","ACTIONS":["fresh","drift","twins","sync-twins","hollow"],"ACTIONS_ABOUT":["Is the built compiler newer than the source the seals are checked against?","Seals whose claims no longer match what the compiler produces, and the one command that repairs them.","Specs that carry more than one seal, and which of those pairs disagree.","Copy the NEWEST seal's claims onto its twins, after a re-seal.","Seals that record `gen_hash=none` -- a spec that produced no output, sealed."],"AGENTS":[],"AGENTS_NOTE":"No source binds an agent letter to this command: docs/agents/AGENTS_ALPHABET.md (rows, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name it. creator.md and verifier.md name tri gen/test/verify but are not letter agents.","ARGS":[],"COMMAND":"tri seals","ENABLED":true,"ENTRY":"cli/tri/src/main.rs","FAMILY":"tri-cli","ID":"tri/seals","KIND":"tool","SOURCE":"cli/tri/src/seals.rs","VARIANT":"Commands::Seals","WHEN_TO_USE":"What `.trinity/seals` says about a spec, when it says it twice.","WITNESS":"source-parse"},"health":"ok","id":"tri/seals","inSpecCorpus":false,"links":{"config":null,"pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","source":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/cli/tri/src/seals.rs"},"messages":["no agent letter bound by a source"],"moduleName":"tool_tri_seals","name":{"en":"tri seals"},"repo":"gHashTag/t27","searchText":"tri/seals tri seals what `.trinity/seals` says about a spec, when it says it twice. what `.trinity/seals` says about a spec, when it says it twice. fresh is the built compiler newer than the source the seals are checked against? drift seals whose claims no longer match what the compiler produces, and the one command that repairs them. twins specs that carry more than one seal, and which of those pairs disagree. sync-twins copy the newest seal's claims onto its twins, after a re-seal. hollow seals that record `gen_hash=none` -- a spec that produced no output, sealed.","sha256":"0b0b2c88c77de996fdbfe8321d8138a5176d10444c10a2ceede9af313f0d63a7","skills":[],"source":"cli/tri/src/seals.rs","specPath":"specs/tools/tri/seals.t27","summary":{"en":"What `.trinity/seals` says about a spec, when it says it twice.","ru":"Что `.trinity/seals` говорит о спеке, когда говорит это дважды."},"typecheckOk":true,"variant":"Commands::Seals","whenToUse":"What `.trinity/seals` says about a spec, when it says it twice.","witness":"source-parse"},{"aboutSource":"handler cmd_serve routes and banner string (cli/tri/src/main.rs:1121)","actions":[],"agents":[],"args":[{"about":"","name":"--addr"}],"command":"tri serve","discarded":0,"entry":"cli/tri/src/main.rs","family":"tri-cli","fields":{"ABOUT":"Serve the trinity depin HTTP API over axum: POST /prove, GET /epoch-challenge, GET /health; prints trinity depin v0.1.0 -- listening on .","ABOUT_SOURCE":"handler cmd_serve routes and banner string (cli/tri/src/main.rs:1121)","ACTIONS":[],"ACTIONS_ABOUT":[],"AGENTS":[],"AGENTS_NOTE":"No source binds an agent letter to this command: docs/agents/AGENTS_ALPHABET.md (rows, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name it. creator.md and verifier.md name tri gen/test/verify but are not letter agents.","ARGS":["--addr"],"COMMAND":"tri serve","ENABLED":true,"ENTRY":"cli/tri/src/main.rs","FAMILY":"tri-cli","ID":"tri/serve","KIND":"tool","SOURCE":"cli/tri/src/main.rs","VARIANT":"Commands::Serve","WHEN_TO_USE":"Serve the trinity depin HTTP API over axum: POST /prove, GET /epoch-challenge, GET /health; prints trinity depin v0.1.0 -- listening on .","WITNESS":"source-parse"},"health":"ok","id":"tri/serve","inSpecCorpus":false,"links":{"config":null,"pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","source":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/cli/tri/src/main.rs"},"messages":["no agent letter bound by a source"],"moduleName":"tool_tri_serve","name":{"en":"tri serve"},"repo":"gHashTag/t27","searchText":"tri/serve tri serve serve the trinity depin http api over axum: post /prove, get /epoch-challenge, get /health; prints trinity depin v0.1.0 -- listening on . serve the trinity depin http api over axum: post /prove, get /epoch-challenge, get /health; prints trinity depin v0.1.0 -- listening on .","sha256":"97e2aaf7831bb039ac90280e53830a40c0346410b498576c87efa2a92de876ea","skills":[],"source":"cli/tri/src/main.rs","specPath":"specs/tools/tri/serve.t27","summary":{"en":"Serve the trinity depin HTTP API over axum: POST /prove, GET /epoch-challenge, GET /health; prints trinity depin v0.1.0 -- listening on .","ru":"Поднимает HTTP API trinity depin на axum: POST /prove, GET /epoch-challenge, GET /health; печатает «trinity depin v0.1.0 -- listening on »."},"typecheckOk":true,"variant":"Commands::Serve","whenToUse":"Serve the trinity depin HTTP API over axum: POST /prove, GET /epoch-challenge, GET /health; prints trinity depin v0.1.0 -- listening on .","witness":"source-parse"},{"aboutSource":"tri-mcp tools tri_skill_begin and tri_skill_end descriptions (cli/tri-mcp/src/main.rs); SkillAction enum cli/tri/src/main.rs:349","actions":[{"about":"Write a new lesson to the spool, unnumbered.","name":"add"},{"about":"Fold every spooled lesson into SKILL.md, numbering them on the way in.","name":"fold"},{"about":"Check every SKILL.md's section numbering for collisions.","name":"check"},{"about":"Sections whose body was cut short at some point in the file's history.","name":"lost"},{"about":"Every cross-reference in the skills, and whether it resolves.","name":"refs"},{"about":"Sections that state a FIGURE, and which of those a reader can re-take.","name":"claims"},{"about":"Move sections you appended to the numbers the base branch left free.","name":"renumber"},{"about":"","name":"begin"},{"about":"","name":"end"}],"agents":[],"args":[],"command":"tri skill","discarded":0,"entry":"cli/tri/src/main.rs","family":"tri-cli","fields":{"ABOUT":"Begins a new PHI LOOP skill session bound to an issue. Ends the active PHI LOOP skill session. The add/fold/check/lost/refs/claims/renumber actions carry their own clap docs (SKILL.md lesson spool).","ABOUT_SOURCE":"tri-mcp tools tri_skill_begin and tri_skill_end descriptions (cli/tri-mcp/src/main.rs); SkillAction enum cli/tri/src/main.rs:349","ACTIONS":["add","fold","check","lost","refs","claims","renumber","begin","end"],"ACTIONS_ABOUT":["Write a new lesson to the spool, unnumbered.","Fold every spooled lesson into SKILL.md, numbering them on the way in.","Check every SKILL.md's section numbering for collisions.","Sections whose body was cut short at some point in the file's history.","Every cross-reference in the skills, and whether it resolves.","Sections that state a FIGURE, and which of those a reader can re-take.","Move sections you appended to the numbers the base branch left free.","",""],"AGENTS":[],"AGENTS_NOTE":"No source binds an agent letter to this command: docs/agents/AGENTS_ALPHABET.md (rows, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name it. creator.md and verifier.md name tri gen/test/verify but are not letter agents.","ARGS":[],"COMMAND":"tri skill","ENABLED":true,"ENTRY":"cli/tri/src/main.rs","FAMILY":"tri-cli","ID":"tri/skill","KIND":"tool","SOURCE":"cli/tri/src/main.rs","VARIANT":"Commands::Skill","WHEN_TO_USE":"Begins a new PHI LOOP skill session bound to an issue. Ends the active PHI LOOP skill session. The add/fold/check/lost/refs/claims/renumber actions carry their own clap docs (SKILL.md lesson spool).","WITNESS":"source-parse"},"health":"ok","id":"tri/skill","inSpecCorpus":false,"links":{"config":null,"pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","source":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/cli/tri/src/main.rs"},"messages":["no agent letter bound by a source"],"moduleName":"tool_tri_skill","name":{"en":"tri skill"},"repo":"gHashTag/t27","searchText":"tri/skill tri skill begins a new phi loop skill session bound to an issue. ends the active phi loop skill session. the add/fold/check/lost/refs/claims/renumber actions carry their own clap docs (skill.md lesson spool). begins a new phi loop skill session bound to an issue. ends the active phi loop skill session. the add/fold/check/lost/refs/claims/renumber actions carry their own clap docs (skill.md lesson spool). add write a new lesson to the spool, unnumbered. fold fold every spooled lesson into skill.md, numbering them on the way in. check check every skill.md's section numbering for collisions. lost sections whose body was cut short at some point in the file's history. refs every cross-reference in the skills, and whether it resolves. claims sections that state a figure, and which of those a reader can re-take. renumber move sections you appended to the numbers the base branch left free. begin end","sha256":"f8c9718b9f1604344abc258d6f85703924b0e5163e352e5efc6df70813a98865","skills":[{"id":"t27/tri","via":["SUMMARY_EN"]}],"source":"cli/tri/src/main.rs","specPath":"specs/tools/tri/skill.t27","summary":{"en":"Begins a new PHI LOOP skill session bound to an issue. Ends the active PHI LOOP skill session. The add/fold/check/lost/refs/claims/renumber actions carry their own clap docs (SKILL.md lesson spool).","ru":"Начинает новую сессию скилла PHI LOOP, привязанную к issue; завершает активную сессию. Действия add/fold/check/lost/refs/claims/renumber ведут спул уроков SKILL.md и описаны в своих clap-доках."},"typecheckOk":true,"variant":"Commands::Skill","whenToUse":"Begins a new PHI LOOP skill session bound to an issue. Ends the active PHI LOOP skill session. The add/fold/check/lost/refs/claims/renumber actions carry their own clap docs (SKILL.md lesson spool).","witness":"source-parse"},{"aboutSource":"tri-mcp tool tri_status description (cli/tri-mcp/src/main.rs); handler cmd_status prints === PHI LOOP STATUS === (cli/tri/src/main.rs:613)","actions":[],"agents":[],"args":[],"command":"tri status","discarded":0,"entry":"cli/tri/src/main.rs","family":"tri-cli","fields":{"ABOUT":"Returns PHI LOOP status including active skill, cell, issue binding, and uncommitted changes.","ABOUT_SOURCE":"tri-mcp tool tri_status description (cli/tri-mcp/src/main.rs); handler cmd_status prints === PHI LOOP STATUS === (cli/tri/src/main.rs:613)","ACTIONS":[],"ACTIONS_ABOUT":[],"AGENTS":[],"AGENTS_NOTE":"No source binds an agent letter to this command: docs/agents/AGENTS_ALPHABET.md (rows, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name it. creator.md and verifier.md name tri gen/test/verify but are not letter agents.","ARGS":[],"COMMAND":"tri status","ENABLED":true,"ENTRY":"cli/tri/src/main.rs","FAMILY":"tri-cli","ID":"tri/status","KIND":"tool","SOURCE":"cli/tri/src/main.rs","VARIANT":"Commands::Status","WHEN_TO_USE":"Returns PHI LOOP status including active skill, cell, issue binding, and uncommitted changes.","WITNESS":"source-parse"},"health":"ok","id":"tri/status","inSpecCorpus":false,"links":{"config":null,"pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","source":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/cli/tri/src/main.rs"},"messages":["no agent letter bound by a source"],"moduleName":"tool_tri_status","name":{"en":"tri status"},"repo":"gHashTag/t27","searchText":"tri/status tri status returns phi loop status including active skill, cell, issue binding, and uncommitted changes. returns phi loop status including active skill, cell, issue binding, and uncommitted changes.","sha256":"de90be29df639a7d8e7158a36a5f2b3b77ecf73b6bd362c7473f9d28667f8e09","skills":[],"source":"cli/tri/src/main.rs","specPath":"specs/tools/tri/status.t27","summary":{"en":"Returns PHI LOOP status including active skill, cell, issue binding, and uncommitted changes.","ru":"Показывает статус PHI LOOP: активный скилл, ячейку, привязку к issue и незакоммиченные изменения."},"typecheckOk":true,"variant":"Commands::Status","whenToUse":"Returns PHI LOOP status including active skill, cell, issue binding, and uncommitted changes.","witness":"source-parse"},{"aboutSource":"clap /// doc on Commands::Sweep (cli/tri/src/main.rs; module cli/tri/src/sweep.rs)","actions":[{"about":"Synthesise a top across values of one parameter and report the trend.","name":"area"}],"agents":[],"args":[],"command":"tri sweep","discarded":0,"entry":"cli/tri/src/main.rs","family":"tri-cli","fields":{"ABOUT":"Synthesise across a parameter and check the area actually moves.","ABOUT_SOURCE":"clap /// doc on Commands::Sweep (cli/tri/src/main.rs; module cli/tri/src/sweep.rs)","ACTIONS":["area"],"ACTIONS_ABOUT":["Synthesise a top across values of one parameter and report the trend."],"AGENTS":[],"AGENTS_NOTE":"No source binds an agent letter to this command: docs/agents/AGENTS_ALPHABET.md (rows, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name it. creator.md and verifier.md name tri gen/test/verify but are not letter agents.","ARGS":[],"COMMAND":"tri sweep","ENABLED":true,"ENTRY":"cli/tri/src/main.rs","FAMILY":"tri-cli","ID":"tri/sweep","KIND":"tool","SOURCE":"cli/tri/src/sweep.rs","VARIANT":"Commands::Sweep","WHEN_TO_USE":"Synthesise across a parameter and check the area actually moves.","WITNESS":"source-parse"},"health":"ok","id":"tri/sweep","inSpecCorpus":false,"links":{"config":null,"pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","source":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/cli/tri/src/sweep.rs"},"messages":["no agent letter bound by a source"],"moduleName":"tool_tri_sweep","name":{"en":"tri sweep"},"repo":"gHashTag/t27","searchText":"tri/sweep tri sweep synthesise across a parameter and check the area actually moves. synthesise across a parameter and check the area actually moves. area synthesise a top across values of one parameter and report the trend.","sha256":"6f89f30b724573f89e6c08159e754a3816a13a5b8211f3438476706610d20eb4","skills":[],"source":"cli/tri/src/sweep.rs","specPath":"specs/tools/tri/sweep.t27","summary":{"en":"Synthesise across a parameter and check the area actually moves.","ru":"Синтез по параметру с проверкой, что площадь действительно меняется."},"typecheckOk":true,"variant":"Commands::Sweep","whenToUse":"Synthesise across a parameter and check the area actually moves.","witness":"source-parse"},{"aboutSource":"clap /// doc on Commands::Synth (cli/tri/src/main.rs; module cli/tri/src/synth.rs)","actions":[{"about":"Synthesise a top module and report LUT/DSP/FF/CARRY4 counts.","name":"area"}],"agents":[],"args":[],"command":"tri synth","discarded":0,"entry":"cli/tri/src/main.rs","family":"tri-cli","fields":{"ABOUT":"Synthesise a top module and report area, with the instrument named.","ABOUT_SOURCE":"clap /// doc on Commands::Synth (cli/tri/src/main.rs; module cli/tri/src/synth.rs)","ACTIONS":["area"],"ACTIONS_ABOUT":["Synthesise a top module and report LUT/DSP/FF/CARRY4 counts."],"AGENTS":[],"AGENTS_NOTE":"No source binds an agent letter to this command: docs/agents/AGENTS_ALPHABET.md (rows, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name it. creator.md and verifier.md name tri gen/test/verify but are not letter agents.","ARGS":[],"COMMAND":"tri synth","ENABLED":true,"ENTRY":"cli/tri/src/main.rs","FAMILY":"tri-cli","ID":"tri/synth","KIND":"tool","SOURCE":"cli/tri/src/synth.rs","VARIANT":"Commands::Synth","WHEN_TO_USE":"Synthesise a top module and report area, with the instrument named.","WITNESS":"source-parse"},"health":"ok","id":"tri/synth","inSpecCorpus":false,"links":{"config":null,"pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","source":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/cli/tri/src/synth.rs"},"messages":["no agent letter bound by a source"],"moduleName":"tool_tri_synth","name":{"en":"tri synth"},"repo":"gHashTag/t27","searchText":"tri/synth tri synth synthesise a top module and report area, with the instrument named. synthesise a top module and report area, with the instrument named. area synthesise a top module and report lut/dsp/ff/carry4 counts.","sha256":"5680f02430dc57631097da55700e784997839fc8ed4b5b00b8e0a01ee34a9688","skills":[],"source":"cli/tri/src/synth.rs","specPath":"specs/tools/tri/synth.t27","summary":{"en":"Synthesise a top module and report area, with the instrument named.","ru":"Синтезирует top-модуль и сообщает площадь с указанием инструмента."},"typecheckOk":true,"variant":"Commands::Synth","whenToUse":"Synthesise a top module and report area, with the instrument named.","witness":"source-parse"},{"aboutSource":"tri-mcp tool tri_test description (cli/tri-mcp/src/main.rs); handler cmd_test runs t27c test (cli/tri/src/main.rs:870)","actions":[],"agents":[{"letter":"T","ok":true},{"letter":"V","ok":true}],"args":[{"about":"","name":""}],"command":"tri test","discarded":0,"entry":"cli/tri/src/main.rs","family":"tri-cli","fields":{"ABOUT":"Runs tests for a .t27 spec file using t27c.","ABOUT_SOURCE":"tri-mcp tool tri_test description (cli/tri-mcp/src/main.rs); handler cmd_test runs t27c test (cli/tri/src/main.rs:870)","ACTIONS":[],"ACTIONS_ABOUT":[],"AGENTS":["T","V"],"AGENTS_NOTE":".claude/agents/agent-v-verify.md:47 (tri test -- Run conformance tests); .claude/agents/trinity.md:70 (7. Verify - Run tri test).","ARGS":[""],"COMMAND":"tri test","ENABLED":true,"ENTRY":"cli/tri/src/main.rs","FAMILY":"tri-cli","ID":"tri/test","KIND":"tool","SOURCE":"cli/tri/src/main.rs","VARIANT":"Commands::Test","WHEN_TO_USE":"Runs tests for a .t27 spec file using t27c.","WITNESS":"source-parse"},"health":"ok","id":"tri/test","inSpecCorpus":false,"links":{"config":null,"pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","source":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/cli/tri/src/main.rs"},"messages":[],"moduleName":"tool_tri_test","name":{"en":"tri test"},"repo":"gHashTag/t27","searchText":"tri/test tri test runs tests for a .t27 spec file using t27c. runs tests for a .t27 spec file using t27c. t v","sha256":"6c78b60dd23fecfd0965a38c8cedacc1d29577849daa4c5d8f0516fa68d7829b","skills":[{"id":"t27/tri","via":["SUMMARY_EN"]}],"source":"cli/tri/src/main.rs","specPath":"specs/tools/tri/test.t27","summary":{"en":"Runs tests for a .t27 spec file using t27c.","ru":"Запускает тесты для файла спецификации .t27 через t27c."},"typecheckOk":true,"variant":"Commands::Test","whenToUse":"Runs tests for a .t27 spec file using t27c.","witness":"source-parse"},{"aboutSource":"clap /// doc on Commands::Topic (cli/tri/src/main.rs)","actions":[],"agents":[],"args":[{"about":"Words to look for. A row matches on any; rows carrying more come first.","name":""},{"about":"How many recent commits on the base branch to read.","name":"--commits"}],"command":"tri topic","discarded":0,"entry":"cli/tri/src/main.rs","family":"tri-cli","fields":{"ABOUT":"Has anyone already done this, or are they doing it now?","ABOUT_SOURCE":"clap /// doc on Commands::Topic (cli/tri/src/main.rs)","ACTIONS":[],"ACTIONS_ABOUT":[],"AGENTS":[],"AGENTS_NOTE":"No source binds an agent letter to this command: docs/agents/AGENTS_ALPHABET.md (rows, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name it. creator.md and verifier.md name tri gen/test/verify but are not letter agents.","ARGS":[": Words to look for. A row matches on any; rows carrying more come first.","--commits: How many recent commits on the base branch to read."],"COMMAND":"tri topic","ENABLED":true,"ENTRY":"cli/tri/src/main.rs","FAMILY":"tri-cli","ID":"tri/topic","KIND":"tool","SOURCE":"cli/tri/src/main.rs","VARIANT":"Commands::Topic","WHEN_TO_USE":"Has anyone already done this, or are they doing it now?","WITNESS":"source-parse"},"health":"ok","id":"tri/topic","inSpecCorpus":false,"links":{"config":null,"pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","source":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/cli/tri/src/main.rs"},"messages":["no agent letter bound by a source"],"moduleName":"tool_tri_topic","name":{"en":"tri topic"},"repo":"gHashTag/t27","searchText":"tri/topic tri topic has anyone already done this, or are they doing it now? has anyone already done this, or are they doing it now?","sha256":"303530879cd8541a74be1f2d860fdda1d8243ffbf4d16b4a7074a201b5797e71","skills":[],"source":"cli/tri/src/main.rs","specPath":"specs/tools/tri/topic.t27","summary":{"en":"Has anyone already done this, or are they doing it now?","ru":"Кто-нибудь уже делал это или делает сейчас?"},"typecheckOk":true,"variant":"Commands::Topic","whenToUse":"Has anyone already done this, or are they doing it now?","witness":"source-parse"},{"aboutSource":"//! module doc, cli/tri/src/types_dup.rs:1","actions":[{"about":"Type names with more than one definition in the spec tree.","name":"dup"},{"about":"Hold the conflicted set: a new conflict fails, and a resolved one fails until it is blessed away.","name":"ratchet"},{"about":"Cross-check the written classification against what the tree says today.","name":"classified"},{"about":"Names defined more than once INSIDE ONE FILE.","name":"redef"}],"agents":[],"args":[],"command":"tri types","discarded":0,"entry":"cli/tri/src/main.rs","family":"tri-cli","fields":{"ABOUT":"One type name, more than one definition.","ABOUT_SOURCE":"//! module doc, cli/tri/src/types_dup.rs:1","ACTIONS":["dup","ratchet","classified","redef"],"ACTIONS_ABOUT":["Type names with more than one definition in the spec tree.","Hold the conflicted set: a new conflict fails, and a resolved one fails until it is blessed away.","Cross-check the written classification against what the tree says today.","Names defined more than once INSIDE ONE FILE."],"AGENTS":[],"AGENTS_NOTE":"No source binds an agent letter to this command: docs/agents/AGENTS_ALPHABET.md (rows, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name it. creator.md and verifier.md name tri gen/test/verify but are not letter agents.","ARGS":[],"COMMAND":"tri types","ENABLED":true,"ENTRY":"cli/tri/src/main.rs","FAMILY":"tri-cli","ID":"tri/types","KIND":"tool","SOURCE":"cli/tri/src/types_dup.rs","VARIANT":"Commands::Types","WHEN_TO_USE":"One type name, more than one definition.","WITNESS":"source-parse"},"health":"ok","id":"tri/types","inSpecCorpus":false,"links":{"config":null,"pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","source":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/cli/tri/src/types_dup.rs"},"messages":["no agent letter bound by a source"],"moduleName":"tool_tri_types","name":{"en":"tri types"},"repo":"gHashTag/t27","searchText":"tri/types tri types one type name, more than one definition. one type name, more than one definition. dup type names with more than one definition in the spec tree. ratchet hold the conflicted set: a new conflict fails, and a resolved one fails until it is blessed away. classified cross-check the written classification against what the tree says today. redef names defined more than once inside one file.","sha256":"5ab7c8a8183b8b4ec920907d04d4f56e1be9060b344c2472c0b93b763bae0c51","skills":[],"source":"cli/tri/src/types_dup.rs","specPath":"specs/tools/tri/types.t27","summary":{"en":"One type name, more than one definition.","ru":"Одно имя типа, больше одного определения."},"typecheckOk":true,"variant":"Commands::Types","whenToUse":"One type name, more than one definition.","witness":"source-parse"},{"aboutSource":"//! module doc, cli/tri/src/unparsed.rs:1","actions":[{"about":"Rank the constructs that stop the compiler, most specs first.","name":"report"},{"about":"For each unreadable spec, the ITEM whose presence causes the failure.","name":"locate"},{"about":"Cross-check the census against an INDEPENDENTLY built population.","name":"agree"},{"about":"Run every construct's minimal source and say which the compiler rejects.","name":"probe"}],"agents":[],"args":[],"command":"tri unparsed","discarded":0,"entry":"cli/tri/src/main.rs","family":"tri-cli","fields":{"ABOUT":"Specs the compiler cannot read, ranked by the CONSTRUCT that stops it -- and every construct backed by a live probe.","ABOUT_SOURCE":"//! module doc, cli/tri/src/unparsed.rs:1","ACTIONS":["report","locate","agree","probe"],"ACTIONS_ABOUT":["Rank the constructs that stop the compiler, most specs first.","For each unreadable spec, the ITEM whose presence causes the failure.","Cross-check the census against an INDEPENDENTLY built population.","Run every construct's minimal source and say which the compiler rejects."],"AGENTS":[],"AGENTS_NOTE":"No source binds an agent letter to this command: docs/agents/AGENTS_ALPHABET.md (rows, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name it. creator.md and verifier.md name tri gen/test/verify but are not letter agents.","ARGS":[],"COMMAND":"tri unparsed","ENABLED":true,"ENTRY":"cli/tri/src/main.rs","FAMILY":"tri-cli","ID":"tri/unparsed","KIND":"tool","SOURCE":"cli/tri/src/unparsed.rs","VARIANT":"Commands::Unparsed","WHEN_TO_USE":"Specs the compiler cannot read, ranked by the CONSTRUCT that stops it -- and every construct backed by a live probe.","WITNESS":"source-parse"},"health":"ok","id":"tri/unparsed","inSpecCorpus":false,"links":{"config":null,"pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","source":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/cli/tri/src/unparsed.rs"},"messages":["no agent letter bound by a source"],"moduleName":"tool_tri_unparsed","name":{"en":"tri unparsed"},"repo":"gHashTag/t27","searchText":"tri/unparsed tri unparsed specs the compiler cannot read, ranked by the construct that stops it -- and every construct backed by a live probe. specs the compiler cannot read, ranked by the construct that stops it -- and every construct backed by a live probe. report rank the constructs that stop the compiler, most specs first. locate for each unreadable spec, the item whose presence causes the failure. agree cross-check the census against an independently built population. probe run every construct's minimal source and say which the compiler rejects.","sha256":"e09344f6cabdf1f2763a77934042556012cbc502cc6c35fa349f35c9d6f3b1fc","skills":[],"source":"cli/tri/src/unparsed.rs","specPath":"specs/tools/tri/unparsed.t27","summary":{"en":"Specs the compiler cannot read, ranked by the CONSTRUCT that stops it -- and every construct backed by a live probe.","ru":"Спеки, которые компилятор не может прочитать, ранжированные по КОНСТРУКЦИИ, которая его останавливает, -- и каждая конструкция, подтверждённая живой пробой."},"typecheckOk":true,"variant":"Commands::Unparsed","whenToUse":"Specs the compiler cannot read, ranked by the CONSTRUCT that stops it -- and every construct backed by a live probe.","witness":"source-parse"},{"aboutSource":"clap /// doc on Commands::Vectors (cli/tri/src/main.rs; module cli/tri/src/vectors.rs)","actions":[{"about":"Generate a module's Verilog and execute its registered vectors.","name":"run"},{"about":"Inventory every vector file: executed, debt, or aspirational.","name":"debt"}],"agents":[],"args":[],"command":"tri vectors","discarded":0,"entry":"cli/tri/src/main.rs","family":"tri-cli","fields":{"ABOUT":"The executed-vector registry: run a module's vectors, or inventory which files are executed and which are only displayed.","ABOUT_SOURCE":"clap /// doc on Commands::Vectors (cli/tri/src/main.rs; module cli/tri/src/vectors.rs)","ACTIONS":["run","debt"],"ACTIONS_ABOUT":["Generate a module's Verilog and execute its registered vectors.","Inventory every vector file: executed, debt, or aspirational."],"AGENTS":[],"AGENTS_NOTE":"No source binds an agent letter to this command: docs/agents/AGENTS_ALPHABET.md (rows, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name it. creator.md and verifier.md name tri gen/test/verify but are not letter agents.","ARGS":[],"COMMAND":"tri vectors","ENABLED":true,"ENTRY":"cli/tri/src/main.rs","FAMILY":"tri-cli","ID":"tri/vectors","KIND":"tool","SOURCE":"cli/tri/src/vectors.rs","VARIANT":"Commands::Vectors","WHEN_TO_USE":"The executed-vector registry: run a module's vectors, or inventory which files are executed and which are only displayed.","WITNESS":"source-parse"},"health":"ok","id":"tri/vectors","inSpecCorpus":false,"links":{"config":null,"pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","source":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/cli/tri/src/vectors.rs"},"messages":["no agent letter bound by a source"],"moduleName":"tool_tri_vectors","name":{"en":"tri vectors"},"repo":"gHashTag/t27","searchText":"tri/vectors tri vectors the executed-vector registry: run a module's vectors, or inventory which files are executed and which are only displayed. the executed-vector registry: run a module's vectors, or inventory which files are executed and which are only displayed. run generate a module's verilog and execute its registered vectors. debt inventory every vector file: executed, debt, or aspirational.","sha256":"71eca92871e96a157876d71f7883bf1928ebaf0c7b293e302a3f67742f7c855e","skills":[],"source":"cli/tri/src/vectors.rs","specPath":"specs/tools/tri/vectors.t27","summary":{"en":"The executed-vector registry: run a module's vectors, or inventory which files are executed and which are only displayed.","ru":"Реестр исполняемых векторов: запустить векторы модуля или проинвентаризировать, какие файлы исполняются, а какие только показываются."},"typecheckOk":true,"variant":"Commands::Vectors","whenToUse":"The executed-vector registry: run a module's vectors, or inventory which files are executed and which are only displayed.","witness":"source-parse"},{"aboutSource":"tri-mcp tool tri_verdict description (cli/tri-mcp/src/main.rs); handler cmd_verdict runs t27c validate-seals, validate-phi-identity and, with --toxic, validate-toxicity (cli/tri/src/main.rs:876)","actions":[],"agents":[{"letter":"V","ok":true}],"args":[{"about":"","name":"--toxic"}],"command":"tri verdict","discarded":0,"entry":"cli/tri/src/main.rs","family":"tri-cli","fields":{"ABOUT":"Checks for toxic regressions by analyzing swarm health metrics.","ABOUT_SOURCE":"tri-mcp tool tri_verdict description (cli/tri-mcp/src/main.rs); handler cmd_verdict runs t27c validate-seals, validate-phi-identity and, with --toxic, validate-toxicity (cli/tri/src/main.rs:876)","ACTIONS":[],"ACTIONS_ABOUT":[],"AGENTS":["V"],"AGENTS_NOTE":".claude/agents/agent-v-verify.md:49 (tri verdict -- Generate pass/fail report); docs/agents/AGENTS_ALPHABET.md:80, PHASE 5 VERDICT: V analyzes metrics, tri verdict --toxic.","ARGS":["--toxic"],"COMMAND":"tri verdict","ENABLED":true,"ENTRY":"cli/tri/src/main.rs","FAMILY":"tri-cli","ID":"tri/verdict","KIND":"tool","SOURCE":"cli/tri/src/main.rs","VARIANT":"Commands::Verdict","WHEN_TO_USE":"Checks for toxic regressions by analyzing swarm health metrics.","WITNESS":"source-parse"},"health":"ok","id":"tri/verdict","inSpecCorpus":false,"links":{"config":null,"pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","source":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/cli/tri/src/main.rs"},"messages":[],"moduleName":"tool_tri_verdict","name":{"en":"tri verdict"},"repo":"gHashTag/t27","searchText":"tri/verdict tri verdict checks for toxic regressions by analyzing swarm health metrics. checks for toxic regressions by analyzing swarm health metrics. v","sha256":"14084cba8d9b4379c147553b4565fafe87a25626524da702983b8f001d7b6b98","skills":[{"id":"t27/tri","via":["SUMMARY_EN"]}],"source":"cli/tri/src/main.rs","specPath":"specs/tools/tri/verdict.t27","summary":{"en":"Checks for toxic regressions by analyzing swarm health metrics.","ru":"Проверяет токсичные регрессии, анализируя метрики здоровья роя."},"typecheckOk":true,"variant":"Commands::Verdict","whenToUse":"Checks for toxic regressions by analyzing swarm health metrics.","witness":"source-parse"},{"aboutSource":"clap /// doc on Commands::Vsim (cli/tri/src/main.rs; module cli/tri/src/vsim.rs)","actions":[{"about":"Walk the corpus through `t27c icarus-simulate` and print the funnel.","name":"funnel"}],"agents":[],"args":[],"command":"tri vsim","discarded":0,"entry":"cli/tri/src/main.rs","family":"tri-cli","fields":{"ABOUT":"How far each spec gets when its generated Verilog is actually RUN.","ABOUT_SOURCE":"clap /// doc on Commands::Vsim (cli/tri/src/main.rs; module cli/tri/src/vsim.rs)","ACTIONS":["funnel"],"ACTIONS_ABOUT":["Walk the corpus through `t27c icarus-simulate` and print the funnel."],"AGENTS":[],"AGENTS_NOTE":"No source binds an agent letter to this command: docs/agents/AGENTS_ALPHABET.md (rows, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name it. creator.md and verifier.md name tri gen/test/verify but are not letter agents.","ARGS":[],"COMMAND":"tri vsim","ENABLED":true,"ENTRY":"cli/tri/src/main.rs","FAMILY":"tri-cli","ID":"tri/vsim","KIND":"tool","SOURCE":"cli/tri/src/vsim.rs","VARIANT":"Commands::Vsim","WHEN_TO_USE":"How far each spec gets when its generated Verilog is actually RUN. The one arm that can catch a defect whose nature is that it compiles, and the one arm whose gate has had no targets since #2283 -- see #2987.","WITNESS":"source-parse"},"health":"ok","id":"tri/vsim","inSpecCorpus":false,"links":{"config":null,"pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","source":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/cli/tri/src/vsim.rs"},"messages":["no agent letter bound by a source"],"moduleName":"tool_tri_vsim","name":{"en":"tri vsim"},"repo":"gHashTag/t27","searchText":"tri/vsim tri vsim how far each spec gets when its generated verilog is actually run. how far each spec gets when its generated verilog is actually run. the one arm that can catch a defect whose nature is that it compiles, and the one arm whose gate has had no targets since #2283 -- see #2987. funnel walk the corpus through `t27c icarus-simulate` and print the funnel.","sha256":"b7f377dd3d32a7392f390554d926d4e2d3ce746cd4f83a89ec1113c8624e1717","skills":[],"source":"cli/tri/src/vsim.rs","specPath":"specs/tools/tri/vsim.t27","summary":{"en":"How far each spec gets when its generated Verilog is actually RUN.","ru":"Как далеко доходит каждая спека, когда её сгенерированный Verilog действительно ЗАПУСКАЮТ."},"typecheckOk":true,"variant":"Commands::Vsim","whenToUse":"How far each spec gets when its generated Verilog is actually RUN. The one arm that can catch a defect whose nature is that it compiles, and the one arm whose gate has had no targets since #2283 -- see #2987.","witness":"source-parse"},{"aboutSource":"clap /// doc on Commands::Window (cli/tri/src/main.rs; module cli/tri/src/window.rs)","actions":[],"agents":[],"args":[{"about":"Record `origin/master` as the base of a measurement starting now.","name":"--start"},{"about":"Report whether the recorded base is still the tip, and refuse if it is not.","name":"--check"},{"about":"The ref the measurement is against. Defaults to `origin/master`.","name":"--base"},{"about":"Run the controls and report, changing nothing.","name":"--self-check"}],"command":"tri window","discarded":0,"entry":"cli/tri/src/main.rs","family":"tri-cli","fields":{"ABOUT":"Was the base you measured against still the tip when you reported?","ABOUT_SOURCE":"clap /// doc on Commands::Window (cli/tri/src/main.rs; module cli/tri/src/window.rs)","ACTIONS":[],"ACTIONS_ABOUT":[],"AGENTS":[],"AGENTS_NOTE":"No source binds an agent letter to this command: docs/agents/AGENTS_ALPHABET.md (rows, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name it. creator.md and verifier.md name tri gen/test/verify but are not letter agents.","ARGS":["--start: Record `origin/master` as the base of a measurement starting now.","--check: Report whether the recorded base is still the tip, and refuse if it is not.","--base: The ref the measurement is against. Defaults to `origin/master`.","--self-check: Run the controls and report, changing nothing."],"COMMAND":"tri window","ENABLED":true,"ENTRY":"cli/tri/src/main.rs","FAMILY":"tri-cli","ID":"tri/window","KIND":"tool","SOURCE":"cli/tri/src/window.rs","VARIANT":"Commands::Window","WHEN_TO_USE":"Was the base you measured against still the tip when you reported?","WITNESS":"source-parse"},"health":"ok","id":"tri/window","inSpecCorpus":false,"links":{"config":null,"pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","source":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/cli/tri/src/window.rs"},"messages":["no agent letter bound by a source"],"moduleName":"tool_tri_window","name":{"en":"tri window"},"repo":"gHashTag/t27","searchText":"tri/window tri window was the base you measured against still the tip when you reported? was the base you measured against still the tip when you reported?","sha256":"b670c8d5ce56fe15d2c0b89254ff7d67a2a838b7c87abb9f57577f120cc5f14b","skills":[],"source":"cli/tri/src/window.rs","specPath":"specs/tools/tri/window.t27","summary":{"en":"Was the base you measured against still the tip when you reported?","ru":"Была ли база, относительно которой вы мерили, всё ещё вершиной, когда вы отчитывались?"},"typecheckOk":true,"variant":"Commands::Window","whenToUse":"Was the base you measured against still the tip when you reported?","witness":"source-parse"},{"aboutSource":"clap /// doc on Commands::Worktrees (cli/tri/src/main.rs; module cli/tri/src/trees.rs)","actions":[],"agents":[],"args":[{"about":"Also measure disk usage. Off by default: `du` over 120 checkouts is slow, and the holdings answer is the one that decides anything.","name":"--size"},{"about":"Print every tree, not only those holding work or unreadable.","name":"--all"}],"command":"tri worktrees","discarded":0,"entry":"cli/tri/src/main.rs","family":"tri-cli","fields":{"ABOUT":"What the checkouts on this disk are holding. Deletes nothing.","ABOUT_SOURCE":"clap /// doc on Commands::Worktrees (cli/tri/src/main.rs; module cli/tri/src/trees.rs)","ACTIONS":[],"ACTIONS_ABOUT":[],"AGENTS":[],"AGENTS_NOTE":"No source binds an agent letter to this command: docs/agents/AGENTS_ALPHABET.md (rows, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name it. creator.md and verifier.md name tri gen/test/verify but are not letter agents.","ARGS":["--size: Also measure disk usage. Off by default: `du` over 120 checkouts is slow, and the holdings answer is the one that decides anything.","--all: Print every tree, not only those holding work or unreadable."],"COMMAND":"tri worktrees","ENABLED":true,"ENTRY":"cli/tri/src/main.rs","FAMILY":"tri-cli","ID":"tri/worktrees","KIND":"tool","SOURCE":"cli/tri/src/trees.rs","VARIANT":"Commands::Worktrees","WHEN_TO_USE":"What the checkouts on this disk are holding. Deletes nothing.","WITNESS":"source-parse"},"health":"ok","id":"tri/worktrees","inSpecCorpus":false,"links":{"config":null,"pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","source":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/cli/tri/src/trees.rs"},"messages":["no agent letter bound by a source"],"moduleName":"tool_tri_worktrees","name":{"en":"tri worktrees"},"repo":"gHashTag/t27","searchText":"tri/worktrees tri worktrees what the checkouts on this disk are holding. deletes nothing. what the checkouts on this disk are holding. deletes nothing.","sha256":"862c3a17857c2303bda171bbb3acd1cad2e68e44bf0002caf7f19b78adf0268b","skills":[],"source":"cli/tri/src/trees.rs","specPath":"specs/tools/tri/worktrees.t27","summary":{"en":"What the checkouts on this disk are holding. Deletes nothing.","ru":"Что держат чекауты на этом диске. Ничего не удаляет."},"typecheckOk":true,"variant":"Commands::Worktrees","whenToUse":"What the checkouts on this disk are holding. Deletes nothing.","witness":"source-parse"}],"version":1} +{"compilerWasmSha256":"4d9c0447b5ca288790ab03d3dffc2dda629ed47af9d6731a105fc923aea0aee4","contentSha256":"dccb0ca4a4fbd94b6e764586c724c71580bd37ae059385beef770e4dbe070570","counts":{"byRepo":{"gHashTag/t27":57,"gHashTag/trinity":5},"byWitness":{"help-output":0,"source-parse":62},"enabled":62,"mcp":10,"mcpExternal":5,"mcpTools":235,"mcpWithTools":5,"specs":62,"tri":52,"triActions":124,"triWithActions":38,"typecheckOk":62,"withAgents":5,"withSkills":5},"generatedAt":"2026-09-09T17:14:43.237Z","groups":{"mcpByRepo":{"gHashTag/t27":["mcp/gitbutler","mcp/notebooklm","mcp/t27-traceability","mcp/tri-mcp","mcp/tri-ssot"],"gHashTag/trinity":["mcp/needle","mcp/neon","mcp/railway-mcp-server","mcp/trinity","mcp/zig-docs"]},"triByAgent":{"-":["tri/abandoned","tri/census","tri/ci","tri/competitors","tri/discard","tri/doctor","tri/elab","tri/emit","tri/fleet","tri/fmt","tri/fpga","tri/gates","tri/harness","tri/health","tri/hooks","tri/issues","tri/jumps","tri/kinds","tri/lean","tri/ledgers","tri/loop","tri/merging","tri/misread","tri/mods","tri/mutate","tri/now","tri/one-away","tri/orphaned","tri/pr","tri/prose","tri/quantifiers","tri/red","tri/reseal","tri/rtl","tri/seals","tri/serve","tri/skill","tri/status","tri/sweep","tri/synth","tri/topic","tri/types","tri/unparsed","tri/vectors","tri/vsim","tri/window","tri/worktrees"],"C":["tri/gen"],"E":["tri/experience"],"T":["tri/gen","tri/test"],"V":["tri/test","tri/verdict"],"W":["tri/cell"]}},"i18n":[{"bundle":"apps/website/i18n/agents.ru.json","coverage":{"n":62,"total":62},"enabled":true,"fields":["SUMMARY","NAME"],"locale":"ru","missing":[],"scope":["specs/skills","specs/crons","specs/agents","specs/functions","specs/tools"],"sha256":"c8871fb4ccdef8fc3cc2937af5db0e307ab0b62f6a03ece9f4512851ffd64f04","spec":"specs/i18n/agents-ru.t27"}],"ladder":{"agents":27,"crons":33,"functions":28,"skills":26,"specs":760,"tools":62},"pin":{"ref":"95c9b61b97d487bec4279ca63eb3132da8d1721c","source":"public/agents/experience.json sources[t27].commit"},"tools":[{"aboutSource":".mcp.json entry; no tool list in this repository","agents":[],"config":".mcp.json","discarded":0,"env":["GITBUTLER_REPO"],"external":true,"family":"mcp","fields":{"ABOUT":"External GitButler MCP server launched as `but mcp`; the repository only registers it in .mcp.json.","ABOUT_SOURCE":".mcp.json entry; no tool list in this repository","AGENTS":[],"AGENTS_NOTE":"No source binds an agent letter to this server: docs/agents/AGENTS_ALPHABET.md, specs/OWNERS.md and .claude/agents/*.md do not name it.","CONFIG":".mcp.json","ENABLED":true,"ENV":["GITBUTLER_REPO"],"EXTERNAL":true,"FAMILY":"mcp","ID":"mcp/gitbutler","KIND":"tool","LAUNCH":"but mcp","REPO":"gHashTag/t27","RESOURCES":[],"RESOURCES_ABOUT":[],"SERVER":"gitbutler","SERVER_VERSION":"","SOURCE":".mcp.json","TOOLS":[],"TOOLS_ABOUT":[],"TOOLS_INPUTS":[],"TOOLS_NOTE":"Tool list lives in the external `but` binary, not in this repository; nothing is listed rather than guessed.","TRANSPORT":"stdio","WITNESS":"source-parse"},"health":"ok","id":"mcp/gitbutler","inSpecCorpus":false,"launch":"but mcp","links":{"config":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/.mcp.json","pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","source":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/.mcp.json"},"messages":["no agent letter bound by a source","external package: tool list not in the repository"],"moduleName":"tool_mcp_gitbutler","name":{"en":"gitbutler"},"repo":"gHashTag/t27","resources":[],"searchText":"mcp/gitbutler gitbutler external gitbutler mcp server launched as `but mcp`; the repository only registers it in .mcp.json.","server":"gitbutler","serverVersion":"","sha256":"56d901fa1f8c7594e141cd115f7e17ccee544135fafa3b287aaf4f4a96b63506","skills":[],"source":".mcp.json","specPath":"specs/tools/mcp/gitbutler.t27","summary":{"en":"External GitButler MCP server launched as `but mcp`; the repository only registers it in .mcp.json.","ru":"Внешний MCP-сервер GitButler, запускаемый как `but mcp`; репозиторий лишь регистрирует его в .mcp.json."},"tools":[],"toolsNote":"Tool list lives in the external `but` binary, not in this repository; nothing is listed rather than guessed.","transport":"stdio","typecheckOk":true,"witness":"source-parse"},{"aboutSource":"derived from the tool descriptions in tools/mcp/needle_mcp/server.zig","agents":[],"config":".claude-plugin/.mcp.json","discarded":0,"env":[],"external":false,"family":"mcp","fields":{"ABOUT":"Zig MCP server for AST-aware code editing (needle): structural search and replace, quality gates, preview.","ABOUT_SOURCE":"derived from the tool descriptions in tools/mcp/needle_mcp/server.zig","AGENTS":[],"AGENTS_NOTE":"No source binds an agent letter to this server: docs/agents/AGENTS_ALPHABET.md, specs/OWNERS.md and .claude/agents/*.md do not name it.","CONFIG":".claude-plugin/.mcp.json","ENABLED":true,"ENV":[],"EXTERNAL":false,"FAMILY":"mcp","ID":"mcp/needle","KIND":"tool","LAUNCH":"/zig-out/bin/needle-mcp","REPO":"gHashTag/trinity","RESOURCES":[],"RESOURCES_ABOUT":[],"SERVER":"needle","SERVER_VERSION":"","SOURCE":"tools/mcp/needle_mcp/server.zig","TOOLS":["needle_structural_replace","needle_search","needle_quality_gates","needle_preview","needle_batch_edit","needle_autonomous_refactor"],"TOOLS_ABOUT":["Apply AST-aware code edit with Tier 0->1 fallback and safety gates","Search codebase for pattern matches with confidence scores","Run quality gates: parse check, AST analysis, violation detection","Preview edit diff without applying changes","Apply multiple edits in a single operation","Execute Ralph Loop: intent-aware refactoring using semantic search + HNSW + VSA validation"],"TOOLS_INPUTS":["","","","","",""],"TOOLS_NOTE":"Input schema keys were not extracted for this server (schemas are inline Zig literals); names and descriptions only. The .claude-plugin/.mcp.json command is an absolute path into a developer checkout; its home prefix is written as here (no home paths in specs).","TRANSPORT":"stdio","WITNESS":"source-parse"},"health":"ok","id":"mcp/needle","inSpecCorpus":false,"launch":"/zig-out/bin/needle-mcp","links":{"config":"https://github.com/gHashTag/trinity/blob/da84d38795aa97f9170bb670f04a328032aa6ffe/.claude-plugin/.mcp.json","pinnedAt":"da84d38795aa97f9170bb670f04a328032aa6ffe","source":"https://github.com/gHashTag/trinity/blob/da84d38795aa97f9170bb670f04a328032aa6ffe/tools/mcp/needle_mcp/server.zig"},"messages":["no agent letter bound by a source"],"moduleName":"tool_mcp_needle","name":{"en":"needle"},"repo":"gHashTag/trinity","resources":[],"searchText":"mcp/needle needle zig mcp server for ast-aware code editing (needle): structural search and replace, quality gates, preview. needle_structural_replace apply ast-aware code edit with tier 0->1 fallback and safety gates needle_search search codebase for pattern matches with confidence scores needle_quality_gates run quality gates: parse check, ast analysis, violation detection needle_preview preview edit diff without applying changes needle_batch_edit apply multiple edits in a single operation needle_autonomous_refactor execute ralph loop: intent-aware refactoring using semantic search + hnsw + vsa validation","server":"needle","serverVersion":"","sha256":"7acdef65de4c51c365937bdefaa53bf4324731210892f4fb6763769e243d62fa","skills":[],"source":"tools/mcp/needle_mcp/server.zig","specPath":"specs/tools/mcp/needle.t27","summary":{"en":"Zig MCP server for AST-aware code editing (needle): structural search and replace, quality gates, preview.","ru":"MCP-сервер на Zig для AST-осознанного редактирования кода (needle): структурный поиск и замена, гейты качества, предпросмотр."},"tools":[{"about":"Apply AST-aware code edit with Tier 0->1 fallback and safety gates","inputs":[],"name":"needle_structural_replace"},{"about":"Search codebase for pattern matches with confidence scores","inputs":[],"name":"needle_search"},{"about":"Run quality gates: parse check, AST analysis, violation detection","inputs":[],"name":"needle_quality_gates"},{"about":"Preview edit diff without applying changes","inputs":[],"name":"needle_preview"},{"about":"Apply multiple edits in a single operation","inputs":[],"name":"needle_batch_edit"},{"about":"Execute Ralph Loop: intent-aware refactoring using semantic search + HNSW + VSA validation","inputs":[],"name":"needle_autonomous_refactor"}],"toolsNote":"Input schema keys were not extracted for this server (schemas are inline Zig literals); names and descriptions only. The .claude-plugin/.mcp.json command is an absolute path into a developer checkout; its home prefix is written as here (no home paths in specs).","transport":"stdio","typecheckOk":true,"witness":"source-parse"},{"aboutSource":".mcp.json entry; no tool list in this repository","agents":[],"config":".mcp.json","discarded":0,"env":["NEON_API_KEY"],"external":true,"family":"mcp","fields":{"ABOUT":"External MCP server `neon` registered in .mcp.json; launched as `npx -y @neondatabase/mcp-server-neon start`.","ABOUT_SOURCE":".mcp.json entry; no tool list in this repository","AGENTS":[],"AGENTS_NOTE":"No source binds an agent letter to this server: docs/agents/AGENTS_ALPHABET.md, specs/OWNERS.md and .claude/agents/*.md do not name it.","CONFIG":".mcp.json","ENABLED":true,"ENV":["NEON_API_KEY"],"EXTERNAL":true,"FAMILY":"mcp","ID":"mcp/neon","KIND":"tool","LAUNCH":"npx -y @neondatabase/mcp-server-neon start","REPO":"gHashTag/trinity","RESOURCES":[],"RESOURCES_ABOUT":[],"SERVER":"neon","SERVER_VERSION":"","SOURCE":".mcp.json","TOOLS":[],"TOOLS_ABOUT":[],"TOOLS_INPUTS":[],"TOOLS_NOTE":"Tool list lives in the external npm package, not in this repository; nothing is listed rather than guessed.","TRANSPORT":"stdio","WITNESS":"source-parse"},"health":"ok","id":"mcp/neon","inSpecCorpus":false,"launch":"npx -y @neondatabase/mcp-server-neon start","links":{"config":"https://github.com/gHashTag/trinity/blob/da84d38795aa97f9170bb670f04a328032aa6ffe/.mcp.json","pinnedAt":"da84d38795aa97f9170bb670f04a328032aa6ffe","source":"https://github.com/gHashTag/trinity/blob/da84d38795aa97f9170bb670f04a328032aa6ffe/.mcp.json"},"messages":["no agent letter bound by a source","external package: tool list not in the repository"],"moduleName":"tool_mcp_neon","name":{"en":"neon"},"repo":"gHashTag/trinity","resources":[],"searchText":"mcp/neon neon external mcp server `neon` registered in .mcp.json; launched as `npx -y @neondatabase/mcp-server-neon start`.","server":"neon","serverVersion":"","sha256":"b5a7bb64220ed166ea95dc1d1aa0849cf680813b2bd40a72c9f4c94f9f770336","skills":[],"source":".mcp.json","specPath":"specs/tools/mcp/neon.t27","summary":{"en":"External MCP server `neon` registered in .mcp.json; launched as `npx -y @neondatabase/mcp-server-neon start`.","ru":"Внешний MCP-сервер `neon`, зарегистрированный в .mcp.json; запускается как `npx -y @neondatabase/mcp-server-neon start`."},"tools":[],"toolsNote":"Tool list lives in the external npm package, not in this repository; nothing is listed rather than guessed.","transport":"stdio","typecheckOk":true,"witness":"source-parse"},{"aboutSource":".claude/mcp.json entry; no tool list in this repository","agents":[],"config":".claude/mcp.json","discarded":0,"env":["NOTEBOOKLM_STORAGE_STATE"],"external":true,"family":"mcp","fields":{"ABOUT":"External MCP server `notebooklm` registered in .claude/mcp.json; launched as `notebooklm-mcp`.","ABOUT_SOURCE":".claude/mcp.json entry; no tool list in this repository","AGENTS":[],"AGENTS_NOTE":"No source binds an agent letter to this server: docs/agents/AGENTS_ALPHABET.md, specs/OWNERS.md and .claude/agents/*.md do not name it.","CONFIG":".claude/mcp.json","ENABLED":true,"ENV":["NOTEBOOKLM_STORAGE_STATE"],"EXTERNAL":true,"FAMILY":"mcp","ID":"mcp/notebooklm","KIND":"tool","LAUNCH":"notebooklm-mcp --notebook-id auto","REPO":"gHashTag/t27","RESOURCES":[],"RESOURCES_ABOUT":[],"SERVER":"notebooklm","SERVER_VERSION":"","SOURCE":".claude/mcp.json","TOOLS":[],"TOOLS_ABOUT":[],"TOOLS_INPUTS":[],"TOOLS_NOTE":"Tool list lives in the external package, not in this repository.","TRANSPORT":"stdio","WITNESS":"source-parse"},"health":"ok","id":"mcp/notebooklm","inSpecCorpus":false,"launch":"notebooklm-mcp --notebook-id auto","links":{"config":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/.claude/mcp.json","pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","source":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/.claude/mcp.json"},"messages":["no agent letter bound by a source","external package: tool list not in the repository"],"moduleName":"tool_mcp_notebooklm","name":{"en":"notebooklm"},"repo":"gHashTag/t27","resources":[],"searchText":"mcp/notebooklm notebooklm external mcp server `notebooklm` registered in .claude/mcp.json; launched as `notebooklm-mcp`.","server":"notebooklm","serverVersion":"","sha256":"3cc26688fee51b761a4debb197f9078143c4a8ec2ef0df914ab981d0133e75f6","skills":[],"source":".claude/mcp.json","specPath":"specs/tools/mcp/notebooklm.t27","summary":{"en":"External MCP server `notebooklm` registered in .claude/mcp.json; launched as `notebooklm-mcp`.","ru":"Внешний MCP-сервер `notebooklm`, зарегистрированный в .claude/mcp.json; запускается как `notebooklm-mcp`."},"tools":[],"toolsNote":"Tool list lives in the external package, not in this repository.","transport":"stdio","typecheckOk":true,"witness":"source-parse"},{"aboutSource":".mcp.json entry; no tool list in this repository","agents":[],"config":".mcp.json","discarded":0,"env":[],"external":true,"family":"mcp","fields":{"ABOUT":"External MCP server `railway-mcp-server` registered in .mcp.json; launched as `npx -y @railway/mcp-server`.","ABOUT_SOURCE":".mcp.json entry; no tool list in this repository","AGENTS":[],"AGENTS_NOTE":"No source binds an agent letter to this server: docs/agents/AGENTS_ALPHABET.md, specs/OWNERS.md and .claude/agents/*.md do not name it.","CONFIG":".mcp.json","ENABLED":true,"ENV":[],"EXTERNAL":true,"FAMILY":"mcp","ID":"mcp/railway-mcp-server","KIND":"tool","LAUNCH":"npx -y @railway/mcp-server","REPO":"gHashTag/trinity","RESOURCES":[],"RESOURCES_ABOUT":[],"SERVER":"railway-mcp-server","SERVER_VERSION":"","SOURCE":".mcp.json","TOOLS":[],"TOOLS_ABOUT":[],"TOOLS_INPUTS":[],"TOOLS_NOTE":"Tool list lives in the external npm package, not in this repository; nothing is listed rather than guessed.","TRANSPORT":"stdio","WITNESS":"source-parse"},"health":"ok","id":"mcp/railway-mcp-server","inSpecCorpus":false,"launch":"npx -y @railway/mcp-server","links":{"config":"https://github.com/gHashTag/trinity/blob/da84d38795aa97f9170bb670f04a328032aa6ffe/.mcp.json","pinnedAt":"da84d38795aa97f9170bb670f04a328032aa6ffe","source":"https://github.com/gHashTag/trinity/blob/da84d38795aa97f9170bb670f04a328032aa6ffe/.mcp.json"},"messages":["no agent letter bound by a source","external package: tool list not in the repository"],"moduleName":"tool_mcp_railway_mcp_server","name":{"en":"railway-mcp-server"},"repo":"gHashTag/trinity","resources":[],"searchText":"mcp/railway-mcp-server railway-mcp-server external mcp server `railway-mcp-server` registered in .mcp.json; launched as `npx -y @railway/mcp-server`.","server":"railway-mcp-server","serverVersion":"","sha256":"5a4ee7fe4575961461129cdcb18cbbe7e9779f8c70f98a8b6c3eea4564bff0ed","skills":[],"source":".mcp.json","specPath":"specs/tools/mcp/railway-mcp-server.t27","summary":{"en":"External MCP server `railway-mcp-server` registered in .mcp.json; launched as `npx -y @railway/mcp-server`.","ru":"Внешний MCP-сервер `railway-mcp-server`, зарегистрированный в .mcp.json; запускается как `npx -y @railway/mcp-server`."},"tools":[],"toolsNote":"Tool list lives in the external npm package, not in this repository; nothing is listed rather than guessed.","transport":"stdio","typecheckOk":true,"witness":"source-parse"},{"aboutSource":"derived from the tool and resource descriptions in scripts/mcp-traceability-server.js","agents":[],"config":".mcp.json","discarded":0,"env":["PROJECT_ROOT","ENFORCE_L1"],"external":false,"family":"mcp","fields":{"ABOUT":"MCP server over stdio that checks L1 TRACEABILITY (Closes #N) in commit messages and PR descriptions, generates compliant commit messages, validates branch names and serves the PHI LOOP stacked-branch template; resources expose the constitution and the L1 audit.","ABOUT_SOURCE":"derived from the tool and resource descriptions in scripts/mcp-traceability-server.js","AGENTS":[],"AGENTS_NOTE":"No source binds an agent letter to this server: docs/agents/AGENTS_ALPHABET.md, specs/OWNERS.md and .claude/agents/*.md do not name it.","CONFIG":".mcp.json","ENABLED":true,"ENV":["PROJECT_ROOT","ENFORCE_L1"],"EXTERNAL":false,"FAMILY":"mcp","ID":"mcp/t27-traceability","KIND":"tool","LAUNCH":"node scripts/mcp-traceability-server.js","REPO":"gHashTag/t27","RESOURCES":["docs/T27-CONSTITUTION.md","docs/l1-traceability-audit.md"],"RESOURCES_ABOUT":["Constitutional laws including L1 TRACEABILITY","Audit report for L1 TRACEABILITY compliance"],"SERVER":"t27-traceability","SERVER_VERSION":"1.0.0","SOURCE":"scripts/mcp-traceability-server.js","TOOLS":["check_traceability","generate_commit_message","validate_branch_name","get_phi_loop_template"],"TOOLS_ABOUT":["Check if a commit message or PR description complies with L1 TRACEABILITY (Closes #N required)","Generate a compliant commit message for t27 including required L1 TRACEABILITY reference","Validate branch name follows t27 naming conventions","Get PHI LOOP stacked branch template for ring development"],"TOOLS_INPUTS":["message","type,scope,description,issueNumber,invariantLaws,body","branchName","ringNumber"],"TOOLS_NOTE":"","TRANSPORT":"stdio","WITNESS":"source-parse"},"health":"ok","id":"mcp/t27-traceability","inSpecCorpus":false,"launch":"node scripts/mcp-traceability-server.js","links":{"config":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/.mcp.json","pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","source":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/scripts/mcp-traceability-server.js"},"messages":["no agent letter bound by a source"],"moduleName":"tool_mcp_t27_traceability","name":{"en":"t27-traceability"},"repo":"gHashTag/t27","resources":[{"about":"Constitutional laws including L1 TRACEABILITY","path":"docs/T27-CONSTITUTION.md"},{"about":"Audit report for L1 TRACEABILITY compliance","path":"docs/l1-traceability-audit.md"}],"searchText":"mcp/t27-traceability t27-traceability mcp server over stdio that checks l1 traceability (closes #n) in commit messages and pr descriptions, generates compliant commit messages, validates branch names and serves the phi loop stacked-branch template; resources expose the constitution and the l1 audit. check_traceability check if a commit message or pr description complies with l1 traceability (closes #n required) generate_commit_message generate a compliant commit message for t27 including required l1 traceability reference validate_branch_name validate branch name follows t27 naming conventions get_phi_loop_template get phi loop stacked branch template for ring development","server":"t27-traceability","serverVersion":"1.0.0","sha256":"ee3baf01e84914b598dc77db8a4605e46739b1897da7d5cb9a9ca6f51fe49d8a","skills":[],"source":"scripts/mcp-traceability-server.js","specPath":"specs/tools/mcp/t27-traceability.t27","summary":{"en":"MCP server over stdio that checks L1 TRACEABILITY (Closes #N) in commit messages and PR descriptions, generates compliant commit messages, validates branch names and serves the PHI LOOP stacked-branch template; resources expose the constitution and the L1 audit.","ru":"MCP-сервер по stdio, проверяющий L1 TRACEABILITY (Closes #N) в сообщениях коммитов и описаниях PR, генерирующий соответствующие сообщения коммитов, валидирующий имена веток и отдающий шаблон стековых веток PHI LOOP; ресурсы открывают конституцию и аудит L1."},"tools":[{"about":"Check if a commit message or PR description complies with L1 TRACEABILITY (Closes #N required)","inputs":["message"],"name":"check_traceability"},{"about":"Generate a compliant commit message for t27 including required L1 TRACEABILITY reference","inputs":["type","scope","description","issueNumber","invariantLaws","body"],"name":"generate_commit_message"},{"about":"Validate branch name follows t27 naming conventions","inputs":["branchName"],"name":"validate_branch_name"},{"about":"Get PHI LOOP stacked branch template for ring development","inputs":["ringNumber"],"name":"get_phi_loop_template"}],"toolsNote":"","transport":"stdio","typecheckOk":true,"witness":"source-parse"},{"aboutSource":"derived from the tool descriptions in cli/tri-mcp/src/main.rs build_tools_list","agents":[],"config":"","discarded":0,"env":[],"external":false,"family":"mcp","fields":{"ABOUT":"Rust MCP server exposing the PHI LOOP tri commands as tools: status, skill begin/end, cell checkpoint/seal, gen, test, verdict, experience save, health.","ABOUT_SOURCE":"derived from the tool descriptions in cli/tri-mcp/src/main.rs build_tools_list","AGENTS":[],"AGENTS_NOTE":"No source binds an agent letter to this server: docs/agents/AGENTS_ALPHABET.md, specs/OWNERS.md and .claude/agents/*.md do not name it.","CONFIG":"","ENABLED":true,"ENV":[],"EXTERNAL":false,"FAMILY":"mcp","ID":"mcp/tri-mcp","KIND":"tool","LAUNCH":"cargo run -q -p tri-mcp (binary tri-mcp; JSON-RPC over stdio)","REPO":"gHashTag/t27","RESOURCES":[],"RESOURCES_ABOUT":[],"SERVER":"tri-mcp","SERVER_VERSION":"0.1.0","SOURCE":"cli/tri-mcp/src/main.rs","TOOLS":["tri_status","tri_skill_begin","tri_skill_end","tri_cell_checkpoint","tri_cell_seal","tri_gen","tri_test","tri_verdict","tri_experience_save","tri_health"],"TOOLS_ABOUT":["Returns PHI LOOP status including active skill, cell, issue binding, and uncommitted changes.","Begins a new PHI LOOP skill session bound to an issue.","Ends the active PHI LOOP skill session.","Records a checkpoint step in the active cell.","Seals the active cell by computing a SHA-256 hash of its checkpoint history.","Generates backends from a .t27 spec file using t27c.","Runs tests for a .t27 spec file using t27c.","Checks for toxic regressions by analyzing swarm health metrics.","Saves an experience episode to the akashic log.","Returns queen and swarm health status from .trinity state."],"TOOLS_INPUTS":["","issue,description","","step","","spec_path","spec_path","","episode_type,summary,ring",""],"TOOLS_NOTE":"Not registered in .mcp.json at this commit; the server exists as the tri-mcp crate.","TRANSPORT":"stdio","WITNESS":"source-parse"},"health":"ok","id":"mcp/tri-mcp","inSpecCorpus":false,"launch":"cargo run -q -p tri-mcp (binary tri-mcp; JSON-RPC over stdio)","links":{"config":null,"pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","source":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/cli/tri-mcp/src/main.rs"},"messages":["no agent letter bound by a source"],"moduleName":"tool_mcp_tri_mcp","name":{"en":"tri-mcp"},"repo":"gHashTag/t27","resources":[],"searchText":"mcp/tri-mcp tri-mcp rust mcp server exposing the phi loop tri commands as tools: status, skill begin/end, cell checkpoint/seal, gen, test, verdict, experience save, health. tri_status returns phi loop status including active skill, cell, issue binding, and uncommitted changes. tri_skill_begin begins a new phi loop skill session bound to an issue. tri_skill_end ends the active phi loop skill session. tri_cell_checkpoint records a checkpoint step in the active cell. tri_cell_seal seals the active cell by computing a sha-256 hash of its checkpoint history. tri_gen generates backends from a .t27 spec file using t27c. tri_test runs tests for a .t27 spec file using t27c. tri_verdict checks for toxic regressions by analyzing swarm health metrics. tri_experience_save saves an experience episode to the akashic log. tri_health returns queen and swarm health status from .trinity state.","server":"tri-mcp","serverVersion":"0.1.0","sha256":"c72d71922134c15b601238078363f17a4b63f415e10b96768757ea7e9ed8f344","skills":[],"source":"cli/tri-mcp/src/main.rs","specPath":"specs/tools/mcp/tri-mcp.t27","summary":{"en":"Rust MCP server exposing the PHI LOOP tri commands as tools: status, skill begin/end, cell checkpoint/seal, gen, test, verdict, experience save, health.","ru":"MCP-сервер на Rust, открывающий команды tri PHI LOOP как инструменты: status, skill begin/end, cell checkpoint/seal, gen, test, verdict, experience save, health."},"tools":[{"about":"Returns PHI LOOP status including active skill, cell, issue binding, and uncommitted changes.","inputs":[],"name":"tri_status"},{"about":"Begins a new PHI LOOP skill session bound to an issue.","inputs":["issue","description"],"name":"tri_skill_begin"},{"about":"Ends the active PHI LOOP skill session.","inputs":[],"name":"tri_skill_end"},{"about":"Records a checkpoint step in the active cell.","inputs":["step"],"name":"tri_cell_checkpoint"},{"about":"Seals the active cell by computing a SHA-256 hash of its checkpoint history.","inputs":[],"name":"tri_cell_seal"},{"about":"Generates backends from a .t27 spec file using t27c.","inputs":["spec_path"],"name":"tri_gen"},{"about":"Runs tests for a .t27 spec file using t27c.","inputs":["spec_path"],"name":"tri_test"},{"about":"Checks for toxic regressions by analyzing swarm health metrics.","inputs":[],"name":"tri_verdict"},{"about":"Saves an experience episode to the akashic log.","inputs":["episode_type","summary","ring"],"name":"tri_experience_save"},{"about":"Returns queen and swarm health status from .trinity state.","inputs":[],"name":"tri_health"}],"toolsNote":"Not registered in .mcp.json at this commit; the server exists as the tri-mcp crate.","transport":"stdio","typecheckOk":true,"witness":"source-parse"},{"aboutSource":"manifest.json description","agents":[],"config":".claude/mcp/tri-ssot/manifest.json","discarded":0,"env":[],"external":false,"family":"mcp","fields":{"ABOUT":"SSOT Integration for t27: GitHub Issues + PRs + Documentation -> NotebookLM","ABOUT_SOURCE":"manifest.json description","AGENTS":[],"AGENTS_NOTE":"No source binds an agent letter to this server: docs/agents/AGENTS_ALPHABET.md, specs/OWNERS.md and .claude/agents/*.md do not name it.","CONFIG":".claude/mcp/tri-ssot/manifest.json","ENABLED":true,"ENV":[],"EXTERNAL":false,"FAMILY":"mcp","ID":"mcp/tri-ssot","KIND":"tool","LAUNCH":"python3 -m contrib.backend.github.mcp_server","REPO":"gHashTag/t27","RESOURCES":[],"RESOURCES_ABOUT":[],"SERVER":"tri-ssot","SERVER_VERSION":"1.0.0","SOURCE":".claude/mcp/tri-ssot/manifest.json","TOOLS":["tri_issue","tri_pr","tri_docs","tri_sync","tri_search"],"TOOLS_ABOUT":["GitHub Issue management: create, update, list, close","GitHub PR management: create, merge, close, get status","Documentation management: upload to NotebookLM, sync, query","Unified sync: sync all entities (issues, prs, docs) with NotebookLM","Unified search across GitHub Issues, PRs, NotebookLM docs"],"TOOLS_INPUTS":["action,title,body,labels,issue_id,state","action,title,body,pr_id,issue_id","action,file_path,title","scope","query"],"TOOLS_NOTE":"The manifest names python3 -m contrib.backend.github.mcp_server, but the t27 tree at this commit has no contrib/backend/github/mcp_server.py (git ls-tree); the tool list is taken from the manifest alone (declared, not executed).","TRANSPORT":"stdio","WITNESS":"source-parse"},"health":"ok","id":"mcp/tri-ssot","inSpecCorpus":false,"launch":"python3 -m contrib.backend.github.mcp_server","links":{"config":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/.claude/mcp/tri-ssot/manifest.json","pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","source":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/.claude/mcp/tri-ssot/manifest.json"},"messages":["no agent letter bound by a source"],"moduleName":"tool_mcp_tri_ssot","name":{"en":"tri-ssot"},"repo":"gHashTag/t27","resources":[],"searchText":"mcp/tri-ssot tri-ssot ssot integration for t27: github issues + prs + documentation -> notebooklm tri_issue github issue management: create, update, list, close tri_pr github pr management: create, merge, close, get status tri_docs documentation management: upload to notebooklm, sync, query tri_sync unified sync: sync all entities (issues, prs, docs) with notebooklm tri_search unified search across github issues, prs, notebooklm docs","server":"tri-ssot","serverVersion":"1.0.0","sha256":"3d3cd81102198ca519c418cf734b9bcdddef6601e90393283fdc99bd1ae3e0d5","skills":[],"source":".claude/mcp/tri-ssot/manifest.json","specPath":"specs/tools/mcp/tri-ssot.t27","summary":{"en":"SSOT Integration for t27: GitHub Issues + PRs + Documentation -> NotebookLM","ru":"Интеграция SSOT для t27: GitHub Issues + PR + документация -> NotebookLM."},"tools":[{"about":"GitHub Issue management: create, update, list, close","inputs":["action","title","body","labels","issue_id","state"],"name":"tri_issue"},{"about":"GitHub PR management: create, merge, close, get status","inputs":["action","title","body","pr_id","issue_id"],"name":"tri_pr"},{"about":"Documentation management: upload to NotebookLM, sync, query","inputs":["action","file_path","title"],"name":"tri_docs"},{"about":"Unified sync: sync all entities (issues, prs, docs) with NotebookLM","inputs":["scope"],"name":"tri_sync"},{"about":"Unified search across GitHub Issues, PRs, NotebookLM docs","inputs":["query"],"name":"tri_search"}],"toolsNote":"The manifest names python3 -m contrib.backend.github.mcp_server, but the t27 tree at this commit has no contrib/backend/github/mcp_server.py (git ls-tree); the tool list is taken from the manifest alone (declared, not executed).","transport":"stdio","typecheckOk":true,"witness":"source-parse"},{"aboutSource":"derived from tools/mcp/trinity_mcp/server.zig writeToolsList and .claude/rules/mcp-servers.md","agents":[],"config":".mcp.json","discarded":0,"env":["TRINITY_MCP_PORT"],"external":false,"family":"mcp","fields":{"ABOUT":"Zig MCP server (JSON-RPC over stdio, Content-Length framing) that exposes the tri pipeline, Golden Chain links, swarm, cloud/farm, FPGA, doctor, job, issue, deploy, experience, oracle and needle tools; the static list in writeToolsList plus cell-generated tools loaded at runtime.","ABOUT_SOURCE":"derived from tools/mcp/trinity_mcp/server.zig writeToolsList and .claude/rules/mcp-servers.md","AGENTS":[],"AGENTS_NOTE":"No source binds an agent letter to this server: docs/agents/AGENTS_ALPHABET.md, specs/OWNERS.md and .claude/agents/*.md do not name it.","CONFIG":".mcp.json","ENABLED":true,"ENV":["TRINITY_MCP_PORT"],"EXTERNAL":false,"FAMILY":"mcp","ID":"mcp/trinity","KIND":"tool","LAUNCH":"/data/trinity/zig-out/bin/trinity-mcp","REPO":"gHashTag/trinity","RESOURCES":[],"RESOURCES_ABOUT":[],"SERVER":"trinity","SERVER_VERSION":"","SOURCE":"tools/mcp/trinity_mcp/server.zig","TOOLS":["tri_execute","tri_code","tri_gen","tri_spec_create","tri_decompose","tri_plan","tri_verify","tri_bench","tri_verdict","tri_test","tri_test_run","tri_fix","tri_explain","tri_refactor","tri_doc","tri_reason","tri_status","tri_diff","tri_log","tri_commit","needle_structural_replace","needle_search","needle_quality_gates","needle_preview","needle_batch_edit","needle_graph_build","needle_graph_refactor","needle_graph_extract","needle_graph_visualize","needle_graph_affected","needle_graph_vsa_search","needle_semantic_replace","needle_vsa_index","needle_safe_cross_refactor","needle_vsa_rule_apply","needle_cross_preview","needle_rollback_all","needle_omega_init","needle_omega_analyze","needle_omega_execute","needle_omega_detect","needle_omega_status","needle_safety_gates_run","needle_atomic_refactor","needle_parse_check","needle_compile_check","tri_constants","tri_phi","tri_fib","tri_lucas","tri_spiral","tri_chat","tri_loop_decision","tri_pipeline","tri_omega_awaken","tri_os_boot","tri_tvc_demo","tri_tvc_stats","tri_chem_periodic","tri_chem_element","tri_chem_mass","tri_chem_moles","tri_bio_dna","tri_bio_codon","tri_bio_protein","tri_quantum_constants","tri_quantum_states","tri_bell_states","tri_formula","swarm_status","swarm_agents","swarm_register","swarm_heartbeat","swarm_task_get","swarm_task_add","swarm_task_cancel","swarm_tasks","swarm_pause","swarm_resume","swarm_assign","swarm_github_sync","swarm_github_on_start","swarm_github_on_complete","swarm_github_on_fail","oracle_start","oracle_stop","oracle_status","tri_train_status","tri_train_diagnose","tri_train_loss_curve","tri_train_recommend","tri_train_checkpoint","cloud_spawn","cloud_kill","cloud_list","cloud_status","cloud_logs","cloud_spawn_all","cloud_cleanup","cloud_history","cloud_api_check","cloud_redeploy","cloud_diagnose","cloud_issue_create","cloud_farm","cloud_farm_sync","cloud_farm_capacity","cloud_farm_rebalance","farm_evolve_health","farm_evolve_notify","farm_evolve_watch","cloud_train","cloud_train_batch","chain_cache","chain_baseline","chain_metrics","chain_patterns","chain_tree","chain_check_spec","chain_spec","chain_codegen","chain_analyze","chain_test","chain_bench","chain_fix","chain_bench_ext","chain_bench_theory","chain_delta","chain_optimize","chain_docs","chain_verdict","chain_git","chain_loop","chain_deploy","chain_evolve","chain_self_ref","chain_fpga_test","chain_research","chain_lint_spec","chain_list","cloud_decompose","tri_notify","fpga_uart_scan","fpga_uart_ping","fpga_uart_send","doctor_status","doctor_scan","doctor_report","doctor_plan","doctor_heal","job_start","job_status","job_logs","job_list","job_cancel","job_artifacts","issue_list","issue_view","issue_create","issue_comment","issue_close","issue_assign","issue_decompose","deploy_status","deploy_logs","deploy_vars","deploy_start","deploy_stop","experience_save","experience_recall","experience_mistakes","patent_status","patent_analysis","depin_status","depin_nodes","depin_fitness","research_query","experiment_list","experiment_compare","chimera_run","ouroboros_status","ouroboros_run","self_test","self_health","context_info","context_load","faculty_status","mu_status","mu_patterns","zenodo_status","tri_analyze","tri_clean","tri_fmt","tri_stats","tri_lint","tri_search","tri_metrics","tri_trace","tri_eval","farm_status","farm_idle","farm_recycle","farm_fill","farm_accounts","farm_wave_spawn","fpga_synth","fpga_status","fpga_build","fpga_verify","fpga_flash"],"TOOLS_ABOUT":["Universal executor -- run ANY tri command with automatic needle check","Generate code with typing effect","Compile VIBEE spec to Zig/Verilog","Create new .tri specification template","Break task into sub-tasks (Golden Chain Link 4)","Generate implementation plan (Golden Chain Link 5)","Run tests + benchmarks (Links 7-11)","Run performance benchmarks","Generate toxic verdict (Link 14)","Generate tests for code","Run specific test suite","Detect and fix bugs","Explain code or concept","Suggest refactoring","Generate documentation","Chain-of-thought reasoning","Git status --short","Git diff","Git log --oneline","Git add -A && commit","AST-aware code edit with Tier 0->1 fallback","Search codebase for pattern matches","Run quality gates: parse check, AST analysis","Preview edit diff without applying","Apply multiple edits in one operation","Build complete call graph with VSA embeddings for project","Rename symbol across entire project with semantic awareness","Extract function/method from code block","Generate graph visualization (DOT/JSON) with VSA clustering","Find all files affected by symbol change (with semantic impact)","Search for semantically similar symbols by code or intent","Replace code by semantic meaning (not just pattern)","Build semantic VSA index for codebase","Safe cross-file semantic refactor with VSA rules and 100% rollback","Apply VSA rules to validate proposed refactor","Preview cross-file refactor impact with safety assessment","Rollback all changes from failed refactor","Initialize Omega autonomous agent for project","Omega analyzes codebase and suggests improvements","Execute refactor plan with full autonomy","Auto-detect code improvements and optimizations","Get Omega agent status and health","Run all safety gates on a file (Phase 1: parse/compile/test)","Apply atomic refactor with 100% rollback guarantee (Phase 1)","Parse check using Zig AST parser (Phase 1)","Compile check using zig build (Phase 1)","Show sacred constants (phi, pi, e, mu, chi, sigma, epsilon...)","Compute phi^n (golden ratio power)","Fibonacci with BigInt","Lucas L(n) -- L(2)=3=TRINITY","phi-spiral coordinates","Interactive chat (vision + voice + tools)","Loop decision: CONTINUE/EXIT (Link 17)","Execute 26-link Golden Chain pipeline","Awaken Omega autonomous agent","Temporal Trinity OS boot","Run TVC chat demo","Show TVC corpus statistics","List periodic table elements by category","Look up element by symbol or atomic number","Calculate molar mass of chemical formula","Calculate moles, molecules, atoms from mass","Analyze DNA sequence (GC content, composition)","Look up RNA codon to amino acid","Analyze protein sequence (mass, composition)","Show quantum physics constants (h, hbar, alpha)","Show quantum basis states and phi-state","Show four Bell entangled states","Evaluate V = n * 3^k * pi^m * phi^p * e^q","Get Ralph Agent Swarm status summary (agents, tasks, counts)","List all registered swarm agents with status","Register a new agent in the swarm","Agent heartbeat with status, branch, task_id, commit_sha (circuit breaker)","Get next pending task for an agent (priority-ordered)","Add a new task to the swarm queue","Cancel and remove a task from the queue","List all tasks in the swarm queue","Pause all swarm agents (finish current tasks, no new assignments)","Resume all paused swarm agents","Create and assign a task to a specific agent","Convert GitHub issue to swarm task. Returns labels/actions for Go proxy.","Notify that agent started a GitHub-sourced task. Returns label swaps + comment.","Notify GitHub task completed. Returns labels, comment, close_issue.","Notify GitHub task failed. Returns labels + error comment.","Start Oracle Telegram watchdog thread (sends swarm status every N minutes)","Stop Oracle Telegram watchdog thread","Get Oracle watchdog status (running/stopped, messages sent, errors)","Get HSLM training status -- checkpoints, loss, anomalies, recommendation","Diagnose HSLM training anomalies (zero loss, phase transition, overfitting)","Get HSLM loss curve from checkpoint headers","Get phi-aware recommendation for next training action","List HSLM checkpoints with step, loss, PPL, size","Spawn a cloud agent container for a GitHub issue","Kill a cloud agent container","List all active cloud agent containers","Get cloud infrastructure status","Get cloud agent deployment logs","Spawn agents for all issues labeled agent:spawn","Remove inactive cloud agent entries","Get event history for a cloud agent","Test API key connectivity and model routing -- detects proxy returning wrong model","Reuse existing Railway service for a new issue number","Diagnose why an agent failed -- shows GitHub comments, JSONL events, PR status","Create a GitHub issue with agent:spawn label for auto-spawning","Railway multi-account farm dashboard -- shows all accounts with capacity and daily limits","Sync active service counts across all Railway accounts","Get farm capacity as JSON -- total slots, active services, daily remaining per account","Migrate services from overloaded to underloaded Railway accounts","Farm evolution health dashboard -- leaderboard, health_score 0-100, stagnation, ETA","Farm insight scan -- detect leader changes, plateaus, spikes, wave completion. Sends to Telegram unless dry-run","Single evolution sweep -- inject sacred children into free slots, auto-notify. Always --once","Spawn an HSLM training experiment on Railway farm","Spawn all 13 HSLM training experiments across Railway farm","Chain Link 0: TVC Gate -- search corpus, return cached or continue","Chain Link 1: Analyze previous version v(n-1)","Chain Link 2: Collect performance metrics","Chain Link 3: Research patterns and science (PAS)","Chain Link 4: Build technology dependency tree","Chain Link 5: VIBEE-first compliance check","Chain Link 6: Create .tri specifications","Chain Link 7: Generate Zig code from .tri specs","Chain Link 8: Sacred Intelligence code analysis","Chain Link 9: Run zig build test suite","Chain Link 10: CRITICAL -- Compare to baseline v(n-1)","Chain Link 11: SWE Agent error fixing","Chain Link 12: Compare to external tools (llama.cpp/vLLM)","Chain Link 13: Gap to theoretical maximum","Chain Link 14: Generate improvement delta report","Chain Link 15: Optimize if needed (optional)","Chain Link 16: Generate documentation with proofs","Chain Link 17: Critical self-assessment (toxic verdict)","Chain Link 18: Commit and push changes","Chain Link 19: Decide next iteration (continue/exit)","Chain Link 20: Auto-deploy to cloud","Chain Link 21: Pipeline analyzes itself (eternal self-evolution)","Chain Link 22: Pipeline improves itself (circular bootstrapping)","Chain Link 23: Camera-based LED verification for FPGA","Chain Link 24: Research-assisted error fixing via Perplexity","Chain Link 25: Validate .tri spec syntax before codegen","List all 26 Golden Chain links with roles and status","Decompose a GitHub issue into 5 role-based sub-issues (planner/coder/reviewer/tester/integrator)","Send/edit/pin Telegram messages via tri CLI","Scan for USB-UART serial devices (CH340/FTDI) connected to FPGA","PING/PONG test -- send 0x03, expect 0x83 from FPGA","Send raw hex bytes to FPGA via UART and print response","Get doctor health status -- one-line summary","Scan and classify all .zig files","Health score dashboard with emoji grades","Create migration queue for manual files","Regenerate manual files through pipeline","Start a background job","Get job status by ID","Get job logs by ID","List all background jobs","Cancel a running job","Get job artifacts by ID","List open GitHub issues","View a specific GitHub issue","Create a new GitHub issue","Add a comment to a GitHub issue","Close a GitHub issue","Assign a user to a GitHub issue","Decompose a GitHub issue into sub-tasks","Get deployment status","Get deployment logs","Get deployment environment variables","Start deployment","Stop deployment","Save an experience entry (key-value learning)","Recall an experience entry by key","List all recorded mistakes/anti-patterns","Get patent portfolio status","Get patent analysis and claims","Get DePIN node protocol status","List DePIN network nodes","Get DePIN node fitness scores","Research a topic via Perplexity-assisted search","List all HSLM training experiments","Compare two experiments","Run a chimera fused command (farm-cycle, train-cycle, etc.)","Get ouroboros self-evolution status and score","Run ouroboros self-evolution cycle","Run self-test suite","Get self-health check results","Get current context info (tokens, files, window)","Load additional context from a file path","Get Faculty Board status dashboard","Get MU agent status","List MU learned patterns","Get Zenodo publication status","Analyze codebase quality and metrics","Clean build artifacts and temp files","Format all Zig source files","Show project statistics (LOC, files, tests)","Run linter on source code","Search codebase for a query string","Get project metrics dashboard","Get execution trace","Evaluate expression or code snippet","Get training farm status overview","List idle farm workers","Recycle underperforming farm workers","Fill empty farm slots with new experiments","List all 8 Railway farm accounts and their service counts","Spawn a wave of training workers on a specific account","Run FPGA synthesis pipeline","Get FPGA hardware and synthesis status","Build FPGA bitstream","Verify FPGA bitstream against RTL","Flash bitstream to FPGA board"],"TOOLS_INPUTS":["command,args,auto_needle","prompt","spec","name","task","task","","suite","","file","pattern","file","target","file","file","prompt","","","count","message","file_path,pattern_query,replacement,safety_level,edit_mode","query,file_path,confidence_threshold","file_path,check_level","file_path,pattern_query,replacement","edits","root_dir,enable_vsa","symbol,new_name,semantic_aware,similarity_threshold,scope,preview","file,start_line,end_line,function_name","format,focus,show_vsa","symbol,include_transitive,semantic_impact","query,top_k,min_similarity","intent,replacement_intent,file,preview","root_dir,embedding_dim","intent,new_intent,semantic_threshold,preview","transformation,rules_file","symbol,new_name,include_vsa","refactor_id","root_dir,autonomy_level","intent,auto_detect","plan_id,confirm","min_confidence,max_results","","file_path,gates","file_path,pattern_query,replacement,safety_gates","file_path","project_root","","n","n","n","n","message,stream","mode","task","mode","","","","category","element","formula","formula,mass","sequence","codon","sequence","","","","n,k,m,p,q","","","agent_id,hostname","agent_id,status,branch,task_id,commit_sha","agent_id","id,slug,description,priority","task_id","","","","agent_id,description","issue_number,title,labels","task_id,agent_id,branch","task_id,agent_id,result","task_id,agent_id,error","telegram_token,chat_id,interval_ms","","","","dir","dir","dir","dir","issue_number","issue_number","","","","","","issue_number","","service_id,issue_number","issue_number","title","","","","","","dry_run","sacred,dry_run","name","","task","task","task","task","task","task","task","task","task","task","task","task","task","task","task","task","task","task","task","task","task","task","task","task","task","task","","issue_number,template","text,chat_id,pin,edit_id","","device","device,hex_bytes","","","","","","command","id","id","","id","id","","number","title,body","number,body","number","number,user","number","","","","","","key,value","key","","","","","","","query","","a,b","name","","","","","","path","","","","","","","","","","query","","","","","","","","","account,count","","","","","bitstream"],"TOOLS_NOTE":"Static list parsed from writeToolsList (210 entries; 32 entries have an unbalanced trailing brace in the source literal and were parsed after adding or removing one). Cell-generated tools from data/cells/mcp_tools.json are appended at runtime and are not listed here. .trinity/mcp_schemas.json lists a different, shorter set (29 names) and is not used as the source.","TRANSPORT":"stdio","WITNESS":"source-parse"},"health":"ok","id":"mcp/trinity","inSpecCorpus":false,"launch":"/data/trinity/zig-out/bin/trinity-mcp","links":{"config":"https://github.com/gHashTag/trinity/blob/da84d38795aa97f9170bb670f04a328032aa6ffe/.mcp.json","pinnedAt":"da84d38795aa97f9170bb670f04a328032aa6ffe","source":"https://github.com/gHashTag/trinity/blob/da84d38795aa97f9170bb670f04a328032aa6ffe/tools/mcp/trinity_mcp/server.zig"},"messages":["no agent letter bound by a source"],"moduleName":"tool_mcp_trinity","name":{"en":"trinity"},"repo":"gHashTag/trinity","resources":[],"searchText":"mcp/trinity trinity zig mcp server (json-rpc over stdio, content-length framing) that exposes the tri pipeline, golden chain links, swarm, cloud/farm, fpga, doctor, job, issue, deploy, experience, oracle and needle tools; the static list in writetoolslist plus cell-generated tools loaded at runtime. tri_execute universal executor -- run any tri command with automatic needle check tri_code generate code with typing effect tri_gen compile vibee spec to zig/verilog tri_spec_create create new .tri specification template tri_decompose break task into sub-tasks (golden chain link 4) tri_plan generate implementation plan (golden chain link 5) tri_verify run tests + benchmarks (links 7-11) tri_bench run performance benchmarks tri_verdict generate toxic verdict (link 14) tri_test generate tests for code tri_test_run run specific test suite tri_fix detect and fix bugs tri_explain explain code or concept tri_refactor suggest refactoring tri_doc generate documentation tri_reason chain-of-thought reasoning tri_status git status --short tri_diff git diff tri_log git log --oneline tri_commit git add -a && commit needle_structural_replace ast-aware code edit with tier 0->1 fallback needle_search search codebase for pattern matches needle_quality_gates run quality gates: parse check, ast analysis needle_preview preview edit diff without applying needle_batch_edit apply multiple edits in one operation needle_graph_build build complete call graph with vsa embeddings for project needle_graph_refactor rename symbol across entire project with semantic awareness needle_graph_extract extract function/method from code block needle_graph_visualize generate graph visualization (dot/json) with vsa clustering needle_graph_affected find all files affected by symbol change (with semantic impact) needle_graph_vsa_search search for semantically similar symbols by code or intent needle_semantic_replace replace code by semantic meaning (not just pattern) needle_vsa_index build semantic vsa index for codebase needle_safe_cross_refactor safe cross-file semantic refactor with vsa rules and 100% rollback needle_vsa_rule_apply apply vsa rules to validate proposed refactor needle_cross_preview preview cross-file refactor impact with safety assessment needle_rollback_all rollback all changes from failed refactor needle_omega_init initialize omega autonomous agent for project needle_omega_analyze omega analyzes codebase and suggests improvements needle_omega_execute execute refactor plan with full autonomy needle_omega_detect auto-detect code improvements and optimizations needle_omega_status get omega agent status and health needle_safety_gates_run run all safety gates on a file (phase 1: parse/compile/test) needle_atomic_refactor apply atomic refactor with 100% rollback guarantee (phase 1) needle_parse_check parse check using zig ast parser (phase 1) needle_compile_check compile check using zig build (phase 1) tri_constants show sacred constants (phi, pi, e, mu, chi, sigma, epsilon...) tri_phi compute phi^n (golden ratio power) tri_fib fibonacci with bigint tri_lucas lucas l(n) -- l(2)=3=trinity tri_spiral phi-spiral coordinates tri_chat interactive chat (vision + voice + tools) tri_loop_decision loop decision: continue/exit (link 17) tri_pipeline execute 26-link golden chain pipeline tri_omega_awaken awaken omega autonomous agent tri_os_boot temporal trinity os boot tri_tvc_demo run tvc chat demo tri_tvc_stats show tvc corpus statistics tri_chem_periodic list periodic table elements by category tri_chem_element look up element by symbol or atomic number tri_chem_mass calculate molar mass of chemical formula tri_chem_moles calculate moles, molecules, atoms from mass tri_bio_dna analyze dna sequence (gc content, composition) tri_bio_codon look up rna codon to amino acid tri_bio_protein analyze protein sequence (mass, composition) tri_quantum_constants show quantum physics constants (h, hbar, alpha) tri_quantum_states show quantum basis states and phi-state tri_bell_states show four bell entangled states tri_formula evaluate v = n * 3^k * pi^m * phi^p * e^q swarm_status get ralph agent swarm status summary (agents, tasks, counts) swarm_agents list all registered swarm agents with status swarm_register register a new agent in the swarm swarm_heartbeat agent heartbeat with status, branch, task_id, commit_sha (circuit breaker) swarm_task_get get next pending task for an agent (priority-ordered) swarm_task_add add a new task to the swarm queue swarm_task_cancel cancel and remove a task from the queue swarm_tasks list all tasks in the swarm queue swarm_pause pause all swarm agents (finish current tasks, no new assignments) swarm_resume resume all paused swarm agents swarm_assign create and assign a task to a specific agent swarm_github_sync convert github issue to swarm task. returns labels/actions for go proxy. swarm_github_on_start notify that agent started a github-sourced task. returns label swaps + comment. swarm_github_on_complete notify github task completed. returns labels, comment, close_issue. swarm_github_on_fail notify github task failed. returns labels + error comment. oracle_start start oracle telegram watchdog thread (sends swarm status every n minutes) oracle_stop stop oracle telegram watchdog thread oracle_status get oracle watchdog status (running/stopped, messages sent, errors) tri_train_status get hslm training status -- checkpoints, loss, anomalies, recommendation tri_train_diagnose diagnose hslm training anomalies (zero loss, phase transition, overfitting) tri_train_loss_curve get hslm loss curve from checkpoint headers tri_train_recommend get phi-aware recommendation for next training action tri_train_checkpoint list hslm checkpoints with step, loss, ppl, size cloud_spawn spawn a cloud agent container for a github issue cloud_kill kill a cloud agent container cloud_list list all active cloud agent containers cloud_status get cloud infrastructure status cloud_logs get cloud agent deployment logs cloud_spawn_all spawn agents for all issues labeled agent:spawn cloud_cleanup remove inactive cloud agent entries cloud_history get event history for a cloud agent cloud_api_check test api key connectivity and model routing -- detects proxy returning wrong model cloud_redeploy reuse existing railway service for a new issue number cloud_diagnose diagnose why an agent failed -- shows github comments, jsonl events, pr status cloud_issue_create create a github issue with agent:spawn label for auto-spawning cloud_farm railway multi-account farm dashboard -- shows all accounts with capacity and daily limits cloud_farm_sync sync active service counts across all railway accounts cloud_farm_capacity get farm capacity as json -- total slots, active services, daily remaining per account cloud_farm_rebalance migrate services from overloaded to underloaded railway accounts farm_evolve_health farm evolution health dashboard -- leaderboard, health_score 0-100, stagnation, eta farm_evolve_notify farm insight scan -- detect leader changes, plateaus, spikes, wave completion. sends to telegram unless dry-run farm_evolve_watch single evolution sweep -- inject sacred children into free slots, auto-notify. always --once cloud_train spawn an hslm training experiment on railway farm cloud_train_batch spawn all 13 hslm training experiments across railway farm chain_cache chain link 0: tvc gate -- search corpus, return cached or continue chain_baseline chain link 1: analyze previous version v(n-1) chain_metrics chain link 2: collect performance metrics chain_patterns chain link 3: research patterns and science (pas) chain_tree chain link 4: build technology dependency tree chain_check_spec chain link 5: vibee-first compliance check chain_spec chain link 6: create .tri specifications chain_codegen chain link 7: generate zig code from .tri specs chain_analyze chain link 8: sacred intelligence code analysis chain_test chain link 9: run zig build test suite chain_bench chain link 10: critical -- compare to baseline v(n-1) chain_fix chain link 11: swe agent error fixing chain_bench_ext chain link 12: compare to external tools (llama.cpp/vllm) chain_bench_theory chain link 13: gap to theoretical maximum chain_delta chain link 14: generate improvement delta report chain_optimize chain link 15: optimize if needed (optional) chain_docs chain link 16: generate documentation with proofs chain_verdict chain link 17: critical self-assessment (toxic verdict) chain_git chain link 18: commit and push changes chain_loop chain link 19: decide next iteration (continue/exit) chain_deploy chain link 20: auto-deploy to cloud chain_evolve chain link 21: pipeline analyzes itself (eternal self-evolution) chain_self_ref chain link 22: pipeline improves itself (circular bootstrapping) chain_fpga_test chain link 23: camera-based led verification for fpga chain_research chain link 24: research-assisted error fixing via perplexity chain_lint_spec chain link 25: validate .tri spec syntax before codegen chain_list list all 26 golden chain links with roles and status cloud_decompose decompose a github issue into 5 role-based sub-issues (planner/coder/reviewer/tester/integrator) tri_notify send/edit/pin telegram messages via tri cli fpga_uart_scan scan for usb-uart serial devices (ch340/ftdi) connected to fpga fpga_uart_ping ping/pong test -- send 0x03, expect 0x83 from fpga fpga_uart_send send raw hex bytes to fpga via uart and print response doctor_status get doctor health status -- one-line summary doctor_scan scan and classify all .zig files doctor_report health score dashboard with emoji grades doctor_plan create migration queue for manual files doctor_heal regenerate manual files through pipeline job_start start a background job job_status get job status by id job_logs get job logs by id job_list list all background jobs job_cancel cancel a running job job_artifacts get job artifacts by id issue_list list open github issues issue_view view a specific github issue issue_create create a new github issue issue_comment add a comment to a github issue issue_close close a github issue issue_assign assign a user to a github issue issue_decompose decompose a github issue into sub-tasks deploy_status get deployment status deploy_logs get deployment logs deploy_vars get deployment environment variables deploy_start start deployment deploy_stop stop deployment experience_save save an experience entry (key-value learning) experience_recall recall an experience entry by key experience_mistakes list all recorded mistakes/anti-patterns patent_status get patent portfolio status patent_analysis get patent analysis and claims depin_status get depin node protocol status depin_nodes list depin network nodes depin_fitness get depin node fitness scores research_query research a topic via perplexity-assisted search experiment_list list all hslm training experiments experiment_compare compare two experiments chimera_run run a chimera fused command (farm-cycle, train-cycle, etc.) ouroboros_status get ouroboros self-evolution status and score ouroboros_run run ouroboros self-evolution cycle self_test run self-test suite self_health get self-health check results context_info get current context info (tokens, files, window) context_load load additional context from a file path faculty_status get faculty board status dashboard mu_status get mu agent status mu_patterns list mu learned patterns zenodo_status get zenodo publication status tri_analyze analyze codebase quality and metrics tri_clean clean build artifacts and temp files tri_fmt format all zig source files tri_stats show project statistics (loc, files, tests) tri_lint run linter on source code tri_search search codebase for a query string tri_metrics get project metrics dashboard tri_trace get execution trace tri_eval evaluate expression or code snippet farm_status get training farm status overview farm_idle list idle farm workers farm_recycle recycle underperforming farm workers farm_fill fill empty farm slots with new experiments farm_accounts list all 8 railway farm accounts and their service counts farm_wave_spawn spawn a wave of training workers on a specific account fpga_synth run fpga synthesis pipeline fpga_status get fpga hardware and synthesis status fpga_build build fpga bitstream fpga_verify verify fpga bitstream against rtl fpga_flash flash bitstream to fpga board","server":"trinity","serverVersion":"","sha256":"89b3ad93549016b1bd9261868fadb992cbd09a1790f54113b906a1a633aa8508","skills":[],"source":"tools/mcp/trinity_mcp/server.zig","specPath":"specs/tools/mcp/trinity.t27","summary":{"en":"Zig MCP server (JSON-RPC over stdio, Content-Length framing) that exposes the tri pipeline, Golden Chain links, swarm, cloud/farm, FPGA, doctor, job, issue, deploy, experience, oracle and needle tools; the static list in writeToolsList plus cell-generated tools loaded at runtime.","ru":"MCP-сервер на Zig (JSON-RPC по stdio, кадрирование Content-Length), открывающий инструменты конвейера tri, звеньев Golden Chain, роя, облака/фермы, FPGA, doctor, job, issue, deploy, experience, oracle и needle; статический список writeToolsList плюс инструменты ячеек, подгружаемые во время выполнения."},"tools":[{"about":"Universal executor -- run ANY tri command with automatic needle check","inputs":["command","args","auto_needle"],"name":"tri_execute"},{"about":"Generate code with typing effect","inputs":["prompt"],"name":"tri_code"},{"about":"Compile VIBEE spec to Zig/Verilog","inputs":["spec"],"name":"tri_gen"},{"about":"Create new .tri specification template","inputs":["name"],"name":"tri_spec_create"},{"about":"Break task into sub-tasks (Golden Chain Link 4)","inputs":["task"],"name":"tri_decompose"},{"about":"Generate implementation plan (Golden Chain Link 5)","inputs":["task"],"name":"tri_plan"},{"about":"Run tests + benchmarks (Links 7-11)","inputs":[],"name":"tri_verify"},{"about":"Run performance benchmarks","inputs":["suite"],"name":"tri_bench"},{"about":"Generate toxic verdict (Link 14)","inputs":[],"name":"tri_verdict"},{"about":"Generate tests for code","inputs":["file"],"name":"tri_test"},{"about":"Run specific test suite","inputs":["pattern"],"name":"tri_test_run"},{"about":"Detect and fix bugs","inputs":["file"],"name":"tri_fix"},{"about":"Explain code or concept","inputs":["target"],"name":"tri_explain"},{"about":"Suggest refactoring","inputs":["file"],"name":"tri_refactor"},{"about":"Generate documentation","inputs":["file"],"name":"tri_doc"},{"about":"Chain-of-thought reasoning","inputs":["prompt"],"name":"tri_reason"},{"about":"Git status --short","inputs":[],"name":"tri_status"},{"about":"Git diff","inputs":[],"name":"tri_diff"},{"about":"Git log --oneline","inputs":["count"],"name":"tri_log"},{"about":"Git add -A && commit","inputs":["message"],"name":"tri_commit"},{"about":"AST-aware code edit with Tier 0->1 fallback","inputs":["file_path","pattern_query","replacement","safety_level","edit_mode"],"name":"needle_structural_replace"},{"about":"Search codebase for pattern matches","inputs":["query","file_path","confidence_threshold"],"name":"needle_search"},{"about":"Run quality gates: parse check, AST analysis","inputs":["file_path","check_level"],"name":"needle_quality_gates"},{"about":"Preview edit diff without applying","inputs":["file_path","pattern_query","replacement"],"name":"needle_preview"},{"about":"Apply multiple edits in one operation","inputs":["edits"],"name":"needle_batch_edit"},{"about":"Build complete call graph with VSA embeddings for project","inputs":["root_dir","enable_vsa"],"name":"needle_graph_build"},{"about":"Rename symbol across entire project with semantic awareness","inputs":["symbol","new_name","semantic_aware","similarity_threshold","scope","preview"],"name":"needle_graph_refactor"},{"about":"Extract function/method from code block","inputs":["file","start_line","end_line","function_name"],"name":"needle_graph_extract"},{"about":"Generate graph visualization (DOT/JSON) with VSA clustering","inputs":["format","focus","show_vsa"],"name":"needle_graph_visualize"},{"about":"Find all files affected by symbol change (with semantic impact)","inputs":["symbol","include_transitive","semantic_impact"],"name":"needle_graph_affected"},{"about":"Search for semantically similar symbols by code or intent","inputs":["query","top_k","min_similarity"],"name":"needle_graph_vsa_search"},{"about":"Replace code by semantic meaning (not just pattern)","inputs":["intent","replacement_intent","file","preview"],"name":"needle_semantic_replace"},{"about":"Build semantic VSA index for codebase","inputs":["root_dir","embedding_dim"],"name":"needle_vsa_index"},{"about":"Safe cross-file semantic refactor with VSA rules and 100% rollback","inputs":["intent","new_intent","semantic_threshold","preview"],"name":"needle_safe_cross_refactor"},{"about":"Apply VSA rules to validate proposed refactor","inputs":["transformation","rules_file"],"name":"needle_vsa_rule_apply"},{"about":"Preview cross-file refactor impact with safety assessment","inputs":["symbol","new_name","include_vsa"],"name":"needle_cross_preview"},{"about":"Rollback all changes from failed refactor","inputs":["refactor_id"],"name":"needle_rollback_all"},{"about":"Initialize Omega autonomous agent for project","inputs":["root_dir","autonomy_level"],"name":"needle_omega_init"},{"about":"Omega analyzes codebase and suggests improvements","inputs":["intent","auto_detect"],"name":"needle_omega_analyze"},{"about":"Execute refactor plan with full autonomy","inputs":["plan_id","confirm"],"name":"needle_omega_execute"},{"about":"Auto-detect code improvements and optimizations","inputs":["min_confidence","max_results"],"name":"needle_omega_detect"},{"about":"Get Omega agent status and health","inputs":[],"name":"needle_omega_status"},{"about":"Run all safety gates on a file (Phase 1: parse/compile/test)","inputs":["file_path","gates"],"name":"needle_safety_gates_run"},{"about":"Apply atomic refactor with 100% rollback guarantee (Phase 1)","inputs":["file_path","pattern_query","replacement","safety_gates"],"name":"needle_atomic_refactor"},{"about":"Parse check using Zig AST parser (Phase 1)","inputs":["file_path"],"name":"needle_parse_check"},{"about":"Compile check using zig build (Phase 1)","inputs":["project_root"],"name":"needle_compile_check"},{"about":"Show sacred constants (phi, pi, e, mu, chi, sigma, epsilon...)","inputs":[],"name":"tri_constants"},{"about":"Compute phi^n (golden ratio power)","inputs":["n"],"name":"tri_phi"},{"about":"Fibonacci with BigInt","inputs":["n"],"name":"tri_fib"},{"about":"Lucas L(n) -- L(2)=3=TRINITY","inputs":["n"],"name":"tri_lucas"},{"about":"phi-spiral coordinates","inputs":["n"],"name":"tri_spiral"},{"about":"Interactive chat (vision + voice + tools)","inputs":["message","stream"],"name":"tri_chat"},{"about":"Loop decision: CONTINUE/EXIT (Link 17)","inputs":["mode"],"name":"tri_loop_decision"},{"about":"Execute 26-link Golden Chain pipeline","inputs":["task"],"name":"tri_pipeline"},{"about":"Awaken Omega autonomous agent","inputs":["mode"],"name":"tri_omega_awaken"},{"about":"Temporal Trinity OS boot","inputs":[],"name":"tri_os_boot"},{"about":"Run TVC chat demo","inputs":[],"name":"tri_tvc_demo"},{"about":"Show TVC corpus statistics","inputs":[],"name":"tri_tvc_stats"},{"about":"List periodic table elements by category","inputs":["category"],"name":"tri_chem_periodic"},{"about":"Look up element by symbol or atomic number","inputs":["element"],"name":"tri_chem_element"},{"about":"Calculate molar mass of chemical formula","inputs":["formula"],"name":"tri_chem_mass"},{"about":"Calculate moles, molecules, atoms from mass","inputs":["formula","mass"],"name":"tri_chem_moles"},{"about":"Analyze DNA sequence (GC content, composition)","inputs":["sequence"],"name":"tri_bio_dna"},{"about":"Look up RNA codon to amino acid","inputs":["codon"],"name":"tri_bio_codon"},{"about":"Analyze protein sequence (mass, composition)","inputs":["sequence"],"name":"tri_bio_protein"},{"about":"Show quantum physics constants (h, hbar, alpha)","inputs":[],"name":"tri_quantum_constants"},{"about":"Show quantum basis states and phi-state","inputs":[],"name":"tri_quantum_states"},{"about":"Show four Bell entangled states","inputs":[],"name":"tri_bell_states"},{"about":"Evaluate V = n * 3^k * pi^m * phi^p * e^q","inputs":["n","k","m","p","q"],"name":"tri_formula"},{"about":"Get Ralph Agent Swarm status summary (agents, tasks, counts)","inputs":[],"name":"swarm_status"},{"about":"List all registered swarm agents with status","inputs":[],"name":"swarm_agents"},{"about":"Register a new agent in the swarm","inputs":["agent_id","hostname"],"name":"swarm_register"},{"about":"Agent heartbeat with status, branch, task_id, commit_sha (circuit breaker)","inputs":["agent_id","status","branch","task_id","commit_sha"],"name":"swarm_heartbeat"},{"about":"Get next pending task for an agent (priority-ordered)","inputs":["agent_id"],"name":"swarm_task_get"},{"about":"Add a new task to the swarm queue","inputs":["id","slug","description","priority"],"name":"swarm_task_add"},{"about":"Cancel and remove a task from the queue","inputs":["task_id"],"name":"swarm_task_cancel"},{"about":"List all tasks in the swarm queue","inputs":[],"name":"swarm_tasks"},{"about":"Pause all swarm agents (finish current tasks, no new assignments)","inputs":[],"name":"swarm_pause"},{"about":"Resume all paused swarm agents","inputs":[],"name":"swarm_resume"},{"about":"Create and assign a task to a specific agent","inputs":["agent_id","description"],"name":"swarm_assign"},{"about":"Convert GitHub issue to swarm task. Returns labels/actions for Go proxy.","inputs":["issue_number","title","labels"],"name":"swarm_github_sync"},{"about":"Notify that agent started a GitHub-sourced task. Returns label swaps + comment.","inputs":["task_id","agent_id","branch"],"name":"swarm_github_on_start"},{"about":"Notify GitHub task completed. Returns labels, comment, close_issue.","inputs":["task_id","agent_id","result"],"name":"swarm_github_on_complete"},{"about":"Notify GitHub task failed. Returns labels + error comment.","inputs":["task_id","agent_id","error"],"name":"swarm_github_on_fail"},{"about":"Start Oracle Telegram watchdog thread (sends swarm status every N minutes)","inputs":["telegram_token","chat_id","interval_ms"],"name":"oracle_start"},{"about":"Stop Oracle Telegram watchdog thread","inputs":[],"name":"oracle_stop"},{"about":"Get Oracle watchdog status (running/stopped, messages sent, errors)","inputs":[],"name":"oracle_status"},{"about":"Get HSLM training status -- checkpoints, loss, anomalies, recommendation","inputs":[],"name":"tri_train_status"},{"about":"Diagnose HSLM training anomalies (zero loss, phase transition, overfitting)","inputs":["dir"],"name":"tri_train_diagnose"},{"about":"Get HSLM loss curve from checkpoint headers","inputs":["dir"],"name":"tri_train_loss_curve"},{"about":"Get phi-aware recommendation for next training action","inputs":["dir"],"name":"tri_train_recommend"},{"about":"List HSLM checkpoints with step, loss, PPL, size","inputs":["dir"],"name":"tri_train_checkpoint"},{"about":"Spawn a cloud agent container for a GitHub issue","inputs":["issue_number"],"name":"cloud_spawn"},{"about":"Kill a cloud agent container","inputs":["issue_number"],"name":"cloud_kill"},{"about":"List all active cloud agent containers","inputs":[],"name":"cloud_list"},{"about":"Get cloud infrastructure status","inputs":[],"name":"cloud_status"},{"about":"Get cloud agent deployment logs","inputs":[],"name":"cloud_logs"},{"about":"Spawn agents for all issues labeled agent:spawn","inputs":[],"name":"cloud_spawn_all"},{"about":"Remove inactive cloud agent entries","inputs":[],"name":"cloud_cleanup"},{"about":"Get event history for a cloud agent","inputs":["issue_number"],"name":"cloud_history"},{"about":"Test API key connectivity and model routing -- detects proxy returning wrong model","inputs":[],"name":"cloud_api_check"},{"about":"Reuse existing Railway service for a new issue number","inputs":["service_id","issue_number"],"name":"cloud_redeploy"},{"about":"Diagnose why an agent failed -- shows GitHub comments, JSONL events, PR status","inputs":["issue_number"],"name":"cloud_diagnose"},{"about":"Create a GitHub issue with agent:spawn label for auto-spawning","inputs":["title"],"name":"cloud_issue_create"},{"about":"Railway multi-account farm dashboard -- shows all accounts with capacity and daily limits","inputs":[],"name":"cloud_farm"},{"about":"Sync active service counts across all Railway accounts","inputs":[],"name":"cloud_farm_sync"},{"about":"Get farm capacity as JSON -- total slots, active services, daily remaining per account","inputs":[],"name":"cloud_farm_capacity"},{"about":"Migrate services from overloaded to underloaded Railway accounts","inputs":[],"name":"cloud_farm_rebalance"},{"about":"Farm evolution health dashboard -- leaderboard, health_score 0-100, stagnation, ETA","inputs":[],"name":"farm_evolve_health"},{"about":"Farm insight scan -- detect leader changes, plateaus, spikes, wave completion. Sends to Telegram unless dry-run","inputs":["dry_run"],"name":"farm_evolve_notify"},{"about":"Single evolution sweep -- inject sacred children into free slots, auto-notify. Always --once","inputs":["sacred","dry_run"],"name":"farm_evolve_watch"},{"about":"Spawn an HSLM training experiment on Railway farm","inputs":["name"],"name":"cloud_train"},{"about":"Spawn all 13 HSLM training experiments across Railway farm","inputs":[],"name":"cloud_train_batch"},{"about":"Chain Link 0: TVC Gate -- search corpus, return cached or continue","inputs":["task"],"name":"chain_cache"},{"about":"Chain Link 1: Analyze previous version v(n-1)","inputs":["task"],"name":"chain_baseline"},{"about":"Chain Link 2: Collect performance metrics","inputs":["task"],"name":"chain_metrics"},{"about":"Chain Link 3: Research patterns and science (PAS)","inputs":["task"],"name":"chain_patterns"},{"about":"Chain Link 4: Build technology dependency tree","inputs":["task"],"name":"chain_tree"},{"about":"Chain Link 5: VIBEE-first compliance check","inputs":["task"],"name":"chain_check_spec"},{"about":"Chain Link 6: Create .tri specifications","inputs":["task"],"name":"chain_spec"},{"about":"Chain Link 7: Generate Zig code from .tri specs","inputs":["task"],"name":"chain_codegen"},{"about":"Chain Link 8: Sacred Intelligence code analysis","inputs":["task"],"name":"chain_analyze"},{"about":"Chain Link 9: Run zig build test suite","inputs":["task"],"name":"chain_test"},{"about":"Chain Link 10: CRITICAL -- Compare to baseline v(n-1)","inputs":["task"],"name":"chain_bench"},{"about":"Chain Link 11: SWE Agent error fixing","inputs":["task"],"name":"chain_fix"},{"about":"Chain Link 12: Compare to external tools (llama.cpp/vLLM)","inputs":["task"],"name":"chain_bench_ext"},{"about":"Chain Link 13: Gap to theoretical maximum","inputs":["task"],"name":"chain_bench_theory"},{"about":"Chain Link 14: Generate improvement delta report","inputs":["task"],"name":"chain_delta"},{"about":"Chain Link 15: Optimize if needed (optional)","inputs":["task"],"name":"chain_optimize"},{"about":"Chain Link 16: Generate documentation with proofs","inputs":["task"],"name":"chain_docs"},{"about":"Chain Link 17: Critical self-assessment (toxic verdict)","inputs":["task"],"name":"chain_verdict"},{"about":"Chain Link 18: Commit and push changes","inputs":["task"],"name":"chain_git"},{"about":"Chain Link 19: Decide next iteration (continue/exit)","inputs":["task"],"name":"chain_loop"},{"about":"Chain Link 20: Auto-deploy to cloud","inputs":["task"],"name":"chain_deploy"},{"about":"Chain Link 21: Pipeline analyzes itself (eternal self-evolution)","inputs":["task"],"name":"chain_evolve"},{"about":"Chain Link 22: Pipeline improves itself (circular bootstrapping)","inputs":["task"],"name":"chain_self_ref"},{"about":"Chain Link 23: Camera-based LED verification for FPGA","inputs":["task"],"name":"chain_fpga_test"},{"about":"Chain Link 24: Research-assisted error fixing via Perplexity","inputs":["task"],"name":"chain_research"},{"about":"Chain Link 25: Validate .tri spec syntax before codegen","inputs":["task"],"name":"chain_lint_spec"},{"about":"List all 26 Golden Chain links with roles and status","inputs":[],"name":"chain_list"},{"about":"Decompose a GitHub issue into 5 role-based sub-issues (planner/coder/reviewer/tester/integrator)","inputs":["issue_number","template"],"name":"cloud_decompose"},{"about":"Send/edit/pin Telegram messages via tri CLI","inputs":["text","chat_id","pin","edit_id"],"name":"tri_notify"},{"about":"Scan for USB-UART serial devices (CH340/FTDI) connected to FPGA","inputs":[],"name":"fpga_uart_scan"},{"about":"PING/PONG test -- send 0x03, expect 0x83 from FPGA","inputs":["device"],"name":"fpga_uart_ping"},{"about":"Send raw hex bytes to FPGA via UART and print response","inputs":["device","hex_bytes"],"name":"fpga_uart_send"},{"about":"Get doctor health status -- one-line summary","inputs":[],"name":"doctor_status"},{"about":"Scan and classify all .zig files","inputs":[],"name":"doctor_scan"},{"about":"Health score dashboard with emoji grades","inputs":[],"name":"doctor_report"},{"about":"Create migration queue for manual files","inputs":[],"name":"doctor_plan"},{"about":"Regenerate manual files through pipeline","inputs":[],"name":"doctor_heal"},{"about":"Start a background job","inputs":["command"],"name":"job_start"},{"about":"Get job status by ID","inputs":["id"],"name":"job_status"},{"about":"Get job logs by ID","inputs":["id"],"name":"job_logs"},{"about":"List all background jobs","inputs":[],"name":"job_list"},{"about":"Cancel a running job","inputs":["id"],"name":"job_cancel"},{"about":"Get job artifacts by ID","inputs":["id"],"name":"job_artifacts"},{"about":"List open GitHub issues","inputs":[],"name":"issue_list"},{"about":"View a specific GitHub issue","inputs":["number"],"name":"issue_view"},{"about":"Create a new GitHub issue","inputs":["title","body"],"name":"issue_create"},{"about":"Add a comment to a GitHub issue","inputs":["number","body"],"name":"issue_comment"},{"about":"Close a GitHub issue","inputs":["number"],"name":"issue_close"},{"about":"Assign a user to a GitHub issue","inputs":["number","user"],"name":"issue_assign"},{"about":"Decompose a GitHub issue into sub-tasks","inputs":["number"],"name":"issue_decompose"},{"about":"Get deployment status","inputs":[],"name":"deploy_status"},{"about":"Get deployment logs","inputs":[],"name":"deploy_logs"},{"about":"Get deployment environment variables","inputs":[],"name":"deploy_vars"},{"about":"Start deployment","inputs":[],"name":"deploy_start"},{"about":"Stop deployment","inputs":[],"name":"deploy_stop"},{"about":"Save an experience entry (key-value learning)","inputs":["key","value"],"name":"experience_save"},{"about":"Recall an experience entry by key","inputs":["key"],"name":"experience_recall"},{"about":"List all recorded mistakes/anti-patterns","inputs":[],"name":"experience_mistakes"},{"about":"Get patent portfolio status","inputs":[],"name":"patent_status"},{"about":"Get patent analysis and claims","inputs":[],"name":"patent_analysis"},{"about":"Get DePIN node protocol status","inputs":[],"name":"depin_status"},{"about":"List DePIN network nodes","inputs":[],"name":"depin_nodes"},{"about":"Get DePIN node fitness scores","inputs":[],"name":"depin_fitness"},{"about":"Research a topic via Perplexity-assisted search","inputs":["query"],"name":"research_query"},{"about":"List all HSLM training experiments","inputs":[],"name":"experiment_list"},{"about":"Compare two experiments","inputs":["a","b"],"name":"experiment_compare"},{"about":"Run a chimera fused command (farm-cycle, train-cycle, etc.)","inputs":["name"],"name":"chimera_run"},{"about":"Get ouroboros self-evolution status and score","inputs":[],"name":"ouroboros_status"},{"about":"Run ouroboros self-evolution cycle","inputs":[],"name":"ouroboros_run"},{"about":"Run self-test suite","inputs":[],"name":"self_test"},{"about":"Get self-health check results","inputs":[],"name":"self_health"},{"about":"Get current context info (tokens, files, window)","inputs":[],"name":"context_info"},{"about":"Load additional context from a file path","inputs":["path"],"name":"context_load"},{"about":"Get Faculty Board status dashboard","inputs":[],"name":"faculty_status"},{"about":"Get MU agent status","inputs":[],"name":"mu_status"},{"about":"List MU learned patterns","inputs":[],"name":"mu_patterns"},{"about":"Get Zenodo publication status","inputs":[],"name":"zenodo_status"},{"about":"Analyze codebase quality and metrics","inputs":[],"name":"tri_analyze"},{"about":"Clean build artifacts and temp files","inputs":[],"name":"tri_clean"},{"about":"Format all Zig source files","inputs":[],"name":"tri_fmt"},{"about":"Show project statistics (LOC, files, tests)","inputs":[],"name":"tri_stats"},{"about":"Run linter on source code","inputs":[],"name":"tri_lint"},{"about":"Search codebase for a query string","inputs":["query"],"name":"tri_search"},{"about":"Get project metrics dashboard","inputs":[],"name":"tri_metrics"},{"about":"Get execution trace","inputs":[],"name":"tri_trace"},{"about":"Evaluate expression or code snippet","inputs":[],"name":"tri_eval"},{"about":"Get training farm status overview","inputs":[],"name":"farm_status"},{"about":"List idle farm workers","inputs":[],"name":"farm_idle"},{"about":"Recycle underperforming farm workers","inputs":[],"name":"farm_recycle"},{"about":"Fill empty farm slots with new experiments","inputs":[],"name":"farm_fill"},{"about":"List all 8 Railway farm accounts and their service counts","inputs":[],"name":"farm_accounts"},{"about":"Spawn a wave of training workers on a specific account","inputs":["account","count"],"name":"farm_wave_spawn"},{"about":"Run FPGA synthesis pipeline","inputs":[],"name":"fpga_synth"},{"about":"Get FPGA hardware and synthesis status","inputs":[],"name":"fpga_status"},{"about":"Build FPGA bitstream","inputs":[],"name":"fpga_build"},{"about":"Verify FPGA bitstream against RTL","inputs":[],"name":"fpga_verify"},{"about":"Flash bitstream to FPGA board","inputs":["bitstream"],"name":"fpga_flash"}],"toolsNote":"Static list parsed from writeToolsList (210 entries; 32 entries have an unbalanced trailing brace in the source literal and were parsed after adding or removing one). Cell-generated tools from data/cells/mcp_tools.json are appended at runtime and are not listed here. .trinity/mcp_schemas.json lists a different, shorter set (29 names) and is not used as the source.","transport":"stdio","typecheckOk":true,"witness":"source-parse"},{"aboutSource":".mcp.json entry; no tool list in this repository","agents":[],"config":".mcp.json","discarded":0,"env":[],"external":true,"family":"mcp","fields":{"ABOUT":"External MCP server `zig-docs` registered in .mcp.json; launched as `npx -y @nichochar/zig-mcp@latest`.","ABOUT_SOURCE":".mcp.json entry; no tool list in this repository","AGENTS":[],"AGENTS_NOTE":"No source binds an agent letter to this server: docs/agents/AGENTS_ALPHABET.md, specs/OWNERS.md and .claude/agents/*.md do not name it.","CONFIG":".mcp.json","ENABLED":true,"ENV":[],"EXTERNAL":true,"FAMILY":"mcp","ID":"mcp/zig-docs","KIND":"tool","LAUNCH":"npx -y @nichochar/zig-mcp@latest","REPO":"gHashTag/trinity","RESOURCES":[],"RESOURCES_ABOUT":[],"SERVER":"zig-docs","SERVER_VERSION":"","SOURCE":".mcp.json","TOOLS":[],"TOOLS_ABOUT":[],"TOOLS_INPUTS":[],"TOOLS_NOTE":"Tool list lives in the external npm package, not in this repository; nothing is listed rather than guessed.","TRANSPORT":"stdio","WITNESS":"source-parse"},"health":"ok","id":"mcp/zig-docs","inSpecCorpus":false,"launch":"npx -y @nichochar/zig-mcp@latest","links":{"config":"https://github.com/gHashTag/trinity/blob/da84d38795aa97f9170bb670f04a328032aa6ffe/.mcp.json","pinnedAt":"da84d38795aa97f9170bb670f04a328032aa6ffe","source":"https://github.com/gHashTag/trinity/blob/da84d38795aa97f9170bb670f04a328032aa6ffe/.mcp.json"},"messages":["no agent letter bound by a source","external package: tool list not in the repository"],"moduleName":"tool_mcp_zig_docs","name":{"en":"zig-docs"},"repo":"gHashTag/trinity","resources":[],"searchText":"mcp/zig-docs zig-docs external mcp server `zig-docs` registered in .mcp.json; launched as `npx -y @nichochar/zig-mcp@latest`.","server":"zig-docs","serverVersion":"","sha256":"0ca27e86e89947535eddbf81ddf34bde6a38ce06d77fdb191bda02bd392dd556","skills":[],"source":".mcp.json","specPath":"specs/tools/mcp/zig-docs.t27","summary":{"en":"External MCP server `zig-docs` registered in .mcp.json; launched as `npx -y @nichochar/zig-mcp@latest`.","ru":"Внешний MCP-сервер `zig-docs`, зарегистрированный в .mcp.json; запускается как `npx -y @nichochar/zig-mcp@latest`."},"tools":[],"toolsNote":"Tool list lives in the external npm package, not in this repository; nothing is listed rather than guessed.","transport":"stdio","typecheckOk":true,"witness":"source-parse"},{"aboutSource":"clap /// doc on Commands::Abandoned (cli/tri/src/main.rs; module cli/tri/src/abandoned.rs)","actions":[{"about":"List recovery sites whose preceding comment names a concrete construct.","name":"list"}],"agents":[],"args":[],"command":"tri abandoned","discarded":0,"entry":"cli/tri/src/main.rs","family":"tri-cli","fields":{"ABOUT":"Recovery sites whose own comment names the construct they discard.","ABOUT_SOURCE":"clap /// doc on Commands::Abandoned (cli/tri/src/main.rs; module cli/tri/src/abandoned.rs)","ACTIONS":["list"],"ACTIONS_ABOUT":["List recovery sites whose preceding comment names a concrete construct."],"AGENTS":[],"AGENTS_NOTE":"No source binds an agent letter to this command: docs/agents/AGENTS_ALPHABET.md (rows, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name it. creator.md and verifier.md name tri gen/test/verify but are not letter agents.","ARGS":[],"COMMAND":"tri abandoned","ENABLED":true,"ENTRY":"cli/tri/src/main.rs","FAMILY":"tri-cli","ID":"tri/abandoned","KIND":"tool","SOURCE":"cli/tri/src/abandoned.rs","VARIANT":"Commands::Abandoned","WHEN_TO_USE":"Recovery sites whose own comment names the construct they discard.","WITNESS":"source-parse"},"health":"ok","id":"tri/abandoned","inSpecCorpus":false,"links":{"config":null,"pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","source":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/cli/tri/src/abandoned.rs"},"messages":["no agent letter bound by a source"],"moduleName":"tool_tri_abandoned","name":{"en":"tri abandoned"},"repo":"gHashTag/t27","searchText":"tri/abandoned tri abandoned recovery sites whose own comment names the construct they discard. recovery sites whose own comment names the construct they discard. list list recovery sites whose preceding comment names a concrete construct.","sha256":"99c323aac1181bc537c07d34aab2d76d833a2a88bec00397e59b21650f933177","skills":[],"source":"cli/tri/src/abandoned.rs","specPath":"specs/tools/tri/abandoned.t27","summary":{"en":"Recovery sites whose own comment names the construct they discard.","ru":"Точки восстановления, чей собственный комментарий называет отбрасываемую конструкцию."},"typecheckOk":true,"variant":"Commands::Abandoned","whenToUse":"Recovery sites whose own comment names the construct they discard.","witness":"source-parse"},{"aboutSource":"tri-mcp tools tri_cell_checkpoint and tri_cell_seal descriptions (cli/tri-mcp/src/main.rs); CellAction enum cli/tri/src/main.rs:448","actions":[{"about":"","name":"checkpoint"},{"about":"","name":"seal"}],"agents":[{"letter":"W","ok":true}],"args":[],"command":"tri cell","discarded":0,"entry":"cli/tri/src/main.rs","family":"tri-cli","fields":{"ABOUT":"Records a checkpoint step in the active cell. Seals the active cell by computing a SHA-256 hash of its checkpoint history.","ABOUT_SOURCE":"tri-mcp tools tri_cell_checkpoint and tri_cell_seal descriptions (cli/tri-mcp/src/main.rs); CellAction enum cli/tri/src/main.rs:448","ACTIONS":["checkpoint","seal"],"ACTIONS_ABOUT":["",""],"AGENTS":["W"],"AGENTS_NOTE":"docs/agents/AGENTS_ALPHABET.md:144, agent W domain Workflow / tri cell, key file src/tri/cell.zig; PHASE 6 EVOLVE: W seals tri-cell commit (hash seal).","ARGS":[],"COMMAND":"tri cell","ENABLED":true,"ENTRY":"cli/tri/src/main.rs","FAMILY":"tri-cli","ID":"tri/cell","KIND":"tool","SOURCE":"cli/tri/src/main.rs","VARIANT":"Commands::Cell","WHEN_TO_USE":"Records a checkpoint step in the active cell. Seals the active cell by computing a SHA-256 hash of its checkpoint history.","WITNESS":"source-parse"},"health":"ok","id":"tri/cell","inSpecCorpus":false,"links":{"config":null,"pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","source":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/cli/tri/src/main.rs"},"messages":[],"moduleName":"tool_tri_cell","name":{"en":"tri cell"},"repo":"gHashTag/t27","searchText":"tri/cell tri cell records a checkpoint step in the active cell. seals the active cell by computing a sha-256 hash of its checkpoint history. records a checkpoint step in the active cell. seals the active cell by computing a sha-256 hash of its checkpoint history. checkpoint seal w","sha256":"8f356f8622d1c58b069b50d33eb6cc491f4b37d9ba960fa2d16e5c340f40707c","skills":[],"source":"cli/tri/src/main.rs","specPath":"specs/tools/tri/cell.t27","summary":{"en":"Records a checkpoint step in the active cell. Seals the active cell by computing a SHA-256 hash of its checkpoint history.","ru":"Записывает шаг-контрольную точку в активной ячейке; запечатывает активную ячейку, вычисляя SHA-256 истории её контрольных точек."},"typecheckOk":true,"variant":"Commands::Cell","whenToUse":"Records a checkpoint step in the active cell. Seals the active cell by computing a SHA-256 hash of its checkpoint history.","witness":"source-parse"},{"aboutSource":"clap /// doc on Commands::Census (cli/tri/src/main.rs; module cli/tri/src/census.rs)","actions":[{"about":"Every census's printed population, against one counted another way.","name":"audit"},{"about":"Pin each pure census's output, so a change that moves one has to say so.","name":"pin"}],"agents":[],"args":[],"command":"tri census","discarded":0,"entry":"cli/tri/src/main.rs","family":"tri-cli","fields":{"ABOUT":"Specs the compiler cannot read, ranked by the construct that stops it. Every census's printed population, against one counted another way.","ABOUT_SOURCE":"clap /// doc on Commands::Census (cli/tri/src/main.rs; module cli/tri/src/census.rs)","ACTIONS":["audit","pin"],"ACTIONS_ABOUT":["Every census's printed population, against one counted another way.","Pin each pure census's output, so a change that moves one has to say so."],"AGENTS":[],"AGENTS_NOTE":"No source binds an agent letter to this command: docs/agents/AGENTS_ALPHABET.md (rows, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name it. creator.md and verifier.md name tri gen/test/verify but are not letter agents.","ARGS":[],"COMMAND":"tri census","ENABLED":true,"ENTRY":"cli/tri/src/main.rs","FAMILY":"tri-cli","ID":"tri/census","KIND":"tool","SOURCE":"cli/tri/src/census.rs","VARIANT":"Commands::Census","WHEN_TO_USE":"Specs the compiler cannot read, ranked by the construct that stops it. Every census's printed population, against one counted another way.","WITNESS":"source-parse"},"health":"ok","id":"tri/census","inSpecCorpus":false,"links":{"config":null,"pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","source":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/cli/tri/src/census.rs"},"messages":["no agent letter bound by a source"],"moduleName":"tool_tri_census","name":{"en":"tri census"},"repo":"gHashTag/t27","searchText":"tri/census tri census specs the compiler cannot read, ranked by the construct that stops it. every census's printed population, against one counted another way. specs the compiler cannot read, ranked by the construct that stops it. every census's printed population, against one counted another way. audit every census's printed population, against one counted another way. pin pin each pure census's output, so a change that moves one has to say so.","sha256":"d2426bdd477bfa774377cc703a976600d95d527902f411e4787b2081a3944c17","skills":[],"source":"cli/tri/src/census.rs","specPath":"specs/tools/tri/census.t27","summary":{"en":"Specs the compiler cannot read, ranked by the construct that stops it. Every census's printed population, against one counted another way.","ru":"Спеки, которые компилятор не может прочитать, ранжированные по конструкции, которая его останавливает. Напечатанная популяция каждой переписи против одной, посчитанной иначе."},"typecheckOk":true,"variant":"Commands::Census","whenToUse":"Specs the compiler cannot read, ranked by the construct that stops it. Every census's printed population, against one counted another way.","witness":"source-parse"},{"aboutSource":"clap /// doc on Commands::Ci (cli/tri/src/main.rs; module cli/tri/src/cibase.rs)","actions":[{"about":"List PR gates that have never run on the default branch.","name":"baseline"}],"agents":[],"args":[],"command":"tri ci","discarded":0,"entry":"cli/tri/src/main.rs","family":"tri-cli","fields":{"ABOUT":"Is the hardware this plan assumes actually attached? CI questions about the repository's own gates.","ABOUT_SOURCE":"clap /// doc on Commands::Ci (cli/tri/src/main.rs; module cli/tri/src/cibase.rs)","ACTIONS":["baseline"],"ACTIONS_ABOUT":["List PR gates that have never run on the default branch."],"AGENTS":[],"AGENTS_NOTE":"No source binds an agent letter to this command: docs/agents/AGENTS_ALPHABET.md (rows, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name it. creator.md and verifier.md name tri gen/test/verify but are not letter agents.","ARGS":[],"COMMAND":"tri ci","ENABLED":true,"ENTRY":"cli/tri/src/main.rs","FAMILY":"tri-cli","ID":"tri/ci","KIND":"tool","SOURCE":"cli/tri/src/cibase.rs","VARIANT":"Commands::Ci","WHEN_TO_USE":"Is the hardware this plan assumes actually attached? CI questions about the repository's own gates.","WITNESS":"source-parse"},"health":"ok","id":"tri/ci","inSpecCorpus":false,"links":{"config":null,"pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","source":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/cli/tri/src/cibase.rs"},"messages":["no agent letter bound by a source"],"moduleName":"tool_tri_ci","name":{"en":"tri ci"},"repo":"gHashTag/t27","searchText":"tri/ci tri ci is the hardware this plan assumes actually attached? ci questions about the repository's own gates. is the hardware this plan assumes actually attached? ci questions about the repository's own gates. baseline list pr gates that have never run on the default branch.","sha256":"b697c22ef3e3a8630a6e171a63eafd2dfbb76e3f18c78dcedfbb5d55bbe5f5f8","skills":[],"source":"cli/tri/src/cibase.rs","specPath":"specs/tools/tri/ci.t27","summary":{"en":"Is the hardware this plan assumes actually attached? CI questions about the repository's own gates.","ru":"Действительно ли подключено оборудование, которое предполагает этот план? Вопросы CI о собственных гейтах репозитория."},"typecheckOk":true,"variant":"Commands::Ci","whenToUse":"Is the hardware this plan assumes actually attached? CI questions about the repository's own gates.","witness":"source-parse"},{"aboutSource":"clap /// doc on Commands::Competitors (cli/tri/src/main.rs; module cli/tri/src/competitors.rs)","actions":[{"about":"Count the records, the double-entered papers and the unpublished zeros.","name":"audit"},{"about":"When the survey behind this table last read a paper, by the month its citations encode.","name":"freshness"}],"agents":[],"args":[],"command":"tri competitors","discarded":0,"entry":"cli/tri/src/main.rs","family":"tri-cli","fields":{"ABOUT":"The competitor table against its own contract: how many of its published scores were never published, and how many papers it counts twice.","ABOUT_SOURCE":"clap /// doc on Commands::Competitors (cli/tri/src/main.rs; module cli/tri/src/competitors.rs)","ACTIONS":["audit","freshness"],"ACTIONS_ABOUT":["Count the records, the double-entered papers and the unpublished zeros.","When the survey behind this table last read a paper, by the month its citations encode."],"AGENTS":[],"AGENTS_NOTE":"No source binds an agent letter to this command: docs/agents/AGENTS_ALPHABET.md (rows, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name it. creator.md and verifier.md name tri gen/test/verify but are not letter agents.","ARGS":[],"COMMAND":"tri competitors","ENABLED":true,"ENTRY":"cli/tri/src/main.rs","FAMILY":"tri-cli","ID":"tri/competitors","KIND":"tool","SOURCE":"cli/tri/src/competitors.rs","VARIANT":"Commands::Competitors","WHEN_TO_USE":"The competitor table against its own contract: how many of its published scores were never published, and how many papers it counts twice.","WITNESS":"source-parse"},"health":"ok","id":"tri/competitors","inSpecCorpus":false,"links":{"config":null,"pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","source":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/cli/tri/src/competitors.rs"},"messages":["no agent letter bound by a source"],"moduleName":"tool_tri_competitors","name":{"en":"tri competitors"},"repo":"gHashTag/t27","searchText":"tri/competitors tri competitors the competitor table against its own contract: how many of its published scores were never published, and how many papers it counts twice. the competitor table against its own contract: how many of its published scores were never published, and how many papers it counts twice. audit count the records, the double-entered papers and the unpublished zeros. freshness when the survey behind this table last read a paper, by the month its citations encode.","sha256":"e8c894652a4da4065722431cce5357d3a23372f1012f0d6db73616c7ecb78de9","skills":[],"source":"cli/tri/src/competitors.rs","specPath":"specs/tools/tri/competitors.t27","summary":{"en":"The competitor table against its own contract: how many of its published scores were never published, and how many papers it counts twice.","ru":"Таблица конкурентов против собственного контракта: сколько её опубликованных оценок никогда не публиковались и сколько статей она считает дважды."},"typecheckOk":true,"variant":"Commands::Competitors","whenToUse":"The competitor table against its own contract: how many of its published scores were never published, and how many papers it counts twice.","witness":"source-parse"},{"aboutSource":"clap /// doc on Commands::Discard (cli/tri/src/main.rs; module cli/tri/src/discard.rs)","actions":[{"about":"Rank the discarding specs, largest first, against the pinned volume.","name":"top"},{"about":"Group the discard by which recovery threw it away, and what it stopped on.","name":"classify"}],"agents":[],"args":[],"command":"tri discard","discarded":0,"entry":"cli/tri/src/main.rs","family":"tri-cli","fields":{"ABOUT":"What the parser reads and throws away, ranked against its pinned bound.","ABOUT_SOURCE":"clap /// doc on Commands::Discard (cli/tri/src/main.rs; module cli/tri/src/discard.rs)","ACTIONS":["top","classify"],"ACTIONS_ABOUT":["Rank the discarding specs, largest first, against the pinned volume.","Group the discard by which recovery threw it away, and what it stopped on."],"AGENTS":[],"AGENTS_NOTE":"No source binds an agent letter to this command: docs/agents/AGENTS_ALPHABET.md (rows, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name it. creator.md and verifier.md name tri gen/test/verify but are not letter agents.","ARGS":[],"COMMAND":"tri discard","ENABLED":true,"ENTRY":"cli/tri/src/main.rs","FAMILY":"tri-cli","ID":"tri/discard","KIND":"tool","SOURCE":"cli/tri/src/discard.rs","VARIANT":"Commands::Discard","WHEN_TO_USE":"What the parser reads and throws away, ranked against its pinned bound.","WITNESS":"source-parse"},"health":"ok","id":"tri/discard","inSpecCorpus":false,"links":{"config":null,"pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","source":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/cli/tri/src/discard.rs"},"messages":["no agent letter bound by a source"],"moduleName":"tool_tri_discard","name":{"en":"tri discard"},"repo":"gHashTag/t27","searchText":"tri/discard tri discard what the parser reads and throws away, ranked against its pinned bound. what the parser reads and throws away, ranked against its pinned bound. top rank the discarding specs, largest first, against the pinned volume. classify group the discard by which recovery threw it away, and what it stopped on.","sha256":"779a83cf234f5dcba9a852d533912609f5dd1a330ebac28fd31c23ef342430eb","skills":[],"source":"cli/tri/src/discard.rs","specPath":"specs/tools/tri/discard.t27","summary":{"en":"What the parser reads and throws away, ranked against its pinned bound.","ru":"Что парсер читает и выбрасывает, в сравнении с закреплённой границей."},"typecheckOk":true,"variant":"Commands::Discard","whenToUse":"What the parser reads and throws away, ranked against its pinned bound.","witness":"source-parse"},{"aboutSource":"handler cmd_doctor match arms start/stop/status and its error text unknown doctor action (start|stop|status) (cli/tri/src/main.rs:934)","actions":[],"agents":[],"args":[{"about":"","name":""}],"command":"tri doctor","discarded":0,"entry":"cli/tri/src/main.rs","family":"tri-cli","fields":{"ABOUT":"Start, stop or show the doctor state kept in .trinity/state/doctor.json (actions: start | stop | status).","ABOUT_SOURCE":"handler cmd_doctor match arms start/stop/status and its error text unknown doctor action (start|stop|status) (cli/tri/src/main.rs:934)","ACTIONS":[],"ACTIONS_ABOUT":[],"AGENTS":[],"AGENTS_NOTE":"No source binds an agent letter to this command: docs/agents/AGENTS_ALPHABET.md (rows, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name it. creator.md and verifier.md name tri gen/test/verify but are not letter agents.","ARGS":[""],"COMMAND":"tri doctor","ENABLED":true,"ENTRY":"cli/tri/src/main.rs","FAMILY":"tri-cli","ID":"tri/doctor","KIND":"tool","SOURCE":"cli/tri/src/main.rs","VARIANT":"Commands::Doctor","WHEN_TO_USE":"Start, stop or show the doctor state kept in .trinity/state/doctor.json (actions: start | stop | status).","WITNESS":"source-parse"},"health":"ok","id":"tri/doctor","inSpecCorpus":false,"links":{"config":null,"pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","source":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/cli/tri/src/main.rs"},"messages":["no agent letter bound by a source"],"moduleName":"tool_tri_doctor","name":{"en":"tri doctor"},"repo":"gHashTag/t27","searchText":"tri/doctor tri doctor start, stop or show the doctor state kept in .trinity/state/doctor.json (actions: start | stop | status). start, stop or show the doctor state kept in .trinity/state/doctor.json (actions: start | stop | status).","sha256":"d33319209c2077839c26db4fa2d707c76c5e040e8eb87a663963616b1cf66dc1","skills":[],"source":"cli/tri/src/main.rs","specPath":"specs/tools/tri/doctor.t27","summary":{"en":"Start, stop or show the doctor state kept in .trinity/state/doctor.json (actions: start | stop | status).","ru":"Запускает, останавливает или показывает состояние doctor, хранимое в .trinity/state/doctor.json (действия: start | stop | status)."},"typecheckOk":true,"variant":"Commands::Doctor","whenToUse":"Start, stop or show the doctor state kept in .trinity/state/doctor.json (actions: start | stop | status).","witness":"source-parse"},{"aboutSource":"clap /// doc on Commands::Elab (cli/tri/src/main.rs; module cli/tri/src/elab.rs)","actions":[{"about":"Distribution of elaboration diagnostics by message shape.","name":"classify"},{"about":"How many diagnostics are secondary -- same source line as one above.","name":"secondary"}],"agents":[],"args":[],"command":"tri elab","discarded":0,"entry":"cli/tri/src/main.rs","family":"tri-cli","fields":{"ABOUT":"Classify a compiler's error output before quoting a number from it.","ABOUT_SOURCE":"clap /// doc on Commands::Elab (cli/tri/src/main.rs; module cli/tri/src/elab.rs)","ACTIONS":["classify","secondary"],"ACTIONS_ABOUT":["Distribution of elaboration diagnostics by message shape.","How many diagnostics are secondary -- same source line as one above."],"AGENTS":[],"AGENTS_NOTE":"No source binds an agent letter to this command: docs/agents/AGENTS_ALPHABET.md (rows, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name it. creator.md and verifier.md name tri gen/test/verify but are not letter agents.","ARGS":[],"COMMAND":"tri elab","ENABLED":true,"ENTRY":"cli/tri/src/main.rs","FAMILY":"tri-cli","ID":"tri/elab","KIND":"tool","SOURCE":"cli/tri/src/elab.rs","VARIANT":"Commands::Elab","WHEN_TO_USE":"Classify a compiler's error output before quoting a number from it.","WITNESS":"source-parse"},"health":"ok","id":"tri/elab","inSpecCorpus":false,"links":{"config":null,"pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","source":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/cli/tri/src/elab.rs"},"messages":["no agent letter bound by a source"],"moduleName":"tool_tri_elab","name":{"en":"tri elab"},"repo":"gHashTag/t27","searchText":"tri/elab tri elab classify a compiler's error output before quoting a number from it. classify a compiler's error output before quoting a number from it. classify distribution of elaboration diagnostics by message shape. secondary how many diagnostics are secondary -- same source line as one above.","sha256":"400d285676771e8b451e872b032a20de2c4f16df4d32b90474719bf677342526","skills":[],"source":"cli/tri/src/elab.rs","specPath":"specs/tools/tri/elab.t27","summary":{"en":"Classify a compiler's error output before quoting a number from it.","ru":"Классифицирует вывод ошибок компилятора прежде, чем цитировать из него число."},"typecheckOk":true,"variant":"Commands::Elab","whenToUse":"Classify a compiler's error output before quoting a number from it.","witness":"source-parse"},{"aboutSource":"clap /// doc on Commands::Emit (cli/tri/src/main.rs; module cli/tri/src/gendet.rs)","actions":[{"about":"Generate the corpus twice with the same binary and name what differs.","name":"determinism"}],"agents":[],"args":[],"command":"tri emit","discarded":0,"entry":"cli/tri/src/main.rs","family":"tri-cli","fields":{"ABOUT":"Does the same binary produce the same generated code twice?","ABOUT_SOURCE":"clap /// doc on Commands::Emit (cli/tri/src/main.rs; module cli/tri/src/gendet.rs)","ACTIONS":["determinism"],"ACTIONS_ABOUT":["Generate the corpus twice with the same binary and name what differs."],"AGENTS":[],"AGENTS_NOTE":"No source binds an agent letter to this command: docs/agents/AGENTS_ALPHABET.md (rows, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name it. creator.md and verifier.md name tri gen/test/verify but are not letter agents.","ARGS":[],"COMMAND":"tri emit","ENABLED":true,"ENTRY":"cli/tri/src/main.rs","FAMILY":"tri-cli","ID":"tri/emit","KIND":"tool","SOURCE":"cli/tri/src/gendet.rs","VARIANT":"Commands::Emit","WHEN_TO_USE":"Does the same binary produce the same generated code twice? Every byte-comparison over emitted output -- seals, emit-bitexact, `corpus --per-spec` diffing -- assumes it does. Three of the four emitters do not; see #3006. (`Gen` is taken by the single-spec emitter, so this is `Emit`.)","WITNESS":"source-parse"},"health":"ok","id":"tri/emit","inSpecCorpus":false,"links":{"config":null,"pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","source":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/cli/tri/src/gendet.rs"},"messages":["no agent letter bound by a source"],"moduleName":"tool_tri_emit","name":{"en":"tri emit"},"repo":"gHashTag/t27","searchText":"tri/emit tri emit does the same binary produce the same generated code twice? does the same binary produce the same generated code twice? every byte-comparison over emitted output -- seals, emit-bitexact, `corpus --per-spec` diffing -- assumes it does. three of the four emitters do not; see #3006. (`gen` is taken by the single-spec emitter, so this is `emit`.) determinism generate the corpus twice with the same binary and name what differs.","sha256":"a7c0599d10d7239b66d63689d31a3bcac556967aac44f153097dbe27c0469123","skills":[],"source":"cli/tri/src/gendet.rs","specPath":"specs/tools/tri/emit.t27","summary":{"en":"Does the same binary produce the same generated code twice?","ru":"Даёт ли один и тот же бинарник один и тот же сгенерированный код дважды?"},"typecheckOk":true,"variant":"Commands::Emit","whenToUse":"Does the same binary produce the same generated code twice? Every byte-comparison over emitted output -- seals, emit-bitexact, `corpus --per-spec` diffing -- assumes it does. Three of the four emitters do not; see #3006. (`Gen` is taken by the single-spec emitter, so this is `Emit`.)","witness":"source-parse"},{"aboutSource":"tri-mcp tool tri_experience_save description (cli/tri-mcp/src/main.rs); ExperienceAction enum cli/tri/src/main.rs:457","actions":[{"about":"","name":"save"}],"agents":[{"letter":"E","ok":true}],"args":[],"command":"tri experience","discarded":0,"entry":"cli/tri/src/main.rs","family":"tri-cli","fields":{"ABOUT":"Saves an experience episode to the akashic log.","ABOUT_SOURCE":"tri-mcp tool tri_experience_save description (cli/tri-mcp/src/main.rs); ExperienceAction enum cli/tri/src/main.rs:457","ACTIONS":["save"],"ACTIONS_ABOUT":[""],"AGENTS":["E"],"AGENTS_NOTE":".claude/agents/agent-e-experience.md:64 (tri experience save -- Save episode to experience log). Lines 65-66 name tri experience query and tri notebook, which the CLI does not have at this commit.","ARGS":[],"COMMAND":"tri experience","ENABLED":true,"ENTRY":"cli/tri/src/main.rs","FAMILY":"tri-cli","ID":"tri/experience","KIND":"tool","SOURCE":"cli/tri/src/main.rs","VARIANT":"Commands::Experience","WHEN_TO_USE":"Saves an experience episode to the akashic log.","WITNESS":"source-parse"},"health":"ok","id":"tri/experience","inSpecCorpus":false,"links":{"config":null,"pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","source":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/cli/tri/src/main.rs"},"messages":[],"moduleName":"tool_tri_experience","name":{"en":"tri experience"},"repo":"gHashTag/t27","searchText":"tri/experience tri experience saves an experience episode to the akashic log. saves an experience episode to the akashic log. save e","sha256":"62fbf3b60098141a017a51cb5edda43ef60debee362588dfb1574e0e0c7eb0f8","skills":[{"id":"t27/tri","via":["SUMMARY_EN"]}],"source":"cli/tri/src/main.rs","specPath":"specs/tools/tri/experience.t27","summary":{"en":"Saves an experience episode to the akashic log.","ru":"Сохраняет эпизод опыта в акашический журнал."},"typecheckOk":true,"variant":"Commands::Experience","whenToUse":"Saves an experience episode to the akashic log.","witness":"source-parse"},{"aboutSource":"//! module doc, cli/tri/src/fleet.rs:1","actions":[{"about":"Scan the USB bus and say plainly what hardware is present.","name":"scan"},{"about":"Check the environments a claim depends on before repeating the claim.","name":"asof"}],"agents":[],"args":[],"command":"tri fleet","discarded":0,"entry":"cli/tri/src/main.rs","family":"tri-cli","fields":{"ABOUT":"`tri fleet` -- is the hardware this plan assumes actually attached?","ABOUT_SOURCE":"//! module doc, cli/tri/src/fleet.rs:1","ACTIONS":["scan","asof"],"ACTIONS_ABOUT":["Scan the USB bus and say plainly what hardware is present.","Check the environments a claim depends on before repeating the claim."],"AGENTS":[],"AGENTS_NOTE":"No source binds an agent letter to this command: docs/agents/AGENTS_ALPHABET.md (rows, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name it. creator.md and verifier.md name tri gen/test/verify but are not letter agents.","ARGS":[],"COMMAND":"tri fleet","ENABLED":true,"ENTRY":"cli/tri/src/main.rs","FAMILY":"tri-cli","ID":"tri/fleet","KIND":"tool","SOURCE":"cli/tri/src/fleet.rs","VARIANT":"Commands::Fleet","WHEN_TO_USE":"`tri fleet` -- is the hardware this plan assumes actually attached?","WITNESS":"source-parse"},"health":"ok","id":"tri/fleet","inSpecCorpus":false,"links":{"config":null,"pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","source":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/cli/tri/src/fleet.rs"},"messages":["no agent letter bound by a source"],"moduleName":"tool_tri_fleet","name":{"en":"tri fleet"},"repo":"gHashTag/t27","searchText":"tri/fleet tri fleet `tri fleet` -- is the hardware this plan assumes actually attached? `tri fleet` -- is the hardware this plan assumes actually attached? scan scan the usb bus and say plainly what hardware is present. asof check the environments a claim depends on before repeating the claim.","sha256":"bbe8ff7a66b4cedf6ad59cce1aab0db9290e96abda4c61e74945e479f605dd0b","skills":[],"source":"cli/tri/src/fleet.rs","specPath":"specs/tools/tri/fleet.t27","summary":{"en":"`tri fleet` -- is the hardware this plan assumes actually attached?","ru":"`tri fleet` -- действительно ли подключено оборудование, которое предполагает этот план?"},"typecheckOk":true,"variant":"Commands::Fleet","whenToUse":"`tri fleet` -- is the hardware this plan assumes actually attached?","witness":"source-parse"},{"aboutSource":"clap /// doc on Commands::Fmt (cli/tri/src/main.rs)","actions":[],"agents":[],"args":[{"about":"One package instead of the whole workspace.","name":"--package"},{"about":"Report what is dirty and whether a workflow formats, and stop.","name":"--dry-run"}],"command":"tri fmt","discarded":0,"entry":"cli/tri/src/main.rs","family":"tri-cli","fields":{"ABOUT":"Type names with more than one definition in the spec tree. Run the formatter and restore every file it rewrote that you had not touched.","ABOUT_SOURCE":"clap /// doc on Commands::Fmt (cli/tri/src/main.rs)","ACTIONS":[],"ACTIONS_ABOUT":[],"AGENTS":[],"AGENTS_NOTE":"No source binds an agent letter to this command: docs/agents/AGENTS_ALPHABET.md (rows, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name it. creator.md and verifier.md name tri gen/test/verify but are not letter agents.","ARGS":["--package: One package instead of the whole workspace.","--dry-run: Report what is dirty and whether a workflow formats, and stop."],"COMMAND":"tri fmt","ENABLED":true,"ENTRY":"cli/tri/src/main.rs","FAMILY":"tri-cli","ID":"tri/fmt","KIND":"tool","SOURCE":"cli/tri/src/main.rs","VARIANT":"Commands::Fmt","WHEN_TO_USE":"Type names with more than one definition in the spec tree. Run the formatter and restore every file it rewrote that you had not touched.","WITNESS":"source-parse"},"health":"ok","id":"tri/fmt","inSpecCorpus":false,"links":{"config":null,"pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","source":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/cli/tri/src/main.rs"},"messages":["no agent letter bound by a source"],"moduleName":"tool_tri_fmt","name":{"en":"tri fmt"},"repo":"gHashTag/t27","searchText":"tri/fmt tri fmt type names with more than one definition in the spec tree. run the formatter and restore every file it rewrote that you had not touched. type names with more than one definition in the spec tree. run the formatter and restore every file it rewrote that you had not touched.","sha256":"898a2cf21e115851d800dd3da26e31700a581d5bc74ef264b0c01130c5d9a81f","skills":[],"source":"cli/tri/src/main.rs","specPath":"specs/tools/tri/fmt.t27","summary":{"en":"Type names with more than one definition in the spec tree. Run the formatter and restore every file it rewrote that you had not touched.","ru":"Имена типов с более чем одним определением в дереве спеков. Запускает форматтер и восстанавливает каждый переписанный им файл, которого вы не трогали."},"typecheckOk":true,"variant":"Commands::Fmt","whenToUse":"Type names with more than one definition in the spec tree. Run the formatter and restore every file it rewrote that you had not touched.","witness":"source-parse"},{"aboutSource":"clap /// doc on Commands::Fpga (cli/tri/src/main.rs; module cli/tri/src/fpga.rs)","actions":[{"about":"Read and print the JTAG IDCODE of the attached DLC10 cable target.","name":"idcode"},{"about":"Read the configuration IDCODE register via the Type-1 CFG_IN/CFG_OUT protocol. On a healthy XC7A100T this must return 0x13631093 (same as the JTAG IDCODE). If 0x00000000 is returned while `idcode` works, the read_cfg_reg implementation is broken.","name":"idcode-cfg"},{"about":"Program FPGA SRAM (volatile -- lost on power-cycle).","name":"sram"},{"about":"Program the on-board SPI flash (non-volatile / persistent).","name":"program"},{"about":"Read the SPI flash JEDEC ID via the JTAG-to-SPI bridge.","name":"flash-id"},{"about":"Read the raw CFG_OUT status register.","name":"status"},{"about":"Decode 7-series configuration registers for DONE=LOW diagnosis.","name":"debug"},{"about":"Load a bitstream into FPGA SRAM using openFPGALoader with a Digilent FTDI cable. This is the canonical path for the QMTech Wukong V1 / XC7A200T board because the in-tree `dlc10` driver only supports Xilinx DLC10 cables (VID=0x03FD), not the attached Digilent cable (VID=0x0403:0x6014).","name":"load-sram"},{"about":"Read and decode the FPGA STAT register via openFPGALoader.","name":"stat"},{"about":"Read the FPGA XADC sensors (temperature, VCCINT, VCCAUX) via openFPGALoader and print a JSON object. The board must be powered and connected through a supported cable such as `digilent_hs2`.","name":"read-xadc"},{"about":"Synthesize the GF16 4x4 matrix design through the openXC7 toolchain. Output is written to `/gf16_matmul4x4_top.bit`.","name":"synth-gf16"},{"about":"Program the on-board SPI flash (non-volatile) using openFPGALoader's JTAG-to-SPI bridge. Requires a matching `spiOverJtag` bitstream for the exact FPGA package; the XC7A200T-FGG676 bridge is present in recent openFPGALoader distributions but flash boot may still depend on board mode pins (see docs/reports/FPGA_LOOP_EVIDENCE_2026-07-04.md).","name":"program-flash"},{"about":"Dump SPI flash contents to a file via openFPGALoader's JTAG-to-SPI bridge.","name":"dump-flash"},{"about":"Parse the .bit header and print the configuration registers that affect Master SPI boot (COR0, COR1, WBSTAR, TIMER, CTL0, CTL1, IDCODE, BSPI).","name":"bit-config"},{"about":"Program the given .bit to SPI flash, dump the same region back, and compare the dumped bytes against the bitstream payload. This verifies the openFPGALoader write path is bit-perfect for the raw bitstream.","name":"round-trip-verify"},{"about":"Guided cold-POR boot experiment. Programs flash, asks the user to physically power-cycle the board, then captures STAT without a JTAG reset and prints a decision-tree diagnosis.","name":"boot-log"},{"about":"Deterministic cold-POR boot experiment with optional relay control. With `--relay-port MOCK` the command writes a deterministic, clearly labeled mock boot log so CI can exercise the cold-POR JSON path without touching hardware. Real relay ports are reserved for Variant A/B.","name":"cold-por"},{"about":"Board-less smoke gate for the FPGA path. Runs `tri fpga bit-config` on the GF16 demo bitstream and, if yosys is available, a synthesis smoke check on the demo Verilog. Requires no physical board.","name":"smoke-gate"},{"about":"Print or interactively confirm the cold-POR boot protocol. This is the standalone version of the instructions embedded in `boot-log` and `cclk-sweep`; use it to verify the operator steps before a physical power-cycle.","name":"boot-protocol"},{"about":"Patch the raw OSCFSEL field (COR0[22:17]) of a 7-series .bit file.","name":"patch-cor0"},{"about":"Generate a set of OSCFSEL variants from a single input .bit file. Outputs one file per requested value to the given directory.","name":"cclk-variants"},{"about":"Automated cold-POR CCLK sweep. Generates OSCFSEL variants, programs each to flash, prompts for the physical power-cycle, captures STAT, and writes JSON logs. The only manual step is disconnecting/reconnecting the cable and power-cycling the board.","name":"cclk-sweep"},{"about":"Read all `build/fpga/boot-log-*.json` files and produce a sweep report identifying the first working CCLK variant.","name":"sweep-report"},{"about":"Print DSLogic / oscilloscope instructions for measuring the FPGA CCLK output during Master SPI configuration. Optionally parse a DSView CSV export or run a live capture via `sigrok-cli` with a connected logic analyzer (e.g., the Digilent FTDI cable as `ftdi-la`).","name":"measure-cclk"},{"about":"Read the SPI flash status register via openFPGALoader's JTAG-to-SPI bridge. Decodes WIP, WEL, and QE bits to help diagnose boot-from-flash failures.","name":"flash-status"},{"about":"Diagnostic: load *only* the proxy bridge bitstream (or any other bitstream) into FPGA SRAM, report STAT, leave TAP in RTI. Does NOT touch SPI flash. Useful for verifying the bridge actually reaches DONE=HIGH before debugging SPI semantics.","name":"proxy-load"},{"about":"Diagnostic: read IDCODE + STAT *without* touching the FPGA. Run this immediately after `tri fpga proxy-load` to confirm the bridge is alive. Also confirms IR=USER1 select is accepted.","name":"proxy-status"},{"about":"Diagnostic: shift raw hex bytes through the USER1 BSCAN as a single SPI transaction. Reads `--rx N` MISO bytes after the TX stream. Requires the proxy bridge to be already loaded (`tri fpga proxy-load` first).","name":"spi-raw"},{"about":"Diagnostic: probe the IR capture pattern after selecting an IR. A healthy 7-series TAP always captures `0b000001` into the IR shift register. Anything else means the JTAG chain is broken or the cable is mis-driving TMS.","name":"ir-probe"},{"about":"Diagnostic: drive the full JEDEC-read flow end-to-end with maximum instrumentation, **including** the 0xAB Release-Power-down and 0x66+0x99 software-reset recovery attempts. Equivalent to `flash-id --verbose` plus auto-recovery.","name":"flash-id-debug"},{"about":"Build the QMTech XC7A100T-FGG676 JTAG-to-SPI proxy bitstream via the openXC7 open-source toolchain (yosys + nextpnr-himbaechel + prjxray). Requires `yosys`, `nextpnr-himbaechel`, `fasm2frames.py` and `xc7frames2bit` on PATH. With `--install`, the produced `.bit` is copied to `fpga/tools/bscan_spi_xc7a100t.bit` so the embedded `BSCAN_SPI_XC7A100T` constant picks it up on the next rebuild.","name":"build-proxy"},{"about":"Clone the openXC7 `nextpnr-xilinx` repo and build a chipdb (`.bba`) for the requested 7-series part, then install it into `~/.local/share/nextpnr/himbaechel-xilinx/`.","name":"setup-openxc7-chipdb"},{"about":"Generate a Lean 4 theorem from a `tri fpga measure-cclk --json` output. The theorem proves that the measured `(frequency, duty)` pair satisfies `measured_cclk_satisfies_flash_spec` and links it to `transaction_satisfies_flash_spec`. Useful for turning a real capture into a machine-checked proof without manual copy-paste.","name":"measured-to-lean"},{"about":"Print the PVT-derated N25Q128_3V SCK low/high bound for a supplied operating context. Also prints the margin over the nominal 6 ns bound and warns if the context is outside the documented operating envelope.","name":"pvt-envelope"},{"about":"Build the QMTech XC7A100T-FGG676 proxy bitstream via a Docker container running Xilinx Vivado. Clones our `openFPGALoader` fork (`feat/qmtech-xc7a100t-board`) into `target/openfpgaloader-fork/` and runs `make` inside `spiOverJtag/`. On Apple Silicon (arm64), the container runs under x86_64 emulation via `--platform linux/amd64`. With `--install`, the produced `bscan_spi_xc7a100tfgg676.bit.gz` is decompressed and copied to `fpga/tools/bscan_spi_xc7a100t.bit` and its SHA256 is printed.","name":"build-proxy-docker"}],"agents":[],"args":[],"command":"tri fpga","discarded":0,"entry":"cli/tri/src/main.rs","family":"tri-cli","fields":{"ABOUT":"FPGA programming via the in-tree DLC10 driver (pure Rust).","ABOUT_SOURCE":"clap /// doc on Commands::Fpga (cli/tri/src/main.rs; module cli/tri/src/fpga.rs)","ACTIONS":["idcode","idcode-cfg","sram","program","flash-id","status","debug","load-sram","stat","read-xadc","synth-gf16","program-flash","dump-flash","bit-config","round-trip-verify","boot-log","cold-por","smoke-gate","boot-protocol","patch-cor0","cclk-variants","cclk-sweep","sweep-report","measure-cclk","flash-status","proxy-load","proxy-status","spi-raw","ir-probe","flash-id-debug","build-proxy","setup-openxc7-chipdb","measured-to-lean","pvt-envelope","build-proxy-docker"],"ACTIONS_ABOUT":["Read and print the JTAG IDCODE of the attached DLC10 cable target.","Read the configuration IDCODE register via the Type-1 CFG_IN/CFG_OUT protocol. On a healthy XC7A100T this must return 0x13631093 (same as the JTAG IDCODE). If 0x00000000 is returned while `idcode` works, the read_cfg_reg implementation is broken.","Program FPGA SRAM (volatile -- lost on power-cycle).","Program the on-board SPI flash (non-volatile / persistent).","Read the SPI flash JEDEC ID via the JTAG-to-SPI bridge.","Read the raw CFG_OUT status register.","Decode 7-series configuration registers for DONE=LOW diagnosis.","Load a bitstream into FPGA SRAM using openFPGALoader with a Digilent FTDI cable. This is the canonical path for the QMTech Wukong V1 / XC7A200T board because the in-tree `dlc10` driver only supports Xilinx DLC10 cables (VID=0x03FD), not the attached Digilent cable (VID=0x0403:0x6014).","Read and decode the FPGA STAT register via openFPGALoader.","Read the FPGA XADC sensors (temperature, VCCINT, VCCAUX) via openFPGALoader and print a JSON object. The board must be powered and connected through a supported cable such as `digilent_hs2`.","Synthesize the GF16 4x4 matrix design through the openXC7 toolchain. Output is written to `/gf16_matmul4x4_top.bit`.","Program the on-board SPI flash (non-volatile) using openFPGALoader's JTAG-to-SPI bridge. Requires a matching `spiOverJtag` bitstream for the exact FPGA package; the XC7A200T-FGG676 bridge is present in recent openFPGALoader distributions but flash boot may still depend on board mode pins (see docs/reports/FPGA_LOOP_EVIDENCE_2026-07-04.md).","Dump SPI flash contents to a file via openFPGALoader's JTAG-to-SPI bridge.","Parse the .bit header and print the configuration registers that affect Master SPI boot (COR0, COR1, WBSTAR, TIMER, CTL0, CTL1, IDCODE, BSPI).","Program the given .bit to SPI flash, dump the same region back, and compare the dumped bytes against the bitstream payload. This verifies the openFPGALoader write path is bit-perfect for the raw bitstream.","Guided cold-POR boot experiment. Programs flash, asks the user to physically power-cycle the board, then captures STAT without a JTAG reset and prints a decision-tree diagnosis.","Deterministic cold-POR boot experiment with optional relay control. With `--relay-port MOCK` the command writes a deterministic, clearly labeled mock boot log so CI can exercise the cold-POR JSON path without touching hardware. Real relay ports are reserved for Variant A/B.","Board-less smoke gate for the FPGA path. Runs `tri fpga bit-config` on the GF16 demo bitstream and, if yosys is available, a synthesis smoke check on the demo Verilog. Requires no physical board.","Print or interactively confirm the cold-POR boot protocol. This is the standalone version of the instructions embedded in `boot-log` and `cclk-sweep`; use it to verify the operator steps before a physical power-cycle.","Patch the raw OSCFSEL field (COR0[22:17]) of a 7-series .bit file.","Generate a set of OSCFSEL variants from a single input .bit file. Outputs one file per requested value to the given directory.","Automated cold-POR CCLK sweep. Generates OSCFSEL variants, programs each to flash, prompts for the physical power-cycle, captures STAT, and writes JSON logs. The only manual step is disconnecting/reconnecting the cable and power-cycling the board.","Read all `build/fpga/boot-log-*.json` files and produce a sweep report identifying the first working CCLK variant.","Print DSLogic / oscilloscope instructions for measuring the FPGA CCLK output during Master SPI configuration. Optionally parse a DSView CSV export or run a live capture via `sigrok-cli` with a connected logic analyzer (e.g., the Digilent FTDI cable as `ftdi-la`).","Read the SPI flash status register via openFPGALoader's JTAG-to-SPI bridge. Decodes WIP, WEL, and QE bits to help diagnose boot-from-flash failures.","Diagnostic: load *only* the proxy bridge bitstream (or any other bitstream) into FPGA SRAM, report STAT, leave TAP in RTI. Does NOT touch SPI flash. Useful for verifying the bridge actually reaches DONE=HIGH before debugging SPI semantics.","Diagnostic: read IDCODE + STAT *without* touching the FPGA. Run this immediately after `tri fpga proxy-load` to confirm the bridge is alive. Also confirms IR=USER1 select is accepted.","Diagnostic: shift raw hex bytes through the USER1 BSCAN as a single SPI transaction. Reads `--rx N` MISO bytes after the TX stream. Requires the proxy bridge to be already loaded (`tri fpga proxy-load` first).","Diagnostic: probe the IR capture pattern after selecting an IR. A healthy 7-series TAP always captures `0b000001` into the IR shift register. Anything else means the JTAG chain is broken or the cable is mis-driving TMS.","Diagnostic: drive the full JEDEC-read flow end-to-end with maximum instrumentation, **including** the 0xAB Release-Power-down and 0x66+0x99 software-reset recovery attempts. Equivalent to `flash-id --verbose` plus auto-recovery.","Build the QMTech XC7A100T-FGG676 JTAG-to-SPI proxy bitstream via the openXC7 open-source toolchain (yosys + nextpnr-himbaechel + prjxray). Requires `yosys`, `nextpnr-himbaechel`, `fasm2frames.py` and `xc7frames2bit` on PATH. With `--install`, the produced `.bit` is copied to `fpga/tools/bscan_spi_xc7a100t.bit` so the embedded `BSCAN_SPI_XC7A100T` constant picks it up on the next rebuild.","Clone the openXC7 `nextpnr-xilinx` repo and build a chipdb (`.bba`) for the requested 7-series part, then install it into `~/.local/share/nextpnr/himbaechel-xilinx/`.","Generate a Lean 4 theorem from a `tri fpga measure-cclk --json` output. The theorem proves that the measured `(frequency, duty)` pair satisfies `measured_cclk_satisfies_flash_spec` and links it to `transaction_satisfies_flash_spec`. Useful for turning a real capture into a machine-checked proof without manual copy-paste.","Print the PVT-derated N25Q128_3V SCK low/high bound for a supplied operating context. Also prints the margin over the nominal 6 ns bound and warns if the context is outside the documented operating envelope.","Build the QMTech XC7A100T-FGG676 proxy bitstream via a Docker container running Xilinx Vivado. Clones our `openFPGALoader` fork (`feat/qmtech-xc7a100t-board`) into `target/openfpgaloader-fork/` and runs `make` inside `spiOverJtag/`. On Apple Silicon (arm64), the container runs under x86_64 emulation via `--platform linux/amd64`. With `--install`, the produced `bscan_spi_xc7a100tfgg676.bit.gz` is decompressed and copied to `fpga/tools/bscan_spi_xc7a100t.bit` and its SHA256 is printed."],"AGENTS":[],"AGENTS_NOTE":"No source binds an agent letter to this command: docs/agents/AGENTS_ALPHABET.md (rows, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name it. creator.md and verifier.md name tri gen/test/verify but are not letter agents.","ARGS":[],"COMMAND":"tri fpga","ENABLED":true,"ENTRY":"cli/tri/src/main.rs","FAMILY":"tri-cli","ID":"tri/fpga","KIND":"tool","SOURCE":"cli/tri/src/fpga.rs","VARIANT":"Commands::Fpga","WHEN_TO_USE":"FPGA programming via the in-tree DLC10 driver (pure Rust).","WITNESS":"source-parse"},"health":"ok","id":"tri/fpga","inSpecCorpus":false,"links":{"config":null,"pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","source":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/cli/tri/src/fpga.rs"},"messages":["no agent letter bound by a source"],"moduleName":"tool_tri_fpga","name":{"en":"tri fpga"},"repo":"gHashTag/t27","searchText":"tri/fpga tri fpga fpga programming via the in-tree dlc10 driver (pure rust). fpga programming via the in-tree dlc10 driver (pure rust). idcode read and print the jtag idcode of the attached dlc10 cable target. idcode-cfg read the configuration idcode register via the type-1 cfg_in/cfg_out protocol. on a healthy xc7a100t this must return 0x13631093 (same as the jtag idcode). if 0x00000000 is returned while `idcode` works, the read_cfg_reg implementation is broken. sram program fpga sram (volatile -- lost on power-cycle). program program the on-board spi flash (non-volatile / persistent). flash-id read the spi flash jedec id via the jtag-to-spi bridge. status read the raw cfg_out status register. debug decode 7-series configuration registers for done=low diagnosis. load-sram load a bitstream into fpga sram using openfpgaloader with a digilent ftdi cable. this is the canonical path for the qmtech wukong v1 / xc7a200t board because the in-tree `dlc10` driver only supports xilinx dlc10 cables (vid=0x03fd), not the attached digilent cable (vid=0x0403:0x6014). stat read and decode the fpga stat register via openfpgaloader. read-xadc read the fpga xadc sensors (temperature, vccint, vccaux) via openfpgaloader and print a json object. the board must be powered and connected through a supported cable such as `digilent_hs2`. synth-gf16 synthesize the gf16 4x4 matrix design through the openxc7 toolchain. output is written to `/gf16_matmul4x4_top.bit`. program-flash program the on-board spi flash (non-volatile) using openfpgaloader's jtag-to-spi bridge. requires a matching `spioverjtag` bitstream for the exact fpga package; the xc7a200t-fgg676 bridge is present in recent openfpgaloader distributions but flash boot may still depend on board mode pins (see docs/reports/fpga_loop_evidence_2026-07-04.md). dump-flash dump spi flash contents to a file via openfpgaloader's jtag-to-spi bridge. bit-config parse the .bit header and print the configuration registers that affect master spi boot (cor0, cor1, wbstar, timer, ctl0, ctl1, idcode, bspi). round-trip-verify program the given .bit to spi flash, dump the same region back, and compare the dumped bytes against the bitstream payload. this verifies the openfpgaloader write path is bit-perfect for the raw bitstream. boot-log guided cold-por boot experiment. programs flash, asks the user to physically power-cycle the board, then captures stat without a jtag reset and prints a decision-tree diagnosis. cold-por deterministic cold-por boot experiment with optional relay control. with `--relay-port mock` the command writes a deterministic, clearly labeled mock boot log so ci can exercise the cold-por json path without touching hardware. real relay ports are reserved for variant a/b. smoke-gate board-less smoke gate for the fpga path. runs `tri fpga bit-config` on the gf16 demo bitstream and, if yosys is available, a synthesis smoke check on the demo verilog. requires no physical board. boot-protocol print or interactively confirm the cold-por boot protocol. this is the standalone version of the instructions embedded in `boot-log` and `cclk-sweep`; use it to verify the operator steps before a physical power-cycle. patch-cor0 patch the raw oscfsel field (cor0[22:17]) of a 7-series .bit file. cclk-variants generate a set of oscfsel variants from a single input .bit file. outputs one file per requested value to the given directory. cclk-sweep automated cold-por cclk sweep. generates oscfsel variants, programs each to flash, prompts for the physical power-cycle, captures stat, and writes json logs. the only manual step is disconnecting/reconnecting the cable and power-cycling the board. sweep-report read all `build/fpga/boot-log-*.json` files and produce a sweep report identifying the first working cclk variant. measure-cclk print dslogic / oscilloscope instructions for measuring the fpga cclk output during master spi configuration. optionally parse a dsview csv export or run a live capture via `sigrok-cli` with a connected logic analyzer (e.g., the digilent ftdi cable as `ftdi-la`). flash-status read the spi flash status register via openfpgaloader's jtag-to-spi bridge. decodes wip, wel, and qe bits to help diagnose boot-from-flash failures. proxy-load diagnostic: load *only* the proxy bridge bitstream (or any other bitstream) into fpga sram, report stat, leave tap in rti. does not touch spi flash. useful for verifying the bridge actually reaches done=high before debugging spi semantics. proxy-status diagnostic: read idcode + stat *without* touching the fpga. run this immediately after `tri fpga proxy-load` to confirm the bridge is alive. also confirms ir=user1 select is accepted. spi-raw diagnostic: shift raw hex bytes through the user1 bscan as a single spi transaction. reads `--rx n` miso bytes after the tx stream. requires the proxy bridge to be already loaded (`tri fpga proxy-load` first). ir-probe diagnostic: probe the ir capture pattern after selecting an ir. a healthy 7-series tap always captures `0b000001` into the ir shift register. anything else means the jtag chain is broken or the cable is mis-driving tms. flash-id-debug diagnostic: drive the full jedec-read flow end-to-end with maximum instrumentation, **including** the 0xab release-power-down and 0x66+0x99 software-reset recovery attempts. equivalent to `flash-id --verbose` plus auto-recovery. build-proxy build the qmtech xc7a100t-fgg676 jtag-to-spi proxy bitstream via the openxc7 open-source toolchain (yosys + nextpnr-himbaechel + prjxray). requires `yosys`, `nextpnr-himbaechel`, `fasm2frames.py` and `xc7frames2bit` on path. with `--install`, the produced `.bit` is copied to `fpga/tools/bscan_spi_xc7a100t.bit` so the embedded `bscan_spi_xc7a100t` constant picks it up on the next rebuild. setup-openxc7-chipdb clone the openxc7 `nextpnr-xilinx` repo and build a chipdb (`.bba`) for the requested 7-series part, then install it into `~/.local/share/nextpnr/himbaechel-xilinx/`. measured-to-lean generate a lean 4 theorem from a `tri fpga measure-cclk --json` output. the theorem proves that the measured `(frequency, duty)` pair satisfies `measured_cclk_satisfies_flash_spec` and links it to `transaction_satisfies_flash_spec`. useful for turning a real capture into a machine-checked proof without manual copy-paste. pvt-envelope print the pvt-derated n25q128_3v sck low/high bound for a supplied operating context. also prints the margin over the nominal 6 ns bound and warns if the context is outside the documented operating envelope. build-proxy-docker build the qmtech xc7a100t-fgg676 proxy bitstream via a docker container running xilinx vivado. clones our `openfpgaloader` fork (`feat/qmtech-xc7a100t-board`) into `target/openfpgaloader-fork/` and runs `make` inside `spioverjtag/`. on apple silicon (arm64), the container runs under x86_64 emulation via `--platform linux/amd64`. with `--install`, the produced `bscan_spi_xc7a100tfgg676.bit.gz` is decompressed and copied to `fpga/tools/bscan_spi_xc7a100t.bit` and its sha256 is printed.","sha256":"76b94a13e86c669af89b2bb22a107e970c2ce005fadacce9ddb898b4f897894d","skills":[],"source":"cli/tri/src/fpga.rs","specPath":"specs/tools/tri/fpga.t27","summary":{"en":"FPGA programming via the in-tree DLC10 driver (pure Rust).","ru":"Программирование FPGA через встроенный драйвер DLC10 (чистый Rust)."},"typecheckOk":true,"variant":"Commands::Fpga","whenToUse":"FPGA programming via the in-tree DLC10 driver (pure Rust).","witness":"source-parse"},{"aboutSource":"clap /// doc on Commands::Gates (cli/tri/src/main.rs; module cli/tri/src/gates.rs)","actions":[{"about":"Classify the compiler's own warnings. `rustc` already answers \"is this value ever read\" and \"does anything call this\" for the whole crate; the answer only helps if somebody reads it.","name":"warnings"},{"about":"Run every gate script and its negative control; name the ones with none.","name":"sweep"},{"about":"Break each gate's failure path and demand its control notices.","name":"mutate"},{"about":"Open pull requests whose path-filtered CI never ran.","name":"prs"},{"about":"What the tree says is required, against what the ruleset requires.","name":"preview"},{"about":"Which interpreter each gate step is handed to, and who says so.","name":"shell"},{"about":"Gate steps whose PASS is reachable with the thing they check absent.","name":"quiet"},{"about":"Every bounded GitHub fetch in this crate, and whether it can tell a page from a total.","name":"fetches"},{"about":"Run every gate CI runs, in an EMPTY tree, and report what still passes.","name":"empty"},{"about":"","name":"required"},{"about":"List active workflows whose lifetime success count is zero.","name":"dead"},{"about":"Workflows with no recent run on the default branch: their green is about frequency, not health.","name":"tests"},{"about":"","name":"unmeasured"}],"agents":[],"args":[],"command":"tri gates","discarded":0,"entry":"cli/tri/src/main.rs","family":"tri-cli","fields":{"ABOUT":"Find workflows that have never once succeeded.","ABOUT_SOURCE":"clap /// doc on Commands::Gates (cli/tri/src/main.rs; module cli/tri/src/gates.rs)","ACTIONS":["warnings","sweep","mutate","prs","preview","shell","quiet","fetches","empty","required","dead","tests","unmeasured"],"ACTIONS_ABOUT":["Classify the compiler's own warnings. `rustc` already answers \"is this value ever read\" and \"does anything call this\" for the whole crate; the answer only helps if somebody reads it.","Run every gate script and its negative control; name the ones with none.","Break each gate's failure path and demand its control notices.","Open pull requests whose path-filtered CI never ran.","What the tree says is required, against what the ruleset requires.","Which interpreter each gate step is handed to, and who says so.","Gate steps whose PASS is reachable with the thing they check absent.","Every bounded GitHub fetch in this crate, and whether it can tell a page from a total.","Run every gate CI runs, in an EMPTY tree, and report what still passes.","","List active workflows whose lifetime success count is zero.","Workflows with no recent run on the default branch: their green is about frequency, not health.",""],"AGENTS":[],"AGENTS_NOTE":"No source binds an agent letter to this command: docs/agents/AGENTS_ALPHABET.md (rows, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name it. creator.md and verifier.md name tri gen/test/verify but are not letter agents.","ARGS":[],"COMMAND":"tri gates","ENABLED":true,"ENTRY":"cli/tri/src/main.rs","FAMILY":"tri-cli","ID":"tri/gates","KIND":"tool","SOURCE":"cli/tri/src/gates.rs","VARIANT":"Commands::Gates","WHEN_TO_USE":"Find workflows that have never once succeeded.","WITNESS":"source-parse"},"health":"ok","id":"tri/gates","inSpecCorpus":false,"links":{"config":null,"pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","source":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/cli/tri/src/gates.rs"},"messages":["no agent letter bound by a source"],"moduleName":"tool_tri_gates","name":{"en":"tri gates"},"repo":"gHashTag/t27","searchText":"tri/gates tri gates find workflows that have never once succeeded. find workflows that have never once succeeded. warnings classify the compiler's own warnings. `rustc` already answers \"is this value ever read\" and \"does anything call this\" for the whole crate; the answer only helps if somebody reads it. sweep run every gate script and its negative control; name the ones with none. mutate break each gate's failure path and demand its control notices. prs open pull requests whose path-filtered ci never ran. preview what the tree says is required, against what the ruleset requires. shell which interpreter each gate step is handed to, and who says so. quiet gate steps whose pass is reachable with the thing they check absent. fetches every bounded github fetch in this crate, and whether it can tell a page from a total. empty run every gate ci runs, in an empty tree, and report what still passes. required dead list active workflows whose lifetime success count is zero. tests workflows with no recent run on the default branch: their green is about frequency, not health. unmeasured","sha256":"f06a8ab87192f76f5716eca9ddf70f7de4e44867e8f905dd749d00f2d5add6e7","skills":[],"source":"cli/tri/src/gates.rs","specPath":"specs/tools/tri/gates.t27","summary":{"en":"Find workflows that have never once succeeded.","ru":"Находит воркфлоу, которые ни разу не завершались успешно."},"typecheckOk":true,"variant":"Commands::Gates","whenToUse":"Find workflows that have never once succeeded.","witness":"source-parse"},{"aboutSource":"tri-mcp tool tri_gen description (cli/tri-mcp/src/main.rs); handler cmd_gen runs t27c gen-verilog, gen-c, gen-rust (cli/tri/src/main.rs:862)","actions":[],"agents":[{"letter":"C","ok":true},{"letter":"T","ok":true}],"args":[{"about":"","name":""}],"command":"tri gen","discarded":0,"entry":"cli/tri/src/main.rs","family":"tri-cli","fields":{"ABOUT":"Generates backends from a .t27 spec file using t27c.","ABOUT_SOURCE":"tri-mcp tool tri_gen description (cli/tri-mcp/src/main.rs); handler cmd_gen runs t27c gen-verilog, gen-c, gen-rust (cli/tri/src/main.rs:862)","ACTIONS":[],"ACTIONS_ABOUT":[],"AGENTS":["C","T"],"AGENTS_NOTE":".claude/agents/agent-c-compiler.md:40 (tri gen -- Generate code from specs; trigger On tri gen command, line 7); .claude/agents/trinity.md:68 (5. Gen - Run tri gen).","ARGS":[""],"COMMAND":"tri gen","ENABLED":true,"ENTRY":"cli/tri/src/main.rs","FAMILY":"tri-cli","ID":"tri/gen","KIND":"tool","SOURCE":"cli/tri/src/main.rs","VARIANT":"Commands::Gen","WHEN_TO_USE":"Generates backends from a .t27 spec file using t27c.","WITNESS":"source-parse"},"health":"ok","id":"tri/gen","inSpecCorpus":false,"links":{"config":null,"pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","source":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/cli/tri/src/main.rs"},"messages":[],"moduleName":"tool_tri_gen","name":{"en":"tri gen"},"repo":"gHashTag/t27","searchText":"tri/gen tri gen generates backends from a .t27 spec file using t27c. generates backends from a .t27 spec file using t27c. c t","sha256":"10580699229ea38d3d7ba8c0bb30c02615f30031a129d498433c5542da5856fb","skills":[{"id":"t27/tri","via":["SUMMARY_EN"]}],"source":"cli/tri/src/main.rs","specPath":"specs/tools/tri/gen.t27","summary":{"en":"Generates backends from a .t27 spec file using t27c.","ru":"Генерирует бэкенды из файла спецификации .t27 через t27c."},"typecheckOk":true,"variant":"Commands::Gen","whenToUse":"Generates backends from a .t27 spec file using t27c.","witness":"source-parse"},{"aboutSource":"clap /// doc on Commands::Harness (cli/tri/src/main.rs)","actions":[{"about":"Test binaries whose tests share one scratch directory.","name":"scratch"}],"agents":[],"args":[],"command":"tri harness","discarded":0,"entry":"cli/tri/src/main.rs","family":"tri-cli","fields":{"ABOUT":"Source files no crate root reaches, and so nothing compiles. Test-harness hygiene.","ABOUT_SOURCE":"clap /// doc on Commands::Harness (cli/tri/src/main.rs)","ACTIONS":["scratch"],"ACTIONS_ABOUT":["Test binaries whose tests share one scratch directory."],"AGENTS":[],"AGENTS_NOTE":"No source binds an agent letter to this command: docs/agents/AGENTS_ALPHABET.md (rows, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name it. creator.md and verifier.md name tri gen/test/verify but are not letter agents.","ARGS":[],"COMMAND":"tri harness","ENABLED":true,"ENTRY":"cli/tri/src/main.rs","FAMILY":"tri-cli","ID":"tri/harness","KIND":"tool","SOURCE":"cli/tri/src/main.rs","VARIANT":"Commands::Harness","WHEN_TO_USE":"Source files no crate root reaches, and so nothing compiles. Test-harness hygiene.","WITNESS":"source-parse"},"health":"ok","id":"tri/harness","inSpecCorpus":false,"links":{"config":null,"pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","source":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/cli/tri/src/main.rs"},"messages":["no agent letter bound by a source"],"moduleName":"tool_tri_harness","name":{"en":"tri harness"},"repo":"gHashTag/t27","searchText":"tri/harness tri harness source files no crate root reaches, and so nothing compiles. test-harness hygiene. source files no crate root reaches, and so nothing compiles. test-harness hygiene. scratch test binaries whose tests share one scratch directory.","sha256":"cbed467027683c2eaf5c7aed85df4831973b4566aa88a1a1260fe098d6be9d18","skills":[],"source":"cli/tri/src/main.rs","specPath":"specs/tools/tri/harness.t27","summary":{"en":"Source files no crate root reaches, and so nothing compiles. Test-harness hygiene.","ru":"Исходные файлы, до которых не доходит ни один корень крейта, и потому ничего не компилируется. Гигиена тестового харнесса."},"typecheckOk":true,"variant":"Commands::Harness","whenToUse":"Source files no crate root reaches, and so nothing compiles. Test-harness hygiene.","witness":"source-parse"},{"aboutSource":"tri-mcp tool tri_health description (cli/tri-mcp/src/main.rs); handler cmd_health reads .trinity/state/queen-health.json (cli/tri/src/main.rs:969)","actions":[],"agents":[],"args":[{"about":"","name":""}],"command":"tri health","discarded":0,"entry":"cli/tri/src/main.rs","family":"tri-cli","fields":{"ABOUT":"Returns queen and swarm health status from .trinity state.","ABOUT_SOURCE":"tri-mcp tool tri_health description (cli/tri-mcp/src/main.rs); handler cmd_health reads .trinity/state/queen-health.json (cli/tri/src/main.rs:969)","ACTIONS":[],"ACTIONS_ABOUT":[],"AGENTS":[],"AGENTS_NOTE":"No source binds an agent letter to this command: docs/agents/AGENTS_ALPHABET.md (rows, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name it. creator.md and verifier.md name tri gen/test/verify but are not letter agents.","ARGS":[""],"COMMAND":"tri health","ENABLED":true,"ENTRY":"cli/tri/src/main.rs","FAMILY":"tri-cli","ID":"tri/health","KIND":"tool","SOURCE":"cli/tri/src/main.rs","VARIANT":"Commands::Health","WHEN_TO_USE":"Returns queen and swarm health status from .trinity state.","WITNESS":"source-parse"},"health":"ok","id":"tri/health","inSpecCorpus":false,"links":{"config":null,"pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","source":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/cli/tri/src/main.rs"},"messages":["no agent letter bound by a source"],"moduleName":"tool_tri_health","name":{"en":"tri health"},"repo":"gHashTag/t27","searchText":"tri/health tri health returns queen and swarm health status from .trinity state. returns queen and swarm health status from .trinity state.","sha256":"b6895b30462b00ceb9464cdbee1de70175a32fca0ca7aa317ada5e79bcd0c7bd","skills":[],"source":"cli/tri/src/main.rs","specPath":"specs/tools/tri/health.t27","summary":{"en":"Returns queen and swarm health status from .trinity state.","ru":"Показывает состояние здоровья королевы и роя из состояния .trinity."},"typecheckOk":true,"variant":"Commands::Health","whenToUse":"Returns queen and swarm health status from .trinity state.","witness":"source-parse"},{"aboutSource":"clap /// doc on Commands::Hooks (cli/tri/src/main.rs; module cli/tri/src/hooks.rs)","actions":[{"about":"Run every migrated commit-time gate in sequence (l1-check + now-gate).","name":"pre-commit"},{"about":"A pull request whose title claims a compiler fix must carry a source file.","name":"fix-carries-source"},{"about":"Ask the required NOW gate's own script whether this push adds an entry.","name":"pre-push"},{"about":"L1 TRACEABILITY over the message BEING WRITTEN, from the commit-msg hook.","name":"commit-msg"},{"about":"L1 TRACEABILITY: last commit message must reference an issue (`Closes #N` / `Fixes #N` / `Resolves #N` / `Reference #N`).","name":"l1-check"},{"about":"Verify a fresh `docs/now/-.md` entry exists.","name":"now-gate"},{"about":"Session-start guard for the Claude Code harness. Emits a one-line status string to stdout; never blocks (the Bash gate is a soft telemetry hook).","name":"session-gate"},{"about":"Which hooks git will actually run, and whose installer output is dead.","name":"status"}],"agents":[],"args":[],"command":"tri hooks","discarded":0,"entry":"cli/tri/src/main.rs","family":"tri-cli","fields":{"ABOUT":"Pure-Rust ports of repository commit / push gates.","ABOUT_SOURCE":"clap /// doc on Commands::Hooks (cli/tri/src/main.rs; module cli/tri/src/hooks.rs)","ACTIONS":["pre-commit","fix-carries-source","pre-push","commit-msg","l1-check","now-gate","session-gate","status"],"ACTIONS_ABOUT":["Run every migrated commit-time gate in sequence (l1-check + now-gate).","A pull request whose title claims a compiler fix must carry a source file.","Ask the required NOW gate's own script whether this push adds an entry.","L1 TRACEABILITY over the message BEING WRITTEN, from the commit-msg hook.","L1 TRACEABILITY: last commit message must reference an issue (`Closes #N` / `Fixes #N` / `Resolves #N` / `Reference #N`).","Verify a fresh `docs/now/-.md` entry exists.","Session-start guard for the Claude Code harness. Emits a one-line status string to stdout; never blocks (the Bash gate is a soft telemetry hook).","Which hooks git will actually run, and whose installer output is dead."],"AGENTS":[],"AGENTS_NOTE":"No source binds an agent letter to this command: docs/agents/AGENTS_ALPHABET.md (rows, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name it. creator.md and verifier.md name tri gen/test/verify but are not letter agents.","ARGS":[],"COMMAND":"tri hooks","ENABLED":true,"ENTRY":"cli/tri/src/main.rs","FAMILY":"tri-cli","ID":"tri/hooks","KIND":"tool","SOURCE":"cli/tri/src/hooks.rs","VARIANT":"Commands::Hooks","WHEN_TO_USE":"Pure-Rust ports of repository commit / push gates.","WITNESS":"source-parse"},"health":"ok","id":"tri/hooks","inSpecCorpus":false,"links":{"config":null,"pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","source":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/cli/tri/src/hooks.rs"},"messages":["no agent letter bound by a source"],"moduleName":"tool_tri_hooks","name":{"en":"tri hooks"},"repo":"gHashTag/t27","searchText":"tri/hooks tri hooks pure-rust ports of repository commit / push gates. pure-rust ports of repository commit / push gates. pre-commit run every migrated commit-time gate in sequence (l1-check + now-gate). fix-carries-source a pull request whose title claims a compiler fix must carry a source file. pre-push ask the required now gate's own script whether this push adds an entry. commit-msg l1 traceability over the message being written, from the commit-msg hook. l1-check l1 traceability: last commit message must reference an issue (`closes #n` / `fixes #n` / `resolves #n` / `reference #n`). now-gate verify a fresh `docs/now/-.md` entry exists. session-gate session-start guard for the claude code harness. emits a one-line status string to stdout; never blocks (the bash gate is a soft telemetry hook). status which hooks git will actually run, and whose installer output is dead.","sha256":"0c379cfafdd10d47e0f71f2b72000fc2206fd18575f5c8b3718d4a7455116198","skills":[],"source":"cli/tri/src/hooks.rs","specPath":"specs/tools/tri/hooks.t27","summary":{"en":"Pure-Rust ports of repository commit / push gates.","ru":"Порты гейтов коммита/пуша репозитория на чистом Rust."},"typecheckOk":true,"variant":"Commands::Hooks","whenToUse":"Pure-Rust ports of repository commit / push gates.","witness":"source-parse"},{"aboutSource":"clap /// doc on Commands::Issues (cli/tri/src/main.rs; module cli/tri/src/issues.rs)","actions":[{"about":"Open issues whose title calls a workflow red, and what it does today.","name":"stale"},{"about":"Open issues that state a COUNT in the title, and a reproducible sample.","name":"numbers"},{"about":"Open issues whose figure is ANCHORED, so re-measuring it proves nothing.","name":"dated"}],"agents":[],"args":[],"command":"tri issues","discarded":0,"entry":"cli/tri/src/main.rs","family":"tri-cli","fields":{"ABOUT":"Open issues whose headline calls a workflow red, against what that workflow concludes on master today.","ABOUT_SOURCE":"clap /// doc on Commands::Issues (cli/tri/src/main.rs; module cli/tri/src/issues.rs)","ACTIONS":["stale","numbers","dated"],"ACTIONS_ABOUT":["Open issues whose title calls a workflow red, and what it does today.","Open issues that state a COUNT in the title, and a reproducible sample.","Open issues whose figure is ANCHORED, so re-measuring it proves nothing."],"AGENTS":[],"AGENTS_NOTE":"No source binds an agent letter to this command: docs/agents/AGENTS_ALPHABET.md (rows, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name it. creator.md and verifier.md name tri gen/test/verify but are not letter agents.","ARGS":[],"COMMAND":"tri issues","ENABLED":true,"ENTRY":"cli/tri/src/main.rs","FAMILY":"tri-cli","ID":"tri/issues","KIND":"tool","SOURCE":"cli/tri/src/issues.rs","VARIANT":"Commands::Issues","WHEN_TO_USE":"Open issues whose headline calls a workflow red, against what that workflow concludes on master today.","WITNESS":"source-parse"},"health":"ok","id":"tri/issues","inSpecCorpus":false,"links":{"config":null,"pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","source":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/cli/tri/src/issues.rs"},"messages":["no agent letter bound by a source"],"moduleName":"tool_tri_issues","name":{"en":"tri issues"},"repo":"gHashTag/t27","searchText":"tri/issues tri issues open issues whose headline calls a workflow red, against what that workflow concludes on master today. open issues whose headline calls a workflow red, against what that workflow concludes on master today. stale open issues whose title calls a workflow red, and what it does today. numbers open issues that state a count in the title, and a reproducible sample. dated open issues whose figure is anchored, so re-measuring it proves nothing.","sha256":"553dd69fc425dc972f528162cc7a7b7a51cb3426639ebe1e549fb71cff3ec4de","skills":[],"source":"cli/tri/src/issues.rs","specPath":"specs/tools/tri/issues.t27","summary":{"en":"Open issues whose headline calls a workflow red, against what that workflow concludes on master today.","ru":"Открытые issue, чей заголовок называет воркфлоу красным, против того, к чему этот воркфлоу приходит на master сегодня."},"typecheckOk":true,"variant":"Commands::Issues","whenToUse":"Open issues whose headline calls a workflow red, against what that workflow concludes on master today.","witness":"source-parse"},{"aboutSource":"clap /// doc on Commands::Jumps (cli/tri/src/main.rs; module cli/tri/src/jumps.rs)","actions":[{"about":"Name every `break`/`continue` site in the generated Verilog and say what it lowered to.","name":"census"}],"agents":[],"args":[],"command":"tri jumps","discarded":0,"entry":"cli/tri/src/main.rs","family":"tri-cli","fields":{"ABOUT":"What happened to every `break` and `continue` the Verilog emitter had to lower?","ABOUT_SOURCE":"clap /// doc on Commands::Jumps (cli/tri/src/main.rs; module cli/tri/src/jumps.rs)","ACTIONS":["census"],"ACTIONS_ABOUT":["Name every `break`/`continue` site in the generated Verilog and say what it lowered to."],"AGENTS":[],"AGENTS_NOTE":"No source binds an agent letter to this command: docs/agents/AGENTS_ALPHABET.md (rows, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name it. creator.md and verifier.md name tri gen/test/verify but are not letter agents.","ARGS":[],"COMMAND":"tri jumps","ENABLED":true,"ENTRY":"cli/tri/src/main.rs","FAMILY":"tri-cli","ID":"tri/jumps","KIND":"tool","SOURCE":"cli/tri/src/jumps.rs","VARIANT":"Commands::Jumps","WHEN_TO_USE":"What happened to every `break` and `continue` the Verilog emitter had to lower? `break` was `disable fork;` and `continue` was `/* continue */;`. Both parse, both synthesise, both are no-ops -- so every instrument that asks whether the output PARSES said yes for as long as the emitter has existed. See #2988.","WITNESS":"source-parse"},"health":"ok","id":"tri/jumps","inSpecCorpus":false,"links":{"config":null,"pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","source":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/cli/tri/src/jumps.rs"},"messages":["no agent letter bound by a source"],"moduleName":"tool_tri_jumps","name":{"en":"tri jumps"},"repo":"gHashTag/t27","searchText":"tri/jumps tri jumps what happened to every `break` and `continue` the verilog emitter had to lower? what happened to every `break` and `continue` the verilog emitter had to lower? `break` was `disable fork;` and `continue` was `/* continue */;`. both parse, both synthesise, both are no-ops -- so every instrument that asks whether the output parses said yes for as long as the emitter has existed. see #2988. census name every `break`/`continue` site in the generated verilog and say what it lowered to.","sha256":"ad33faaeee303dbf14e3e97a28570b00a8501d910f45676c3d8838b1de42dd3f","skills":[],"source":"cli/tri/src/jumps.rs","specPath":"specs/tools/tri/jumps.t27","summary":{"en":"What happened to every `break` and `continue` the Verilog emitter had to lower?","ru":"Что случилось с каждым `break` и `continue`, которые эмиттеру Verilog пришлось опустить?"},"typecheckOk":true,"variant":"Commands::Jumps","whenToUse":"What happened to every `break` and `continue` the Verilog emitter had to lower? `break` was `disable fork;` and `continue` was `/* continue */;`. Both parse, both synthesise, both are no-ops -- so every instrument that asks whether the output PARSES said yes for as long as the emitter has existed. See #2988.","witness":"source-parse"},{"aboutSource":"clap /// doc on Commands::Kinds (cli/tri/src/main.rs; module cli/tri/src/kinddrift.rs)","actions":[{"about":"Match arms whose comment names a construct the pattern does not cover.","name":"drift"}],"agents":[],"args":[],"command":"tri kinds","discarded":0,"entry":"cli/tri/src/main.rs","family":"tri-cli","fields":{"ABOUT":"Match arms whose own comment names a case the pattern omits.","ABOUT_SOURCE":"clap /// doc on Commands::Kinds (cli/tri/src/main.rs; module cli/tri/src/kinddrift.rs)","ACTIONS":["drift"],"ACTIONS_ABOUT":["Match arms whose comment names a construct the pattern does not cover."],"AGENTS":[],"AGENTS_NOTE":"No source binds an agent letter to this command: docs/agents/AGENTS_ALPHABET.md (rows, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name it. creator.md and verifier.md name tri gen/test/verify but are not letter agents.","ARGS":[],"COMMAND":"tri kinds","ENABLED":true,"ENTRY":"cli/tri/src/main.rs","FAMILY":"tri-cli","ID":"tri/kinds","KIND":"tool","SOURCE":"cli/tri/src/kinddrift.rs","VARIANT":"Commands::Kinds","WHEN_TO_USE":"Match arms whose own comment names a case the pattern omits.","WITNESS":"source-parse"},"health":"ok","id":"tri/kinds","inSpecCorpus":false,"links":{"config":null,"pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","source":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/cli/tri/src/kinddrift.rs"},"messages":["no agent letter bound by a source"],"moduleName":"tool_tri_kinds","name":{"en":"tri kinds"},"repo":"gHashTag/t27","searchText":"tri/kinds tri kinds match arms whose own comment names a case the pattern omits. match arms whose own comment names a case the pattern omits. drift match arms whose comment names a construct the pattern does not cover.","sha256":"a0544b6d5a3f35a7dbd640999611d323884d4e934bbf7df9aa6cb3b94aa18ab7","skills":[],"source":"cli/tri/src/kinddrift.rs","specPath":"specs/tools/tri/kinds.t27","summary":{"en":"Match arms whose own comment names a case the pattern omits.","ru":"Ветви match, чей собственный комментарий называет случай, который паттерн пропускает."},"typecheckOk":true,"variant":"Commands::Kinds","whenToUse":"Match arms whose own comment names a case the pattern omits.","witness":"source-parse"},{"aboutSource":"clap /// doc on Commands::Lean (cli/tri/src/main.rs; module cli/tri/src/leanvac.rs)","actions":[{"about":"Completeness theorems whose model has no functions.","name":"vacuous"},{"about":"Proof files the build root does not reach, and so nothing compiles.","name":"reach"}],"agents":[],"args":[],"command":"tri lean","discarded":0,"entry":"cli/tri/src/main.rs","family":"tri-cli","fields":{"ABOUT":"Completeness theorems whose Lean model is empty.","ABOUT_SOURCE":"clap /// doc on Commands::Lean (cli/tri/src/main.rs; module cli/tri/src/leanvac.rs)","ACTIONS":["vacuous","reach"],"ACTIONS_ABOUT":["Completeness theorems whose model has no functions.","Proof files the build root does not reach, and so nothing compiles."],"AGENTS":[],"AGENTS_NOTE":"No source binds an agent letter to this command: docs/agents/AGENTS_ALPHABET.md (rows, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name it. creator.md and verifier.md name tri gen/test/verify but are not letter agents.","ARGS":[],"COMMAND":"tri lean","ENABLED":true,"ENTRY":"cli/tri/src/main.rs","FAMILY":"tri-cli","ID":"tri/lean","KIND":"tool","SOURCE":"cli/tri/src/leanvac.rs","VARIANT":"Commands::Lean","WHEN_TO_USE":"Completeness theorems whose Lean model is empty.","WITNESS":"source-parse"},"health":"ok","id":"tri/lean","inSpecCorpus":false,"links":{"config":null,"pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","source":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/cli/tri/src/leanvac.rs"},"messages":["no agent letter bound by a source"],"moduleName":"tool_tri_lean","name":{"en":"tri lean"},"repo":"gHashTag/t27","searchText":"tri/lean tri lean completeness theorems whose lean model is empty. completeness theorems whose lean model is empty. vacuous completeness theorems whose model has no functions. reach proof files the build root does not reach, and so nothing compiles.","sha256":"3095224388c11fa7d4bd2293503cbb82b52aa91ec2661808d4f8ddc195e458d6","skills":[],"source":"cli/tri/src/leanvac.rs","specPath":"specs/tools/tri/lean.t27","summary":{"en":"Completeness theorems whose Lean model is empty.","ru":"Теоремы полноты, у которых модель Lean пуста."},"typecheckOk":true,"variant":"Commands::Lean","whenToUse":"Completeness theorems whose Lean model is empty.","witness":"source-parse"},{"aboutSource":"clap /// doc on Commands::Ledgers (cli/tri/src/main.rs; module cli/tri/src/ledgers.rs)","actions":[{"about":"Plant a stale entry in each ledger and demand its gate fail.","name":"audit"}],"agents":[],"args":[],"command":"tri ledgers","discarded":0,"entry":"cli/tri/src/main.rs","family":"tri-cli","fields":{"ABOUT":"Does each ledger's gate notice when one of its entries stops being true?","ABOUT_SOURCE":"clap /// doc on Commands::Ledgers (cli/tri/src/main.rs; module cli/tri/src/ledgers.rs)","ACTIONS":["audit"],"ACTIONS_ABOUT":["Plant a stale entry in each ledger and demand its gate fail."],"AGENTS":[],"AGENTS_NOTE":"No source binds an agent letter to this command: docs/agents/AGENTS_ALPHABET.md (rows, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name it. creator.md and verifier.md name tri gen/test/verify but are not letter agents.","ARGS":[],"COMMAND":"tri ledgers","ENABLED":true,"ENTRY":"cli/tri/src/main.rs","FAMILY":"tri-cli","ID":"tri/ledgers","KIND":"tool","SOURCE":"cli/tri/src/ledgers.rs","VARIANT":"Commands::Ledgers","WHEN_TO_USE":"Does each ledger's gate notice when one of its entries stops being true?","WITNESS":"source-parse"},"health":"ok","id":"tri/ledgers","inSpecCorpus":false,"links":{"config":null,"pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","source":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/cli/tri/src/ledgers.rs"},"messages":["no agent letter bound by a source"],"moduleName":"tool_tri_ledgers","name":{"en":"tri ledgers"},"repo":"gHashTag/t27","searchText":"tri/ledgers tri ledgers does each ledger's gate notice when one of its entries stops being true? does each ledger's gate notice when one of its entries stops being true? audit plant a stale entry in each ledger and demand its gate fail.","sha256":"633ebfab055dc7246ffaa0c3385679fc76bd42f908ad039a02de30ee1c6b3380","skills":[],"source":"cli/tri/src/ledgers.rs","specPath":"specs/tools/tri/ledgers.t27","summary":{"en":"Does each ledger's gate notice when one of its entries stops being true?","ru":"Замечает ли гейт каждого леджера, когда одна из его записей перестаёт быть истинной?"},"typecheckOk":true,"variant":"Commands::Ledgers","whenToUse":"Does each ledger's gate notice when one of its entries stops being true?","witness":"source-parse"},{"aboutSource":"clap /// doc on Commands::Loop (cli/tri/src/main.rs; module cli/tri/src/loopclaim.rs)","actions":[{"about":"Take the named claim, or say who already holds it.","name":"claim"}],"agents":[],"args":[],"command":"tri loop","discarded":0,"entry":"cli/tri/src/main.rs","family":"tri-cli","fields":{"ABOUT":"What is failing on the default branch right now, and since when. Take a named claim so two sessions of the loop cannot pick the same task.","ABOUT_SOURCE":"clap /// doc on Commands::Loop (cli/tri/src/main.rs; module cli/tri/src/loopclaim.rs)","ACTIONS":["claim"],"ACTIONS_ABOUT":["Take the named claim, or say who already holds it."],"AGENTS":[],"AGENTS_NOTE":"No source binds an agent letter to this command: docs/agents/AGENTS_ALPHABET.md (rows, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name it. creator.md and verifier.md name tri gen/test/verify but are not letter agents.","ARGS":[],"COMMAND":"tri loop","ENABLED":true,"ENTRY":"cli/tri/src/main.rs","FAMILY":"tri-cli","ID":"tri/loop","KIND":"tool","SOURCE":"cli/tri/src/loopclaim.rs","VARIANT":"Commands::Loop","WHEN_TO_USE":"What is failing on the default branch right now, and since when. Take a named claim so two sessions of the loop cannot pick the same task.","WITNESS":"source-parse"},"health":"ok","id":"tri/loop","inSpecCorpus":false,"links":{"config":null,"pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","source":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/cli/tri/src/loopclaim.rs"},"messages":["no agent letter bound by a source"],"moduleName":"tool_tri_loop","name":{"en":"tri loop"},"repo":"gHashTag/t27","searchText":"tri/loop tri loop what is failing on the default branch right now, and since when. take a named claim so two sessions of the loop cannot pick the same task. what is failing on the default branch right now, and since when. take a named claim so two sessions of the loop cannot pick the same task. claim take the named claim, or say who already holds it.","sha256":"c4ad96d74fe3dfed11c52bc2dc74c2002bf8d3081532785c58008ba991f87875","skills":[],"source":"cli/tri/src/loopclaim.rs","specPath":"specs/tools/tri/loop.t27","summary":{"en":"What is failing on the default branch right now, and since when. Take a named claim so two sessions of the loop cannot pick the same task.","ru":"Что падает на ветке по умолчанию прямо сейчас и с какого момента. Берёт именованную заявку, чтобы две сессии лупа не взяли одну задачу."},"typecheckOk":true,"variant":"Commands::Loop","whenToUse":"What is failing on the default branch right now, and since when. Take a named claim so two sessions of the loop cannot pick the same task.","witness":"source-parse"},{"aboutSource":"clap /// doc on Commands::Merging (cli/tri/src/main.rs; module cli/tri/src/inflight.rs)","actions":[],"agents":[],"args":[{"about":"The base this branch is supposed to carry. A ref, not a URL.","name":"--base"},{"about":"Also check the commits behind HEAD, not only HEAD itself.","name":"--depth"}],"command":"tri merging","discarded":0,"entry":"cli/tri/src/main.rs","family":"tri-cli","fields":{"ABOUT":"Is a merge in flight here, and does this branch carry the base?","ABOUT_SOURCE":"clap /// doc on Commands::Merging (cli/tri/src/main.rs; module cli/tri/src/inflight.rs)","ACTIONS":[],"ACTIONS_ABOUT":[],"AGENTS":[],"AGENTS_NOTE":"No source binds an agent letter to this command: docs/agents/AGENTS_ALPHABET.md (rows, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name it. creator.md and verifier.md name tri gen/test/verify but are not letter agents.","ARGS":["--base: The base this branch is supposed to carry. A ref, not a URL.","--depth: Also check the commits behind HEAD, not only HEAD itself."],"COMMAND":"tri merging","ENABLED":true,"ENTRY":"cli/tri/src/main.rs","FAMILY":"tri-cli","ID":"tri/merging","KIND":"tool","SOURCE":"cli/tri/src/inflight.rs","VARIANT":"Commands::Merging","WHEN_TO_USE":"Is a merge in flight here, and does this branch carry the base?","WITNESS":"source-parse"},"health":"ok","id":"tri/merging","inSpecCorpus":false,"links":{"config":null,"pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","source":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/cli/tri/src/inflight.rs"},"messages":["no agent letter bound by a source"],"moduleName":"tool_tri_merging","name":{"en":"tri merging"},"repo":"gHashTag/t27","searchText":"tri/merging tri merging is a merge in flight here, and does this branch carry the base? is a merge in flight here, and does this branch carry the base?","sha256":"9f4a1948be3e3357ee168222efb6370a0807b7dd5e74932c4e7142b14a8e4eec","skills":[],"source":"cli/tri/src/inflight.rs","specPath":"specs/tools/tri/merging.t27","summary":{"en":"Is a merge in flight here, and does this branch carry the base?","ru":"Идёт ли здесь мерж, и несёт ли эта ветка базу?"},"typecheckOk":true,"variant":"Commands::Merging","whenToUse":"Is a merge in flight here, and does this branch carry the base?","witness":"source-parse"},{"aboutSource":"clap /// doc on Commands::Misread (cli/tri/src/main.rs; module cli/tri/src/misread.rs)","actions":[],"agents":[],"args":[{"about":"Root of the spec tree.","name":"--specs-dir"},{"about":"Name every spec under each shape rather than only counting.","name":"--list"}],"command":"tri misread","discarded":0,"entry":"cli/tri/src/main.rs","family":"tri-cli","fields":{"ABOUT":"The specs the compiler reads WRONGLY. Every gate is green on them.","ABOUT_SOURCE":"clap /// doc on Commands::Misread (cli/tri/src/main.rs; module cli/tri/src/misread.rs)","ACTIONS":[],"ACTIONS_ABOUT":[],"AGENTS":[],"AGENTS_NOTE":"No source binds an agent letter to this command: docs/agents/AGENTS_ALPHABET.md (rows, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name it. creator.md and verifier.md name tri gen/test/verify but are not letter agents.","ARGS":["--specs-dir: Root of the spec tree.","--list: Name every spec under each shape rather than only counting."],"COMMAND":"tri misread","ENABLED":true,"ENTRY":"cli/tri/src/main.rs","FAMILY":"tri-cli","ID":"tri/misread","KIND":"tool","SOURCE":"cli/tri/src/misread.rs","VARIANT":"Commands::Misread","WHEN_TO_USE":"The specs the compiler reads WRONGLY. Every gate is green on them.","WITNESS":"source-parse"},"health":"ok","id":"tri/misread","inSpecCorpus":false,"links":{"config":null,"pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","source":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/cli/tri/src/misread.rs"},"messages":["no agent letter bound by a source"],"moduleName":"tool_tri_misread","name":{"en":"tri misread"},"repo":"gHashTag/t27","searchText":"tri/misread tri misread the specs the compiler reads wrongly. every gate is green on them. the specs the compiler reads wrongly. every gate is green on them.","sha256":"727dc944093cb833c9c8efe0bfcc67c4a5cdb642402a07ed85d74ebfef33807f","skills":[],"source":"cli/tri/src/misread.rs","specPath":"specs/tools/tri/misread.t27","summary":{"en":"The specs the compiler reads WRONGLY. Every gate is green on them.","ru":"Спеки, которые компилятор читает НЕВЕРНО. Все гейты на них зелёные."},"typecheckOk":true,"variant":"Commands::Misread","whenToUse":"The specs the compiler reads WRONGLY. Every gate is green on them.","witness":"source-parse"},{"aboutSource":"//! module doc, cli/tri/src/modreach.rs:1 (Commands::Mods dispatches to modreach, cli/tri/src/main.rs:1085)","actions":[{"about":"List them.","name":"orphan"}],"agents":[],"args":[],"command":"tri mods","discarded":0,"entry":"cli/tri/src/main.rs","family":"tri-cli","fields":{"ABOUT":"`tri mods orphan` -- `.rs` files no crate root reaches.","ABOUT_SOURCE":"//! module doc, cli/tri/src/modreach.rs:1 (Commands::Mods dispatches to modreach, cli/tri/src/main.rs:1085)","ACTIONS":["orphan"],"ACTIONS_ABOUT":["List them."],"AGENTS":[],"AGENTS_NOTE":"No source binds an agent letter to this command: docs/agents/AGENTS_ALPHABET.md (rows, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name it. creator.md and verifier.md name tri gen/test/verify but are not letter agents.","ARGS":[],"COMMAND":"tri mods","ENABLED":true,"ENTRY":"cli/tri/src/main.rs","FAMILY":"tri-cli","ID":"tri/mods","KIND":"tool","SOURCE":"cli/tri/src/main.rs","VARIANT":"Commands::Mods","WHEN_TO_USE":"`tri mods orphan` -- `.rs` files no crate root reaches.","WITNESS":"source-parse"},"health":"ok","id":"tri/mods","inSpecCorpus":false,"links":{"config":null,"pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","source":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/cli/tri/src/main.rs"},"messages":["no agent letter bound by a source"],"moduleName":"tool_tri_mods","name":{"en":"tri mods"},"repo":"gHashTag/t27","searchText":"tri/mods tri mods `tri mods orphan` -- `.rs` files no crate root reaches. `tri mods orphan` -- `.rs` files no crate root reaches. orphan list them.","sha256":"80105845e78f775fd9d0b45c66d8bb5ed0b04fc2684eb79a87d2d2899fbf8a3c","skills":[],"source":"cli/tri/src/main.rs","specPath":"specs/tools/tri/mods.t27","summary":{"en":"`tri mods orphan` -- `.rs` files no crate root reaches.","ru":"`tri mods orphan` -- файлы `.rs`, до которых не доходит ни один корень крейта."},"typecheckOk":true,"variant":"Commands::Mods","whenToUse":"`tri mods orphan` -- `.rs` files no crate root reaches.","witness":"source-parse"},{"aboutSource":"clap /// doc on Commands::Mutate (cli/tri/src/main.rs; module cli/tri/src/mutate.rs)","actions":[{"about":"Perturb each numeric literal in a file and report which ones the checker does not notice.","name":"run"}],"agents":[],"args":[],"command":"tri mutate","discarded":0,"entry":"cli/tri/src/main.rs","family":"tri-cli","fields":{"ABOUT":"Find the constants in a checker that nothing actually checks.","ABOUT_SOURCE":"clap /// doc on Commands::Mutate (cli/tri/src/main.rs; module cli/tri/src/mutate.rs)","ACTIONS":["run"],"ACTIONS_ABOUT":["Perturb each numeric literal in a file and report which ones the checker does not notice."],"AGENTS":[],"AGENTS_NOTE":"No source binds an agent letter to this command: docs/agents/AGENTS_ALPHABET.md (rows, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name it. creator.md and verifier.md name tri gen/test/verify but are not letter agents.","ARGS":[],"COMMAND":"tri mutate","ENABLED":true,"ENTRY":"cli/tri/src/main.rs","FAMILY":"tri-cli","ID":"tri/mutate","KIND":"tool","SOURCE":"cli/tri/src/mutate.rs","VARIANT":"Commands::Mutate","WHEN_TO_USE":"Find the constants in a checker that nothing actually checks.","WITNESS":"source-parse"},"health":"ok","id":"tri/mutate","inSpecCorpus":false,"links":{"config":null,"pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","source":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/cli/tri/src/mutate.rs"},"messages":["no agent letter bound by a source"],"moduleName":"tool_tri_mutate","name":{"en":"tri mutate"},"repo":"gHashTag/t27","searchText":"tri/mutate tri mutate find the constants in a checker that nothing actually checks. find the constants in a checker that nothing actually checks. run perturb each numeric literal in a file and report which ones the checker does not notice.","sha256":"96b2cf1fe581c919707eec7c6b9e2614d9336b1a183702faf17c1fc3b6df7f9d","skills":[],"source":"cli/tri/src/mutate.rs","specPath":"specs/tools/tri/mutate.t27","summary":{"en":"Find the constants in a checker that nothing actually checks.","ru":"Находит в чекере константы, которые на деле ничем не проверяются."},"typecheckOk":true,"variant":"Commands::Mutate","whenToUse":"Find the constants in a checker that nothing actually checks.","witness":"source-parse"},{"aboutSource":"clap /// doc on Commands::Now (cli/tri/src/main.rs; module cli/tri/src/nownote.rs)","actions":[{"about":"Write a docs/now/ entry: title, bullets, optional issue ref.","name":"add"},{"about":"Ask the REQUIRED `check` gate its own question, before pushing.","name":"check"}],"agents":[],"args":[],"command":"tri now","discarded":0,"entry":"cli/tri/src/main.rs","family":"tri-cli","fields":{"ABOUT":"Write a docs/now/ entry without hand-writing the frame.","ABOUT_SOURCE":"clap /// doc on Commands::Now (cli/tri/src/main.rs; module cli/tri/src/nownote.rs)","ACTIONS":["add","check"],"ACTIONS_ABOUT":["Write a docs/now/ entry: title, bullets, optional issue ref.","Ask the REQUIRED `check` gate its own question, before pushing."],"AGENTS":[],"AGENTS_NOTE":"No source binds an agent letter to this command: docs/agents/AGENTS_ALPHABET.md (rows, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name it. creator.md and verifier.md name tri gen/test/verify but are not letter agents.","ARGS":[],"COMMAND":"tri now","ENABLED":true,"ENTRY":"cli/tri/src/main.rs","FAMILY":"tri-cli","ID":"tri/now","KIND":"tool","SOURCE":"cli/tri/src/nownote.rs","VARIANT":"Commands::Now","WHEN_TO_USE":"Write a docs/now/ entry without hand-writing the frame.","WITNESS":"source-parse"},"health":"ok","id":"tri/now","inSpecCorpus":false,"links":{"config":null,"pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","source":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/cli/tri/src/nownote.rs"},"messages":["no agent letter bound by a source"],"moduleName":"tool_tri_now","name":{"en":"tri now"},"repo":"gHashTag/t27","searchText":"tri/now tri now write a docs/now/ entry without hand-writing the frame. write a docs/now/ entry without hand-writing the frame. add write a docs/now/ entry: title, bullets, optional issue ref. check ask the required `check` gate its own question, before pushing.","sha256":"20e3d9eede8fd5ebe32c665af54d0006ce8156cf24a6493c421430531d037c2d","skills":[],"source":"cli/tri/src/nownote.rs","specPath":"specs/tools/tri/now.t27","summary":{"en":"Write a docs/now/ entry without hand-writing the frame.","ru":"Пишет запись docs/now/ без ручного набора рамки."},"typecheckOk":true,"variant":"Commands::Now","whenToUse":"Write a docs/now/ entry without hand-writing the frame.","witness":"source-parse"},{"aboutSource":"clap /// doc on Commands::OneAway (cli/tri/src/main.rs; module cli/tri/src/oneaway.rs)","actions":[],"agents":[],"args":[{"about":"Also list every spec, not only the class tally.","name":"--names"},{"about":"Report specs with exactly this many errors. The default, 1, is the only bucket a single repair can move; `--errors 2` is the next wave.","name":"--errors"},{"about":"Stop after this many specs. Prints what was dropped -- a silent cap reads as coverage.","name":"--limit"},{"about":"Run the controls and report, changing nothing.","name":"--self-check"}],"command":"tri one-away","discarded":0,"entry":"cli/tri/src/main.rs","family":"tri-cli","fields":{"ABOUT":"Failing specs one defect from compiling, and what that defect is","ABOUT_SOURCE":"clap /// doc on Commands::OneAway (cli/tri/src/main.rs; module cli/tri/src/oneaway.rs)","ACTIONS":[],"ACTIONS_ABOUT":[],"AGENTS":[],"AGENTS_NOTE":"No source binds an agent letter to this command: docs/agents/AGENTS_ALPHABET.md (rows, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name it. creator.md and verifier.md name tri gen/test/verify but are not letter agents.","ARGS":["--names: Also list every spec, not only the class tally.","--errors: Report specs with exactly this many errors. The default, 1, is the only bucket a single repair can move; `--errors 2` is the next wave.","--limit: Stop after this many specs. Prints what was dropped -- a silent cap reads as coverage.","--self-check: Run the controls and report, changing nothing."],"COMMAND":"tri one-away","ENABLED":true,"ENTRY":"cli/tri/src/main.rs","FAMILY":"tri-cli","ID":"tri/one-away","KIND":"tool","SOURCE":"cli/tri/src/oneaway.rs","VARIANT":"Commands::OneAway","WHEN_TO_USE":"Failing specs one defect from compiling, and what that defect is","WITNESS":"source-parse"},"health":"ok","id":"tri/one-away","inSpecCorpus":false,"links":{"config":null,"pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","source":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/cli/tri/src/oneaway.rs"},"messages":["no agent letter bound by a source"],"moduleName":"tool_tri_one_away","name":{"en":"tri one-away"},"repo":"gHashTag/t27","searchText":"tri/one-away tri one-away failing specs one defect from compiling, and what that defect is failing specs one defect from compiling, and what that defect is","sha256":"ada913e77e4a56cd01aa8e1d49b191f77c8277d06f5ba0be16e77f9b2316b403","skills":[],"source":"cli/tri/src/oneaway.rs","specPath":"specs/tools/tri/one-away.t27","summary":{"en":"Failing specs one defect from compiling, and what that defect is","ru":"Падающие спеки, которым до компиляции один дефект, и какой именно."},"typecheckOk":true,"variant":"Commands::OneAway","whenToUse":"Failing specs one defect from compiling, and what that defect is","witness":"source-parse"},{"aboutSource":"clap /// doc on Commands::Orphaned (cli/tri/src/main.rs; module cli/tri/src/orphaned.rs)","actions":[{"about":"List gate and tool sources that name an input which is not in the tree.","name":"list"}],"agents":[],"args":[],"command":"tri orphaned","discarded":0,"entry":"cli/tri/src/main.rs","family":"tri-cli","fields":{"ABOUT":"Checks whose input is not in the tree.","ABOUT_SOURCE":"clap /// doc on Commands::Orphaned (cli/tri/src/main.rs; module cli/tri/src/orphaned.rs)","ACTIONS":["list"],"ACTIONS_ABOUT":["List gate and tool sources that name an input which is not in the tree."],"AGENTS":[],"AGENTS_NOTE":"No source binds an agent letter to this command: docs/agents/AGENTS_ALPHABET.md (rows, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name it. creator.md and verifier.md name tri gen/test/verify but are not letter agents.","ARGS":[],"COMMAND":"tri orphaned","ENABLED":true,"ENTRY":"cli/tri/src/main.rs","FAMILY":"tri-cli","ID":"tri/orphaned","KIND":"tool","SOURCE":"cli/tri/src/orphaned.rs","VARIANT":"Commands::Orphaned","WHEN_TO_USE":"Checks whose input is not in the tree.","WITNESS":"source-parse"},"health":"ok","id":"tri/orphaned","inSpecCorpus":false,"links":{"config":null,"pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","source":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/cli/tri/src/orphaned.rs"},"messages":["no agent letter bound by a source"],"moduleName":"tool_tri_orphaned","name":{"en":"tri orphaned"},"repo":"gHashTag/t27","searchText":"tri/orphaned tri orphaned checks whose input is not in the tree. checks whose input is not in the tree. list list gate and tool sources that name an input which is not in the tree.","sha256":"e5bbf02f63448c02f56d5285355f8abe55c87741df64fef5a6ac1bfe16b06fc8","skills":[],"source":"cli/tri/src/orphaned.rs","specPath":"specs/tools/tri/orphaned.t27","summary":{"en":"Checks whose input is not in the tree.","ru":"Проверки, чей вход отсутствует в дереве."},"typecheckOk":true,"variant":"Commands::Orphaned","whenToUse":"Checks whose input is not in the tree.","witness":"source-parse"},{"aboutSource":"clap /// doc on Commands::Pr (cli/tri/src/main.rs; module cli/tri/src/prcheck.rs)","actions":[{"about":"Classify every failing check and say plainly whether it is safe to merge. Did this pull request's content actually reach the default branch?","name":"landed"},{"about":"","name":"ready"}],"agents":[],"args":[],"command":"tri pr","discarded":0,"entry":"cli/tri/src/main.rs","family":"tri-cli","fields":{"ABOUT":"Is this pull request actually safe to merge?","ABOUT_SOURCE":"clap /// doc on Commands::Pr (cli/tri/src/main.rs; module cli/tri/src/prcheck.rs)","ACTIONS":["landed","ready"],"ACTIONS_ABOUT":["Classify every failing check and say plainly whether it is safe to merge. Did this pull request's content actually reach the default branch?",""],"AGENTS":[],"AGENTS_NOTE":"No source binds an agent letter to this command: docs/agents/AGENTS_ALPHABET.md (rows, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name it. creator.md and verifier.md name tri gen/test/verify but are not letter agents.","ARGS":[],"COMMAND":"tri pr","ENABLED":true,"ENTRY":"cli/tri/src/main.rs","FAMILY":"tri-cli","ID":"tri/pr","KIND":"tool","SOURCE":"cli/tri/src/prcheck.rs","VARIANT":"Commands::Pr","WHEN_TO_USE":"Is this pull request actually safe to merge?","WITNESS":"source-parse"},"health":"ok","id":"tri/pr","inSpecCorpus":false,"links":{"config":null,"pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","source":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/cli/tri/src/prcheck.rs"},"messages":["no agent letter bound by a source"],"moduleName":"tool_tri_pr","name":{"en":"tri pr"},"repo":"gHashTag/t27","searchText":"tri/pr tri pr is this pull request actually safe to merge? is this pull request actually safe to merge? landed classify every failing check and say plainly whether it is safe to merge. did this pull request's content actually reach the default branch? ready","sha256":"d3544462fece4757608b3e71d931867f41e1bed876e082a16bd223347328fe8e","skills":[],"source":"cli/tri/src/prcheck.rs","specPath":"specs/tools/tri/pr.t27","summary":{"en":"Is this pull request actually safe to merge?","ru":"Действительно ли этот pull request безопасно мержить?"},"typecheckOk":true,"variant":"Commands::Pr","whenToUse":"Is this pull request actually safe to merge?","witness":"source-parse"},{"aboutSource":"clap /// doc on Commands::Prose (cli/tri/src/main.rs; module cli/tri/src/prose.rs)","actions":[{"about":"Which specs are blocked only by prose, and how many lines that is.","name":"report"}],"agents":[],"args":[],"command":"tri prose","discarded":0,"entry":"cli/tri/src/main.rs","family":"tri-cli","fields":{"ABOUT":"Specs a literate author left prose in, and how far that prose is from code.","ABOUT_SOURCE":"clap /// doc on Commands::Prose (cli/tri/src/main.rs; module cli/tri/src/prose.rs)","ACTIONS":["report"],"ACTIONS_ABOUT":["Which specs are blocked only by prose, and how many lines that is."],"AGENTS":[],"AGENTS_NOTE":"No source binds an agent letter to this command: docs/agents/AGENTS_ALPHABET.md (rows, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name it. creator.md and verifier.md name tri gen/test/verify but are not letter agents.","ARGS":[],"COMMAND":"tri prose","ENABLED":true,"ENTRY":"cli/tri/src/main.rs","FAMILY":"tri-cli","ID":"tri/prose","KIND":"tool","SOURCE":"cli/tri/src/prose.rs","VARIANT":"Commands::Prose","WHEN_TO_USE":"Specs a literate author left prose in, and how far that prose is from code.","WITNESS":"source-parse"},"health":"ok","id":"tri/prose","inSpecCorpus":false,"links":{"config":null,"pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","source":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/cli/tri/src/prose.rs"},"messages":["no agent letter bound by a source"],"moduleName":"tool_tri_prose","name":{"en":"tri prose"},"repo":"gHashTag/t27","searchText":"tri/prose tri prose specs a literate author left prose in, and how far that prose is from code. specs a literate author left prose in, and how far that prose is from code. report which specs are blocked only by prose, and how many lines that is.","sha256":"8ef694001ce2fd8620a8653f822ac69670dd2f18376771359b983d1f6e941617","skills":[],"source":"cli/tri/src/prose.rs","specPath":"specs/tools/tri/prose.t27","summary":{"en":"Specs a literate author left prose in, and how far that prose is from code.","ru":"Спеки, в которых литературный автор оставил прозу, и насколько эта проза далека от кода."},"typecheckOk":true,"variant":"Commands::Prose","whenToUse":"Specs a literate author left prose in, and how far that prose is from code.","witness":"source-parse"},{"aboutSource":"clap /// doc on Commands::Quantifiers (cli/tri/src/main.rs; module cli/tri/src/quant.rs)","actions":[{"about":"Every quantified clause, its binders, and the size of its domain.","name":"report"},{"about":"Every line carrying a quantifier keyword, and whether the census read it.","name":"audit"}],"agents":[],"args":[],"command":"tri quantifiers","discarded":0,"entry":"cli/tri/src/main.rs","family":"tri-cli","fields":{"ABOUT":"Every quantified clause, its binders, and the size of its domain.","ABOUT_SOURCE":"clap /// doc on Commands::Quantifiers (cli/tri/src/main.rs; module cli/tri/src/quant.rs)","ACTIONS":["report","audit"],"ACTIONS_ABOUT":["Every quantified clause, its binders, and the size of its domain.","Every line carrying a quantifier keyword, and whether the census read it."],"AGENTS":[],"AGENTS_NOTE":"No source binds an agent letter to this command: docs/agents/AGENTS_ALPHABET.md (rows, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name it. creator.md and verifier.md name tri gen/test/verify but are not letter agents.","ARGS":[],"COMMAND":"tri quantifiers","ENABLED":true,"ENTRY":"cli/tri/src/main.rs","FAMILY":"tri-cli","ID":"tri/quantifiers","KIND":"tool","SOURCE":"cli/tri/src/quant.rs","VARIANT":"Commands::Quantifiers","WHEN_TO_USE":"Every quantified clause, its binders, and the size of its domain.","WITNESS":"source-parse"},"health":"ok","id":"tri/quantifiers","inSpecCorpus":false,"links":{"config":null,"pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","source":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/cli/tri/src/quant.rs"},"messages":["no agent letter bound by a source"],"moduleName":"tool_tri_quantifiers","name":{"en":"tri quantifiers"},"repo":"gHashTag/t27","searchText":"tri/quantifiers tri quantifiers every quantified clause, its binders, and the size of its domain. every quantified clause, its binders, and the size of its domain. report every quantified clause, its binders, and the size of its domain. audit every line carrying a quantifier keyword, and whether the census read it.","sha256":"1bc586fd6dd467d577ad4dfc1ae642b04829d0042e964f6af1864f145dee8a2a","skills":[],"source":"cli/tri/src/quant.rs","specPath":"specs/tools/tri/quantifiers.t27","summary":{"en":"Every quantified clause, its binders, and the size of its domain.","ru":"Каждая квантифицированная клауза, её связанные переменные и размер её домена."},"typecheckOk":true,"variant":"Commands::Quantifiers","whenToUse":"Every quantified clause, its binders, and the size of its domain.","witness":"source-parse"},{"aboutSource":"//! module doc, cli/tri/src/red.rs:1","actions":[{"about":"Show workflows whose most recent run on the default branch failed.","name":"now"},{"about":"Which STEP each recent failure of one workflow died at, oldest first.","name":"why"}],"agents":[],"args":[],"command":"tri red","discarded":0,"entry":"cli/tri/src/main.rs","family":"tri-cli","fields":{"ABOUT":"`tri red` -- what is failing on main right now, and since when.","ABOUT_SOURCE":"//! module doc, cli/tri/src/red.rs:1","ACTIONS":["now","why"],"ACTIONS_ABOUT":["Show workflows whose most recent run on the default branch failed.","Which STEP each recent failure of one workflow died at, oldest first."],"AGENTS":[],"AGENTS_NOTE":"No source binds an agent letter to this command: docs/agents/AGENTS_ALPHABET.md (rows, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name it. creator.md and verifier.md name tri gen/test/verify but are not letter agents.","ARGS":[],"COMMAND":"tri red","ENABLED":true,"ENTRY":"cli/tri/src/main.rs","FAMILY":"tri-cli","ID":"tri/red","KIND":"tool","SOURCE":"cli/tri/src/red.rs","VARIANT":"Commands::Red","WHEN_TO_USE":"`tri red` -- what is failing on main right now, and since when.","WITNESS":"source-parse"},"health":"ok","id":"tri/red","inSpecCorpus":false,"links":{"config":null,"pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","source":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/cli/tri/src/red.rs"},"messages":["no agent letter bound by a source"],"moduleName":"tool_tri_red","name":{"en":"tri red"},"repo":"gHashTag/t27","searchText":"tri/red tri red `tri red` -- what is failing on main right now, and since when. `tri red` -- what is failing on main right now, and since when. now show workflows whose most recent run on the default branch failed. why which step each recent failure of one workflow died at, oldest first.","sha256":"63bb048416e517a17f2ac7735ddad0842dc1538b55a9a74d07a9a6e0740b3c66","skills":[],"source":"cli/tri/src/red.rs","specPath":"specs/tools/tri/red.t27","summary":{"en":"`tri red` -- what is failing on main right now, and since when.","ru":"`tri red` -- что падает на main прямо сейчас и с какого момента."},"typecheckOk":true,"variant":"Commands::Red","whenToUse":"`tri red` -- what is failing on main right now, and since when.","witness":"source-parse"},{"aboutSource":"clap /// doc on Commands::Reseal (cli/tri/src/main.rs; module cli/tri/src/reseal.rs)","actions":[{"about":"Rewrite FROZEN_HASH from the current bytes of the sealed file.","name":"write"},{"about":"Report whether the seal matches, and exit non-zero if it does not.","name":"check"}],"agents":[],"args":[],"command":"tri reseal","discarded":0,"entry":"cli/tri/src/main.rs","family":"tri-cli","fields":{"ABOUT":"Recompute the FROZEN_HASH seal from the file it seals.","ABOUT_SOURCE":"clap /// doc on Commands::Reseal (cli/tri/src/main.rs; module cli/tri/src/reseal.rs)","ACTIONS":["write","check"],"ACTIONS_ABOUT":["Rewrite FROZEN_HASH from the current bytes of the sealed file.","Report whether the seal matches, and exit non-zero if it does not."],"AGENTS":[],"AGENTS_NOTE":"No source binds an agent letter to this command: docs/agents/AGENTS_ALPHABET.md (rows, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name it. creator.md and verifier.md name tri gen/test/verify but are not letter agents.","ARGS":[],"COMMAND":"tri reseal","ENABLED":true,"ENTRY":"cli/tri/src/main.rs","FAMILY":"tri-cli","ID":"tri/reseal","KIND":"tool","SOURCE":"cli/tri/src/reseal.rs","VARIANT":"Commands::Reseal","WHEN_TO_USE":"Recompute the FROZEN_HASH seal from the file it seals.","WITNESS":"source-parse"},"health":"ok","id":"tri/reseal","inSpecCorpus":false,"links":{"config":null,"pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","source":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/cli/tri/src/reseal.rs"},"messages":["no agent letter bound by a source"],"moduleName":"tool_tri_reseal","name":{"en":"tri reseal"},"repo":"gHashTag/t27","searchText":"tri/reseal tri reseal recompute the frozen_hash seal from the file it seals. recompute the frozen_hash seal from the file it seals. write rewrite frozen_hash from the current bytes of the sealed file. check report whether the seal matches, and exit non-zero if it does not.","sha256":"99e0e7fb4da6a8c5776449a7cf6e1fec3268f408162d8b1bcf653a64a721ab68","skills":[],"source":"cli/tri/src/reseal.rs","specPath":"specs/tools/tri/reseal.t27","summary":{"en":"Recompute the FROZEN_HASH seal from the file it seals.","ru":"Пересчитывает печать FROZEN_HASH по файлу, который она запечатывает."},"typecheckOk":true,"variant":"Commands::Reseal","whenToUse":"Recompute the FROZEN_HASH seal from the file it seals.","witness":"source-parse"},{"aboutSource":"clap /// doc on Commands::Rtl (cli/tri/src/main.rs; module cli/tri/src/rtl.rs)","actions":[{"about":"Run the five structural checks on a design directory.","name":"check"}],"agents":[],"args":[],"command":"tri rtl","discarded":0,"entry":"cli/tri/src/main.rs","family":"tri-cli","fields":{"ABOUT":"The structural check t27.ai offers, run locally: five verdicts, the yosys version beside the numbers, and no claim about correctness.","ABOUT_SOURCE":"clap /// doc on Commands::Rtl (cli/tri/src/main.rs; module cli/tri/src/rtl.rs)","ACTIONS":["check"],"ACTIONS_ABOUT":["Run the five structural checks on a design directory."],"AGENTS":[],"AGENTS_NOTE":"No source binds an agent letter to this command: docs/agents/AGENTS_ALPHABET.md (rows, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name it. creator.md and verifier.md name tri gen/test/verify but are not letter agents.","ARGS":[],"COMMAND":"tri rtl","ENABLED":true,"ENTRY":"cli/tri/src/main.rs","FAMILY":"tri-cli","ID":"tri/rtl","KIND":"tool","SOURCE":"cli/tri/src/rtl.rs","VARIANT":"Commands::Rtl","WHEN_TO_USE":"The structural check t27.ai offers, run locally: five verdicts, the yosys version beside the numbers, and no claim about correctness.","WITNESS":"source-parse"},"health":"ok","id":"tri/rtl","inSpecCorpus":false,"links":{"config":null,"pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","source":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/cli/tri/src/rtl.rs"},"messages":["no agent letter bound by a source"],"moduleName":"tool_tri_rtl","name":{"en":"tri rtl"},"repo":"gHashTag/t27","searchText":"tri/rtl tri rtl the structural check t27.ai offers, run locally: five verdicts, the yosys version beside the numbers, and no claim about correctness. the structural check t27.ai offers, run locally: five verdicts, the yosys version beside the numbers, and no claim about correctness. check run the five structural checks on a design directory.","sha256":"ffa9646aaa65be1fa33044b4df088067edb04267449b5076a7ebc4dcd372195c","skills":[],"source":"cli/tri/src/rtl.rs","specPath":"specs/tools/tri/rtl.t27","summary":{"en":"The structural check t27.ai offers, run locally: five verdicts, the yosys version beside the numbers, and no claim about correctness.","ru":"Структурная проверка, которую предлагает t27.ai, локально: пять вердиктов, версия yosys рядом с числами и никаких заявлений о корректности."},"typecheckOk":true,"variant":"Commands::Rtl","whenToUse":"The structural check t27.ai offers, run locally: five verdicts, the yosys version beside the numbers, and no claim about correctness.","witness":"source-parse"},{"aboutSource":"clap /// doc on Commands::Seals (cli/tri/src/main.rs; module cli/tri/src/seals.rs)","actions":[{"about":"Is the built compiler newer than the source the seals are checked against?","name":"fresh"},{"about":"Seals whose claims no longer match what the compiler produces, and the one command that repairs them.","name":"drift"},{"about":"Specs that carry more than one seal, and which of those pairs disagree.","name":"twins"},{"about":"Copy the NEWEST seal's claims onto its twins, after a re-seal.","name":"sync-twins"},{"about":"Seals that record `gen_hash=none` -- a spec that produced no output, sealed.","name":"hollow"}],"agents":[],"args":[],"command":"tri seals","discarded":0,"entry":"cli/tri/src/main.rs","family":"tri-cli","fields":{"ABOUT":"What `.trinity/seals` says about a spec, when it says it twice.","ABOUT_SOURCE":"clap /// doc on Commands::Seals (cli/tri/src/main.rs; module cli/tri/src/seals.rs)","ACTIONS":["fresh","drift","twins","sync-twins","hollow"],"ACTIONS_ABOUT":["Is the built compiler newer than the source the seals are checked against?","Seals whose claims no longer match what the compiler produces, and the one command that repairs them.","Specs that carry more than one seal, and which of those pairs disagree.","Copy the NEWEST seal's claims onto its twins, after a re-seal.","Seals that record `gen_hash=none` -- a spec that produced no output, sealed."],"AGENTS":[],"AGENTS_NOTE":"No source binds an agent letter to this command: docs/agents/AGENTS_ALPHABET.md (rows, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name it. creator.md and verifier.md name tri gen/test/verify but are not letter agents.","ARGS":[],"COMMAND":"tri seals","ENABLED":true,"ENTRY":"cli/tri/src/main.rs","FAMILY":"tri-cli","ID":"tri/seals","KIND":"tool","SOURCE":"cli/tri/src/seals.rs","VARIANT":"Commands::Seals","WHEN_TO_USE":"What `.trinity/seals` says about a spec, when it says it twice.","WITNESS":"source-parse"},"health":"ok","id":"tri/seals","inSpecCorpus":false,"links":{"config":null,"pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","source":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/cli/tri/src/seals.rs"},"messages":["no agent letter bound by a source"],"moduleName":"tool_tri_seals","name":{"en":"tri seals"},"repo":"gHashTag/t27","searchText":"tri/seals tri seals what `.trinity/seals` says about a spec, when it says it twice. what `.trinity/seals` says about a spec, when it says it twice. fresh is the built compiler newer than the source the seals are checked against? drift seals whose claims no longer match what the compiler produces, and the one command that repairs them. twins specs that carry more than one seal, and which of those pairs disagree. sync-twins copy the newest seal's claims onto its twins, after a re-seal. hollow seals that record `gen_hash=none` -- a spec that produced no output, sealed.","sha256":"0b0b2c88c77de996fdbfe8321d8138a5176d10444c10a2ceede9af313f0d63a7","skills":[],"source":"cli/tri/src/seals.rs","specPath":"specs/tools/tri/seals.t27","summary":{"en":"What `.trinity/seals` says about a spec, when it says it twice.","ru":"Что `.trinity/seals` говорит о спеке, когда говорит это дважды."},"typecheckOk":true,"variant":"Commands::Seals","whenToUse":"What `.trinity/seals` says about a spec, when it says it twice.","witness":"source-parse"},{"aboutSource":"handler cmd_serve routes and banner string (cli/tri/src/main.rs:1121)","actions":[],"agents":[],"args":[{"about":"","name":"--addr"}],"command":"tri serve","discarded":0,"entry":"cli/tri/src/main.rs","family":"tri-cli","fields":{"ABOUT":"Serve the trinity depin HTTP API over axum: POST /prove, GET /epoch-challenge, GET /health; prints trinity depin v0.1.0 -- listening on .","ABOUT_SOURCE":"handler cmd_serve routes and banner string (cli/tri/src/main.rs:1121)","ACTIONS":[],"ACTIONS_ABOUT":[],"AGENTS":[],"AGENTS_NOTE":"No source binds an agent letter to this command: docs/agents/AGENTS_ALPHABET.md (rows, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name it. creator.md and verifier.md name tri gen/test/verify but are not letter agents.","ARGS":["--addr"],"COMMAND":"tri serve","ENABLED":true,"ENTRY":"cli/tri/src/main.rs","FAMILY":"tri-cli","ID":"tri/serve","KIND":"tool","SOURCE":"cli/tri/src/main.rs","VARIANT":"Commands::Serve","WHEN_TO_USE":"Serve the trinity depin HTTP API over axum: POST /prove, GET /epoch-challenge, GET /health; prints trinity depin v0.1.0 -- listening on .","WITNESS":"source-parse"},"health":"ok","id":"tri/serve","inSpecCorpus":false,"links":{"config":null,"pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","source":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/cli/tri/src/main.rs"},"messages":["no agent letter bound by a source"],"moduleName":"tool_tri_serve","name":{"en":"tri serve"},"repo":"gHashTag/t27","searchText":"tri/serve tri serve serve the trinity depin http api over axum: post /prove, get /epoch-challenge, get /health; prints trinity depin v0.1.0 -- listening on . serve the trinity depin http api over axum: post /prove, get /epoch-challenge, get /health; prints trinity depin v0.1.0 -- listening on .","sha256":"97e2aaf7831bb039ac90280e53830a40c0346410b498576c87efa2a92de876ea","skills":[],"source":"cli/tri/src/main.rs","specPath":"specs/tools/tri/serve.t27","summary":{"en":"Serve the trinity depin HTTP API over axum: POST /prove, GET /epoch-challenge, GET /health; prints trinity depin v0.1.0 -- listening on .","ru":"Поднимает HTTP API trinity depin на axum: POST /prove, GET /epoch-challenge, GET /health; печатает «trinity depin v0.1.0 -- listening on »."},"typecheckOk":true,"variant":"Commands::Serve","whenToUse":"Serve the trinity depin HTTP API over axum: POST /prove, GET /epoch-challenge, GET /health; prints trinity depin v0.1.0 -- listening on .","witness":"source-parse"},{"aboutSource":"tri-mcp tools tri_skill_begin and tri_skill_end descriptions (cli/tri-mcp/src/main.rs); SkillAction enum cli/tri/src/main.rs:349","actions":[{"about":"Write a new lesson to the spool, unnumbered.","name":"add"},{"about":"Fold every spooled lesson into SKILL.md, numbering them on the way in.","name":"fold"},{"about":"Check every SKILL.md's section numbering for collisions.","name":"check"},{"about":"Sections whose body was cut short at some point in the file's history.","name":"lost"},{"about":"Every cross-reference in the skills, and whether it resolves.","name":"refs"},{"about":"Sections that state a FIGURE, and which of those a reader can re-take.","name":"claims"},{"about":"Move sections you appended to the numbers the base branch left free.","name":"renumber"},{"about":"","name":"begin"},{"about":"","name":"end"}],"agents":[],"args":[],"command":"tri skill","discarded":0,"entry":"cli/tri/src/main.rs","family":"tri-cli","fields":{"ABOUT":"Begins a new PHI LOOP skill session bound to an issue. Ends the active PHI LOOP skill session. The add/fold/check/lost/refs/claims/renumber actions carry their own clap docs (SKILL.md lesson spool).","ABOUT_SOURCE":"tri-mcp tools tri_skill_begin and tri_skill_end descriptions (cli/tri-mcp/src/main.rs); SkillAction enum cli/tri/src/main.rs:349","ACTIONS":["add","fold","check","lost","refs","claims","renumber","begin","end"],"ACTIONS_ABOUT":["Write a new lesson to the spool, unnumbered.","Fold every spooled lesson into SKILL.md, numbering them on the way in.","Check every SKILL.md's section numbering for collisions.","Sections whose body was cut short at some point in the file's history.","Every cross-reference in the skills, and whether it resolves.","Sections that state a FIGURE, and which of those a reader can re-take.","Move sections you appended to the numbers the base branch left free.","",""],"AGENTS":[],"AGENTS_NOTE":"No source binds an agent letter to this command: docs/agents/AGENTS_ALPHABET.md (rows, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name it. creator.md and verifier.md name tri gen/test/verify but are not letter agents.","ARGS":[],"COMMAND":"tri skill","ENABLED":true,"ENTRY":"cli/tri/src/main.rs","FAMILY":"tri-cli","ID":"tri/skill","KIND":"tool","SOURCE":"cli/tri/src/main.rs","VARIANT":"Commands::Skill","WHEN_TO_USE":"Begins a new PHI LOOP skill session bound to an issue. Ends the active PHI LOOP skill session. The add/fold/check/lost/refs/claims/renumber actions carry their own clap docs (SKILL.md lesson spool).","WITNESS":"source-parse"},"health":"ok","id":"tri/skill","inSpecCorpus":false,"links":{"config":null,"pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","source":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/cli/tri/src/main.rs"},"messages":["no agent letter bound by a source"],"moduleName":"tool_tri_skill","name":{"en":"tri skill"},"repo":"gHashTag/t27","searchText":"tri/skill tri skill begins a new phi loop skill session bound to an issue. ends the active phi loop skill session. the add/fold/check/lost/refs/claims/renumber actions carry their own clap docs (skill.md lesson spool). begins a new phi loop skill session bound to an issue. ends the active phi loop skill session. the add/fold/check/lost/refs/claims/renumber actions carry their own clap docs (skill.md lesson spool). add write a new lesson to the spool, unnumbered. fold fold every spooled lesson into skill.md, numbering them on the way in. check check every skill.md's section numbering for collisions. lost sections whose body was cut short at some point in the file's history. refs every cross-reference in the skills, and whether it resolves. claims sections that state a figure, and which of those a reader can re-take. renumber move sections you appended to the numbers the base branch left free. begin end","sha256":"f8c9718b9f1604344abc258d6f85703924b0e5163e352e5efc6df70813a98865","skills":[{"id":"t27/tri","via":["SUMMARY_EN"]}],"source":"cli/tri/src/main.rs","specPath":"specs/tools/tri/skill.t27","summary":{"en":"Begins a new PHI LOOP skill session bound to an issue. Ends the active PHI LOOP skill session. The add/fold/check/lost/refs/claims/renumber actions carry their own clap docs (SKILL.md lesson spool).","ru":"Начинает новую сессию скилла PHI LOOP, привязанную к issue; завершает активную сессию. Действия add/fold/check/lost/refs/claims/renumber ведут спул уроков SKILL.md и описаны в своих clap-доках."},"typecheckOk":true,"variant":"Commands::Skill","whenToUse":"Begins a new PHI LOOP skill session bound to an issue. Ends the active PHI LOOP skill session. The add/fold/check/lost/refs/claims/renumber actions carry their own clap docs (SKILL.md lesson spool).","witness":"source-parse"},{"aboutSource":"tri-mcp tool tri_status description (cli/tri-mcp/src/main.rs); handler cmd_status prints === PHI LOOP STATUS === (cli/tri/src/main.rs:613)","actions":[],"agents":[],"args":[],"command":"tri status","discarded":0,"entry":"cli/tri/src/main.rs","family":"tri-cli","fields":{"ABOUT":"Returns PHI LOOP status including active skill, cell, issue binding, and uncommitted changes.","ABOUT_SOURCE":"tri-mcp tool tri_status description (cli/tri-mcp/src/main.rs); handler cmd_status prints === PHI LOOP STATUS === (cli/tri/src/main.rs:613)","ACTIONS":[],"ACTIONS_ABOUT":[],"AGENTS":[],"AGENTS_NOTE":"No source binds an agent letter to this command: docs/agents/AGENTS_ALPHABET.md (rows, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name it. creator.md and verifier.md name tri gen/test/verify but are not letter agents.","ARGS":[],"COMMAND":"tri status","ENABLED":true,"ENTRY":"cli/tri/src/main.rs","FAMILY":"tri-cli","ID":"tri/status","KIND":"tool","SOURCE":"cli/tri/src/main.rs","VARIANT":"Commands::Status","WHEN_TO_USE":"Returns PHI LOOP status including active skill, cell, issue binding, and uncommitted changes.","WITNESS":"source-parse"},"health":"ok","id":"tri/status","inSpecCorpus":false,"links":{"config":null,"pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","source":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/cli/tri/src/main.rs"},"messages":["no agent letter bound by a source"],"moduleName":"tool_tri_status","name":{"en":"tri status"},"repo":"gHashTag/t27","searchText":"tri/status tri status returns phi loop status including active skill, cell, issue binding, and uncommitted changes. returns phi loop status including active skill, cell, issue binding, and uncommitted changes.","sha256":"de90be29df639a7d8e7158a36a5f2b3b77ecf73b6bd362c7473f9d28667f8e09","skills":[],"source":"cli/tri/src/main.rs","specPath":"specs/tools/tri/status.t27","summary":{"en":"Returns PHI LOOP status including active skill, cell, issue binding, and uncommitted changes.","ru":"Показывает статус PHI LOOP: активный скилл, ячейку, привязку к issue и незакоммиченные изменения."},"typecheckOk":true,"variant":"Commands::Status","whenToUse":"Returns PHI LOOP status including active skill, cell, issue binding, and uncommitted changes.","witness":"source-parse"},{"aboutSource":"clap /// doc on Commands::Sweep (cli/tri/src/main.rs; module cli/tri/src/sweep.rs)","actions":[{"about":"Synthesise a top across values of one parameter and report the trend.","name":"area"}],"agents":[],"args":[],"command":"tri sweep","discarded":0,"entry":"cli/tri/src/main.rs","family":"tri-cli","fields":{"ABOUT":"Synthesise across a parameter and check the area actually moves.","ABOUT_SOURCE":"clap /// doc on Commands::Sweep (cli/tri/src/main.rs; module cli/tri/src/sweep.rs)","ACTIONS":["area"],"ACTIONS_ABOUT":["Synthesise a top across values of one parameter and report the trend."],"AGENTS":[],"AGENTS_NOTE":"No source binds an agent letter to this command: docs/agents/AGENTS_ALPHABET.md (rows, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name it. creator.md and verifier.md name tri gen/test/verify but are not letter agents.","ARGS":[],"COMMAND":"tri sweep","ENABLED":true,"ENTRY":"cli/tri/src/main.rs","FAMILY":"tri-cli","ID":"tri/sweep","KIND":"tool","SOURCE":"cli/tri/src/sweep.rs","VARIANT":"Commands::Sweep","WHEN_TO_USE":"Synthesise across a parameter and check the area actually moves.","WITNESS":"source-parse"},"health":"ok","id":"tri/sweep","inSpecCorpus":false,"links":{"config":null,"pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","source":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/cli/tri/src/sweep.rs"},"messages":["no agent letter bound by a source"],"moduleName":"tool_tri_sweep","name":{"en":"tri sweep"},"repo":"gHashTag/t27","searchText":"tri/sweep tri sweep synthesise across a parameter and check the area actually moves. synthesise across a parameter and check the area actually moves. area synthesise a top across values of one parameter and report the trend.","sha256":"6f89f30b724573f89e6c08159e754a3816a13a5b8211f3438476706610d20eb4","skills":[],"source":"cli/tri/src/sweep.rs","specPath":"specs/tools/tri/sweep.t27","summary":{"en":"Synthesise across a parameter and check the area actually moves.","ru":"Синтез по параметру с проверкой, что площадь действительно меняется."},"typecheckOk":true,"variant":"Commands::Sweep","whenToUse":"Synthesise across a parameter and check the area actually moves.","witness":"source-parse"},{"aboutSource":"clap /// doc on Commands::Synth (cli/tri/src/main.rs; module cli/tri/src/synth.rs)","actions":[{"about":"Synthesise a top module and report LUT/DSP/FF/CARRY4 counts.","name":"area"}],"agents":[],"args":[],"command":"tri synth","discarded":0,"entry":"cli/tri/src/main.rs","family":"tri-cli","fields":{"ABOUT":"Synthesise a top module and report area, with the instrument named.","ABOUT_SOURCE":"clap /// doc on Commands::Synth (cli/tri/src/main.rs; module cli/tri/src/synth.rs)","ACTIONS":["area"],"ACTIONS_ABOUT":["Synthesise a top module and report LUT/DSP/FF/CARRY4 counts."],"AGENTS":[],"AGENTS_NOTE":"No source binds an agent letter to this command: docs/agents/AGENTS_ALPHABET.md (rows, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name it. creator.md and verifier.md name tri gen/test/verify but are not letter agents.","ARGS":[],"COMMAND":"tri synth","ENABLED":true,"ENTRY":"cli/tri/src/main.rs","FAMILY":"tri-cli","ID":"tri/synth","KIND":"tool","SOURCE":"cli/tri/src/synth.rs","VARIANT":"Commands::Synth","WHEN_TO_USE":"Synthesise a top module and report area, with the instrument named.","WITNESS":"source-parse"},"health":"ok","id":"tri/synth","inSpecCorpus":false,"links":{"config":null,"pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","source":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/cli/tri/src/synth.rs"},"messages":["no agent letter bound by a source"],"moduleName":"tool_tri_synth","name":{"en":"tri synth"},"repo":"gHashTag/t27","searchText":"tri/synth tri synth synthesise a top module and report area, with the instrument named. synthesise a top module and report area, with the instrument named. area synthesise a top module and report lut/dsp/ff/carry4 counts.","sha256":"5680f02430dc57631097da55700e784997839fc8ed4b5b00b8e0a01ee34a9688","skills":[],"source":"cli/tri/src/synth.rs","specPath":"specs/tools/tri/synth.t27","summary":{"en":"Synthesise a top module and report area, with the instrument named.","ru":"Синтезирует top-модуль и сообщает площадь с указанием инструмента."},"typecheckOk":true,"variant":"Commands::Synth","whenToUse":"Synthesise a top module and report area, with the instrument named.","witness":"source-parse"},{"aboutSource":"tri-mcp tool tri_test description (cli/tri-mcp/src/main.rs); handler cmd_test runs t27c test (cli/tri/src/main.rs:870)","actions":[],"agents":[{"letter":"T","ok":true},{"letter":"V","ok":true}],"args":[{"about":"","name":""}],"command":"tri test","discarded":0,"entry":"cli/tri/src/main.rs","family":"tri-cli","fields":{"ABOUT":"Runs tests for a .t27 spec file using t27c.","ABOUT_SOURCE":"tri-mcp tool tri_test description (cli/tri-mcp/src/main.rs); handler cmd_test runs t27c test (cli/tri/src/main.rs:870)","ACTIONS":[],"ACTIONS_ABOUT":[],"AGENTS":["T","V"],"AGENTS_NOTE":".claude/agents/agent-v-verify.md:47 (tri test -- Run conformance tests); .claude/agents/trinity.md:70 (7. Verify - Run tri test).","ARGS":[""],"COMMAND":"tri test","ENABLED":true,"ENTRY":"cli/tri/src/main.rs","FAMILY":"tri-cli","ID":"tri/test","KIND":"tool","SOURCE":"cli/tri/src/main.rs","VARIANT":"Commands::Test","WHEN_TO_USE":"Runs tests for a .t27 spec file using t27c.","WITNESS":"source-parse"},"health":"ok","id":"tri/test","inSpecCorpus":false,"links":{"config":null,"pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","source":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/cli/tri/src/main.rs"},"messages":[],"moduleName":"tool_tri_test","name":{"en":"tri test"},"repo":"gHashTag/t27","searchText":"tri/test tri test runs tests for a .t27 spec file using t27c. runs tests for a .t27 spec file using t27c. t v","sha256":"6c78b60dd23fecfd0965a38c8cedacc1d29577849daa4c5d8f0516fa68d7829b","skills":[{"id":"t27/tri","via":["SUMMARY_EN"]}],"source":"cli/tri/src/main.rs","specPath":"specs/tools/tri/test.t27","summary":{"en":"Runs tests for a .t27 spec file using t27c.","ru":"Запускает тесты для файла спецификации .t27 через t27c."},"typecheckOk":true,"variant":"Commands::Test","whenToUse":"Runs tests for a .t27 spec file using t27c.","witness":"source-parse"},{"aboutSource":"clap /// doc on Commands::Topic (cli/tri/src/main.rs)","actions":[],"agents":[],"args":[{"about":"Words to look for. A row matches on any; rows carrying more come first.","name":""},{"about":"How many recent commits on the base branch to read.","name":"--commits"}],"command":"tri topic","discarded":0,"entry":"cli/tri/src/main.rs","family":"tri-cli","fields":{"ABOUT":"Has anyone already done this, or are they doing it now?","ABOUT_SOURCE":"clap /// doc on Commands::Topic (cli/tri/src/main.rs)","ACTIONS":[],"ACTIONS_ABOUT":[],"AGENTS":[],"AGENTS_NOTE":"No source binds an agent letter to this command: docs/agents/AGENTS_ALPHABET.md (rows, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name it. creator.md and verifier.md name tri gen/test/verify but are not letter agents.","ARGS":[": Words to look for. A row matches on any; rows carrying more come first.","--commits: How many recent commits on the base branch to read."],"COMMAND":"tri topic","ENABLED":true,"ENTRY":"cli/tri/src/main.rs","FAMILY":"tri-cli","ID":"tri/topic","KIND":"tool","SOURCE":"cli/tri/src/main.rs","VARIANT":"Commands::Topic","WHEN_TO_USE":"Has anyone already done this, or are they doing it now?","WITNESS":"source-parse"},"health":"ok","id":"tri/topic","inSpecCorpus":false,"links":{"config":null,"pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","source":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/cli/tri/src/main.rs"},"messages":["no agent letter bound by a source"],"moduleName":"tool_tri_topic","name":{"en":"tri topic"},"repo":"gHashTag/t27","searchText":"tri/topic tri topic has anyone already done this, or are they doing it now? has anyone already done this, or are they doing it now?","sha256":"303530879cd8541a74be1f2d860fdda1d8243ffbf4d16b4a7074a201b5797e71","skills":[],"source":"cli/tri/src/main.rs","specPath":"specs/tools/tri/topic.t27","summary":{"en":"Has anyone already done this, or are they doing it now?","ru":"Кто-нибудь уже делал это или делает сейчас?"},"typecheckOk":true,"variant":"Commands::Topic","whenToUse":"Has anyone already done this, or are they doing it now?","witness":"source-parse"},{"aboutSource":"//! module doc, cli/tri/src/types_dup.rs:1","actions":[{"about":"Type names with more than one definition in the spec tree.","name":"dup"},{"about":"Hold the conflicted set: a new conflict fails, and a resolved one fails until it is blessed away.","name":"ratchet"},{"about":"Cross-check the written classification against what the tree says today.","name":"classified"},{"about":"Names defined more than once INSIDE ONE FILE.","name":"redef"}],"agents":[],"args":[],"command":"tri types","discarded":0,"entry":"cli/tri/src/main.rs","family":"tri-cli","fields":{"ABOUT":"One type name, more than one definition.","ABOUT_SOURCE":"//! module doc, cli/tri/src/types_dup.rs:1","ACTIONS":["dup","ratchet","classified","redef"],"ACTIONS_ABOUT":["Type names with more than one definition in the spec tree.","Hold the conflicted set: a new conflict fails, and a resolved one fails until it is blessed away.","Cross-check the written classification against what the tree says today.","Names defined more than once INSIDE ONE FILE."],"AGENTS":[],"AGENTS_NOTE":"No source binds an agent letter to this command: docs/agents/AGENTS_ALPHABET.md (rows, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name it. creator.md and verifier.md name tri gen/test/verify but are not letter agents.","ARGS":[],"COMMAND":"tri types","ENABLED":true,"ENTRY":"cli/tri/src/main.rs","FAMILY":"tri-cli","ID":"tri/types","KIND":"tool","SOURCE":"cli/tri/src/types_dup.rs","VARIANT":"Commands::Types","WHEN_TO_USE":"One type name, more than one definition.","WITNESS":"source-parse"},"health":"ok","id":"tri/types","inSpecCorpus":false,"links":{"config":null,"pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","source":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/cli/tri/src/types_dup.rs"},"messages":["no agent letter bound by a source"],"moduleName":"tool_tri_types","name":{"en":"tri types"},"repo":"gHashTag/t27","searchText":"tri/types tri types one type name, more than one definition. one type name, more than one definition. dup type names with more than one definition in the spec tree. ratchet hold the conflicted set: a new conflict fails, and a resolved one fails until it is blessed away. classified cross-check the written classification against what the tree says today. redef names defined more than once inside one file.","sha256":"5ab7c8a8183b8b4ec920907d04d4f56e1be9060b344c2472c0b93b763bae0c51","skills":[],"source":"cli/tri/src/types_dup.rs","specPath":"specs/tools/tri/types.t27","summary":{"en":"One type name, more than one definition.","ru":"Одно имя типа, больше одного определения."},"typecheckOk":true,"variant":"Commands::Types","whenToUse":"One type name, more than one definition.","witness":"source-parse"},{"aboutSource":"//! module doc, cli/tri/src/unparsed.rs:1","actions":[{"about":"Rank the constructs that stop the compiler, most specs first.","name":"report"},{"about":"For each unreadable spec, the ITEM whose presence causes the failure.","name":"locate"},{"about":"Cross-check the census against an INDEPENDENTLY built population.","name":"agree"},{"about":"Run every construct's minimal source and say which the compiler rejects.","name":"probe"}],"agents":[],"args":[],"command":"tri unparsed","discarded":0,"entry":"cli/tri/src/main.rs","family":"tri-cli","fields":{"ABOUT":"Specs the compiler cannot read, ranked by the CONSTRUCT that stops it -- and every construct backed by a live probe.","ABOUT_SOURCE":"//! module doc, cli/tri/src/unparsed.rs:1","ACTIONS":["report","locate","agree","probe"],"ACTIONS_ABOUT":["Rank the constructs that stop the compiler, most specs first.","For each unreadable spec, the ITEM whose presence causes the failure.","Cross-check the census against an INDEPENDENTLY built population.","Run every construct's minimal source and say which the compiler rejects."],"AGENTS":[],"AGENTS_NOTE":"No source binds an agent letter to this command: docs/agents/AGENTS_ALPHABET.md (rows, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name it. creator.md and verifier.md name tri gen/test/verify but are not letter agents.","ARGS":[],"COMMAND":"tri unparsed","ENABLED":true,"ENTRY":"cli/tri/src/main.rs","FAMILY":"tri-cli","ID":"tri/unparsed","KIND":"tool","SOURCE":"cli/tri/src/unparsed.rs","VARIANT":"Commands::Unparsed","WHEN_TO_USE":"Specs the compiler cannot read, ranked by the CONSTRUCT that stops it -- and every construct backed by a live probe.","WITNESS":"source-parse"},"health":"ok","id":"tri/unparsed","inSpecCorpus":false,"links":{"config":null,"pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","source":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/cli/tri/src/unparsed.rs"},"messages":["no agent letter bound by a source"],"moduleName":"tool_tri_unparsed","name":{"en":"tri unparsed"},"repo":"gHashTag/t27","searchText":"tri/unparsed tri unparsed specs the compiler cannot read, ranked by the construct that stops it -- and every construct backed by a live probe. specs the compiler cannot read, ranked by the construct that stops it -- and every construct backed by a live probe. report rank the constructs that stop the compiler, most specs first. locate for each unreadable spec, the item whose presence causes the failure. agree cross-check the census against an independently built population. probe run every construct's minimal source and say which the compiler rejects.","sha256":"e09344f6cabdf1f2763a77934042556012cbc502cc6c35fa349f35c9d6f3b1fc","skills":[],"source":"cli/tri/src/unparsed.rs","specPath":"specs/tools/tri/unparsed.t27","summary":{"en":"Specs the compiler cannot read, ranked by the CONSTRUCT that stops it -- and every construct backed by a live probe.","ru":"Спеки, которые компилятор не может прочитать, ранжированные по КОНСТРУКЦИИ, которая его останавливает, -- и каждая конструкция, подтверждённая живой пробой."},"typecheckOk":true,"variant":"Commands::Unparsed","whenToUse":"Specs the compiler cannot read, ranked by the CONSTRUCT that stops it -- and every construct backed by a live probe.","witness":"source-parse"},{"aboutSource":"clap /// doc on Commands::Vectors (cli/tri/src/main.rs; module cli/tri/src/vectors.rs)","actions":[{"about":"Generate a module's Verilog and execute its registered vectors.","name":"run"},{"about":"Inventory every vector file: executed, debt, or aspirational.","name":"debt"}],"agents":[],"args":[],"command":"tri vectors","discarded":0,"entry":"cli/tri/src/main.rs","family":"tri-cli","fields":{"ABOUT":"The executed-vector registry: run a module's vectors, or inventory which files are executed and which are only displayed.","ABOUT_SOURCE":"clap /// doc on Commands::Vectors (cli/tri/src/main.rs; module cli/tri/src/vectors.rs)","ACTIONS":["run","debt"],"ACTIONS_ABOUT":["Generate a module's Verilog and execute its registered vectors.","Inventory every vector file: executed, debt, or aspirational."],"AGENTS":[],"AGENTS_NOTE":"No source binds an agent letter to this command: docs/agents/AGENTS_ALPHABET.md (rows, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name it. creator.md and verifier.md name tri gen/test/verify but are not letter agents.","ARGS":[],"COMMAND":"tri vectors","ENABLED":true,"ENTRY":"cli/tri/src/main.rs","FAMILY":"tri-cli","ID":"tri/vectors","KIND":"tool","SOURCE":"cli/tri/src/vectors.rs","VARIANT":"Commands::Vectors","WHEN_TO_USE":"The executed-vector registry: run a module's vectors, or inventory which files are executed and which are only displayed.","WITNESS":"source-parse"},"health":"ok","id":"tri/vectors","inSpecCorpus":false,"links":{"config":null,"pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","source":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/cli/tri/src/vectors.rs"},"messages":["no agent letter bound by a source"],"moduleName":"tool_tri_vectors","name":{"en":"tri vectors"},"repo":"gHashTag/t27","searchText":"tri/vectors tri vectors the executed-vector registry: run a module's vectors, or inventory which files are executed and which are only displayed. the executed-vector registry: run a module's vectors, or inventory which files are executed and which are only displayed. run generate a module's verilog and execute its registered vectors. debt inventory every vector file: executed, debt, or aspirational.","sha256":"71eca92871e96a157876d71f7883bf1928ebaf0c7b293e302a3f67742f7c855e","skills":[],"source":"cli/tri/src/vectors.rs","specPath":"specs/tools/tri/vectors.t27","summary":{"en":"The executed-vector registry: run a module's vectors, or inventory which files are executed and which are only displayed.","ru":"Реестр исполняемых векторов: запустить векторы модуля или проинвентаризировать, какие файлы исполняются, а какие только показываются."},"typecheckOk":true,"variant":"Commands::Vectors","whenToUse":"The executed-vector registry: run a module's vectors, or inventory which files are executed and which are only displayed.","witness":"source-parse"},{"aboutSource":"tri-mcp tool tri_verdict description (cli/tri-mcp/src/main.rs); handler cmd_verdict runs t27c validate-seals, validate-phi-identity and, with --toxic, validate-toxicity (cli/tri/src/main.rs:876)","actions":[],"agents":[{"letter":"V","ok":true}],"args":[{"about":"","name":"--toxic"}],"command":"tri verdict","discarded":0,"entry":"cli/tri/src/main.rs","family":"tri-cli","fields":{"ABOUT":"Checks for toxic regressions by analyzing swarm health metrics.","ABOUT_SOURCE":"tri-mcp tool tri_verdict description (cli/tri-mcp/src/main.rs); handler cmd_verdict runs t27c validate-seals, validate-phi-identity and, with --toxic, validate-toxicity (cli/tri/src/main.rs:876)","ACTIONS":[],"ACTIONS_ABOUT":[],"AGENTS":["V"],"AGENTS_NOTE":".claude/agents/agent-v-verify.md:49 (tri verdict -- Generate pass/fail report); docs/agents/AGENTS_ALPHABET.md:80, PHASE 5 VERDICT: V analyzes metrics, tri verdict --toxic.","ARGS":["--toxic"],"COMMAND":"tri verdict","ENABLED":true,"ENTRY":"cli/tri/src/main.rs","FAMILY":"tri-cli","ID":"tri/verdict","KIND":"tool","SOURCE":"cli/tri/src/main.rs","VARIANT":"Commands::Verdict","WHEN_TO_USE":"Checks for toxic regressions by analyzing swarm health metrics.","WITNESS":"source-parse"},"health":"ok","id":"tri/verdict","inSpecCorpus":false,"links":{"config":null,"pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","source":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/cli/tri/src/main.rs"},"messages":[],"moduleName":"tool_tri_verdict","name":{"en":"tri verdict"},"repo":"gHashTag/t27","searchText":"tri/verdict tri verdict checks for toxic regressions by analyzing swarm health metrics. checks for toxic regressions by analyzing swarm health metrics. v","sha256":"14084cba8d9b4379c147553b4565fafe87a25626524da702983b8f001d7b6b98","skills":[{"id":"t27/tri","via":["SUMMARY_EN"]}],"source":"cli/tri/src/main.rs","specPath":"specs/tools/tri/verdict.t27","summary":{"en":"Checks for toxic regressions by analyzing swarm health metrics.","ru":"Проверяет токсичные регрессии, анализируя метрики здоровья роя."},"typecheckOk":true,"variant":"Commands::Verdict","whenToUse":"Checks for toxic regressions by analyzing swarm health metrics.","witness":"source-parse"},{"aboutSource":"clap /// doc on Commands::Vsim (cli/tri/src/main.rs; module cli/tri/src/vsim.rs)","actions":[{"about":"Walk the corpus through `t27c icarus-simulate` and print the funnel.","name":"funnel"}],"agents":[],"args":[],"command":"tri vsim","discarded":0,"entry":"cli/tri/src/main.rs","family":"tri-cli","fields":{"ABOUT":"How far each spec gets when its generated Verilog is actually RUN.","ABOUT_SOURCE":"clap /// doc on Commands::Vsim (cli/tri/src/main.rs; module cli/tri/src/vsim.rs)","ACTIONS":["funnel"],"ACTIONS_ABOUT":["Walk the corpus through `t27c icarus-simulate` and print the funnel."],"AGENTS":[],"AGENTS_NOTE":"No source binds an agent letter to this command: docs/agents/AGENTS_ALPHABET.md (rows, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name it. creator.md and verifier.md name tri gen/test/verify but are not letter agents.","ARGS":[],"COMMAND":"tri vsim","ENABLED":true,"ENTRY":"cli/tri/src/main.rs","FAMILY":"tri-cli","ID":"tri/vsim","KIND":"tool","SOURCE":"cli/tri/src/vsim.rs","VARIANT":"Commands::Vsim","WHEN_TO_USE":"How far each spec gets when its generated Verilog is actually RUN. The one arm that can catch a defect whose nature is that it compiles, and the one arm whose gate has had no targets since #2283 -- see #2987.","WITNESS":"source-parse"},"health":"ok","id":"tri/vsim","inSpecCorpus":false,"links":{"config":null,"pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","source":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/cli/tri/src/vsim.rs"},"messages":["no agent letter bound by a source"],"moduleName":"tool_tri_vsim","name":{"en":"tri vsim"},"repo":"gHashTag/t27","searchText":"tri/vsim tri vsim how far each spec gets when its generated verilog is actually run. how far each spec gets when its generated verilog is actually run. the one arm that can catch a defect whose nature is that it compiles, and the one arm whose gate has had no targets since #2283 -- see #2987. funnel walk the corpus through `t27c icarus-simulate` and print the funnel.","sha256":"b7f377dd3d32a7392f390554d926d4e2d3ce746cd4f83a89ec1113c8624e1717","skills":[],"source":"cli/tri/src/vsim.rs","specPath":"specs/tools/tri/vsim.t27","summary":{"en":"How far each spec gets when its generated Verilog is actually RUN.","ru":"Как далеко доходит каждая спека, когда её сгенерированный Verilog действительно ЗАПУСКАЮТ."},"typecheckOk":true,"variant":"Commands::Vsim","whenToUse":"How far each spec gets when its generated Verilog is actually RUN. The one arm that can catch a defect whose nature is that it compiles, and the one arm whose gate has had no targets since #2283 -- see #2987.","witness":"source-parse"},{"aboutSource":"clap /// doc on Commands::Window (cli/tri/src/main.rs; module cli/tri/src/window.rs)","actions":[],"agents":[],"args":[{"about":"Record `origin/master` as the base of a measurement starting now.","name":"--start"},{"about":"Report whether the recorded base is still the tip, and refuse if it is not.","name":"--check"},{"about":"The ref the measurement is against. Defaults to `origin/master`.","name":"--base"},{"about":"Run the controls and report, changing nothing.","name":"--self-check"}],"command":"tri window","discarded":0,"entry":"cli/tri/src/main.rs","family":"tri-cli","fields":{"ABOUT":"Was the base you measured against still the tip when you reported?","ABOUT_SOURCE":"clap /// doc on Commands::Window (cli/tri/src/main.rs; module cli/tri/src/window.rs)","ACTIONS":[],"ACTIONS_ABOUT":[],"AGENTS":[],"AGENTS_NOTE":"No source binds an agent letter to this command: docs/agents/AGENTS_ALPHABET.md (rows, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name it. creator.md and verifier.md name tri gen/test/verify but are not letter agents.","ARGS":["--start: Record `origin/master` as the base of a measurement starting now.","--check: Report whether the recorded base is still the tip, and refuse if it is not.","--base: The ref the measurement is against. Defaults to `origin/master`.","--self-check: Run the controls and report, changing nothing."],"COMMAND":"tri window","ENABLED":true,"ENTRY":"cli/tri/src/main.rs","FAMILY":"tri-cli","ID":"tri/window","KIND":"tool","SOURCE":"cli/tri/src/window.rs","VARIANT":"Commands::Window","WHEN_TO_USE":"Was the base you measured against still the tip when you reported?","WITNESS":"source-parse"},"health":"ok","id":"tri/window","inSpecCorpus":false,"links":{"config":null,"pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","source":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/cli/tri/src/window.rs"},"messages":["no agent letter bound by a source"],"moduleName":"tool_tri_window","name":{"en":"tri window"},"repo":"gHashTag/t27","searchText":"tri/window tri window was the base you measured against still the tip when you reported? was the base you measured against still the tip when you reported?","sha256":"b670c8d5ce56fe15d2c0b89254ff7d67a2a838b7c87abb9f57577f120cc5f14b","skills":[],"source":"cli/tri/src/window.rs","specPath":"specs/tools/tri/window.t27","summary":{"en":"Was the base you measured against still the tip when you reported?","ru":"Была ли база, относительно которой вы мерили, всё ещё вершиной, когда вы отчитывались?"},"typecheckOk":true,"variant":"Commands::Window","whenToUse":"Was the base you measured against still the tip when you reported?","witness":"source-parse"},{"aboutSource":"clap /// doc on Commands::Worktrees (cli/tri/src/main.rs; module cli/tri/src/trees.rs)","actions":[],"agents":[],"args":[{"about":"Also measure disk usage. Off by default: `du` over 120 checkouts is slow, and the holdings answer is the one that decides anything.","name":"--size"},{"about":"Print every tree, not only those holding work or unreadable.","name":"--all"}],"command":"tri worktrees","discarded":0,"entry":"cli/tri/src/main.rs","family":"tri-cli","fields":{"ABOUT":"What the checkouts on this disk are holding. Deletes nothing.","ABOUT_SOURCE":"clap /// doc on Commands::Worktrees (cli/tri/src/main.rs; module cli/tri/src/trees.rs)","ACTIONS":[],"ACTIONS_ABOUT":[],"AGENTS":[],"AGENTS_NOTE":"No source binds an agent letter to this command: docs/agents/AGENTS_ALPHABET.md (rows, key files, phase cycle), specs/OWNERS.md and .claude/agents/*.md do not name it. creator.md and verifier.md name tri gen/test/verify but are not letter agents.","ARGS":["--size: Also measure disk usage. Off by default: `du` over 120 checkouts is slow, and the holdings answer is the one that decides anything.","--all: Print every tree, not only those holding work or unreadable."],"COMMAND":"tri worktrees","ENABLED":true,"ENTRY":"cli/tri/src/main.rs","FAMILY":"tri-cli","ID":"tri/worktrees","KIND":"tool","SOURCE":"cli/tri/src/trees.rs","VARIANT":"Commands::Worktrees","WHEN_TO_USE":"What the checkouts on this disk are holding. Deletes nothing.","WITNESS":"source-parse"},"health":"ok","id":"tri/worktrees","inSpecCorpus":false,"links":{"config":null,"pinnedAt":"95c9b61b97d487bec4279ca63eb3132da8d1721c","source":"https://github.com/gHashTag/t27/blob/95c9b61b97d487bec4279ca63eb3132da8d1721c/cli/tri/src/trees.rs"},"messages":["no agent letter bound by a source"],"moduleName":"tool_tri_worktrees","name":{"en":"tri worktrees"},"repo":"gHashTag/t27","searchText":"tri/worktrees tri worktrees what the checkouts on this disk are holding. deletes nothing. what the checkouts on this disk are holding. deletes nothing.","sha256":"862c3a17857c2303bda171bbb3acd1cad2e68e44bf0002caf7f19b78adf0268b","skills":[],"source":"cli/tri/src/trees.rs","specPath":"specs/tools/tri/worktrees.t27","summary":{"en":"What the checkouts on this disk are holding. Deletes nothing.","ru":"Что держат чекауты на этом диске. Ничего не удаляет."},"typecheckOk":true,"variant":"Commands::Worktrees","whenToUse":"What the checkouts on this disk are holding. Deletes nothing.","witness":"source-parse"}],"version":1} diff --git a/apps/website/qa/agents-spec-contract.mjs b/apps/website/qa/agents-spec-contract.mjs index 138bbf22ce..1fecbe1a6a 100644 --- a/apps/website/qa/agents-spec-contract.mjs +++ b/apps/website/qa/agents-spec-contract.mjs @@ -337,8 +337,8 @@ assert.deepEqual(functions.ladder, agents.ladder, 'the functions catalog shows t assert.equal(functionsCode.deployedApp.mainRegisters, functionsCode.functions.length, 'main registers every manifest function') assert.equal(functionsCode.deployedApp.baseFunctions, functions.counts.deployed, 'the production build carries exactly the deployed functions') -// 5. The Queen knows the five explorer views, at the keys the modules list promises. -for (const tab of ['skills', 'crons', 'agents', 'functions', 'tools']) { +// 5. The Queen knows the five explorer views and the PROJECT view, at the keys the modules list promises. +for (const tab of ['skills', 'crons', 'agents', 'functions', 'tools', 'project']) { const m = MODULES.find((x) => x.tab === tab) assert.ok(m, `queenModules has no ${tab} entry`) assert.ok(HUD_VIEWS.includes(tab), `HUD_VIEWS does not include ${tab}`) @@ -352,6 +352,8 @@ for (const [i, m] of MODULES.entries()) assert.equal(m.key, HUD_KEYS[i], `module assert.equal(MODULES.find((m) => m.tab === 'agents').key, '9', 'AGENTS opens on 9') assert.equal(MODULES.find((m) => m.tab === 'functions').key, '0', 'FUNCTIONS opens on 0, the tenth key') assert.equal(MODULES.find((m) => m.tab === 'tools').key, 't', 'TOOLS opens on t: the digits are spent after FUNCTIONS on 0') +assert.equal(MODULES.find((m) => m.tab === 'project').key, 'p', 'PROJECT opens on p (the digits are spent, t is TOOLS)') +assert.equal(HUD_KEYS.slice(0, HUD_VIEWS.length).join(''), '1234567890tp', 'the rail keys are 1-9, 0, t, p in that order') // 6. Translations are connected through .t27 contract specs, never hardcoded. // Every specs/i18n/*.t27 the corpus carries is in both catalogs' i18n lists @@ -365,7 +367,20 @@ const i18nSpecFiles = existsSync(i18nDir) ? readdirSync(i18nDir).filter((f) => f assert.ok(i18nSpecFiles.length >= 1, `${I18N_SPEC_DIR}: at least the Russian contract (agents-ru.t27) must exist`) assert.ok(i18nSpecFiles.includes('agents-ru.t27'), `${I18N_SPEC_DIR}/agents-ru.t27 is the Russian contract`) for (const f of i18nSpecFiles) assert.ok(!CYRILLIC.test(readFileSync(join(i18nDir, f), 'utf8')), `${I18N_SPEC_DIR}/${f}: Cyrillic in a .t27 spec (LANG-EN)`) -assert.deepEqual(skills.i18n.map((l) => l.spec), i18nSpecFiles.map((f) => `${I18N_SPEC_DIR}/${f}`).sort((a, b) => a.localeCompare(b)), 'skills.i18n lists exactly the contract specs') +// The catalogs list the contracts whose SCOPE names their directories; a +// contract scoped to specs/docs belongs to docs-from-specs.mjs and is listed by +// public/docs/system-docs.json instead. Between the two generators every file in +// the directory is claimed exactly once -- read from their outputs, not by +// parsing the specs here. +const docsOut = 'public/docs/system-docs.json' +const docsI18n = existsSync(docsOut) ? JSON.parse(readFileSync(docsOut, 'utf8')).i18n.map((l) => l.spec) : [] +for (const l of skills.i18n) assert.ok(l.scope.some((d) => ['specs/skills', 'specs/crons', 'specs/agents', 'specs/tools'].includes(d)), `${l.spec}: listed by the catalogs but scoped elsewhere (${l.scope.join(', ')})`) +assert.deepEqual( + [...new Set([...skills.i18n.map((l) => l.spec), ...docsI18n])].sort((a, b) => a.localeCompare(b)), + i18nSpecFiles.map((f) => `${I18N_SPEC_DIR}/${f}`).sort((a, b) => a.localeCompare(b)), + 'the catalogs and the docs generator together list exactly the contract specs', +) +assert.ok(skills.i18n.some((l) => l.spec === `${I18N_SPEC_DIR}/agents-ru.t27`), 'skills.i18n lists the Russian catalog contract') assert.deepEqual(crons.i18n.map((l) => l.spec).sort(), skills.i18n.map((l) => l.spec).sort(), 'both catalogs see the same contracts') assert.deepEqual(agents.i18n.map((l) => l.spec).sort(), skills.i18n.map((l) => l.spec).sort(), 'the agent catalog sees the same contracts (SCOPE names specs/agents)') const coverageLine = [] diff --git a/apps/website/qa/docs-spec-contract.mjs b/apps/website/qa/docs-spec-contract.mjs new file mode 100644 index 0000000000..6a9a478f1f --- /dev/null +++ b/apps/website/qa/docs-spec-contract.mjs @@ -0,0 +1,259 @@ +// The system documentation (#/docs), checked against what it claims. +// +// public/docs/system-docs.json is written by scripts/docs-from-specs.mjs from +// public/t27/files/specs/docs/system.t27 and specs/docs/chapters/*.t27 -- through +// the real compiler, not a regex -- plus the English bodies under docs/system/, the +// Russian bundle named by specs/i18n/docs-ru.t27, the two canon documents the laws +// and phases tables are read from, and the four generated catalogs. This gate asks +// what a generated document can still fail: is the committed JSON what the specs +// produce today; does every chapter have a body whose sections are exactly its +// SECTIONS; does every SOURCES path exist (vendored, or in a t27 checkout) with the +// sha the JSON records; is every generated table non-empty and every figure fed; +// does the prose avoid the ranking words the canon forbids, in both languages; and +// does the Queen open the PROJECT view on the promised key. +// +// node --experimental-strip-types qa/docs-spec-contract.mjs + +import assert from 'node:assert/strict' +import { createHash } from 'node:crypto' +import { existsSync, readFileSync, readdirSync, statSync } from 'node:fs' +import { join, resolve } from 'node:path' +import { + CHAPTER_DIR, DIAGRAMS, DOCS_OUT, DOCS_SPEC, FORBIDDEN_EN, FORBIDDEN_RU, I18N_FIELDS, STATUS_TAGS, TABLES, generate, parseLawTable, parsePhases, t27CheckoutRoot, +} from '../scripts/docs-from-specs.mjs' +import { REPO_ROOT } from '../scripts/agents-from-specs.mjs' +import { MODULES } from '../src/lib/queenModules.ts' +import { HUD_VIEWS, HUD_KEYS } from '../src/components/queenHud.ts' + +const sha256 = (bytes) => createHash('sha256').update(bytes).digest('hex') +const CORPUS = 'public/t27/files' +const CYRILLIC = /[\u0400-\u04ff]/ +const HOME_PATH = /(^|[\s"'=:(])(\/Users\/|\/home\/|[A-Z]:\\Users\\)/ +const docs = JSON.parse(readFileSync(DOCS_OUT, 'utf8')) + +// 1. The committed output is what the specs produce today, through the vendored compiler. +const fresh = await generate({ generatedAt: docs.generatedAt }) +assert.deepEqual(fresh.problems, [], 'the generator reports problems:\n' + fresh.problems.join('\n')) +assert.equal(docs.contentSha256, fresh.docs.contentSha256, `${DOCS_OUT} is stale or hand-edited; run node scripts/docs-from-specs.mjs`) +assert.equal(docs.compilerWasmSha256, sha256(readFileSync('public/t27/t27_compiler.wasm')), 'the document names a compiler other than the vendored one') +assert.match(docs.pin.ref, /^[0-9a-f]{40}$/, 'links pin at a t27 commit') + +// 2. Exactly the vendored chapter specs, in the order the document declares. +const vendored = readdirSync(join(CORPUS, CHAPTER_DIR)).filter((f) => f.endsWith('.t27')).map((f) => f.replace(/\.t27$/, '')).sort() +assert.deepEqual([...docs.document.chapters].sort(), vendored, 'CHAPTERS is exactly the vendored specs/docs/chapters files') +assert.deepEqual(docs.chapters.map((c) => c.stem), docs.document.chapters, 'chapters are in CHAPTERS order') +assert.equal(docs.document.id, 'docs/system') +assert.equal(docs.document.specPath, DOCS_SPEC) +assert.equal(sha256(readFileSync(join(CORPUS, DOCS_SPEC))), docs.document.sha256, 'system.t27 bytes changed under the document') +assert.ok(!CYRILLIC.test(readFileSync(join(CORPUS, DOCS_SPEC), 'utf8')), `${DOCS_SPEC}: Cyrillic in a .t27 spec (LANG-EN)`) +assert.equal(docs.document.typecheckOk, true) +assert.deepEqual(docs.document.locales[0], 'en') +for (const d of docs.document.diagrams) assert.ok(DIAGRAMS.includes(d), `DIAGRAMS names ${d}, which the site cannot draw`) +assert.ok(docs.chapters.length >= 5, `${docs.chapters.length} chapters`) + +// 3. Every chapter: right bytes, English spec, body present, sections == SECTIONS, sources resolve with the recorded sha, table non-empty, figure known. +const checkout = t27CheckoutRoot() +const seenTables = new Set(), seenDiagrams = new Set() +const forbidden = (text, locale) => { const re = locale === 'ru' ? FORBIDDEN_RU : FORBIDDEN_EN; re.lastIndex = 0; return re.exec(text.replace(/```[\s\S]*?```/g, ' ').replace(/`[^`]*`/g, ' ')) } +const textOf = (blocks) => blocks.flatMap((b) => b.type === 'p' || b.type === 'quote' ? b.runs : b.type === 'ul' || b.type === 'ol' ? b.items.flat() : b.type === 'h' ? [{ t: 'text', v: b.text }] : []).filter((r) => r.t !== 'code').map((r) => r.v).join(' ') +for (const [i, c] of docs.chapters.entries()) { + const specFile = join(CORPUS, c.specPath) + assert.ok(existsSync(specFile), `${c.id}: ${c.specPath} is not vendored`) + assert.equal(sha256(readFileSync(specFile)), c.sha256, `${c.id}: spec bytes changed under the document`) + const specText = readFileSync(specFile, 'utf8') + assert.ok(!CYRILLIC.test(specText), `${c.specPath}: Cyrillic in a .t27 spec (LANG-EN)`) + assert.ok(!HOME_PATH.test(specText), `${c.specPath}: a developer home path in a spec`) + assert.equal(c.typecheckOk, true, `${c.id}: typecheck`) + assert.equal(c.discarded, 0) + assert.equal(c.order, i + 1, `${c.id}: ORDER is its position`) + assert.equal(c.moduleName, `docs_chapter_${c.stem}`) + assert.equal(c.id, `docs/${c.stem}`) + assert.equal(c.bodyPath, `docs/system/${c.stem}.md`) + const bodyFile = join(CORPUS, c.bodyPath) + assert.ok(existsSync(bodyFile), `${c.id}: body ${c.bodyPath} is not vendored`) + const body = readFileSync(bodyFile, 'utf8') + assert.equal(sha256(Buffer.from(body, 'utf8')), c.bodySha256, `${c.id}: body bytes changed under the document`) + assert.ok(!CYRILLIC.test(body), `${c.bodyPath}: Cyrillic in the English body`) + assert.ok(!HOME_PATH.test(body), `${c.bodyPath}: a developer home path`) + assert.ok(body.startsWith(`# ${c.title.en}\n`), `${c.bodyPath}: starts with "# ${c.title.en}"`) + // Sections: the body's level-2 headings are exactly SECTIONS, each with a body. + const h2 = body.split('\n').filter((l) => /^## /.test(l)).map((l) => l.replace(/^## /, '').trim()) + assert.deepEqual(h2, c.sections.map((s) => s.heading.en), `${c.id}: level-2 headings equal SECTIONS`) + assert.equal(c.body.en.sections.length, c.sections.length) + assert.ok(c.sections.length >= 3, `${c.id}: ${c.sections.length} sections; a chapter has at least three`) + for (const [j, s] of c.body.en.sections.entries()) { + assert.equal(s.heading, c.sections[j].heading.en) + assert.equal(s.id, c.sections[j].id) + assert.ok(s.blocks.length > 0, `${c.id}: section "${s.heading}" has no body`) + assert.ok(textOf(s.blocks).length > 80, `${c.id}: section "${s.heading}" is a stub`) + } + // A lead paragraph before the first heading is optional (six of seven + // chapters open on their first section); the body as a whole must not be empty. + assert.ok(c.body.en.lead.length + c.body.en.sections.reduce((n, s) => n + s.blocks.length, 0) > 0, `${c.id}: empty body`) + // Ranking words: none in the EN body, none in any translation. + assert.equal(forbidden(body, 'en'), null, `${c.bodyPath}: ranking word ${JSON.stringify(forbidden(body, 'en')?.[0])}`) + for (const [locale, b] of Object.entries(c.body)) { + if (locale === 'en') continue + assert.ok(docs.document.locales.includes(locale), `${c.id}: body.${locale} has no LOCALES entry`) + assert.equal(b.sections.length, c.sections.length, `${c.id}: ${locale} body has ${b.sections.length} sections, EN has ${c.sections.length}`) + const txt = textOf([...b.lead, ...b.sections.flatMap((s) => [{ type: 'h', text: s.heading }, ...s.blocks])]) + assert.ok(CYRILLIC.test(txt) || locale !== 'ru', `${c.id}: body.ru is not Russian`) + assert.equal(forbidden(txt, locale), null, `${c.id}: ${locale} ranking word ${JSON.stringify(forbidden(txt, locale)?.[0])}`) + for (const [j, s] of b.sections.entries()) { + assert.ok(s.blocks.length > 0, `${c.id}: ${locale} section ${j + 1} has no body`) + assert.equal(c.sections[j].heading[locale], s.heading) + } + } + for (const locale of Object.keys(c.title)) assert.ok(locale === 'en' || docs.document.locales.includes(locale), `${c.id}: title.${locale} has no LOCALES entry`) + // Sources: every path exists where the record says, with the sha the record says. + assert.ok(c.sources.length > 0, `${c.id}: no SOURCES`) + for (const s of c.sources) { + assert.ok(['vendored', 'checkout'].includes(s.where), `${c.id}: source ${s.path} is ${s.where}`) + const abs = s.repo === 'trinity' ? join(REPO_ROOT, s.rel) : s.where === 'vendored' ? join(CORPUS, s.rel) : checkout ? join(checkout, s.rel) : null + if (s.where === 'checkout' && s.repo === 't27' && !checkout) continue // recorded from a checkout this machine does not have; the sha stays as recorded + assert.ok(abs && existsSync(abs), `${c.id}: source ${s.path} (${s.where}) does not exist at ${abs}`) + if (s.kind === 'dir') { assert.ok(statSync(abs).isDirectory()); assert.equal(s.sha256, null) } else { + assert.equal(s.kind, 'file') + if (s.where === 'vendored' || s.repo === 'trinity') assert.equal(sha256(readFileSync(abs)), s.sha256, `${c.id}: source ${s.path} bytes differ from the recorded sha`) + } + assert.match(s.url, /^https:\/\/github\.com\/gHashTag\/(t27|trinity)\/(blob|tree)\/[0-9a-f]{40}\//, `${c.id}: source ${s.path} url is not pinned`) + assert.ok(!s.rel.startsWith('.github/'), `${c.id}: ${s.path} would vendor a dot-directory under public/`) + } + // Table and figure. + if (c.table) { + assert.ok(TABLES.includes(c.table.kind), `${c.id}: table ${c.table.kind}`) + assert.ok(!seenTables.has(c.table.kind), `${c.id}: table ${c.table.kind} is used by two chapters`) + seenTables.add(c.table.kind) + assert.ok(c.table.rows.length > 0, `${c.id}: table ${c.table.kind} is empty`) + assert.ok(c.table.columns.length > 1) + assert.ok(c.table.source.length > 0, `${c.id}: table without a data source line`) + for (const r of c.table.rows) for (const col of c.table.columns) assert.ok(col in r, `${c.id}: table ${c.table.kind} row misses ${col}`) + } + if (c.diagram) { + assert.ok(docs.document.diagrams.includes(c.diagram), `${c.id}: DIAGRAM ${c.diagram} not declared`) + assert.ok(!seenDiagrams.has(c.diagram), `${c.id}: figure ${c.diagram} is used by two chapters`) + seenDiagrams.add(c.diagram) + assert.ok(docs.figures[c.diagram], `${c.id}: no figure data for ${c.diagram}`) + assert.ok(docs.figures[c.diagram].source.length > 0, `${c.id}: figure ${c.diagram} without a data source line`) + } + assert.equal(c.links.spec, `https://github.com/gHashTag/t27/blob/${docs.pin.ref}/${c.specPath}`) + assert.equal(c.links.body, `https://github.com/gHashTag/t27/blob/${docs.pin.ref}/${c.bodyPath}`) +} +assert.deepEqual([...seenDiagrams].sort(), [...docs.document.diagrams].sort(), 'every declared diagram is drawn by exactly one chapter') + +// 4. Generated tables and figures carry the numbers the catalogs carry. +const agents = JSON.parse(readFileSync('public/agents/spec-agents.json', 'utf8')) +const tools = JSON.parse(readFileSync('public/tools/spec-tools.json', 'utf8')) +const skills = JSON.parse(readFileSync('public/skills/spec-skills.json', 'utf8')) +const crons = JSON.parse(readFileSync('public/crons/spec-crons.json', 'utf8')) +const manifest = JSON.parse(readFileSync('public/t27/manifest.json', 'utf8')) +assert.deepEqual(docs.ladder, { specs: manifest.specs.length, skills: skills.counts.specs, crons: crons.counts.specs, agents: agents.counts.specs, tools: tools.counts.specs, docsChapters: docs.chapters.length }) +assert.deepEqual(docs.figures.ladder.counts, docs.ladder) +assert.equal(docs.figures['agent-ring'].agents.length, agents.agents.length) +assert.deepEqual(docs.figures['agent-ring'].agents.map((a) => a.letter), agents.agents.slice().sort((a, b) => a.ordinal - b.ordinal).map((a) => a.letter)) +for (const a of docs.figures['agent-ring'].agents) assert.ok(['Archetypal', 'Spiritual', 'Physical'].includes(a.layer), `${a.letter}: layer ${a.layer}`) +const tableOf = (kind) => docs.chapters.find((c) => c.table?.kind === kind)?.table +const agentsTable = tableOf('agents'), toolsTable = tableOf('tools'), lawsTable = tableOf('laws'), phasesTable = tableOf('phases'), claimsTable = tableOf('claims'), ladderTable = tableOf('ladder-counts'), witnessTable = tableOf('witnesses') +if (agentsTable) { assert.equal(agentsTable.rows.length, agents.agents.length); for (const r of agentsTable.rows) { const a = agents.agents.find((x) => x.letter === r.letter); assert.ok(a, r.letter); assert.deepEqual(r.skills, a.skills.map((s) => s.id)); assert.deepEqual(r.tools, a.tools.map((t) => t.id)) } } +if (toolsTable) { assert.equal(toolsTable.rows.length, tools.tools.length); for (const r of toolsTable.rows) { const t = tools.tools.find((x) => x.id === r.id); assert.ok(t, r.id); assert.equal(r.witness, t.fields.WITNESS); assert.deepEqual(r.agents, t.agents.map((a) => a.letter)) } } +if (ladderTable) assert.deepEqual(ladderTable.rows.map((r) => r.count), [docs.ladder.specs, docs.ladder.skills, docs.ladder.crons, docs.ladder.agents, docs.ladder.tools]) +if (witnessTable) { + const row = (layer, label) => witnessTable.rows.find((r) => r.layer === layer && r.label === label)?.count + assert.equal(row('Skills', 'spec+code'), skills.counts.specPlusCode) + assert.equal(row('Crons', 'spec+code'), crons.counts.specPlusCode) + assert.equal(row('Agents', 'spec-only'), agents.counts.specOnly) + assert.equal(row('Experience', 'episodes unattributed'), agents.counts.episodesUnattributed) + for (const [w, n] of Object.entries(tools.counts.byWitness)) assert.equal(row('Tools', w), n) +} +// Laws and phases: read again from the vendored canon documents, must agree. +const constitution = readFileSync(join(CORPUS, 'docs/T27-CONSTITUTION.md'), 'utf8') +const alphabet = readFileSync(join(CORPUS, 'docs/agents/AGENTS_ALPHABET.md'), 'utf8') +const laws = parseLawTable(constitution), phases = parsePhases(alphabet) +assert.equal(laws.rows.length, 7, 'the constitution defines L1-L7') +assert.deepEqual(laws.rows.map((l) => l.law), ['L1', 'L2', 'L3', 'L4', 'L5', 'L6', 'L7']) +if (lawsTable) assert.deepEqual(lawsTable.rows, laws.rows) +assert.deepEqual(docs.figures['law-hierarchy'].laws.map((l) => l.law), laws.rows.map((l) => l.law)) +assert.equal(phases.length, 7, 'the alphabet draws six phases plus GIT WORKFLOW') +assert.deepEqual(phases.map((p) => p.n), [1, 2, 3, 4, 5, 6, 7]) +for (const p of phases) assert.ok(p.steps.length > 0, `phase ${p.n} without steps`) +if (phasesTable) assert.deepEqual(phasesTable.rows, phases) +assert.equal(docs.figures['phase-cycle'].phases.length, 7) +// Claims: every row carries one of the five tags, and the tags in use are a subset of the glossary. +if (claimsTable) { assert.ok(claimsTable.rows.length >= 4); for (const r of claimsTable.rows) { assert.ok(STATUS_TAGS.includes(r.tag), r.tag); assert.ok(r.claim.length > 20) } } +// Graph: every edge endpoint exists in a catalog. +const skillIds = new Set(skills.skills.map((s) => s.id)), toolIds = new Set(tools.tools.map((t) => t.id)), agentIds = new Set(agents.agents.map((a) => a.id)), cronIds = new Set(crons.crons.map((c) => c.id)) +for (const e of docs.figures['skills-crons-agents'].edges) { + if (e.kind === 'cron-runs-skill') { assert.ok(cronIds.has(e.from), e.from); assert.ok(skillIds.has(e.to), e.to) } else if (e.kind === 'agent-holds-skill') { assert.ok(agentIds.has(e.from), e.from); assert.ok(skillIds.has(e.to), e.to) } else { assert.equal(e.kind, 'agent-holds-tool'); assert.ok(agentIds.has(e.from), e.from); assert.ok(toolIds.has(e.to), e.to) } +} +assert.equal(docs.figures['skills-crons-agents'].edges.filter((e) => e.kind === 'agent-holds-skill').length, agents.agents.reduce((n, a) => n + a.skills.filter((s) => s.ok).length, 0)) +assert.equal(docs.figures['skills-crons-agents'].edges.filter((e) => e.kind === 'agent-holds-tool').length, agents.agents.reduce((n, a) => n + a.tools.filter((s) => s.ok).length, 0)) +assert.deepEqual(docs.figures['tools-map'].triByAgent, tools.groups.triByAgent) +assert.deepEqual(docs.figures['tools-map'].mcpByRepo, tools.groups.mcpByRepo) + +// 5. Translations: contract scope, coverage adds up, fields are TITLE/BODY only, bundle is the file the contract names. +for (const l of docs.i18n) { + assert.ok(l.scope.includes('specs/docs') || l.scope.includes(CHAPTER_DIR), `${l.spec}: SCOPE must name specs/docs`) + for (const f of l.fields) assert.ok(I18N_FIELDS.includes(f), `${l.spec}: FIELDS ${f}`) + assert.equal(l.coverage.total, docs.chapters.length) + assert.equal(l.coverage.n, docs.chapters.filter((c) => c.body[l.locale]).length) + assert.equal(l.missing.length, l.coverage.total - l.coverage.n) + const bundleAbs = resolve(REPO_ROOT, l.bundle) + assert.ok(existsSync(bundleAbs), `${l.spec}: bundle ${l.bundle} missing`) + const bundle = JSON.parse(readFileSync(bundleAbs, 'utf8')) + assert.equal(bundle.$spec, l.spec) + assert.equal(bundle.locale, l.locale) + assert.ok(!HOME_PATH.test(readFileSync(bundleAbs, 'utf8')), `${l.bundle}: a developer home path`) + assert.equal(docs.counts[`${l.locale}Chapters`], l.coverage.n) +} + +// 6. Counts are sums of the list. +assert.equal(docs.counts.chapters, docs.chapters.length) +assert.equal(docs.counts.enabled, docs.chapters.filter((c) => c.enabled).length) +assert.equal(docs.counts.sections, docs.chapters.reduce((n, c) => n + c.sections.length, 0)) +assert.equal(docs.counts.sources, docs.chapters.reduce((n, c) => n + c.sources.length, 0)) +assert.equal(docs.counts.sourcesVendored + docs.counts.sourcesCheckout, docs.counts.sources) +assert.equal(docs.counts.tables, docs.chapters.filter((c) => c.table).length) +assert.equal(docs.counts.diagrams, docs.chapters.filter((c) => c.diagram).length) +assert.equal(docs.counts.typecheckOk, docs.chapters.length + 1) +assert.equal(docs.counts.laws, laws.rows.length) +assert.equal(docs.counts.phases, phases.length) + +// 7. The Queen opens the PROJECT view on the promised key, and the site routes #/docs. +const m = MODULES.find((x) => x.tab === 'project') +assert.ok(m, 'queenModules has no project entry') +assert.ok(HUD_VIEWS.includes('project')) +assert.equal(HUD_KEYS[HUD_VIEWS.indexOf('project')], m.key) +assert.equal(m.key, 'p', 'PROJECT opens on p (the digits are spent)') +for (const lang of ['en', 'ru']) assert.ok(m[lang].name && m[lang].hint && m[lang].body.length > 40, `project: ${lang} copy missing`) +// the router is src/main.tsx (HashRouter); both #/docs and #/docs/ resolve +const router = readFileSync('src/main.tsx', 'utf8') +assert.match(router, /path="\/docs"/, 'main.tsx routes #/docs') +assert.match(router, /path="\/docs\/:chapter"/, 'main.tsx routes #/docs/') +assert.ok(existsSync('src/pages/SystemDocs.tsx'), 'src/pages/SystemDocs.tsx exists') +assert.ok(existsSync('src/components/SystemDocsFigures.tsx'), 'src/components/SystemDocsFigures.tsx exists') +// every declared diagram is a figure the page can draw: the figure file names +// each kind once as a string, and the page hands every kind to it +const figures = readFileSync('src/components/SystemDocsFigures.tsx', 'utf8') +const systemDocs = readFileSync('src/pages/SystemDocs.tsx', 'utf8') +for (const d of DIAGRAMS) { + assert.ok(figures.includes(`'${d}'`) || figures.includes(`"${d}"`), `SystemDocsFigures.tsx does not draw ${d}`) + assert.ok(systemDocs.includes(`'${d}'`) || systemDocs.includes(`"${d}"`), `SystemDocs.tsx does not name ${d}`) +} +assert.match(figures, /
c.stem)).size >= 6 && ['project', 'rules', 'layers', 'alphabet', 'tooling', 'evidence'].every((s) => docs.chapters.some((c) => c.stem === s)), 'every quick jump names a real chapter') +// the rail documents the key: the hint the rail prints mentions p in both languages +for (const lang of ['en', 'ru']) assert.match(m[lang].hint, /\bp\b|клавиша p/, `project: ${lang} hint does not name the key p`) +// the old GitHub Pages docs link is gone from every place that linked it +for (const f of ['src/components/Footer.tsx', 'src/components/Navigation.tsx', 'src/components/ProductionDashboard.tsx']) assert.ok(!/https:\/\/t27\.ai\/docs\//.test(readFileSync(f, 'utf8')), `${f}: still links the GitHub Pages docs instead of #/docs`) +assert.match(readFileSync('src/components/Navigation.tsx', 'utf8'), /DOCS_URL = '#\/docs'/, 'Navigation DOCS_URL is #/docs') + +console.log( + `docs-spec-contract: ${docs.chapters.length} chapters, ${docs.counts.sections} sections; tables ${docs.counts.tables}, figures ${docs.counts.diagrams}; ` + + `laws ${docs.counts.laws}, phases ${docs.counts.phases}; sources ${docs.counts.sources} (vendored ${docs.counts.sourcesVendored}, checkout ${docs.counts.sourcesCheckout}); ` + + `ru ${docs.counts.ruChapters ?? 0}/${docs.chapters.length}; typecheck ok ${docs.counts.typecheckOk}/${docs.chapters.length + 1}; pinned at ${docs.pin.ref.slice(0, 7)}; PROJECT on key ${m.key}`, +) diff --git a/apps/website/qa/explorer-language-contract.mjs b/apps/website/qa/explorer-language-contract.mjs index 22d7f4dbdf..b08c04da87 100644 --- a/apps/website/qa/explorer-language-contract.mjs +++ b/apps/website/qa/explorer-language-contract.mjs @@ -23,6 +23,7 @@ const PAGES = [ 'src/pages/CronExplorer.tsx', 'src/pages/AgentExplorer.tsx', 'src/pages/ToolExplorer.tsx', + 'src/pages/SystemDocs.tsx', 'src/pages/ClientsConsole.tsx', ] diff --git a/apps/website/qa/queen-viewport-contract.mjs b/apps/website/qa/queen-viewport-contract.mjs index 9cadc1d5c0..61b350664c 100644 --- a/apps/website/qa/queen-viewport-contract.mjs +++ b/apps/website/qa/queen-viewport-contract.mjs @@ -169,6 +169,10 @@ function cleanup() { const DECLARED = [ // the HUD's own scrollers '.queen27-intel-list', '.queen27-sectors-list', '.queen27-context-col', + // the command rail: twelve views + COLLAPSE scroll their own list when a + // window is shorter than the budget (COLLAPSE is sticky at the bottom), and + // the phone icon row scrolls sideways + '.queen27-hud-command', // the Queen's own log: the board's events and the conversation about them '.queen-chat-log', '.queen27-hud-menu', '.queen27-hud-round-pop', @@ -376,9 +380,10 @@ for (const [w, h] of (DEAD ? SIZES.filter(([w]) => w === 1440 || w === 390) : SI const { fail, counts } = result; const zero = []; if (counts.shell !== 1) zero.push('shell'); - // eleven command views (HUD_VIEWS.length): SPECS joined at origin/main a308aa8bc, SKILLS and CRONS with the spec-first agents catalog, - // AGENTS (layer four), FUNCTIONS and TOOLS with specs/agents, specs/functions and specs/tools; - // the gate follows the panel it counts (src/components/queenHud.ts HUD_VIEWS) and qa/agents-spec-contract.mjs holds that list to the modules. + // twelve command views (HUD_VIEWS.length): SPECS joined at origin/main a308aa8bc, SKILLS and CRONS with the spec-first agents catalog, + // AGENTS (layer four), FUNCTIONS and TOOLS with specs/agents, specs/functions and specs/tools, PROJECT (the system + // documentation, key p -- the digits 1-9,0 are spent and t is TOOLS) with specs/docs; + // the gate follows the panel it counts (src/components/queenHud.ts HUD_VIEWS, keys 1234567890tp) and qa/agents-spec-contract.mjs holds that list to the modules. if (counts.commands !== 11) zero.push(`commands=${counts.commands}`); if (counts.resources < 7) zero.push(`resources=${counts.resources}`); if (!DEAD && !phone && w > 1100 && counts.sectors !== 6) zero.push(`sectors=${counts.sectors}`); diff --git a/apps/website/scripts/agents-from-specs.mjs b/apps/website/scripts/agents-from-specs.mjs index 30ec4be136..9f75e5159a 100644 --- a/apps/website/scripts/agents-from-specs.mjs +++ b/apps/website/scripts/agents-from-specs.mjs @@ -79,6 +79,7 @@ export const TOOL_SPEC_SUBDIRS = ['tri', 'mcp'] export const TOOLS_OUT = 'public/tools/spec-tools.json' export const TOOL_FAMILIES = { tri: 'tri-cli', mcp: 'mcp' } export const TOOL_WITNESSES = ['source-parse', 'help-output'] +export const CATALOG_SPEC_DIRS = new Set([SKILL_SPEC_DIR, CRON_SPEC_DIR, AGENT_SPEC_DIR, TOOL_SPEC_DIR]) export const EXPERIENCE_PATH = 'public/agents/experience.json' export const AGENT_LAYERS = ['Archetypal', 'Spiritual', 'Physical'] export const AGENT_COUNT = 27 @@ -704,7 +705,14 @@ export function buildSpecCatalogs({ skillSpecs, cronSpecs, agentSpecs = [], func for (const tl of tools) specsById.set(tl.id, { dir: TOOL_SPEC_DIR, fields: tl.fields }) const locales = [] const seenLocale = new Map() - for (const spec of [...i18nSpecs].sort((a, b) => a.path.localeCompare(b.path))) { + // A translation contract belongs to this generator when its SCOPE names one of the + // four catalog directories; contracts scoped elsewhere (specs/docs -> docs-from-specs.mjs) + // are validated by their own generator and only Cyrillic-checked here. + const ownI18n = i18nSpecs.filter((spec) => { + const scope = plain(spec.consts).SCOPE + return !Array.isArray(scope) || scope.some((d) => CATALOG_SPEC_DIRS.has(d)) + }) + for (const spec of [...ownI18n].sort((a, b) => a.path.localeCompare(b.path))) { const fields = plain(spec.consts) const r = checkI18n({ ...spec, fields }, bundles.get(fields.BUNDLE_PATH) ?? null, specsById) problems.push(...r.problems) diff --git a/apps/website/scripts/docs-from-specs.mjs b/apps/website/scripts/docs-from-specs.mjs new file mode 100644 index 0000000000..9cc6562574 --- /dev/null +++ b/apps/website/scripts/docs-from-specs.mjs @@ -0,0 +1,585 @@ +#!/usr/bin/env node +// docs-from-specs.mjs -- the system documentation (`#/docs`) from `specs/docs/**.t27`. +// +// Reads the vendored `specs/docs/system.t27` and `specs/docs/chapters/.t27` through the +// real compiler (`t27_compiler.wasm`), reads the English bodies the chapters name (Markdown +// under `docs/system/`), the Russian bundle the `specs/i18n/docs-.t27` contract +// names, and the four generated catalogs (skills, crons, agents, tools), and writes +// `public/docs/system-docs.json`: chapters with pre-rendered blocks, generated tables, +// figure data, counts, and every source with its sha256 and a link pinned at a commit. +// +// Nothing here parses a `.t27` with a regular expression; the constants come from the +// compiler's AST. Regular expressions are used on Markdown (the bodies and the two canon +// documents the laws and phases tables are read from) only. +// +// Run: node scripts/docs-from-specs.mjs (write) +// node scripts/docs-from-specs.mjs --check (fail if the committed JSON is stale) +// Produces: public/docs/system-docs.json +import { existsSync, mkdirSync, readFileSync, readdirSync, renameSync, statSync, writeFileSync } from 'node:fs' +import { dirname, join, resolve } from 'node:path' +import { fileURLToPath } from 'node:url' +import { + CYRILLIC, REPO_ROOT, SITE, T27_REPO_URL, agentPin, analyzeSpecFiles, checkSchema, loadCompiler, sha256, sortKeys, +} from './agents-from-specs.mjs' + +const CORPUS = 'public/t27/files' +const WASM = 'public/t27/t27_compiler.wasm' +export const DOCS_SPEC = 'specs/docs/system.t27' +export const CHAPTER_DIR = 'specs/docs/chapters' +export const I18N_SPEC_DIR = 'specs/i18n' +export const DOCS_OUT = 'public/docs/system-docs.json' +export const DOCS_SCOPE = new Set(['specs/docs', CHAPTER_DIR]) +export const VERSION = 1 +const TRINITY_REPO_URL = 'https://github.com/gHashTag/trinity' + +export const DOCS_REQUIRED = { KIND: 'str', ID: 'str', TITLE: 'str', CHAPTERS: 'arr', SOURCES: 'arr', DIAGRAMS: 'arr', LOCALES: 'arr', ENABLED: 'bool' } +export const CHAPTER_REQUIRED = { KIND: 'str', ID: 'str', DOCUMENT: 'str', ORDER: 'u8', TITLE: 'str', SOURCES: 'arr', SECTIONS: 'arr', DIAGRAM: 'str', TABLE: 'str', BODY_EN: 'str', ENABLED: 'bool' } +const I18N_REQUIRED = { + KIND: 'str', LOCALE: 'str', SOURCE_LOCALE: 'str', SCOPE: 'arr', FIELDS: 'arr', BUNDLE_REPO: 'str', BUNDLE_PATH: 'str', + BUNDLE_FORMAT: 'str', KEY: 'str', FALLBACK: 'str', COVERAGE_REQUIRED: 'bool', ORPHANS_ALLOWED: 'bool', ENABLED: 'bool', +} +export const I18N_FIELDS = ['TITLE', 'BODY'] +/** Figures the site can draw from data (src/pages/SystemDocs.tsx). */ +export const DIAGRAMS = ['ladder', 'agent-ring', 'phase-cycle', 'law-hierarchy', 'skills-crons-agents', 'tools-map'] +/** Tables this generator can produce from the catalogs and canon documents. */ +export const TABLES = ['claims', 'laws', 'ladder-counts', 'agents', 'phases', 'tools', 'witnesses'] +export const STATUS_TAGS = ['measured', 'declared', 'specified', 'external', 'not claimed'] + +// Ranking words the canon forbids in first-party prose. English: phrases, so that the +// adverb "only" and ordinals such as "first-party" or "first line" do not trip it. +// Russian: stems (the words are inflected). +export const FORBIDDEN_EN = /\b(the first|world'?s first|first[- ]ever|the only|one of a kind|the best|best[- ]in[- ]class|industry[- ]leading|market[- ]leading|unrivall?ed|unparalleled|revolutionary|groundbreaking|breakthrough)(?![-\w])/gi +export const FORBIDDEN_RU = /(? Object.fromEntries(Object.entries(consts).map(([k, v]) => [k, v.value])) +const readJson = (rel) => (existsSync(join(SITE, rel)) ? JSON.parse(readFileSync(join(SITE, rel), 'utf8')) : null) +export const slug = (text) => text.toLowerCase().replace(/[`*_]/g, '').replace(/[^a-z0-9\u0400-\u04ff]+/g, '-').replace(/^-|-$/g, '') + +// --------------------------------------------------------------------------- +// Markdown -> blocks. The bodies use a small dialect: `#`/`##`/`###` headings, +// paragraphs, `-` and `1.` lists (continuation lines indented), `>` quotes, fenced +// code, and inline `code`, **strong**, [text](url). +// --------------------------------------------------------------------------- +export function inlineRuns(text) { + const runs = [] + const re = /`([^`]+)`|\*\*([^*]+)\*\*|\[([^\]]+)\]\(([^)\s]+)\)/g + let last = 0 + let m + while ((m = re.exec(text))) { + if (m.index > last) runs.push({ t: 'text', v: text.slice(last, m.index) }) + if (m[1] !== undefined) runs.push({ t: 'code', v: m[1] }) + else if (m[2] !== undefined) runs.push({ t: 'strong', v: m[2] }) + else runs.push({ t: 'link', v: m[3], href: m[4] }) + last = re.lastIndex + } + if (last < text.length) runs.push({ t: 'text', v: text.slice(last) }) + return runs +} + +export function parseMarkdown(md) { + const lines = md.replace(/\r\n/g, '\n').split('\n') + const blocks = [] + let title = null + let i = 0 + const flushPara = (buf) => { if (buf.length) blocks.push({ type: 'p', runs: inlineRuns(buf.join(' ').trim()) }) } + let para = [] + while (i < lines.length) { + const line = lines[i] + if (/^```/.test(line)) { + flushPara(para); para = [] + const code = [] + i++ + while (i < lines.length && !/^```/.test(lines[i])) code.push(lines[i++]) + i++ + blocks.push({ type: 'code', text: code.join('\n') }) + continue + } + const h = /^(#{1,3})\s+(.*)$/.exec(line) + if (h) { + flushPara(para); para = [] + const level = h[1].length + const text = h[2].trim() + if (level === 1 && title === null) title = text + else blocks.push({ type: 'h', level, text, id: slug(text) }) + i++ + continue + } + if (/^>\s?/.test(line)) { + flushPara(para); para = [] + const q = [] + while (i < lines.length && /^>\s?/.test(lines[i])) q.push(lines[i++].replace(/^>\s?/, '')) + blocks.push({ type: 'quote', runs: inlineRuns(q.join(' ').trim()) }) + continue + } + const li = /^(-|\d+\.)\s+(.*)$/.exec(line) + if (li) { + flushPara(para); para = [] + const ordered = li[1] !== '-' + const items = [] + while (i < lines.length) { + const m = /^(-|\d+\.)\s+(.*)$/.exec(lines[i]) + if (!m || (m[1] !== '-') !== ordered) break + const buf = [m[2]] + i++ + while (i < lines.length && /^\s{2,}\S/.test(lines[i])) buf.push(lines[i++].trim()) + items.push(inlineRuns(buf.join(' ').trim())) + } + blocks.push({ type: ordered ? 'ol' : 'ul', items }) + continue + } + if (!line.trim()) { flushPara(para); para = []; i++; continue } + para.push(line.trim()) + i++ + } + flushPara(para) + return { title, blocks } +} + +/** Split blocks into `lead` (before the first h2) and `sections` (one per h2). */ +export function sectionize(blocks) { + const lead = [] + const sections = [] + let cur = null + for (const b of blocks) { + if (b.type === 'h' && b.level === 2) { cur = { id: b.id, heading: b.text, blocks: [] }; sections.push(cur); continue } + if (cur) cur.blocks.push(b) + else lead.push(b) + } + return { lead, sections } +} + +const runsText = (runs) => runs.map((r) => (r.t === 'link' ? r.v : r.v)).join('') +const stripCode = (md) => md.replace(/```[\s\S]*?```/g, ' ').replace(/`[^`]*`/g, ' ') + +export function forbiddenIn(md, locale) { + const re = locale === 'ru' ? FORBIDDEN_RU : FORBIDDEN_EN + const text = stripCode(md) + const hits = [] + let m + re.lastIndex = 0 + while ((m = re.exec(text))) { + const start = Math.max(0, m.index - 30) + hits.push({ word: m[0], context: text.slice(start, m.index + m[0].length + 30).replace(/\s+/g, ' ').trim() }) + } + return hits +} + +// --------------------------------------------------------------------------- +// Sources. `path` is t27-root-relative, or trinity-root-relative with a `trinity:` prefix. +// Vendored copies under public/t27/files win; a t27 checkout (T27_ROOT, or a sibling of +// the trinity checkout) is the fallback; the record says which one was read. +// --------------------------------------------------------------------------- +export function t27CheckoutRoot() { + const env = process.env.T27_ROOT + if (env && existsSync(env)) return env + const sibling = resolve(REPO_ROOT, '..', 't27') + return existsSync(sibling) ? sibling : null +} + +export function resolveSource(path, { pin, trinityPin }) { + const isTrinity = path.startsWith('trinity:') + const rel = isTrinity ? path.slice('trinity:'.length) : path + const candidates = isTrinity + ? [{ where: 'checkout', abs: join(REPO_ROOT, rel) }] + : [{ where: 'vendored', abs: join(SITE, CORPUS, rel) }, ...(t27CheckoutRoot() ? [{ where: 'checkout', abs: join(t27CheckoutRoot(), rel) }] : [])] + const repo = isTrinity ? 'trinity' : 't27' + const ref = isTrinity ? trinityPin : pin + const base = isTrinity ? TRINITY_REPO_URL : T27_REPO_URL + for (const c of candidates) { + if (!existsSync(c.abs)) continue + const st = statSync(c.abs) + if (st.isDirectory()) return { path, repo, rel, kind: 'dir', where: c.where, sha256: null, url: `${base}/tree/${ref}/${rel}` } + return { path, repo, rel, kind: 'file', where: c.where, sha256: sha256(readFileSync(c.abs)), url: `${base}/blob/${ref}/${rel}` } + } + return { path, repo, rel, kind: null, where: 'missing', sha256: null, url: `${base}/blob/${ref}/${rel}` } +} + +export function readSourceText(path) { + if (path.startsWith('trinity:')) { const abs = join(REPO_ROOT, path.slice(8)); return existsSync(abs) ? readFileSync(abs, 'utf8') : null } + const vend = join(SITE, CORPUS, path) + if (existsSync(vend)) return readFileSync(vend, 'utf8') + const root = t27CheckoutRoot() + if (root && existsSync(join(root, path))) return readFileSync(join(root, path), 'utf8') + return null +} + +// --------------------------------------------------------------------------- +// Tables read from canon documents (Markdown, regex is fine here). +// --------------------------------------------------------------------------- +/** `### Law Table (L1-L7)` of docs/T27-CONSTITUTION.md -> rows {law, name, body, enforcement}. */ +export function parseLawTable(md) { + const lines = md.split('\n') + const start = lines.findIndex((l) => /^###\s+Law Table/.test(l)) + if (start < 0) return { rows: [], heading: null, priority: null } + const rows = [] + for (let i = start + 1; i < lines.length; i++) { + const l = lines[i] + if (/^#{1,3}\s/.test(l)) break + const m = /^\|\s*\*\*(L\d+)\*\*\s*\|\s*\*\*([^*|]+)\*\*\s*\|\s*(.*?)\s*\|\s*(.*?)\s*\|\s*$/.exec(l) + if (m) rows.push({ law: m[1], name: m[2].trim(), body: m[3].trim(), enforcement: m[4].trim() }) + } + const pm = /(L1\s*>\s*L2[^\n]*?L\d+)/.exec(md) + return { rows, heading: lines[start].replace(/^###\s+/, ''), priority: pm ? pm[1].replace(/\s+/g, ' ') : null } +} + +/** `PHASE N: NAME` boxes of the alphabet's "6-Phase Cycle of AGENT T" -> rows {n, name, note, steps[]}. */ +export function parsePhases(md) { + const lines = md.split('\n') + const start = lines.findIndex((l) => /^###\s+6-Phase Cycle/.test(l)) + if (start < 0) return [] + const phases = [] + let cur = null + for (let i = start + 1; i < lines.length; i++) { + const l = lines[i] + if (/^#{1,3}\s/.test(l)) break + const raw = l.replace(/^[\u2502|]\s*/, '').replace(/\s*[\u2502|]\s*$/, '').trim() + const pm = /^PHASE\s+(\d+):\s+(.+?)\s*$/.exec(raw) + if (pm) { + const name = pm[2].replace(/\s*\((.*)\)\s*$/, '') + const note = /\((.*)\)\s*$/.exec(pm[2])?.[1] ?? '' + cur = { n: Number(pm[1]), name: name.trim(), note, steps: [] } + phases.push(cur) + continue + } + if (cur && /^[\u2022*-]\s+/.test(raw)) cur.steps.push(raw.replace(/^[\u2022*-]\s+/, '').trim()) + } + return phases +} + +/** Bullets carrying a status tag in a body -> rows {tag, claim, sources[]}. */ +export function claimsFrom(md) { + const rows = [] + // Tags are written as code spans, `[measured]`; a bullet that *starts* with one is the + // glossary entry that defines the tag, not a claim. + const tagRe = new RegExp(`\`\\[(${STATUS_TAGS.join('|')})\\]\``) + const items = [] + const lines = md.split('\n') + for (let i = 0; i < lines.length; i++) { + const m = /^-\s+(.*)$/.exec(lines[i]) + if (!m) continue + const buf = [m[1]] + while (i + 1 < lines.length && /^\s{2,}\S/.test(lines[i + 1])) buf.push(lines[++i].trim()) + items.push(buf.join(' ')) + } + for (const it of items) { + const t = tagRe.exec(it) + if (!t || t.index === 0) continue + const claim = it.replace(tagRe, '').replace(/\*\*/g, '').replace(/\s+/g, ' ').replace(/\s+([:,.])/g, '$1').trim() + const sources = [...it.matchAll(/`([^`]+)`/g)].map((x) => x[1]).filter((x) => /^[\w.:@-]*\/[\w./@-]+$|^[\w-]+\.(md|ts|tsx|json|t27|rs|mjs|yml|toml)$/.test(x)) + rows.push({ tag: t[1], claim: claim.length > 220 ? `${claim.slice(0, 217)}...` : claim, sources: [...new Set(sources)].slice(0, 4) }) + } + return rows +} + +// --------------------------------------------------------------------------- +// Build. +// --------------------------------------------------------------------------- +export function buildDocs({ docsSpec, chapterSpecs, i18nSpecs = [], bundles = new Map(), bodies = new Map(), catalogs, sourceTexts = new Map(), pin, trinityPin, compilerWasmSha256, generatedAt }) { + const problems = [] + const warn = [] + for (const s of [docsSpec, ...chapterSpecs, ...i18nSpecs].filter(Boolean)) { + if (s.text !== undefined && CYRILLIC.test(s.text)) problems.push(`${s.path}: Cyrillic in a .t27 spec (t27 LANG-EN; translated text belongs in the bundle a specs/i18n/*.t27 contract points to)`) + } + if (!docsSpec) { problems.push(`${DOCS_SPEC}: missing`); return { docs: null, problems } } + const clean = (s) => { if (!s.verdict.typecheckOk || s.verdict.discarded > 0 || !s.verdict.hirOk) problems.push(`${s.path}: compiler verdict not clean (${JSON.stringify(s.verdict)})`) } + + clean(docsSpec) + problems.push(...checkSchema(docsSpec.consts, DOCS_REQUIRED, {}, docsSpec.path)) + const D = plain(docsSpec.consts) + if (D.KIND !== 'docs') problems.push(`${docsSpec.path}: KIND must be "docs"`) + if (D.ID !== 'docs/system') problems.push(`${docsSpec.path}: ID must be "docs/system"`) + if (docsSpec.moduleName && docsSpec.moduleName !== 'docs_system') problems.push(`${docsSpec.path}: module must be docs_system, is ${docsSpec.moduleName}`) + const diagrams = Array.isArray(D.DIAGRAMS) ? D.DIAGRAMS : [] + for (const d of diagrams) if (!DIAGRAMS.includes(d)) problems.push(`${docsSpec.path}: DIAGRAMS names ${JSON.stringify(d)}, which the site cannot draw (${DIAGRAMS.join(', ')})`) + const locales = Array.isArray(D.LOCALES) ? D.LOCALES : [] + if (locales[0] !== 'en') problems.push(`${docsSpec.path}: LOCALES[0] must be "en"`) + + // Translation contracts in scope. + const localeSets = [] + for (const spec of [...i18nSpecs].sort((a, b) => a.path.localeCompare(b.path))) { + const f = plain(spec.consts) + const scope = Array.isArray(f.SCOPE) ? f.SCOPE : [] + if (!scope.some((d) => DOCS_SCOPE.has(d))) continue + clean(spec) + problems.push(...checkSchema(spec.consts, I18N_REQUIRED, {}, spec.path)) + if (f.KIND !== 'i18n') problems.push(`${spec.path}: KIND must be "i18n"`) + if (f.SOURCE_LOCALE !== 'en' || f.FALLBACK !== 'en') problems.push(`${spec.path}: SOURCE_LOCALE and FALLBACK must be "en"`) + if (f.KEY !== 'ID') problems.push(`${spec.path}: KEY must be "ID"`) + if (f.BUNDLE_FORMAT !== 'json') problems.push(`${spec.path}: BUNDLE_FORMAT must be "json"`) + const expectModule = `i18n_${spec.path.replace(/^specs\/i18n\//, '').replace(/\.t27$/, '').replace(/[^A-Za-z0-9]+/g, '_')}` + if (spec.moduleName && spec.moduleName !== expectModule) problems.push(`${spec.path}: module must be ${expectModule}, is ${spec.moduleName}`) + const fields = Array.isArray(f.FIELDS) ? f.FIELDS : [] + for (const name of fields) if (!I18N_FIELDS.includes(name)) problems.push(`${spec.path}: FIELDS names ${JSON.stringify(name)}; docs bundles carry ${I18N_FIELDS.join(', ')}`) + if (!locales.includes(f.LOCALE)) problems.push(`${spec.path}: LOCALE ${JSON.stringify(f.LOCALE)} is not in ${docsSpec.path} LOCALES (${locales.join(', ')})`) + const entry = { locale: f.LOCALE, spec: spec.path, sha256: spec.sha256, bundle: f.BUNDLE_REPO === 'trinity' ? f.BUNDLE_PATH : `${f.BUNDLE_REPO}:${f.BUNDLE_PATH}`, enabled: f.ENABLED === true, fields, scope, coverage: { n: 0, total: 0 }, missing: [] } + let entries = null + if (f.ENABLED === true) { + if (f.BUNDLE_REPO !== 'trinity') problems.push(`${spec.path}: BUNDLE_REPO must be "trinity" (only a bundle in this repository can be loaded at build time)`) + const bundle = bundles.get(f.BUNDLE_PATH) ?? null + if (!bundle) problems.push(`${spec.path}: bundle ${f.BUNDLE_PATH} is missing or not JSON`) + else { + if (bundle.$spec !== spec.path) problems.push(`${f.BUNDLE_PATH}: $spec is ${JSON.stringify(bundle.$spec)}, the contract is ${spec.path}`) + if (bundle.locale !== f.LOCALE) problems.push(`${f.BUNDLE_PATH}: locale ${JSON.stringify(bundle.locale)} does not match LOCALE ${JSON.stringify(f.LOCALE)}`) + entries = bundle.entries && typeof bundle.entries === 'object' && !Array.isArray(bundle.entries) ? bundle.entries : null + if (!entries) problems.push(`${f.BUNDLE_PATH}: entries must be an object keyed by spec ID`) + } + } + localeSets.push({ locale: f.LOCALE, fields, contract: f, entry, entries, bundlePath: f.BUNDLE_PATH }) + } + for (const l of locales.slice(1)) if (!localeSets.some((x) => x.locale === l)) problems.push(`${docsSpec.path}: LOCALES names ${JSON.stringify(l)} but no specs/i18n/docs-${l}.t27 contract is in scope`) + + // Chapters. + const byId = new Map() + for (const s of chapterSpecs) { + clean(s) + problems.push(...checkSchema(s.consts, CHAPTER_REQUIRED, {}, s.path)) + const f = plain(s.consts) + const stem = s.path.replace(/^.*\//, '').replace(/\.t27$/, '') + if (f.KIND !== 'docs-chapter') problems.push(`${s.path}: KIND must be "docs-chapter"`) + if (f.ID !== `docs/${stem}`) problems.push(`${s.path}: ID must be "docs/${stem}", is ${JSON.stringify(f.ID)}`) + if (f.DOCUMENT !== D.ID) problems.push(`${s.path}: DOCUMENT must be ${JSON.stringify(D.ID)}`) + if (s.moduleName && s.moduleName !== `docs_chapter_${stem}`) problems.push(`${s.path}: module must be docs_chapter_${stem}, is ${s.moduleName}`) + if (typeof f.DIAGRAM === 'string' && f.DIAGRAM !== '' && !diagrams.includes(f.DIAGRAM)) problems.push(`${s.path}: DIAGRAM ${JSON.stringify(f.DIAGRAM)} is not in ${docsSpec.path} DIAGRAMS`) + if (typeof f.TABLE === 'string' && f.TABLE !== '' && !TABLES.includes(f.TABLE)) problems.push(`${s.path}: TABLE ${JSON.stringify(f.TABLE)} is not one the generator produces (${TABLES.join(', ')})`) + if (typeof f.BODY_EN === 'string' && f.BODY_EN !== `docs/system/${stem}.md`) problems.push(`${s.path}: BODY_EN must be docs/system/${stem}.md`) + byId.set(stem, { spec: s, f }) + } + const order = Array.isArray(D.CHAPTERS) ? D.CHAPTERS : [] + for (const id of order) if (!byId.has(id)) problems.push(`${docsSpec.path}: CHAPTERS names ${JSON.stringify(id)} but ${CHAPTER_DIR}/${id}.t27 is missing`) + for (const id of byId.keys()) if (!order.includes(id)) problems.push(`${CHAPTER_DIR}/${id}.t27 is not listed in ${docsSpec.path} CHAPTERS`) + + // Catalog-derived tables and figure data. + const { skills, crons, agents, tools, t27Manifest } = catalogs + const constitution = sourceTexts.get('docs/T27-CONSTITUTION.md') ?? '' + const alphabet = sourceTexts.get('docs/agents/AGENTS_ALPHABET.md') ?? '' + const laws = parseLawTable(constitution) + const phases = parsePhases(alphabet) + const agentRows = (agents?.agents ?? []).map((a) => ({ + letter: a.letter, ordinal: a.ordinal, letterName: a.fields.LETTER_NAME, name: a.fields.NAME, domain: a.fields.DOMAIN, archetype: a.fields.ARCHETYPE, + register: a.fields.REGISTER, layer: a.fields.LAYER, enabled: a.fields.ENABLED === true, skills: (a.skills ?? []).map((x) => x.id), tools: (a.tools ?? []).map((x) => x.id), episodes: a.experience?.episodes ?? 0, + })).sort((a, b) => a.ordinal - b.ordinal) + const toolRows = (tools?.tools ?? []).map((t) => ({ + id: t.id, family: t.family, name: t.family === 'tri-cli' ? t.command : t.fields.SERVER, repo: t.repo, items: t.family === 'tri-cli' ? (t.actions ?? []).length : (t.fields.TOOLS ?? []).length, + agents: (t.agents ?? []).map((x) => x.letter), witness: t.fields.WITNESS, external: t.external === true, + })).sort((a, b) => a.id.localeCompare(b.id)) + const ladder = { + specs: t27Manifest?.specs?.length ?? 0, skills: skills?.counts?.specs ?? 0, crons: crons?.counts?.specs ?? 0, agents: agents?.counts?.specs ?? 0, tools: tools?.counts?.specs ?? 0, docsChapters: order.length, + } + const ladderRows = [ + { layer: 'Specs', dir: 'specs/**', count: ladder.specs, typecheckOk: t27Manifest?.health?.typecheckOk ?? null, source: 'public/t27/manifest.json' }, + { layer: 'Skills', dir: 'specs/skills', count: ladder.skills, typecheckOk: skills?.counts?.typecheckOk ?? null, source: 'public/skills/spec-skills.json' }, + { layer: 'Crons', dir: 'specs/crons', count: ladder.crons, typecheckOk: crons?.counts?.typecheckOk ?? null, source: 'public/crons/spec-crons.json' }, + { layer: 'Agents', dir: 'specs/agents', count: ladder.agents, typecheckOk: agents?.counts?.typecheckOk ?? null, source: 'public/agents/spec-agents.json' }, + { layer: 'Tools', dir: 'specs/tools/{tri,mcp}', count: ladder.tools, typecheckOk: tools?.counts?.typecheckOk ?? null, source: 'public/tools/spec-tools.json' }, + ] + const witnessRows = [ + ...['specPlusCode', 'specOnly', 'codeOnly'].map((k) => ({ layer: 'Skills', label: { specPlusCode: 'spec+code', specOnly: 'spec-only', codeOnly: 'code-only' }[k], count: skills?.counts?.[k] ?? 0, source: 'public/skills/spec-skills.json counts' })), + ...['specPlusCode', 'specOnly', 'codeOnly'].map((k) => ({ layer: 'Crons', label: { specPlusCode: 'spec+code', specOnly: 'spec-only', codeOnly: 'code-only' }[k], count: crons?.counts?.[k] ?? 0, source: 'public/crons/spec-crons.json counts' })), + { layer: 'Crons', label: 'with RUNS', count: crons?.counts?.withRuns ?? 0, source: 'public/crons/spec-crons.json counts' }, + { layer: 'Agents', label: 'with skills (source-bound)', count: agents?.counts?.withSkills ?? 0, source: 'public/agents/spec-agents.json counts' }, + { layer: 'Agents', label: 'with tools (bound both ways)', count: agents?.counts?.withTools ?? 0, source: 'public/agents/spec-agents.json counts' }, + { layer: 'Agents', label: 'spec+experience', count: agents?.counts?.specPlusExperience ?? 0, source: 'public/agents/spec-agents.json counts' }, + { layer: 'Agents', label: 'spec-only', count: agents?.counts?.specOnly ?? 0, source: 'public/agents/spec-agents.json counts' }, + { layer: 'Experience', label: 'episodes attributed', count: agents?.counts?.episodesAttributed ?? 0, source: 'public/agents/experience.json' }, + { layer: 'Experience', label: 'episodes unattributed', count: agents?.counts?.episodesUnattributed ?? 0, source: 'public/agents/experience.json' }, + ...Object.entries(tools?.counts?.byWitness ?? {}).map(([label, count]) => ({ layer: 'Tools', label, count, source: 'public/tools/spec-tools.json counts.byWitness' })), + { layer: 'Tools', label: 'external (tool list not in either repository)', count: tools?.counts?.mcpExternal ?? 0, source: 'public/tools/spec-tools.json counts' }, + { layer: 'All catalogs', label: 'typecheck ok', count: (skills?.counts?.typecheckOk ?? 0) + (crons?.counts?.typecheckOk ?? 0) + (agents?.counts?.typecheckOk ?? 0) + (tools?.counts?.typecheckOk ?? 0), source: 'counts.typecheckOk of the four catalogs' }, + ] + const tables = { + laws: { columns: ['law', 'name', 'body', 'enforcement'], rows: laws.rows, source: 'docs/T27-CONSTITUTION.md, section 2', note: laws.priority ? `Priority: ${laws.priority}` : '' }, + phases: { columns: ['n', 'name', 'steps'], rows: phases, source: 'docs/agents/AGENTS_ALPHABET.md, "6-Phase Cycle of AGENT T"', note: '' }, + 'ladder-counts': { columns: ['layer', 'dir', 'count', 'typecheckOk', 'source'], rows: ladderRows, source: 'the four catalog JSON files and public/t27/manifest.json', note: '' }, + agents: { columns: ['letter', 'ordinal', 'letterName', 'domain', 'archetype', 'register', 'layer', 'skills', 'tools'], rows: agentRows, source: 'public/agents/spec-agents.json', note: '' }, + tools: { columns: ['id', 'family', 'name', 'repo', 'items', 'agents', 'witness', 'external'], rows: toolRows, source: 'public/tools/spec-tools.json', note: '' }, + witnesses: { columns: ['layer', 'label', 'count', 'source'], rows: witnessRows, source: 'counts of the four catalog JSON files and public/agents/experience.json', note: '' }, + claims: { columns: ['tag', 'claim', 'sources'], rows: [], source: 'status-tagged bullets of docs/system/project.md', note: '' }, + } + const projectBody = bodies.get('docs/system/project.md') + if (projectBody) tables.claims.rows = claimsFrom(projectBody) + + // Figure data. + const graphEdges = [] + for (const c of crons?.crons ?? []) for (const r of c.runs ?? []) if (r.ok) graphEdges.push({ from: c.id, to: r.id, kind: 'cron-runs-skill' }) + for (const a of agents?.agents ?? []) { + for (const s of a.skills ?? []) if (s.ok) graphEdges.push({ from: a.id, to: s.id, kind: 'agent-holds-skill' }) + for (const t of a.tools ?? []) if (t.ok) graphEdges.push({ from: a.id, to: t.id, kind: 'agent-holds-tool' }) + } + const figures = { + ladder: { counts: ladder, source: 'public/*/spec-*.json counts and public/t27/manifest.json' }, + 'agent-ring': { agents: agentRows.map((a) => ({ letter: a.letter, ordinal: a.ordinal, layer: a.layer, name: a.name, skills: a.skills.length, tools: a.tools.length })), source: 'public/agents/spec-agents.json' }, + 'phase-cycle': { phases: phases.map((p) => ({ n: p.n, name: p.name, note: p.note, steps: p.steps.length })), source: 'docs/agents/AGENTS_ALPHABET.md' }, + 'law-hierarchy': { laws: laws.rows.map((l) => ({ law: l.law, name: l.name })), priority: laws.priority, source: 'docs/T27-CONSTITUTION.md' }, + 'skills-crons-agents': { edges: graphEdges, counts: { skills: ladder.skills, crons: ladder.crons, agents: ladder.agents, tools: ladder.tools }, source: 'public/crons/spec-crons.json RUNS, public/agents/spec-agents.json SKILLS/TOOLS' }, + 'tools-map': { triByAgent: tools?.groups?.triByAgent ?? {}, mcpByRepo: tools?.groups?.mcpByRepo ?? {}, external: toolRows.filter((t) => t.external).map((t) => t.id), source: 'public/tools/spec-tools.json groups' }, + } + if (!laws.rows.length) problems.push('docs/T27-CONSTITUTION.md: no rows read from the Law Table (the laws table and law-hierarchy figure would be empty)') + if (!phases.length) problems.push('docs/agents/AGENTS_ALPHABET.md: no PHASE N: lines read from the 6-Phase Cycle (the phases table would be empty)') + + // Sources of the document. + const docSources = (Array.isArray(D.SOURCES) ? D.SOURCES : []).map((p) => resolveSource(p, { pin, trinityPin })) + for (const s of docSources) if (s.where === 'missing') problems.push(`${docsSpec.path}: SOURCES names ${s.path}, which is neither vendored under ${CORPUS} nor in the t27 checkout`) + + // Assemble chapters. + const chapters = [] + for (const id of order) { + const ch = byId.get(id) + if (!ch) continue + const { spec, f } = ch + const sections = Array.isArray(f.SECTIONS) ? f.SECTIONS : [] + const md = bodies.get(f.BODY_EN) ?? null + let en = { title: null, lead: [], sections: [] } + if (md === null) problems.push(`${spec.path}: BODY_EN ${f.BODY_EN} is missing from ${CORPUS}`) + else { + const parsed = parseMarkdown(md) + const { lead, sections: secs } = sectionize(parsed.blocks) + if (!parsed.title) problems.push(`${f.BODY_EN}: must start with a level-1 heading`) + else if (parsed.title !== f.TITLE) problems.push(`${f.BODY_EN}: level-1 heading ${JSON.stringify(parsed.title)} differs from TITLE ${JSON.stringify(f.TITLE)}`) + const heads = secs.map((s) => s.heading) + if (JSON.stringify(heads) !== JSON.stringify(sections)) problems.push(`${f.BODY_EN}: level-2 headings ${JSON.stringify(heads)} must equal SECTIONS ${JSON.stringify(sections)}`) + for (const s of secs) if (!s.blocks.length) problems.push(`${f.BODY_EN}: section ${JSON.stringify(s.heading)} has no body`) + if (!secs.length) problems.push(`${f.BODY_EN}: no sections`) + if (CYRILLIC.test(md)) problems.push(`${f.BODY_EN}: Cyrillic in the English body (LANG-EN)`) + for (const hit of forbiddenIn(md, 'en')) problems.push(`${f.BODY_EN}: ranking word ${JSON.stringify(hit.word)}: "...${hit.context}..."`) + en = { title: parsed.title, lead, sections: secs } + } + const translations = {} + for (const L of localeSets) { + const e = L.entries?.[f.ID] + L.entry.coverage.total += 1 + if (!e) { L.entry.missing.push(f.ID); continue } + const tr = {} + for (const [k, v] of Object.entries(e)) { + if (!L.fields.includes(k)) { problems.push(`${L.bundlePath}: entry ${f.ID} carries ${JSON.stringify(k)}, which is not in FIELDS (${L.fields.join(', ')})`); continue } + if (typeof v !== 'string' || !v.trim()) { problems.push(`${L.bundlePath}: entry ${f.ID}.${k} must be a non-empty string`); continue } + tr[k] = v + } + if (tr.BODY) { + const parsed = parseMarkdown(tr.BODY) + const { lead, sections: secs } = sectionize(parsed.blocks) + if (secs.length !== sections.length) problems.push(`${L.bundlePath}: entry ${f.ID}.BODY has ${secs.length} level-2 heading(s), the English body has ${sections.length}`) + for (const hit of forbiddenIn(tr.BODY, L.locale)) problems.push(`${L.bundlePath}: entry ${f.ID}.BODY ranking word ${JSON.stringify(hit.word)}: "...${hit.context}..."`) + translations[L.locale] = { title: tr.TITLE ?? null, lead, sections: secs } + } else if (tr.TITLE) translations[L.locale] = { title: tr.TITLE, lead: [], sections: [] } + if (tr.TITLE && forbiddenIn(tr.TITLE, L.locale).length) problems.push(`${L.bundlePath}: entry ${f.ID}.TITLE carries a ranking word`) + L.entry.coverage.n += 1 + } + const srcs = (Array.isArray(f.SOURCES) ? f.SOURCES : []).map((p) => resolveSource(p, { pin, trinityPin })) + for (const s of srcs) if (s.where === 'missing') problems.push(`${spec.path}: SOURCES names ${s.path}, which is neither vendored under ${CORPUS} nor in the t27 checkout`) + const table = f.TABLE && tables[f.TABLE] ? { kind: f.TABLE, ...tables[f.TABLE] } : null + if (f.TABLE && table && !table.rows.length) problems.push(`${spec.path}: TABLE ${f.TABLE} generated no rows`) + chapters.push({ + id: f.ID, stem: id, order: f.ORDER, enabled: f.ENABLED === true, specPath: spec.path, sha256: spec.sha256, moduleName: spec.moduleName, typecheckOk: spec.verdict.typecheckOk, discarded: spec.verdict.discarded, + title: { en: f.TITLE, ...Object.fromEntries(Object.entries(translations).filter(([, v]) => v.title).map(([k, v]) => [k, v.title])) }, + sections: sections.map((h, i) => ({ id: slug(h), heading: { en: h, ...Object.fromEntries(Object.entries(translations).filter(([, v]) => v.sections[i]).map(([k, v]) => [k, v.sections[i].heading])) } })), + body: { en, ...Object.fromEntries(Object.entries(translations).filter(([, v]) => v.sections.length).map(([k, v]) => [k, { lead: v.lead, sections: v.sections }])) }, + bodyPath: f.BODY_EN, bodySha256: md === null ? null : sha256(Buffer.from(md, 'utf8')), diagram: f.DIAGRAM || null, table, sources: srcs, + links: { spec: `${T27_REPO_URL}/blob/${pin}/${spec.path}`, body: `${T27_REPO_URL}/blob/${pin}/${f.BODY_EN}` }, + }) + if (f.ORDER !== order.indexOf(id) + 1) problems.push(`${spec.path}: ORDER ${f.ORDER} does not match its position ${order.indexOf(id) + 1} in CHAPTERS`) + } + // Orphans and coverage per locale. + for (const L of localeSets) { + for (const id of Object.keys(L.entries ?? {})) { + if (id === D.ID) continue + if (!chapters.some((c) => c.id === id)) { if (L.contract.ORPHANS_ALLOWED !== true) problems.push(`${L.bundlePath}: entry ${JSON.stringify(id)} matches no chapter and ORPHANS_ALLOWED is false`) } + } + if (L.contract.COVERAGE_REQUIRED === true && L.entry.missing.length) problems.push(`${L.entry.spec}: COVERAGE_REQUIRED and ${L.entry.missing.length} chapter(s) have no ${L.locale} entry`) + L.entry.missing.sort() + } + const docTitle = { en: D.TITLE } + for (const L of localeSets) { const t = L.entries?.[D.ID]?.TITLE; if (typeof t === 'string' && t.trim()) docTitle[L.locale] = t } + + const counts = { + chapters: chapters.length, enabled: chapters.filter((c) => c.enabled).length, sections: chapters.reduce((n, c) => n + c.sections.length, 0), typecheckOk: chapters.filter((c) => c.typecheckOk).length + (docsSpec.verdict.typecheckOk ? 1 : 0), + specs: chapters.length + 1 + localeSets.length, sources: chapters.reduce((n, c) => n + c.sources.length, 0), sourcesVendored: chapters.reduce((n, c) => n + c.sources.filter((s) => s.where === 'vendored').length, 0), + sourcesCheckout: chapters.reduce((n, c) => n + c.sources.filter((s) => s.where === 'checkout').length, 0), tables: chapters.filter((c) => c.table).length, diagrams: chapters.filter((c) => c.diagram).length, + laws: laws.rows.length, phases: phases.length, ...Object.fromEntries(localeSets.map((L) => [`${L.locale}Chapters`, L.entry.coverage.n])), + } + const docs = sortKeys({ + version: VERSION, compilerWasmSha256, generatedAt, + pin: { ref: pin, trinity: trinityPin, source: 'public/agents/experience.json sources[t27].commit / sources[trinity].commit' }, + document: { id: D.ID, title: docTitle, specPath: docsSpec.path, sha256: docsSpec.sha256, typecheckOk: docsSpec.verdict.typecheckOk, chapters: order, diagrams, locales, enabled: D.ENABLED === true, sources: docSources, link: `${T27_REPO_URL}/blob/${pin}/${docsSpec.path}` }, + chapters, figures, ladder, counts, i18n: localeSets.map((L) => L.entry), warnings: warn, + }) + const { generatedAt: _g, ...rest } = docs + docs.contentSha256 = sha256(Buffer.from(JSON.stringify(rest))) + return { docs, problems } +} + +// --------------------------------------------------------------------------- +// IO. +// --------------------------------------------------------------------------- +function readSpecDir(dir) { + const abs = join(SITE, CORPUS, dir) + if (!existsSync(abs)) return [] + return readdirSync(abs).filter((f) => f.endsWith('.t27')).sort().map((f) => ({ path: `${dir}/${f}`, text: readFileSync(join(abs, f), 'utf8') })) +} + +export async function generate({ generatedAt } = {}) { + const wasmBytes = readFileSync(join(SITE, WASM)) + const analyze = await loadCompiler(wasmBytes) + const sysAbs = join(SITE, CORPUS, DOCS_SPEC) + const docsSpec = existsSync(sysAbs) ? analyzeSpecFiles(analyze, [{ path: DOCS_SPEC, text: readFileSync(sysAbs, 'utf8') }])[0] : null + const chapterSpecs = analyzeSpecFiles(analyze, readSpecDir(CHAPTER_DIR)) + const i18nSpecs = analyzeSpecFiles(analyze, readSpecDir(I18N_SPEC_DIR)) + const bundles = new Map() + for (const s of i18nSpecs) { + const path = plain(s.consts).BUNDLE_PATH + if (typeof path !== 'string' || path.includes('..')) continue + const abs = join(REPO_ROOT, path) + if (existsSync(abs)) { try { bundles.set(path, JSON.parse(readFileSync(abs, 'utf8'))) } catch { bundles.set(path, null) } } + } + const bodies = new Map() + for (const s of chapterSpecs) { + const p = plain(s.consts).BODY_EN + if (typeof p !== 'string') continue + const abs = join(SITE, CORPUS, p) + if (existsSync(abs)) bodies.set(p, readFileSync(abs, 'utf8')) + } + const sourceTexts = new Map() + for (const p of ['docs/T27-CONSTITUTION.md', 'docs/agents/AGENTS_ALPHABET.md']) { const t = readSourceText(p); if (t !== null) sourceTexts.set(p, t) } + const experience = readJson('public/agents/experience.json') + const pin = agentPin(experience).ref + const trinity = (experience?.sources ?? []).find((x) => x.repo === 'trinity' && /^[0-9a-f]{40}$/.test(x.commit ?? '')) + const trinityPin = trinity ? trinity.commit : 'main' + const epoch = process.env.SOURCE_DATE_EPOCH + const stamp = generatedAt ?? (epoch ? new Date(Number(epoch) * 1000).toISOString() : new Date().toISOString()) + return buildDocs({ + docsSpec, chapterSpecs, i18nSpecs, bundles, bodies, sourceTexts, pin, trinityPin, + catalogs: { skills: readJson('public/skills/spec-skills.json'), crons: readJson('public/crons/spec-crons.json'), agents: readJson('public/agents/spec-agents.json'), tools: readJson('public/tools/spec-tools.json'), t27Manifest: readJson('public/t27/manifest.json') }, + compilerWasmSha256: sha256(wasmBytes), generatedAt: stamp, + }) +} + +function writeAtomic(rel, data) { + const dest = join(SITE, rel) + mkdirSync(dirname(dest), { recursive: true }) + const temp = `${dest}.${process.pid}.tmp` + writeFileSync(temp, `${JSON.stringify(data)}\n`, { flag: 'wx' }) + renameSync(temp, dest) +} + +async function main(argv) { + const check = argv.includes('--check') + const { docs, problems } = await generate() + if (problems.length) { + console.error(`docs-from-specs: ${problems.length} problem(s)`) + for (const p of problems) console.error(' ' + p) + process.exit(1) + } + if (check) { + const prior = readJson(DOCS_OUT) + if (prior?.contentSha256 !== docs.contentSha256) { console.error(`docs-from-specs: committed output is stale: ${DOCS_OUT} -- run node scripts/docs-from-specs.mjs`); process.exit(1) } + console.log(`docs-from-specs: ${DOCS_OUT} matches the specs`) + return + } + writeAtomic(DOCS_OUT, docs) + const c = docs.counts + console.log(`docs-from-specs: ${c.chapters} chapters (${c.sections} sections; typecheck ok ${c.typecheckOk}/${c.chapters + 1}; tables ${c.tables}, figures ${c.diagrams}; laws ${c.laws}, phases ${c.phases}; sources ${c.sources}: vendored ${c.sourcesVendored}, checkout ${c.sourcesCheckout}; pinned at ${docs.pin.ref.slice(0, 7)}) -> ${DOCS_OUT}`) + for (const l of docs.i18n) console.log(`docs-from-specs: i18n ${l.locale} via ${l.spec} -> ${l.bundle}: chapters ${l.coverage.n}/${l.coverage.total}${l.missing.length ? ` (missing ${l.missing.join(', ')})` : ''}${l.enabled ? '' : ' (disabled)'}`) +} + +if (process.argv[1] && resolve(process.argv[1]) === fileURLToPath(import.meta.url)) { + main(process.argv.slice(2)).catch((e) => { console.error(e); process.exit(1) }) +} diff --git a/apps/website/scripts/docs-from-specs.test.mjs b/apps/website/scripts/docs-from-specs.test.mjs new file mode 100644 index 0000000000..6df8b69b0c --- /dev/null +++ b/apps/website/scripts/docs-from-specs.test.mjs @@ -0,0 +1,207 @@ +// What the docs generator refuses, and what it lets through. +// +// The failures are the interesting cases: a chapter whose ORDER disagrees with +// CHAPTERS, a body whose headings are not the SECTIONS, a table the generator cannot +// produce, a ranking word in either language, Cyrillic in a spec, a source that does +// not exist. The Markdown reader and the two canon-document parsers are pinned on +// small fixtures so a change in their shape fails here, not on the page. +// +// node --test scripts/docs-from-specs.test.mjs + +import test from 'node:test' +import assert from 'node:assert/strict' +import { readFileSync } from 'node:fs' +import { join } from 'node:path' +import { SITE, analyzeSpecFiles, loadCompiler } from './agents-from-specs.mjs' +import { + buildDocs, claimsFrom, forbiddenIn, inlineRuns, parseLawTable, parseMarkdown, parsePhases, sectionize, slug, +} from './docs-from-specs.mjs' + +const analyze = await loadCompiler(readFileSync(join(SITE, 'public/t27/t27_compiler.wasm'))) +const q = JSON.stringify + +const systemSrc = ({ chapters = ['one', 'two'], diagrams = ['ladder', 'law-hierarchy'], locales = ['en'], sources = ['SOUL.md'] } = {}) => `module docs_system; +pub const KIND : str = "docs"; +pub const ID : str = "docs/system"; +pub const TITLE : str = "The system"; +pub const CHAPTERS : [${chapters.length}]str = ${q(chapters)}; +pub const SOURCES : [${sources.length}]str = ${q(sources)}; +pub const DIAGRAMS : [${diagrams.length}]str = ${q(diagrams)}; +pub const LOCALES : [${locales.length}]str = ${q(locales)}; +pub const ENABLED : bool = true; +` +const chapterSrc = (stem, order, { sections = ['Alpha', 'Beta'], diagram = '', table = '', sources = ['SOUL.md'], title = `Chapter ${stem}`, module = `docs_chapter_${stem}`, extra = '' } = {}) => `module ${module}; +pub const KIND : str = "docs-chapter"; +pub const ID : str = ${q(`docs/${stem}`)}; +pub const DOCUMENT : str = "docs/system"; +pub const ORDER : u8 = ${order}; +pub const TITLE : str = ${q(title)}; +pub const SOURCES : [${sources.length}]str = ${q(sources)}; +pub const SECTIONS : [${sections.length}]str = ${q(sections)}; +pub const DIAGRAM : str = ${q(diagram)}; +pub const TABLE : str = ${q(table)}; +pub const BODY_EN : str = ${q(`docs/system/${stem}.md`)}; +pub const ENABLED : bool = true; +${extra}` +const i18nSrc = (locale = 'ru') => `module i18n_docs_${locale}; +pub const KIND : str = "i18n"; +pub const LOCALE : str = ${q(locale)}; +pub const SOURCE_LOCALE : str = "en"; +pub const SCOPE : [2]str = ["specs/docs", "specs/docs/chapters"]; +pub const FIELDS : [2]str = ["TITLE", "BODY"]; +pub const BUNDLE_REPO : str = "trinity"; +pub const BUNDLE_PATH : str = "apps/website/i18n/docs.${locale}.json"; +pub const BUNDLE_FORMAT : str = "json"; +pub const KEY : str = "ID"; +pub const FALLBACK : str = "en"; +pub const COVERAGE_REQUIRED : bool = false; +pub const ORPHANS_ALLOWED : bool = false; +pub const ENABLED : bool = true; +` +const body = (title, sections = ['Alpha', 'Beta']) => `# ${title}\n\nA lead paragraph with \`code\` and **strong** words.\n\n${sections.map((s) => `## ${s}\n\nBody of ${s}, long enough to count as prose rather than a stub, with a [link](https://example.org/x).\n\n- item one\n- item two\n continued\n`).join('\n')}` + +const CONSTITUTION = `# C\n\n## 2. Laws\n\n### Law Table (L1-L7)\n\n| Law # | Name | Body | Enforcement |\n|---|---|---|---|\n| **L1** | **TRACEABILITY** | Every artifact traces | tri verdict |\n| **L2** | **GENERATION** | Generated, not written | codegen |\n\nPriority: L1 > L2 > L7.\n\n## 3. Next\n` +const ALPHABET = `# A\n\n### 6-Phase Cycle of AGENT T\n\n\`\`\`\n│ PHASE 1: PLAN │\n│ • read the issue │\n│ • pick a cell │\n│ PHASE 2: ASSIGN │\n│ • choose a letter │\n│ PHASE 7: GIT WORKFLOW (new — SOUL law) │\n│ • \`tri git push\` │\n\`\`\`\n\n### Next section\n\n│ PHASE 9: NOT HERE │\n` + +const catalogs = () => ({ + skills: { counts: { specs: 2, specPlusCode: 2, specOnly: 0, codeOnly: 0, typecheckOk: 2 }, skills: [{ id: 't27/a' }, { id: 't27/b' }] }, + crons: { counts: { specs: 1, specPlusCode: 1, specOnly: 0, codeOnly: 0, typecheckOk: 1, withRuns: 1 }, crons: [{ id: 't27/c', runs: [{ id: 't27/a', ok: true }] }] }, + agents: { counts: { specs: 1, typecheckOk: 1, withSkills: 1, withTools: 0, specPlusExperience: 0, specOnly: 1, episodesAttributed: 0, episodesUnattributed: 3 }, agents: [{ id: 't27/T', letter: 'T', ordinal: 20, fields: { LETTER_NAME: 'Tau', NAME: 'Tau', DOMAIN: 'Queen', ARCHETYPE: 'x', REGISTER: 'R19', LAYER: 'Physical', ENABLED: true }, skills: [{ id: 't27/a', ok: true }], tools: [], experience: { episodes: 0 } }] }, + tools: { counts: { specs: 1, typecheckOk: 1, byWitness: { 'source-parse': 1, 'help-output': 0 }, mcpExternal: 0 }, tools: [{ id: 'tri/gen', family: 'tri-cli', command: 'tri gen', repo: 'gHashTag/t27', actions: [], agents: [], fields: { WITNESS: 'source-parse' }, external: false }], groups: { triByAgent: { '-': ['tri/gen'] }, mcpByRepo: {} } }, + t27Manifest: { specs: [{}, {}, {}], health: { typecheckOk: 3 } }, +}) + +function build(overrides = {}) { + const { systemText = systemSrc(), chapterTexts = { one: chapterSrc('one', 1, { diagram: 'ladder', table: 'laws' }), two: chapterSrc('two', 2, { diagram: 'law-hierarchy', table: 'phases' }) }, bodies = new Map([['docs/system/one.md', body('Chapter one')], ['docs/system/two.md', body('Chapter two')]]), i18nTexts = [], bundles = new Map() } = overrides + const docsSpec = analyzeSpecFiles(analyze, [{ path: 'specs/docs/system.t27', text: systemText }])[0] + const chapterSpecs = analyzeSpecFiles(analyze, Object.entries(chapterTexts).map(([stem, text]) => ({ path: `specs/docs/chapters/${stem}.t27`, text }))) + const i18nSpecs = analyzeSpecFiles(analyze, i18nTexts.map((text, i) => ({ path: `specs/i18n/docs-${['ru', 'de'][i]}.t27`, text }))) + return buildDocs({ + docsSpec, chapterSpecs, i18nSpecs, bundles, bodies, catalogs: catalogs(), sourceTexts: new Map([['docs/T27-CONSTITUTION.md', CONSTITUTION], ['docs/agents/AGENTS_ALPHABET.md', ALPHABET]]), + pin: 'a'.repeat(40), trinityPin: 'b'.repeat(40), compilerWasmSha256: 'x', generatedAt: '2026-01-01T00:00:00.000Z', + }) +} + +test('markdown: headings, paragraphs, lists, quotes, code, inline runs', () => { + const { title, blocks } = parseMarkdown('# T\n\nPara one\ncontinues.\n\n## S1\n\n- a `c`\n- b **s**\n more\n\n1. x\n2. y\n\n> quoted [l](https://e.org)\n\n```\ncode\n```\n\n### Sub\n') + assert.equal(title, 'T') + assert.deepEqual(blocks.map((b) => b.type), ['p', 'h', 'ul', 'ol', 'quote', 'code', 'h']) + assert.deepEqual(blocks[0].runs, [{ t: 'text', v: 'Para one continues.' }]) + assert.deepEqual(blocks[2].items[1], [{ t: 'text', v: 'b ' }, { t: 'strong', v: 's' }, { t: 'text', v: ' more' }]) + assert.deepEqual(blocks[4].runs, [{ t: 'text', v: 'quoted ' }, { t: 'link', v: 'l', href: 'https://e.org' }]) + assert.equal(blocks[5].text, 'code') + assert.equal(blocks[6].level, 3) + const { lead, sections } = sectionize(blocks) + assert.equal(lead.length, 1) + assert.equal(sections.length, 1) + assert.equal(sections[0].id, 's1') + assert.equal(sections[0].blocks.length, 5) + assert.deepEqual(inlineRuns('plain'), [{ t: 'text', v: 'plain' }]) + assert.equal(slug('The 27-agent alphabet'), 'the-27-agent-alphabet') +}) + +test('forbidden words: phrases in English, stems in Russian, code spans and hyphen compounds ignored', () => { + assert.equal(forbiddenIn('the first-party docs; only seven laws; the best-effort path; a first step', 'en').length, 0) + assert.deepEqual(forbiddenIn('this is the first spec language and a breakthrough', 'en').map((h) => h.word), ['the first', 'breakthrough']) + assert.equal(forbiddenIn('`the first` in code is fine', 'en').length, 0) + assert.equal(forbiddenIn('Во-первых, первопричина и первичный ключ', 'ru').length, 0) + assert.deepEqual(forbiddenIn('первый в мире, единственный и лучший', 'ru').map((h) => h.word), ['первый', 'единственный', 'лучший']) +}) + +test('law table and phase cycle are read from the canon documents', () => { + const laws = parseLawTable(CONSTITUTION) + assert.deepEqual(laws.rows, [{ law: 'L1', name: 'TRACEABILITY', body: 'Every artifact traces', enforcement: 'tri verdict' }, { law: 'L2', name: 'GENERATION', body: 'Generated, not written', enforcement: 'codegen' }]) + assert.equal(laws.priority, 'L1 > L2 > L7') + assert.deepEqual(parseLawTable('# no table').rows, []) + const phases = parsePhases(ALPHABET) + assert.deepEqual(phases.map((p) => [p.n, p.name, p.steps.length]), [[1, 'PLAN', 2], [2, 'ASSIGN', 1], [7, 'GIT WORKFLOW', 1]]) + assert.equal(phases[2].note, 'new — SOUL law') + assert.equal(phases[2].steps[0], '`tri git push`') +}) + +test('claims: tagged bullets become rows, the glossary bullets that define the tags do not', () => { + const rows = claimsFrom('- `[measured]` -- a number produced by running something\n- The catalog holds 83 formats `[declared]` -- `FAMILY_TOTALS.catalog` in\n `trinity:apps/website/src/data/siliconHistory.ts`.\n- **No silicon.** `[not claimed]` A design was withdrawn.\n- untagged bullet\n') + assert.deepEqual(rows.map((r) => r.tag), ['declared', 'not claimed']) + assert.equal(rows[0].claim, 'The catalog holds 83 formats -- `FAMILY_TOTALS.catalog` in `trinity:apps/website/src/data/siliconHistory.ts`.') + assert.deepEqual(rows[0].sources, ['trinity:apps/website/src/data/siliconHistory.ts']) + assert.equal(rows[1].claim, 'No silicon. A design was withdrawn.') +}) + +test('a clean document builds: chapters in order, tables and figures fed, sources resolved, sha stable', () => { + const { docs, problems } = build() + assert.deepEqual(problems, []) + assert.deepEqual(docs.chapters.map((c) => c.stem), ['one', 'two']) + assert.equal(docs.chapters[0].table.kind, 'laws') + assert.equal(docs.chapters[0].table.rows.length, 2) + assert.equal(docs.chapters[1].table.kind, 'phases') + assert.equal(docs.chapters[1].table.rows.length, 3) + assert.deepEqual(docs.chapters[0].sections.map((s) => s.heading.en), ['Alpha', 'Beta']) + assert.equal(docs.chapters[0].body.en.sections[0].blocks.length, 2) + assert.equal(docs.chapters[0].sources[0].where, 'vendored') + assert.match(docs.chapters[0].sources[0].url, /^https:\/\/github\.com\/gHashTag\/t27\/blob\/a{40}\/SOUL\.md$/) + assert.deepEqual(docs.ladder, { specs: 3, skills: 2, crons: 1, agents: 1, tools: 1, docsChapters: 2 }) + assert.deepEqual(docs.figures['skills-crons-agents'].edges, [{ from: 't27/c', to: 't27/a', kind: 'cron-runs-skill' }, { from: 't27/T', to: 't27/a', kind: 'agent-holds-skill' }]) + assert.equal(docs.figures['law-hierarchy'].laws.length, 2) + assert.equal(docs.counts.typecheckOk, 3) + const again = build() + assert.equal(again.docs.contentSha256, docs.contentSha256, 'deterministic') + assert.equal(build().docs.chapters[0].bodySha256, docs.chapters[0].bodySha256) +}) + +test('refused: ORDER out of place, headings not equal to SECTIONS, unknown TABLE and DIAGRAM, chapter not listed', () => { + const r1 = build({ chapterTexts: { one: chapterSrc('one', 2, { table: 'laws' }), two: chapterSrc('two', 1, { table: 'phases' }) } }) + assert.ok(r1.problems.some((p) => /one\.t27: ORDER 2 does not match its position 1/.test(p)), r1.problems.join('\n')) + const r2 = build({ bodies: new Map([['docs/system/one.md', body('Chapter one', ['Alpha', 'Gamma'])], ['docs/system/two.md', body('Chapter two')]]) }) + assert.ok(r2.problems.some((p) => /one\.md: level-2 headings .* must equal SECTIONS/.test(p)), r2.problems.join('\n')) + const r3 = build({ chapterTexts: { one: chapterSrc('one', 1, { table: 'nope', diagram: 'agent-ring' }), two: chapterSrc('two', 2, { table: 'phases' }) } }) + assert.ok(r3.problems.some((p) => /TABLE "nope" is not one the generator produces/.test(p))) + assert.ok(r3.problems.some((p) => /DIAGRAM "agent-ring" is not in specs\/docs\/system\.t27 DIAGRAMS/.test(p))) + const r4 = build({ systemText: systemSrc({ chapters: ['one'] }) }) + assert.ok(r4.problems.some((p) => /chapters\/two\.t27 is not listed/.test(p))) + const r5 = build({ systemText: systemSrc({ chapters: ['one', 'two', 'three'] }) }) + assert.ok(r5.problems.some((p) => /CHAPTERS names "three" but .*three\.t27 is missing/.test(p))) +}) + +test('refused: body missing, title mismatch, empty section, ranking word, Cyrillic in a spec, missing source', () => { + const r1 = build({ bodies: new Map([['docs/system/two.md', body('Chapter two')]]) }) + assert.ok(r1.problems.some((p) => /BODY_EN docs\/system\/one\.md is missing/.test(p))) + const r2 = build({ bodies: new Map([['docs/system/one.md', body('Other title')], ['docs/system/two.md', body('Chapter two')]]) }) + assert.ok(r2.problems.some((p) => /level-1 heading "Other title" differs from TITLE/.test(p))) + const r3 = build({ bodies: new Map([['docs/system/one.md', '# Chapter one\n\nlead\n\n## Alpha\n\n## Beta\n\ntext\n'], ['docs/system/two.md', body('Chapter two')]]) }) + assert.ok(r3.problems.some((p) => /section "Alpha" has no body/.test(p))) + const r4 = build({ bodies: new Map([['docs/system/one.md', body('Chapter one').replace('A lead paragraph', 'The first spec language ever, a lead paragraph')], ['docs/system/two.md', body('Chapter two')]]) }) + assert.ok(r4.problems.some((p) => /one\.md: ranking word "The first"/.test(p))) + const r5 = build({ chapterTexts: { one: chapterSrc('one', 1, { table: 'laws', extra: '; комментарий\n' }), two: chapterSrc('two', 2, { table: 'phases' }) } }) + assert.ok(r5.problems.some((p) => /one\.t27: Cyrillic in a \.t27 spec/.test(p))) + const r6 = build({ chapterTexts: { one: chapterSrc('one', 1, { table: 'laws', sources: ['does/not/exist.md'] }), two: chapterSrc('two', 2, { table: 'phases' }) } }) + assert.ok(r6.problems.some((p) => /SOURCES names does\/not\/exist\.md, which is neither vendored/.test(p))) + const r7 = build({ chapterTexts: { one: chapterSrc('one', 1, { table: 'laws', module: 'docs_chapter_uno' }), two: chapterSrc('two', 2, { table: 'phases' }) } }) + assert.ok(r7.problems.some((p) => /module must be docs_chapter_one, is docs_chapter_uno/.test(p))) +}) + +test('translations: bundle entries render, section count must match, orphans and stray fields are refused, coverage is counted', () => { + const ruBody = '## Альфа\n\nТело альфы.\n\n## Бета\n\nТело беты.\n' + const bundle = { $spec: 'specs/i18n/docs-ru.t27', locale: 'ru', entries: { 'docs/system': { TITLE: 'Система' }, 'docs/one': { TITLE: 'Глава один', BODY: ruBody } } } + const ok = build({ systemText: systemSrc({ locales: ['en', 'ru'] }), i18nTexts: [i18nSrc('ru')], bundles: new Map([['apps/website/i18n/docs.ru.json', bundle]]) }) + assert.deepEqual(ok.problems, []) + assert.equal(ok.docs.document.title.ru, 'Система') + assert.equal(ok.docs.chapters[0].title.ru, 'Глава один') + assert.deepEqual(ok.docs.chapters[0].sections.map((s) => s.heading.ru), ['Альфа', 'Бета']) + assert.equal(ok.docs.chapters[0].body.ru.sections.length, 2) + assert.equal(ok.docs.chapters[1].body.ru, undefined) + assert.deepEqual(ok.docs.i18n[0].coverage, { n: 1, total: 2 }) + assert.deepEqual(ok.docs.i18n[0].missing, ['docs/two']) + assert.equal(ok.docs.counts.ruChapters, 1) + const short = build({ systemText: systemSrc({ locales: ['en', 'ru'] }), i18nTexts: [i18nSrc('ru')], bundles: new Map([['apps/website/i18n/docs.ru.json', { ...bundle, entries: { 'docs/one': { TITLE: 'x', BODY: '## Одна\n\nтекст\n' } } }]]) }) + assert.ok(short.problems.some((p) => /docs\/one\.BODY has 1 level-2 heading\(s\), the English body has 2/.test(p)), short.problems.join('\n')) + const orphan = build({ systemText: systemSrc({ locales: ['en', 'ru'] }), i18nTexts: [i18nSrc('ru')], bundles: new Map([['apps/website/i18n/docs.ru.json', { ...bundle, entries: { 'docs/nine': { TITLE: 'x' } } }]]) }) + assert.ok(orphan.problems.some((p) => /entry "docs\/nine" matches no chapter and ORPHANS_ALLOWED is false/.test(p))) + const stray = build({ systemText: systemSrc({ locales: ['en', 'ru'] }), i18nTexts: [i18nSrc('ru')], bundles: new Map([['apps/website/i18n/docs.ru.json', { ...bundle, entries: { 'docs/one': { TITLE: 'x', SUMMARY: 'y' } } }]]) }) + assert.ok(stray.problems.some((p) => /carries "SUMMARY", which is not in FIELDS/.test(p))) + const ranking = build({ systemText: systemSrc({ locales: ['en', 'ru'] }), i18nTexts: [i18nSrc('ru')], bundles: new Map([['apps/website/i18n/docs.ru.json', { ...bundle, entries: { 'docs/one': { TITLE: 'x', BODY: ruBody.replace('Тело альфы', 'Единственный в мире язык') } } }]]) }) + assert.ok(ranking.problems.some((p) => /ranking word "Единственный"/.test(p))) + const noContract = build({ systemText: systemSrc({ locales: ['en', 'ru'] }) }) + assert.ok(noContract.problems.some((p) => /LOCALES names "ru" but no specs\/i18n\/docs-ru\.t27 contract/.test(p))) + const noBundle = build({ systemText: systemSrc({ locales: ['en', 'ru'] }), i18nTexts: [i18nSrc('ru')] }) + assert.ok(noBundle.problems.some((p) => /bundle apps\/website\/i18n\/docs\.ru\.json is missing/.test(p))) +}) diff --git a/apps/website/src/components/Footer.tsx b/apps/website/src/components/Footer.tsx index f71d2169f6..91c93a4fd9 100644 --- a/apps/website/src/components/Footer.tsx +++ b/apps/website/src/components/Footer.tsx @@ -102,7 +102,7 @@ export default function Footer() {
  • goToSection(e, 'author')} style={{ color: 'var(--text)', textDecoration: 'none', fontSize: '0.85rem', opacity: 0.7, transition: 'opacity 0.2s' }} aria-label="Navigate to Author section">{lang === 'ru' ? 'Автор' : 'Author'}
  • goToSection(e, 'invest')} style={{ color: 'var(--text)', textDecoration: 'none', fontSize: '0.85rem', opacity: 0.7, transition: 'opacity 0.2s' }} aria-label="Navigate to Investment section">{lang === 'ru' ? 'Инвестиции' : 'Investment'}
  • - + {t.footer?.docs || 'Documentation'}
  • diff --git a/apps/website/src/components/ModulesBlock.tsx b/apps/website/src/components/ModulesBlock.tsx index 5f55f9bf26..bcef2eaa88 100644 --- a/apps/website/src/components/ModulesBlock.tsx +++ b/apps/website/src/components/ModulesBlock.tsx @@ -7,18 +7,21 @@ import './ModulesBlock.css' // because the data it reads now lives in lib/queenModules and this is the one // place that shows all of them at a glance. +// The count is MODULES.length, never a word typed here: the eyebrow once said +// "EIGHT" while the title said "ten" and the rail showed ten. +const N = MODULES.length const COPY = { en: { - eyebrow: 'QUEEN / ELEVEN MODULES', - title: 'One screen, eleven ways to read it', - lede: 'The Queen is a single-page module: the 3D map is the ground and every panel floats on it. These eleven are what that ground can be read as — each one opens on the same map, in the same shell, from the key beside it.', + eyebrow: `QUEEN / ${N} MODULES`, + title: `One screen, ${N} ways to read it`, + lede: `The Queen is a single-page module: the 3D map is the ground and every panel floats on it. These ${N} are what that ground can be read as — each one opens on the same map, in the same shell, from the key beside it.`, open: 'Open', all: 'Open the shell →', }, ru: { - eyebrow: 'КОРОЛЕВА / ОДИННАДЦАТЬ МОДУЛЕЙ', - title: 'Один экран и одиннадцать способов его прочитать', - lede: 'Королева — одностраничный модуль: 3D-карта здесь основание, а каждая панель плавает над ним. Эти одиннадцать — то, чем это основание можно прочитать; любой открывается на той же карте, в том же шелле, по клавише рядом с ним.', + eyebrow: `КОРОЛЕВА / ${N} МОДУЛЕЙ`, + title: `Один экран и ${N} способов его прочитать`, + lede: `Королева — одностраничный модуль: 3D-карта здесь основание, а каждая панель плавает над ним. Эти ${N} — то, чем это основание можно прочитать; любой открывается на той же карте, в том же шелле, по клавише рядом с ним.`, open: 'Открыть', all: 'Открыть шелл →', }, diff --git a/apps/website/src/components/Navigation.tsx b/apps/website/src/components/Navigation.tsx index b05d1c6a9c..f7473627d6 100644 --- a/apps/website/src/components/Navigation.tsx +++ b/apps/website/src/components/Navigation.tsx @@ -9,8 +9,9 @@ const navTargets = ['hero', '#/queen', '#/specs', 'claim', '#/gft', '#/proof', ' // Скролл-спай следит только за тем, что после переноса осталось на главной. const sectionIds = ['hero', 'claim'] const BASE = import.meta.env.BASE_URL -// Docs points to t27.ai/docs/ (custom domain) -const DOCS_URL = 'https://t27.ai/docs/' +// Docs is the site's own system documentation (#/docs, generated from +// specs/docs/**.t27); the t27.ai/docs/ Jekyll copy is being retired in its favour. +const DOCS_URL = '#/docs' // The locale files have no keys for the commercial pages yet, so the labels // live next to the links. Missing locales fall back to English. @@ -51,7 +52,7 @@ const PAGES: PageLink[] = [ { href: '#/specs', en: 'Spec Explorer', ru: 'Обозреватель спек', note: 'The .t27 corpus, layer by layer, through the real compiler', noteRu: 'Корпус .t27 по слоям через настоящий компилятор', color: '#00FF88' }, { href: '#/skills', en: 'Skill Explorer', ru: 'Обозреватель скилов', note: 'Every published skill, bound to the .t27 spec it stands on', noteRu: 'Каждый опубликованный скил и спека .t27, на которой он стоит', color: '#00FF88' }, { href: '#/crons', en: 'Cron Explorer', ru: 'Обозреватель кронов', note: 'Every scheduled job of the farm, and when it next fires', noteRu: 'Все задания по расписанию и когда каждое сработает', color: '#00ccff' }, - { href: DOCS_URL, en: 'Docs', ru: 'Документация', note: 'Full documentation', noteRu: 'Полная документация', external: true }, + { href: DOCS_URL, en: 'Docs', ru: 'Документация', note: 'The project, the rules of the game for its agents, and the system in detail', noteRu: 'Проект, правила игры для агентов и система в деталях', color: '#ffd700' }, ] // Smooth scrolling is animation-driven, so it silently does nothing when diff --git a/apps/website/src/components/ProductionDashboard.tsx b/apps/website/src/components/ProductionDashboard.tsx index 6bddc70153..03286085ef 100644 --- a/apps/website/src/components/ProductionDashboard.tsx +++ b/apps/website/src/components/ProductionDashboard.tsx @@ -590,7 +590,7 @@ export default function ProductionDashboard() { background: `${GOLD}15`, border: `1px solid ${GOLD}33`, }}>{t.navDashboard} - { + if (kind === 'project') { + // chapters / chapters with a RU body / sources pinned / typecheck ok over document+chapters + const d = await loadSystemDocs() + return { specs: d.counts.chapters, specPlusCode: d.counts.ruChapters, codeOnly: d.counts.sources, typecheckOk: d.counts.typecheckOk, typecheckTotal: d.chapters.length + 1 } + } if (kind === 'agents') { const c = (await loadAgentSpecs()).counts return { specs: c.specs, specPlusCode: c.specPlusExperience, codeOnly: c.episodesUnattributed ?? 0, typecheckOk: c.typecheckOk } @@ -77,21 +99,21 @@ export function QueenAgentsDirective({ kind, c, collapsible = false }: { kind: A

    {c.directiveBody}

    {counts && ( - {counts.specs} {c.specs} + {counts.specs} {kind === 'project' ? c.projectChapters ?? c.specs : c.specs} {' · '} {counts.specPlusCode}{' '} - {kind === 'agents' ? c.specPlusExperience ?? c.specPlusCode : kind === 'tools' ? c.toolsOwned ?? c.specPlusCode : c.specPlusCode} + {kind === 'agents' ? c.specPlusExperience ?? c.specPlusCode : kind === 'tools' ? c.toolsOwned ?? c.specPlusCode : kind === 'project' ? c.projectRu ?? c.specPlusCode : c.specPlusCode} {' · '} - {counts.codeOnly}{' '} - {kind === 'agents' ? c.unattributed ?? c.codeOnly : kind === 'tools' ? c.toolsUnowned ?? c.codeOnly : c.codeOnly} + {counts.codeOnly}{' '} + {kind === 'agents' ? c.unattributed ?? c.codeOnly : kind === 'tools' ? c.toolsUnowned ?? c.codeOnly : kind === 'project' ? c.projectSources ?? c.codeOnly : c.codeOnly} {' · '} - - {counts.typecheckOk}/{counts.specs} + + {counts.typecheckOk}/{counts.typecheckTotal ?? counts.specs} {' '} {c.typecheck} )} -
    + {c.open} @@ -117,27 +139,57 @@ export function QueenAgentsDirective({ kind, c, collapsible = false }: { kind: A export function QueenAgents({ kind, c, showDirective = true }: { kind: AgentsKind; c: AgentsCopy; showDirective?: boolean }) { const { lang } = useI18n() const [ready, setReady] = useState(false) + const [jump, setJump] = useState(PROJECT_JUMPS[0].stem) const frameRef = useRef(null) // ?lang= rides in the search, where the i18n provider reads it, so the frame // follows the shell's language instead of whatever localStorage held. - const src = `${window.location.pathname}?lang=${lang}#/${kind}?embed=1` + // PROJECT is the docs page at #/docs; the first chapter is the initial frame. + const src = kind === 'project' + ? `${window.location.pathname}?lang=${lang}${systemDocsHash(PROJECT_JUMPS[0].stem, { embedded: true })}` + : `${window.location.pathname}?lang=${lang}#/${kind}?embed=1` + + // A quick jump changes only the frame's fragment (same document, same origin), + // which the docs page answers by switching chapter without reloading. + const jumpTo = (stem: string) => { + setJump(stem) + const win = frameRef.current?.contentWindow + if (win) { + try { win.location.hash = systemDocsHash(stem, { embedded: true }).slice(1) } catch { /* cross-origin never happens: same document */ } + } + } return ( -
    +
    {showDirective && } + {kind === 'project' && ( + + )} +
    {!ready && (
    - +
    )}