Studio kinds
plungeai-bot-agent
Design and emit ONE PlungeAI (Ocean Studio) bot agent — a scheduled, unattended `type: harness` mission that reports to the user's channels (in-app, email, Slack, Telegram, WhatsApp, Discord) — as CNL YAML plus a bot-config block (cron schedule, delivery targets, optional run-on-my-computer).
Design and emit ONE PlungeAI (Ocean Studio) bot agent — a scheduled, unattended type: harness mission that reports to the user's channels (in-app, email, Slack, Telegram, WhatsApp, Discord) — as CNL YAML plus a bot-config block (cron schedule, delivery targets, optional run-on-my-computer). Use when the Studio Think composer has "Bot agent" selected, or when a user asks for a bot, a scheduled agent, a daily/weekly brief, a watcher, a monitor, a digest, or "something that runs on its own and tells me". Triggers: "bot", "every morning", "schedule", "report to Slack", "watch and alert", "digest". NOT for interactive agents (plungeai-agentic-agent) or multi-task pipelines (plungeai-workflows).
Download zip (opens in a new tab) · View raw SKILL.md (opens in a new tab)
Used by Studio: Ocean Studio's agent builder loads this skill by its id.
A bot is an agentic agent with three extra facts: WHEN it runs, WHERE the result goes, and
whether its hands are the user's own computer. Studio saves the mission under "Bots" and
creates the schedule + delivery from your bot-config block. Unattended runs cannot ask the
user anything: no ask_user, no platform_action, and every risky tool is either excluded
or permissions: deny.
The conversation (before any YAML)
- Job. One sentence: what the bot produces each run (a brief, an alert, a digest).
- Cadence. Ask for the schedule in words, propose the cron, confirm it. Five fields, UTC unless the user gives a timezone (convert and say so).
- Where it reports. Ask which channels:
inapp(Studio inbox, always safe),email(owner or listed addresses),slack(DM the owner or a channel id),telegram,whatsapp,discord(require a paired chat — say the user must pair first if unsure). Defaultinappwhen the user has no preference. - Hands. Cloud (default) or "runs on this computer" (
local: true) when it must read local files, control local apps, or use local agents. Local bots pinagent: harness-agent. - Fence + capabilities + budget exactly as for an agentic agent: smallest
allowed_tools, ids only from AVAILABLE CAPABILITIES and liveregistry_search,effort: standardunless argued, 2–4success_criteria.
Confirm, then emit BOTH blocks.
Output contract — two fenced blocks, in this order
workflow:
name: "<short bot name>"
description: "<one line: what it reports and how often>"
tasks:
- type: harness
id: bot
agent: harness-agent
goal: "{input}"
mission: |
You are <name>, a bot that <job>. Each run you <steps in 2–4 sentences>.
Output <format: bullets / table / one paragraph>. Keep it under <n> words.
End with `[SILENT]` (or make your whole result `[SILENT]`) when nothing is worth
reporting this run — the platform then delivers to no channel.
When your task is finished, call the task_complete tool with your final result.
effort: standard
allowed_tools: [web_search, web_fetch, task_complete]
success_criteria:
- <statement the bot verifies before finishing>schedule: "0 7 * * 1-5"
deliver:
- channel: inapp
- channel: slack
chat_id: C0123ABCD
local: false
prompt: "<the per-run input the schedule sends as {input}>"Rules the lint enforces — violating them makes the save fail:
- ONE task,
type: harness,agent: harness-agent,goal: "{input}", mission ends with the task_complete sentence. allowed_toolsMUST includetask_completeand MUST NOT includeask_userorplatform_action(nobody is there to answer).skill_manageneedspermissions: {skill_manage: allow}to run unattended — leave it out unless asked.- No
memory_owner(the platform scopes bot memory itself). No emails or ids in the YAML; recipients belong in bot-configdeliver, not in the mission. local: truegoes in BOTH blocks — on the harness task (the runtime reads it to route tool calls to the machine) and in bot-config (so the scheduler skips cleanly when the machine is offline) — and only withagent: harness-agent; addlocal_agents: [ids]from the user's connected local agents when they name them, else leave it out (all connected agents).
bot-config fields
schedule— 5-field cron, required. Examples:0 7 * * 1-5weekdays 07:00,*/30 * * * *every 30 min,0 18 * * 5Fridays 18:00.deliver— list of{channel, chat_id?, to?, phone_number_id?}:inapp(no fields),email(tooptional = owner),slack(chat_idC… channel ortoU… member; none = DM the owner),telegram/discord(chat_id),whatsapp(tonumber +phone_number_id). Default[{channel: inapp}].local—trueonly for run-on-my-computer bots. Defaultfalse.prompt— the per-run input. Default empty (the mission's goal alone drives the run).budget_usd_run/budget_usd_month— optional non-negative spend caps. Per-run stops the loop once its token cost exceeds the cap; per-month is enforced by the scheduler.permissions— optional class presets{ pay|send|write|delete: ask|allow|deny }persisted on the bot.pay: askis the safe default for anything money-adjacent.allowlets that class run automatically unattended, but never lowers the money floor (buy, pay, transfer, send, withdraw, …always pause for approval, even withpay: allow). A team admin can LOCK a class from the Studio Permissions dialog, which forces itsallowback up toask.
Permissions — approval rules
Per-tool permissions on the mission gate individual tools. Per-CLASS presets (bot-config
permissions, or the ⋮ → Permissions dialog) gate whole action classes. The order the loop
resolves a call: the money floor (always ask), then an admin lock, then the tool-name preset,
then the class preset, then allow. Safe default for a bot that touches money or deletes:
permissions: { pay: ask, delete: ask }. An unattended pay: allow proceeds automatically for
non-floor money ops; a floor op still pauses to needs_approval (the run can sit up to 7 days
awaiting the owner) — the [SILENT] output contract must never suppress that pause notice.
The fence for unattended runs
Allowed vocabulary is the same 24 loop tools as an agentic agent; read plungeai-agentic-agent
for the catalog. Bots add these rules: exclude ask_user, platform_action; prefer read
paths (web_search web_fetch read_file recall_history knowledge) plus the agents the job
needs via call_agent with a tight allowed_agents; anything that sends or pays needs the
user's explicit yes in the conversation AND stays permissions: deny unless they insist.
Delivery of the result is NOT a tool — the platform delivers task_complete's result to the
deliver targets.
Read references/bot-config.md for delivery pairing and the platform behaviour on failure.
Outside Studio the same bot ships over MCP (https://mcp.plungeai.com/v1): plungeai_schedule
with action: create, job_type: workflow creates the job against a saved workflow. Discover
the agent ids you fence into allowed_agents live — plungeai_list_agents from a client, or
registry_search inside the loop — never from memory.