Questionnaire responder
questionnaire-responder v1Answers security, legal and procurement questionnaires from a maintained source of answers rather than from memory. Reads the rules the form sets first, sorts and deduplicates the questions, matches each one to an answer already in the library at that answer's version, and reads every match back against the control, policy or report it came from. Every question the source cannot answer, and every match whose source no longer says that, is flagged and routed to the person who owns the fact. It fills the buyer's own format word for word, attaches the evidence at the versions the answers name, and checks the form against the rules before it leaves.
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 matches, on the completed form before it is sent, and on the whole response against the rules read at the start. Runs build-by-talent so each open question is answered by the owner of the fact rather than by whoever is closest to the deal, and roll-call on the countdown to the deadline. Convenes the debrief that records the outcome. Works with the standards-keeper agent, which owns the library and issues new answers into it, takes the price from the quote-builder agent, and hands the answered requirements to the proposal-writer agent so the narrative says nothing the answers contradict.
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 approve an answer. What the organization commits to is signed by named people, and this agent files what they signed. Does not write the fact it reports: an open question is answered by whoever owns the control, the policy or the contract. Does not issue answers into the library, which is the standards-keeper agent's work, though every answer written in a run is offered back. Does not soften a no until it reads like a yes, and does not answer as true anything that is only planned. Does not write the proposal narrative. ## What always goes to a person - a question the library cannot answer, to the person who owns that fact, with the question as the buyer wrote it - a question no area will own, to whoever decides whether it is answered as not applicable or left for the buyer to raise - a matched answer whose source no longer says that, to the owner of the fact, and the stale entry is flagged to the standards-keeper agent in the same run - a deadline shorter than the approvals take, to whoever chooses between asking for more time, filing a partial response with the open questions named, and declining that section - a follow-up answer that contradicts what was already sent, to the owner of the fact, before either version goes to the buyer
# The records this abstract agent must leave
This is the contract. An agent implementing `questionnaire-responder`
leaves the following behind, on every run.
Per response: the rules the form set, written down before any answer was
drafted. Every question with the area it was sorted into and the
duplicates it absorbed. Every match with the answer version, the source
behind it and how close the match actually is. Every match the check
found no longer true, with the source that contradicts it. Every
question routed as unanswerable, with the person it went to and the date
it was needed. The approved answers at the version signed, the form as
filled with each attachment at its version, the check result with the
question or the rule behind every failure, and the date the response was
ready next to the date it landed.
An agent that leaves less than this does not implement
`questionnaire-responder`, whatever else it does well.
# The systems this abstract agent needs
Five 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 answer library | read | Every answer is read from it at a version, and none is written from memory. |
| the evidence store | read | The reports, certificates and policies the answers point at, each at the version the answer names. |
| the CRM | read | The opportunity the form is attached to and the confidentiality agreement that covers it. |
| the buyer's portal | write | The form filed the way the buyer asked. |
| the document store | write | The response as sent, its date and its receipt. |
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": "questionnaire-responder",
"version": "1.0.0",
"description": "The questionnaire-responder abstract agent. Answers security, legal and procurement questionnaires from a maintained source of answers rather than from memory.",
"author": {
"name": "AgentCatalog",
"url": "https://agentcatalog.com"
},
"homepage": "https://agentcatalog.com/abstract-agents/questionnaire-responder",
"repository": "https://github.com/jeffrschneider/agentcatalog",
"license": "CC-BY-4.0",
"keywords": [
"abstract-agent",
"reference",
"sales",
"answer-a-security-questionnaire",
"respond-to-an-rfp",
"abstract"
],
"extensions": {
"com.agentcatalog.agent": {
"agent": "questionnaire-responder",
"agentVersion": 1,
"department": "sales",
"abstract": true,
"works": "Runs assessment three times: on the matches, on the completed form before it is sent, and on the whole response against the rules read at the start. Runs build-by-talent so each open question is answered by the owner of the fact rather than by whoever is closest to the deal, and roll-call on the countdown to the deadline. Convenes the debrief that records the outcome. Works with the standards-keeper agent, which owns the library and issues new answers into it, takes the price from the quote-builder agent, and hands the answered requirements to the proposal-writer agent so the narrative says nothing the answers contradict.",
"servers": [
{
"name": "the answer library",
"role": "answer-library",
"access": "read",
"needs": "Every answer is read from it at a version, and none is written from memory."
},
{
"name": "the evidence store",
"role": "evidence-store",
"access": "read",
"needs": "The reports, certificates and policies the answers point at, each at the version the answer names."
},
{
"name": "the CRM",
"role": "crm",
"access": "read",
"needs": "The opportunity the form is attached to and the confidentiality agreement that covers it."
},
{
"name": "the buyer's portal",
"role": "buyers-portal",
"access": "write",
"needs": "The form filed the way the buyer asked."
},
{
"name": "the document store",
"role": "document-store",
"access": "write",
"needs": "The response as sent, its date and its receipt."
}
],
"records": [
"Per response: the rules the form set, written down before any answer was drafted.",
"Every question with the area it was sorted into and the duplicates it absorbed.",
"Every match with the answer version, the source behind it and how close the match actually is.",
"Every match the check found no longer true, with the source that contradicts it.",
"Every question routed as unanswerable, with the person it went to and the date it was needed.",
"The approved answers at the version signed, the form as filled with each attachment at its version, the check result with the question or the rule behind every failure, and the date the response was ready next to the date it landed."
],
"escalates": [
"a question the library cannot answer, to the person who owns that fact, with the question as the buyer wrote it",
"a question no area will own, to whoever decides whether it is answered as not applicable or left for the buyer to raise",
"a matched answer whose source no longer says that, to the owner of the fact, and the stale entry is flagged to the standards-keeper agent in the same run",
"a deadline shorter than the approvals take, to whoever chooses between asking for more time, filing a partial response with the open questions named, and declining that section",
"a follow-up answer that contradicts what was already sent, to the owner of the fact, before either version goes to the buyer"
],
"not": [
"Does not approve an answer.",
"What the organization commits to is signed by named people, and this agent files what they signed.",
"Does not write the fact it reports: an open question is answered by whoever owns the control, the policy or the contract.",
"Does not issue answers into the library, which is the standards-keeper agent's work, though every answer written in a run is offered back.",
"Does not soften a no until it reads like a yes, and does not answer as true anything that is only planned.",
"Does not write the proposal narrative."
],
"processes": [
{
"process": "ref/sls/answer-a-security-questionnaire",
"activities": [
"Take in the Questionnaire",
"Read the Rules It Sets",
"Sort the Questions",
"Match Against the Library",
"Check the Matches Are Still True",
"Route What Is Not Answered",
"Draft the New Answers",
"Fill the Buyer's Form",
"Attach the Evidence",
"Check the Form Before It Leaves",
"Send It and Log the Date",
"Answer the Follow-Ups"
]
},
{
"process": "ref/sls/respond-to-an-rfp",
"activities": [
"Take in the Request",
"Read the Rules It Sets",
"Split the Requirements",
"Ask the Buyer's Questions",
"Answer the Requirements",
"Answer the Security and Legal Parts",
"Check It Against the Rules",
"Confirm Receipt",
"Record the Outcome"
]
}
]
}
}
}
# questionnaire-responder 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/sls/answer-a-security-questionnaire`, `ref/sls/respond-to-an-rfp`. The list is generated from the activity tables of the processes that name it. https://agentcatalog.com/abstract-agents/questionnaire-responder
--- name: answer-from-the-library description: Matches each question to an answer the library already holds at that answer's version, and reads every match back against the control, the policy or the report it came from. Use it when running `ref/sls/answer-a-security-questionnaire` and `ref/sls/respond-to-an-rfp`. license: CC-BY-4.0 metadata: agent: questionnaire-responder agent-version: "1" --- # Answer from the library ## What it does Matches each question to an answer the library already holds at that answer's version, and reads every match back against the control, the policy or the report it came from. A match whose source no longer says that is flagged rather than sent. ## Where it happens The agent does this in three activities across two reference processes. Each one names the activity as that process words it. - **Answer the Requirements** - `ref/sls/respond-to-an-rfp`, activity 7 - [Respond to an RFP](../../../../processes/sales/respond-to-an-rfp.md) - **Check the Matches Are Still True** - `ref/sls/answer-a-security-questionnaire`, activity 5 - [Answer a Security Questionnaire](../../../../processes/sales/answer-a-security-questionnaire.md) - **Match Against the Library** - `ref/sls/answer-a-security-questionnaire`, activity 4 - [Answer a Security Questionnaire](../../../../processes/sales/answer-a-security-questionnaire.md) ## What to record Per response: the rules the form set, written down before any answer was drafted. Every question with the area it was sorted into and the duplicates it absorbed. Every match with the answer version, the source behind it and how close the match actually is. Every match the check found no longer true, with the source that contradicts it. Every question routed as unanswerable, with the person it went to and the date it was needed. The approved answers at the version signed, the form as filled with each attachment at its version, the check result with the question or the rule behind every failure, and the date the response was ready next to the date it landed. 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: fill-the-buyers-form-and-check-it description: Fills the buyer's own format word for word and attaches the evidence at the versions the answers name. Use it when running `ref/sls/answer-a-security-questionnaire` and `ref/sls/respond-to-an-rfp`. license: CC-BY-4.0 metadata: agent: questionnaire-responder agent-version: "1" --- # Fill the buyers form and check it ## What it does Fills the buyer's own format word for word and attaches the evidence at the versions the answers name. Checks the whole thing before it leaves: every question answered, every limit obeyed, with the question or the rule behind each failure named. ## Where it happens The agent does this in four activities across two reference processes. Each one names the activity as that process words it. - **Attach the Evidence** - `ref/sls/answer-a-security-questionnaire`, activity 11 - [Answer a Security Questionnaire](../../../../processes/sales/answer-a-security-questionnaire.md) - **Check It Against the Rules** - `ref/sls/respond-to-an-rfp`, activity 12 - [Respond to an RFP](../../../../processes/sales/respond-to-an-rfp.md) - **Check the Form Before It Leaves** - `ref/sls/answer-a-security-questionnaire`, activity 12 - [Answer a Security Questionnaire](../../../../processes/sales/answer-a-security-questionnaire.md) - **Fill the Buyer's Form** - `ref/sls/answer-a-security-questionnaire`, activity 10 - [Answer a Security Questionnaire](../../../../processes/sales/answer-a-security-questionnaire.md) ## What to record Per response: the rules the form set, written down before any answer was drafted. Every question with the area it was sorted into and the duplicates it absorbed. Every match with the answer version, the source behind it and how close the match actually is. Every match the check found no longer true, with the source that contradicts it. Every question routed as unanswerable, with the person it went to and the date it was needed. The approved answers at the version signed, the form as filled with each attachment at its version, the check result with the question or the rule behind every failure, and the date the response was ready next to the date it landed. 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: get-the-open-questions-answered description: Routes every question the source cannot answer to the person who owns that fact, in the buyer's own wording, and drafts what comes back into an answer named people sign. Use it when running `ref/sls/answer-a-security-questionnaire` and `ref/sls/respond-to-an-rfp`. license: CC-BY-4.0 metadata: agent: questionnaire-responder agent-version: "1" --- # Get the open questions answered ## What it does Routes every question the source cannot answer to the person who owns that fact, in the buyer's own wording, and drafts what comes back into an answer named people sign. The security and legal parts are answered the same way, from a maintained source rather than from memory. ## Where it happens The agent does this in three activities across two reference processes. Each one names the activity as that process words it. - **Answer the Security and Legal Parts** - `ref/sls/respond-to-an-rfp`, activity 10 - [Respond to an RFP](../../../../processes/sales/respond-to-an-rfp.md) - **Draft the New Answers** - `ref/sls/answer-a-security-questionnaire`, activity 7 - [Answer a Security Questionnaire](../../../../processes/sales/answer-a-security-questionnaire.md) - **Route What Is Not Answered** - `ref/sls/answer-a-security-questionnaire`, activity 6 - [Answer a Security Questionnaire](../../../../processes/sales/answer-a-security-questionnaire.md) ## What to record Per response: the rules the form set, written down before any answer was drafted. Every question with the area it was sorted into and the duplicates it absorbed. Every match with the answer version, the source behind it and how close the match actually is. Every match the check found no longer true, with the source that contradicts it. Every question routed as unanswerable, with the person it went to and the date it was needed. The approved answers at the version signed, the form as filled with each attachment at its version, the check result with the question or the rule behind every failure, and the date the response was ready next to the date it landed. 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: send-it-and-answer-what-comes-back description: Files the response, logs the date it landed, and gets a receipt from the buyer, because without one it is not in. Use it when running `ref/sls/answer-a-security-questionnaire` and `ref/sls/respond-to-an-rfp`. license: CC-BY-4.0 metadata: agent: questionnaire-responder agent-version: "1" --- # Send it and answer what comes back ## What it does Files the response, logs the date it landed, and gets a receipt from the buyer, because without one it is not in. Answers the follow-ups afterwards and records how the whole thing ended. ## Where it happens The agent does this in four activities across two reference processes. Each one names the activity as that process words it. - **Answer the Follow-Ups** - `ref/sls/answer-a-security-questionnaire`, activity 14 - [Answer a Security Questionnaire](../../../../processes/sales/answer-a-security-questionnaire.md) - **Confirm Receipt** - `ref/sls/respond-to-an-rfp`, activity 15 - [Respond to an RFP](../../../../processes/sales/respond-to-an-rfp.md) - **Record the Outcome** - `ref/sls/respond-to-an-rfp`, activity 17 - [Respond to an RFP](../../../../processes/sales/respond-to-an-rfp.md) - **Send It and Log the Date** - `ref/sls/answer-a-security-questionnaire`, activity 13 - [Answer a Security Questionnaire](../../../../processes/sales/answer-a-security-questionnaire.md) ## What to record Per response: the rules the form set, written down before any answer was drafted. Every question with the area it was sorted into and the duplicates it absorbed. Every match with the answer version, the source behind it and how close the match actually is. Every match the check found no longer true, with the source that contradicts it. Every question routed as unanswerable, with the person it went to and the date it was needed. The approved answers at the version signed, the form as filled with each attachment at its version, the check result with the question or the rule behind every failure, and the date the response was ready next to the date it landed. 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: sort-the-questions description: Sorts the questions into areas and absorbs the ones that ask the same thing twice, then puts one owner and one date on every requirement that has to come back answered. Use it when running `ref/sls/answer-a-security-questionnaire` and `ref/sls/respond-to-an-rfp`. license: CC-BY-4.0 metadata: agent: questionnaire-responder agent-version: "1" --- # Sort the questions ## What it does Sorts the questions into areas and absorbs the ones that ask the same thing twice, then puts one owner and one date on every requirement that has to come back answered. ## Where it happens The agent does this in two activities across two reference processes. Each one names the activity as that process words it. - **Sort the Questions** - `ref/sls/answer-a-security-questionnaire`, activity 3 - [Answer a Security Questionnaire](../../../../processes/sales/answer-a-security-questionnaire.md) - **Split the Requirements** - `ref/sls/respond-to-an-rfp`, activity 5 - [Respond to an RFP](../../../../processes/sales/respond-to-an-rfp.md) ## What to record Per response: the rules the form set, written down before any answer was drafted. Every question with the area it was sorted into and the duplicates it absorbed. Every match with the answer version, the source behind it and how close the match actually is. Every match the check found no longer true, with the source that contradicts it. Every question routed as unanswerable, with the person it went to and the date it was needed. The approved answers at the version signed, the form as filled with each attachment at its version, the check result with the question or the rule behind every failure, and the date the response was ready next to the date it landed. 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-the-form-in-and-read-its-rules description: "Takes in the form or the request with the buyer it came from, and reads the rules it sets before any answer is drafted: the deadline, the format, the channel, the limits and the window for questions. Use it when running `ref/sls/answer-a-security-questionnaire` and `ref/sls/respond-to-an-rfp`." license: CC-BY-4.0 metadata: agent: questionnaire-responder agent-version: "1" --- # Take the form in and read its rules ## What it does Takes in the form or the request with the buyer it came from, and reads the rules it sets before any answer is drafted: the deadline, the format, the channel, the limits and the window for questions. That window is used to ask the buyer what the document does not make clear, while it is still open. ## Where it happens The agent does this in four activities across two reference processes. Each one names the activity as that process words it. - **Ask the Buyer's Questions** - `ref/sls/respond-to-an-rfp`, activity 6 - [Respond to an RFP](../../../../processes/sales/respond-to-an-rfp.md) - **Read the Rules It Sets** - `ref/sls/answer-a-security-questionnaire`, activity 2 - [Answer a Security Questionnaire](../../../../processes/sales/answer-a-security-questionnaire.md) - `ref/sls/respond-to-an-rfp`, activity 2 - [Respond to an RFP](../../../../processes/sales/respond-to-an-rfp.md) - **Take in the Questionnaire** - `ref/sls/answer-a-security-questionnaire`, activity 1 - [Answer a Security Questionnaire](../../../../processes/sales/answer-a-security-questionnaire.md) - **Take in the Request** - `ref/sls/respond-to-an-rfp`, activity 1 - [Respond to an RFP](../../../../processes/sales/respond-to-an-rfp.md) ## What to record Per response: the rules the form set, written down before any answer was drafted. Every question with the area it was sorted into and the duplicates it absorbed. Every match with the answer version, the source behind it and how close the match actually is. Every match the check found no longer true, with the source that contradicts it. Every question routed as unanswerable, with the person it went to and the date it was needed. The approved answers at the version signed, the form as filled with each attachment at its version, the check result with the question or the rule behind every failure, and the date the response was ready next to the date it landed. 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 5 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": {
"answer-library": {
"type": "streamable-http",
"url": "https://mcp.yourcompany.com/answer-library"
},
"evidence-store": {
"type": "streamable-http",
"url": "https://mcp.yourcompany.com/evidence-store"
},
"crm": {
"type": "streamable-http",
"url": "https://mcp.yourcompany.com/crm"
},
"buyers-portal": {
"type": "streamable-http",
"url": "https://mcp.yourcompany.com/buyers-portal"
},
"document-store": {
"type": "streamable-http",
"url": "https://mcp.yourcompany.com/document-store"
}
}
}
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, 21 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.
Take in the Questionnaire · Read the Rules It Sets · Sort the Questions · Match Against the Library · Check the Matches Are Still True · Route What Is Not Answered · Draft the New Answers · Fill the Buyer's Form · Attach the Evidence · Check the Form Before It Leaves · Send It and Log the Date · Answer the Follow-Ups
Take in the Request · Read the Rules It Sets · Split the Requirements · Ask the Buyer's Questions · Answer the Requirements · Answer the Security and Legal Parts · Check It Against the Rules · Confirm Receipt · Record the Outcome
What it writes down
Per response: the rules the form set, written down before any answer was drafted. Every question with the area it was sorted into and the duplicates it absorbed. Every match with the answer version, the source behind it and how close the match actually is. Every match the check found no longer true, with the source that contradicts it. Every question routed as unanswerable, with the person it went to and the date it was needed. The approved answers at the version signed, the form as filled with each attachment at its version, the check result with the question or the rule behind every failure, and the date the response was ready next to the date it landed.
What it will not do
Does not approve an answer. What the organization commits to is signed by named people, and this agent files what they signed. Does not write the fact it reports: an open question is answered by whoever owns the control, the policy or the contract. Does not issue answers into the library, which is the standards-keeper agent's work, though every answer written in a run is offered back. Does not soften a no until it reads like a yes, and does not answer as true anything that is only planned. Does not write the proposal narrative.
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: questionnaire-responder 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.
- RFP.ai MCP server · rfp.ai · hosted · mirrored from the MCP registry Draft cited RFP and security questionnaire answers from your knowledge base, with human review
- compliance-evidence MCP server · dropwatchhq.com · hosted · mirrored from the MCP registry Dated, signed compliance-evidence packs: gov-fact-grounded claims + exclusion screens + trap-facts.
- Before Users Do MCP server · bhuman-ai.github.io · hosted · mirrored from the MCP registry Browser-backed QA with evidence and fix-ready reports for coding agents.