feat(website): skills and crons as first-class .t27 specs; Queen modules SKILLS (7) and CRONS (8) - #975
Merged
Merged
Conversation
Each published agent skill and each scheduled job gets a .t27 module under specs/skills and specs/crons (vendored copy under public/t27/files, canonical home gHashTag/t27). The compiler wasm typechecks all 59 with nothing discarded; the field schema is checked by the generator that reads them.
…t27 specs scripts/agents-from-specs.mjs runs every spec through the vendored compiler wasm, checks the field schema (the wasm's typecheck.ok is necessary, not sufficient: it stays true for wrong annotations and out-of-range ints), joins the result with the code manifests and labels each entry spec+code, spec-only or code-only. Duplicate IDs fail the build; an unresolved RUNS id is health:'fail'. Wired into prebuild and prebuild:ci after skills-core index; node --test covers the schema gate and the joins; qa/agents-spec-contract.mjs (npm run check:agents) pins the catalogs to the specs and the Queen modules to HUD_VIEWS. Railway project/service ids join scripts/railway-services.json so 'run now' can resolve at build time.
Skill and Cron Explorer cards open on the spec: its bytes (highlighted through the compiler), sha256 verified in the browser, the compiler verdict, and the witness label. Crons link to the skills their RUNS name (⟲ N), skills to the jobs that run them (◷ N). The CONTROL strip reads ENABLED from the spec, links to the canonical edit on gHashTag/t27 and the vendored copy, and sends 'run now' to the host that owns the job — GitHub Actions workflow page, Railway service, Inngest dashboard — while a timer says it has no outside handle. VITE_AGENT_CONTROL_URL (optional, documented in docs/agent-control-api.md) adds live buttons; unset, the strip says no control plane is connected. Witness and enabled join the tag filters. Cards without a spec say code-only.
… list Two modules embed the Explorers like SPECS does. HUD_VIEWS now lists all eight views in command-panel order, including specs, which it had omitted: ?tab=specs fell back to the comb and the digit keys pointed one view off from the labels the panel printed. ModulesBlock says eight; the viewport contract counts eight command buttons (its readiness probe still counted five).
This was referenced Sep 9, 2026
feat(specs): skills and crons as first-class .t27 specs (site generates from them)
gHashTag/t27#3543
Merged
gHashTag
added a commit
to gHashTag/t27
that referenced
this pull request
Sep 9, 2026
…es from them) specs/skills: 26 modules, one per Claude Code skill t27.ai publishes. specs/crons: 33 modules, one per scheduled job (GitHub Actions, Inngest, Railway, in-process timers). Every constant is pub const; the field schema is in each README. Specs are English-only (LANG-EN): the Russian summaries live on the site side (apps/website/scripts/agents-i18n.ru.json), merged into the generated JSON as summary.ru with ruSource 'site-annotation'. All 59 typecheck ok under the compiler wasm vendored by gHashTag/trinity (sha256 4d9c0447b5ca2887...), nothing discarded; the wasm's typecheck.ok is lenient, so the site generator's schema check is the gate that holds. The site generates public/skills/spec-skills.json and public/crons/spec-crons.json from a vendored, byte-identical copy of these files; this directory is the canonical home. specs/OWNERS.md: skills/, crons/ -> T-Queen. docs/now entry added. Site PR: gHashTag/trinity#975 Closes #3544
gHashTag
added a commit
to gHashTag/t27
that referenced
this pull request
Sep 9, 2026
…es from them) specs/skills: 26 modules, one per Claude Code skill t27.ai publishes. specs/crons: 33 modules, one per scheduled job (GitHub Actions, Inngest, Railway, in-process timers). Every constant is pub const; the field schema is in each README. Specs are English-only (LANG-EN). Translations are connected through a spec: specs/i18n/agents-ru.t27 (module i18n_agents_ru, KIND "i18n") declares LOCALE, SCOPE (specs/skills, specs/crons), the translatable FIELDS (SUMMARY, NAME), the bundle location (trinity:apps/website/i18n/agents.ru.json, keyed by ID), FALLBACK "en", COVERAGE_REQUIRED false, ORPHANS_ALLOWED false. The Cyrillic payload lives only in that bundle; one contract file per locale, no locale list hardcoded in the site generator. All 60 typecheck ok under the compiler wasm vendored by gHashTag/trinity (sha256 4d9c0447b5ca2887...), nothing discarded; the wasm's typecheck.ok is lenient, so the site generator's schema check is the gate that holds. The site generates public/skills/spec-skills.json and public/crons/spec-crons.json from a vendored, byte-identical copy of these files; this directory is the canonical home. specs/OWNERS.md: skills/, crons/, i18n/ -> T-Queen. docs/now entry added. Site PR: gHashTag/trinity#975 Closes #3544
…ough specs/i18n/agents-ru.t27
t27 CI (bootstrap/build.rs) rejects Cyrillic in any spec, so SUMMARY_RU is
gone from all 59 vendored skill/cron specs (byte-identical with gHashTag/t27
feat/specs-skills-crons). Russian is now connected through a spec, not a
site-side convention:
- public/t27/files/specs/i18n/agents-ru.t27 (module i18n_agents_ru, KIND
"i18n") declares LOCALE ru, SCOPE [specs/skills, specs/crons], FIELDS
[SUMMARY, NAME], BUNDLE_REPO trinity, BUNDLE_PATH
apps/website/i18n/agents.ru.json, KEY ID, FALLBACK en, COVERAGE_REQUIRED
false, ORPHANS_ALLOWED false, ENABLED true. One file per locale; nothing
in the generator enumerates locales.
- apps/website/i18n/agents.ru.json carries the Cyrillic payload
({$spec, locale, entries: {ID: {SUMMARY}}}); 59 entries.
- scripts/agents-from-specs.mjs discovers specs/i18n/*.t27 through the wasm
like every other spec, loads each declared bundle, checks it against its
contract (locale, $spec, keys within FIELDS, orphans fail, coverage warns
unless COVERAGE_REQUIRED, duplicate LOCALE fails) and emits summary/name as
{en, <locale>...} plus i18n: [{locale, spec, sha256, bundle, enabled,
fields, scope, coverage: {n, total}, missing}] per catalog. Cyrillic in any
.t27 is a build problem.
- tests: 24 pass (contract typechecks, merge, orphan strict/loose,
COVERAGE_REQUIRED, bundle validation, locale discovery + duplicate,
Cyrillic, committed contract + bundle).
- qa/agents-spec-contract.mjs (check:agents): i18n contract section --
bundle exists at the declared path, names its contract, matches locale, no
orphan, no key outside FIELDS, catalog coverage equals the bundle; prints
"ru via specs/i18n/agents-ru.t27: skills 26/26, crons 33/33, orphans 0".
- UI: Explorers read summary[lang] ?? summary.en; the SPEC panel adds
"translations: ru via specs/i18n/agents-ru.t27 (n/total)" (EN+RU copy).
- READMEs (skills, crons, new i18n) document the contract; t27 issue #3544.
github-actions Bot
added a commit
that referenced
this pull request
Sep 9, 2026
feat(queen): spec-first SKILLS (7) and CRONS (8) explorers generated from .t27 specs (#975) 59 skill/cron specs + specs/i18n/agents-ru.t27; generator scripts/agents-from-specs.mjs (wasm AST, no regex); Explorer spec panel, cron->skill links, CONTROL strip; Queen tabs 7/8; HUD_VIEWS fix. Canonical specs: gHashTag/t27#3543.
This was referenced Sep 9, 2026
verify-site: /orb/ is an external Pages surface — no lastmod expected
gHashTag/ghashtag.github.io#19
Merged
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Skills and crons become spec-first on t27.ai. Every published agent skill (26) and every scheduled job (33) is now stated by a
.t27module; the site generates its catalogs from those specs through the vendored compiler wasm at build time, and the Explorer cards open on the spec — bytes, sha256, compiler verdict — before the code the sync script found. The Queen gains two modules, SKILLS (7) and CRONS (8), that embed the two Explorers the way SPECS embeds the corpus.Companion PR in the canonical spec home: gHashTag/t27#3543 (
feat/specs-skills-crons), tracking issue gHashTag/t27#3544.Language (LANG-EN) and translations through a spec. t27 CI (
bootstrap/build.rs) rejects Cyrillic in any spec, soSUMMARY_RUis gone from all 59 vendored specs (rg -l '[\p{Cyrillic}]' public/t27/files/specs→ nothing; copies byte-identical with t27). Russian is connected through a spec:public/t27/files/specs/i18n/agents-ru.t27(modulei18n_agents_ru,KIND="i18n") declaresLOCALE,SCOPE(specs/skills,specs/crons),FIELDS(SUMMARY,NAME),BUNDLE_REPO="trinity",BUNDLE_PATH="apps/website/i18n/agents.ru.json",KEY="ID",FALLBACK="en",COVERAGE_REQUIRED=false,ORPHANS_ALLOWED=false,ENABLED=true. The Cyrillic payload is only inapps/website/i18n/agents.ru.json({$spec, locale, entries: {ID: {SUMMARY}}}, 59 entries). The generator discoversspecs/i18n/*.t27through the wasm, loads each declared bundle, validates it against its contract (locale /$specmatch, keys ⊆FIELDS, orphan entry → build fails, missing translation → coverage only, duplicateLOCALE→ fails) and emitssummary: {en, ru}/name: {en, ru}plusi18n: [{locale, spec, sha256, bundle, enabled, fields, scope, coverage: {n, total}, missing}]per catalog. No locale is enumerated in code:agents-de.t27etc. are one file each.check:agentsprintsru via specs/i18n/agents-ru.t27: skills 26/26, crons 33/33, orphans 0. The SPEC panel showstranslations: ru via specs/i18n/agents-ru.t27 (n/total).Data flow
Witness
.t274d9c0447b5ca2887…)node scripts/agents-from-specs.mjsRUNS = []+RUNS_NOTE)public/skills/spec-skills.json,public/crons/spec-crons.jsonnode scripts/agents-from-specs.mjs --checknode --test scripts/agents-from-specs.test.mjsnpm run prebuildpublic/)npm run typecheckratchetnode scripts/typecheck-ratchet.mjsnpm run lintmain(none in changed/new files)npm run buildnpm run check:agentscheck:spec-catalog,check:skills-catalog,check:crons-catalogcheck:explorer-languages,check:queen-languagescheck:shared-core,check:queen-{atlas,treasury,catalog,continuous,spec-mirrors,coverage,worlds,city,construction,hardware,responsive}check:queen-{honesty,cycle,factory,review}main@ 50d11a5, unrelated to this PRcheck:queen-viewportand other Chromium gatesNote on the wasm gate: the vendored
typecheck.okis lenient (it stays true forstr = 5oru16 = 70000), so the generator's schema check is the real gate. "typecheck ok" is necessary, not sufficient — the PR says so in the generator header and the README.What changed where
public/t27/files/specs/{skills,crons,i18n}/*.t27+README.md— vendored specs (canonical home is gHashTag/t27);i18n/agents-ru.t27is the Russian translation contract.i18n/agents.ru.json— the Russian bundle the contract points to (the only place Cyrillic for these specs lives).scripts/agents-from-specs.mjs(+.test.mjs) — generator;package.jsonprebuild/prebuild:ci+= generator; newcheck:agents,test:agents-specs.scripts/railway-services.json— RailwayprojectIdand per-serviceserviceIdso "run now" resolves at build time (test:sync-cronsstill 8/8).src/lib/agentSpecs.ts,src/components/AgentSpecPanel.tsx— loaders, witness labels, panel, CONTROL strip;SkillExplorer.tsx,CronExplorer.tsxwired (spec first; tagswitness/*,enabled/*; badges⟲ N/◷ N;embed=1kept).docs/agent-control-api.md,.env.example.queen— optionalVITE_AGENT_CONTROL_URLcontract (POST {url}/crons/<id>/run|enable|disable,POST {url}/skills/<id>/run, body{id, requestedAt}); unset → muted "control plane not connected"..gitignoregains!apps/website/docs/**so the doc can be committed.queenHud.tsHUD_VIEWSnow lists all eight views;queenModules.tsentries 7⟁ SKILLS/СКИЛЛЫ, 8◷ CRONS/КРОНЫ;Queen.tsxunion →HudView, command items, EN+RU dicts, render branches, aria;QueenAgents.tsx;ModulesBlocksix → eight (EN+RU);QueenCommand.tsxcomments.qa/queen-viewport-contract.mjs— command-button count 5 (readiness) / 6 (assert) → 8. Ratchet moved because the panel it counts has eight buttons; the readiness probe was already stale at 5 while the panel had 6.Pre-existing bug fixed on the way:
HUD_VIEWSomittedspecs, so?tab=specsfell back to the comb and the digit shortcuts pointed one view off from the digits the panel printed. Explained in the commit.CI on this PR (pre-existing, infra, not addressed here):
claude-review(curl failure),pr-opened("Bad credentials"),Brain Health("not implemented") fail independently of this diff.Boundaries (what this PR does not claim)
VITE_AGENT_CONTROL_URLis a documented contract only; with it unset the UI says so and offers only spec-edit and host links.public/t27/manifest.jsonyet (inSpecCorpus= false for 59/59); the "Open in Spec Explorer" link stays hidden untilsync-t27-specsis re-run after the t27 PR merges. The panel shows a muted "not in vendored corpus manifest yet" instead.RUNSis empty in every cron spec (with aRUNS_NOTE); no cron → skill edge is asserted yet.masterwas not run against these specs — only the vendored wasm.Do not merge without review.