v0.26 added `@tuttiai/skills`. The runtime observes every successful trajectory, the proposer drafts a candidate when the same shape repeats `auto_propose_threshold` times, and an operator decides with `tutti-ai skills review`. Permissions on the synthesised skill are the union of the constituents — checked at run start. Nothing reaches the agent until you approve.
import { defineScore, AnthropicProvider } from '@tuttiai/core'
import { InMemorySkillStore } from '@tuttiai/skills'
import { GitHubVoice } from '@tuttiai/github'
import { FilesystemVoice } from '@tuttiai/filesystem'
export default defineScore({
provider: new AnthropicProvider(),
default_model: 'claude-sonnet-4-6',
entry: 'code-reviewer',
agents: {
'code-reviewer': {
name: 'Code Reviewer',
permissions: ['network', 'filesystem'],
voices: [new GitHubVoice(), new FilesystemVoice()],
system_prompt:
'Review the user\'s PR. Read each changed file, post a consolidated review comment.',
},
},
skills: { enabled: true, auto_propose_threshold: 5 },
})
export const skillStore = new InMemorySkillStore() - 01 Scaffold a project:
npx tutti-ai init my-self-improving-reviewer - 02 Install voices:
npm i @tuttiai/github @tuttiai/filesystem - 03 Drop the score above into
tutti.score.ts, set the env vars in.env, and runtutti-ai run.
-
Operator approval gates every candidate -
skills.enabled: true + a SkillStore