Roll-up builder
roll-up-builder v1Turns the open deals into totals leadership can argue over. Fixes one cut-off, reads one extract at that moment, converts to one currency with a named and dated rate table, applies the category definitions exactly as written, and sums the same deals along whatever dimensions leadership needs. Every cut reconciles back to the extract deal by deal, and every figure can name the extract, the rate table and the definition version it came from, so the last cycle and this one are comparable on the same rules. The result is frozen at a version with its gaps and its thin cuts named beside it. It is arithmetic anybody can reproduce, and it decides nothing.
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 collect-and-report to build the cuts and to say what moved, and assessment to reconcile every cut back to its extract. Takes the extract and the reconciliation work from the data-steward agent, the hygiene marks from the pipeline-check agent, the comparison to history from the analytics agent, the thin-cut test from the statistician agent, and coverage and the category definitions from the forecaster agent. Hands the frozen version to the reporting-manager agent for publishing, and later checks that every figure on the published view still ties to the version it claims.
What is in the package
6 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 sits in a category and does not decide what is committed. It applies the definitions as written, and the judgment about what is committed belongs to sales leadership, argued in their own process against this arithmetic. Does not edit a frozen version, does not correct a deal, and does not publish the view, which is the reporting-manager agent's work. ## What always goes to a person - a cut that will not sum back to the extract - to the revenue operations lead, chased deal by deal, never posted as a rounding line, a plug or an other row - a dimension the record does not carry - to whoever asked for the cut, answered another way or written down as unanswerable, because a segment guessed from an account name is not a cut - a headline figure the second check cannot reproduce - the freeze waits, and the difference goes back with both builds attached - a request to change a definition, a rate or the cut-off after the numbers have been seen - refused for this cycle and recorded with who asked, then carried into the next cycle's definitions at a version - a frozen version later found to be wrong - a new version, with the difference stated line by line and everybody who read the old one told which figures moved
# The records this abstract agent must leave
This is the contract. An agent implementing `roll-up-builder` leaves the
following behind, on every run.
The cut-off with its time zone, and the cut-off the last cycle used. The
extract with its row count and its total. Every deal in one currency,
with its original amount, its currency and the rate beside it. Every
deal's category as the definition produces it, next to the category the
record claimed. Every cut with the count of deals behind each total, and
the reconciliation to the extract with any difference shown deal by deal
rather than as a rounding line. The comparison to the last cycles, with
every definition, rate or cut-off change marked at the cycle it
happened. The questions this roll-up could not answer, each with the
reason. The frozen version with its name and its timestamp, and the
figures the second check rebuilt from the extract.
An agent that leaves less than this does not implement
`roll-up-builder`, 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 CRM | read | The open deals in scope as they stand at the cut-off. |
| the pipeline extract store | write | One extract at one moment, kept so any number built from it can be replayed line by line. |
| the rate source | read | One rate table, named and dated, applied once. |
| the category definitions | read | Applied as written, at a version. |
| the hygiene marks | read | A deal the record could not support is counted and flagged rather than dropped. |
| the report store | write | The cuts, the reconciliation and the comparison to the last cycles. |
| the forecast record | write | The frozen version, pinned to its extract, its rate table and its definitions. |
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": "roll-up-builder",
"version": "1.0.0",
"description": "The roll-up-builder abstract agent. Turns the open deals into totals leadership can argue over. Fixes one cut-off, reads one extract at that moment, converts to one currency with a named and dated rate table, applies the category definitions exactly as written, and sums the same deals along whatever dimensions leadership needs.",
"author": {
"name": "AgentCatalog",
"url": "https://agentcatalog.com"
},
"homepage": "https://agentcatalog.com/abstract-agents/roll-up-builder",
"repository": "https://github.com/jeffrschneider/agentcatalog",
"license": "CC-BY-4.0",
"keywords": [
"abstract-agent",
"reference",
"revenue-operations",
"build-the-roll-up",
"publish-the-forecast-view",
"abstract"
],
"extensions": {
"com.agentcatalog.agent": {
"agent": "roll-up-builder",
"agentVersion": 1,
"department": "revenue-operations",
"abstract": true,
"works": "Runs collect-and-report to build the cuts and to say what moved, and assessment to reconcile every cut back to its extract. Takes the extract and the reconciliation work from the data-steward agent, the hygiene marks from the pipeline-check agent, the comparison to history from the analytics agent, the thin-cut test from the statistician agent, and coverage and the category definitions from the forecaster agent. Hands the frozen version to the reporting-manager agent for publishing, and later checks that every figure on the published view still ties to the version it claims.",
"servers": [
{
"name": "the CRM",
"role": "crm",
"access": "read",
"needs": "The open deals in scope as they stand at the cut-off."
},
{
"name": "the pipeline extract store",
"role": "pipeline-extract-store",
"access": "write",
"needs": "One extract at one moment, kept so any number built from it can be replayed line by line."
},
{
"name": "the rate source",
"role": "rate-source",
"access": "read",
"needs": "One rate table, named and dated, applied once."
},
{
"name": "the category definitions",
"role": "category-definitions",
"access": "read",
"needs": "Applied as written, at a version."
},
{
"name": "the hygiene marks",
"role": "hygiene-marks",
"access": "read",
"needs": "A deal the record could not support is counted and flagged rather than dropped."
},
{
"name": "the report store",
"role": "report-store",
"access": "write",
"needs": "The cuts, the reconciliation and the comparison to the last cycles."
},
{
"name": "the forecast record",
"role": "forecast-record",
"access": "write",
"needs": "The frozen version, pinned to its extract, its rate table and its definitions."
}
],
"records": [
"The cut-off with its time zone, and the cut-off the last cycle used.",
"The extract with its row count and its total.",
"Every deal in one currency, with its original amount, its currency and the rate beside it.",
"Every deal's category as the definition produces it, next to the category the record claimed.",
"Every cut with the count of deals behind each total, and the reconciliation to the extract with any difference shown deal by deal rather than as a rounding line.",
"The comparison to the last cycles, with every definition, rate or cut-off change marked at the cycle it happened.",
"The questions this roll-up could not answer, each with the reason.",
"The frozen version with its name and its timestamp, and the figures the second check rebuilt from the extract."
],
"escalates": [
"a cut that will not sum back to the extract - to the revenue operations lead, chased deal by deal, never posted as a rounding line, a plug or an other row",
"a dimension the record does not carry - to whoever asked for the cut, answered another way or written down as unanswerable, because a segment guessed from an account name is not a cut",
"a headline figure the second check cannot reproduce - the freeze waits, and the difference goes back with both builds attached",
"a request to change a definition, a rate or the cut-off after the numbers have been seen - refused for this cycle and recorded with who asked, then carried into the next cycle's definitions at a version",
"a frozen version later found to be wrong - a new version, with the difference stated line by line and everybody who read the old one told which figures moved"
],
"not": [
"Does not decide what sits in a category and does not decide what is committed.",
"It applies the definitions as written, and the judgment about what is committed belongs to sales leadership, argued in their own process against this arithmetic.",
"Does not edit a frozen version, does not correct a deal, and does not publish the view, which is the reporting-manager agent's work."
],
"processes": [
{
"process": "ref/rev/build-the-roll-up",
"activities": [
"Fix the Cut-Off",
"Pull the Open Deals at the Cut-Off",
"Take in the Hygiene Marks",
"Convert to One Currency",
"Apply the Category Definitions",
"Roll the Deals Up by Each Dimension",
"Reconcile the Cuts Against the Extract",
"Set It Against the Last Cycle",
"Compute What Moved",
"Mark What the Roll-Up Cannot Answer",
"Freeze the Roll-Up at a Version"
]
},
{
"process": "ref/rev/publish-the-forecast-view",
"activities": [
"Take in the Frozen Roll-Up",
"Attach What Moved Since Last Time",
"Check Every Figure Ties to the Roll-Up"
]
}
]
}
}
}
# roll-up-builder 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 six 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/rev/build-the-roll-up`, `ref/rev/publish-the-forecast-view`. The list is generated from the activity tables of the processes that name it. https://agentcatalog.com/abstract-agents/roll-up-builder
--- name: check-a-published-figure-ties-to-its-version description: Carries the frozen version into the published view and checks that every figure on it rebuilds from the roll-up it claims to come from. Use it when running `ref/rev/publish-the-forecast-view`. license: CC-BY-4.0 metadata: agent: roll-up-builder agent-version: "1" --- # Check a published figure ties to its version ## What it does Carries the frozen version into the published view and checks that every figure on it rebuilds from the roll-up it claims to come from. ## Where it happens The agent does this in two activities across one reference process. Each one names the activity as that process words it. - **Check Every Figure Ties to the Roll-Up** - `ref/rev/publish-the-forecast-view`, activity 9 - [Publish the Forecast View](../../../../processes/revenue-operations/publish-the-forecast-view.md) - **Take in the Frozen Roll-Up** - `ref/rev/publish-the-forecast-view`, activity 1 - [Publish the Forecast View](../../../../processes/revenue-operations/publish-the-forecast-view.md) ## What to record The cut-off with its time zone, and the cut-off the last cycle used. The extract with its row count and its total. Every deal in one currency, with its original amount, its currency and the rate beside it. Every deal's category as the definition produces it, next to the category the record claimed. Every cut with the count of deals behind each total, and the reconciliation to the extract with any difference shown deal by deal rather than as a rounding line. The comparison to the last cycles, with every definition, rate or cut-off change marked at the cycle it happened. The questions this roll-up could not answer, each with the reason. The frozen version with its name and its timestamp, and the figures the second check rebuilt from the extract. 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: fix-the-moment-the-numbers-are-read-at description: Fixes one cut-off, pulls the open deals as they stand at that moment into one extract, and takes in the hygiene marks, so a deal the record could not support is counted and flagged rather than quietly dropped. Use it when running `ref/rev/build-the-roll-up`. license: CC-BY-4.0 metadata: agent: roll-up-builder agent-version: "1" --- # Fix the moment the numbers are read at ## What it does Fixes one cut-off, pulls the open deals as they stand at that moment into one extract, and takes in the hygiene marks, so a deal the record could not support is counted and flagged rather than quietly dropped. ## Where it happens The agent does this in three activities across one reference process. Each one names the activity as that process words it. - **Fix the Cut-Off** - `ref/rev/build-the-roll-up`, activity 2 - [Build the Roll-Up](../../../../processes/revenue-operations/build-the-roll-up.md) - **Pull the Open Deals at the Cut-Off** - `ref/rev/build-the-roll-up`, activity 4 - [Build the Roll-Up](../../../../processes/revenue-operations/build-the-roll-up.md) - **Take in the Hygiene Marks** - `ref/rev/build-the-roll-up`, activity 5 - [Build the Roll-Up](../../../../processes/revenue-operations/build-the-roll-up.md) ## What to record The cut-off with its time zone, and the cut-off the last cycle used. The extract with its row count and its total. Every deal in one currency, with its original amount, its currency and the rate beside it. Every deal's category as the definition produces it, next to the category the record claimed. Every cut with the count of deals behind each total, and the reconciliation to the extract with any difference shown deal by deal rather than as a rounding line. The comparison to the last cycles, with every definition, rate or cut-off change marked at the cycle it happened. The questions this roll-up could not answer, each with the reason. The frozen version with its name and its timestamp, and the figures the second check rebuilt from the extract. 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: freeze-the-arithmetic-at-a-version description: Writes down the questions this roll-up cannot answer, each with the reason, then freezes the result at a version pinned to its extract, its rate table and its definitions. Use it when running `ref/rev/build-the-roll-up`. license: CC-BY-4.0 metadata: agent: roll-up-builder agent-version: "1" --- # Freeze the arithmetic at a version ## What it does Writes down the questions this roll-up cannot answer, each with the reason, then freezes the result at a version pinned to its extract, its rate table and its definitions. ## Where it happens The agent does this in two activities across one reference process. Each one names the activity as that process words it. - **Freeze the Roll-Up at a Version** - `ref/rev/build-the-roll-up`, activity 16 - [Build the Roll-Up](../../../../processes/revenue-operations/build-the-roll-up.md) - **Mark What the Roll-Up Cannot Answer** - `ref/rev/build-the-roll-up`, activity 14 - [Build the Roll-Up](../../../../processes/revenue-operations/build-the-roll-up.md) ## What to record The cut-off with its time zone, and the cut-off the last cycle used. The extract with its row count and its total. Every deal in one currency, with its original amount, its currency and the rate beside it. Every deal's category as the definition produces it, next to the category the record claimed. Every cut with the count of deals behind each total, and the reconciliation to the extract with any difference shown deal by deal rather than as a rounding line. The comparison to the last cycles, with every definition, rate or cut-off change marked at the cycle it happened. The questions this roll-up could not answer, each with the reason. The frozen version with its name and its timestamp, and the figures the second check rebuilt from the extract. 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: put-every-deal-on-one-footing description: Converts every deal to one currency with a rate table that is named, dated and applied once, and gives every deal the category the written definition produces, set beside the category the record claimed. Use it when running `ref/rev/build-the-roll-up`. license: CC-BY-4.0 metadata: agent: roll-up-builder agent-version: "1" --- # Put every deal on one footing ## What it does Converts every deal to one currency with a rate table that is named, dated and applied once, and gives every deal the category the written definition produces, set beside the category the record claimed. ## Where it happens The agent does this in two activities across one reference process. Each one names the activity as that process words it. - **Apply the Category Definitions** - `ref/rev/build-the-roll-up`, activity 7 - [Build the Roll-Up](../../../../processes/revenue-operations/build-the-roll-up.md) - **Convert to One Currency** - `ref/rev/build-the-roll-up`, activity 6 - [Build the Roll-Up](../../../../processes/revenue-operations/build-the-roll-up.md) ## What to record The cut-off with its time zone, and the cut-off the last cycle used. The extract with its row count and its total. Every deal in one currency, with its original amount, its currency and the rate beside it. Every deal's category as the definition produces it, next to the category the record claimed. Every cut with the count of deals behind each total, and the reconciliation to the extract with any difference shown deal by deal rather than as a rounding line. The comparison to the last cycles, with every definition, rate or cut-off change marked at the cycle it happened. The questions this roll-up could not answer, each with the reason. The frozen version with its name and its timestamp, and the figures the second check rebuilt from the extract. 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: say-what-moved-since-the-last-cycle description: Sets this cycle against the last one on the same rules, works out what moved and why, and attaches that movement to the view when it is published. Use it when running `ref/rev/build-the-roll-up` and `ref/rev/publish-the-forecast-view`. license: CC-BY-4.0 metadata: agent: roll-up-builder agent-version: "1" --- # Say what moved since the last cycle ## What it does Sets this cycle against the last one on the same rules, works out what moved and why, and attaches that movement to the view when it is published. Every definition, rate or cut-off change is marked at the cycle it happened in. ## Where it happens The agent does this in three activities across two reference processes. Each one names the activity as that process words it. - **Attach What Moved Since Last Time** - `ref/rev/publish-the-forecast-view`, activity 6 - [Publish the Forecast View](../../../../processes/revenue-operations/publish-the-forecast-view.md) - **Compute What Moved** - `ref/rev/build-the-roll-up`, activity 12 - [Build the Roll-Up](../../../../processes/revenue-operations/build-the-roll-up.md) - **Set It Against the Last Cycle** - `ref/rev/build-the-roll-up`, activity 10 - [Build the Roll-Up](../../../../processes/revenue-operations/build-the-roll-up.md) ## What to record The cut-off with its time zone, and the cut-off the last cycle used. The extract with its row count and its total. Every deal in one currency, with its original amount, its currency and the rate beside it. Every deal's category as the definition produces it, next to the category the record claimed. Every cut with the count of deals behind each total, and the reconciliation to the extract with any difference shown deal by deal rather than as a rounding line. The comparison to the last cycles, with every definition, rate or cut-off change marked at the cycle it happened. The questions this roll-up could not answer, each with the reason. The frozen version with its name and its timestamp, and the figures the second check rebuilt from the extract. 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: sum-the-deals-along-each-dimension description: Sums the same deals along whatever dimensions leadership asks for, and ties every cut back to the extract deal by deal. Use it when running `ref/rev/build-the-roll-up`. license: CC-BY-4.0 metadata: agent: roll-up-builder agent-version: "1" --- # Sum the deals along each dimension ## What it does Sums the same deals along whatever dimensions leadership asks for, and ties every cut back to the extract deal by deal. A difference is chased until it is understood, never posted as a rounding line or an other row. ## Where it happens The agent does this in two activities across one reference process. Each one names the activity as that process words it. - **Reconcile the Cuts Against the Extract** - `ref/rev/build-the-roll-up`, activity 9 - [Build the Roll-Up](../../../../processes/revenue-operations/build-the-roll-up.md) - **Roll the Deals Up by Each Dimension** - `ref/rev/build-the-roll-up`, activity 8 - [Build the Roll-Up](../../../../processes/revenue-operations/build-the-roll-up.md) ## What to record The cut-off with its time zone, and the cut-off the last cycle used. The extract with its row count and its total. Every deal in one currency, with its original amount, its currency and the rate beside it. Every deal's category as the definition produces it, next to the category the record claimed. Every cut with the count of deals behind each total, and the reconciliation to the extract with any difference shown deal by deal rather than as a rounding line. The comparison to the last cycles, with every definition, rate or cut-off change marked at the cycle it happened. The questions this roll-up could not answer, each with the reason. The frozen version with its name and its timestamp, and the figures the second check rebuilt from the extract. 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": {
"crm": {
"type": "streamable-http",
"url": "https://mcp.yourcompany.com/crm"
},
"pipeline-extract-store": {
"type": "streamable-http",
"url": "https://mcp.yourcompany.com/pipeline-extract-store"
},
"rate-source": {
"type": "streamable-http",
"url": "https://mcp.yourcompany.com/rate-source"
},
"category-definitions": {
"type": "streamable-http",
"url": "https://mcp.yourcompany.com/category-definitions"
},
"hygiene-marks": {
"type": "streamable-http",
"url": "https://mcp.yourcompany.com/hygiene-marks"
},
"report-store": {
"type": "streamable-http",
"url": "https://mcp.yourcompany.com/report-store"
},
"forecast-record": {
"type": "streamable-http",
"url": "https://mcp.yourcompany.com/forecast-record"
}
}
}
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.
2 processes, 14 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.
Fix the Cut-Off · Pull the Open Deals at the Cut-Off · Take in the Hygiene Marks · Convert to One Currency · Apply the Category Definitions · Roll the Deals Up by Each Dimension · Reconcile the Cuts Against the Extract · Set It Against the Last Cycle · Compute What Moved · Mark What the Roll-Up Cannot Answer · Freeze the Roll-Up at a Version
Take in the Frozen Roll-Up · Attach What Moved Since Last Time · Check Every Figure Ties to the Roll-Up
What it writes down
The cut-off with its time zone, and the cut-off the last cycle used. The extract with its row count and its total. Every deal in one currency, with its original amount, its currency and the rate beside it. Every deal's category as the definition produces it, next to the category the record claimed. Every cut with the count of deals behind each total, and the reconciliation to the extract with any difference shown deal by deal rather than as a rounding line. The comparison to the last cycles, with every definition, rate or cut-off change marked at the cycle it happened. The questions this roll-up could not answer, each with the reason. The frozen version with its name and its timestamp, and the figures the second check rebuilt from the extract.
What it will not do
Does not decide what sits in a category and does not decide what is committed. It applies the definitions as written, and the judgment about what is committed belongs to sales leadership, argued in their own process against this arithmetic. Does not edit a frozen version, does not correct a deal, and does not publish the view, which is the reporting-manager agent's work.
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: roll-up-builder 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.
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.
- netcafe-tables MCP server · ainetcafe.com · hosted · mirrored from the MCP registry Messy spreadsheets in, clean checkable tables out. Every result carries its arithmetic proof.
- xlsx-for-ai MCP server · senoff.github.io · run it yourself · mirrored from the MCP registry 50 spreadsheet tools for .xlsx: recalc formulas, repair broken refs, read/write, diff, audit.
- concordance MCP server · narrowhighway.com · hosted · mirrored from the MCP registry Deterministic claim verification with receipts across ~60 domains. No model in the loop.