# curator — Pi scenario profile # # This file describes the configuration that is DEPLOYED. The phase-3 target, # with tools, skills and a long-lived RPC session, is recorded in # docs/plans/2026-08-curator-agent-refactor.md §4b, together with why each part # cannot be enabled earlier. # # Current state: plan phase 0 (stop the bleeding). The agent has no tools; the # Curator service gathers every fact and the model only classifies or phrases. # # The launch contract lives here. Phase 3 makes curator/pi_agent.py read the # rendered .pi/launch.json and fail closed if it is missing; until then # pi_agent._isolation_args() is the enforcement point and must match this file. [scenario] name = "curator" description = "Personal book / film / TV / music curation agent for the Curator service." workspace = "/home/claw/pi-workspaces/curator" session_dir = "/home/claw/.local/share/pi-curator/sessions" service = "curator.service" # Application code lives in a separate repository and is intentionally outside # the agent's workspace. backend = "/home/claw/codex-workspace/server-management/deploy/curator" deploy = "managed" [model] provider = "zenmux" primary = "openai/gpt-5.6-luna" fallback = "x-ai/grok-4.6" [model.thinking] # One level for every call. Intent classification runs at "high" at the front of # every message, which is the dominant p50 latency contributor; splitting the # levels per role needs the RPC client's set_thinking_level (phase 3). all = "high" [session] # One pi process per message, keyed by Telegram chat via a uuid5 of the chat id. # No rotation: the process does not outlive the message. Phase 3 replaces this # with a long-lived RPC process plus explicit rotation. strategy = "process-per-message" [isolation] # Enforced in curator/pi_agent.py::_isolation_args. Verified effect is recorded # in docs/evidence/2026-08-27-curator-phase0-prompt.md. no_tools = true # phase 0 only. Also disables the skills mechanism: # pi emits only when a tool named # `read` is active, so --skill was a no-op and the # media policy never reached the model. The policy # now lives in the system-prompt files below. no_extensions = true no_skills = true no_prompt_templates = true no_themes = true no_context_files = true # the ONLY switch that stops parent-dir AGENTS.md; # AGENTS.override.md does not (verified) approve = true # required to load .pi/SYSTEM.md [personality] # Both are system-prompt files, so --no-context-files does not affect them. system_prompt = ".pi/SYSTEM.md" # replaces pi's default prompt append_system_prompt = ".pi/APPEND_SYSTEM.md" # durable domain responsibilities context_files = [] # deliberately none [resources] # Nothing is loaded from disk beyond the two system-prompt files. extensions = [] skills = [] [tools] allow = [] [budget] # One timeout per pi invocation. These do not compose: a single message can run # interpret + query + answer, so the worst case is a multiple of this value. # Phase 3 introduces one deadline per user message, enforced with RPC abort. invocation_timeout_seconds = 120 [env] # Explicit allowlist, enforced in pi_agent.ENV_ALLOWLIST. Notably absent: every # CURATOR_* credential, including the Telegram bot token and the Radarr, Sonarr, # Plex and Tavily keys. The provider key is read by pi itself from # ~/.pi/agent/models.json and does not travel through the environment. minimal = true allowlist = [ "PATH", "HOME", "LANG", "LC_ALL", "LC_CTYPE", "TZ", "NODE_OPTIONS", "SSL_CERT_FILE", "SSL_CERT_DIR", "NO_PROXY", "no_proxy", ] extra = [] [secrets] env_file = "/home/claw/.config/curator/curator.env"