Start with what’s unique to you
The most common mistake is telling the agent things it already knows. Neo ships with built-in skills — diagnosis methodology, end-user communication, PSA and Microsoft 365 know-how — and sensible defaults. Your instructions sit on top of those and win wherever they conflict. So spend your words on what’s specific to your MSP: your processes, your decision rules, your guardrails, your tone. Don’t restate things Neo already does:Say what to do and where the limits are — usually not how
This is the most important default to get right — it’s where most instructions go astray. Your agent already has its tools, and it picks the right one at runtime from each tool’s description. As a default — especially when you’re starting out — describe the outcome and the guardrails, and leave the mechanics to the agent. Reaching for specific tools, API endpoints, HTTP methods, PowerShell cmdlets, or raw system field names tends to make instructions more brittle, can box the agent in, and is easy to get subtly wrong. Saying what you want is usually shorter and survives product changes, PSA differences, and new tools.A structure that works
Most strong agents follow the same simple skeleton. You don’t need every section, but this order reads well to the model:Goal — one line
Goal:.Role — who it is
Steps or decision rules
Guardrails — what never to do
Escalation — when to hand off
Output — what to leave behind
Format your instructions
The instructions editor renders formatting as you type, like a document editor — headings look like headings, lists like lists — and structure helps the model follow long instructions. Use the toolbar (headings, bold, lists, quotes, links, code blocks, tables) or type Markdown directly:## starts a heading, - starts a list, **bold** bolds, and ⌘B/Ctrl+B and ⌘I/Ctrl+I work as you’d expect.
- Pasting from Word, Google Docs, a web page, or a Markdown file keeps your bold text, headings, lists, and tables — nothing is flattened to plain text.
- To indent a list item, press Tab — Shift+Tab moves it back out. Typing
-or1.at the start of an item indents it too, so you can type a nested list straight through. The first item of a list has nothing to sit under, so it can’t be indented. - Use headings to separate sections (steps, guardrails, escalation) and lists for rules. Bold the words that carry the rule: “Never reset without verifying identity.”
- A line of
=,-,*or_characters stays exactly as you type it — length and character included. Frame a section header with one if you want the agent’s output to carry it. - Prefer to write the Markdown yourself? Switch the box to Markdown with the control in its top-right corner and edit the raw text. It is the same text the agent reads, and it saves exactly as you type it — switch back to Editor to see it rendered.
- The left margin numbers your instructions: the Markdown view numbers every line, and the Editor view marks the line a heading, paragraph, list item or table starts on. Every number is a line of the saved text, so “change line 14” means the same line in either view and in the Neo Support chat. A block the Editor view cannot match to the saved text — a paragraph written with
_italic_, which the editor writes back as*italic*, for example — carries no mark from there down, and the Markdown view still numbers it. - Under the hood the instructions are stored as Markdown — the same text the agent reads — so anything you already saved keeps working unchanged.
Write decision rules, not vibes
“Handle urgent tickets quickly” tells the agent nothing it can act on. Give it the actual rule — a threshold, a list, a condition. Specific instructions produce consistent agents. A security-triage agent, for example, classifies every alert with explicit bands instead of “use your judgment”:How the agent reads a rule
A ticket or scheduled agent reads each rule for what it is meant to achieve, so a rule that does not clearly fit a case is applied the way its author would want. Approvals, holds, what goes to a client, and security rules are followed exactly as written. When a case must always go one way, name it in the rule. A ticket agent also has defaults, and each one gives way to custom instructions that say otherwise. It writes an internal note on each substantive action. It closes a ticket when the end user says the issue is resolved or asks to close it, and sets any other status only when your instructions say so. It stands down when a technician already did the work, takes the ticket over or asks it to stop.Guardrails and escalation
State the limits as clearly as the work — the best instructions often write the “never” list more emphatically than the “do” list. Cover:- Hard prohibitions — “Never make tenant-wide, network-wide, or security-impacting changes.” “Don’t provide account or password support for the client’s line-of-business app (e.g. their accounting or HR system) — only help with installation and updates.”
- Security basics for anything customer-facing — never ask a user to type a password, MFA code, or PIN into the chat; reframe (“can you sign in?”, not “what’s your password?”). Don’t perform account or permission changes yourself — log a ticket and let a technician handle them through a secure channel.
- When to escalate — the conditions that send a ticket to a human, named concretely: the issue persists after basic checks, it needs configuration access, or it involves safeguarding or sensitive data. Name the route too (a status, a Teams message to a named person). With no route, the agent leaves the open step in its internal note, or in its dashboard summary when it cannot or may not write a note, and messages no one.
- What to leave for the human — an internal note with what was checked, what’s still needed, and the suspected cause, so the technician has full context.
Wording a hold-until rule
A common guardrail holds everything back until some condition is met — an approver has signed off, or the ticket has reached a given status. Word it by what it blocks, because that is what the agent can check. The agent sees each of its tools labelled writes to client systems — it can change a PSA record, an identity or RMM object, a mailbox, or send a message to a person — or read-only, which changes none of that, or reads or writes, depending on your request for the tools that do both, where the agent classifies each call instead of the tool. So a rule phrased in those terms needs no interpretation:Wording a start-of-work step
Many agents take ownership first: they assign the ticket to the agent’s own PSA resource and set a working status. A step you tie to the start of work runs once per ticket. A later run on the ticket takes only the part that no earlier run did and the ticket still needs, and never replaces an owner someone else set. The step runs before the agent replies to the customer, asks them a question, sets a waiting status or hands the ticket off. A reply that waits for the customer still counts as work on the ticket. A check you attach to the step is its condition: when the check passes, the agent takes the step, and when it fails, the agent skips it.Tone and customer-facing language
For chat agents and any agent that messages end users, write for the reader — the end user, not your technicians — and control two things separately:- Voice — how it sounds: “Friendly, warm, plain language, no jargon. Brief over verbose.”
- What it may and may not claim — the part teams forget. Tell the agent not to imply work it didn’t do, not to commit to specific dates or ETAs, and not to expose internal process:
Keep it concise
Aim for the shortest instructions that fully capture your intent. Prefer a tight set of bullets over a long numbered playbook, and cut anything that restates a Neo default or pads the page. Most agents need about a page — a few thousand characters is a good ceiling for everyday agents. Long, sophisticated agents do exist — a senior-technician agent handling a whole queue might run to several pages of decision tables. That’s fine when every line earns its place. Length should come from real complexity, not from boilerplate.Advanced patterns
Once the basics are solid, these are the techniques Neo’s most advanced customers rely on. Reach for them when an agent’s logic is genuinely complex.Decision tables for multi-factor logic
Decision tables for multi-factor logic
Name the model's failure modes and rule them out
Name the model's failure modes and rule them out
Disambiguate rules that interact
Disambiguate rules that interact
State the why, not just the rule
State the why, not just the rule
Re-run safety for agents that fire repeatedly
Re-run safety for agents that fire repeatedly
One persona across a fleet
One persona across a fleet
Send a notification only in some cases
Send a notification only in some cases
Change a field only in some cases
Change a field only in some cases
Let Neo draft them for you
You don’t have to start from a blank box. In the agent editor, Adjust with Neo sits inside the instructions box while it still holds the short starter line (“Goal: Resolve the ticket” or “Help the user”), saved or not, and next to the Custom Instructions title otherwise. An end-user chat agent starts with a full policy in the box, so its button is next to the title from the start. One click opens the Neo Support chat, which reads what the agent already holds and opens on options you can click. What it offers depends on where you are:- A new agent you have not written anything into — a short intake opens first, in the dashboard rather than the chat, so there is nothing to wait for. It asks what kind of work the agent takes on, shows you the templates in that category in case one already does the job, takes one line about what you want, and asks what starts it. The trigger you pick is written into the builder straight away. Neo then opens with your answers already in hand and asks only what they leave open.
- A new agent you have already started — Neo reads your draft, names the kind of agent you are building, and offers what to do next for that kind of work. If the draft already reads like working instructions, a review is one of the options.
- A saved agent — Neo offers three options:
- Add or change a rule: describe the change. Neo shows the edit, and applies it after you confirm. Before that, it checks the change against the agent’s instructions and the MSP-wide pinned memories that reach it, plus one company’s pinned memories when the change concerns that company, and tells you what it finds: a rule the change contradicts (quoting both), an exception added to an exception, a duplicate, a rule so absolute it blocks common tickets, or a rule that leaves a ticket where nobody sees it when a step fails. Where rules can merge, it proposes one rule instead. You choose which version to apply.
- Check my instructions: Neo looks for contradictions, including with the MSP-wide pinned memories the agent reads, missing rules and unclear formatting, and changes nothing. If the instructions are fine, it says so, and offers to format them when the formatting could be clearer.
- Turn on the tools it needs: Neo reads the instructions and proposes the tools and permissions they need, with the line that needs each one. Nothing is turned on until you confirm.
- Nothing set up beyond the instructions and the tools you picked — Neo can create the agent for you, disabled, so nothing runs until you review it and switch it on. If you accept, the agent exists: leave the builder without saving, or you will end up with a second copy.
- You have already set a schedule, filters, integration permissions, or settings on a tool — Neo offers the button and nothing more. Those settings live only in the builder, and an agent created from the chat would not have them.
Test, then iterate
Instructions are never one-and-done. The fastest way to improve them is to watch real runs:Start in test mode
Watch real executions
Refine one thing at a time
