Reports
Every autopilot task produces a styled HTML report — task summary, per-worker output, review badges, cost, and duration — stored with a permalink and shareable by URL. This page covers the five-step pipeline that produces a report, the report’s anatomy, and how to retrieve, embed, or share one.
Try it now: View a live sample report ↗
The pipeline
Every autopilot run flows through the same five steps. The report is the audit trail of what happened at each one.
| # | Step | What happens |
|---|---|---|
| 01 | Template | A registered template (customer_support, cfo, security_audit, …) decomposes the task into roles and assigns each role a worker. |
| 02 | Safety | Every LLM call routes through the gateway’s governance chain — PII scan, prompt-injection detection, budget enforcement, model allowlist. |
| 03 | Workers | Each role runs in a sandboxed managed runner (or directly against the gateway, for non-tool tasks). |
| 04 | Review | An LLM review council scores each worker’s output and votes approve or request_changes. Quorum logic determines the workflow status. |
| 05 | Report | A styled HTML document is rendered from the worker outputs + review votes and persisted to MongoDB. The permalink is returned. |
Steps 02-04 are documented in the linked guides. The rest of this page is about step 05 — the report itself.
Anatomy of a report
Every report has the same five sections, regardless of which template produced
it. The schema is generated by _save_html_report in
services/backend/src/services/autopilot/runner.py.
| Section | Fields |
|---|---|
| Header | title, template, total_cost (USD), duration (seconds), created_at (UTC) |
| Task | First 500 chars of the original task description |
| Pull requests | Links to PRs created during execution (present only if the template opened PRs) |
| Worker cards | One card per worker role: status dot (success / failure), review badge, per-worker cost, markdown-rendered output |
| Footer | task_id and a deep link back to the dashboard |
Review badges
Two badges can appear next to each worker:
- Approved (teal) — every reviewer on the council voted
approve. - Request changes (amber) — at least one reviewer voted
request_changes.
Reviews are automated — they come from the LLM review council defined by
the template’s reviewer (see template.reviewer.review() in
services/backend/src/services/autopilot/orchestrator.py). They are not
human-in-the-loop approvals; HITL gates live in the gateway governance chain
and are not reflected in report badges.
Retrieving a report
Short URL
https://api.curate-me.ai/reports/{report_id}302-redirects to the canonical path below. Use this form when sharing.
Canonical API
curl https://api.curate-me.ai/api/v1/autopilot/reports/report_abc123Returns text/html. The endpoint is intentionally unauthenticated — reports
are shareable by URL possession, which is what makes the “send a link to your
team” flow work without provisioning seats. If you need to gate read access,
either keep the URL private or front the endpoint with your own auth proxy.
Public share tokens are on the roadmap.
The report_id is always report_{task_id} — if you have the task ID from
the autopilot API, you can compute the report URL without an extra lookup.
Dashboard
The dashboard renders the report in a sandboxed iframe at:
https://dashboard.curate-me.ai/teams-tab?view=report&id={report_id}This is the form linked from the report footer’s “View in Dashboard” link.
Sharing and embedding
Three patterns, in order of friction:
1. Paste the short URL into Slack or Teams. Autopilot already does this automatically when you configure a notification channel — see Slack Integration.
2. Embed in your own app with an iframe:
<iframe
src="https://api.curate-me.ai/reports/report_abc123"
sandbox="allow-same-origin"
style="width: 100%; height: 800px; border: 0;">
</iframe>The dashboard uses this exact pattern. The allow-same-origin sandbox keeps
the report styled while preventing it from running scripts in your context.
3. Server-side fetch and render — pull the HTML, transform if needed, serve from your own origin:
curl -s https://api.curate-me.ai/reports/report_abc123 > report.htmlWhich templates produce reports
Every autopilot template emits a report. The list is generated at startup from
services/backend/src/services/autopilot/registry.py and auto-loaded
SKILL.md templates. Current set:
| Engineering | Operations | Research |
|---|---|---|
dev_team | cfo | autoresearch |
code_review | customer_support | news_digest |
pr_writer | recruiter | data_analyst |
repo_manager | legal_review | sales_research |
perf_audit | compliance_report | seo_research |
security_audit | vendor_dd | product_research |
doc_drift | hype_agent | web_agent |
There is no per-template opt-out — if a task ran, a report exists.
Storage and retention
| Store | Collection / TTL | Purpose |
|---|---|---|
| MongoDB | autopilot_reports, indexed on report_id | Permanent audit trail |
| MongoDB | autopilot_results, indexed on task_id | Structured task data |
| (none) | — | Reports have no automatic TTL — they persist for the life of the org |
Report size is logged as size_bytes on the document. Reports are written
once at task completion via _save_html_report — they are not regenerated if
the template changes later.
Next steps
- Runners Quickstart — the sandboxed execution layer behind step 03
- Slack Integration — auto-post reports to a channel as they finish
- Gateway Governance Chain — what step 02 actually enforces