Skip to main content
For AI agents: a documentation index is available at https://docs.coverbase.com/llms.txt. This page is also available in markdown by appending .md to the URL.
Use these as inspiration, not a script. The patterns below cover the workflows most customers run on a daily and weekly basis.

Vendor intake

The full intake request runs in conversation. You don’t need to say “intake” for any of these; the assistant recognizes the intent. See Vendor intake in chat for the whole flow.

Request a new vendor

I want to start using Northwind Analytics for product analytics.
The assistant opens an intake session, reads your portal configuration to see which steps your org enabled, researches Northwind and confirms with you that it has the right company, offers a menu of concrete use cases and in-scope services, surfaces any existing vendor of yours that already covers analytics, runs the screening your portal configures, then walks the inherent risk questionnaire with you one question at a time. Every write asks first.
My team needs a load testing tool and we’re looking at Loadspin. Can we buy it?
Same flow. “Can we buy this” and “my team needs” are intake requests, not questions about policy. The assistant starts the request rather than answering in the abstract.
Is Acme approved for us to use?
The assistant resolves the name to a vendor, checks its onboarding status, and reports it. If there’s no approved record, it offers to start the intake rather than stopping at “no”.
We’re about to sign with Mixpanel. Do we already have something that does this?
Vendor matching ranks your existing vendors against the request and surfaces prior relationships, so a duplicate purchase gets caught before the request is filed rather than during review. Web alternatives appear too, if your portal enables them.
That’s the wrong Acme. I mean the payments one, acme.io, not the logistics company.
The assistant takes the correction and re-runs matching or picks another candidate. An unconfirmed match is never carried forward into the request.
Where did my Datadog request get to? Let’s finish it.
The assistant finds the open session, reports which questions are still unanswered or still carrying unconfirmed AI drafts, and resumes the walkthrough there.
What steps does our intake process include?
The assistant reads your portal configuration and reports which steps are enabled and which your org turned off. Useful when you’re not sure whether pre-qualification or web alternatives are part of your flow.
Add Figma as a vendor record only. Skip the intake questionnaire, we already did the review offline.
The only path to a bare vendor record. The assistant states plainly that the vendor will carry no due diligence, waits for you to confirm that, and only then creates it. Requests that don’t explicitly ask to skip intake go through the full flow instead.

Reviewing what comes in

Work the pending review queue

Walk me through everything waiting in the intake queue.
The assistant lists pending-review sessions and takes them one at a time: the requester’s use case and services, the enrichment and duplicate readout, the pre-qualification verdict per criterion, and the questionnaire answers with their inherent risk score.
Review the intake request for Marqeta and tell me whether anything looks off.
The assistant pulls the full submission, flags weak or inconsistent answers, and proposes approve, reject, or request-follow-up. The decision is a write, so it waits for your confirmation.
Their data-types answer is too vague. Send it back and ask what customer PII flows to them.
The assistant proposes the follow-up request with your question attached, confirms, and returns the session to the requester.
Submitting an intake request is not approval. At the end of the requester flow a vendor record may exist, but it sits in Created status and nobody should start using the vendor until a reviewer decides the request.

Portfolio and subprocessor analysis

Which of our vendors use AWS as a subprocessor?

Which of our vendors use AWS as a subprocessor, and what is the current risk tier for each?
The assistant calls query_radar(kind="soc2_nth_party") with relevant aliases in llm_query_terms (AWS, Amazon Web Services, S3, EC2), gets back the list of dependent vendors, then calls query_vendors(kind="risk_summary") for each to surface tier and open findings count.
A major Northwind outage is happening. Show me every vendor in our portfolio that depends on Northwind, sorted by criticality.
Same pattern, scoped to Northwind. The assistant can also pull recent radar alerts for the affected vendors to see if any have already filed incident notifications.
Build me a one-page report of our top 10 highest-risk vendors with their key open findings.
The assistant calls get_report(report_name="portfolio_risk", top_n=10), then drills into each vendor with query_vendors(kind="detail") to extract the relevant findings.

Vendor profiles and assessments

Give me a full risk summary for Acme Corp, including any open findings and recent radar alerts.
The assistant calls query_vendors(kind="search") to resolve the name to an ID, then query_vendors(kind="detail") to pull the consolidated profile in a single call.
Summarize assessment cbqsrw_abc123 and list the controls that need human review.
The assistant calls query_assessments(kind="detail") and surfaces the control evaluations that are flagged or have open findings, so the reviewer can focus on what matters.
Give me the complete AI summary for the HubSpot assessment. I want the decision summary, the key business risks, the required conditions, and the vendor remediation message.
query_assessments(kind="detail") carries only the opening of the summary and says so. The assistant calls query_assessments(kind="summary") for the whole report, and pages through it if it runs long.
List every completed assessment this quarter with its outcome and residual risk level, as a table.
Both fields are on each query_assessments(kind="search") row, so this is one call per page rather than one call per assessment. See Replacing the assessment export if you are feeding a dashboard.
Which assessments did we conditionally approve last quarter, and what conditions did we attach to each?
The outcome is on the search rows, so the assistant filters there first, then reads the summary report for only the matching assessments to pull the conditions out of the narrative.
What does the assessment backlog look like? How many are in progress, and who owns each?
The assistant pulls get_report(report_name="review_queue") for the count of open / in-progress assessments and their owners, or get_report(report_name="assessment_metrics") for the rolling-window throughput view. (Assessment statuses are workflow stages such as collecting_documents, analyzing_questionnaire, and review_evals; there is no single in_progress status, so the review-queue report is the right tool for backlog.)

Evidence out of documents

Coverbase reads the documents and returns the passage the answer rests on. Full guide: Asking your documents a question.

Answer a control question from the SOC 2

Does Acme encrypt customer data at rest? Check their SOC 2.
The assistant resolves Acme, calls query_vendors(kind="document_evidence") scoped to that vendor, and gets a run id back rather than an answer. A model picks the one or two documents most likely to hold it, reads them, and locates the passage. A minute or two later the assistant calls query_vendors(kind="document_evidence_result", run_id=...) and reports the answer with its verbatim quote, the page, a cropped image of the highlighted passage, and a link that opens the document there.
What is the termination notice period in Acme’s MSA, and quote the clause.
Naming the document type narrows the candidate set before anything is read. The quote comes back verbatim, so it can go straight into a negotiation note.
In the Acme penetration test report, were any critical findings left unresolved?
Naming a document skips the selection step and reads that document.
I need evidence that Northwind does background checks on staff with production access. Find it and give me something I can cite.
The answer arrives with a page citation and a permanent Coverbase link. Paste the link into the assessment rather than the image: the image link expires after about an hour.
Does Acme have a documented incident response SLA?
If the documents read do not address it, the response says so rather than inferring an answer. Ask the assistant to widen the scope (drop the document type, raise the document limit) before concluding the control does not exist.

Vendor intelligence

Is this company real?

Is Acme Corp a real registered company? Show me the legal entity and where you got it from.
The assistant calls query_vendors(kind="company_registration"), which returns the validated corporate identity from GLEIF, OpenCorporates, and SEC EDGAR (official registered name, status, jurisdiction, and identifiers) with a link to each register’s record. If nothing matched confidently, it says so rather than offering the nearest guess.
What’s the security posture for Acme Corp, and what should I raise with them?
The assistant reads the vendor’s outside-in security posture: the rating and grade, the per-factor breakdown with the observed values behind it, the ranked next steps (most urgent first, each naming the evidence it rests on), and what changed since the previous scan. Ask it to draft the questions and it quotes the observed values, such as p=none or the CVE identifier, rather than paraphrasing them.
What’s the financial health score for Acme Corp, and has it moved in the last year?
The assistant calls query_vendors(kind="financial_health") and reports the score, risk band, confidence tier, pillar breakdown, and 3- and 12-month movement, along with the sources behind each figure and any that were unavailable.
Which of my tier-1 vendors are in the High or Very High financial risk bands?
The assistant resolves the vendor set, then pulls query_vendors(kind="financial_health") per vendor. Ask it to group by confidence tier: a Tier C score is inferred from signals and a Tier A score is computed from filed statements, so the two are not directly comparable and a ranking that mixes them is misleading.
Is the entity on the Acme contract the same one that’s registered and in good standing?
The assistant pulls query_vendors(kind="company_registration") for the registered legal name and status and compares it against the counterparty on the contract. A mismatch between the contracting entity and the registered entity is a real finding, not a formatting difference.

Program health and continuous monitoring

Weekly program standup

What is happening across our TPRM program this week? Show me recent assessments, open findings, and radar alerts.
The assistant calls get_report(report_name="org_activity", days=7) with reasonable limits. This is the single most useful prompt for a daily standup or weekly review.
Show me every vendor with overdue findings and their owners so I can chase them.
The assistant calls query_findings(kind="list_detailed") org-wide with a status filter for open and a date filter for past-due, then groups by assignee.
Are there any new radar alerts on our tier-1 vendors in the past 24 hours?
The assistant calls query_radar(kind="alerts") filtered by vendor ID for the tier-1 list, or asks get_report(report_name="org_activity", days=1).

Contracts and obligations

What contracts expire in the next 90 days, and which of those vendors have unresolved findings?
The assistant calls query_engagements_contracts(kind="contracts") with the date filter, then for each result calls query_findings(kind="search") scoped to that vendor.
Are there any obligations coming due next month that have not been assigned to anyone?
The assistant calls query_engagements_contracts(kind="obligations") filtered by due date and missing assignee.

Sourcing and RFPs

Draft an RFP from a sentence

Draft an RFP to replace our applicant tracking system for about 12 recruiters. It has to integrate with our HRIS and Microsoft 365, and we will not grant tenant-wide mailbox access.
The assistant calls mutate(entity="rfp", action="draft_brief"), which writes nothing and returns a proposed name, description, narrative and timeline for you to correct.
Who should we invite? Show me what each is known for and what to watch out for.
mutate(entity="rfp", action="research_vendors") returns five to ten candidates with the reasoning behind each. Still no write.
Suggest requirements and questions for it, then create the RFP with those and the four vendors I picked.
suggest_requirements and generate_questions propose the rubric and questionnaire; create, with confirm: true, builds the RFP, rubric, questionnaire, vendor records and invitations in one transaction, as a draft.
Run it silently and tell me how they stack up.
simulate_submissions researches how each invited vendor would most plausibly answer, then compare reads the whole set together. Every rendering states that these are researched estimates, not vendor responses. A vendor who already sent a real response is skipped.
What did Greenhouse say about mailbox scopes?
query_rfps(kind="submission_answers") returns that submission’s answers, each labelled with whether it came from the vendor or from research.

Bill of materials

Latest SBOM and its components

Show me the latest software bill of materials for vendor Acme and list its components.
The assistant calls query_vendors(kind="search") to resolve the name, then query_vendors(kind="bill_of_materials", vendor_id=...) to pull the current applied BOM and its components in one call.
Does Acme’s current SBOM include any GPL-licensed components?
Same bill_of_materials call, then the assistant filters the returned components by their licenses.
What AI models and datasets are in Acme’s AIBOM?
The assistant pulls the latest BOM and surfaces the machine-learning-model and data components.
Pull the components from Acme’s latest hardware BOM.
The assistant calls query_vendors(kind="bill_of_materials", vendor_id=...) and lists the hardware components.
List every bill of materials we’ve received from Acme over time. Which one is currently applied?
The assistant calls query_vendors(kind="bill_of_materials_history", vendor_id=...). The list comes back newest first; the first entry is the applied one.
Has Acme ever shipped a BOM that contained openssl? Show the history.
The assistant calls query_vendors(kind="bill_of_materials_history", vendor_id=...) and checks each BOM’s components for the match, tracing every hit back to its source document.
What these call: query_vendors(kind="bill_of_materials", vendor_id=...) or query_vendors(kind="bill_of_materials_history", vendor_id=...), both read-only and user/org-scoped. See the Bill of Materials API for the full argument list.

Write actions, with confirmation

Every write tool requires the assistant to propose the action in chat and wait for your explicit approval. The examples below show the pattern.
Add a note to vendor Acme Corp: following up with their security team next week.
The assistant proposes: “I am about to add a note to Acme Corp with the text ‘following up with their security team next week.’ Confirm?” After your approval, it calls mutate(entity="note", action="add", data={..., "confirm": true}).
Create a finding on assessment cbqsrw_abc123 titled “Missing encryption at rest evidence” and assign it to me.
The assistant proposes the finding (title, body, assessment ID, assignee), waits for confirmation, then calls mutate(entity="finding", action="create", data={..., "confirm": true}).
Update the risk tier of vendor Globex to Tier 1.
The assistant proposes the change to the vendor status, confirms, then calls mutate(entity="vendor", action="update", data={..., "confirm": true}) with the relevant status ID.
Log a radar event for Acme Corp: they disclosed a data breach today.
The assistant proposes the event (name, summary, impact type, vendor), waits for confirmation, then calls mutate(entity="radar_event", action="create", data={..., "confirm": true}).
That radar alert about Acme is a duplicate. Dismiss it and suppress similar ones.
The assistant proposes the dismissal (alert ID, reason, suppress_similar), confirms, then calls mutate(entity="radar_alert", action="dismiss", data={..., "confirm": true}).
Kick off a reassessment of Acme Corp because of that breach event.
The assistant lists reassessments via query_radar(kind="reassessments") to check for an existing one, then proposes a new reassessment (radar event, vendors, optional plan) and calls mutate(entity="reassessment", action="create", data={..., "confirm": true}). This never opens a case.

Zero Touch Assessments

These prompts launch, rank, review and revise Zero Touch runs. Every write asks you first.

Triage a list of vendors

Run a Zero Touch assessment on Acme, Globex and Initech, and refresh their vendor intelligence first.
The assistant resolves each name to a vendor, proposes the batch, and after you confirm calls mutate(entity="assessment", action="launch_zero_touch_bulk", data={..., "refresh_vendor_intelligence": true, "confirm": true}). It reports the runs that started and any vendor that failed to launch.
Which vendors have the worst Zero Touch scores? Show me the bottom 25.
The assistant calls query_assessments(kind="zero_touch_leaderboard", limit=25) and lists each vendor with its score and the components behind it.
Use our Vendor Baseline control set in Zero Touch runs.
The assistant finds the set with query_controls(kind="control_sets"), proposes the change, and calls mutate(entity="control_set", action="update", data={..., "is_zero_touch_eligible": true, "confirm": true}). To see what runs evaluate afterwards, it reads query_assessments(kind="zero_touch_config").
Turn off the people component in Zero Touch scoring and weight security twice as heavily as financial health.
The assistant reads the current configuration with query_assessments(kind="zero_touch_config"), proposes the new weights, and calls mutate(entity="zero_touch", action="configure", data={..., "confirm": true}).
Approve every Zero Touch run from last week that scored above 80, and escalate the rest.
The assistant lists the runs, shows you which go in each group, and records one decision per group with mutate(entity="zero_touch", action="bulk_review", data={..., "confirm": true}). It reports any run it skipped, for example a run that is still working.
The Zero Touch run for Appital looked at appital.com. The right website is appital.io.
The assistant calls mutate(entity="zero_touch", action="correct", data={..., "confirm": true}) with your words. The run is re-scored, and your instruction lands in its review trail. To replace the profile too, it follows with mutate(entity="zero_touch", action="reprofile", ...).
Here are my notes from the call with Acme. Update the Zero Touch result to match.
The assistant starts a proposal with mutate(entity="zero_touch", action="propose_revision", ...), polls query_assessments(kind="zero_touch_revision") until it is ready, and shows you each proposed change with the score before and after. It applies the changes you accept with mutate(entity="zero_touch", action="apply_revision", ...), which saves a new version. To undo it later, ask it to restore the earlier version.

Radar triage and cases

These prompts work the Radar signal queue and track incidents in cases.

Work the In alert queue

Walk me through the signals in alert from the last 7 days, most severe first.
The assistant calls query_radar(kind="signals", ...) and, for each signal you open, query_radar(kind="signal_detail") for its alerts and reasoning. For each one it offers to acknowledge, dismiss, move to another status, or open a case.
These three signals are routine patch notes. Dismiss them with the reason “routine release, no security impact”.
The assistant proposes the dismissal and calls mutate(entity="radar_signal", action="dismiss", data={..., "confirm": true}). Each dismissed alert becomes a negative example on the detector that raised it.
The Northwind breach is real. Acknowledge it and apply the proposed residual risk changes.
The assistant calls mutate(entity="radar_signal", action="acknowledge", ...), shows you the proposed change for each affected vendor, and records your decision with mutate(entity="radar_signal", action="decide_risk_impact", ...).
Open a case for the Northwind breach, add every affected vendor, and assign it to me.
The assistant calls mutate(entity="case", action="create", ...) linked to the signal, then mutate(entity="case_thread", action="bulk_create", ...) for the vendors. Each vendor’s owners and analysts get an in-app notice. Nothing reaches the vendors, so you send the emails from the case page.
Acme confirmed they were not affected. Close their thread.
The assistant reads the case with query_radar(kind="case_detail"), finds Acme’s thread, and calls mutate(entity="case_thread", action="update", data={..., "status": "closed", "confirm": true}).
Close the Northwind case as resolved.
The assistant warns you that closing as resolved raises the residual risk of the case’s vendors, then calls mutate(entity="case", action="update", data={..., "confirm": true}) with the resolution.
Why didn’t we get a signal for the Contoso outage?
The assistant calls query_radar(kind="event_diagnostics", ...), which traces the event from ingestion through source and detector and names the step that stopped it, with the action that fixes it.
Add the Contoso status page RSS feed as a source, then test our outage detector against the last 30 days.
The assistant calls mutate(entity="radar_source", action="create", ...), then mutate(entity="radar_detector", action="test", ...), and reads the candidates with query_radar(kind="detector_test_run"). You choose which candidates become real alerts.

Control guidance

These prompts build and tune control sets, their sections and their controls.

Create a control set from the library

Create a control set from the SOC 2 library template and apply it to vendors tagged SaaS.
The assistant reads the templates with query_controls(kind="library"), proposes the set, and calls mutate(entity="control_set", action="create", data={..., "use_library": "...", "applied_to_tag_ids": [...], "confirm": true}).
Make our Data Protection set stricter, and limit it to the SOC 2 report and the privacy policy.
The assistant reads the set with query_controls(kind="control_set_detail"), proposes eval_strictness and evidence_sources, and calls mutate(entity="control_set", action="update", data={..., "confirm": true}).
Add a section called Business continuity to the Vendor Baseline set, with a control asking whether the vendor tests its DR plan every year.
The assistant calls mutate(entity="control_section", action="create", ...), then mutate(entity="control", action="create", data={..., "control_section_id": "...", "expectation": "...", "eval_instructions": "...", "confirm": true}).
The encryption at rest control should need a document, not an attestation.
The assistant calls mutate(entity="control", action="update", data={..., "evidence_requirement": "document_required", "confirm": true}). The response carries the control’s new version ID.
Add a “Partially” option between Yes and No on the MFA control.
The assistant reads the existing choices and their perma_id with query_controls(kind="detail"), then sends the new choice in options with mutate(entity="control", action="update", ...).
If a vendor fails the incident response control, floor its InfoSec score at High.
The assistant finds the level on your risk scale with query_platform(kind="scales"), then calls mutate(entity="control", action="update", data={..., "significant_deficiency_level_id": "...", "significant_deficiency_scope": "risk_domain", "confirm": true}).

Tuning the AI

Find controls that flag too often

Which of our controls raise issues most often? I think some are misfiring.
The assistant calls get_report(report_name="control_flag_rates") to rank controls by issue-flag rate across recent assessments, with a volume floor so a control evaluated twice doesn’t top the list. Pass format='csv' if you want it in a spreadsheet.
Go through the flagged issues on assessment cbqsrw_abc123 with me and clear the ones that aren’t real.
The assistant walks each flagged evaluation with its evidence, and for the ones you clear calls mutate(entity="eval", action="update", data={..., "outcome": "not_an_issue", "confirm": true}).
That control keeps flagging vendors who do have MFA. Rewrite its guidance.
The assistant proposes new expectation, evaluation instruction, or evidence requirement text, confirms, then calls mutate(entity="control", action="update", data={..., "confirm": true}). Material edits create a new version rather than overwriting the old one. Re-run the analysis with mutate(entity="assessment", action="rerun", ...) to re-evaluate against the new guidance.

Canned prompts

Twenty scripted workflows you can invoke by name, including weekly_briefing, submit_intake_request, and tune_control_guidance.

Tool reference

Every route these prompts resolve to, and the parameters each accepts.

Replacing the assessment export

Every Consolidated Assessment Report column mapped to the call that returns it, with sample input and output.