diff --git a/trios/agent-server/apps/server/tests/api/queen-inngest.test.ts b/trios/agent-server/apps/server/tests/api/queen-inngest.test.ts index ae6af442bc..523ead5d9e 100644 --- a/trios/agent-server/apps/server/tests/api/queen-inngest.test.ts +++ b/trios/agent-server/apps/server/tests/api/queen-inngest.test.ts @@ -93,9 +93,9 @@ describe('the vendored catalog, read by the compiler', () => { ]) expect(c.scheduler.tokenEnv).toBe('TRIOS_GITHUB_API_TOKEN') expect(c.crons.length).toBe(33) - expect(c.skills.length).toBe(26) + expect(c.skills.length).toBe(27) expect(c.refused).toEqual([]) - expect(c.pin).toContain('26294613') + expect(c.pin).toContain('885189dd') expect(new Set(c.crons.map((x) => x.host))).toEqual( new Set(['github-actions', 'inngest', 'timer', 'railway-cron']), ) @@ -115,7 +115,7 @@ describe('the vendored catalog, read by the compiler', () => { }) const c = await loadSpecCatalog(root) expect(c.crons.length).toBe(33) - expect(c.skills.length).toBe(26) + expect(c.skills.length).toBe(27) const reasons = Object.fromEntries(c.refused.map((r) => [r.file, r.reason])) expect(reasons['specs/crons/zz-broken.t27']).toBe('missing ID') expect(reasons['specs/crons/zz-garbled.t27']).toMatch(/^compiler: /) @@ -155,12 +155,12 @@ describe('the plan follows the constants', () => { expect(plan.danglingRuns).toEqual([]) }) - it('derives ids and events from the templates and keeps them unique across 59 functions', async () => { + it('derives ids and events from the templates and keeps them unique across 60 functions', async () => { const c = await catalogPromise const plan = planCatalog(c) const ids = [...plan.crons, ...plan.skills].map((f) => f.functionId) - expect(ids.length).toBe(59) - expect(new Set(ids).size).toBe(59) + expect(ids.length).toBe(60) + expect(new Set(ids).size).toBe(60) for (const p of plan.crons) { expect(p.functionId).toBe(`cron-${slug(p.cardId)}`) expect(p.tickEvent).toBe(`cron/${p.cardId}.tick`) @@ -327,21 +327,21 @@ describe('dispatch, against a fake GitHub', () => { }) describe('the app and its routes', () => { - it('builds 59 functions and a projection with counts, reasons and env presence (never values)', async () => { + it('builds 60 functions and a projection with counts, reasons and env presence (never values)', async () => { const c = await catalogPromise const env = { INNGEST_SIGNING_KEY: 'signkey-test-secret', TRIOS_GITHUB_API_TOKEN: 'ghp_secret', } const app = buildQueenApp(c, { env }) - expect(app.functions.length).toBe(59) + expect(app.functions.length).toBe(60) const p = schedulerProjection(app, env) expect(p.app).toBe('t27-queen') expect(p.counts).toEqual({ crons: 33, cronsScheduled: 12, cronsTickOnly: 21, - skills: 26, + skills: 27, refused: 0, danglingRuns: 0, }) @@ -369,7 +369,7 @@ describe('the app and its routes', () => { expect(status.status).toBe(200) expect( ((await status.json()) as { counts: { skills: number } }).counts.skills, - ).toBe(26) + ).toBe(27) const run = await server.request( '/api/inngest?fnId=t27-queen-skill-t27-measure-corpus&stepId=step', diff --git a/trios/agent-server/specs/PIN b/trios/agent-server/specs/PIN index 2253ec8f6b..0781c3a6ac 100644 --- a/trios/agent-server/specs/PIN +++ b/trios/agent-server/specs/PIN @@ -1,3 +1,3 @@ -source: gHashTag/t27 feat/inngest-queen-scheduler @ 26294613 (specs/crons, specs/skills, specs/automation/inngest-queen-scheduler.t27), byte-identical -wasm: gHashTag/trinity main apps/website/public/t27/t27_compiler.wasm sha256 4d9c0447b5ca288790ab03d3dffc2dda629ed47af9d6731a105fc923aea0aee4 +source: gHashTag/t27 master @ 885189dd (specs/crons, specs/skills, specs/automation/inngest-queen-scheduler.t27), byte-identical +wasm: gHashTag/trinity main apps/website/public/t27/t27_compiler.wasm sha256 4d9c0447b5ca288790ab03d3dffc2dda629ed47af9d6731a105fc923aea0aee4 (kept: the wasm on trinity main @ 3cf399fc answers the scheduler contract with output this loader cannot parse) refresh: scripts/sync-t27-specs.sh (T27_ROOT, TRINITY_ROOT), then bun test tests/api/queen-inngest.test.ts diff --git a/trios/agent-server/specs/skills/trinity-connect-accounts.t27 b/trios/agent-server/specs/skills/trinity-connect-accounts.t27 new file mode 100644 index 0000000000..834716bdb5 --- /dev/null +++ b/trios/agent-server/specs/skills/trinity-connect-accounts.t27 @@ -0,0 +1,28 @@ +// SPDX-License-Identifier: Apache-2.0 +; specs/skills/trinity-connect-accounts.t27 -- skill trinity/connect-accounts +; Source of truth for the skill card on t27.ai (#/skills?skill=trinity/connect-accounts). +; The skill body lives in gHashTag/trinity at .claude/skills/connect-accounts/SKILL.md +; (vendored copy: apps/website/public/skills/files/trinity/connect-accounts/SKILL.md, sha256 b8401486a420...). +; Written from two live runs on 2026-09-22: LinkedIn through Google (one press, +; one account choice, one consent) and X through Google (blocked until the +; browser allowed pop-ups), and two sessions an agent described but never ran. +; The JSON the site serves is generated from this file by the real compiler; +; nothing below is parsed with a regex. +; phi^2 + 1/phi^2 = 3 | TRINITY + +module skill_trinity_connect_accounts; + +pub const KIND : str = "skill"; +pub const ID : str = "trinity/connect-accounts"; +pub const NAME : str = "connect-accounts"; +pub const REPO : str = "trinity"; +pub const SOURCE : str = "SKILL.md"; +pub const SUMMARY_EN : str = "Sign a person into their own accounts (LinkedIn, X, job boards, social networks) through their remote browser, as an agent the person watches: SSO buttons pressed by label, every case of a sign-in with the move that fits it, secrets and consent kept theirs, and only what the tools really did reported."; +; No slash command is declared for this skill. +pub const COMMAND : str = ""; +; No spec is declared for this skill yet; the Skill Explorer lists it as unbound. +pub const SPECS : [0]str = []; +pub const TAGS : [4]str = ["browser", "sign-in", "sso", "agents"]; +pub const ENABLED : bool = true; +; Default budget; SKILL.md declares no timeout of its own. +pub const TIMEOUT_MIN : u16 = 30;