Why
t27.ai publishes two agent catalogs — Claude Code skills (26) and scheduled jobs (33, on GitHub Actions, Inngest, Railway and in-process timers) — and until now both were generated only from code scans: SKILL.md frontmatter, workflow YAML, setInterval sites. Nothing in the spec corpus stated them. That inverts the rule the rest of the project runs on: the spec is the source of truth and the code is its witness.
This issue tracks giving skills and crons first-class .t27 specs under specs/skills/ and specs/crons/, with the site (gHashTag/trinity) generating public/skills/spec-skills.json and public/crons/spec-crons.json from a vendored copy of those files through the compiler wasm at build time — no regex over .t27.
Schema
Every constant is pub const; full tables in specs/skills/README.md and specs/crons/README.md.
- skill (
module skill_<file>): KIND="skill", ID (<repo>/<dir>, equal to the code-manifest id), NAME, REPO, SOURCE, SUMMARY_EN, COMMAND, SPECS: [N]str, TAGS: [N]str, ENABLED: bool, TIMEOUT_MIN: u16.
- cron (
module cron_<file>): KIND="cron", ID (<host>/<repo>/<slug>), NAME, HOST (github-actions | inngest | railway-cron | timer), REPO, SERVICE, SUMMARY_EN, SCHEDULE or INTERVAL_MS: u32 (never both), SCHEDULE_NOTE?, TZ, RUNS: [N]str (skill ids), RUNS_NOTE, ENABLED: bool, ON_FAILURE, CONTROL, NOTE?.
- Empty lists are
[0]str = [] (the wasm accepts this form).
- Language: specs are English-only (LANG-EN,
bootstrap/build.rs). There is no SUMMARY_RU; the Russian line shown on the site is a site-side translation (apps/website/scripts/agents-i18n.ru.json) merged as summary.ru with ruSource: "site-annotation", never as spec text.
Rules the site generator enforces: duplicate ID → build fails; a RUNS id with no skill spec → health: "fail"; an ID absent from the code manifest → witness: "spec-only"; code with no spec → listed as code-only, never invented; Cyrillic in a spec → build fails; a translation key with no matching spec ID → build fails.
Witness / boundary
- 59/59 typecheck ok under the vendored wasm (sha256
4d9c0447b5ca288790ab03d3dffc2dda629ed47af9d6731a105fc923aea0aee4), nothing discarded. That typecheck.ok is lenient (true for str = 5), so the schema check in the generator is the real gate.
- The bootstrap compiler on
master has not been run against these files yet; CI on the PR is the first run.
- Every
RUNS is [] with a RUNS_NOTE; no cron→skill edge is asserted.
Links
Why
t27.ai publishes two agent catalogs — Claude Code skills (26) and scheduled jobs (33, on GitHub Actions, Inngest, Railway and in-process timers) — and until now both were generated only from code scans:
SKILL.mdfrontmatter, workflow YAML,setIntervalsites. Nothing in the spec corpus stated them. That inverts the rule the rest of the project runs on: the spec is the source of truth and the code is its witness.This issue tracks giving skills and crons first-class
.t27specs underspecs/skills/andspecs/crons/, with the site (gHashTag/trinity) generatingpublic/skills/spec-skills.jsonandpublic/crons/spec-crons.jsonfrom a vendored copy of those files through the compiler wasm at build time — no regex over.t27.Schema
Every constant is
pub const; full tables inspecs/skills/README.mdandspecs/crons/README.md.module skill_<file>):KIND="skill",ID(<repo>/<dir>, equal to the code-manifest id),NAME,REPO,SOURCE,SUMMARY_EN,COMMAND,SPECS: [N]str,TAGS: [N]str,ENABLED: bool,TIMEOUT_MIN: u16.module cron_<file>):KIND="cron",ID(<host>/<repo>/<slug>),NAME,HOST(github-actions | inngest | railway-cron | timer),REPO,SERVICE,SUMMARY_EN,SCHEDULEorINTERVAL_MS: u32(never both),SCHEDULE_NOTE?,TZ,RUNS: [N]str(skill ids),RUNS_NOTE,ENABLED: bool,ON_FAILURE,CONTROL,NOTE?.[0]str = [](the wasm accepts this form).bootstrap/build.rs). There is noSUMMARY_RU; the Russian line shown on the site is a site-side translation (apps/website/scripts/agents-i18n.ru.json) merged assummary.ruwithruSource: "site-annotation", never as spec text.Rules the site generator enforces: duplicate
ID→ build fails; aRUNSid with no skill spec →health: "fail"; anIDabsent from the code manifest →witness: "spec-only"; code with no spec → listed ascode-only, never invented; Cyrillic in a spec → build fails; a translation key with no matching spec ID → build fails.Witness / boundary
4d9c0447b5ca288790ab03d3dffc2dda629ed47af9d6731a105fc923aea0aee4), nothing discarded. Thattypecheck.okis lenient (true forstr = 5), so the schema check in the generator is the real gate.masterhas not been run against these files yet; CI on the PR is the first run.RUNSis[]with aRUNS_NOTE; no cron→skill edge is asserted.Links