This is a public, read-only report. Striff reads this repository's docs, turns each sentence that makes a claim about the code into a rule, and checks the rule against the code on the default branch. How this works
Markdown: each platform needs different syntax. Converters in bots/utils/formatters.ts (convertToTelegramMarkdown, convertToSlackMrkdwn, convertToWhatsAppMarkdown); all use applyOutsideCodeBlocks() to leave fenced code untouched. Discord uses native embeds via richMessageToEmbed.
convertToWhatsAppMarkdown depends on applyOutsideCodeBlocks
Holds
Inbound media (bots/utils/media.ts): processBotMedia, reached via BaseBotAdapter.resolveIncomingMedia, makes one cross-platform decision — video/sticker → polite reply (no download); audio/voice → gaia.transcribeAudio (Whisper) becomes the chat message; image/document → gaia.uploadFile referenced via fileIds/fileData.
BaseBotAdapter depends on processBotMedia
Holdsadapter → utils
SentMessage is { id: string; edit: (text) => Promise<void> }.
2 rules from this sentence
SentMessage has id
Holds
SentMessage has edit
Holds
server-address.ts, server-switch.ts — Self-hosted server: validate an address, persist it as selfHostOrigin in desktop settings, relaunch. When set, every app route loads from that origin (its web app, its gaia_session cookie); the bundled app only serves the server form
DesktopSettings has selfHostOrigin
Holds
VoiceAgentSettings extends BaseAppSettings from gaia-shared.
VoiceAgentSettings extends BaseAppSettings
Holdsapps → libs
Per-run values like user_id, active_todo_id and execution_mode live in config["configurable"] (AgentConfigurable), not in state.
3 rules from this sentence
AgentConfigurable has user_id
Holds
AgentConfigurable has active_todo_id
Holds
AgentConfigurable has execution_mode
Holds
apps/api/app/agents/core/graph_manager.py — GraphManager.get_graph(name) resolves graphs via lazy providers.
Observed shapes are scoped (ResolvedTool.shape_scope): global for catalog tools, mcp:<integration_id> for MCP — a private server's shapes never cross users; the resolver is the access gate.
ResolvedTool has shape_scope
Holds
apps/api/app/agents/tools/core/registry.py — ToolRegistry, DynamicToolDict (a Mapping[str, BaseTool] that lets tools added after graph compilation be visible to the agent), get_tool_registry() async singleton.