Risk watcher
risk-watcher v1Watches for the signs that a customer is leaving and raises them early enough that somebody can still act. It confirms a signal against the account record before anybody is told, sets the usage trend beside the support history and the invoices, and writes one reason in words that the work can start from. The reason carries a severity and a date by which somebody must act, and it goes to the account owner with the evidence attached rather than as a score. Afterwards it reads the same evidence again to see whether the signal turned.
What it is granted, and what it hands to a person
This diagram shows which systems the agent may reach, which processes it works in, and what it hands to a person. Everything drawn here is written down in the document, and an abstract agent is worth having only if both edges of it are.
Runs assessment three times: on the signal, before anybody hears about it; on how likely the account is to leave, against the risk model at a version; and on how bad it is against the severity scale, with the date somebody must act by. Runs collect-and-report over the signal for as long as a run is open, and the same assessment on a cadence beside a renewal conversation from the day it opens until the signature. Takes the usage trend from the usage-monitor agent and the standing from the account-monitor agent, hands the reason and its evidence to the account owner, and hands the severity and the clock to the renewal-manager agent, who convenes the save plan.
What is in the package
5 skills and the systems they need, written to version 1.1.0 of the Agent Plugins standard. Nothing in these files names a product. The package says which systems the agent needs and what it does with each one, and you say which of your systems fills each role when you set it up.
# Where this abstract agent stops Does not decide what to do about the risk. The save plan is agreed by the account owner with the renewal-manager agent and delivery, and what it may cost is priced by the quote-builder agent and signed by a person. Does not contact the customer or promise anything, and nothing is offered that the signed plan does not contain. Does not measure usage or read the account's standing itself. Does not replace a reason with a score: a score alone does not open a plan, which is the difference between this job and a churn model. ## What always goes to a person - a confirmed risk, to the account owner inside the time the policy sets, with the evidence attached rather than a score - a plan that was agreed and not done by the date it was promised, up for a decision rather than waiting for the next reading - a signal that does not turn after a second reason has been named and worked, up rather than around the same loop again - a customer who has gone quiet against a notice date, to the account owner with the days remaining named - a source that keeps raising signals the account record contradicts, to whoever owns that model, because a source that cries wolf stops being read
# The records this abstract agent must leave
This is the contract. An agent implementing `risk-watcher` leaves the
following behind, on every run.
Per risk: the signal, what raised it, the date, and the account it is
against. The confirmation against the account record, or the
contradiction that closed the run without anybody being told. One
reason, in words, with the evidence lines that support it, each naming
the system it was read from and the date. The severity, the scale
version it was set against, and the date somebody must act by. What the
account owner was told and when they were told it. The readings taken
again against the reason after the plan was delivered, set beside what
the customer was promised. Whether the risk cleared, stayed open or went
up, and a departure written with its reason, what was tried, what it
cost and what the customer said, readable by everyone who works
renewals.
An agent that leaves less than this does not implement `risk-watcher`,
whatever else it does well.
# The systems this abstract agent needs
Seven systems, named by role rather than by product. The access level is
the most this work needs, and a deployment that grants more is granting
more than the job requires.
| Role | Access | What the access is for |
|---|---|---|
| the usage record | read | Where use fell, when, and for which team. |
| the support system | read | Open tickets and anything in dispute. |
| the billing system | read | Unpaid invoices, and what is in collections. |
| the CRM | read | Which named contacts are still there and which have left. |
| the agreement store | read | The notice date the clock is set against. |
| the risk record | write | The reason, the severity and the outcome. |
| the notification channel | write | The owner is told inside the time the policy sets. |
Whoever builds an agent from this plugin writes the `mcp.json` that
points these roles at their own systems. Nothing here names a product,
so the same package works whatever you already run.
{
"$schema": "https://agent-plugins.org/schemas/1.1.0/plugin.schema.json",
"name": "risk-watcher",
"version": "1.0.0",
"description": "The risk-watcher abstract agent. Watches for the signs that a customer is leaving and raises them early enough that somebody can still act.",
"author": {
"name": "AgentCatalog",
"url": "https://agentcatalog.com"
},
"homepage": "https://agentcatalog.com/abstract-agents/risk-watcher",
"repository": "https://github.com/jeffrschneider/agentcatalog",
"license": "CC-BY-4.0",
"keywords": [
"abstract-agent",
"reference",
"sales",
"work-a-churn-risk",
"close-a-renewal",
"open-a-renewal",
"abstract"
],
"extensions": {
"com.agentcatalog.agent": {
"agent": "risk-watcher",
"agentVersion": 1,
"department": "sales",
"abstract": true,
"works": "Runs assessment three times: on the signal, before anybody hears about it; on how likely the account is to leave, against the risk model at a version; and on how bad it is against the severity scale, with the date somebody must act by. Runs collect-and-report over the signal for as long as a run is open, and the same assessment on a cadence beside a renewal conversation from the day it opens until the signature. Takes the usage trend from the usage-monitor agent and the standing from the account-monitor agent, hands the reason and its evidence to the account owner, and hands the severity and the clock to the renewal-manager agent, who convenes the save plan.",
"servers": [
{
"name": "the usage record",
"role": "usage-record",
"access": "read",
"needs": "Where use fell, when, and for which team."
},
{
"name": "the support system",
"role": "support-system",
"access": "read",
"needs": "Open tickets and anything in dispute."
},
{
"name": "the billing system",
"role": "billing-system",
"access": "read",
"needs": "Unpaid invoices, and what is in collections."
},
{
"name": "the CRM",
"role": "crm",
"access": "read",
"needs": "Which named contacts are still there and which have left."
},
{
"name": "the agreement store",
"role": "agreement-store",
"access": "read",
"needs": "The notice date the clock is set against."
},
{
"name": "the risk record",
"role": "risk-record",
"access": "write",
"needs": "The reason, the severity and the outcome."
},
{
"name": "the notification channel",
"role": "notification-channel",
"access": "write",
"needs": "The owner is told inside the time the policy sets."
}
],
"records": [
"Per risk: the signal, what raised it, the date, and the account it is against.",
"The confirmation against the account record, or the contradiction that closed the run without anybody being told.",
"One reason, in words, with the evidence lines that support it, each naming the system it was read from and the date.",
"The severity, the scale version it was set against, and the date somebody must act by.",
"What the account owner was told and when they were told it.",
"The readings taken again against the reason after the plan was delivered, set beside what the customer was promised.",
"Whether the risk cleared, stayed open or went up, and a departure written with its reason, what was tried, what it cost and what the customer said, readable by everyone who works renewals."
],
"escalates": [
"a confirmed risk, to the account owner inside the time the policy sets, with the evidence attached rather than a score",
"a plan that was agreed and not done by the date it was promised, up for a decision rather than waiting for the next reading",
"a signal that does not turn after a second reason has been named and worked, up rather than around the same loop again",
"a customer who has gone quiet against a notice date, to the account owner with the days remaining named",
"a source that keeps raising signals the account record contradicts, to whoever owns that model, because a source that cries wolf stops being read"
],
"not": [
"Does not decide what to do about the risk.",
"The save plan is agreed by the account owner with the renewal-manager agent and delivery, and what it may cost is priced by the quote-builder agent and signed by a person.",
"Does not contact the customer or promise anything, and nothing is offered that the signed plan does not contain.",
"Does not measure usage or read the account's standing itself.",
"Does not replace a reason with a score: a score alone does not open a plan, which is the difference between this job and a churn model."
],
"processes": [
{
"process": "ref/sls/close-a-renewal",
"activities": [
"Work the Response"
]
},
{
"process": "ref/sls/open-a-renewal",
"activities": [
"Score the Risk of Leaving"
]
},
{
"process": "ref/sls/work-a-churn-risk",
"activities": [
"Take in the Risk Signal",
"Confirm the Signal",
"Name the Reason",
"Set the Severity and the Clock",
"Tell the Account Owner",
"Watch for the Signal to Turn",
"Close or Escalate the Risk",
"Record the Save or the Departure"
]
}
]
}
}
}
# risk-watcher This is an abstract agent, published as an Agent Plugin. An abstract agent is a job description rather than an implementation. It says what the work is, which systems it needs and at what access, what it must leave behind, and where it stops. Any agent that leaves the records can implement it. The plugin carries five skills, no `mcp.json`, and everything the abstract agent owes under `com.agentcatalog.agent/`. ## Why there is no mcp.json A conformant server entry in `mcp.json` has to declare a transport and then either a `command` to launch or a `url` to connect to. An abstract agent has neither, because it does not know which product holds your records. Writing placeholder URLs would produce a plugin that loads and then fails to connect, which is worse than one that says nothing. Section 6.2 makes a missing component location not an error, so the file is absent and the systems this abstract agent needs are declared instead under `extensions["com.agentcatalog.agent"].servers`, as a role, an access level and what the access is for. Whoever builds an agent from this plugin writes the `mcp.json` that points those roles at their own systems, so nothing here depends on a particular supplier. ## Why the obligations are in an extension The specification defines two component types, skills and MCP servers, and both describe what a plugin can do. An abstract agent's contract is mostly the other half: the records it must leave, what it escalates, and what it must not do. There is no portable field for any of that, so it lives in a reverse-domain namespace as section 8 requires, in the manifest and in the directory of the same name. ## Where this abstract agent is used `ref/sls/close-a-renewal`, `ref/sls/open-a-renewal`, `ref/sls/work-a-churn-risk`. The list is generated from the activity tables of the processes that name it. https://agentcatalog.com/abstract-agents/risk-watcher
--- name: name-one-reason-in-words description: Writes one reason, in words, that the work can start from, with the evidence lines that support it. Use it when running `ref/sls/work-a-churn-risk`. license: CC-BY-4.0 metadata: agent: risk-watcher agent-version: "1" --- # Name one reason in words ## What it does Writes one reason, in words, that the work can start from, with the evidence lines that support it. Each line names the system it was read from and the date it was read. ## Where it happens The agent does this in one activity across one reference process. Each one names the activity as that process words it. - **Name the Reason** - `ref/sls/work-a-churn-risk`, activity 5 - [Work a Churn Risk](../../../../processes/sales/work-a-churn-risk.md) ## What to record Per risk: the signal, what raised it, the date, and the account it is against. The confirmation against the account record, or the contradiction that closed the run without anybody being told. One reason, in words, with the evidence lines that support it, each naming the system it was read from and the date. The severity, the scale version it was set against, and the date somebody must act by. What the account owner was told and when they were told it. The readings taken again against the reason after the plan was delivered, set beside what the customer was promised. Whether the risk cleared, stayed open or went up, and a departure written with its reason, what was tried, what it cost and what the customer said, readable by everyone who works renewals. That contract covers every activity this abstract agent takes on, and it is repeated in `com.agentcatalog.agent/RECORDS.md`. What the abstract agent does not do is in `com.agentcatalog.agent/NOT.md`.
--- name: read-the-evidence-again-and-close-the-run description: Reads the same evidence again after the plan was delivered to see whether the signal turned, then closes the risk or puts it up, and records the save or the departure with what was tried, what it cost and what the customer said. Use it when running `ref/sls/work-a-churn-risk`. license: CC-BY-4.0 metadata: agent: risk-watcher agent-version: "1" --- # Read the evidence again and close the run ## What it does Reads the same evidence again after the plan was delivered to see whether the signal turned, then closes the risk or puts it up, and records the save or the departure with what was tried, what it cost and what the customer said. ## Where it happens The agent does this in three activities across one reference process. Each one names the activity as that process words it. - **Close or Escalate the Risk** - `ref/sls/work-a-churn-risk`, activity 14 - [Work a Churn Risk](../../../../processes/sales/work-a-churn-risk.md) - **Record the Save or the Departure** - `ref/sls/work-a-churn-risk`, activity 15 - [Work a Churn Risk](../../../../processes/sales/work-a-churn-risk.md) - **Watch for the Signal to Turn** - `ref/sls/work-a-churn-risk`, activity 13 - [Work a Churn Risk](../../../../processes/sales/work-a-churn-risk.md) ## What to record Per risk: the signal, what raised it, the date, and the account it is against. The confirmation against the account record, or the contradiction that closed the run without anybody being told. One reason, in words, with the evidence lines that support it, each naming the system it was read from and the date. The severity, the scale version it was set against, and the date somebody must act by. What the account owner was told and when they were told it. The readings taken again against the reason after the plan was delivered, set beside what the customer was promised. Whether the risk cleared, stayed open or went up, and a departure written with its reason, what was tried, what it cost and what the customer said, readable by everyone who works renewals. That contract covers every activity this abstract agent takes on, and it is repeated in `com.agentcatalog.agent/RECORDS.md`. What the abstract agent does not do is in `com.agentcatalog.agent/NOT.md`.
--- name: score-how-likely-the-account-is-to-leave description: Scores the account against the risk model at a version, and keeps scoring it on a cadence while a renewal conversation is open, so what the customer says back to an offer is read against the same evidence. Use it when running `ref/sls/close-a-renewal` and `ref/sls/open-a-renewal`. license: CC-BY-4.0 metadata: agent: risk-watcher agent-version: "1" --- # Score how likely the account is to leave ## What it does Scores the account against the risk model at a version, and keeps scoring it on a cadence while a renewal conversation is open, so what the customer says back to an offer is read against the same evidence. ## Where it happens The agent does this in two activities across two reference processes. Each one names the activity as that process words it. - **Score the Risk of Leaving** - `ref/sls/open-a-renewal`, activity 7 - [Open a Renewal](../../../../processes/sales/open-a-renewal.md) - **Work the Response** - `ref/sls/close-a-renewal`, activity 9 - [Close a Renewal](../../../../processes/sales/close-a-renewal.md) ## What to record Per risk: the signal, what raised it, the date, and the account it is against. The confirmation against the account record, or the contradiction that closed the run without anybody being told. One reason, in words, with the evidence lines that support it, each naming the system it was read from and the date. The severity, the scale version it was set against, and the date somebody must act by. What the account owner was told and when they were told it. The readings taken again against the reason after the plan was delivered, set beside what the customer was promised. Whether the risk cleared, stayed open or went up, and a departure written with its reason, what was tried, what it cost and what the customer said, readable by everyone who works renewals. That contract covers every activity this abstract agent takes on, and it is repeated in `com.agentcatalog.agent/RECORDS.md`. What the abstract agent does not do is in `com.agentcatalog.agent/NOT.md`.
--- name: set-the-severity-and-tell-the-owner description: Sets how bad it is against the severity scale at a version, with the date somebody must act by, and tells the account owner inside the time the policy sets. Use it when running `ref/sls/work-a-churn-risk`. license: CC-BY-4.0 metadata: agent: risk-watcher agent-version: "1" --- # Set the severity and tell the owner ## What it does Sets how bad it is against the severity scale at a version, with the date somebody must act by, and tells the account owner inside the time the policy sets. The owner gets the reason and the evidence, not a score. ## Where it happens The agent does this in two activities across one reference process. Each one names the activity as that process words it. - **Set the Severity and the Clock** - `ref/sls/work-a-churn-risk`, activity 6 - [Work a Churn Risk](../../../../processes/sales/work-a-churn-risk.md) - **Tell the Account Owner** - `ref/sls/work-a-churn-risk`, activity 7 - [Work a Churn Risk](../../../../processes/sales/work-a-churn-risk.md) ## What to record Per risk: the signal, what raised it, the date, and the account it is against. The confirmation against the account record, or the contradiction that closed the run without anybody being told. One reason, in words, with the evidence lines that support it, each naming the system it was read from and the date. The severity, the scale version it was set against, and the date somebody must act by. What the account owner was told and when they were told it. The readings taken again against the reason after the plan was delivered, set beside what the customer was promised. Whether the risk cleared, stayed open or went up, and a departure written with its reason, what was tried, what it cost and what the customer said, readable by everyone who works renewals. That contract covers every activity this abstract agent takes on, and it is repeated in `com.agentcatalog.agent/RECORDS.md`. What the abstract agent does not do is in `com.agentcatalog.agent/NOT.md`.
--- name: take-in-a-signal-and-confirm-it description: Takes in a signal that a customer may be leaving and tests it against the account record before anybody is told. Use it when running `ref/sls/work-a-churn-risk`. license: CC-BY-4.0 metadata: agent: risk-watcher agent-version: "1" --- # Take in a signal and confirm it ## What it does Takes in a signal that a customer may be leaving and tests it against the account record before anybody is told. A signal the record contradicts closes the run there, with the contradiction written down. ## Where it happens The agent does this in two activities across one reference process. Each one names the activity as that process words it. - **Confirm the Signal** - `ref/sls/work-a-churn-risk`, activity 2 - [Work a Churn Risk](../../../../processes/sales/work-a-churn-risk.md) - **Take in the Risk Signal** - `ref/sls/work-a-churn-risk`, activity 1 - [Work a Churn Risk](../../../../processes/sales/work-a-churn-risk.md) ## What to record Per risk: the signal, what raised it, the date, and the account it is against. The confirmation against the account record, or the contradiction that closed the run without anybody being told. One reason, in words, with the evidence lines that support it, each naming the system it was read from and the date. The severity, the scale version it was set against, and the date somebody must act by. What the account owner was told and when they were told it. The readings taken again against the reason after the plan was delivered, set beside what the customer was promised. Whether the risk cleared, stayed open or went up, and a departure written with its reason, what was tried, what it cost and what the customer said, readable by everyone who works renewals. That contract covers every activity this abstract agent takes on, and it is repeated in `com.agentcatalog.agent/RECORDS.md`. What the abstract agent does not do is in `com.agentcatalog.agent/NOT.md`.
Every server entry in an mcp.json needs either a command to run or a url to connect to, and the package cannot know either of those until somebody points it at their own systems. So the file is left out, the systems the agent needs are named by role in plugin.json, and you write the mcp.json when you set it up.
Point it at your systems
To run an agent built from this package, write an mcp.json that says which of your systems fills each role. The package names these 7 roles, and the access level beside each one is the most the work needs.
{
"$schema": "https://agent-plugins.org/schemas/1.1.0/mcp.schema.json",
"mcpServers": {
"usage-record": {
"type": "streamable-http",
"url": "https://mcp.yourcompany.com/usage-record"
},
"support-system": {
"type": "streamable-http",
"url": "https://mcp.yourcompany.com/support-system"
},
"billing-system": {
"type": "streamable-http",
"url": "https://mcp.yourcompany.com/billing-system"
},
"crm": {
"type": "streamable-http",
"url": "https://mcp.yourcompany.com/crm"
},
"agreement-store": {
"type": "streamable-http",
"url": "https://mcp.yourcompany.com/agreement-store"
},
"risk-record": {
"type": "streamable-http",
"url": "https://mcp.yourcompany.com/risk-record"
},
"notification-channel": {
"type": "streamable-http",
"url": "https://mcp.yourcompany.com/notification-channel"
}
}
}
The hostnames here are a placeholder for your own. Whichever product holds each of these systems, the agent you build is yours and nobody else has to be involved in running it.
3 processes, 10 activities
The highlighted activities are the ones this abstract agent does. The other activities in each process belong to other abstract agents or to people.
Work the Response
Score the Risk of Leaving
Take in the Risk Signal · Confirm the Signal · Name the Reason · Set the Severity and the Clock · Tell the Account Owner · Watch for the Signal to Turn · Close or Escalate the Risk · Record the Save or the Departure
What it writes down
Per risk: the signal, what raised it, the date, and the account it is against. The confirmation against the account record, or the contradiction that closed the run without anybody being told. One reason, in words, with the evidence lines that support it, each naming the system it was read from and the date. The severity, the scale version it was set against, and the date somebody must act by. What the account owner was told and when they were told it. The readings taken again against the reason after the plan was delivered, set beside what the customer was promised. Whether the risk cleared, stayed open or went up, and a departure written with its reason, what was tried, what it cost and what the customer said, readable by everyone who works renewals.
What it will not do
Does not decide what to do about the risk. The save plan is agreed by the account owner with the renewal-manager agent and delivery, and what it may cost is priced by the quote-builder agent and signed by a person. Does not contact the customer or promise anything, and nothing is offered that the signed plan does not contain. Does not measure usage or read the account's standing itself. Does not replace a reason with a score: a score alone does not open a plan, which is the difference between this job and a churn model.
These limits are written into the job on purpose, so that everyone adopting the process knows which decisions stay with a person.
Who has built one, and how far each one got
Nobody has built one yet. The catalog says so rather than leaving the section off, because an empty list is a fact about the document.
implements: risk-watcher v1
One line in your agent's manifest. The catalog checks it against the records your runs actually leave.
The closest things in the catalog, by description
Nobody above has claimed any of these. This is the nearest match by wording between the job written above and what publishers wrote about their own listings, closest first, and wording is not evidence: some of these will be wrong, and a job with nothing suitable still gets whatever was nearest. The publishers have never heard of this abstract agent and have promised nothing about it. What a claim looks like is in the table above, and it is signed.
Things that could be the worker: an agent, a packaged product, a plugin.
- The Website Specification — A2A agent Agent · specification.website Read-only A2A agent that answers natural-language questions about The Website Specification and returns matching topics with status, canonical URL,…
Not workers. These are capability that whatever does the job would use, which is a different relationship and kept in its own column for that reason.
- blackwall MCP server · blackwalltier.com · run it yourself · mirrored from the MCP registry Pre-action risk gate: AI agents call before any irreversible action (money, SQL, delete).
- fundzwatch MCP server · fund-z.github.io · run it yourself · mirrored from the MCP registry Business-event intelligence for AI agents: funding, exec moves, UCC and benefit-plan signals.
- BounceWatch Signal Intelligence MCP server · bouncewatch.com · hosted · mirrored from the MCP registry Millions of dated buying and momentum signals: who raised, who's hiring, what changed and when