From 9a2ff317585eae6ca1a3fb423bdff9c1c6cfdd58 Mon Sep 17 00:00:00 2001 From: Dmitrii Vasilev Date: Tue, 15 Sep 2026 00:38:55 +0700 Subject: [PATCH 1/7] chore(website): regenerate system-docs.json from the committed catalogs public/docs/system-docs.json had drifted from the catalogs it is generated from: check:docs failed at 429499e662 with "public/docs/system-docs.json is stale or hand-edited" (the committed ladder said tools 91 while public/tools/spec-tools.json holds 92). This is scripts/docs-from-specs.mjs as committed, run on the committed catalogs, with the file's own generatedAt (2026-09-12T12:30:15.363Z) passed through generate({ generatedAt }), so the stamp keeps its milliseconds; the CLI's SOURCE_DATE_EPOCH takes whole seconds. No new content, only what the catalogs already said: the mcp/inngest-dev row in the tools table, a third tool for agent T in the ring and the bindings graph, tools 91 -> 92 in the ladder and its figures, the external and per-repository MCP lists, the tool counts in the witnesses table, and the sha256 of the source files read at generation time. It goes first so the ladder change that follows shows only its own rows. Co-Authored-By: Claude Opus 5 --- apps/website/public/docs/system-docs.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/website/public/docs/system-docs.json b/apps/website/public/docs/system-docs.json index 32cfd5ac9c..bb437ce6a3 100644 --- a/apps/website/public/docs/system-docs.json +++ b/apps/website/public/docs/system-docs.json @@ -1 +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/93727f733e23baf032d54505095777f16676d70b/docs/system/project.md","spec":"https://github.com/gHashTag/t27/blob/93727f733e23baf032d54505095777f16676d70b/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/93727f733e23baf032d54505095777f16676d70b/SOUL.md","where":"vendored"},{"kind":"file","path":"AGENTS.md","rel":"AGENTS.md","repo":"t27","sha256":"1c9b8cce1600d4220d74498d187934e0b935ad1eae6deb9c1b100057ce9ac9e9","url":"https://github.com/gHashTag/t27/blob/93727f733e23baf032d54505095777f16676d70b/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/93727f733e23baf032d54505095777f16676d70b/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/ddceafb50cd0e620387161228fa2c9ae134047de/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/ddceafb50cd0e620387161228fa2c9ae134047de/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/93727f733e23baf032d54505095777f16676d70b/docs/system/rules.md","spec":"https://github.com/gHashTag/t27/blob/93727f733e23baf032d54505095777f16676d70b/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/93727f733e23baf032d54505095777f16676d70b/SOUL.md","where":"vendored"},{"kind":"file","path":"AGENTS.md","rel":"AGENTS.md","repo":"t27","sha256":"1c9b8cce1600d4220d74498d187934e0b935ad1eae6deb9c1b100057ce9ac9e9","url":"https://github.com/gHashTag/t27/blob/93727f733e23baf032d54505095777f16676d70b/AGENTS.md","where":"vendored"},{"kind":"file","path":"CLAUDE.md","rel":"CLAUDE.md","repo":"t27","sha256":"b6250fd688a9d794b9eaecebd9882905aa49bfab06616be82211a87fe098656d","url":"https://github.com/gHashTag/t27/blob/93727f733e23baf032d54505095777f16676d70b/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/93727f733e23baf032d54505095777f16676d70b/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/93727f733e23baf032d54505095777f16676d70b/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 every 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":"1c5e26427ae7992c2461e55e4bd2a9e6ee928c57a7330c08becf7afc3a164e9f","diagram":"skills-crons-agents","discarded":0,"enabled":true,"id":"docs/layers","links":{"body":"https://github.com/gHashTag/t27/blob/93727f733e23baf032d54505095777f16676d70b/docs/system/layers.md","spec":"https://github.com/gHashTag/t27/blob/93727f733e23baf032d54505095777f16676d70b/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/93727f733e23baf032d54505095777f16676d70b/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/93727f733e23baf032d54505095777f16676d70b/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/93727f733e23baf032d54505095777f16676d70b/specs/agents/README.md","where":"vendored"},{"kind":"file","path":"specs/tools/README.md","rel":"specs/tools/README.md","repo":"t27","sha256":"9741a39903bf2829f9436f6eec6cd364ceb9da043832e05c160f39255044d17a","url":"https://github.com/gHashTag/t27/blob/93727f733e23baf032d54505095777f16676d70b/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/93727f733e23baf032d54505095777f16676d70b/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":856,"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":91,"dir":"specs/tools/{tri,mcp}","layer":"Tools","source":"public/tools/spec-tools.json","typecheckOk":91}],"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/93727f733e23baf032d54505095777f16676d70b/docs/system/alphabet.md","spec":"https://github.com/gHashTag/t27/blob/93727f733e23baf032d54505095777f16676d70b/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/93727f733e23baf032d54505095777f16676d70b/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/93727f733e23baf032d54505095777f16676d70b/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\") -- commit with "},{"t":"code","v":"--all"},{"t":"text","v":" and the message "},{"t":"code","v":"cell:{id} issue:{N} ..."},{"t":"text","v":", then push "},{"t":"code","v":"HEAD"},{"t":"text","v":" to origin in strict mode; checks: sealed cell, non-toxic verdict, artifacts; the registry records the commit hash and the pushed flag. The alphabet writes both steps as a "},{"t":"code","v":"git"},{"t":"text","v":" subcommand of tri; the current clap surface does not expose one (witness: "},{"t":"code","v":"cli/tri/src/main.rs"},{"t":"text","v":" has no such variant), so they are quoted here as steps, not as commands to copy."}]],"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 a successful push to "},{"t":"code","v":"github.com/gHashTag/t27"},{"t":"text","v":" with bound sealed-cell and non-toxic verdict (the law names the push as a tri subcommand; see the note on the seventh phase above). 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 steps carry the cycle's state; two of them are tri commands with 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":"the git step"},{"t":"text","v":" -- the seventh phase as the alphabet document writes it, as a "},{"t":"code","v":"git"},{"t":"text","v":" subcommand of tri. 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 such 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":"--all"},{"t":"text","v":" и сообщением "},{"t":"code","v":"cell:{id} issue:{N} ..."},{"t":"text","v":", затем push "},{"t":"code","v":"HEAD"},{"t":"text","v":" в origin в строгом режиме; проверки: запечатанная ячейка, нетоксичный вердикт, артефакты; реестр записывает хэш коммита и флаг pushed. Документ алфавита записывает оба шага как подкоманду "},{"t":"code","v":"git"},{"t":"text","v":" утилиты tri; текущая clap-поверхность её не предоставляет (свидетель: в "},{"t":"code","v":"cli/tri/src/main.rs"},{"t":"text","v":" нет такого варианта), поэтому здесь они приведены как шаги, а не как команды для копирования."}]],"type":"ol"},{"runs":[{"t":"text","v":"Закон SOUL о TDD в документе следует за седьмой фазой: любой эпизод P0/P1 в режиме "},{"t":"code","v":"--strict"},{"t":"text","v":" считается COMPLETE только после успешного push в "},{"t":"code","v":"github.com/gHashTag/t27"},{"t":"text","v":" с привязанной запечатанной ячейкой и нетоксичным вердиктом (закон называет push подкомандой tri; см. примечание к седьмой фазе выше). Где буква агента появляется в описании фазы, глава об инструментах и карточки агентов используют эту строку как источник связи ("},{"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":"шаг git"},{"t":"text","v":" -- седьмая фаза в записи документа алфавита, как подкоманда "},{"t":"code","v":"git"},{"t":"text","v":" утилиты tri. На коммите, на котором порождена документация, в clap-перечислении "},{"t":"code","v":"cli/tri/src/main.rs"},{"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":"0008d41fdffdd063af243376fbf83c31ffe8ff9995c6d666e94751330d67c97d","diagram":"phase-cycle","discarded":0,"enabled":true,"id":"docs/queen","links":{"body":"https://github.com/gHashTag/t27/blob/93727f733e23baf032d54505095777f16676d70b/docs/system/queen.md","spec":"https://github.com/gHashTag/t27/blob/93727f733e23baf032d54505095777f16676d70b/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/93727f733e23baf032d54505095777f16676d70b/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/93727f733e23baf032d54505095777f16676d70b/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/93727f733e23baf032d54505095777f16676d70b/specs/agents/t.t27","where":"vendored"},{"kind":"file","path":"specs/tools/tri/cell.t27","rel":"specs/tools/tri/cell.t27","repo":"t27","sha256":"36ed34dfc7beb24c2fdd5b7dc5f7fe3375b42f357ffde7befd19f7cfbc22cdca","url":"https://github.com/gHashTag/t27/blob/93727f733e23baf032d54505095777f16676d70b/specs/tools/tri/cell.t27","where":"vendored"},{"kind":"file","path":"specs/tools/tri/verdict.t27","rel":"specs/tools/tri/verdict.t27","repo":"t27","sha256":"8afa0e665be25d336bdca685cd2369546a767678133bc86c9994d7c94da6a5c7","url":"https://github.com/gHashTag/t27/blob/93727f733e23baf032d54505095777f16676d70b/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":" does have a command-line binary of its own (an earlier version of this chapter said it had none; that was wrong): since S06 of gHashTag/trinity#988 its commands are cards under "},{"t":"code","v":"specs/tools/trinity/tri/"},{"t":"text","v":", read from the one registry that binary exports and its CI holds to the binary ("},{"t":"code","v":".trinity/registry.json"},{"t":"text","v":", 29 commands of a 187-entry table), with repository-qualified IDs ("},{"t":"code","v":"gHashTag/trinity:tri/"},{"t":"text","v":") so that a same-named command of the two binaries is never confused. "},{"t":"code","v":"specs/tools/catalog.t27"},{"t":"text","v":" states the schema, the identity rules and the legacy resolution; "},{"t":"code","v":"specs/tools/mcp_protocol.t27"},{"t":"text","v":" states what the Trinity MCP server does with a request; "},{"t":"code","v":"tools/trinity_tools_registry.py"},{"t":"text","v":" holds both and the cards to a measured inventory of the consumer."}],"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":"9c8d5ec87acb0205da7d1011722031807a4b713b37130004c5478f70f8151652","diagram":"tools-map","discarded":0,"enabled":true,"id":"docs/tooling","links":{"body":"https://github.com/gHashTag/t27/blob/93727f733e23baf032d54505095777f16676d70b/docs/system/tooling.md","spec":"https://github.com/gHashTag/t27/blob/93727f733e23baf032d54505095777f16676d70b/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":"9741a39903bf2829f9436f6eec6cd364ceb9da043832e05c160f39255044d17a","url":"https://github.com/gHashTag/t27/blob/93727f733e23baf032d54505095777f16676d70b/specs/tools/README.md","where":"vendored"},{"kind":"file","path":"specs/tools/tri/cell.t27","rel":"specs/tools/tri/cell.t27","repo":"t27","sha256":"36ed34dfc7beb24c2fdd5b7dc5f7fe3375b42f357ffde7befd19f7cfbc22cdca","url":"https://github.com/gHashTag/t27/blob/93727f733e23baf032d54505095777f16676d70b/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/93727f733e23baf032d54505095777f16676d70b/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/93727f733e23baf032d54505095777f16676d70b/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":false,"family":"tri-cli","id":"gHashTag/trinity:tri/bench","items":0,"name":"tri bench","repo":"gHashTag/trinity","witness":"registry-export"},{"agents":[],"external":false,"family":"tri-cli","id":"gHashTag/trinity:tri/bio","items":0,"name":"tri bio","repo":"gHashTag/trinity","witness":"registry-export"},{"agents":[],"external":false,"family":"tri-cli","id":"gHashTag/trinity:tri/blindspots","items":0,"name":"tri blindspots","repo":"gHashTag/trinity","witness":"registry-export"},{"agents":[],"external":false,"family":"tri-cli","id":"gHashTag/trinity:tri/conscious","items":0,"name":"tri conscious","repo":"gHashTag/trinity","witness":"registry-export"},{"agents":[],"external":false,"family":"tri-cli","id":"gHashTag/trinity:tri/constants","items":0,"name":"tri constants","repo":"gHashTag/trinity","witness":"registry-export"},{"agents":[],"external":false,"family":"tri-cli","id":"gHashTag/trinity:tri/cosmos","items":0,"name":"tri cosmos","repo":"gHashTag/trinity","witness":"registry-export"},{"agents":[],"external":false,"family":"tri-cli","id":"gHashTag/trinity:tri/dashboard","items":0,"name":"tri dashboard","repo":"gHashTag/trinity","witness":"registry-export"},{"agents":[],"external":false,"family":"tri-cli","id":"gHashTag/trinity:tri/fib","items":0,"name":"tri fib","repo":"gHashTag/trinity","witness":"registry-export"},{"agents":[],"external":false,"family":"tri-cli","id":"gHashTag/trinity:tri/fpga","items":0,"name":"tri fpga","repo":"gHashTag/trinity","witness":"registry-export"},{"agents":[],"external":false,"family":"tri-cli","id":"gHashTag/trinity:tri/gematria","items":0,"name":"tri gematria","repo":"gHashTag/trinity","witness":"registry-export"},{"agents":[],"external":false,"family":"tri-cli","id":"gHashTag/trinity:tri/govern","items":0,"name":"tri govern","repo":"gHashTag/trinity","witness":"registry-export"},{"agents":[],"external":false,"family":"tri-cli","id":"gHashTag/trinity:tri/hardware","items":0,"name":"tri hardware","repo":"gHashTag/trinity","witness":"registry-export"},{"agents":[],"external":false,"family":"tri-cli","id":"gHashTag/trinity:tri/identity","items":0,"name":"tri identity","repo":"gHashTag/trinity","witness":"registry-export"},{"agents":[],"external":false,"family":"tri-cli","id":"gHashTag/trinity:tri/lucas","items":0,"name":"tri lucas","repo":"gHashTag/trinity","witness":"registry-export"},{"agents":[],"external":false,"family":"tri-cli","id":"gHashTag/trinity:tri/mesh","items":0,"name":"tri mesh","repo":"gHashTag/trinity","witness":"registry-export"},{"agents":[],"external":false,"family":"tri-cli","id":"gHashTag/trinity:tri/needle","items":0,"name":"tri needle","repo":"gHashTag/trinity","witness":"registry-export"},{"agents":[],"external":false,"family":"tri-cli","id":"gHashTag/trinity:tri/needle-check","items":0,"name":"tri needle-check","repo":"gHashTag/trinity","witness":"registry-export"},{"agents":[],"external":false,"family":"tri-cli","id":"gHashTag/trinity:tri/needle-search","items":0,"name":"tri needle-search","repo":"gHashTag/trinity","witness":"registry-export"},{"agents":[],"external":false,"family":"tri-cli","id":"gHashTag/trinity:tri/omega","items":0,"name":"tri omega","repo":"gHashTag/trinity","witness":"registry-export"},{"agents":[],"external":false,"family":"tri-cli","id":"gHashTag/trinity:tri/particles","items":0,"name":"tri particles","repo":"gHashTag/trinity","witness":"registry-export"},{"agents":[],"external":false,"family":"tri-cli","id":"gHashTag/trinity:tri/phi","items":0,"name":"tri phi","repo":"gHashTag/trinity","witness":"registry-export"},{"agents":[],"external":false,"family":"tri-cli","id":"gHashTag/trinity:tri/quantum","items":0,"name":"tri quantum","repo":"gHashTag/trinity","witness":"registry-export"},{"agents":[],"external":false,"family":"tri-cli","id":"gHashTag/trinity:tri/reputation","items":0,"name":"tri reputation","repo":"gHashTag/trinity","witness":"registry-export"},{"agents":[],"external":false,"family":"tri-cli","id":"gHashTag/trinity:tri/sacred-const","items":0,"name":"tri sacred-const","repo":"gHashTag/trinity","witness":"registry-export"},{"agents":[],"external":false,"family":"tri-cli","id":"gHashTag/trinity:tri/spiral","items":0,"name":"tri spiral","repo":"gHashTag/trinity","witness":"registry-export"},{"agents":[],"external":false,"family":"tri-cli","id":"gHashTag/trinity:tri/swarm","items":0,"name":"tri swarm","repo":"gHashTag/trinity","witness":"registry-export"},{"agents":[],"external":false,"family":"tri-cli","id":"gHashTag/trinity:tri/test","items":0,"name":"tri test","repo":"gHashTag/trinity","witness":"registry-export"},{"agents":[],"external":false,"family":"tri-cli","id":"gHashTag/trinity:tri/vsa","items":0,"name":"tri vsa","repo":"gHashTag/trinity","witness":"registry-export"},{"agents":[],"external":false,"family":"tri-cli","id":"gHashTag/trinity:tri/wallet","items":0,"name":"tri wallet","repo":"gHashTag/trinity","witness":"registry-export"},{"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/93727f733e23baf032d54505095777f16676d70b/docs/system/evidence.md","spec":"https://github.com/gHashTag/t27/blob/93727f733e23baf032d54505095777f16676d70b/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/93727f733e23baf032d54505095777f16676d70b/specs/skills/README.md","where":"vendored"},{"kind":"file","path":"specs/tools/README.md","rel":"specs/tools/README.md","repo":"t27","sha256":"9741a39903bf2829f9436f6eec6cd364ceb9da043832e05c160f39255044d17a","url":"https://github.com/gHashTag/t27/blob/93727f733e23baf032d54505095777f16676d70b/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/93727f733e23baf032d54505095777f16676d70b/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/93727f733e23baf032d54505095777f16676d70b/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/93727f733e23baf032d54505095777f16676d70b/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":29,"label":"registry-export","layer":"Tools","source":"public/tools/spec-tools.json counts.byWitness"},{"count":0,"label":"runtime","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":177,"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/93727f733e23baf032d54505095777f16676d70b/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/93727f733e23baf032d54505095777f16676d70b/specs/skills","where":"vendored"},{"kind":"dir","path":"specs/crons","rel":"specs/crons","repo":"t27","sha256":null,"url":"https://github.com/gHashTag/t27/tree/93727f733e23baf032d54505095777f16676d70b/specs/crons","where":"vendored"},{"kind":"dir","path":"specs/agents","rel":"specs/agents","repo":"t27","sha256":null,"url":"https://github.com/gHashTag/t27/tree/93727f733e23baf032d54505095777f16676d70b/specs/agents","where":"vendored"},{"kind":"dir","path":"specs/tools","rel":"specs/tools","repo":"t27","sha256":null,"url":"https://github.com/gHashTag/t27/tree/93727f733e23baf032d54505095777f16676d70b/specs/tools","where":"vendored"},{"kind":"dir","path":"specs/i18n","rel":"specs/i18n","repo":"t27","sha256":null,"url":"https://github.com/gHashTag/t27/tree/93727f733e23baf032d54505095777f16676d70b/specs/i18n","where":"vendored"},{"kind":"file","path":"SOUL.md","rel":"SOUL.md","repo":"t27","sha256":"cb9b44e13d6d0b314f9626f9cca438e5f17ed6847b194220f9e80b32209e052e","url":"https://github.com/gHashTag/t27/blob/93727f733e23baf032d54505095777f16676d70b/SOUL.md","where":"vendored"},{"kind":"file","path":"AGENTS.md","rel":"AGENTS.md","repo":"t27","sha256":"1c9b8cce1600d4220d74498d187934e0b935ad1eae6deb9c1b100057ce9ac9e9","url":"https://github.com/gHashTag/t27/blob/93727f733e23baf032d54505095777f16676d70b/AGENTS.md","where":"vendored"},{"kind":"file","path":"CLAUDE.md","rel":"CLAUDE.md","repo":"t27","sha256":"b6250fd688a9d794b9eaecebd9882905aa49bfab06616be82211a87fe098656d","url":"https://github.com/gHashTag/t27/blob/93727f733e23baf032d54505095777f16676d70b/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/93727f733e23baf032d54505095777f16676d70b/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/93727f733e23baf032d54505095777f16676d70b/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":856,"tools":91},"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":91},"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":{"-":["gHashTag/trinity:tri/bench","gHashTag/trinity:tri/bio","gHashTag/trinity:tri/blindspots","gHashTag/trinity:tri/conscious","gHashTag/trinity:tri/constants","gHashTag/trinity:tri/cosmos","gHashTag/trinity:tri/dashboard","gHashTag/trinity:tri/fib","gHashTag/trinity:tri/fpga","gHashTag/trinity:tri/gematria","gHashTag/trinity:tri/govern","gHashTag/trinity:tri/hardware","gHashTag/trinity:tri/identity","gHashTag/trinity:tri/lucas","gHashTag/trinity:tri/mesh","gHashTag/trinity:tri/needle","gHashTag/trinity:tri/needle-check","gHashTag/trinity:tri/needle-search","gHashTag/trinity:tri/omega","gHashTag/trinity:tri/particles","gHashTag/trinity:tri/phi","gHashTag/trinity:tri/quantum","gHashTag/trinity:tri/reputation","gHashTag/trinity:tri/sacred-const","gHashTag/trinity:tri/spiral","gHashTag/trinity:tri/swarm","gHashTag/trinity:tri/test","gHashTag/trinity:tri/vsa","gHashTag/trinity:tri/wallet","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-12T12:30:15.363Z","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":856,"tools":91},"pin":{"ref":"93727f733e23baf032d54505095777f16676d70b","source":"public/agents/experience.json sources[t27].commit / sources[trinity].commit","trinity":"ddceafb50cd0e620387161228fa2c9ae134047de"},"version":1,"warnings":[],"contentSha256":"ef0e4c156145c831560cb36b2ead86803044611f90b05a75453fe3bf5fcb7008"} +{"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/93727f733e23baf032d54505095777f16676d70b/docs/system/project.md","spec":"https://github.com/gHashTag/t27/blob/93727f733e23baf032d54505095777f16676d70b/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/93727f733e23baf032d54505095777f16676d70b/SOUL.md","where":"vendored"},{"kind":"file","path":"AGENTS.md","rel":"AGENTS.md","repo":"t27","sha256":"1c9b8cce1600d4220d74498d187934e0b935ad1eae6deb9c1b100057ce9ac9e9","url":"https://github.com/gHashTag/t27/blob/93727f733e23baf032d54505095777f16676d70b/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/93727f733e23baf032d54505095777f16676d70b/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/ddceafb50cd0e620387161228fa2c9ae134047de/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":"497dc5311e431ad536da2abd3ec002077b1e96fe508e13388eb884de83f32d9d","url":"https://github.com/gHashTag/trinity/blob/ddceafb50cd0e620387161228fa2c9ae134047de/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/93727f733e23baf032d54505095777f16676d70b/docs/system/rules.md","spec":"https://github.com/gHashTag/t27/blob/93727f733e23baf032d54505095777f16676d70b/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/93727f733e23baf032d54505095777f16676d70b/SOUL.md","where":"vendored"},{"kind":"file","path":"AGENTS.md","rel":"AGENTS.md","repo":"t27","sha256":"1c9b8cce1600d4220d74498d187934e0b935ad1eae6deb9c1b100057ce9ac9e9","url":"https://github.com/gHashTag/t27/blob/93727f733e23baf032d54505095777f16676d70b/AGENTS.md","where":"vendored"},{"kind":"file","path":"CLAUDE.md","rel":"CLAUDE.md","repo":"t27","sha256":"b6250fd688a9d794b9eaecebd9882905aa49bfab06616be82211a87fe098656d","url":"https://github.com/gHashTag/t27/blob/93727f733e23baf032d54505095777f16676d70b/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/93727f733e23baf032d54505095777f16676d70b/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/93727f733e23baf032d54505095777f16676d70b/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 every 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":"1c5e26427ae7992c2461e55e4bd2a9e6ee928c57a7330c08becf7afc3a164e9f","diagram":"skills-crons-agents","discarded":0,"enabled":true,"id":"docs/layers","links":{"body":"https://github.com/gHashTag/t27/blob/93727f733e23baf032d54505095777f16676d70b/docs/system/layers.md","spec":"https://github.com/gHashTag/t27/blob/93727f733e23baf032d54505095777f16676d70b/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/93727f733e23baf032d54505095777f16676d70b/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/93727f733e23baf032d54505095777f16676d70b/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/93727f733e23baf032d54505095777f16676d70b/specs/agents/README.md","where":"vendored"},{"kind":"file","path":"specs/tools/README.md","rel":"specs/tools/README.md","repo":"t27","sha256":"37b5a451e43de9bc5746ceb80d4cf24f19ea6c3ad8751d2447049cba39c8a0ab","url":"https://github.com/gHashTag/t27/blob/93727f733e23baf032d54505095777f16676d70b/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/93727f733e23baf032d54505095777f16676d70b/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":856,"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":92,"dir":"specs/tools/{tri,mcp}","layer":"Tools","source":"public/tools/spec-tools.json","typecheckOk":92}],"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/93727f733e23baf032d54505095777f16676d70b/docs/system/alphabet.md","spec":"https://github.com/gHashTag/t27/blob/93727f733e23baf032d54505095777f16676d70b/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/93727f733e23baf032d54505095777f16676d70b/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/93727f733e23baf032d54505095777f16676d70b/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","mcp/inngest-dev"]},{"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\") -- commit with "},{"t":"code","v":"--all"},{"t":"text","v":" and the message "},{"t":"code","v":"cell:{id} issue:{N} ..."},{"t":"text","v":", then push "},{"t":"code","v":"HEAD"},{"t":"text","v":" to origin in strict mode; checks: sealed cell, non-toxic verdict, artifacts; the registry records the commit hash and the pushed flag. The alphabet writes both steps as a "},{"t":"code","v":"git"},{"t":"text","v":" subcommand of tri; the current clap surface does not expose one (witness: "},{"t":"code","v":"cli/tri/src/main.rs"},{"t":"text","v":" has no such variant), so they are quoted here as steps, not as commands to copy."}]],"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 a successful push to "},{"t":"code","v":"github.com/gHashTag/t27"},{"t":"text","v":" with bound sealed-cell and non-toxic verdict (the law names the push as a tri subcommand; see the note on the seventh phase above). 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 steps carry the cycle's state; two of them are tri commands with 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":"the git step"},{"t":"text","v":" -- the seventh phase as the alphabet document writes it, as a "},{"t":"code","v":"git"},{"t":"text","v":" subcommand of tri. 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 such 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":"--all"},{"t":"text","v":" и сообщением "},{"t":"code","v":"cell:{id} issue:{N} ..."},{"t":"text","v":", затем push "},{"t":"code","v":"HEAD"},{"t":"text","v":" в origin в строгом режиме; проверки: запечатанная ячейка, нетоксичный вердикт, артефакты; реестр записывает хэш коммита и флаг pushed. Документ алфавита записывает оба шага как подкоманду "},{"t":"code","v":"git"},{"t":"text","v":" утилиты tri; текущая clap-поверхность её не предоставляет (свидетель: в "},{"t":"code","v":"cli/tri/src/main.rs"},{"t":"text","v":" нет такого варианта), поэтому здесь они приведены как шаги, а не как команды для копирования."}]],"type":"ol"},{"runs":[{"t":"text","v":"Закон SOUL о TDD в документе следует за седьмой фазой: любой эпизод P0/P1 в режиме "},{"t":"code","v":"--strict"},{"t":"text","v":" считается COMPLETE только после успешного push в "},{"t":"code","v":"github.com/gHashTag/t27"},{"t":"text","v":" с привязанной запечатанной ячейкой и нетоксичным вердиктом (закон называет push подкомандой tri; см. примечание к седьмой фазе выше). Где буква агента появляется в описании фазы, глава об инструментах и карточки агентов используют эту строку как источник связи ("},{"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":"шаг git"},{"t":"text","v":" -- седьмая фаза в записи документа алфавита, как подкоманда "},{"t":"code","v":"git"},{"t":"text","v":" утилиты tri. На коммите, на котором порождена документация, в clap-перечислении "},{"t":"code","v":"cli/tri/src/main.rs"},{"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":"0008d41fdffdd063af243376fbf83c31ffe8ff9995c6d666e94751330d67c97d","diagram":"phase-cycle","discarded":0,"enabled":true,"id":"docs/queen","links":{"body":"https://github.com/gHashTag/t27/blob/93727f733e23baf032d54505095777f16676d70b/docs/system/queen.md","spec":"https://github.com/gHashTag/t27/blob/93727f733e23baf032d54505095777f16676d70b/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/93727f733e23baf032d54505095777f16676d70b/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/93727f733e23baf032d54505095777f16676d70b/CLAUDE.md","where":"vendored"},{"kind":"file","path":"specs/agents/t.t27","rel":"specs/agents/t.t27","repo":"t27","sha256":"25c30ec4e1f38b575e3bb24cdd09bb770ce5e2a1220eac46f4da857916540f66","url":"https://github.com/gHashTag/t27/blob/93727f733e23baf032d54505095777f16676d70b/specs/agents/t.t27","where":"vendored"},{"kind":"file","path":"specs/tools/tri/cell.t27","rel":"specs/tools/tri/cell.t27","repo":"t27","sha256":"36ed34dfc7beb24c2fdd5b7dc5f7fe3375b42f357ffde7befd19f7cfbc22cdca","url":"https://github.com/gHashTag/t27/blob/93727f733e23baf032d54505095777f16676d70b/specs/tools/tri/cell.t27","where":"vendored"},{"kind":"file","path":"specs/tools/tri/verdict.t27","rel":"specs/tools/tri/verdict.t27","repo":"t27","sha256":"8afa0e665be25d336bdca685cd2369546a767678133bc86c9994d7c94da6a5c7","url":"https://github.com/gHashTag/t27/blob/93727f733e23baf032d54505095777f16676d70b/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":" does have a command-line binary of its own (an earlier version of this chapter said it had none; that was wrong): since S06 of gHashTag/trinity#988 its commands are cards under "},{"t":"code","v":"specs/tools/trinity/tri/"},{"t":"text","v":", read from the one registry that binary exports and its CI holds to the binary ("},{"t":"code","v":".trinity/registry.json"},{"t":"text","v":", 29 commands of a 187-entry table), with repository-qualified IDs ("},{"t":"code","v":"gHashTag/trinity:tri/"},{"t":"text","v":") so that a same-named command of the two binaries is never confused. "},{"t":"code","v":"specs/tools/catalog.t27"},{"t":"text","v":" states the schema, the identity rules and the legacy resolution; "},{"t":"code","v":"specs/tools/mcp_protocol.t27"},{"t":"text","v":" states what the Trinity MCP server does with a request; "},{"t":"code","v":"tools/trinity_tools_registry.py"},{"t":"text","v":" holds both and the cards to a measured inventory of the consumer."}],"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":"9c8d5ec87acb0205da7d1011722031807a4b713b37130004c5478f70f8151652","diagram":"tools-map","discarded":0,"enabled":true,"id":"docs/tooling","links":{"body":"https://github.com/gHashTag/t27/blob/93727f733e23baf032d54505095777f16676d70b/docs/system/tooling.md","spec":"https://github.com/gHashTag/t27/blob/93727f733e23baf032d54505095777f16676d70b/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":"37b5a451e43de9bc5746ceb80d4cf24f19ea6c3ad8751d2447049cba39c8a0ab","url":"https://github.com/gHashTag/t27/blob/93727f733e23baf032d54505095777f16676d70b/specs/tools/README.md","where":"vendored"},{"kind":"file","path":"specs/tools/tri/cell.t27","rel":"specs/tools/tri/cell.t27","repo":"t27","sha256":"36ed34dfc7beb24c2fdd5b7dc5f7fe3375b42f357ffde7befd19f7cfbc22cdca","url":"https://github.com/gHashTag/t27/blob/93727f733e23baf032d54505095777f16676d70b/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/93727f733e23baf032d54505095777f16676d70b/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/93727f733e23baf032d54505095777f16676d70b/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":false,"family":"tri-cli","id":"gHashTag/trinity:tri/bench","items":0,"name":"tri bench","repo":"gHashTag/trinity","witness":"registry-export"},{"agents":[],"external":false,"family":"tri-cli","id":"gHashTag/trinity:tri/bio","items":0,"name":"tri bio","repo":"gHashTag/trinity","witness":"registry-export"},{"agents":[],"external":false,"family":"tri-cli","id":"gHashTag/trinity:tri/blindspots","items":0,"name":"tri blindspots","repo":"gHashTag/trinity","witness":"registry-export"},{"agents":[],"external":false,"family":"tri-cli","id":"gHashTag/trinity:tri/conscious","items":0,"name":"tri conscious","repo":"gHashTag/trinity","witness":"registry-export"},{"agents":[],"external":false,"family":"tri-cli","id":"gHashTag/trinity:tri/constants","items":0,"name":"tri constants","repo":"gHashTag/trinity","witness":"registry-export"},{"agents":[],"external":false,"family":"tri-cli","id":"gHashTag/trinity:tri/cosmos","items":0,"name":"tri cosmos","repo":"gHashTag/trinity","witness":"registry-export"},{"agents":[],"external":false,"family":"tri-cli","id":"gHashTag/trinity:tri/dashboard","items":0,"name":"tri dashboard","repo":"gHashTag/trinity","witness":"registry-export"},{"agents":[],"external":false,"family":"tri-cli","id":"gHashTag/trinity:tri/fib","items":0,"name":"tri fib","repo":"gHashTag/trinity","witness":"registry-export"},{"agents":[],"external":false,"family":"tri-cli","id":"gHashTag/trinity:tri/fpga","items":0,"name":"tri fpga","repo":"gHashTag/trinity","witness":"registry-export"},{"agents":[],"external":false,"family":"tri-cli","id":"gHashTag/trinity:tri/gematria","items":0,"name":"tri gematria","repo":"gHashTag/trinity","witness":"registry-export"},{"agents":[],"external":false,"family":"tri-cli","id":"gHashTag/trinity:tri/govern","items":0,"name":"tri govern","repo":"gHashTag/trinity","witness":"registry-export"},{"agents":[],"external":false,"family":"tri-cli","id":"gHashTag/trinity:tri/hardware","items":0,"name":"tri hardware","repo":"gHashTag/trinity","witness":"registry-export"},{"agents":[],"external":false,"family":"tri-cli","id":"gHashTag/trinity:tri/identity","items":0,"name":"tri identity","repo":"gHashTag/trinity","witness":"registry-export"},{"agents":[],"external":false,"family":"tri-cli","id":"gHashTag/trinity:tri/lucas","items":0,"name":"tri lucas","repo":"gHashTag/trinity","witness":"registry-export"},{"agents":[],"external":false,"family":"tri-cli","id":"gHashTag/trinity:tri/mesh","items":0,"name":"tri mesh","repo":"gHashTag/trinity","witness":"registry-export"},{"agents":[],"external":false,"family":"tri-cli","id":"gHashTag/trinity:tri/needle","items":0,"name":"tri needle","repo":"gHashTag/trinity","witness":"registry-export"},{"agents":[],"external":false,"family":"tri-cli","id":"gHashTag/trinity:tri/needle-check","items":0,"name":"tri needle-check","repo":"gHashTag/trinity","witness":"registry-export"},{"agents":[],"external":false,"family":"tri-cli","id":"gHashTag/trinity:tri/needle-search","items":0,"name":"tri needle-search","repo":"gHashTag/trinity","witness":"registry-export"},{"agents":[],"external":false,"family":"tri-cli","id":"gHashTag/trinity:tri/omega","items":0,"name":"tri omega","repo":"gHashTag/trinity","witness":"registry-export"},{"agents":[],"external":false,"family":"tri-cli","id":"gHashTag/trinity:tri/particles","items":0,"name":"tri particles","repo":"gHashTag/trinity","witness":"registry-export"},{"agents":[],"external":false,"family":"tri-cli","id":"gHashTag/trinity:tri/phi","items":0,"name":"tri phi","repo":"gHashTag/trinity","witness":"registry-export"},{"agents":[],"external":false,"family":"tri-cli","id":"gHashTag/trinity:tri/quantum","items":0,"name":"tri quantum","repo":"gHashTag/trinity","witness":"registry-export"},{"agents":[],"external":false,"family":"tri-cli","id":"gHashTag/trinity:tri/reputation","items":0,"name":"tri reputation","repo":"gHashTag/trinity","witness":"registry-export"},{"agents":[],"external":false,"family":"tri-cli","id":"gHashTag/trinity:tri/sacred-const","items":0,"name":"tri sacred-const","repo":"gHashTag/trinity","witness":"registry-export"},{"agents":[],"external":false,"family":"tri-cli","id":"gHashTag/trinity:tri/spiral","items":0,"name":"tri spiral","repo":"gHashTag/trinity","witness":"registry-export"},{"agents":[],"external":false,"family":"tri-cli","id":"gHashTag/trinity:tri/swarm","items":0,"name":"tri swarm","repo":"gHashTag/trinity","witness":"registry-export"},{"agents":[],"external":false,"family":"tri-cli","id":"gHashTag/trinity:tri/test","items":0,"name":"tri test","repo":"gHashTag/trinity","witness":"registry-export"},{"agents":[],"external":false,"family":"tri-cli","id":"gHashTag/trinity:tri/vsa","items":0,"name":"tri vsa","repo":"gHashTag/trinity","witness":"registry-export"},{"agents":[],"external":false,"family":"tri-cli","id":"gHashTag/trinity:tri/wallet","items":0,"name":"tri wallet","repo":"gHashTag/trinity","witness":"registry-export"},{"agents":[],"external":true,"family":"mcp","id":"mcp/gitbutler","items":0,"name":"gitbutler","repo":"gHashTag/t27","witness":"source-parse"},{"agents":["T"],"external":true,"family":"mcp","id":"mcp/inngest-dev","items":20,"name":"inngest-dev","repo":"gHashTag/t27","witness":"help-output"},{"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/93727f733e23baf032d54505095777f16676d70b/docs/system/evidence.md","spec":"https://github.com/gHashTag/t27/blob/93727f733e23baf032d54505095777f16676d70b/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/93727f733e23baf032d54505095777f16676d70b/specs/skills/README.md","where":"vendored"},{"kind":"file","path":"specs/tools/README.md","rel":"specs/tools/README.md","repo":"t27","sha256":"37b5a451e43de9bc5746ceb80d4cf24f19ea6c3ad8751d2447049cba39c8a0ab","url":"https://github.com/gHashTag/t27/blob/93727f733e23baf032d54505095777f16676d70b/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/93727f733e23baf032d54505095777f16676d70b/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/93727f733e23baf032d54505095777f16676d70b/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/93727f733e23baf032d54505095777f16676d70b/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":1,"label":"help-output","layer":"Tools","source":"public/tools/spec-tools.json counts.byWitness"},{"count":29,"label":"registry-export","layer":"Tools","source":"public/tools/spec-tools.json counts.byWitness"},{"count":0,"label":"runtime","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":6,"label":"external (tool list not in either repository)","layer":"Tools","source":"public/tools/spec-tools.json counts"},{"count":178,"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/93727f733e23baf032d54505095777f16676d70b/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/93727f733e23baf032d54505095777f16676d70b/specs/skills","where":"vendored"},{"kind":"dir","path":"specs/crons","rel":"specs/crons","repo":"t27","sha256":null,"url":"https://github.com/gHashTag/t27/tree/93727f733e23baf032d54505095777f16676d70b/specs/crons","where":"vendored"},{"kind":"dir","path":"specs/agents","rel":"specs/agents","repo":"t27","sha256":null,"url":"https://github.com/gHashTag/t27/tree/93727f733e23baf032d54505095777f16676d70b/specs/agents","where":"vendored"},{"kind":"dir","path":"specs/tools","rel":"specs/tools","repo":"t27","sha256":null,"url":"https://github.com/gHashTag/t27/tree/93727f733e23baf032d54505095777f16676d70b/specs/tools","where":"vendored"},{"kind":"dir","path":"specs/i18n","rel":"specs/i18n","repo":"t27","sha256":null,"url":"https://github.com/gHashTag/t27/tree/93727f733e23baf032d54505095777f16676d70b/specs/i18n","where":"vendored"},{"kind":"file","path":"SOUL.md","rel":"SOUL.md","repo":"t27","sha256":"cb9b44e13d6d0b314f9626f9cca438e5f17ed6847b194220f9e80b32209e052e","url":"https://github.com/gHashTag/t27/blob/93727f733e23baf032d54505095777f16676d70b/SOUL.md","where":"vendored"},{"kind":"file","path":"AGENTS.md","rel":"AGENTS.md","repo":"t27","sha256":"1c9b8cce1600d4220d74498d187934e0b935ad1eae6deb9c1b100057ce9ac9e9","url":"https://github.com/gHashTag/t27/blob/93727f733e23baf032d54505095777f16676d70b/AGENTS.md","where":"vendored"},{"kind":"file","path":"CLAUDE.md","rel":"CLAUDE.md","repo":"t27","sha256":"b6250fd688a9d794b9eaecebd9882905aa49bfab06616be82211a87fe098656d","url":"https://github.com/gHashTag/t27/blob/93727f733e23baf032d54505095777f16676d70b/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/93727f733e23baf032d54505095777f16676d70b/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/93727f733e23baf032d54505095777f16676d70b/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":3},{"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":856,"tools":92},"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":92},"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/T","kind":"agent-holds-tool","to":"mcp/inngest-dev"},{"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/inngest-dev","mcp/neon","mcp/notebooklm","mcp/railway-mcp-server","mcp/zig-docs"],"mcpByRepo":{"gHashTag/t27":["mcp/gitbutler","mcp/inngest-dev","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":{"-":["gHashTag/trinity:tri/bench","gHashTag/trinity:tri/bio","gHashTag/trinity:tri/blindspots","gHashTag/trinity:tri/conscious","gHashTag/trinity:tri/constants","gHashTag/trinity:tri/cosmos","gHashTag/trinity:tri/dashboard","gHashTag/trinity:tri/fib","gHashTag/trinity:tri/fpga","gHashTag/trinity:tri/gematria","gHashTag/trinity:tri/govern","gHashTag/trinity:tri/hardware","gHashTag/trinity:tri/identity","gHashTag/trinity:tri/lucas","gHashTag/trinity:tri/mesh","gHashTag/trinity:tri/needle","gHashTag/trinity:tri/needle-check","gHashTag/trinity:tri/needle-search","gHashTag/trinity:tri/omega","gHashTag/trinity:tri/particles","gHashTag/trinity:tri/phi","gHashTag/trinity:tri/quantum","gHashTag/trinity:tri/reputation","gHashTag/trinity:tri/sacred-const","gHashTag/trinity:tri/spiral","gHashTag/trinity:tri/swarm","gHashTag/trinity:tri/test","gHashTag/trinity:tri/vsa","gHashTag/trinity:tri/wallet","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-12T12:30:15.363Z","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":856,"tools":92},"pin":{"ref":"93727f733e23baf032d54505095777f16676d70b","source":"public/agents/experience.json sources[t27].commit / sources[trinity].commit","trinity":"ddceafb50cd0e620387161228fa2c9ae134047de"},"version":1,"warnings":[],"contentSha256":"0f878bfec736b8007b06aa8e7023de66c3c4995196b2893f557f8534520d339e"} From 7eeac3662bfd53908ae39d9d05753188ca316f8f Mon Sep 17 00:00:00 2001 From: Dmitrii Vasilev Date: Tue, 15 Sep 2026 00:38:56 +0700 Subject: [PATCH 2/7] fix(website): the Queen's language toggle writes ?lang= to the address On /?lang=ru#/queen?tab=functions the HUD toggle switched the page to English but left ?lang=ru in the address, so a reload came back in Russian. The header's LanguageSwitcher already writes ?lang= with replaceState; the Queen's toggle (the HUD tool button and the menu entry) now does the same, keeping history.state, where HashRouter keeps its entry index. Measured on local builds in headless Chrome (CDP, 1440x900): before: after the toggle the search is still ?lang=ru with the document in en, and a reload is ru again (address agrees: false; reload keeps it: false). after: the search is ?lang=en after the toggle, and a reload stays en. Co-Authored-By: Claude Opus 5 --- apps/website/src/pages/Queen.tsx | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/apps/website/src/pages/Queen.tsx b/apps/website/src/pages/Queen.tsx index 26e48c05a9..db62ed9b26 100644 --- a/apps/website/src/pages/Queen.tsx +++ b/apps/website/src/pages/Queen.tsx @@ -2314,7 +2314,17 @@ export default function Queen({sharedCatalog}:{sharedCatalog?:UniverseAtlas}={}) } }; - const toggleLang = () => setLang(lang === "ru" ? "en" : "ru"); + // The address says the language too, as the header's LanguageSwitcher already + // makes it: measured before this, /?lang=ru stayed in the address after the toggle + // switched the page to English, so a reload came back in Russian. history.state + // is kept, since HashRouter keeps its entry index there. + const toggleLang = () => { + const next = lang === "ru" ? "en" : "ru"; + setLang(next); + const url = new URL(window.location.href); + url.searchParams.set("lang", next); + window.history.replaceState(window.history.state, "", url); + }; const copyAgent = async () => { if (agentCopyTimer.current !== null) { From 7fb7e88f33523793738f396399169183e1db87c4 Mon Sep 17 00:00:00 2001 From: Dmitrii Vasilev Date: Tue, 15 Sep 2026 00:38:56 +0700 Subject: [PATCH 3/7] fix(website): the Skill Explorer's link labels name the spec binding they count MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit #/skills counted "No spec 23", and a card said "No spec declared yet", for skills whose own card shows witness spec+code and a spec at specs/skills/.t27 (t27/wave-audit, for one). The filter and the chip measure whether a skill declares the spec it stands on -- a binding the build checks -- not whether a card spec exists. The labels now say that; the data and the counts are unchanged. EN: No spec -> Unbound; No spec declared yet -> No spec binding declared yet; Skills without a spec -> Skills that declare no spec binding; "without a spec: {n}" -> "unbound: {n}". RU: Со спекой -> С привязкой; Без спеки -> Без привязки; Спека ещё не объявлена -> Привязка к спеке ещё не объявлена; Скилы без спеки -> Скилы, не объявившие привязку к спеке; "без спеки: {n}" -> "без привязки: {n}". Measured on local builds in headless Chrome, #/skills?skill=t27%2Fwave-audit in en and ru: before, the chip read "No spec" / "Без спеки" and the filters "No spec 23" / "Без спеки 23"; after, "Unbound" / "Без привязки" with the same counts (Bound 3, Unbound 23, Broken 0). check:explorer-languages passes. Co-Authored-By: Claude Opus 5 --- apps/website/src/pages/SkillExplorer.tsx | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/apps/website/src/pages/SkillExplorer.tsx b/apps/website/src/pages/SkillExplorer.tsx index ff7e7b2f84..f367c7bba3 100644 --- a/apps/website/src/pages/SkillExplorer.tsx +++ b/apps/website/src/pages/SkillExplorer.tsx @@ -60,7 +60,7 @@ const UI = { loading: 'Loading the catalog…', linkAll: 'All', linkBound: 'Bound', - linkUnbound: 'No spec', + linkUnbound: 'Unbound', linkBroken: 'Broken', layerSpec: 'Spec', layerSource: 'Skill', @@ -69,7 +69,7 @@ const UI = { layerSpecs: 'Specs', layerCoverage: 'Coverage', healthOk: 'Declares a spec, and it resolves', - healthWarn: 'No spec declared yet', + healthWarn: 'No spec binding declared yet', healthFail: 'Declares a spec that does not resolve', declared: 'declared', candidate: 'mentioned in the text', @@ -83,9 +83,9 @@ const UI = { specsHint: 'A declared spec is a claim the build checks: if it stops resolving, the site fails to build. A mentioned one is only evidence.', coverageTitle: 'Coverage', - skillsWithoutSpec: 'Skills without a spec', + skillsWithoutSpec: 'Skills that declare no spec binding', specsWithSkill: 'Specs a skill stands on', - baseline: 'without a spec: {n}, at most {max}', + baseline: 'unbound: {n}, at most {max}', baselineHint: 'That ceiling may only come down. A change that raises it fails the build.', proposeSpec: 'Propose a spec', edit: 'Edit on GitHub', @@ -134,8 +134,8 @@ const UI = { pickSkill: 'Выберите скил слева — он откроется целиком, вместе со спеками, на которых стоит.', loading: 'Загружаю каталог…', linkAll: 'Все', - linkBound: 'Со спекой', - linkUnbound: 'Без спеки', + linkBound: 'С привязкой', + linkUnbound: 'Без привязки', linkBroken: 'Битые', layerSpec: 'Спека', layerSource: 'Скил', @@ -144,7 +144,7 @@ const UI = { layerSpecs: 'Спеки', layerCoverage: 'Покрытие', healthOk: 'Спека объявлена и найдена', - healthWarn: 'Спека ещё не объявлена', + healthWarn: 'Привязка к спеке ещё не объявлена', healthFail: 'Объявлена спека, которой нет', declared: 'объявлена', candidate: 'упомянута в тексте', @@ -158,9 +158,9 @@ const UI = { specsHint: 'Объявленная спека — это заявление, которое проверяет сборка: перестанет находиться — сборка упадёт. Упомянутая — только свидетельство.', coverageTitle: 'Покрытие', - skillsWithoutSpec: 'Скилы без спеки', + skillsWithoutSpec: 'Скилы, не объявившие привязку к спеке', specsWithSkill: 'Спеки, на которых стоят скилы', - baseline: 'без спеки: {n}, не больше {max}', + baseline: 'без привязки: {n}, не больше {max}', baselineHint: 'Этот потолок можно только опускать. Правка, которая его поднимает, роняет сборку.', proposeSpec: 'Предложить спеку', edit: 'Править на GitHub', From 75e3435b84b4bcf0d9d1fa2c6ff5437940883723 Mon Sep 17 00:00:00 2001 From: Dmitrii Vasilev Date: Tue, 15 Sep 2026 00:42:51 +0700 Subject: [PATCH 4/7] fix(website): Shared core can be tapped on a phone At 390x844 (touch emulation) on #/queen the worlds nav in the HUD head showed only the world select and the connect button: QueenUniverse.css hid the last nav button (Shared core) and the one before it (Game home) below 640px, and inside the head the nav is display: contents, so the hidden buttons measured 0x0 and view=core had no way in on a phone. Shared core now stays. Inside the shell's head the world select is capped at 150px, which frees the width the button needs, so the head keeps its height. Game home and the T27 shortcut stay hidden on a phone, as before. The variant was chosen by injecting candidate CSS into the unmodified build before any source change: unhiding the button alone pushed it onto a second row (head 110px -> 142px, field 32px shorter); unhiding it and capping the select kept the head at 110px. Measured on local builds in headless Chrome at 390x844 with touch, #/queen and #/queen?tab=crons: before, Shared core measured 0x0 and a tap could not reach view=core; after, it is 93x26 and tappable, a tap opens view=core, the head is 110px tall and the document is still 390x844 (one screen), with every nav control inside the viewport. qa/queen-viewport-contract.mjs --no-build reports the same on both builds: the same 30 size/view combinations fail with the same messages (COUNT commands=12, STATUS SLOT MISSING: alerts, undeclared scrollers such as .queen27-hud-intel), 390x844 included, so those failures predate this change and it adds none. Co-Authored-By: Claude Opus 5 --- apps/website/src/pages/QueenUniverse.css | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/apps/website/src/pages/QueenUniverse.css b/apps/website/src/pages/QueenUniverse.css index 64d22b053a..2ebd7ad32e 100644 --- a/apps/website/src/pages/QueenUniverse.css +++ b/apps/website/src/pages/QueenUniverse.css @@ -73,7 +73,11 @@ body.queen-shell {background:#000;} .queen-universe :is(.queen-universe-nav,.queen-world-dialog) .queen-world-connect {flex:0 0 44px;width:44px;min-height:44px;padding:0;font-size:0;} .queen-universe-nav .queen-world-connect::after {content:'+';font-size:1.25rem;line-height:1;} .queen-universe-nav .queen-world-lang {flex:0 0 auto;font-size:.68rem;padding-inline:.5rem;} - .queen-universe-nav button:nth-last-child(2),.queen-universe-nav button:last-child {display:none;} + /* Shared core stays: hidden here, a phone had no way to reach view=core. In the + shell's head the world select gives up the 50px the button needs, so the head + keeps its height (measured at 390x844: 110px either way). */ + .queen-universe-nav button:nth-last-child(2) {display:none;} + .queen27-page.is-shell .queen27-hud-vp-head .queen-universe-nav select {min-width:0;max-width:150px;flex:1 1 auto;} } @media(max-height:500px) and (min-width:641px) { .queen-universe .queen27-page.is-shell {grid-template-rows:48px minmax(0,1fr) 48px;gap:4px;padding:4px;} From 5de859c3e217c633060aeea505c0da5f7706df17 Mon Sep 17 00:00:00 2001 From: Dmitrii Vasilev Date: Tue, 15 Sep 2026 00:47:45 +0700 Subject: [PATCH 5/7] fix(website): one ladder of six steps wherever the site draws or names it MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The layer ladder was stated several ways. On #/docs the figure said "The five-layer ladder: Specs → Skills → Crons → Agents → Tools" and the ladder-counts table had five rows; the PROJECT copy (queenModules.ts, the Queen's PROJECT directive) and the docs meta description said "five-layer ladder"; the Agent, Tool and Function Explorers drew six steps ending Functions 28, with the Function Explorer's caption naming a ladder without Tools; and the Skill and Cron Explorers drew no ladder at all. Now one statement: Specs → Skills → Crons → Agents → Tools → Functions. - scripts/agents-from-specs.mjs writes the ladder into spec-skills.json and spec-crons.json as well; the Skill and Cron Explorers draw it (LayerLadder, en/ru keys), and the Function Explorer's caption reads "ladder" like the rest. - scripts/docs-from-specs.mjs counts functions in docs.ladder and adds a Functions row to the ladder-counts table; LadderFigure draws a sixth step and its caption says six steps, in en and ru. - "six-step ladder" in the PROJECT copy (queenModules.ts, Queen.tsx) and in the docs meta description, in en and ru. - The contracts follow: agents-spec-contract (the skills and crons catalogs carry the agents' ladder), docs-spec-contract and docs-from-specs.test (functions in the ladder and in the table). The data is regenerated with the repository's generators, each file keeping its generatedAt to the millisecond: spec-skills.json and spec-crons.json gain only `ladder` (and a new contentSha256); spec-agents, spec-tools and spec-functions come out byte-identical; system-docs.json gains the functions count, the table row and the figure step. Not changed here: the chapter's own title and prose, "The five-layer system" and "Specs -> Skills -> Crons -> Agents -> Tools", are vendored from gHashTag/t27 (public/t27/files/docs/system/layers.md and specs/docs/chapters/layers.t27, pinned by sha256 in the docs contract), and upstream still says five (its only commit to layers.md is 61241e1bc9). The Russian title and body in i18n/docs.ru.json translate that vendored chapter and stay with it. Until t27 changes layers.md, that chapter's prose names five layers next to a six-row table. Measured on local builds in headless Chrome: before, #/skills and #/crons drew no ladder, #/functions captioned it "Specs → Skills → Crons → Agents → Functions", the figure on #/docs/project had five steps under a five-layer caption (ru: "Пятислойная лестница") and the table on #/docs/layers five rows. After, all five Explorers draw the same six steps under the caption "ladder", the figure has six steps ending "6. functions" under a six-step caption in en and ru, and the table has a Functions row. check:docs, check:agents, both generators' --check, their node --test suites and check:explorer-languages pass. qa/explorer-viewport-contract.mjs --no-build passes on both builds (6 sizes x 7 explorers) with the same 26 warnings: the Skill and Cron Explorers gain six controls (the ladder links; 56 -> 62 at 1280x800) and no new warning, and at 390x844 both stay one phone pane with one scroller. Co-Authored-By: Claude Opus 5 --- apps/website/public/crons/spec-crons.json | 2 +- apps/website/public/docs/system-docs.json | 2 +- apps/website/public/skills/spec-skills.json | 2 +- apps/website/qa/agents-spec-contract.mjs | 2 ++ apps/website/qa/docs-spec-contract.mjs | 5 ++-- apps/website/scripts/agents-from-specs.mjs | 3 ++ apps/website/scripts/docs-from-specs.mjs | 12 +++++--- apps/website/scripts/docs-from-specs.test.mjs | 3 +- .../src/components/SystemDocsFigures.tsx | 9 +++--- apps/website/src/lib/agentSpecs.ts | 2 ++ apps/website/src/lib/queenModules.ts | 4 +-- apps/website/src/lib/systemDocs.ts | 2 +- apps/website/src/pages/CronExplorer.tsx | 30 +++++++++++++++++++ apps/website/src/pages/FunctionExplorer.tsx | 4 +-- apps/website/src/pages/Queen.tsx | 4 +-- apps/website/src/pages/SkillExplorer.tsx | 30 +++++++++++++++++++ apps/website/src/pages/SystemDocs.tsx | 4 +-- 17 files changed, 97 insertions(+), 23 deletions(-) diff --git a/apps/website/public/crons/spec-crons.json b/apps/website/public/crons/spec-crons.json index 2193abd703..d84c40dfb3 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-13T03:52:07.716Z","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":"21821955c2fb0e64ecfd2ffb8c53222c10fdb76e6e2b8fe4c0339f778c86a908","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-13T03:52:07.716Z","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"}],"ladder":{"agents":27,"crons":33,"functions":28,"skills":26,"specs":856,"tools":92},"version":1} diff --git a/apps/website/public/docs/system-docs.json b/apps/website/public/docs/system-docs.json index bb437ce6a3..a3d0c28404 100644 --- a/apps/website/public/docs/system-docs.json +++ b/apps/website/public/docs/system-docs.json @@ -1 +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/93727f733e23baf032d54505095777f16676d70b/docs/system/project.md","spec":"https://github.com/gHashTag/t27/blob/93727f733e23baf032d54505095777f16676d70b/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/93727f733e23baf032d54505095777f16676d70b/SOUL.md","where":"vendored"},{"kind":"file","path":"AGENTS.md","rel":"AGENTS.md","repo":"t27","sha256":"1c9b8cce1600d4220d74498d187934e0b935ad1eae6deb9c1b100057ce9ac9e9","url":"https://github.com/gHashTag/t27/blob/93727f733e23baf032d54505095777f16676d70b/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/93727f733e23baf032d54505095777f16676d70b/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/ddceafb50cd0e620387161228fa2c9ae134047de/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":"497dc5311e431ad536da2abd3ec002077b1e96fe508e13388eb884de83f32d9d","url":"https://github.com/gHashTag/trinity/blob/ddceafb50cd0e620387161228fa2c9ae134047de/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/93727f733e23baf032d54505095777f16676d70b/docs/system/rules.md","spec":"https://github.com/gHashTag/t27/blob/93727f733e23baf032d54505095777f16676d70b/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/93727f733e23baf032d54505095777f16676d70b/SOUL.md","where":"vendored"},{"kind":"file","path":"AGENTS.md","rel":"AGENTS.md","repo":"t27","sha256":"1c9b8cce1600d4220d74498d187934e0b935ad1eae6deb9c1b100057ce9ac9e9","url":"https://github.com/gHashTag/t27/blob/93727f733e23baf032d54505095777f16676d70b/AGENTS.md","where":"vendored"},{"kind":"file","path":"CLAUDE.md","rel":"CLAUDE.md","repo":"t27","sha256":"b6250fd688a9d794b9eaecebd9882905aa49bfab06616be82211a87fe098656d","url":"https://github.com/gHashTag/t27/blob/93727f733e23baf032d54505095777f16676d70b/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/93727f733e23baf032d54505095777f16676d70b/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/93727f733e23baf032d54505095777f16676d70b/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 every 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":"1c5e26427ae7992c2461e55e4bd2a9e6ee928c57a7330c08becf7afc3a164e9f","diagram":"skills-crons-agents","discarded":0,"enabled":true,"id":"docs/layers","links":{"body":"https://github.com/gHashTag/t27/blob/93727f733e23baf032d54505095777f16676d70b/docs/system/layers.md","spec":"https://github.com/gHashTag/t27/blob/93727f733e23baf032d54505095777f16676d70b/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/93727f733e23baf032d54505095777f16676d70b/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/93727f733e23baf032d54505095777f16676d70b/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/93727f733e23baf032d54505095777f16676d70b/specs/agents/README.md","where":"vendored"},{"kind":"file","path":"specs/tools/README.md","rel":"specs/tools/README.md","repo":"t27","sha256":"37b5a451e43de9bc5746ceb80d4cf24f19ea6c3ad8751d2447049cba39c8a0ab","url":"https://github.com/gHashTag/t27/blob/93727f733e23baf032d54505095777f16676d70b/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/93727f733e23baf032d54505095777f16676d70b/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":856,"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":92,"dir":"specs/tools/{tri,mcp}","layer":"Tools","source":"public/tools/spec-tools.json","typecheckOk":92}],"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/93727f733e23baf032d54505095777f16676d70b/docs/system/alphabet.md","spec":"https://github.com/gHashTag/t27/blob/93727f733e23baf032d54505095777f16676d70b/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/93727f733e23baf032d54505095777f16676d70b/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/93727f733e23baf032d54505095777f16676d70b/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","mcp/inngest-dev"]},{"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\") -- commit with "},{"t":"code","v":"--all"},{"t":"text","v":" and the message "},{"t":"code","v":"cell:{id} issue:{N} ..."},{"t":"text","v":", then push "},{"t":"code","v":"HEAD"},{"t":"text","v":" to origin in strict mode; checks: sealed cell, non-toxic verdict, artifacts; the registry records the commit hash and the pushed flag. The alphabet writes both steps as a "},{"t":"code","v":"git"},{"t":"text","v":" subcommand of tri; the current clap surface does not expose one (witness: "},{"t":"code","v":"cli/tri/src/main.rs"},{"t":"text","v":" has no such variant), so they are quoted here as steps, not as commands to copy."}]],"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 a successful push to "},{"t":"code","v":"github.com/gHashTag/t27"},{"t":"text","v":" with bound sealed-cell and non-toxic verdict (the law names the push as a tri subcommand; see the note on the seventh phase above). 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 steps carry the cycle's state; two of them are tri commands with 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":"the git step"},{"t":"text","v":" -- the seventh phase as the alphabet document writes it, as a "},{"t":"code","v":"git"},{"t":"text","v":" subcommand of tri. 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 such 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":"--all"},{"t":"text","v":" и сообщением "},{"t":"code","v":"cell:{id} issue:{N} ..."},{"t":"text","v":", затем push "},{"t":"code","v":"HEAD"},{"t":"text","v":" в origin в строгом режиме; проверки: запечатанная ячейка, нетоксичный вердикт, артефакты; реестр записывает хэш коммита и флаг pushed. Документ алфавита записывает оба шага как подкоманду "},{"t":"code","v":"git"},{"t":"text","v":" утилиты tri; текущая clap-поверхность её не предоставляет (свидетель: в "},{"t":"code","v":"cli/tri/src/main.rs"},{"t":"text","v":" нет такого варианта), поэтому здесь они приведены как шаги, а не как команды для копирования."}]],"type":"ol"},{"runs":[{"t":"text","v":"Закон SOUL о TDD в документе следует за седьмой фазой: любой эпизод P0/P1 в режиме "},{"t":"code","v":"--strict"},{"t":"text","v":" считается COMPLETE только после успешного push в "},{"t":"code","v":"github.com/gHashTag/t27"},{"t":"text","v":" с привязанной запечатанной ячейкой и нетоксичным вердиктом (закон называет push подкомандой tri; см. примечание к седьмой фазе выше). Где буква агента появляется в описании фазы, глава об инструментах и карточки агентов используют эту строку как источник связи ("},{"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":"шаг git"},{"t":"text","v":" -- седьмая фаза в записи документа алфавита, как подкоманда "},{"t":"code","v":"git"},{"t":"text","v":" утилиты tri. На коммите, на котором порождена документация, в clap-перечислении "},{"t":"code","v":"cli/tri/src/main.rs"},{"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":"0008d41fdffdd063af243376fbf83c31ffe8ff9995c6d666e94751330d67c97d","diagram":"phase-cycle","discarded":0,"enabled":true,"id":"docs/queen","links":{"body":"https://github.com/gHashTag/t27/blob/93727f733e23baf032d54505095777f16676d70b/docs/system/queen.md","spec":"https://github.com/gHashTag/t27/blob/93727f733e23baf032d54505095777f16676d70b/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/93727f733e23baf032d54505095777f16676d70b/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/93727f733e23baf032d54505095777f16676d70b/CLAUDE.md","where":"vendored"},{"kind":"file","path":"specs/agents/t.t27","rel":"specs/agents/t.t27","repo":"t27","sha256":"25c30ec4e1f38b575e3bb24cdd09bb770ce5e2a1220eac46f4da857916540f66","url":"https://github.com/gHashTag/t27/blob/93727f733e23baf032d54505095777f16676d70b/specs/agents/t.t27","where":"vendored"},{"kind":"file","path":"specs/tools/tri/cell.t27","rel":"specs/tools/tri/cell.t27","repo":"t27","sha256":"36ed34dfc7beb24c2fdd5b7dc5f7fe3375b42f357ffde7befd19f7cfbc22cdca","url":"https://github.com/gHashTag/t27/blob/93727f733e23baf032d54505095777f16676d70b/specs/tools/tri/cell.t27","where":"vendored"},{"kind":"file","path":"specs/tools/tri/verdict.t27","rel":"specs/tools/tri/verdict.t27","repo":"t27","sha256":"8afa0e665be25d336bdca685cd2369546a767678133bc86c9994d7c94da6a5c7","url":"https://github.com/gHashTag/t27/blob/93727f733e23baf032d54505095777f16676d70b/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":" does have a command-line binary of its own (an earlier version of this chapter said it had none; that was wrong): since S06 of gHashTag/trinity#988 its commands are cards under "},{"t":"code","v":"specs/tools/trinity/tri/"},{"t":"text","v":", read from the one registry that binary exports and its CI holds to the binary ("},{"t":"code","v":".trinity/registry.json"},{"t":"text","v":", 29 commands of a 187-entry table), with repository-qualified IDs ("},{"t":"code","v":"gHashTag/trinity:tri/"},{"t":"text","v":") so that a same-named command of the two binaries is never confused. "},{"t":"code","v":"specs/tools/catalog.t27"},{"t":"text","v":" states the schema, the identity rules and the legacy resolution; "},{"t":"code","v":"specs/tools/mcp_protocol.t27"},{"t":"text","v":" states what the Trinity MCP server does with a request; "},{"t":"code","v":"tools/trinity_tools_registry.py"},{"t":"text","v":" holds both and the cards to a measured inventory of the consumer."}],"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":"9c8d5ec87acb0205da7d1011722031807a4b713b37130004c5478f70f8151652","diagram":"tools-map","discarded":0,"enabled":true,"id":"docs/tooling","links":{"body":"https://github.com/gHashTag/t27/blob/93727f733e23baf032d54505095777f16676d70b/docs/system/tooling.md","spec":"https://github.com/gHashTag/t27/blob/93727f733e23baf032d54505095777f16676d70b/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":"37b5a451e43de9bc5746ceb80d4cf24f19ea6c3ad8751d2447049cba39c8a0ab","url":"https://github.com/gHashTag/t27/blob/93727f733e23baf032d54505095777f16676d70b/specs/tools/README.md","where":"vendored"},{"kind":"file","path":"specs/tools/tri/cell.t27","rel":"specs/tools/tri/cell.t27","repo":"t27","sha256":"36ed34dfc7beb24c2fdd5b7dc5f7fe3375b42f357ffde7befd19f7cfbc22cdca","url":"https://github.com/gHashTag/t27/blob/93727f733e23baf032d54505095777f16676d70b/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/93727f733e23baf032d54505095777f16676d70b/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/93727f733e23baf032d54505095777f16676d70b/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":false,"family":"tri-cli","id":"gHashTag/trinity:tri/bench","items":0,"name":"tri bench","repo":"gHashTag/trinity","witness":"registry-export"},{"agents":[],"external":false,"family":"tri-cli","id":"gHashTag/trinity:tri/bio","items":0,"name":"tri bio","repo":"gHashTag/trinity","witness":"registry-export"},{"agents":[],"external":false,"family":"tri-cli","id":"gHashTag/trinity:tri/blindspots","items":0,"name":"tri blindspots","repo":"gHashTag/trinity","witness":"registry-export"},{"agents":[],"external":false,"family":"tri-cli","id":"gHashTag/trinity:tri/conscious","items":0,"name":"tri conscious","repo":"gHashTag/trinity","witness":"registry-export"},{"agents":[],"external":false,"family":"tri-cli","id":"gHashTag/trinity:tri/constants","items":0,"name":"tri constants","repo":"gHashTag/trinity","witness":"registry-export"},{"agents":[],"external":false,"family":"tri-cli","id":"gHashTag/trinity:tri/cosmos","items":0,"name":"tri cosmos","repo":"gHashTag/trinity","witness":"registry-export"},{"agents":[],"external":false,"family":"tri-cli","id":"gHashTag/trinity:tri/dashboard","items":0,"name":"tri dashboard","repo":"gHashTag/trinity","witness":"registry-export"},{"agents":[],"external":false,"family":"tri-cli","id":"gHashTag/trinity:tri/fib","items":0,"name":"tri fib","repo":"gHashTag/trinity","witness":"registry-export"},{"agents":[],"external":false,"family":"tri-cli","id":"gHashTag/trinity:tri/fpga","items":0,"name":"tri fpga","repo":"gHashTag/trinity","witness":"registry-export"},{"agents":[],"external":false,"family":"tri-cli","id":"gHashTag/trinity:tri/gematria","items":0,"name":"tri gematria","repo":"gHashTag/trinity","witness":"registry-export"},{"agents":[],"external":false,"family":"tri-cli","id":"gHashTag/trinity:tri/govern","items":0,"name":"tri govern","repo":"gHashTag/trinity","witness":"registry-export"},{"agents":[],"external":false,"family":"tri-cli","id":"gHashTag/trinity:tri/hardware","items":0,"name":"tri hardware","repo":"gHashTag/trinity","witness":"registry-export"},{"agents":[],"external":false,"family":"tri-cli","id":"gHashTag/trinity:tri/identity","items":0,"name":"tri identity","repo":"gHashTag/trinity","witness":"registry-export"},{"agents":[],"external":false,"family":"tri-cli","id":"gHashTag/trinity:tri/lucas","items":0,"name":"tri lucas","repo":"gHashTag/trinity","witness":"registry-export"},{"agents":[],"external":false,"family":"tri-cli","id":"gHashTag/trinity:tri/mesh","items":0,"name":"tri mesh","repo":"gHashTag/trinity","witness":"registry-export"},{"agents":[],"external":false,"family":"tri-cli","id":"gHashTag/trinity:tri/needle","items":0,"name":"tri needle","repo":"gHashTag/trinity","witness":"registry-export"},{"agents":[],"external":false,"family":"tri-cli","id":"gHashTag/trinity:tri/needle-check","items":0,"name":"tri needle-check","repo":"gHashTag/trinity","witness":"registry-export"},{"agents":[],"external":false,"family":"tri-cli","id":"gHashTag/trinity:tri/needle-search","items":0,"name":"tri needle-search","repo":"gHashTag/trinity","witness":"registry-export"},{"agents":[],"external":false,"family":"tri-cli","id":"gHashTag/trinity:tri/omega","items":0,"name":"tri omega","repo":"gHashTag/trinity","witness":"registry-export"},{"agents":[],"external":false,"family":"tri-cli","id":"gHashTag/trinity:tri/particles","items":0,"name":"tri particles","repo":"gHashTag/trinity","witness":"registry-export"},{"agents":[],"external":false,"family":"tri-cli","id":"gHashTag/trinity:tri/phi","items":0,"name":"tri phi","repo":"gHashTag/trinity","witness":"registry-export"},{"agents":[],"external":false,"family":"tri-cli","id":"gHashTag/trinity:tri/quantum","items":0,"name":"tri quantum","repo":"gHashTag/trinity","witness":"registry-export"},{"agents":[],"external":false,"family":"tri-cli","id":"gHashTag/trinity:tri/reputation","items":0,"name":"tri reputation","repo":"gHashTag/trinity","witness":"registry-export"},{"agents":[],"external":false,"family":"tri-cli","id":"gHashTag/trinity:tri/sacred-const","items":0,"name":"tri sacred-const","repo":"gHashTag/trinity","witness":"registry-export"},{"agents":[],"external":false,"family":"tri-cli","id":"gHashTag/trinity:tri/spiral","items":0,"name":"tri spiral","repo":"gHashTag/trinity","witness":"registry-export"},{"agents":[],"external":false,"family":"tri-cli","id":"gHashTag/trinity:tri/swarm","items":0,"name":"tri swarm","repo":"gHashTag/trinity","witness":"registry-export"},{"agents":[],"external":false,"family":"tri-cli","id":"gHashTag/trinity:tri/test","items":0,"name":"tri test","repo":"gHashTag/trinity","witness":"registry-export"},{"agents":[],"external":false,"family":"tri-cli","id":"gHashTag/trinity:tri/vsa","items":0,"name":"tri vsa","repo":"gHashTag/trinity","witness":"registry-export"},{"agents":[],"external":false,"family":"tri-cli","id":"gHashTag/trinity:tri/wallet","items":0,"name":"tri wallet","repo":"gHashTag/trinity","witness":"registry-export"},{"agents":[],"external":true,"family":"mcp","id":"mcp/gitbutler","items":0,"name":"gitbutler","repo":"gHashTag/t27","witness":"source-parse"},{"agents":["T"],"external":true,"family":"mcp","id":"mcp/inngest-dev","items":20,"name":"inngest-dev","repo":"gHashTag/t27","witness":"help-output"},{"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/93727f733e23baf032d54505095777f16676d70b/docs/system/evidence.md","spec":"https://github.com/gHashTag/t27/blob/93727f733e23baf032d54505095777f16676d70b/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/93727f733e23baf032d54505095777f16676d70b/specs/skills/README.md","where":"vendored"},{"kind":"file","path":"specs/tools/README.md","rel":"specs/tools/README.md","repo":"t27","sha256":"37b5a451e43de9bc5746ceb80d4cf24f19ea6c3ad8751d2447049cba39c8a0ab","url":"https://github.com/gHashTag/t27/blob/93727f733e23baf032d54505095777f16676d70b/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/93727f733e23baf032d54505095777f16676d70b/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/93727f733e23baf032d54505095777f16676d70b/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/93727f733e23baf032d54505095777f16676d70b/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":1,"label":"help-output","layer":"Tools","source":"public/tools/spec-tools.json counts.byWitness"},{"count":29,"label":"registry-export","layer":"Tools","source":"public/tools/spec-tools.json counts.byWitness"},{"count":0,"label":"runtime","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":6,"label":"external (tool list not in either repository)","layer":"Tools","source":"public/tools/spec-tools.json counts"},{"count":178,"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/93727f733e23baf032d54505095777f16676d70b/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/93727f733e23baf032d54505095777f16676d70b/specs/skills","where":"vendored"},{"kind":"dir","path":"specs/crons","rel":"specs/crons","repo":"t27","sha256":null,"url":"https://github.com/gHashTag/t27/tree/93727f733e23baf032d54505095777f16676d70b/specs/crons","where":"vendored"},{"kind":"dir","path":"specs/agents","rel":"specs/agents","repo":"t27","sha256":null,"url":"https://github.com/gHashTag/t27/tree/93727f733e23baf032d54505095777f16676d70b/specs/agents","where":"vendored"},{"kind":"dir","path":"specs/tools","rel":"specs/tools","repo":"t27","sha256":null,"url":"https://github.com/gHashTag/t27/tree/93727f733e23baf032d54505095777f16676d70b/specs/tools","where":"vendored"},{"kind":"dir","path":"specs/i18n","rel":"specs/i18n","repo":"t27","sha256":null,"url":"https://github.com/gHashTag/t27/tree/93727f733e23baf032d54505095777f16676d70b/specs/i18n","where":"vendored"},{"kind":"file","path":"SOUL.md","rel":"SOUL.md","repo":"t27","sha256":"cb9b44e13d6d0b314f9626f9cca438e5f17ed6847b194220f9e80b32209e052e","url":"https://github.com/gHashTag/t27/blob/93727f733e23baf032d54505095777f16676d70b/SOUL.md","where":"vendored"},{"kind":"file","path":"AGENTS.md","rel":"AGENTS.md","repo":"t27","sha256":"1c9b8cce1600d4220d74498d187934e0b935ad1eae6deb9c1b100057ce9ac9e9","url":"https://github.com/gHashTag/t27/blob/93727f733e23baf032d54505095777f16676d70b/AGENTS.md","where":"vendored"},{"kind":"file","path":"CLAUDE.md","rel":"CLAUDE.md","repo":"t27","sha256":"b6250fd688a9d794b9eaecebd9882905aa49bfab06616be82211a87fe098656d","url":"https://github.com/gHashTag/t27/blob/93727f733e23baf032d54505095777f16676d70b/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/93727f733e23baf032d54505095777f16676d70b/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/93727f733e23baf032d54505095777f16676d70b/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":3},{"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":856,"tools":92},"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":92},"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/T","kind":"agent-holds-tool","to":"mcp/inngest-dev"},{"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/inngest-dev","mcp/neon","mcp/notebooklm","mcp/railway-mcp-server","mcp/zig-docs"],"mcpByRepo":{"gHashTag/t27":["mcp/gitbutler","mcp/inngest-dev","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":{"-":["gHashTag/trinity:tri/bench","gHashTag/trinity:tri/bio","gHashTag/trinity:tri/blindspots","gHashTag/trinity:tri/conscious","gHashTag/trinity:tri/constants","gHashTag/trinity:tri/cosmos","gHashTag/trinity:tri/dashboard","gHashTag/trinity:tri/fib","gHashTag/trinity:tri/fpga","gHashTag/trinity:tri/gematria","gHashTag/trinity:tri/govern","gHashTag/trinity:tri/hardware","gHashTag/trinity:tri/identity","gHashTag/trinity:tri/lucas","gHashTag/trinity:tri/mesh","gHashTag/trinity:tri/needle","gHashTag/trinity:tri/needle-check","gHashTag/trinity:tri/needle-search","gHashTag/trinity:tri/omega","gHashTag/trinity:tri/particles","gHashTag/trinity:tri/phi","gHashTag/trinity:tri/quantum","gHashTag/trinity:tri/reputation","gHashTag/trinity:tri/sacred-const","gHashTag/trinity:tri/spiral","gHashTag/trinity:tri/swarm","gHashTag/trinity:tri/test","gHashTag/trinity:tri/vsa","gHashTag/trinity:tri/wallet","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-12T12:30:15.363Z","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":856,"tools":92},"pin":{"ref":"93727f733e23baf032d54505095777f16676d70b","source":"public/agents/experience.json sources[t27].commit / sources[trinity].commit","trinity":"ddceafb50cd0e620387161228fa2c9ae134047de"},"version":1,"warnings":[],"contentSha256":"0f878bfec736b8007b06aa8e7023de66c3c4995196b2893f557f8534520d339e"} +{"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/93727f733e23baf032d54505095777f16676d70b/docs/system/project.md","spec":"https://github.com/gHashTag/t27/blob/93727f733e23baf032d54505095777f16676d70b/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/93727f733e23baf032d54505095777f16676d70b/SOUL.md","where":"vendored"},{"kind":"file","path":"AGENTS.md","rel":"AGENTS.md","repo":"t27","sha256":"1c9b8cce1600d4220d74498d187934e0b935ad1eae6deb9c1b100057ce9ac9e9","url":"https://github.com/gHashTag/t27/blob/93727f733e23baf032d54505095777f16676d70b/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/93727f733e23baf032d54505095777f16676d70b/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/ddceafb50cd0e620387161228fa2c9ae134047de/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":"497dc5311e431ad536da2abd3ec002077b1e96fe508e13388eb884de83f32d9d","url":"https://github.com/gHashTag/trinity/blob/ddceafb50cd0e620387161228fa2c9ae134047de/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/93727f733e23baf032d54505095777f16676d70b/docs/system/rules.md","spec":"https://github.com/gHashTag/t27/blob/93727f733e23baf032d54505095777f16676d70b/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/93727f733e23baf032d54505095777f16676d70b/SOUL.md","where":"vendored"},{"kind":"file","path":"AGENTS.md","rel":"AGENTS.md","repo":"t27","sha256":"1c9b8cce1600d4220d74498d187934e0b935ad1eae6deb9c1b100057ce9ac9e9","url":"https://github.com/gHashTag/t27/blob/93727f733e23baf032d54505095777f16676d70b/AGENTS.md","where":"vendored"},{"kind":"file","path":"CLAUDE.md","rel":"CLAUDE.md","repo":"t27","sha256":"b6250fd688a9d794b9eaecebd9882905aa49bfab06616be82211a87fe098656d","url":"https://github.com/gHashTag/t27/blob/93727f733e23baf032d54505095777f16676d70b/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/93727f733e23baf032d54505095777f16676d70b/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/93727f733e23baf032d54505095777f16676d70b/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 every 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":"1c5e26427ae7992c2461e55e4bd2a9e6ee928c57a7330c08becf7afc3a164e9f","diagram":"skills-crons-agents","discarded":0,"enabled":true,"id":"docs/layers","links":{"body":"https://github.com/gHashTag/t27/blob/93727f733e23baf032d54505095777f16676d70b/docs/system/layers.md","spec":"https://github.com/gHashTag/t27/blob/93727f733e23baf032d54505095777f16676d70b/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/93727f733e23baf032d54505095777f16676d70b/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/93727f733e23baf032d54505095777f16676d70b/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/93727f733e23baf032d54505095777f16676d70b/specs/agents/README.md","where":"vendored"},{"kind":"file","path":"specs/tools/README.md","rel":"specs/tools/README.md","repo":"t27","sha256":"37b5a451e43de9bc5746ceb80d4cf24f19ea6c3ad8751d2447049cba39c8a0ab","url":"https://github.com/gHashTag/t27/blob/93727f733e23baf032d54505095777f16676d70b/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/93727f733e23baf032d54505095777f16676d70b/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":856,"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":92,"dir":"specs/tools/{tri,mcp}","layer":"Tools","source":"public/tools/spec-tools.json","typecheckOk":92},{"count":28,"dir":"specs/functions","layer":"Functions","source":"public/functions/spec-functions.json","typecheckOk":28}],"source":"the five 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/93727f733e23baf032d54505095777f16676d70b/docs/system/alphabet.md","spec":"https://github.com/gHashTag/t27/blob/93727f733e23baf032d54505095777f16676d70b/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/93727f733e23baf032d54505095777f16676d70b/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/93727f733e23baf032d54505095777f16676d70b/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","mcp/inngest-dev"]},{"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\") -- commit with "},{"t":"code","v":"--all"},{"t":"text","v":" and the message "},{"t":"code","v":"cell:{id} issue:{N} ..."},{"t":"text","v":", then push "},{"t":"code","v":"HEAD"},{"t":"text","v":" to origin in strict mode; checks: sealed cell, non-toxic verdict, artifacts; the registry records the commit hash and the pushed flag. The alphabet writes both steps as a "},{"t":"code","v":"git"},{"t":"text","v":" subcommand of tri; the current clap surface does not expose one (witness: "},{"t":"code","v":"cli/tri/src/main.rs"},{"t":"text","v":" has no such variant), so they are quoted here as steps, not as commands to copy."}]],"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 a successful push to "},{"t":"code","v":"github.com/gHashTag/t27"},{"t":"text","v":" with bound sealed-cell and non-toxic verdict (the law names the push as a tri subcommand; see the note on the seventh phase above). 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 steps carry the cycle's state; two of them are tri commands with 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":"the git step"},{"t":"text","v":" -- the seventh phase as the alphabet document writes it, as a "},{"t":"code","v":"git"},{"t":"text","v":" subcommand of tri. 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 such 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":"--all"},{"t":"text","v":" и сообщением "},{"t":"code","v":"cell:{id} issue:{N} ..."},{"t":"text","v":", затем push "},{"t":"code","v":"HEAD"},{"t":"text","v":" в origin в строгом режиме; проверки: запечатанная ячейка, нетоксичный вердикт, артефакты; реестр записывает хэш коммита и флаг pushed. Документ алфавита записывает оба шага как подкоманду "},{"t":"code","v":"git"},{"t":"text","v":" утилиты tri; текущая clap-поверхность её не предоставляет (свидетель: в "},{"t":"code","v":"cli/tri/src/main.rs"},{"t":"text","v":" нет такого варианта), поэтому здесь они приведены как шаги, а не как команды для копирования."}]],"type":"ol"},{"runs":[{"t":"text","v":"Закон SOUL о TDD в документе следует за седьмой фазой: любой эпизод P0/P1 в режиме "},{"t":"code","v":"--strict"},{"t":"text","v":" считается COMPLETE только после успешного push в "},{"t":"code","v":"github.com/gHashTag/t27"},{"t":"text","v":" с привязанной запечатанной ячейкой и нетоксичным вердиктом (закон называет push подкомандой tri; см. примечание к седьмой фазе выше). Где буква агента появляется в описании фазы, глава об инструментах и карточки агентов используют эту строку как источник связи ("},{"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":"шаг git"},{"t":"text","v":" -- седьмая фаза в записи документа алфавита, как подкоманда "},{"t":"code","v":"git"},{"t":"text","v":" утилиты tri. На коммите, на котором порождена документация, в clap-перечислении "},{"t":"code","v":"cli/tri/src/main.rs"},{"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":"0008d41fdffdd063af243376fbf83c31ffe8ff9995c6d666e94751330d67c97d","diagram":"phase-cycle","discarded":0,"enabled":true,"id":"docs/queen","links":{"body":"https://github.com/gHashTag/t27/blob/93727f733e23baf032d54505095777f16676d70b/docs/system/queen.md","spec":"https://github.com/gHashTag/t27/blob/93727f733e23baf032d54505095777f16676d70b/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/93727f733e23baf032d54505095777f16676d70b/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/93727f733e23baf032d54505095777f16676d70b/CLAUDE.md","where":"vendored"},{"kind":"file","path":"specs/agents/t.t27","rel":"specs/agents/t.t27","repo":"t27","sha256":"25c30ec4e1f38b575e3bb24cdd09bb770ce5e2a1220eac46f4da857916540f66","url":"https://github.com/gHashTag/t27/blob/93727f733e23baf032d54505095777f16676d70b/specs/agents/t.t27","where":"vendored"},{"kind":"file","path":"specs/tools/tri/cell.t27","rel":"specs/tools/tri/cell.t27","repo":"t27","sha256":"36ed34dfc7beb24c2fdd5b7dc5f7fe3375b42f357ffde7befd19f7cfbc22cdca","url":"https://github.com/gHashTag/t27/blob/93727f733e23baf032d54505095777f16676d70b/specs/tools/tri/cell.t27","where":"vendored"},{"kind":"file","path":"specs/tools/tri/verdict.t27","rel":"specs/tools/tri/verdict.t27","repo":"t27","sha256":"8afa0e665be25d336bdca685cd2369546a767678133bc86c9994d7c94da6a5c7","url":"https://github.com/gHashTag/t27/blob/93727f733e23baf032d54505095777f16676d70b/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":" does have a command-line binary of its own (an earlier version of this chapter said it had none; that was wrong): since S06 of gHashTag/trinity#988 its commands are cards under "},{"t":"code","v":"specs/tools/trinity/tri/"},{"t":"text","v":", read from the one registry that binary exports and its CI holds to the binary ("},{"t":"code","v":".trinity/registry.json"},{"t":"text","v":", 29 commands of a 187-entry table), with repository-qualified IDs ("},{"t":"code","v":"gHashTag/trinity:tri/"},{"t":"text","v":") so that a same-named command of the two binaries is never confused. "},{"t":"code","v":"specs/tools/catalog.t27"},{"t":"text","v":" states the schema, the identity rules and the legacy resolution; "},{"t":"code","v":"specs/tools/mcp_protocol.t27"},{"t":"text","v":" states what the Trinity MCP server does with a request; "},{"t":"code","v":"tools/trinity_tools_registry.py"},{"t":"text","v":" holds both and the cards to a measured inventory of the consumer."}],"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":"9c8d5ec87acb0205da7d1011722031807a4b713b37130004c5478f70f8151652","diagram":"tools-map","discarded":0,"enabled":true,"id":"docs/tooling","links":{"body":"https://github.com/gHashTag/t27/blob/93727f733e23baf032d54505095777f16676d70b/docs/system/tooling.md","spec":"https://github.com/gHashTag/t27/blob/93727f733e23baf032d54505095777f16676d70b/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":"37b5a451e43de9bc5746ceb80d4cf24f19ea6c3ad8751d2447049cba39c8a0ab","url":"https://github.com/gHashTag/t27/blob/93727f733e23baf032d54505095777f16676d70b/specs/tools/README.md","where":"vendored"},{"kind":"file","path":"specs/tools/tri/cell.t27","rel":"specs/tools/tri/cell.t27","repo":"t27","sha256":"36ed34dfc7beb24c2fdd5b7dc5f7fe3375b42f357ffde7befd19f7cfbc22cdca","url":"https://github.com/gHashTag/t27/blob/93727f733e23baf032d54505095777f16676d70b/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/93727f733e23baf032d54505095777f16676d70b/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/93727f733e23baf032d54505095777f16676d70b/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":false,"family":"tri-cli","id":"gHashTag/trinity:tri/bench","items":0,"name":"tri bench","repo":"gHashTag/trinity","witness":"registry-export"},{"agents":[],"external":false,"family":"tri-cli","id":"gHashTag/trinity:tri/bio","items":0,"name":"tri bio","repo":"gHashTag/trinity","witness":"registry-export"},{"agents":[],"external":false,"family":"tri-cli","id":"gHashTag/trinity:tri/blindspots","items":0,"name":"tri blindspots","repo":"gHashTag/trinity","witness":"registry-export"},{"agents":[],"external":false,"family":"tri-cli","id":"gHashTag/trinity:tri/conscious","items":0,"name":"tri conscious","repo":"gHashTag/trinity","witness":"registry-export"},{"agents":[],"external":false,"family":"tri-cli","id":"gHashTag/trinity:tri/constants","items":0,"name":"tri constants","repo":"gHashTag/trinity","witness":"registry-export"},{"agents":[],"external":false,"family":"tri-cli","id":"gHashTag/trinity:tri/cosmos","items":0,"name":"tri cosmos","repo":"gHashTag/trinity","witness":"registry-export"},{"agents":[],"external":false,"family":"tri-cli","id":"gHashTag/trinity:tri/dashboard","items":0,"name":"tri dashboard","repo":"gHashTag/trinity","witness":"registry-export"},{"agents":[],"external":false,"family":"tri-cli","id":"gHashTag/trinity:tri/fib","items":0,"name":"tri fib","repo":"gHashTag/trinity","witness":"registry-export"},{"agents":[],"external":false,"family":"tri-cli","id":"gHashTag/trinity:tri/fpga","items":0,"name":"tri fpga","repo":"gHashTag/trinity","witness":"registry-export"},{"agents":[],"external":false,"family":"tri-cli","id":"gHashTag/trinity:tri/gematria","items":0,"name":"tri gematria","repo":"gHashTag/trinity","witness":"registry-export"},{"agents":[],"external":false,"family":"tri-cli","id":"gHashTag/trinity:tri/govern","items":0,"name":"tri govern","repo":"gHashTag/trinity","witness":"registry-export"},{"agents":[],"external":false,"family":"tri-cli","id":"gHashTag/trinity:tri/hardware","items":0,"name":"tri hardware","repo":"gHashTag/trinity","witness":"registry-export"},{"agents":[],"external":false,"family":"tri-cli","id":"gHashTag/trinity:tri/identity","items":0,"name":"tri identity","repo":"gHashTag/trinity","witness":"registry-export"},{"agents":[],"external":false,"family":"tri-cli","id":"gHashTag/trinity:tri/lucas","items":0,"name":"tri lucas","repo":"gHashTag/trinity","witness":"registry-export"},{"agents":[],"external":false,"family":"tri-cli","id":"gHashTag/trinity:tri/mesh","items":0,"name":"tri mesh","repo":"gHashTag/trinity","witness":"registry-export"},{"agents":[],"external":false,"family":"tri-cli","id":"gHashTag/trinity:tri/needle","items":0,"name":"tri needle","repo":"gHashTag/trinity","witness":"registry-export"},{"agents":[],"external":false,"family":"tri-cli","id":"gHashTag/trinity:tri/needle-check","items":0,"name":"tri needle-check","repo":"gHashTag/trinity","witness":"registry-export"},{"agents":[],"external":false,"family":"tri-cli","id":"gHashTag/trinity:tri/needle-search","items":0,"name":"tri needle-search","repo":"gHashTag/trinity","witness":"registry-export"},{"agents":[],"external":false,"family":"tri-cli","id":"gHashTag/trinity:tri/omega","items":0,"name":"tri omega","repo":"gHashTag/trinity","witness":"registry-export"},{"agents":[],"external":false,"family":"tri-cli","id":"gHashTag/trinity:tri/particles","items":0,"name":"tri particles","repo":"gHashTag/trinity","witness":"registry-export"},{"agents":[],"external":false,"family":"tri-cli","id":"gHashTag/trinity:tri/phi","items":0,"name":"tri phi","repo":"gHashTag/trinity","witness":"registry-export"},{"agents":[],"external":false,"family":"tri-cli","id":"gHashTag/trinity:tri/quantum","items":0,"name":"tri quantum","repo":"gHashTag/trinity","witness":"registry-export"},{"agents":[],"external":false,"family":"tri-cli","id":"gHashTag/trinity:tri/reputation","items":0,"name":"tri reputation","repo":"gHashTag/trinity","witness":"registry-export"},{"agents":[],"external":false,"family":"tri-cli","id":"gHashTag/trinity:tri/sacred-const","items":0,"name":"tri sacred-const","repo":"gHashTag/trinity","witness":"registry-export"},{"agents":[],"external":false,"family":"tri-cli","id":"gHashTag/trinity:tri/spiral","items":0,"name":"tri spiral","repo":"gHashTag/trinity","witness":"registry-export"},{"agents":[],"external":false,"family":"tri-cli","id":"gHashTag/trinity:tri/swarm","items":0,"name":"tri swarm","repo":"gHashTag/trinity","witness":"registry-export"},{"agents":[],"external":false,"family":"tri-cli","id":"gHashTag/trinity:tri/test","items":0,"name":"tri test","repo":"gHashTag/trinity","witness":"registry-export"},{"agents":[],"external":false,"family":"tri-cli","id":"gHashTag/trinity:tri/vsa","items":0,"name":"tri vsa","repo":"gHashTag/trinity","witness":"registry-export"},{"agents":[],"external":false,"family":"tri-cli","id":"gHashTag/trinity:tri/wallet","items":0,"name":"tri wallet","repo":"gHashTag/trinity","witness":"registry-export"},{"agents":[],"external":true,"family":"mcp","id":"mcp/gitbutler","items":0,"name":"gitbutler","repo":"gHashTag/t27","witness":"source-parse"},{"agents":["T"],"external":true,"family":"mcp","id":"mcp/inngest-dev","items":20,"name":"inngest-dev","repo":"gHashTag/t27","witness":"help-output"},{"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/93727f733e23baf032d54505095777f16676d70b/docs/system/evidence.md","spec":"https://github.com/gHashTag/t27/blob/93727f733e23baf032d54505095777f16676d70b/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/93727f733e23baf032d54505095777f16676d70b/specs/skills/README.md","where":"vendored"},{"kind":"file","path":"specs/tools/README.md","rel":"specs/tools/README.md","repo":"t27","sha256":"37b5a451e43de9bc5746ceb80d4cf24f19ea6c3ad8751d2447049cba39c8a0ab","url":"https://github.com/gHashTag/t27/blob/93727f733e23baf032d54505095777f16676d70b/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/93727f733e23baf032d54505095777f16676d70b/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/93727f733e23baf032d54505095777f16676d70b/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/93727f733e23baf032d54505095777f16676d70b/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":1,"label":"help-output","layer":"Tools","source":"public/tools/spec-tools.json counts.byWitness"},{"count":29,"label":"registry-export","layer":"Tools","source":"public/tools/spec-tools.json counts.byWitness"},{"count":0,"label":"runtime","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":6,"label":"external (tool list not in either repository)","layer":"Tools","source":"public/tools/spec-tools.json counts"},{"count":178,"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/93727f733e23baf032d54505095777f16676d70b/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/93727f733e23baf032d54505095777f16676d70b/specs/skills","where":"vendored"},{"kind":"dir","path":"specs/crons","rel":"specs/crons","repo":"t27","sha256":null,"url":"https://github.com/gHashTag/t27/tree/93727f733e23baf032d54505095777f16676d70b/specs/crons","where":"vendored"},{"kind":"dir","path":"specs/agents","rel":"specs/agents","repo":"t27","sha256":null,"url":"https://github.com/gHashTag/t27/tree/93727f733e23baf032d54505095777f16676d70b/specs/agents","where":"vendored"},{"kind":"dir","path":"specs/tools","rel":"specs/tools","repo":"t27","sha256":null,"url":"https://github.com/gHashTag/t27/tree/93727f733e23baf032d54505095777f16676d70b/specs/tools","where":"vendored"},{"kind":"dir","path":"specs/i18n","rel":"specs/i18n","repo":"t27","sha256":null,"url":"https://github.com/gHashTag/t27/tree/93727f733e23baf032d54505095777f16676d70b/specs/i18n","where":"vendored"},{"kind":"file","path":"SOUL.md","rel":"SOUL.md","repo":"t27","sha256":"cb9b44e13d6d0b314f9626f9cca438e5f17ed6847b194220f9e80b32209e052e","url":"https://github.com/gHashTag/t27/blob/93727f733e23baf032d54505095777f16676d70b/SOUL.md","where":"vendored"},{"kind":"file","path":"AGENTS.md","rel":"AGENTS.md","repo":"t27","sha256":"1c9b8cce1600d4220d74498d187934e0b935ad1eae6deb9c1b100057ce9ac9e9","url":"https://github.com/gHashTag/t27/blob/93727f733e23baf032d54505095777f16676d70b/AGENTS.md","where":"vendored"},{"kind":"file","path":"CLAUDE.md","rel":"CLAUDE.md","repo":"t27","sha256":"b6250fd688a9d794b9eaecebd9882905aa49bfab06616be82211a87fe098656d","url":"https://github.com/gHashTag/t27/blob/93727f733e23baf032d54505095777f16676d70b/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/93727f733e23baf032d54505095777f16676d70b/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/93727f733e23baf032d54505095777f16676d70b/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":3},{"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,"functions":28,"skills":26,"specs":856,"tools":92},"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":92},"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/T","kind":"agent-holds-tool","to":"mcp/inngest-dev"},{"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/inngest-dev","mcp/neon","mcp/notebooklm","mcp/railway-mcp-server","mcp/zig-docs"],"mcpByRepo":{"gHashTag/t27":["mcp/gitbutler","mcp/inngest-dev","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":{"-":["gHashTag/trinity:tri/bench","gHashTag/trinity:tri/bio","gHashTag/trinity:tri/blindspots","gHashTag/trinity:tri/conscious","gHashTag/trinity:tri/constants","gHashTag/trinity:tri/cosmos","gHashTag/trinity:tri/dashboard","gHashTag/trinity:tri/fib","gHashTag/trinity:tri/fpga","gHashTag/trinity:tri/gematria","gHashTag/trinity:tri/govern","gHashTag/trinity:tri/hardware","gHashTag/trinity:tri/identity","gHashTag/trinity:tri/lucas","gHashTag/trinity:tri/mesh","gHashTag/trinity:tri/needle","gHashTag/trinity:tri/needle-check","gHashTag/trinity:tri/needle-search","gHashTag/trinity:tri/omega","gHashTag/trinity:tri/particles","gHashTag/trinity:tri/phi","gHashTag/trinity:tri/quantum","gHashTag/trinity:tri/reputation","gHashTag/trinity:tri/sacred-const","gHashTag/trinity:tri/spiral","gHashTag/trinity:tri/swarm","gHashTag/trinity:tri/test","gHashTag/trinity:tri/vsa","gHashTag/trinity:tri/wallet","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-12T12:30:15.363Z","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,"functions":28,"skills":26,"specs":856,"tools":92},"pin":{"ref":"93727f733e23baf032d54505095777f16676d70b","source":"public/agents/experience.json sources[t27].commit / sources[trinity].commit","trinity":"ddceafb50cd0e620387161228fa2c9ae134047de"},"version":1,"warnings":[],"contentSha256":"9594d353a3608dfdb5fac83e0069c6bf6c9a3d042c12b0e77dcb14422e810bdb"} diff --git a/apps/website/public/skills/spec-skills.json b/apps/website/public/skills/spec-skills.json index c72c863de4..b112e9f26c 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-13T03:52:07.716Z","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":"1d66142158e49a5a78ce907dd191dd469c690f068165ae53acde5befb1285c20","counts":{"codeOnly":0,"runBy":0,"specOnly":0,"specPlusCode":26,"specs":26,"typecheckOk":26},"generatedAt":"2026-09-13T03:52:07.716Z","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"}],"ladder":{"agents":27,"crons":33,"functions":28,"skills":26,"specs":856,"tools":92},"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/qa/agents-spec-contract.mjs b/apps/website/qa/agents-spec-contract.mjs index c507dae343..d9eef813e5 100644 --- a/apps/website/qa/agents-spec-contract.mjs +++ b/apps/website/qa/agents-spec-contract.mjs @@ -258,6 +258,8 @@ assert.equal(agents.counts.withTools, agents.agents.filter((a) => a.tools.length assert.equal(agents.counts.withExperience, agents.counts.specPlusExperience) for (const l of AGENT_LAYERS) assert.equal(agents.counts.byLayer[l], agents.agents.filter((a) => a.fields.LAYER === l).length) assert.deepEqual(agents.ladder, { specs: t27Manifest.specCount, skills: skills.skills.length, crons: crons.crons.length, agents: agents.agents.length, tools: tools.tools.length, functions: functions.functions.length }, 'the ladder counts are the catalogs, tools and functions included') +assert.deepEqual(skills.ladder, agents.ladder, 'the skills catalog shows the same ladder as the agents catalog') +assert.deepEqual(crons.ladder, agents.ladder, 'the crons catalog shows the same ladder as the agents catalog') // The snapshot's own attribution rule names the letters it can assign; every agent letter is among them. for (const a of agents.agents) assert.ok(experience.attribution.letters.includes(a.letter), `${a.letter}: the attribution rule cannot assign this letter`) diff --git a/apps/website/qa/docs-spec-contract.mjs b/apps/website/qa/docs-spec-contract.mjs index 6a9a478f1f..e61d3c0fad 100644 --- a/apps/website/qa/docs-spec-contract.mjs +++ b/apps/website/qa/docs-spec-contract.mjs @@ -146,8 +146,9 @@ 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 functions = JSON.parse(readFileSync('public/functions/spec-functions.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.ladder, { specs: manifest.specs.length, skills: skills.counts.specs, crons: crons.counts.specs, agents: agents.counts.specs, tools: tools.counts.specs, functions: functions.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)) @@ -156,7 +157,7 @@ const tableOf = (kind) => docs.chapters.find((c) => c.table?.kind === kind)?.tab 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 (ladderTable) assert.deepEqual(ladderTable.rows.map((r) => r.count), [docs.ladder.specs, docs.ladder.skills, docs.ladder.crons, docs.ladder.agents, docs.ladder.tools, docs.ladder.functions]) 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) diff --git a/apps/website/scripts/agents-from-specs.mjs b/apps/website/scripts/agents-from-specs.mjs index d10f874a6a..ef956c8589 100644 --- a/apps/website/scripts/agents-from-specs.mjs +++ b/apps/website/scripts/agents-from-specs.mjs @@ -799,6 +799,8 @@ export function buildSpecCatalogs({ skillSpecs, cronSpecs, agentSpecs = [], func skills, codeOnly: codeOnlySkills, i18n: i18nFor(SKILL_SPEC_DIR, skills), + // Every Explorer shows the one ladder, the Skill and Cron Explorers too. + ladder, }) const cronsOut = sortKeys({ ...base, @@ -807,6 +809,7 @@ export function buildSpecCatalogs({ skillSpecs, cronSpecs, agentSpecs = [], func crons, codeOnly: codeOnlyCrons, i18n: i18nFor(CRON_SPEC_DIR, crons), + ladder, }) const agentsOut = sortKeys({ ...base, diff --git a/apps/website/scripts/docs-from-specs.mjs b/apps/website/scripts/docs-from-specs.mjs index 9cc6562574..55886db4d6 100644 --- a/apps/website/scripts/docs-from-specs.mjs +++ b/apps/website/scripts/docs-from-specs.mjs @@ -349,7 +349,7 @@ export function buildDocs({ docsSpec, chapterSpecs, i18nSpecs = [], bundles = ne 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 { skills, crons, agents, tools, functions, t27Manifest } = catalogs const constitution = sourceTexts.get('docs/T27-CONSTITUTION.md') ?? '' const alphabet = sourceTexts.get('docs/agents/AGENTS_ALPHABET.md') ?? '' const laws = parseLawTable(constitution) @@ -362,8 +362,11 @@ export function buildDocs({ docsSpec, chapterSpecs, i18nSpecs = [], bundles = ne 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)) + // The site's ladder is the one every Explorer header shows: Specs -> Skills -> Crons -> + // Agents -> Tools -> Functions (public/agents/spec-agents.json `ladder`). The chapter's + // prose is vendored from t27 and may name fewer layers; the counts here are the site's. 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, + 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, functions: functions?.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' }, @@ -371,6 +374,7 @@ export function buildDocs({ docsSpec, chapterSpecs, i18nSpecs = [], bundles = ne { 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' }, + { layer: 'Functions', dir: 'specs/functions', count: ladder.functions, typecheckOk: functions?.counts?.typecheckOk ?? null, source: 'public/functions/spec-functions.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' })), @@ -389,7 +393,7 @@ export function buildDocs({ docsSpec, chapterSpecs, i18nSpecs = [], bundles = ne 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: '' }, + 'ladder-counts': { columns: ['layer', 'dir', 'count', 'typecheckOk', 'source'], rows: ladderRows, source: 'the five 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: '' }, @@ -547,7 +551,7 @@ export async function generate({ generatedAt } = {}) { 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') }, + 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'), functions: readJson('public/functions/spec-functions.json'), t27Manifest: readJson('public/t27/manifest.json') }, compilerWasmSha256: sha256(wasmBytes), generatedAt: stamp, }) } diff --git a/apps/website/scripts/docs-from-specs.test.mjs b/apps/website/scripts/docs-from-specs.test.mjs index 6df8b69b0c..5d9883535f 100644 --- a/apps/website/scripts/docs-from-specs.test.mjs +++ b/apps/website/scripts/docs-from-specs.test.mjs @@ -68,6 +68,7 @@ const catalogs = () => ({ 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: {} } }, + functions: { counts: { specs: 4, typecheckOk: 4 }, functions: [{}, {}, {}, {}] }, t27Manifest: { specs: [{}, {}, {}], health: { typecheckOk: 3 } }, }) @@ -139,7 +140,7 @@ test('a clean document builds: chapters in order, tables and figures fed, source 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.ladder, { specs: 3, skills: 2, crons: 1, agents: 1, tools: 1, functions: 4, 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) diff --git a/apps/website/src/components/SystemDocsFigures.tsx b/apps/website/src/components/SystemDocsFigures.tsx index 6ccc63d827..e6b358ad7d 100644 --- a/apps/website/src/components/SystemDocsFigures.tsx +++ b/apps/website/src/components/SystemDocsFigures.tsx @@ -15,7 +15,7 @@ import type { DiagramKind, DocFigures } from '../lib/systemDocs' const LAYER_COLOR: Record = { Archetypal: C.golden, Spiritual: C.blue, Physical: C.accent } const CAPTIONS: Record = { - ladder: { en: 'The five-layer ladder: Specs → Skills → Crons → Agents → Tools, with the count each catalog holds today.', ru: 'Пятислойная лестница: спеки → навыки → расписания → агенты → инструменты, с текущим числом карточек в каждом каталоге.' }, + ladder: { en: 'The six-step ladder every Explorer shows: Specs → Skills → Crons → Agents → Tools → Functions, with the count each catalog holds today.', ru: 'Лестница из шести ступеней, которую показывает каждый обозреватель: спеки → навыки → расписания → агенты → инструменты → функции, с текущим числом карточек в каждом каталоге.' }, 'agent-ring': { en: 'The 27-letter alphabet as a ring: three nonas, coloured by layer; an outer tick marks a letter with a source-bound skill or tool.', ru: 'Алфавит из 27 букв как кольцо: три ноны, цвет — слой; внешняя метка отмечает букву с привязанным по источнику навыком или инструментом.' }, 'phase-cycle': { en: 'The 6+1 phase cycle of AGENT T as the alphabet draws it; the seventh box (GIT WORKFLOW) closes the loop under the SOUL law.', ru: 'Цикл 6+1 фаз АГЕНТА T, как его рисует алфавит; седьмой блок (GIT WORKFLOW) замыкает петлю по закону SOUL.' }, 'law-hierarchy': { en: 'The law hierarchy of the constitution: a higher law wins a conflict, so L1 sits widest and L7 narrowest.', ru: 'Иерархия законов конституции: при конфликте побеждает старший закон, поэтому L1 самый широкий, L7 самый узкий.' }, @@ -24,8 +24,8 @@ const CAPTIONS: Record = { } const UI = { - en: { source: 'Data source', figure: 'Figure', unowned: 'no owner', external: 'external', crons: 'crons', skills: 'skills', agents: 'agents', tools: 'tools', noEdges: 'without a drawn edge', specs: 'specs', chapters: 'docs chapters', tri: 'tri commands', mcp: 'MCP servers', repo: 'repository', priority: 'priority', steps: 'steps' }, - ru: { source: 'Источник данных', figure: 'Рисунок', unowned: 'без владельца', external: 'внешний', crons: 'расписания', skills: 'навыки', agents: 'агенты', tools: 'инструменты', noEdges: 'без нарисованных связей', specs: 'спеки', chapters: 'главы документации', tri: 'команды tri', mcp: 'MCP-серверы', repo: 'репозиторий', priority: 'приоритет', steps: 'шагов' }, + en: { source: 'Data source', figure: 'Figure', unowned: 'no owner', external: 'external', crons: 'crons', skills: 'skills', agents: 'agents', tools: 'tools', functions: 'functions', noEdges: 'without a drawn edge', specs: 'specs', chapters: 'docs chapters', tri: 'tri commands', mcp: 'MCP servers', repo: 'repository', priority: 'priority', steps: 'steps' }, + ru: { source: 'Источник данных', figure: 'Рисунок', unowned: 'без владельца', external: 'внешний', crons: 'расписания', skills: 'навыки', agents: 'агенты', tools: 'инструменты', functions: 'функции', noEdges: 'без нарисованных связей', specs: 'спеки', chapters: 'главы документации', tri: 'команды tri', mcp: 'MCP-серверы', repo: 'репозиторий', priority: 'приоритет', steps: 'шагов' }, } const mono: CSSProperties = { fontFamily: C.mono } @@ -52,8 +52,9 @@ export function LadderFigure({ data, lang }: { data: DocFigures['ladder']; lang: { key: 'crons', label: ui.crons, n: data.counts.crons }, { key: 'agents', label: ui.agents, n: data.counts.agents }, { key: 'tools', label: ui.tools, n: data.counts.tools }, + { key: 'functions', label: ui.functions, n: data.counts.functions }, ] - const W = 640, H = 230, base = 190, stepW = 116, x0 = 24 + const W = 740, H = 250, base = 210, stepW = 116, x0 = 24 const max = Math.max(...steps.map((s) => Math.log10(Math.max(1, s.n)) + 1)) return ( diff --git a/apps/website/src/lib/agentSpecs.ts b/apps/website/src/lib/agentSpecs.ts index 40a8fb0442..7f13a71139 100644 --- a/apps/website/src/lib/agentSpecs.ts +++ b/apps/website/src/lib/agentSpecs.ts @@ -231,11 +231,13 @@ interface SpecCatalogBase { export interface SkillSpecCatalog extends SpecCatalogBase { counts: { specs: number; specPlusCode: number; specOnly: number; codeOnly: number; typecheckOk: number; runBy: number } + ladder: LadderCounts skills: SkillSpecEntry[] } export interface CronSpecCatalog extends SpecCatalogBase { counts: { specs: number; specPlusCode: number; specOnly: number; codeOnly: number; typecheckOk: number; withRuns: number; byHost: Record } + ladder: LadderCounts crons: CronSpecEntry[] } diff --git a/apps/website/src/lib/queenModules.ts b/apps/website/src/lib/queenModules.ts index 8319305d44..991da22f83 100644 --- a/apps/website/src/lib/queenModules.ts +++ b/apps/website/src/lib/queenModules.ts @@ -187,12 +187,12 @@ export const MODULES = [ en: { name: 'PROJECT', hint: 'The project, the rules of the game for its agents, and the system in detail (key p)', - body: 'The system documentation, embedded whole: seven chapters read from one declared document, specs/docs/system.t27 — what the project claims and how each claim is tagged; the constitution and the rules of the game its agents follow; the five-layer ladder, Specs → Skills → Crons → Agents → Tools, with live counts; the 27-letter alphabet; the Queen\'s 6+1 phase cycle; the tools; and how every number on the site is witnessed. Prose comes from docs/system/*.md through the compiler, tables are generated from the catalogs, figures are drawn from data, and each carries its source and commit. The digits 1–0 are taken, so this view opens on the letter p.', + body: 'The system documentation, embedded whole: seven chapters read from one declared document, specs/docs/system.t27 — what the project claims and how each claim is tagged; the constitution and the rules of the game its agents follow; the six-step ladder, Specs → Skills → Crons → Agents → Tools → Functions, with live counts; the 27-letter alphabet; the Queen\'s 6+1 phase cycle; the tools; and how every number on the site is witnessed. Prose comes from docs/system/*.md through the compiler, tables are generated from the catalogs, figures are drawn from data, and each carries its source and commit. The digits 1–0 are taken, so this view opens on the letter p.', }, ru: { name: 'ПРОЕКТ', hint: 'проект, правила игры для агентов и система в деталях (клавиша p)', - body: 'Документация системы целиком: семь глав, прочитанных из одного объявленного документа specs/docs/system.t27 — что проект утверждает и как помечено каждое утверждение; конституция и правила игры, по которым живут агенты; пятислойная лестница спеки → скиллы → кроны → агенты → инструменты с живыми числами; алфавит из 27 букв; цикл Королевы 6+1; инструменты; и то, как засвидетельствовано каждое число на сайте. Проза берётся из docs/system/*.md через компилятор, таблицы порождаются из каталогов, рисунки строятся по данным, и у каждого указан источник и коммит. Цифры 1–0 заняты, поэтому этот вид открывается буквой p.', + body: 'Документация системы целиком: семь глав, прочитанных из одного объявленного документа specs/docs/system.t27 — что проект утверждает и как помечено каждое утверждение; конституция и правила игры, по которым живут агенты; лестница из шести ступеней спеки → скиллы → кроны → агенты → инструменты → функции с живыми числами; алфавит из 27 букв; цикл Королевы 6+1; инструменты; и то, как засвидетельствовано каждое число на сайте. Проза берётся из docs/system/*.md через компилятор, таблицы порождаются из каталогов, рисунки строятся по данным, и у каждого указан источник и коммит. Цифры 1–0 заняты, поэтому этот вид открывается буквой p.', }, }, { diff --git a/apps/website/src/lib/systemDocs.ts b/apps/website/src/lib/systemDocs.ts index 19e2dee307..63493f2e0c 100644 --- a/apps/website/src/lib/systemDocs.ts +++ b/apps/website/src/lib/systemDocs.ts @@ -54,7 +54,7 @@ export interface DocChapter { links: { spec: string; body: string } } -export interface LadderCounts { specs: number; skills: number; crons: number; agents: number; tools: number; docsChapters: number } +export interface LadderCounts { specs: number; skills: number; crons: number; agents: number; tools: number; functions: number; docsChapters: number } export interface RingAgent { letter: string; ordinal: number; layer: 'Archetypal' | 'Spiritual' | 'Physical'; name: string; skills: number; tools: number } export interface PhaseNode { n: number; name: string; note: string; steps: number } diff --git a/apps/website/src/pages/CronExplorer.tsx b/apps/website/src/pages/CronExplorer.tsx index 6b11cf67a1..b226fdaf93 100644 --- a/apps/website/src/pages/CronExplorer.tsx +++ b/apps/website/src/pages/CronExplorer.tsx @@ -18,6 +18,7 @@ import { useHashParams } from '../hooks/useHashParams' import { useDocumentLock, useViewport } from '../lib/useViewport' import { HEADER_CHROME_MAX } from '../lib/viewport.generated' import { ExplorerHeader } from '../components/ExplorerHeader' +import { LayerLadder, type LadderStep } from '../components/LayerLadder' import { ExplorerLibrary, type ExplorerItem } from '../components/ExplorerLibrary' import { AgentSpecPanel } from '../components/AgentSpecPanel' import { loadCronSpecs, type CronSpecCatalog, type CronSpecEntry } from '../lib/agentSpecs' @@ -85,6 +86,13 @@ const UI = { provenance: 'Jobs from', snapshotDirty: 'uncommitted changes', tz: 'All cron times are UTC.', + ladder: 'ladder', + ladderSpecs: 'Specs', + ladderSkills: 'Skills', + ladderCrons: 'Crons', + ladderAgents: 'Agents', + ladderTools: 'Tools', + ladderFunctions: 'Functions', }, ru: { title: 'Обозреватель кронов', @@ -144,6 +152,13 @@ const UI = { provenance: 'Задания из', snapshotDirty: 'незакоммиченные правки', tz: 'Все времена кронов — UTC.', + ladder: 'лестница', + ladderSpecs: 'Спеки', + ladderSkills: 'Скиллы', + ladderCrons: 'Кроны', + ladderAgents: 'Агенты', + ladderTools: 'Инструменты', + ladderFunctions: 'Функции', }, } as const @@ -343,6 +358,20 @@ export default function CronExplorer() { ) }, [selected]) + // The ladder every Explorer stands on, with the counts the spec catalog carries. + const ladderSteps: LadderStep[] = useMemo(() => { + const l = specs?.ladder + const embed = embedded ? '?embed=1' : '' + return [ + { key: 'specs', label: ui.ladderSpecs, count: l?.specs ?? null, href: `#/specs${embed}` }, + { key: 'skills', label: ui.ladderSkills, count: l?.skills ?? null, href: `#/skills${embed}` }, + { key: 'crons', label: ui.ladderCrons, count: l?.crons ?? null, href: `#/crons${embed}`, current: true }, + { key: 'agents', label: ui.ladderAgents, count: l?.agents ?? null, href: `#/agents${embed}` }, + { key: 'tools', label: ui.ladderTools, count: l?.tools ?? null, href: `#/tools${embed}` }, + { key: 'functions', label: ui.ladderFunctions, count: l?.functions ?? null, href: `#/functions${embed}` }, + ] + }, [specs, embedded, ui.ladderSpecs, ui.ladderSkills, ui.ladderCrons, ui.ladderAgents, ui.ladderTools, ui.ladderFunctions]) + const box = panelBox(embedded) const showList = !phone || pane === 'list' const showDetail = !phone || pane === 'detail' @@ -383,6 +412,7 @@ export default function CronExplorer() { phone={phone} /> )} +
{showList && ( diff --git a/apps/website/src/pages/FunctionExplorer.tsx b/apps/website/src/pages/FunctionExplorer.tsx index aabed15b49..b7a3945607 100644 --- a/apps/website/src/pages/FunctionExplorer.tsx +++ b/apps/website/src/pages/FunctionExplorer.tsx @@ -58,7 +58,7 @@ const UI = { filterAll: 'All', filterEvent: 'event', filterCron: 'cron', - ladder: 'Specs → Skills → Crons → Agents → Functions', + ladder: 'ladder', ladderSpecs: 'Specs', ladderSkills: 'Skills', ladderCrons: 'Crons', @@ -164,7 +164,7 @@ const UI = { filterAll: 'Все', filterEvent: 'событие', filterCron: 'крон', - ladder: 'Спеки → Скиллы → Кроны → Агенты → Функции', + ladder: 'лестница', ladderSpecs: 'Спеки', ladderSkills: 'Скиллы', ladderCrons: 'Кроны', diff --git a/apps/website/src/pages/Queen.tsx b/apps/website/src/pages/Queen.tsx index db62ed9b26..ece7d7c777 100644 --- a/apps/website/src/pages/Queen.tsx +++ b/apps/website/src/pages/Queen.tsx @@ -331,7 +331,7 @@ const COPY = { projectHint: "The project, the rules of the game for its agents, and the system in detail (key p)", projectDirective: "THE SYSTEM IS A DOCUMENT", projectDirectiveBody: - "The system documentation, whole: one declared document, specs/docs/system.t27, names seven chapters and their order; each chapter spec names its sources, its sections and the Markdown body that is its text. The generator renders the body through the compiler, builds every table from the catalogs and draws every figure from data; nothing on the page is typed twice. Chapters: the project and its tagged claims, the constitution and the rules of the game, the five-layer ladder, the 27-letter alphabet, the Queen's cycle, the tools, the witnesses. Opens on the letter p: the digits are spent.", + "The system documentation, whole: one declared document, specs/docs/system.t27, names seven chapters and their order; each chapter spec names its sources, its sections and the Markdown body that is its text. The generator renders the body through the compiler, builds every table from the catalogs and draws every figure from data; nothing on the page is typed twice. Chapters: the project and its tagged claims, the constitution and the rules of the game, the six-step ladder, the 27-letter alphabet, the Queen's cycle, the tools, the witnesses. Opens on the letter p: the digits are spent.", projectChapters: "chapters", projectRu: "with a Russian body", projectSources: "sources pinned", @@ -648,7 +648,7 @@ const COPY = { projectHint: "проект, правила игры для агентов и система в деталях (клавиша p)", projectDirective: "СИСТЕМА — ЭТО ДОКУМЕНТ", projectDirectiveBody: - "Документация системы целиком: один объявленный документ, specs/docs/system.t27, называет семь глав и их порядок; спека каждой главы называет её источники, разделы и Markdown-текст, который и есть её содержание. Генератор прогоняет текст через компилятор, строит каждую таблицу из каталогов и рисует каждый рисунок по данным; ничего на странице не набрано дважды. Главы: проект и его помеченные утверждения, конституция и правила игры, пятислойная лестница, алфавит из 27 букв, цикл Королевы, инструменты, свидетели. Открывается буквой p: цифры заняты.", + "Документация системы целиком: один объявленный документ, specs/docs/system.t27, называет семь глав и их порядок; спека каждой главы называет её источники, разделы и Markdown-текст, который и есть её содержание. Генератор прогоняет текст через компилятор, строит каждую таблицу из каталогов и рисует каждый рисунок по данным; ничего на странице не набрано дважды. Главы: проект и его помеченные утверждения, конституция и правила игры, лестница из шести ступеней, алфавит из 27 букв, цикл Королевы, инструменты, свидетели. Открывается буквой p: цифры заняты.", projectChapters: "глав", projectRu: "с русским текстом", projectSources: "источников закреплено", diff --git a/apps/website/src/pages/SkillExplorer.tsx b/apps/website/src/pages/SkillExplorer.tsx index f367c7bba3..780afa7a09 100644 --- a/apps/website/src/pages/SkillExplorer.tsx +++ b/apps/website/src/pages/SkillExplorer.tsx @@ -19,6 +19,7 @@ import { useHashParams } from '../hooks/useHashParams' import { useDocumentLock, useViewport } from '../lib/useViewport' import { HEADER_CHROME_MAX } from '../lib/viewport.generated' import { ExplorerHeader } from '../components/ExplorerHeader' +import { LayerLadder, type LadderStep } from '../components/LayerLadder' import { ExplorerLibrary, type ExplorerItem } from '../components/ExplorerLibrary' import { SpecCodeView } from '../components/SpecCodeView' import { AgentSpecPanel } from '../components/AgentSpecPanel' @@ -115,6 +116,13 @@ const UI = { filters: 'Filters', detail: 'Skill', failed: 'The catalog could not be read:', + ladder: 'ladder', + ladderSpecs: 'Specs', + ladderSkills: 'Skills', + ladderCrons: 'Crons', + ladderAgents: 'Agents', + ladderTools: 'Tools', + ladderFunctions: 'Functions', }, ru: { title: 'Обозреватель скилов', @@ -190,6 +198,13 @@ const UI = { filters: 'Фильтры', detail: 'Скил', failed: 'Каталог не прочитан:', + ladder: 'лестница', + ladderSpecs: 'Спеки', + ladderSkills: 'Скиллы', + ladderCrons: 'Кроны', + ladderAgents: 'Агенты', + ladderTools: 'Инструменты', + ladderFunctions: 'Функции', }, } as const @@ -436,6 +451,20 @@ export default function SkillExplorer() { return `${base}?title=${encodeURIComponent(title)}&body=${encodeURIComponent(body)}` } + // The ladder every Explorer stands on, with the counts the spec catalog carries. + const ladderSteps: LadderStep[] = useMemo(() => { + const l = specs?.ladder + const embed = embedded ? '?embed=1' : '' + return [ + { key: 'specs', label: ui.ladderSpecs, count: l?.specs ?? null, href: `#/specs${embed}` }, + { key: 'skills', label: ui.ladderSkills, count: l?.skills ?? null, href: `#/skills${embed}`, current: true }, + { key: 'crons', label: ui.ladderCrons, count: l?.crons ?? null, href: `#/crons${embed}` }, + { key: 'agents', label: ui.ladderAgents, count: l?.agents ?? null, href: `#/agents${embed}` }, + { key: 'tools', label: ui.ladderTools, count: l?.tools ?? null, href: `#/tools${embed}` }, + { key: 'functions', label: ui.ladderFunctions, count: l?.functions ?? null, href: `#/functions${embed}` }, + ] + }, [specs, embedded, ui.ladderSpecs, ui.ladderSkills, ui.ladderCrons, ui.ladderAgents, ui.ladderTools, ui.ladderFunctions]) + const box = panelBox(embedded) const showList = !phone || pane === 'list' const showDetail = !phone || pane === 'detail' @@ -468,6 +497,7 @@ export default function SkillExplorer() { phone={phone} /> )} +
{showList && ( diff --git a/apps/website/src/pages/SystemDocs.tsx b/apps/website/src/pages/SystemDocs.tsx index 8d78f35243..c9c233e845 100644 --- a/apps/website/src/pages/SystemDocs.tsx +++ b/apps/website/src/pages/SystemDocs.tsx @@ -34,7 +34,7 @@ const UI = { title: 'System documentation', subtitle: 'The project, the rules of the game for its agents, and the system in detail', metaTitle: 'System documentation', - metaDescription: 'The t27 / Trinity system as one declared document: what the project claims and how each claim is tagged, the constitution and the rules its agents follow, the five-layer ladder, the 27-letter alphabet, the Queen cycle, the tools, and how every number on the site is witnessed.', + metaDescription: 'The t27 / Trinity system as one declared document: what the project claims and how each claim is tagged, the constitution and the rules its agents follow, the six-step ladder, the 27-letter alphabet, the Queen cycle, the tools, and how every number on the site is witnessed.', note: 'Generated from specs/docs/**.t27; prose from docs/system/*.md', back: '← Home', contents: 'Contents', @@ -67,7 +67,7 @@ const UI = { title: 'Документация системы', subtitle: 'Проект, правила игры для агентов и система в деталях', metaTitle: 'Документация системы', - metaDescription: 'Система t27 / Trinity как один объявленный документ: что проект утверждает и как помечено каждое утверждение, конституция и правила для агентов, пятислойная лестница, алфавит из 27 букв, цикл Королевы, инструменты и то, как засвидетельствовано каждое число на сайте.', + metaDescription: 'Система t27 / Trinity как один объявленный документ: что проект утверждает и как помечено каждое утверждение, конституция и правила для агентов, лестница из шести ступеней, алфавит из 27 букв, цикл Королевы, инструменты и то, как засвидетельствовано каждое число на сайте.', note: 'Порождено из specs/docs/**.t27; проза из docs/system/*.md', back: '← На главную', contents: 'Содержание', From c26d126e4fb7ad84dfcc512580421b7a1de7cc12 Mon Sep 17 00:00:00 2001 From: Dmitrii Vasilev Date: Tue, 15 Sep 2026 01:24:33 +0700 Subject: [PATCH 6/7] fix(website): the Queen's address names the card each embedded Explorer shows Every Queen tab has its own address, and the tabs that frame an Explorer now carry that Explorer's card in it too. Seven Queen tabs frame an Explorer, and each kept its card only in the frame's own hash. Measured on t27.ai and on a local build of 429499e662: a pick in #/queen?tab=skills changed the frame, not the address, so a reload opened the default skill; ?tab=specs&spec=specs/tri/tri_cli.t27 stayed on hello_world; a PROJECT chapter jump was lost on reload; the language toggle reloaded the frame on its default; and the ladder link Skills inside #/queen?tab=agents navigated the frame to the Skill Explorer under a rail and an address that still said AGENTS. The Queen address now names the card: skill=, cron=, agent=, function=, tool=, spec= and chapter= (lib/queenEmbed SELECTION_KEY). - Frame side, lib/queenFrame, which imports nothing so the entry chunk grows by 1.1 kB: a page whose window the Queen named t27-queen-explorer posts each card it writes to its address (useHashParams.set, the Spec Explorer's pick) and hands a plain click on a link to an Explorer route to the Queen instead of following it. Frames the Queen did not name (the Spec Explorer in a skill card, the landing previews) post nothing and keep their links. - Host side, components/useQueenExplorerFrame, used by QueenAgents and QueenSpecs: a message counts only from this origin and this frame. The frame boots on the address's card. A pick writes the address with replace, as tab= is written. An outside hash change, Back, or a frame load moves the frame with location.replace, which adds no history entry. A link to another Explorer switches the Queen tab, so the rail, the address, the frame title and the frame agree. The language toggle boots a new frame on the same card. Leaving a tab drops its card. - Ids go through the Explorers' own *ExplorerHash helpers. A refused id is no card: the frame opens its default and the address takes that default. An id the helper accepts but the catalog lacks gets the Explorer's own not-found card, as on its own page, and the address keeps it -- no silent swap to a different card. The docs page has no such card and opens the first chapter; in a frame it writes the chapter it opened, so the address names it. - An address that names no card of its tab (a link or Back to the bare tab) takes the frame's card, since the Explorers keep the open card on such a hash, so a reload opens what was on screen. A booting frame's report waits for its load event, and a report the frame has since been moved past is dropped as stale. - The Spec Explorer, in a frame only, follows a later ?spec=; as with a list click, that discards an unsaved draft. On its own page it still reads its address once, as before (measured: a later ?spec= leaves the page on its spec on both builds). Behaviour to know: a plain Queen tab visit writes the Explorer's default card into the address once the frame has loaded (#/queen?tab=skills becomes same inside its own frame. A hash without a card written inside the frame changes nothing, since the frame still shows its card. qa/queen-embed-address-contract.mjs (npm run check:queen-embed; --origin= for a build served elsewhere) checks this in headless Chrome against the live DOM of the Queen and the frame. Results in headless Chrome at 1440x900, on a heavily loaded machine: - build of 429499e662, served locally: FAIL, 23 of 24. Every card check fails, each for its own reason (the default card under a deep link, no card in the address after a pick, skill= left behind after a tab switch, chapter=zz kept while chapter 1 shows); only "no uncaught exceptions" passes. The ?lang= check in D fails there too; that fix is an earlier commit. - build of this commit: PASS, 24 of 24. Also on this build: the live tabs probe (PROBE_SKIP_FRAMES=1) passes 47 of 47 (every tab still writes and follows its address by click, key, outside hash and Back); standalone #/skills picks and ladder links behave as before; the entry chunk is 309347 bytes against 308218 at 429499e662. The typecheck ratchet adds no errors; eslint reports only the react-refresh error that main.tsx already had. Co-Authored-By: Claude Opus 5 --- apps/website/package.json | 1 + .../qa/queen-embed-address-contract.mjs | 318 ++++++++++++++++++ apps/website/src/components/QueenAgents.tsx | 43 +-- apps/website/src/components/QueenSpecs.tsx | 25 +- .../src/components/useQueenExplorerFrame.ts | 150 +++++++++ apps/website/src/hooks/useHashParams.ts | 3 + apps/website/src/lib/queenEmbed.ts | 100 ++++++ apps/website/src/lib/queenFrame.ts | 72 ++++ apps/website/src/main.tsx | 5 + apps/website/src/pages/Queen.tsx | 22 +- apps/website/src/pages/SpecExplorer.tsx | 27 +- apps/website/src/pages/SystemDocs.tsx | 8 + 12 files changed, 730 insertions(+), 44 deletions(-) create mode 100644 apps/website/qa/queen-embed-address-contract.mjs create mode 100644 apps/website/src/components/useQueenExplorerFrame.ts create mode 100644 apps/website/src/lib/queenEmbed.ts create mode 100644 apps/website/src/lib/queenFrame.ts diff --git a/apps/website/package.json b/apps/website/package.json index 84818ae0f2..f4798954f3 100644 --- a/apps/website/package.json +++ b/apps/website/package.json @@ -57,6 +57,7 @@ "check:queen-foundation": "node qa/queen-foundation-contract.mjs", "check:queen-windows": "node qa/queen-windows-contract.mjs", "check:queen-void": "node qa/queen-void-contract.mjs", + "check:queen-embed": "node qa/queen-embed-address-contract.mjs", "check:queen-babylon": "npx vite build && QUEEN_ENGINE=babylon node qa/queen-pick-contract.mjs --no-build && QUEEN_ENGINE=babylon node qa/queen-placement-contract.mjs --no-build && QUEEN_ENGINE=babylon node qa/queen-touch-contract.mjs --no-build", "skills:sync": "node scripts/sync-skills.mjs", "skills:core": "node scripts/skills-core.mjs index", diff --git a/apps/website/qa/queen-embed-address-contract.mjs b/apps/website/qa/queen-embed-address-contract.mjs new file mode 100644 index 0000000000..3d7b9671ac --- /dev/null +++ b/apps/website/qa/queen-embed-address-contract.mjs @@ -0,0 +1,318 @@ +// Does the Queen's address name the card each embedded Explorer shows? +// +// Seven Queen tabs frame an Explorer: SPECS, SKILLS, CRONS, AGENTS, FUNCTIONS, TOOLS +// and PROJECT (the system docs). Measured on t27.ai before lib/queenEmbed: a pick +// inside a frame changed only the frame's own hash, so a reload, a shared link or the +// language toggle opened the default card; #/queen?tab=skills&skill=... opened the +// default skill; and the ladder link Skills inside the agents frame put the Skill +// Explorer under a rail and an address that still said AGENTS. +// +// This opens the built page in real Chrome and checks, against the live DOM of the +// frame and the Queen: a deep link opens the named card in every tab; a pick writes +// the address without a history entry and survives a reload; an outside hash change +// and Back move the frame; the language toggle keeps the card and writes ?lang=; a +// link to another Explorer switches the Queen's tab; an address without a card takes +// the frame's; a refused id falls back to the default; an unknown chapter is corrected +// to the chapter on show, while an unknown skill keeps the Explorer's own not-found +// card. Every step starts from a state that differs from what it asserts, so no check +// passes because the frame already showed the thing. +// +// npm run check:queen-embed build, then check +// npm run check:queen-embed -- --no-build reuse dist/ +// node qa/queen-embed-address-contract.mjs --origin=http://127.0.0.1:8000 +// check a build served elsewhere +// +// Exit 0: every check passed. 1: a check failed. 2: the check could not run (no +// Chrome, no page) -- never read that as a pass. The harness is the other Queen +// contracts': dist over node:http, the installed Chrome with --headless=new, CDP over +// Node's WebSocket, and a deadline on every evaluate so a busy renderer cannot hang it. +import { execSync, spawn } from 'node:child_process'; +import { createServer } from 'node:http'; +import { readFileSync, existsSync, mkdtempSync, rmSync } from 'node:fs'; +import { join, extname, normalize } from 'node:path'; +import { tmpdir } from 'node:os'; + +const ROOT = new URL('..', import.meta.url).pathname; +const DIST = join(ROOT, 'dist'); +const ORIGIN_ARG = process.argv.find((a) => a.startsWith('--origin='))?.slice('--origin='.length).replace(/\/$/, ''); +const EVAL_TIMEOUT_MS = Number(process.env.EMBED_EVAL_TIMEOUT_MS || 60000); +const DEADLINE_MS = Number(process.env.EMBED_DEADLINE_MS || 45 * 60000); + +const CHROME = [ + process.env.CHROME_PATH, + '/Applications/Google Chrome.app/Contents/MacOS/Google Chrome', + '/Applications/Chromium.app/Contents/MacOS/Chromium', + '/usr/bin/google-chrome', '/usr/bin/chromium-browser', '/usr/bin/chromium', +].filter(Boolean).find((p) => existsSync(p)); +if (!CHROME) { console.log(' no Chrome found -- the embed address check could not run. Set CHROME_PATH.'); process.exit(2); } + +const checks = []; +const record = (name, ok, detail) => { checks.push({ name, ok: !!ok, detail }); console.log(` ${ok ? 'PASS' : 'FAIL'} ${name}`); }; +const report = (code, extra = {}) => { + const failed = checks.filter((c) => !c.ok); + for (const c of failed) console.log(`\n FAIL ${c.name}\n ${JSON.stringify(c.detail).slice(0, 1500)}`); + console.log(`\n Queen embed address contract: ${extra.couldNotRun ? `COULD NOT RUN (${extra.couldNotRun})` : failed.length ? `FAIL (${failed.length} of ${checks.length})` : `PASS (${checks.length} checks)`}`); + process.exit(code); +}; +const deadline = setTimeout(() => report(2, { couldNotRun: `deadline ${DEADLINE_MS / 60000} min` }), DEADLINE_MS); +const wait = (ms) => new Promise((r) => setTimeout(r, ms)); + +// ── The page: a served origin, or dist served the way Pages serves it ── +let origin = ORIGIN_ARG; +let server = null; +if (!origin) { + if (!process.argv.includes('--no-build')) { + console.log(' building…'); + execSync('npx vite build', { cwd: ROOT, stdio: ['ignore', 'ignore', 'inherit'] }); + } + if (!existsSync(join(DIST, 'index.html'))) { console.error(' dist/index.html missing -- nothing to open.'); process.exit(2); } + const MIME = { + '.html': 'text/html', '.js': 'text/javascript', '.mjs': 'text/javascript', '.css': 'text/css', '.json': 'application/json', + '.svg': 'image/svg+xml', '.png': 'image/png', '.jpg': 'image/jpeg', '.webp': 'image/webp', '.ico': 'image/x-icon', + '.wasm': 'application/wasm', '.woff2': 'font/woff2', '.t27': 'text/plain', '.md': 'text/markdown', + }; + server = createServer((req, res) => { + const path = normalize(decodeURIComponent(req.url.split('?')[0])).replace(/^(\.\.[/\\])+/, ''); + let file = join(DIST, path); + if (!file.startsWith(DIST) || !existsSync(file) || path === '/') file = join(DIST, 'index.html'); + try { res.writeHead(200, { 'Content-Type': MIME[extname(file)] || 'application/octet-stream' }); res.end(readFileSync(file)); } catch { res.writeHead(500); res.end(); } + }); + await new Promise((r) => server.listen(0, '127.0.0.1', r)); + origin = `http://127.0.0.1:${server.address().port}`; +} + +// ── Chrome over CDP ── +const profile = mkdtempSync(join(tmpdir(), 'queen-embed-')); +const chrome = spawn(CHROME, ['--headless=new', '--remote-debugging-port=0', `--user-data-dir=${profile}`, '--no-first-run', '--no-default-browser-check', + '--disable-extensions', '--window-size=1440,900', '--use-gl=angle', '--use-angle=swiftshader', '--enable-unsafe-swiftshader', 'about:blank'], { stdio: ['ignore', 'ignore', 'pipe'] }); +process.on('exit', () => { try { chrome.kill('SIGKILL'); } catch { /* gone */ } try { rmSync(profile, { recursive: true, force: true }); } catch { /* gone */ } server?.close(); }); + +let p; +try { + const wsUrl = await new Promise((resolve, reject) => { + const t = setTimeout(() => reject(new Error('Chrome never announced a debugging port')), 30000); + let buf = ''; + chrome.stderr.on('data', (d) => { buf += d; const m = buf.match(/DevTools listening on (ws:\/\/\S+)/); if (m) { clearTimeout(t); resolve(m[1]); } }); + }); + const ws = new WebSocket(wsUrl); + await new Promise((res, rej) => { ws.onopen = res; ws.onerror = () => rej(new Error('CDP socket refused')); }); + let id = 0; const pending = new Map(); const listeners = []; + ws.onmessage = (ev) => { const m = JSON.parse(ev.data); if (m.id && pending.has(m.id)) { const q = pending.get(m.id); pending.delete(m.id); if (m.error) q.reject(new Error(m.error.message)); else q.resolve(m.result); } else if (m.method) listeners.forEach((f) => f(m)); }; + const send = (method, params = {}, sessionId) => new Promise((resolve, reject) => { const i = ++id; pending.set(i, { resolve, reject }); ws.send(JSON.stringify({ id: i, method, params, ...(sessionId ? { sessionId } : {}) })); }); + const { targetId } = await send('Target.createTarget', { url: 'about:blank' }); + const { sessionId } = await send('Target.attachToTarget', { targetId, flatten: true }); + const call = (m, q) => send(m, q, sessionId); + const errors = []; + listeners.push((m) => { if (m.sessionId === sessionId && m.method === 'Runtime.exceptionThrown') { const d = m.params.exceptionDetails; errors.push((d.exception?.description ?? d.text).split('\n').slice(0, 3).join(' | ')); } }); + await call('Runtime.enable'); await call('Page.enable'); + const evaluate = async (expr) => { + const r = await Promise.race([ + call('Runtime.evaluate', { expression: expr, awaitPromise: true, returnByValue: true }), + new Promise((_, rej) => setTimeout(() => rej(new Error(`evaluate timed out after ${EVAL_TIMEOUT_MS} ms`)), EVAL_TIMEOUT_MS)), + ]); + if (r.exceptionDetails) throw new Error(r.exceptionDetails.exception?.description || r.exceptionDetails.text); + return r.result.value; + }; + const until = async (expr, ms) => { const start = Date.now(); while (Date.now() - start < ms) { try { const v = await evaluate(expr); if (v) return v; } catch { /* the page is between documents */ } await wait(300); } return null; }; + const onLoad = () => new Promise((r) => { const t = setTimeout(r, 45000); listeners.push((m) => { if (m.sessionId === sessionId && m.method === 'Page.loadEventFired') { clearTimeout(t); r(); } }); }); + const load = async (url) => { const loaded = onLoad(); await call('Page.navigate', { url }); await loaded; }; + const reload = async () => { const loaded = onLoad(); await call('Page.reload', {}); await loaded; }; + const clickAt = async (x, y) => { + await call('Input.dispatchMouseEvent', { type: 'mousePressed', x, y, button: 'left', clickCount: 1 }); + await call('Input.dispatchMouseEvent', { type: 'mouseReleased', x, y, button: 'left', clickCount: 1 }); + }; + p = { evaluate, until, load, reload, clickAt, errors }; +} catch (e) { + report(2, { couldNotRun: String(e?.message || e) }); +} + +const KEY = { skills: 'skill', crons: 'cron', agents: 'agent', functions: 'function', tools: 'tool', specs: 'spec', project: 'chapter' }; +const TITLE = { skills: 'Skill Explorer', crons: 'Cron Explorer', agents: 'Agent Explorer', functions: 'Function Explorer', tools: 'Tool Explorer', specs: 'Spec Explorer', project: 'System documentation' }; +const nonce = String(process.pid); + +const TOP = `(() => ({ hash: location.hash, search: location.search, params: Object.fromEntries(new URLSearchParams(location.hash.split('?')[1] || '')), + view: document.querySelector('main[data-view]')?.getAttribute('data-view') ?? null, active: document.querySelector('button.queen27-hud-cmd.is-active')?.dataset.view ?? null, + jump: document.querySelector('.queen27-docs-jump.is-active')?.textContent ?? null, histLen: history.length, frames: document.querySelectorAll('iframe.queen27-specs-frame').length, lang: document.documentElement.lang }))()`; +// The frame as it is on screen: its route, the item marked current, the docs heading. +const FRAME = `(() => { const f = document.querySelector('iframe.queen27-specs-frame'); if (!f) return null; let w, d; try { w = f.contentWindow; d = w && w.document; if (!d || !d.body) return null; } catch { return null } + const h = w.location.hash; const r = /^#\\/([a-z]+)(?:\\/([^?#]*))?/.exec(h) || []; + return { title: f.getAttribute('title'), hash: h, route: r[1] ?? null, stem: r[2] ?? null, params: Object.fromEntries(new URLSearchParams(h.split('?')[1] || '')), lang: d.documentElement.lang, + current: [...d.querySelectorAll('[aria-current="true"]')].map((e) => e.getAttribute('aria-label') || '').filter(Boolean), + h1: d.querySelector('h1')?.textContent.trim().slice(0, 80) ?? null, notFound: /missing or ambiguous/.test(d.body.innerText || '') } })()`; + +/** + * Does the frame show `id` of `kind`? The frame's own address (each Explorer writes it + * when it opens a card) and the item it marks current; where that item's label carries + * the id the label must name it -- a skill's ends with it, a spec's reads + * "module — path, N lines, health", an agent's starts with the letter -- and the docs + * heading must carry the chapter's number. The cron, function and tool labels end with + * a schedule, a trigger or a source instead, so there the address and a marked item + * are the evidence. + */ +const SHOWS = `(f, kind, id, KEY, chapterOrder) => { + if (!f) return false; + if (kind === 'project') return f.route === 'docs' && (f.stem || 'project') === id && new RegExp('^(Chapter|Глава) ' + chapterOrder[id] + '(?!\\\\d)').test(f.h1 || ''); + if (f.route !== kind || f.params[KEY[kind]] !== id) return false; + if (kind === 'agents') return f.current.some((l) => l.startsWith(id + ' ·')); + if (kind === 'skills') return f.current.some((l) => l.endsWith(' — ' + id)); + if (kind === 'specs') return f.current.some((l) => l.includes(' — ' + id + ',')); + return f.current.length > 0; +}`; + +const top = () => p.evaluate(TOP); +const frame = () => p.evaluate(FRAME); +let chapterOrder = {}; +const showsExpr = (kind, id) => `(${SHOWS})(${FRAME}, ${JSON.stringify(kind)}, ${JSON.stringify(id)}, ${JSON.stringify(KEY)}, ${JSON.stringify(chapterOrder)})`; +const waitShows = async (kind, id, ms = 120000) => !!(await p.until(showsExpr(kind, id), ms)); +const nowShows = async (kind, id) => { try { return !!(await p.evaluate(showsExpr(kind, id))); } catch { return false; } }; +const shell = async (url) => { await p.load(url); return !!(await p.until(`document.querySelectorAll('button.queen27-hud-cmd[data-view]').length > 0 && !!document.querySelector('main[data-view]')`, 150000)); }; +const frameBox = (selector, pick = 'els[0]') => p.evaluate(`(() => { const f = document.querySelector('iframe.queen27-specs-frame'); const d = f.contentDocument; const els = [...d.querySelectorAll(${JSON.stringify(selector)})].filter((e) => e.getBoundingClientRect().width > 0); const e = ${pick}; if (!e) return null; e.scrollIntoView({ block: 'center' }); const fr = f.getBoundingClientRect(); const r = e.getBoundingClientRect(); return { x: fr.left + r.left + Math.min(30, r.width / 2), y: fr.top + r.top + r.height / 2, href: e.getAttribute('href'), label: e.getAttribute('aria-label') || e.textContent.trim().slice(0, 60) } })()`); +const url = (tag, hash, lang = 'en') => `${origin}/?lang=${lang}&n=${nonce}${tag}#/queen?${hash}`; + +try { + // ── Ids, from the catalogs this build serves ── + if (!(await shell(url('0', 'tab=map')))) report(2, { couldNotRun: 'the Queen shell never rendered' }); + const ids = await p.evaluate(`Promise.all(['skills/manifest.json', 'crons/manifest.json', 'agents/spec-agents.json', 'functions/spec-functions.json', 'tools/spec-tools.json', 't27/manifest.json', 'docs/system-docs.json'].map((u) => fetch(u).then((r) => r.json()))).then(([s, c, a, f, t, m, d]) => { + const skillIds = s.skills.map((x) => x.id); + const holder = a.agents.find((x) => x.letter !== a.agents[0].letter && (x.skills || []).some((k) => k.ok && k.id !== s.featured)); + return { + skillIds, chapters: Object.fromEntries(d.chapters.map((ch) => [ch.stem, ch.order])), + defaults: { agents: a.agents[0].letter, specs: 'specs/demos/hello_world.t27', project: d.chapters[0].stem }, + other: { skills: skillIds.find((x) => x !== s.featured), crons: c.crons.map((x) => x.id).find((x) => x !== c.featured), agents: a.agents[1].letter, functions: f.functions[1].id, tools: t.tools[1].id, + specs: m.specs.some((x) => x.path === 'specs/tri/agent/agents.t27') ? 'specs/tri/agent/agents.t27' : m.specs.find((x) => !x.featured && x.path !== 'specs/demos/hello_world.t27').path, project: d.chapters[1].stem }, + chip: holder ? { agent: holder.letter, skill: holder.skills.find((k) => k.ok && k.id !== s.featured).id } : null, + } })`); + chapterOrder = ids.chapters; + + // A. A deep link opens the named card in every embedded Explorer. + for (const kind of Object.keys(KEY)) { + const id = ids.other[kind]; + const shown = (await shell(url(`a${kind}`, `tab=${kind}&${KEY[kind]}=${encodeURIComponent(id)}`))) && (await waitShows(kind, id)); + const t = await top(); + record(`A a deep link opens ${kind} ${id}`, shown && t.view === kind && t.params[KEY[kind]] === id, { top: t, frame: await frame() }); + } + + // B. A pick inside the frame writes the Queen address (replace), and a reload keeps it. + await shell(url('b', 'tab=skills')); + await p.until(`(() => { const f = ${FRAME}; return f && f.route === 'skills' && f.current.length > 0 })()`, 120000); await wait(1500); + const before = await top(); + const box = await frameBox('button[aria-label]', `els.filter((b) => b.getAttribute('aria-current') !== 'true' && ${JSON.stringify(ids.skillIds)}.some((s) => s !== ${JSON.stringify(ids.other.skills)} && b.getAttribute('aria-label').endsWith(' — ' + s)))[3]`); + const clicked = box ? box.label.split(' — ').pop() : null; + const wasShown = clicked ? await nowShows('skills', clicked) : true; + if (box) await p.clickAt(box.x, box.y); + const picked = clicked && (await waitShows('skills', clicked, 60000)) && (await p.until(`(${TOP}).params.skill === ${JSON.stringify(clicked)}`, 20000)); + const after = await top(); + record('B a pick inside the skills frame writes skill= to the Queen address without a history entry', !!picked && !wasShown && after.params.tab === 'skills' && after.histLen === before.histLen, { clicked, before, after, frame: await frame() }); + await p.reload(); await p.until(`!!document.querySelector('main[data-view]')`, 150000); + record('B a reload keeps the picked skill', !!clicked && (await waitShows('skills', clicked)) && (await top()).params.skill === clicked, { clicked, top: await top(), frame: await frame() }); + + // C. An address changed from outside moves the frame, and Back moves it back. + const target = ids.other.skills; + const targetWasShown = await nowShows('skills', target); + await p.evaluate(`void (location.hash = ${JSON.stringify(`#/queen?tab=skills&skill=${encodeURIComponent(target)}`)})`); + record('C an outside hash change moves the skills frame', !targetWasShown && (await waitShows('skills', target, 60000)), { target, top: await top(), frame: await frame() }); + await p.evaluate('void history.back()'); + const back = !!clicked && (await waitShows('skills', clicked, 60000)); + record('C Back returns the Queen address and the frame to the earlier skill', back && (await top()).params.skill === clicked, { clicked, top: await top(), frame: await frame() }); + + // D. The HUD language toggle keeps the card, and the address names the new language. + const f0 = await frame(); + await p.evaluate(`void document.querySelector('button[data-tool="lang"]').click()`); + const relang = await p.until(`(() => { const f = ${FRAME}; return f && f.lang === 'ru' && f.current.length > 0 })()`, 120000); await wait(1500); + const tD = await top(); + record('D the language toggle keeps the picked skill in the frame and the address', !!relang && f0?.lang === 'en' && (await nowShows('skills', clicked)) && tD.params.skill === clicked, { clicked, before: f0, after: await frame(), top: tD }); + const searchLang = new URLSearchParams(tD.search).get('lang'); + await p.reload(); await p.until(`!!document.querySelector('main[data-view]')`, 150000); await wait(2000); + const tD2 = await top(); + record('D the language toggle writes ?lang= to the address, and a reload keeps the language', searchLang === 'ru' && tD.lang === 'ru' && tD2.lang === 'ru', { searchAfterToggle: tD.search, langAfterToggle: tD.lang, afterReload: { search: tD2.search, lang: tD2.lang } }); + + // E. A ladder link inside the agents frame switches the Queen tab. + await shell(url('e', 'tab=agents')); + await p.until(`(() => { const f = ${FRAME}; return f && f.route === 'agents' && f.current.length > 0 && !!document.querySelector('iframe.queen27-specs-frame').contentDocument.querySelector('.spec-x-ladder a[href^="#/skills"]') })()`, 120000); await wait(1000); + const beforeE = await top(); + const ladder = await frameBox('.spec-x-ladder a[href^="#/skills"]'); + if (ladder) await p.clickAt(ladder.x, ladder.y); + await p.until(`(() => { const t = ${TOP}; const f = ${FRAME}; return t.view === 'skills' && f && f.route === 'skills' && f.current.length > 0 })()`, 90000); await wait(1500); + const tE = await top(), fE = await frame(); + record('E the ladder link Skills in the agents frame switches the Queen to SKILLS (rail, address, title, frame agree)', !!ladder && beforeE.view === 'agents' && tE.params.tab === 'skills' && tE.view === 'skills' && tE.active === 'skills' && fE?.title === TITLE.skills && fE?.route === 'skills' && tE.frames === 1, { ladder, before: beforeE, top: tE, frame: fE }); + + // F. A skill chip inside an agent card opens that skill in the SKILLS tab. + const chip = ids.chip; + const onAgent = !!chip && (await shell(url('f', `tab=agents&agent=${chip.agent}`))) && (await waitShows('agents', chip.agent)); + const chipBox = onAgent ? await frameBox(`a[href*="#/skills?skill=${encodeURIComponent(chip.skill)}"]`) : null; + if (chipBox) await p.clickAt(chipBox.x, chipBox.y); + const opened = !!chipBox && (await waitShows('skills', chip.skill, 90000)); + const tF = await top(); + record('F a skill chip in an agent card opens that skill in the SKILLS tab and names it in the address', opened && tF.params.tab === 'skills' && tF.params.skill === chip.skill && tF.active === 'skills', { chip, onAgent, chipBox, top: tF, frame: await frame() }); + + // G. A PROJECT chapter jump is in the address and survives a reload. + await shell(url('g', 'tab=project')); + await waitShows('project', ids.defaults.project); await wait(1000); + const rulesWasShown = await nowShows('project', 'rules'); + await p.evaluate(`[...document.querySelectorAll('button.queen27-docs-jump')].find((b) => /Rules/.test(b.textContent)).click()`); + const jumped = await waitShows('project', 'rules', 60000); + record('G a PROJECT jump writes chapter= to the address', !rulesWasShown && jumped && (await top()).params.chapter === 'rules', { top: await top(), frame: await frame() }); + await p.reload(); await p.until(`!!document.querySelector('main[data-view]')`, 150000); + const kept = await waitShows('project', 'rules'); + const tG = await top(); + record('G a reload keeps the chapter and its jump', kept && /Rules/.test(tG.jump || ''), { top: tG, frame: await frame() }); + + // H. The Spec Explorer frame follows an outside address change. + const onOther = (await shell(url('h', `tab=specs&spec=${encodeURIComponent(ids.other.specs)}`))) && (await waitShows('specs', ids.other.specs, 150000)); + await p.evaluate(`void (location.hash = ${JSON.stringify(`#/queen?tab=specs&spec=${encodeURIComponent(ids.defaults.specs)}`)})`); + const moved = await waitShows('specs', ids.defaults.specs, 90000); + record('H an outside hash change moves the specs frame', onOther && moved, { from: ids.other.specs, to: ids.defaults.specs, top: await top(), frame: await frame() }); + + // I. A refused id falls back to the default, the address takes the default, and a valid id then opens. + const errorsBefore = p.errors.length; + await shell(url('i', 'tab=agents&agent=%3Cx%3E')); + const fellBack = await waitShows('agents', ids.defaults.agents); + const rewritten = await p.until(`(${TOP}).params.agent === ${JSON.stringify(ids.defaults.agents)}`, 30000); + await p.evaluate(`void (location.hash = ${JSON.stringify(`#/queen?tab=agents&agent=${ids.other.agents}`)})`); + const validOpens = await waitShows('agents', ids.other.agents, 60000); + record('I a refused agent id falls back to the default in the frame and the address, without an exception, and a valid one then opens', fellBack && !!rewritten && validOpens && p.errors.length === errorsBefore, { errors: p.errors.slice(errorsBefore), top: await top(), frame: await frame() }); + + // K. An address that names no card of its tab takes the frame's card, so a reload opens what was on screen. + const onCron = (await shell(url('k', `tab=crons&cron=${encodeURIComponent(ids.other.crons)}`))) && (await waitShows('crons', ids.other.crons)); + await p.evaluate(`void (location.hash = '#/queen?tab=crons')`); + const tookCard = await p.until(`(${TOP}).params.cron === ${JSON.stringify(ids.other.crons)}`, 30000); + const stillShown = await nowShows('crons', ids.other.crons); + await p.reload(); await p.until(`!!document.querySelector('main[data-view]')`, 150000); + const afterReload = await waitShows('crons', ids.other.crons); + record('K an outside change to the bare tab keeps the address and the frame on one card, and a reload opens it', onCron && !!tookCard && stillShown && afterReload, { cron: ids.other.crons, top: await top(), frame: await frame() }); + + // L. Ids the helpers accept but the catalogs do not hold. + await shell(url('l1', 'tab=project&chapter=zz-no-such-chapter')); + const firstChapter = await waitShows('project', ids.defaults.project); + const chapterCorrected = await p.until(`(${TOP}).params.chapter === ${JSON.stringify(ids.defaults.project)}`, 30000); + record('L an unknown chapter opens the first one, and the address names the chapter on show', firstChapter && !!chapterCorrected, { top: await top(), frame: await frame() }); + const errorsL = p.errors.length; + await shell(url('l2', 'tab=skills&skill=t27%2Fzz-no-such-skill')); + const notFound = await p.until(`(() => { const f = ${FRAME}; return f && f.route === 'skills' && f.params.skill === 't27/zz-no-such-skill' && f.notFound && f.current.length === 0 })()`, 120000); + await wait(3000); + const tL = await top(); + record('L an unknown skill shows the Skill Explorer\'s own not-found card, not a different skill, and the address keeps the id', !!notFound && tL.params.skill === 't27/zz-no-such-skill' && p.errors.length === errorsL, { top: tL, frame: await frame(), errors: p.errors.slice(errorsL) }); + + // J. Tab switches add no history entries and drop the old tab's card; Back after an + // outside navigation lands on the tab with its Explorer in the frame. + await shell(url('j', `tab=skills&skill=${encodeURIComponent(ids.other.skills)}`)); + await waitShows('skills', ids.other.skills); await wait(1000); + const h0 = (await top()).histLen; + for (const v of ['crons', 'agents']) { + await p.evaluate(`document.querySelector('button.queen27-hud-cmd[data-view="${v}"]').click()`); + await p.until(`(() => { const f = ${FRAME}; return f && f.route === '${v}' })()`, 120000); await wait(1000); + } + const tJ1 = await top(); + await p.evaluate(`void (location.hash = '#/queen?tab=map')`); await p.until(`(${TOP}).view === 'map'`, 30000); await wait(800); + await p.evaluate('void history.back()'); + await p.until(`(${TOP}).params.tab === 'agents'`, 30000); await p.until(`(() => { const f = ${FRAME}; return f && f.route === 'agents' })()`, 90000); await wait(1500); + const tJ = await top(), fJ = await frame(); + record('J tab switches add no history entries and drop the old card, and Back after an outside navigation returns to the tab and its Explorer', tJ1.histLen === h0 && tJ1.params.skill === undefined && tJ.params.tab === 'agents' && tJ.view === 'agents' && fJ?.route === 'agents' && fJ?.title === TITLE.agents, { h0, afterSwitches: tJ1, top: tJ, frame: fJ }); + + record('no uncaught exceptions', p.errors.length === 0, { errors: p.errors.slice(0, 8) }); +} catch (e) { + clearTimeout(deadline); + report(2, { couldNotRun: String(e?.message || e) }); +} +clearTimeout(deadline); +report(checks.some((c) => !c.ok) ? 1 : 0); diff --git a/apps/website/src/components/QueenAgents.tsx b/apps/website/src/components/QueenAgents.tsx index 8fbabd58c7..390625dcb7 100644 --- a/apps/website/src/components/QueenAgents.tsx +++ b/apps/website/src/components/QueenAgents.tsx @@ -14,14 +14,17 @@ import { useEffect, useRef, useState } from 'react' import { useI18n } from '../i18n/context' import { QueenLoading } from './QueenLoading' +import { useQueenExplorerFrame } from './useQueenExplorerFrame' import { loadAgentSpecs, loadCronSpecs, loadFunctionSpecs, loadSkillSpecs, loadToolSpecs } from '../lib/agentSpecs' -import { loadSystemDocs, systemDocsHash } from '../lib/systemDocs' +import { loadSystemDocs } from '../lib/systemDocs' +import type { ExplorerTab } from '../lib/queenEmbed' export type AgentsKind = 'skills' | 'crons' | 'agents' | 'functions' | 'tools' | 'project' -// PROJECT frames #/docs?embed=1. The quick jumps above the frame rewrite the -// frame's hash to a chapter; the page inside follows hashchange, so a jump is a -// chapter switch, not a reload. Chapter stems are those of specs/docs/chapters. +// PROJECT frames #/docs?embed=1. A quick jump above the frame is a chapter written +// to the Queen address (chapter=), like a pick inside the frame; the frame's hash +// follows, and the page inside answers hashchange, so a jump is a chapter switch, +// not a reload. Chapter stems are those of specs/docs/chapters. export const PROJECT_JUMPS: readonly { stem: string; en: string; ru: string }[] = [ { stem: 'project', en: 'Project', ru: 'Проект' }, { stem: 'rules', en: 'Rules of the game', ru: 'Правила игры' }, @@ -136,28 +139,14 @@ export function QueenAgentsDirective({ kind, c, collapsible = false }: { kind: A ) } -export function QueenAgents({ kind, c, showDirective = true }: { kind: AgentsKind; c: AgentsCopy; showDirective?: boolean }) { +export function QueenAgents({ kind, c, showDirective = true, onNavigate }: { kind: AgentsKind; c: AgentsCopy; showDirective?: boolean; onNavigate: (tab: ExplorerTab, card: string | null) => void }) { const { lang } = useI18n() const [ready, setReady] = useState(false) - const [jump, setJump] = useState(PROJECT_JUMPS[0].stem) + // The card in the frame is the card in the Queen address: skill=, cron=, agent=, + // function=, tool= or chapter= (lib/queenEmbed). PROJECT opens on the first chapter. 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. - // 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 */ } - } - } + const frame = useQueenExplorerFrame(kind, onNavigate, frameRef) + const jump = frame.card ?? PROJECT_JUMPS[0].stem return (
@@ -171,7 +160,7 @@ export function QueenAgents({ kind, c, showDirective = true }: { kind: AgentsKin key={j.stem} className={`queen27-docs-jump${jump === j.stem ? ' is-active' : ''}`} aria-pressed={jump === j.stem} - onClick={() => jumpTo(j.stem)} + onClick={() => frame.show(j.stem)} > {lang === 'ru' ? j.ru : j.en} @@ -186,11 +175,13 @@ export function QueenAgents({ kind, c, showDirective = true }: { kind: AgentsKin
)}