From 514f18ecc96329cd520e8340903b2442a9ebfbc3 Mon Sep 17 00:00:00 2001 From: MagMueller Date: Fri, 15 May 2026 13:02:41 -0700 Subject: [PATCH] v13: /goal stays copilot by default; autopilot only on explicit user opt-in MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit You called out the confusion: "/goal make my startup successful" sounds nearly identical to a user just saying "my goal is to make my startup successful" — but in the previous model one triggered autopilot and the other didn't. That's a footgun. New model: - **/goal is a continuous goal-mode signal, but stays in copilot by default.** Agent keeps working across turns: scan, draft, post a card, end turn. User taps Yes/Skip/More on the card; that's a new turn (`--resume` carries session context); agent picks up where it left off, queues the next concrete action, posts the next card. Each turn is one cycle of the loop. State persists in `agency.db` / `goals.md` / `notebook.md`. No 30-min cap — a `/goal` can run for days. - **Autopilot is unlocked only by explicit user opt-in.** Phrases in the user's prompt like *"don't ask me", "just do it yourself", "no approvals", "full autonomy", "don't bother me", "act on your own"* flip the topic to autopilot — agent acts end-to-end, no cards, only stops at irreversible/external boundaries. Without one of those cues, **stay copilot even inside `/goal`**. - **Natural-language goals = same as `/goal`.** "Make my startup successful" with no slash command gets the same continuous copilot treatment. The slash is just a convention. System prompt updated. /help text + COMMANDS list cleaned up. Tests: 21 + 11 pass. Note: the codex `[features] goals = true` config (v7) still ships, but since the bot dispatches via `codex exec --json` (non-interactive, slash commands not honored), codex's native /goal loop isn't actually being triggered. Our continuous-copilot behavior is entirely prompt-driven — which is what the new doctrine wants anyway. If you want codex's TUI /goal loop someday, that's a separate pty/tmux integration (v14+ candidate). Co-Authored-By: Claude Opus 4.7 (1M context) --- agent/system-prompt.md | 7 ++++--- agent/telegram_bot.py | 4 ++-- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/agent/system-prompt.md b/agent/system-prompt.md index 0329c80..a770094 100644 --- a/agent/system-prompt.md +++ b/agent/system-prompt.md @@ -7,9 +7,10 @@ You are **agency**, the user's 24/7 employee on a Linux VPS. They text you from ## Defaults - **Telegram is the only inbox.** One forum topic = one persistent agent session. -- **The default behavior is copilot** — do every reversible thing right away (read, draft, query, scrape, render) then **propose** the next visible action as a card the user accepts with one tap. Ask before anything visible to other people: sending email, posting publicly, merging, paying, deleting hard-to-recover data, anything that affects another person's view. -- **`/goal ` triggers autopilot.** Verbatim CLI passthrough — codex with `[features] goals = true` runs its native plan→act→test loop; claude treats it as a goal-shaped prompt. In autopilot you act end-to-end without asking, no approval cards, until the goal is achieved / blocked / genuinely impossible. Post short progress updates inline. **No timeout** — a `/goal` can run for days. -- **When the user mentions a goal in natural language** (e.g. "make my startup successful", "get more users", "respond to this email"), don't auto-flip to autopilot. Stay copilot: do the private work, post a card or 2-5 options with `agency-report`, let the user accept/skip/refine. +- **Default mode everywhere is copilot** — do every reversible thing right away (read, draft, query, scrape, render) then **propose** the next visible action as a card the user accepts with one tap. Ask before anything visible to other people: sending email, posting publicly, merging, paying, deleting hard-to-recover data, anything that affects another person's view. +- **`/goal ` = continuous goal-mode, still copilot by default.** You keep working on the goal across turns — scan, draft, post cards, end turn. The user taps to accept; that's a new turn (`--resume` carries session context); pick up where you left off, queue up the next concrete action, post the next card. Persist state to `agency.db` / `goals.md` / `notebook.md` so each turn knows what's done. No 30-min timeout; a `/goal` can run for days. Self-schedule with `tg-schedule` when you're waiting on something (a reply, CI, an event). +- **Autopilot is unlocked only by explicit user opt-in.** Phrases like *"don't ask me"*, *"just do it yourself"*, *"no approvals"*, *"full autonomy"*, *"don't bother me"*, *"act on your own"* in the user's prompt → switch to autopilot for the rest of the session in this topic: act end-to-end, no cards, only stop at irreversible/external boundaries or genuine blockers. Without one of these explicit cues, **stay copilot even inside `/goal`**. +- **When the user mentions a goal in natural language** (e.g. "make my startup successful", "get more users", "respond to this email"), treat it the same as `/goal` — continuous copilot. The slash command is just a convention; it isn't a magic mode flip. - **Silence is allowed.** If nothing's actionable, send nothing. Empty turns are fine; filler isn't. ## Be very proactive, be very visual diff --git a/agent/telegram_bot.py b/agent/telegram_bot.py index 2197dc6..02cb431 100644 --- a/agent/telegram_bot.py +++ b/agent/telegram_bot.py @@ -260,7 +260,7 @@ def random_thinking_reaction() -> str: ("fast", "switch this topic's Codex lane to fast mode"), ("model", "show/set this topic's Codex model"), ("agency", "open the goal card feed"), - ("goal", "autopilot goal — passes through to the CLI; I work end-to-end without approvals"), + ("goal", "continuous goal — I keep working across turns, posting cards. Add 'don't ask me' or 'just do it' for autopilot."), ("miniapp", "open the goal card feed"), ("live", "live-view URL of the active browser"), ("queue", "pending tasks in this topic"), @@ -5062,7 +5062,7 @@ def handle(self, msg: dict) -> None: "/claude — switch this topic to Claude\n" "/claude login — sign in Claude through a terminal flow\n" "/claude logout — sign out Claude\n" - "/goal — pass through to the CLI's native /goal (codex) or treated as an autopilot prompt (claude); I work end-to-end without approvals\n" + "/goal — continuous goal-mode, copilot by default (I suggest, you accept). Append 'don't ask me' / 'just do it' / 'no approvals' for autopilot.\n" "/agency — open the Mini App\n" "/miniapp — open the Mini App\n" "/live — live-view URL of the active browser\n"