openai/build-report
Build polished analytical reports for executive, product, business, or technical audiences. Use when the task needs a durable answer-first narrative with evidence-backed findings, visuals or tables, caveats, and source context.
npx skills add https://github.com/openai/role-specific-plugins --skill build-report
Use the focused analysis skill before building the report when the report depends on market sizing, metric diagnostics, KPI reporting, product/business analysis, data-quality checks, or validation.
Use this skill when the user needs a durable analytical report rather than a dashboard, notebook-only dump, or transient chat summary. The report owns the reader-facing narrative, audience shape, evidence placement, visual/table placement, caveats, source metadata, and handoff. The underlying analysis should still come from the appropriate analysis, notebook, data quality, diagnostics, KPI, or product-analysis workflow.
If this skill is selected directly or included by a report-mode workflow, the run is incomplete until the selected report surface exists or a concrete blocker is recorded. Do not finalize with chat-only prose, an inline widget, a local URL, or an ad hoc artifact that skips the report shape. Treat inline summaries and notebook outputs as progress evidence, not as substitutes for the report. Once this skill is selected, reserve charts, tables, and previews for the selected report surface. A user can explicitly waive report creation by requesting an inline, chat-only, brief/no-artifact answer, asking for no report/file/artifact, or selecting another primary artifact. Do not infer a waiver from the absence of the word "report" or from a direct diagnostic, recommendation, sizing, or readout question.
Choose exactly one report delivery mode for each run:
mcp-app by default.html; MCP app report rendering does not work on that surface. MCP servers and other callable tools remain valid evidence sources.html; do not treat an unknown surface classification as permission to render an MCP app report. Only a positive surface = codex_desktop signal may take the Codex desktop MCP default.html.html rather than omitting the report.On Codex desktop, use html only when the user explicitly asks for HTML, offline portability, a file-based artifact, or no MCP rendering; a requested downstream conversion requires HTML; or an MCP app report was actually attempted and failed because the capability was unavailable or a documented renderer limit was exceeded.
If the selected MCP app report cannot be rendered after one targeted correction, fall back to html in the same run unless the user explicitly declined HTML. A renderer failure changes the delivery mode; it does not waive the report. If neither surface can be created, record the concrete blocker and the attempted surfaces before finalizing.
If an MCP app report was already rendered and the current context later identifies Work Mode without a positive Codex desktop surface, treat the MCP artifact as the wrong delivery mode. Rebuild the report as self-contained HTML before final handoff instead of explaining that the MCP artifact is acceptable.
Select exactly one delivery mode per run. Do not build an MCP app report and a static report.html as parallel outputs unless the user explicitly asks for a second delivery mode as a separate follow-up. For every selected HTML report path, including Codex desktop explicit HTML, ChatGPT web Work Mode, and HTML created for PDF, Google Docs, or Google Slides conversion, use the precompiled Recharts-in-HTML path in recharts-html.md, with a readable same-data static fallback in the delivered HTML.
State the user question, decision or action the report should support, primary audience, scope, time frame, comparison baseline, success criteria, and what would make the report decision-useful. Choose exactly one audience:
product stakeholders: default for product, business, leadership, strategy, diagnostics, KPI readouts, and general stakeholder reports.technical: only when the user asks for a technical or methods-first report, or when the report's main value is methodology such as metric definitions, measurement design, statistics, modeling, experimentation, or validation.If the work is unusually methodology-heavy but the user did not ask for a technical audience, ask before switching.
Read exactly one matching audience specification before gathering evidence, shaping the report spine, or drafting the report surface:
product stakeholderstechnicalTreat the selected audience specification as a report-quality contract, not as a replacement for the workflow below. Capture its Required Structure entries in the report plan or supporting source notes, and stop with a blocker if the matching specification cannot be read.
Inventory the source data, metric definitions, denominators, assumptions, requested cuts, caveats, notebooks, SQL, scripts, query permalinks, source documents, and reviewed datasets needed to support the report. Resolve ambiguities before drafting claims. If a requested metric or cut cannot be supported, record why and state what evidence would be needed to add it. Preserve process notes, source inventory, and reproducibility notes in source metadata, source notes, or supporting artifacts, not in the visible report body.
When this skill is selected directly and the user explicitly asks to "use sample data" or create a report "using the sample data" without naming or attaching a different sample, treat that wording as selection of the bundled synthetic demo. Resolve demo-product-growth.csv relative to this skill, analyze those rows, label them synthetic, and do not search the workspace for a substitute or invent replacement data.
Before choosing a delivery surface, write or mentally verify a compact answer-first report spine with these entries:
Ensure report segments are clearly separated and duplicate feature/metric coverage is removed. Each major segment should have one clear job in the report and should pair a claim with evidence, interpretation, and a concrete implication.
If the spine has only a title, an executive summary, and one chart or table, stop and expand the evidence path before rendering unless the user explicitly asked for a brief.
Draft the ordered major segments, visible segment titles, and intended evidence format for each segment before building the surface. Use visuals by default for quantitative findings when real data is available; use tables for exact lookup, audit detail, or cases where a chart would obscure the point. If a quantitative segment has no visual, record the omission reason in source notes or supporting artifacts.
Every planned major segment must have a reader-facing title that will appear in the final report. Do not rely on chart headers, table titles, or non-rendered structure alone to carry the section title.
Apply the report depth gate before building:
After the general structure exists, apply the relevant standards in this skill. Map each planned major segment to the selected audience specification's Required Structure entries, and record any merged, renamed, reordered, or omitted entry with a reason.
Route every report visualization through $visualize-data for chart selection, chart contract, and final-context QA. Keep chart-selection rationale, validator notes, and QA details in working notes, source notes, or supporting artifacts unless the user asks for methodology or the detail changes the reader-facing takeaway. Make sure every visual or table supports a specific report claim rather than existing as decorative context. Plan an adjacent explanatory paragraph for every visualization before rendering. Reserve chart, table, and preview output for the selected report surface.
Use the single delivery mode selected after the report spine and evidence plan are clear. Do not add a second mode unless the user explicitly asks for it as a separate follow-up.
Build the selected surface so it preserves the report reading path, visible titles, evidence order, caveats, and source metadata. Use the delivery-mode specifications in Report Standards as implementation guidance for the selected surface, not as a substitute for the report-building workflow.
If the user asks to share an MCP app report or dashboard as a hosted link, use the artifact app's Site Creator share path after the MCP app is valid. Call export_artifact_package to materialize the current manifest, bounded snapshot, package metadata, inline-safe source text, and real MCP artifact runtime into a Site Creator-compatible app; do not hand-roll standalone HTML or publish a viewer that depends on MCP-only host payload state. Follow the sites-hosting workflow and default new hosted report access to workspace_all unless the user asks for narrower access.
When revising an existing report, treat the current rendered report and source metadata as the starting artifact. Preserve every existing section, visual, table, source, dataset, title, and caveat exactly unless the user explicitly asks to change it or the requested edit makes a narrow dependent update unavoidable. A request to add a section, swap a chart, restyle a visual, or customize one part of the report is not a request to summarize, replace, reorder, or drop the rest of the report. Render the full revised report in the selected surface; do not hand off a section-only, slimmed, or partial replacement artifact when the prior report was complete.
For correction passes after a validation or rendering issue, patch the previous full report artifact in place. Limit changes to the affected visual, table, section, dataset, or source plus any directly dependent references. Preserve unrelated ids, reading order, narrative text, caveats, recommendations, source metadata, package metadata, and datasets unchanged when the selected surface exposes those concepts. Before rendering, compare the old and new artifact structures and confirm that only the intended parts changed. If the previous full artifact is not available, stop and surface that blocker instead of rebuilding a shorter replacement from memory.
Review the rendered report itself, not just its source files. Confirm that:
Fix the report before handoff when any of these checks fail.
10. Hand off the selected report.
Lead with the selected report artifact result or blocker. Then list only the relevant MCP app artifact or HTML report path, plus supporting source, SQL, code, notebook, and chart artifacts. In HTML mode, the actual interactive report.html file is the primary deliverable. A rendered PNG or screenshot may be included only as a labeled non-interactive QA preview; never use image.png, a screenshot, or another flattened image as the only report handoff. If the host cannot render HTML inline, attach or link the .html file instead of flattening it. Self-audit the report against the quality bar before handoff. If HTML sharing or conversion is needed and safe, resolve the presentation surface; otherwise record why sharing was unsafe, unavailable, or explicitly waived. Do not substitute a chat summary for the report.
When the user asks to export a Data Analytics report, dashboard, or inline chart surface to PDF, use report-to-pdf. That sub-skill owns PDF conversion mechanics so this root workflow stays delivery-mode neutral.
Read mcp-app-report.md when the selected report surface is an MCP app report. That file owns MCP app report mechanics so this root workflow stays delivery-mode neutral.
Skill Configuration; on Codex desktop, do not choose it before an MCP attempt unless the user or downstream conversion explicitly requires HTML.../../assets/html-report-shell.html, and preserve or adapt its report data-contract-section attributes to the selected audience specification. Use its packaged Recharts runtime for live charts and keep same-data static SVG/table fallbacks directly in the HTML.<meta name="color-scheme" content="light dark">, semantic color tokens, and the @media (prefers-color-scheme: dark) token overrides. Verify report content, charts, fallbacks, source tooltips, and focus states in both light and dark system modes; do not replace this behavior with a manual-only theme toggle.Source: <source system, connector, or artifact> and, for structured data, Table: <fully qualified table or view>. For a value derived from joins or multiple inputs, list every material contributing source and table. For non-tabular evidence, replace Table with the precise Dataset, File, or Document name. Never invent provenance; mark an unavailable table or source explicitly and preserve the gap in source notes.source-tooltip pattern, not only a native title attribute. Keep the number readable without interaction and the tooltip text concise. Associate each tooltip with the number it supports; a shared tooltip is acceptable only when it unambiguously covers every number in the containing group and all share identical provenance.source-tooltip-content style for narrative values, KPI and metric-card values, table values, and chart figures. Do not create card-, narrative-, table-, or chart-specific tooltip variants. Foreground, background, typography, padding, radius, and shadow must match, and tooltip text must explicitly use the shared foreground color instead of inheriting a muted or emphasized color from its surrounding value.Source affordance only, not on the whole figure or chart image. Keep query text, credentials, request ids, and local paths out of reader-facing tooltips.report.html itself, not only the shell or a screenshot. Verify live Recharts mounts render, same-data fallbacks stay readable when scripts do not run, and the delivered file has no sibling chart-image, local-runtime, or remote-script dependency. Verify that every source-backed visible number is wrapped by source-tooltip, each tooltip contains real non-placeholder provenance, and every chart figure has a visible source affordance plus tooltip content whose hover/focus target is the Source affordance rather than the whole chart image. Compare representative inline, card, table, and chart tooltips and confirm they use the same computed foreground, background, typography, padding, radius, and shadow. Do not flatten the HTML into an image as the report deliverable. Use report-to-google-doc or report-to-google-slides only with HTML reports, not live MCP app reports.Executive Summary section heading immediately after the title before the summary content.## section headings in one markdown body. Use ### headings only for subordinate content that should remain in the same card. Keep chart/table headers neutral, and put takeaways in adjacent narrative blocks rather than hiding the argument inside visual metadata. Markdown blocks are the primary place for the story.bold topic sentences in important body paragraphs, keep recommendations as real markdown lists, and avoid collapsing list items into run-on paragraphs.
1., 2., and 3. items in the same paragraph, and do not leave an intended list item as an unnumbered continuation line.metrics[] entry. Use labeled chips for short comparison context tied directly to that headline, such as its prior-period value, target, or delta. When a decision-relevant directional comparison is already used in the executive summary or findings, preserve it as a later comparison metric and set signed: true; move independent secondary measures to another card, chart, table, or narrative block.HTML Report Specifications; keep them out of the always-visible narrative unless needed for trust.Growth accelerated after mid-April and ended at a period high or FY2021-FY2024, values in millions of USD. Keep descriptions and subtitles hidden by default unless showDescription or an equivalent flag is needed to clarify the reading path.$visualize-data to request a finer grain, longer lookback, or meaningful segment breakdown before rendering. If the source cannot support that without misleading the reader, replace the trend with a KPI strip, grouped period bars, table, or concise narrative comparison and record the omitted richer trend in source notes or supporting artifacts.movement: true, semantic: "movement", or role: "movement". Values in those columns should carry the intended sign or arrow, such as +12%, -$4.2M, ↑3 pp, or -18. Keep composition, mix, share, percentile, and current-value columns neutral.899k, 10.9k, or 1.2M. Reserve exact comma-separated values for audit tables, SQL outputs, appendices, or cases where precision changes the interpretation.Before final handoff, confirm:
Required Structure maps to visible report sections, with any merge, rename, reorder, or omission recorded in source notes or supporting artifacts$visualize-data, inspected in the selected surface, and remain readable with useful subtitles, adjacent explanatory paragraphs for every visualization, source metadata, and supporting notesTake openai/build-report from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.