Skip to main content

Designing predictable and powerful Agents

Well-designed Agents unlock powerful time-savings and efficiency gains.

Why agent design matters

Agents in Coworker run autonomously — on a schedule, in response to events, or when called directly. That power comes with responsibility: a poorly designed agent can flood a Slack channel with duplicate messages, produce vague outputs that require manual interpretation, or silently fail to complete the task it was built for.

This article covers the best practices for building agents that behave predictably, produce useful outputs, and stay within the bounds you intend.


Write precise, complete instructions

Your agent's system prompt is its rulebook. Vague instructions produce vague results.

Do:

  • Clearly define the task: what to look for, what data to use, and what to do with it

  • Specify the output format — a bulleted Slack message, a structured report, an email summary

  • Set explicit boundaries: what the agent should not do (e.g., "Do not send a message if there are no new items to report")

  • Use concrete filters: date ranges, deal stages, specific channels, named individuals

Avoid:

  • Open-ended instructions like "summarize everything" — scope the data explicitly

  • Assuming the agent will infer context it was never given

  • Combining multiple unrelated tasks in one agent — split them into separate agents

Tip: The more detailed your instructions, the more reliably your agent will behave. You can always edit and refine later.


Only grant the tools your agent needs

Each tool you enable expands what your agent can read or write. Excess tool access increases the chance the agent acts on unintended data or performs unintended actions.

  • Give the agent access only to the specific data sources relevant to its task (e.g., HubSpot for a deal-monitoring agent, Slack for a channel-digest agent)

  • If an agent only needs to read data, do not enable write tools

  • Review tool access when duplicating or repurposing an existing agent — inherited permissions are easy to miss


Choose the right trigger — and scope it carefully

How and when your agent fires determines how much noise it creates. A trigger that is too broad will result in an agent running more often than intended.

Scheduled agents:

  • Match the schedule to the data freshness — a daily digest doesn't need to run hourly

  • Avoid scheduling write-heavy agents during peak hours for your team

Slack message triggers:

  • Narrow the trigger using both a specific channel and a text string where possible — listening to a broad channel without a keyword filter will fire your agent on nearly every message

  • Use the user filter to limit which senders activate the agent

Custom event triggers:

  • Write conditions that are unambiguous — the more specific the condition, the more reliably the agent fires only when intended (e.g., "A new HubSpot lead has been submitted with company size greater than 50" rather than "A new lead arrives")

Meeting event triggers:

  • Specify the exact meeting you want the agent to follow up on — without scoping, the agent may run after every meeting you attend

  • Use first-person references ("my meetings") rather than naming yourself explicitly to ensure the trigger scopes correctly to your calendar

Note: Coworker prevents concurrent duplicate executions — if an agent is already running, a new trigger will not start a second run at the same time. However, back-to-back runs on frequent schedules can still produce repeated outputs if your instructions don't account for "nothing new to report" scenarios.


Prevent spam and duplicate outputs

The most common agent issue is outputs that repeat unnecessarily. Here's how to design against it:

  • Add a "nothing to report" condition: Explicitly instruct the agent to send nothing (or a brief acknowledgment) when the data doesn't meet the threshold for action. Example: "Only send a Slack message if there are 3 or more stale deals. If none qualify, do not send anything."

  • Scope the lookback window: For scheduled agents, define a clear time window for the data it should consider (e.g., "Look at deals updated in the last 7 days"). Without this, an agent may surface the same records every run.

  • Route outputs intentionally: If your agent outputs to Slack and also sends email, recipients may receive the same information twice. Choose one primary channel per agent, or use the "Notify only" mode for secondary destinations so teammates receive a lightweight ping rather than full duplicate output.

  • Use the API trigger's idempotency key: When triggering agents programmatically, include an idempotencyKey in your API call. This prevents the same event from accidentally triggering duplicate runs.

  • Separate agent outputs from meeting summaries: Agent outputs and meeting summaries both arrive from Coworker — route agent outputs to a dedicated Slack channel or email label so they don't get buried alongside notetaker summaries.


Make complex agents reliable

Agents that handle multi-step workflows — pulling from multiple sources, making decisions, and writing outputs — are more likely to fail silently if they aren't designed carefully.

  • Break large workflows into smaller agents: A single agent that reads from five tools, makes three decisions, and sends two outputs is hard to debug. Consider splitting into a research agent (reads data, surfaces insights) and an action agent (acts on those insights).

  • Use Skills for reusable logic: If multiple agents share common instructions — for example, a standard way to format deal summaries — extract those into a Skill. Attach the Skill to each agent so changes propagate consistently rather than requiring edits in multiple places.

  • Use Action Queue for write-heavy tasks: When your agent performs write actions (creating Jira tickets, sending emails, updating CRM records), configure the output destination to route through the Action Queue. This places a draft card in front of a human before anything executes — useful for high-stakes or irreversible actions.

  • Test before scheduling: Run your agent manually before enabling a schedule or event trigger. Review the full output and confirm it handles edge cases — particularly the "nothing to report" scenario — before letting it run autonomously.

  • Start with a less frequent schedule: When launching a new scheduled agent, start with a daily or weekly cadence. Tune down to hourly only once you've confirmed the outputs are accurate and non-repetitive.


Agent design checklist

Before saving and enabling your agent, run through these questions:

  • Does my system prompt specify exactly what data to use and what output format to produce?

  • Have I included a condition for when the agent should not send output?

  • Is the tool access limited to only what this agent needs?

  • Is my trigger scoped to avoid firing on unintended events?

  • Have I tested the agent manually and reviewed its output?

  • Is the output destination (Slack, email, Action Queue) appropriate for the sensitivity of the action?

Did this answer your question?