Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions apps/website/i18n/agents.ru.json
Original file line number Diff line number Diff line change
Expand Up @@ -402,6 +402,9 @@
"mcp/gitbutler": {
"SUMMARY": "Внешний MCP-сервер GitButler, запускаемый как `but mcp`; репозиторий лишь регистрирует его в .mcp.json."
},
"mcp/inngest-dev": {
"SUMMARY": "MCP-лицо самостоятельно размещённого сервера Inngest (проект Railway 999), который исполняет кроны и скиллы Королевы как функции приложения t27-queen; перечисляет приложения и функции, читает запуски и трассы, запускает, перезапускает и отменяет."
},
"mcp/needle": {
"SUMMARY": "MCP-сервер на Zig для AST-осознанного редактирования кода (needle): структурный поиск и замена, гейты качества, предпросмотр."
},
Expand Down
2 changes: 1 addition & 1 deletion apps/website/public/agents/spec-agents.json

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion apps/website/public/crons/spec-crons.json

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion apps/website/public/functions/spec-functions.json

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion apps/website/public/skills/spec-skills.json

Large diffs are not rendered by default.

4 changes: 2 additions & 2 deletions apps/website/public/t27/files/specs/agents/t.t27
Original file line number Diff line number Diff line change
Expand Up @@ -39,8 +39,8 @@ pub const SKILLS : [2]str = ["t27/phi-loop", "t27/tri-pipeline"];
pub const SKILLS_NOTE : str = ".claude/agents/trinity.md, Phase 2 PLAN: \"Identify required skills (phi-loop, tri-pipeline)\"; Phase 4 VERIFY: \"Run conformance tests via tri-pipeline\". specs/OWNERS.md lists skills/ and crons/ under T-Queen, which is catalog ownership, not a held skill.";
; Tool IDs (specs/tools) the agent holds. Bound only where a source line names the command
; for this letter; TOOLS_NOTE cites that line or says why the list is empty.
pub const TOOLS : [2]str = ["tri/gen", "tri/test"];
pub const TOOLS_NOTE : str = ".claude/agents/trinity.md:68 (5. Gen - Run tri gen) and :70 (7. Verify - Run tri test). No source binds tri loop or tri health to T.";
pub const TOOLS : [3]str = ["tri/gen", "tri/test", "mcp/inngest-dev"];
pub const TOOLS_NOTE : str = ".claude/agents/trinity.md:68 (5. Gen - Run tri gen) and :70 (7. Verify - Run tri test); specs/automation/inngest-queen-scheduler.t27 OWNER = \"T\" binds the scheduler mcp/inngest-dev to the Queen (specs/OWNERS.md: skills/ and crons/ under T-Queen). No source binds tri loop or tri health to T.";
; Where the agent logs episodes (AGENTS_ALPHABET.md: "Logs to .trinity/experience/").
pub const EXPERIENCE_LOG : str = ".trinity/experience/";
pub const ENABLED : bool = true;
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
// SPDX-License-Identifier: Apache-2.0
// specs/automation/inngest-queen-scheduler.t27 -- every cron and every skill card of this
// repository (specs/crons, specs/skills) held as one Inngest app that the Queen's runtime serves.
// Host: gHashTag/BrowserOS trios/agent-server apps/server/src/inngest/ (the app), mounted on the
// same Hono server that serves /queen/*; the Inngest server is the self-hosted `inngest`
// of Railway project 999 (private address INNGEST_BASE_URL), reachable to people and bees
// through the MCP face described by specs/tools/mcp/inngest-dev.t27.
// Nothing below is inferred from a file name: the host reads these cards with the compiler
// (t27_compiler.wasm, t27_analyze -> ConstDecl) and derives every function from declared fields.
// The cron cards keep their CONTROL field; it says "inngest" only after the step this spec
// calls THE MOVE has been done for that card and the function has been seen firing.
// phi^2 + 1/phi^2 = 3 | TRINITY

module automation::inngest_queen_scheduler {

pub const KIND : str = "automation";
pub const ID : str = "inngest-queen-scheduler";
pub const REPO : str = "BrowserOS";
pub const HOST_PATH : str = "trios/agent-server/apps/server/src/inngest";
pub const VERSION : u8 = 1;
// The agent letter that holds the scheduler (specs/agents/t.t27 TOOLS names mcp/inngest-dev).
pub const OWNER : str = "T";
pub const TOOL : str = "mcp/inngest-dev";

// The app as the Inngest server sees it.
pub const APP_ID : str = "t27-queen";
pub const SERVE_PATH : str = "/api/inngest";
pub const ENV : [4]str = ["INNGEST_BASE_URL", "INNGEST_EVENT_KEY", "INNGEST_SIGNING_KEY", "INNGEST_SERVE_HOST"];
// The GitHub token the host already carries for the Queen's reads; dispatch reuses it.
pub const TOKEN_ENV : str = "TRIOS_GITHUB_API_TOKEN";
pub const GITHUB_OWNER : str = "gHashTag";

// Which cards become functions. Both directories, every *.t27, ENABLED or not.
pub const SCOPE : [2]str = ["specs/crons", "specs/skills"];
// A card that does not typecheck, or lacks a required field, is refused: the app then serves
// the cards that pass and lists the refused ones; it never guesses a field.
pub const ON_BAD_CARD : str = "refuse-card-serve-rest";

// Function identity. slug(ID) = ID lower-cased with every run outside [a-z0-9] replaced by "-".
pub const CRON_FUNCTION_ID : str = "cron-<slug>";
pub const SKILL_FUNCTION_ID : str = "skill-<slug>";
// Every cron function also answers this event, so an operator can fire it by hand.
pub const CRON_TICK_EVENT : str = "cron/<ID>.tick";
// A skill function is event-only: nothing schedules a skill directly.
pub const SKILL_RUN_EVENT : str = "skill/<ID>.run";
// A cron whose RUNS names skill IDs sends one SKILL_RUN_EVENT per ID after its own dispatch.
pub const RUNS_FANOUT : bool = true;

// What a cron function does when it fires, by the card's HOST field.
// github-actions: POST /repos/<GITHUB_OWNER>/<REPO>/actions/workflows/<basename SERVICE>/dispatches
// with ref = the repository's default branch (read from the API, not assumed).
pub const DISPATCH_GITHUB_ACTIONS : str = "workflow-dispatch";
// inngest: the card is already a function of the 999-multibots-telegraf app; registering a second
// schedule would fire it twice, so this app registers the tick event only.
pub const DISPATCH_INNGEST : str = "tick-only";
// timer: a setInterval inside a 999 process with no remote handle; tick event only, no schedule.
pub const DISPATCH_TIMER : str = "tick-only";
// railway-cron: Railway owns the schedule; tick event only.
pub const DISPATCH_RAILWAY_CRON : str = "tick-only";
// A card with ENABLED = false or an empty SCHEDULE gets no cron trigger, only the tick event.
pub const DISABLED_CARD : str = "tick-only";
// SCHEDULE is a five-field cron expression evaluated in the card's TZ.
pub const SCHEDULE_FIELDS : u8 = 5;

// What a skill function does: one issue for the Queen's bees, never a shell command.
pub const SKILL_DISPATCH : str = "queen-issue";
pub const SKILL_ISSUE_REPO : str = "<GITHUB_OWNER>/<REPO of the card>";
pub const SKILL_ISSUE_TITLE : str = "[skill] <ID>";
pub const SKILL_ISSUE_LABEL : str = "queen-skill";
// The issue body carries the two sections the Queen's brief requires.
pub const SKILL_ISSUE_SECTIONS : [2]str = ["## Success Criteria", "## Boundary"];
// An open issue with the same title is reused, not duplicated; the run reports its number.
pub const SKILL_ISSUE_DEDUP : str = "reuse-open-same-title";

// THE MOVE, per github-actions card, in this order and never the reverse:
// 1. the function is synced and seen firing (list_function_runs);
// 2. a PR to the card's REPO removes the `schedule:` block of SERVICE and keeps workflow_dispatch;
// 3. the card's CONTROL becomes "inngest".
pub const MOVE_STEPS : u8 = 3;
pub const CONTROL_AFTER_MOVE : str = "inngest";
// Measured 2026-09-13 on the default branches: 9 of the 12 github-actions SERVICE files declare
// workflow_dispatch; 999 ci.yml, 999 security.yml and t27 formal-mutation.yml do not, so their
// dispatch answers 422 until a PR adds the trigger.
pub const WORKFLOWS_WITH_DISPATCH : u8 = 9;
pub const WORKFLOWS_TOTAL : u8 = 12;

// Not claimed: no function of this app has fired yet at VERSION 1; the count of synced
// functions is read from the server (list_functions), not written here.
pub const ENABLED : bool = true;
}
7 changes: 4 additions & 3 deletions apps/website/public/t27/files/specs/tools/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -101,9 +101,10 @@ Nothing in these files is typed by hand. Each file records where its text came f

Every card carries three fields beyond its family's: `REPO` (`gHashTag/t27` or
`gHashTag/trinity`), `QUALIFIED_ID` (`<owner>/<repo>:<family>/<name>`, unique across
repositories by construction) and `SCHEMA = 2`. The 62 cards written before schema 2 keep
their short `ID` (`tri/<command>`, `mcp/<server>`): the site route and the agents' `TOOLS`
arrays use it, and `QUALIFIED_ID = REPO:ID`. A card of the Trinity `tri` has
repositories by construction) and `SCHEMA = 2`. The 62 cards written before schema 2, and
`mcp/inngest-dev` (the Queen's scheduler, 2026-09-13, written with the same short form), keep
a short `ID` (`tri/<command>`, `mcp/<server>`): the site route and the agents' `TOOLS`
arrays use it, and `QUALIFIED_ID = REPO:ID`; `LEGACY_COUNT = 63` in `catalog.t27`. A card of the Trinity `tri` has
`ID = QUALIFIED_ID` and no short form, so a same-named command (`fpga`, `test` at the pin;
`COLLISIONS` in `catalog.t27`) can never be selected by the wrong repository.

Expand Down
Loading
Loading