v0.26 added `deliver` + `deliver_format` on the schedule block. The agent never has to call Slack itself — it returns the markdown summary as its final reply, and the scheduler dispatches it through `@tuttiai/slack`'s shared token-keyed client. Delivery failures emit `schedule:delivery_failed` and never crash the timer; success fires `schedule:delivered`.
import { defineScore, AnthropicProvider } from '@tuttiai/core'
import { GitHubVoice } from '@tuttiai/github'
import { SlackVoice } from '@tuttiai/slack'
export default defineScore({
provider: new AnthropicProvider(),
entry: 'standup-bot',
agents: {
'standup-bot': {
name: 'Standup Bot',
model: 'claude-sonnet-4-6',
permissions: ['network'],
voices: [new GitHubVoice(), new SlackVoice()],
budget: { max_cost_usd: 0.10 },
schedule: {
cron: '0 9 * * 1-5',
input: "Summarise yesterday's PRs and issues across the team.",
deliver: { platform: 'slack', channel: '#engineering' },
deliver_format: 'markdown',
},
system_prompt:
'Read-only summary of yesterday across the team. Markdown out, under 1500 chars. Do NOT post directly — the scheduler delivers.',
},
},
}) - 01 Scaffold a project:
npx tutti-ai init my-scheduled-standup-to-slack - 02 Install voices:
npm i @tuttiai/github @tuttiai/slack - 03 Drop the score above into
tutti.score.ts, set the env vars in.env, and runtutti-ai run.
-
budget: { max_cost_usd: 0.10 } per run -
permissions: ["network"]