Skip to content

specs: the Queen holds the scheduler -- crons and skills as one Inngest app, tool mcp/inngest-dev - #3595

Merged
gHashTag merged 2 commits into
masterfrom
feat/inngest-queen-scheduler
Sep 13, 2026
Merged

gHashTag merged 2 commits into
masterfrom
feat/inngest-queen-scheduler

Conversation

@gHashTag

Copy link
Copy Markdown
Owner

The Queen holds the scheduler

https://t27.ai/#/queen catalogues 33 crons and 26 skills, but nothing the Queen holds can start, list, rerun or cancel them. This PR puts the scheduler into the Queen's hands as specs (the code follows in gHashTag/BrowserOS):

  • specs/automation/inngest-queen-scheduler.t27 — one Inngest app t27-queen served by trios/agent-server at /api/inngest against the self-hosted Inngest of Railway project 999. One function per card: cron-<slug> / skill-<slug>; cron/<ID>.tick and skill/<ID>.run events; RUNS_FANOUT. Dispatch derived from HOST, never from a name: github-actionsworkflow-dispatch (ref = default branch as the API reports it); inngest/timer/railway-crontick-only (no double fire for the six 999 functions; the 14 timers have no remote handle). Skill = queen-issue ([skill] <ID>, Success Criteria + Boundary, reuse open same title). THE MOVE is ordered: fire seen → PR removes schedule:CONTROL = "inngest". No CONTROL field changes here.
  • specs/tools/mcp/inngest-dev.t27 — the tool card, written from the live tools/list of the server (20 tools, 4 marked deprecated by the server itself), TRANSPORT = "http", ENV = ["INNGEST_SIGNING_KEY"]. Measured 2026-09-13 without the key: health, get_apps, list_runsREST API v2 returned HTTP 401; list_docs, grep_docs answer.
  • specs/agents/t.t27 — Tau (Queen) TOOLS gains mcp/inngest-dev; binding source is the scheduler spec's OWNER = "T".
  • specs/tools/catalog.t27 — legacy table 63 rows, LEGACY_COUNT = 63, MCP_CARDS = 11; README paragraph updated.

Evidence

  • Bootstrap t27c v0.2.0 (this checkout): the changed files parse, typecheck 0 errors, parse-complete consumes all tokens, ASCII only.
  • trinity generator at schema 2 (on top of website: tools catalog at schema 2 with the Trinity tri cards (S06 companion of t27#3592) trinity#991): tools 92 specs (mcp 11 servers, 255 tools), agents … with tools 5, i18n … tools 92/92 with the Russian row (trinity PR follows).
  • tools/check_now_entry_shape.py OK; tools/published_figures.py --check exit 0.
  • tools/trinity_tools_registry.py check: one finding, catalog MCP_CARDS is 11, the inventory measures 10tools_inventory.json is deliberately left at its 2026-09-12 measurement because inventory on this host reads the pinned consumer as table 0 and would replace a measured file with 54 findings. Recorded in docs/now.

Not claimed

No function has synced or fired yet; 3 of the 12 GHA workflows (999 ci/security, t27 formal-mutation) lack workflow_dispatch and would answer 422 until a PR adds it.

Closes #3594

…st app, tool mcp/inngest-dev, Tau TOOLS

specs/automation/inngest-queen-scheduler.t27 states the app t27-queen (served by
trios/agent-server at /api/inngest): one function per cron/skill card, dispatch
derived from HOST (workflow-dispatch | tick-only), skills as queen-issue, THE MOVE
order (fire seen -> schedule: removed -> CONTROL = inngest). specs/tools/mcp/inngest-dev.t27
is the tool card from the live tools/list (20 tools). specs/agents/t.t27 TOOLS gains it;
catalog.t27 legacy table 63, MCP_CARDS 11. Bootstrap t27c: parse, typecheck, parse-complete ok.

Closes #3594
@github-actions

Copy link
Copy Markdown
Contributor

📓 NotebookLM Notebook linked to this PR

This notebook contains session context, decisions, and artifacts for this work.

@github-actions

Copy link
Copy Markdown
Contributor

PR Dashboard

Generated at: 2026-09-13 03:51:53 UTC

Summary

Status Count
Total Open PRs 16
PRs with Failing Checks 10
PRs with All Checks Green 6
READY 5
FAILING 10
PENDING 0
NO CHECKS YET 0

These columns do not partition: 5 + 10 + 0 + 0 = 15, and there are 16 open PRs. A PR is being counted twice or not at all.

Seal Status

  • ⚠️ STALE -- sha256(compiler.rs)=d4c5b22b471e != manifest seal=87e5cbd3ad94.
    The committed NMSE numbers were certified against an older compiler.rs.
    Run scripts/reseal-check.sh locally for the two-step reseal command (advisory; not a merge gate).

…c seal --save)

The four gen_hash_* of tools_ToolsCatalog.json described the 62-row catalog;
coverage and spec-guards said so. Resealed with t27c v0.2.0; verify: all
hashes MATCH; check_seal_currency: STALE 0; check_seal_coverage: OK.

Closes #3594
@github-actions

Copy link
Copy Markdown
Contributor

📓 NotebookLM Notebook linked to this PR

This notebook contains session context, decisions, and artifacts for this work.

@github-actions

Copy link
Copy Markdown
Contributor

PR Dashboard

Generated at: 2026-09-13 04:10:47 UTC

Summary

Status Count
Total Open PRs 16
PRs with Failing Checks 10
PRs with All Checks Green 6
READY 5
FAILING 10
PENDING 0
NO CHECKS YET 0

These columns do not partition: 5 + 10 + 0 + 0 = 15, and there are 16 open PRs. A PR is being counted twice or not at all.

Seal Status

  • ⚠️ STALE -- sha256(compiler.rs)=d4c5b22b471e != manifest seal=87e5cbd3ad94.
    The committed NMSE numbers were certified against an older compiler.rs.
    Run scripts/reseal-check.sh locally for the two-step reseal command (advisory; not a merge gate).

@gHashTag
gHashTag merged commit f097c22 into master Sep 13, 2026
29 of 30 checks passed
@gHashTag
gHashTag deleted the feat/inngest-queen-scheduler branch September 13, 2026 05:06
gHashTag pushed a commit to gHashTag/BrowserOS that referenced this pull request Sep 13, 2026
The Queen's scheduler, as the contract in gHashTag/t27#3595 describes it
(specs/automation/inngest-queen-scheduler.t27; tool specs/tools/mcp/inngest-dev.t27,
held by agent T). One Inngest function per card under specs/crons and
specs/skills, read at start-up with the real compiler (vendored
t27_compiler.wasm, sha256 in specs/PIN) and never with a regex.

- trios/agent-server/specs: 33 cron cards, 26 skill cards, the contract and
  the wasm, byte-identical to t27 @ 26294613; scripts/sync-t27-specs.sh
  refreshes them and rewrites the pin.
- apps/server/src/inngest: t27-consts (wasm), spec-catalog (schema, refuse a
  bad card and serve the rest), plan (pure derivation, every rule a constant
  of the contract), dispatch (workflow_dispatch on the API's default branch;
  one open "[skill] <ID>" issue per skill, reused), functions, route, index.
- /api/inngest served by inngest/hono (signature = auth, so outside the
  trusted-origin guard); GET /queen/scheduler is the read-only projection
  (functions, triggers, reasons, refused cards, WHICH env vars are set).
- Derivation, measured: 59 functions, 12 with a cron trigger (all HOST
  github-actions), 21 tick-only (inngest/timer/railway-cron keep their own
  schedule, no double fire), 26 skills, 0 refused, 0 dangling RUNS.
- The bee brief gains "The Queen's scheduler": the tool is the Queen's, a
  [skill] issue comes from skill/<ID>.run, WHEN is changed on the card, a bee
  sends no events and calls no Inngest MCP (no key on the machine).
- docs/queen-inngest.md: the app, the env, the three-step move.
- tests/api/queen-inngest.test.ts: 9 pass (catalog, refusal, plan, dispatch
  against a fake GitHub, routes; an unsigned invocation is refused).

Measured lenience of the wasm analyzer (`str = ;` and `str = 12` typecheck
ok) is recorded in the tests; the schema check is the gate here, t27c is the
judge upstream. Two pre-existing tsc errors in queen-tick.ts (lines 2116,
2121) are on the base branch and untouched.
gHashTag added a commit to gHashTag/BrowserOS that referenced this pull request Sep 13, 2026
…480)

* feat(queen): hold every cron and skill as one Inngest app, t27-queen

The Queen's scheduler, as the contract in gHashTag/t27#3595 describes it
(specs/automation/inngest-queen-scheduler.t27; tool specs/tools/mcp/inngest-dev.t27,
held by agent T). One Inngest function per card under specs/crons and
specs/skills, read at start-up with the real compiler (vendored
t27_compiler.wasm, sha256 in specs/PIN) and never with a regex.

- trios/agent-server/specs: 33 cron cards, 26 skill cards, the contract and
  the wasm, byte-identical to t27 @ 26294613; scripts/sync-t27-specs.sh
  refreshes them and rewrites the pin.
- apps/server/src/inngest: t27-consts (wasm), spec-catalog (schema, refuse a
  bad card and serve the rest), plan (pure derivation, every rule a constant
  of the contract), dispatch (workflow_dispatch on the API's default branch;
  one open "[skill] <ID>" issue per skill, reused), functions, route, index.
- /api/inngest served by inngest/hono (signature = auth, so outside the
  trusted-origin guard); GET /queen/scheduler is the read-only projection
  (functions, triggers, reasons, refused cards, WHICH env vars are set).
- Derivation, measured: 59 functions, 12 with a cron trigger (all HOST
  github-actions), 21 tick-only (inngest/timer/railway-cron keep their own
  schedule, no double fire), 26 skills, 0 refused, 0 dangling RUNS.
- The bee brief gains "The Queen's scheduler": the tool is the Queen's, a
  [skill] issue comes from skill/<ID>.run, WHEN is changed on the card, a bee
  sends no events and calls no Inngest MCP (no key on the machine).
- docs/queen-inngest.md: the app, the env, the three-step move.
- tests/api/queen-inngest.test.ts: 9 pass (catalog, refusal, plan, dispatch
  against a fake GitHub, routes; an unsigned invocation is refused).

Measured lenience of the wasm analyzer (`str = ;` and `str = 12` typecheck
ok) is recorded in the tests; the schema check is the gate here, t27c is the
judge upstream. Two pre-existing tsc errors in queen-tick.ts (lines 2116,
2121) are on the base branch and untouched.

* fix(queen): the route-guard gate did not know the scheduler, so it said so

CI (Tests / server-api) refused the branch: /api/inngest was an unguarded
mount and the pins said 40 mounts, 6 public-read, 18 under /queen. All three
were right to fail - a new mount with no guard is exactly what that gate is
for. This records why it is allowed:

- /api/inngest goes on the reasoned allowlist: Inngest signs every request
  with INNGEST_SIGNING_KEY and inngest/hono rejects the rest with 4xx before
  a function runs (queen-inngest.test.ts measures it); a trusted-origin check
  would only refuse Inngest, which sends no browser Origin.
- /queen/scheduler is the seventh public-read - an explicit
  publicReadCorsMiddleware() on a projection that names which env vars are
  set and never their values.
- Pins re-measured 2026-09-13: 42 mounts, 7 public-read, 19 /queen, seven
  exceptions without the allowlist. route-guard.test.ts 6 pass;
  tools/route-guard-audit.mjs: unguardedMounts 0.

Tests / server-tools fails on the base as well (Chrome: 'Hidden windows are
no longer supported', 3 tests) and is not touched here.

---------

Co-authored-by: gHashTag <oxicocicate35@gmail.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Queen scheduler: every cron and skill card as one Inngest app the Queen holds (tool mcp/inngest-dev)

1 participant