Technical Support AI Agent Architecture: diagnostic & secured!
The Bot That Could Look but Never Touch

How we built a support agent that diagnoses a user's real, live problem — reading their actual data to find the truth — yet is physically incapable of changing a single thing. Told through one 11pm ticket.
It's 11pm. A message lands in the Platform support queue:
"I paid for my booking on Saturday but it still says cancelled and I never got my refund. Booking 10042. Please help??"
Her name is Maya. She's not angry yet — she's confused, which is worse, because confusion is the thing support is supposed to dissolve and so rarely does.
A normal support bot is about to make this worse. It will search a help center, find an article titled "Understanding refunds," and paraphrase it back at her: refunds take 5–7 business days, here's our policy. None of which answers her question, because her question isn't about the policy. It's about her — this charge, this booking, this missing refund, and whether those three facts add up.
Answering that requires looking at her actual data. And the moment you let an AI look at live production data, you've handed it the keys to a very expensive car and hoped it only goes for a gentle drive.
This is the story of how we let it drive — and made the brakes, the speed limit, and the locked doors part of the car's frame, not a polite request to the driver.
The pain point, segregated data backed by articles.
As you can see, Mostly tickets, doesn’t even require any edits on the data.
Data is backed by references
There's still a human in this story — a crucial one. But their job inverts: instead of investigating from scratch, they review a finished diagnosis with a proposed fix attached. The hard, novel, human cases get the human; everything else arrives pre-solved. That's not "doing the same work faster." It's the work changing shape.
A dashboard full of green only earns its place if the thing behind it is safe. So before the metrics, the mechanism — the part that makes all of the above legal to believe. Watch it work.
The six acts:
Act 1 · The 11pm ticket
Act 2 · One rule: look, don't touch
Act 3 · Reading without leaking
Act 4 · The six-stage forge
Act 5 · Seven locks on the door
Act 6 · The hand-off only a human makes
Act 1 · The 11pm ticket
Let's be precise about why Maya's ticket is hard, because the difficulty is the whole point.
A help article is a general answer. Maya needs a specific one. To give it, something has to:
Pull up her real payment, her real booking, her real refund record.
Reason about whether they're consistent — paid, but the booking never confirmed, and nothing refunded is a contradiction.
Either explain the truth to her, or get a human to fix it.
That's not a chatbot. That's a technician: someone who opens the panel, reads the gauges, and diagnoses. The difference between reciting documentation and diagnosing a situation is the difference between a bot Maya resents and one that actually helps her.
But here's the catch that kills most "just give the bot database access" plans on contact. The instant our agent can read Maya's data, five new nightmares appear:
It could read someone else's data — the next ticket, with the wrong rows attached.
It could read columns it has no business seeing: password hashes, internal flags, secrets.
It could be talked into changing something by a cleverly worded message — prompt injection.
It's a hosted model, so showing it your database schema leaks your data model to a third party.
And it could lie — tell Maya "I've refunded you!" when it did nothing of the kind.
Any one of these turns a helpful agent into an incident. So before writing a line of it, we wrote down a single sentence and refused to soften it.
Act 2 · One rule: look, don't touch
The agent diagnoses from read-only live state, resolves what it can from a knowledge base, and escalates a proposed fix to a human when a change is needed. It never mutates anything itself. THE GREAT PART, it cant look anything it wants to, it looks ONLY what it supposed to!
Everything else is a consequence of taking that sentence literally.
Watch it work on Maya. The agent picks up her message and starts reasoning — not from a script, but freely, the way a model does. It decides it needs to know whether her payment and booking agree, so it calls a tool. The tool runs server-side, reads her records, and hands back not a pile of rows but a verdict: MISMATCH_HOLD_AFTER_PAYMENT — payment completed, booking still on hold. It calls a second tool: NO_REFUND. Now it has the truth. Charged, never confirmed, nothing returned.
No script told it to run those two checks in that order. It chose them. Which raises the obvious, scary question: if it reasons freely, what stops it from misbehaving?
The answer is the hinge of the whole design:
Safety here is structural, not behavioral. It doesn't depend on the model choosing to be good, and it doesn't depend on some branching logic catching every bad case. It depends on the box the model lives in.
Two facts define that box, and neither is a request the model can decline:
Its hands are read-only. The credential it reads through physically cannot write — and there is no tool in its toolbox that changes data. It couldn't refund Maya if it tried, because the capability was never built. The "write tool" simply does not exist. And read tools are limited + Agent wont pass the user identity to the tool (it can be hijacked). It syncs programatically during tool call.
It has exactly one way to affect the world: ask a human. A single
escalate_to_humanaction, loudly logged. That's the only lever. And it's told, in no uncertain terms, never to claim it made a change — because the only change it can cause is a person making one.
That's why we don't have to trust Maya's agent to behave. We just have to build the box correctly. The rest of this story is how the box is built.
(A note for the literal-minded: the runnable thing in our repo, exposer.py, is a runnable demo — it lets you watch this whole flow on a mocked or local database, every tool call and branch traced in your terminal. It's where you see the behavior, not the production server.)
Act 3 · Reading without leaking
For the agent to diagnose Maya, two things have to be true at once: it must be able to read enough to find the truth, and it must know enough about the product to interpret what it reads — all without ever holding anything dangerous.
How it reads: named tools, never a raw connection. The agent never gets a database handle or composes its own query. It gets a fixed menu of named, read-only tools, and we strongly prefer checkers over fetchers. A fetcher hands back raw state (get_booking → {status, amount, …}); a checker hands back a conclusion (check_payment_booking_consistency → MISMATCH…). Pushing the diagnosis server-side, into small deterministic checks, means the model reads an answer instead of deriving one — which is exactly why a mid-tier, even self-hosted tool-calling model (think MiniMax-2.5-class) stays reliable here. It mostly selects among conclusions and writes the reply, the part it's genuinely good at.
What it can read: whatever you allow — as long as it's read-only. Maya's state lives in a SQL database, but a real product's truth is often spread across more than one place. So the kit (that geenrates such utils that your support agent can use) first asks what read-only connection types the agent needs: a relational sql database (the default), an external http_api, a nosql store, or a custom read-only accessor. Each is held read-only by its own mechanism — a read-only role for SQL, GET/HEAD-only against an allowlisted endpoint for an API, a read-only credential plus owner filter for a store, a pure sandboxed function for custom — but the rule never changes: named, allowlisted, session-scoped, summarized, audited. Today the deployed agent executes the SQL ones; the others are specified for review with their executors as a documented next step.
What it knows: behavior, never mechanism. To interpret MISMATCH_HOLD_AFTER_PAYMENT, the agent leans on a knowledge base — but a very particular kind. It's written from the product's code, yet it describes only what the product does for users: the states a booking moves through, the rule that a refund only appears once a payment completes, what Maya sees when something fails. It contains no framework names, no field names, no file paths, and — critically — no security mechanism. "How do I sign in?" gets a plain behavioral article. "How are sessions handled?" is omitted entirely. The reasoning is blunt: this text is fed to a hosted model and shown to untrusted users, so anything technical in it is either a leak or an attack surface.
What it never learns: your schema. Showing a hosted model your real table and column names hands a third party your data model. So by default the model designs the tools blind — in business terms, against placeholders — and the real names are bound later, locally, on your machine. The model can describe the shape of the lock without ever seeing the key. (This applies to schema-backed connections; an API or a custom accessor has no schema to leak in the first place — its surface is just a reviewed allowlist.)
That's a choice, not a mandate, and it's worth being explicit about the two ends of it:
Blind (the safe default). The model never sees a real name. It designs against placeholders, and a small local tool binds the real schema to those placeholders on your own machine, with no model involved. Maximum protection; you do one extra local step.
Grounded (higher fidelity, if you accept the exposure). You point the building model at your actual schema — a
schema.sqldump or your live introspection — and it designs against real names directly. Less local work and tighter-fitting tools, at the cost of letting the hosted model see your data model. Reasonable for a non-sensitive schema or a self-hosted model; not what we'd reach for by default.
Either way the running agent never holds your schema — this choice is only about how much the building model sees while it designs the tools.
Act 4 · The six-stage forge
Everything so far assumed the agent already had a knowledge base, a set of tools, a playbook. Where did those come from? This is the crux, so we slow down: the agent that helped Maya was written by reading the product's own source code. Here is exactly how that conversion happens.
First, be precise about what does the building — because it's easy to mis-hear. There is no build program in the usual sense: no compiler, no pipeline server. The builder is Markdown — a bundle of skills and agents a capable CLI model reads and follows. But the Markdown only directs how the agent thinks during the build: what to look for in the code, what to write, what to refuse. It is not what keeps the shipped agent safe. The prohibitions that matter — read-only, no write tool, scope-from-session, the allowlists — are enforced programmatically, in the deployed agent and the database (that's all of Act 5). Markdown shapes the build; code enforces the cage. Safety never rides on the model obeying a paragraph.
So "compiling a codebase into a support kit" (Build Phase) means: a model reads your repo and writes the kit, held to a strict methodology with a human-review gate after every step. It runs as six ordered stages — and the first three are the actual conversion; the rest is scaffolding. Watch each one work on Maya's product.
Stage 1 — it reads for behavior, then forgets the code. First we build the harness — the knowledge base. The model walks the source, but it isn't cataloguing functions; for each file it asks "what can a user do here, and how does it actually behave?" It harvests the branches, the states a thing moves through, the limits, and every error path. Crucially, this happens in two passes: it writes one such note per file, independently — no file knows about the others yet — and only once every relevant file is summarized does it group anything. The grouping is a global decision made over the whole pile of notes, not a choice each file makes for itself; you can't know the booking screen and the booking API belong together until you've summarized both and can compare them side by side. So in that second pass it clusters those notes by what users do, merging the booking screen, the booking API, and the background job that expires a hold into one "Bookings" article — because Maya experiences one capability, not three layers. It writes that article in plain language ("a booking goes held → confirmed → active → completed, or is cancelled before it starts; a refund only becomes available once a payment has completed") and then runs a sanitize pass over its own output, hunting any framework name, field name, or security mechanism that leaked in and scrubbing it. What survives is behavior with the mechanism burned off — the knowledge base from Act 3.
What lands on disk is a small, navigable folder rather than one wall of text: an index that lists every topic with a one-line "when this is relevant" summary, plus one article per capability. Each article follows the same simple anatomy — what users can do, how it behaves step by step, the states it moves through and what causes each transition, what they see when it goes wrong, and pointers to related topics; every article also names, up top, what must never be exposed. That index isn't decoration: it's what lets the deployed agent pull only the one article a given question needs, instead of carrying the whole knowledge base in its head.
Stage 2 — it turns your failure paths into instruments. This is the cleverest move in the pipeline, so don't blink. The model reads the backend's data models and read endpoints — but it reads the error surface hardest, because every bad state your code can produce is a support ticket waiting to happen. That branch deep in the payment handler where a charge is captured but the booking is left on hold? That exact bad state is converted into a tool: check_payment_booking_consistency, a checker that returns the verdict MISMATCH_HOLD_AFTER_PAYMENT instead of raw rows. (Checkers over fetchers, always — the diagnosis is computed server-side so even a mid-tier model just reads a conclusion.) For each tool the model also specifies what gets enforced in code when it runs: it reads the user's own data, scoped by the session — never an id the model supplies — and returns a summary, not a dump. Maya's MISMATCH verdict — the one that cracked her case back in Act 2 — was written into existence right here, mined straight out of the error branch that caused her problem in the first place.
The trick that makes Stage 2 safe: it designs blind. The model never sees your real table or column names. It designs each tool in business terms against placeholders — "the bookings entity, scoped by its owner" — and emits a binding worksheet of those placeholders. The real names are filled in later, locally and off-model, by a small no-AI tool (support-binder) that introspects your actual schema on your machine and emits the read-only role. The model designs the shape of the lock; a human on a trusted machine cuts the key. (An API or custom accessor has no schema to leak in the first place — its surface is just a reviewed allowlist.)
Stage 3 — the same failure paths become the playbook and the exam. Every error branch the model inventoried in Stage 2 does double duty. Each becomes a runbook: a small decision tree for one symptom ("stuck on hold") whose every branch ends in exactly one of four outcomes — answer it, ask one thing, escalate as unknown, or escalate with a proposed fix. And because the model knows the failure path it started from, it can also emit a synthetic test ticket whose correct diagnosis and outcome are known by construction — a graded exam with the answer key written at the same moment as the question, before a single real ticket exists. Maya's "I paid but it's on hold" gets both: a runbook pointing the agent at the right check, and a test that proves the agent lands on escalate-with-a-fix rather than "all good." If a runbook ever needs a check no tool provides, that's a gap that loops straight back to Stage 2 — the backward arrow in the figure.
Stages 4–6 are scaffolding, not conversion. A persona (the agent's voice, plus the safety boundaries copied in verbatim — Act 5); config + secret slots (blanks only, read-path and write-path credentials kept rigorously apart); and the deployable agent with its bring-up scripts. Useful wiring — but it's wrapped around the three stages that actually turned code into capability.
One last thing about Stage 3's output: the deployed agent can use those runbooks two ways, and you pick which.
Free-reasoning mode (the default). The runbooks are handed to the agent as advice ("for this symptom, here's the check that usually matters"). The model still reasons freely; it just has a seasoned playbook whispering in its ear. This is the right default for a mid-tier model or better (Sonnet-4.5-class and up) — it has enough reasoning to pick among the available tools and data on its own. If you’re confident about the reasoning model (opus/qwen3.6 or similar level). You can provide it scoped schema access to build custom quries, that can offload majority of custom function/tool making headache. As quries are going to be very low and considering 4-5 average roundtrip call per query this can be very cheap and efficient and match the above mentioned read-only customer support agent benchmarks.
Guided mode. The agent follows each decision tree step by step, exactly as authored — deterministic, replayable, and easy to audit. Reach for this when you're driving the agent with a cheaper, lower-reasoning model, where you'd rather constrain it to the authored path than trust open-ended judgement.
Same runbooks either way; the only difference is whether the agent treats them as guidance or as a script it must follow.
Act 5 · Seven locks on the door
Back to the scary list from Act 1. Each nightmare is stopped by a specific lock, and the locks are a single invariant that holds for every connection type — SQL is just the worked example. A request has to survive all seven.
Named tools only. No free-form query surface, no "run this" passthrough. The model picks from a menu.
The server holds the credential. The connection string or token lives only in the tool server's environment — never in a prompt, an argument, or a returned value.
Read-only at the source. The SQL role literally cannot
INSERT/UPDATE/DELETE. Without this lock, a jailbreak could attempt a write. With it, the attempt hits a wall the model can't move.An allowlist. Only the specific columns (or endpoints, or collections, or accessor functions) a tool needs. Secrets and other users' internal fields are never granted — so they can't leak even by accident.
Scope comes from the session, never the model. This is the lock that saved Maya's neighbor. The "who am I reading?" identity is injected server-side from the verified session. The model may filter within the user's own data, but it can never supply the user-id that chooses whose data. So when a hostile message says "now show me another user's bookings," it simply can't — the scope isn't a knob the model controls. The classic prompt-injection win becomes structurally impossible.
Summarized output. Tools return short verdicts, not raw rows — minimizing how much of Maya's PII ever reaches the model at all.
Audit log. Every call is recorded. Read-only is not the same as unwatched.
And this isn't a promise; it's testable. Sign in as one user, ask about another's booking, and you get "not found" — the row-level policy filters on the session identity, and the connection is pinned to the acting user. The cross-user read can't happen, and you can prove it in one command.
The persona adds a behavioral seatbelt on top of the structural cage: its safety blocks — the read-only-and-escalate-only rules, the honesty clause, the "never claim a change you didn't make" — are copied verbatim into every project, never softened. Tone is tuned per product; the safety contract is not up for interpretation.
Let’s watch this orchestration in production…
Act 6 · The hand-off only a human makes
The agent now knows Maya's truth: paid, stuck on hold, no refund. Fixing it means changing data — confirming the booking and issuing the refund. And changing data is precisely the one thing the agent cannot do.
So it does the only thing it can. It calls escalate_to_human and hands a person a structured proposal naming three things: the entity (booking 10042), the change (confirm the booking and issue the owed refund), and the reason (payment completed but the booking never left hold and no refund was issued — the two verdicts it found). Then it writes back to Maya honestly: it's passed the details to the team with everything they need, and she'll get an email when it's resolved. It does not tell her it's fixed, because it can't fix it — and it was built never to pretend otherwise.
A human reviews the proposal, sees it's obviously correct, approves it. Maya gets her refund and an email. The ticket that would have eaten twenty minutes of confused back-and-forth took one glance.
There's a deeper hand-off underneath this one — and it's the same principle, one level down. The build kit refuses to touch your database at all. No skill, no agent ever connects to it, runs the access migration, or even holds a connection string. That job goes to a small, separate, local tool with no AI in it (support-binder): you run it on your own machine with an admin connection, it introspects your real schema, you choose what the agent may read, and it emits the read-only role and policies as reviewable SQL. It doesn't apply them — you do, with your own privileged connection. The hosted model never learns your real schema, and a human is always the one who creates the credential and runs the migration.
It's a single command, the same on Windows, macOS, and Linux, with no separate install step — point it at an admin connection and your kit:
py tools/support-binder/run.py --kit ../your-app-harness/support-kit
It walks you through choosing the tables, the columns, and the per-row owner scope, then writes the migration for you to read and apply.
It's the same sentence from Act 2, all the way down: the AI proposes and reads; a human creates credentials, applies migrations, and approves changes. The boundary isn't enforced once — it's enforced in three independent places: the tool catalog has no write tool, the database role can't write, and the persona's locked rules forbid claiming otherwise. Three locks for one door, because that door is the one that matters.
Maya's product wasn't special
Nothing in this story depended on Business specific use-case. Re-read the six acts and notice what the builder actually consumed: the code's behavior, its failure paths, and its data surfaces. Every product has those three things. None of it was a business rule we hand-coded.
That's why it ships as one repo — the skills, the agents, and the local utils (support-binder and the runnable demo) — instead of a tied npm/pip package (tbh it has to be too flexible and i am working on another projects, feel free to create for your org if you want xD). It's built for the shape almost every modern product already has: a frontend + a backend + microservices + a database. Map the pipeline onto that shape and it lines up exactly:
The frontend → the behavior-only knowledge base (Stage 1). Whatever the domain, users do things and see states; that's all the harness needs.
The backend → its read paths and error surface become the checkers, runbooks, and synthetic evals (Stages 2–3). "Booking stuck on hold" was just one product's instance of a universal shape — an entity stuck in a bad state. Your product has its own list; the builder finds it by reading your code, not by being told.
Microservices → the agent doesn't care that the truth is scattered across services. Each service is just another read-only connection: one behind a read API is
http_api, one with its own store issqlornosql, a cross-service derived check iscustom. One catalog can span many services — every tool tagged with where it reads, every one read-only.The database (any flavor) → the connection types plus the schema-blind design mean no table name, no business schema, and no domain policy is ever baked into the bundle. The specifics are learned from your code and bound locally at setup.
So the business-specific constraints aren't an obstacle the bundle has to be taught — they're the input it reads. Point it at a fintech ledger, a telehealth portal, or a logistics tracker, and the conversion runs identically; only the harvested behavior and failure surface differ. Even the voice adapts without touching safety: the persona's tunable register goes formal for finance or health and casual for consumer apps, while its locked safety blocks stay byte-for-byte identical across every project.
The promise underneath all of it: copy two folders, answer a handful of setup questions, run it. What makes your product yours — its flows, its edge cases, its data model — is exactly what the agent learns by reading it, not something you hand-code into a bot.
What Maya never saw
She got a fast, honest answer and her money back. What she never saw was everything that couldn't happen on the way there: her neighbor's bookings stayed invisible, the schema stayed on your servers, no secret crossed into the model's context, and at no point could the agent have "fixed" anything by pretending. It diagnosed, it grounded its answer in the product's real behavior, and it asked a human for the one thing only a human should do.
That's the whole idea: an AI genuinely useful at support — because it can see your real, live situation — while being incapable, by construction, of the things you'd never want it to do. Not a bot you have to trust. A bot you don't have to.
The orchestration, blueprinted
We followed one ticket all the way through the machine. Now step back and look at the whole orchestration at once. It isn't one program — it's three planes that hand off to each other, bound by a single invariant that holds across all of them.
Plane 1 — the build (your code → a support kit). A capable CLI model, steered by a bundle of skills and agents, reads your repository and forges the kit in six gated stages. Nothing here runs in production: it runs once, on a developer's machine, and a human signs off after every stage. What comes out is a support-kit/ folder — the behavior-only knowledge base, the read-only tool catalog with its access SQL, the advisory runbooks and synthetic evals, the persona, the config and secret slots, and a deployable agent. The skills shape how the model thinks during this build; they are not what keeps the shipped agent safe.
Plane 2 — the run (the deployed agent). The shipped agent loads that kit. A tool-calling model reasons over the user's message and reaches the world only through named, read-only tools behind one adapter boundary (SQL today; API, NoSQL, and custom accessors are specified for review). It reads verdicts, not rows; it leans on the runbooks as advice, not a script; and when a fix requires changing data, it pulls the only lever it has — escalate_to_human. The thing that actually applies an approved change is a separate, privileged executor that never shares the agent's process or its credentials.
In practice you wire this in one of two shapes: a standalone service the agent runs as, or a new route group inside your existing backend — whichever fits your deployment. Two details matter at reply time. The persona is sent on every single call — its voice and its locked safety rules ride along with each message, so they can't be skipped. The knowledge-base articles, by contrast, load on demand: the agent consults the index, decides which one topic the question actually touches, and pulls just that article — it doesn't haul the whole knowledge base into context. The loop itself is the ordinary tool-calling cycle — the model asks for a read-only check, the server runs it and hands back a short verdict, the model reads the verdict and either answers, asks one clarifying thing, or escalates.
Plane 3 — the local bench (the human, off-model). Between build and run sits the work no model is allowed to do. support-binder binds the blind design to your real schema on your own machine and emits the scoped read-only role and row-level-security policies as reviewable SQL; a human applies the migration with a privileged connection, fills the segregated secrets, and approves each escalated proposal. The hosted model never sees your schema, never holds a connection string, and never applies a thing.
The invariant that crosses all three. Whichever plane you're looking at, the same five structural facts hold — and none of them is a request the model can decline: there is no write tool in the catalog, the database role is read-only and RLS-scoped to the acting user, scope comes from the verified session and never the model, the tools are designed schema-blind, and the persona's safety blocks are copied verbatim into every project. The story changes per product; this cage does not.
Enough talk — what about implementation?
Enough theory. Here is the part you can pick up today — and the part that, on purpose, is left for you.
What's in the box, ready now. This ships as one repo that drops onto the shape almost every product already has — a frontend, a backend, microservices, and a SQL database (Postgres/Supabase first-class):
The methodology — five skills (an orchestrator plus the four stage skills) and single agent (
support-architect). Copy.claude/skills/and.claude/agents/into your CLI, point them at your repo, and the kit builds itself stage by stage with a review gate after each. A persona template ships alongside, so the agent's voice and its locked safety rules start from a reviewed baseline rather than a blank file.The off-model database tool —
support-binder, a small no-AI CLI that introspects your real schema locally and emits the scoped read-only role and RLS policies as reviewable SQL. You apply it; it never does. It's one cross-platform command (py tools/support-binder/run.py --kit ...) — no separate install.A runnable demo —
exposer.pydrives the whole flow on a mocked or live database with every tool call and branch traced in your terminal, so you can watch it work before you trust it. A privileged-executor stub marks the write path.A reference stack to copy from — a worked example database (schema + seed + read-only role) and the config/secret templates, so you're matching a working shape rather than starting from a blank page.
What's deferred — the last ~20%, and why. The remaining stretch isn't missing; it's deliberately left open, because it's exactly where your specifics live:
The LLM client wiring. Which model and provider drive the deployed agent is your call — it only has to support tool calling. We don't marry the kit to one vendor, so the integration that picks and wires your client is yours.
The privileged write path. Actually applying an approved change is domain-specific and high-stakes, so it ships as a reviewed stub for you to implement against your own system — not a black box that writes to your data on day one.
Use-case and industry integration. The escalation channels (a Telegram alert, a Gmail/email notification, a ticket in your own tool — your choice), compliance posture, and the real schema binding are tied to your industry's practices and stay local, off-model, and in your hands.
These seams are open because they differ across every LLM client and every industry; baking in one choice would make the bundle less, not more, useful.
So treat this as a proposed approach and an ~80% setup: copy two folders, answer a handful of setup questions, run the pipeline, do the one local database step — and the build is genuinely done. The last stretch — the orchestration that ties it to your model and your domain — is the part only you can wire. Now it's on you to orchestrate it and make the magic flow.
Github Repo
Includes the support-kit generation agent + skills, an integration.md completing the remaining flow how this concept or generated support kit will be orchestrated in production.
References & Supporting documents. (Statistics claims are not made up in the air or mindlessly AI thrown!)
IT Support Levels Explained From Tier 0 to Tier 4 - InvGate's Blog
5 support tier levels explained: How to set them up - Zendesk
Help Desk Categories & Subcategories - All Support Ticket - Suptask
What Is Tier 1 vs. Tier 2 vs. Tier 3 Help Desk Support? - Red River
What is ticket deflection (& how to improve its rate)? - Atera
How MSPs Can Reduce Tickets by 30-40% Through Automation - Rev.io
Tier 1 deflection: The complete guide for B2B customer service ...
AI workflow: what it is and how to build one that works - Neople
The 4 most important SaaS customer service metrics - PartnerHero
Service Desk Engineer vs. Technical Support Engineer: What's the ...
Support Engineer: Role Blueprint, Responsibilities, Skills, KPIs, and Career Path
Issue Category Distribution: Analysis & Optimization - Count.co
Ticket Deflection Fully Examined Plus Strategies & How-To's | Giva
Adding an AI agent to our SaaS, but terrified of cross-tenant data ...
AI Support Trust Metrics: Beyond Deflection Rate | Fini Labs
Five Critical AI Agent Security Risks and How to Fix Them Before You Ship - Auth0
Best 9 ways to reduce support tickets in 2026 - Guideflow Blog
