Docs & rules

theexperiencecompany/gaiaGitHub

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

master394f669Last read 15 min ago

Is this yours? Install to manage it

Once installed, Striff checks every pull request.

Documents
Rules
22
10
8
8
1
1
1
1
12
352 docs
theexperiencecompany/gaiaOpen repository

theexperiencecompany/gaia — documented rules

22 of 22 rules, printed October 30, 2026.

The sentence in your docs
BaseBotAdapter (libs/shared/ts/src/bots/adapter/base.ts) owns dispatchCommand, buildContext, the GaiaClient, error handling, and the shared BotServer.
3 rules from this sentence
BaseBotAdapter depends on BotServer
Holds
BaseBotAdapter has dispatchCommand
checks “BaseBotAdapter (libs/shared/ts/src/bots/adapter/base.ts) owns dispatchCommand”
Holds
BaseBotAdapter has buildContext
checks “BaseBotAdapter”
Holds
stop() is the only shutdown hook.
BaseBotAdapter has a stop method
Holds
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.
GraphManager has a get_graph method
Holds
apps/api/app/agents/core/subagents/base_subagent.py — SubAgentFactory.create_provider_subagent().
SubAgentFactory has a create_provider_subagent method
Holds
Each entry has subagent_config=SubAgentConfig(has_subagent, agent_name, tool_space, domain, capabilities, use_cases, system_prompt, use_direct_tools, disable_retrieve_tools, auto_bind_tools, include_finish_task).
OAuthIntegration has subagent_config
Holds
libs/shared/ts/src/bots/adapter/base.ts — BaseBotAdapter abstract class. Lifecycle: constructor → boot(commands) → initialize → registerCommands → registerEvents → start → stop. Exposes dispatchCommand, buildContext, handleStreamingChat.
3 rules from this sentence
BaseBotAdapter is declared abstract
checks “BaseBotAdapter abstract class”
Holds
BaseBotAdapter has dispatchCommand
checks “Exposes dispatchCommand”
Holds
BaseBotAdapter has buildContext
checks “Exposes”
Holds
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.
2 rules from this sentence
ToolRegistry is in apps/api/app/agents/tools/core
checks “apps/api/app/agents/tools/core/registry.py — ToolRegistry”
Holds
DynamicToolDict is in apps/api/app/agents/tools/core
checks “apps/api/app/agents/tools/core/registry.py”
Holds
22 rules from 4 docs

More open-source reports

Every report →

Other public repositories whose docs Striff read and checked against their code.