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.
55
62%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Passed
No findings from the security scan
Fix and improve this skill with Tessl
tessl review fix ./plugins/data-analytics/skills/build-report/SKILL.mdUse 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:
sites-app for durable reports when the full Sites create, checkpoint, and deployment lifecycle is callable. Do not ask for another delivery choice or publish confirmation. Build and validate the canonical MCP artifact payload without visibly rendering it, then export and deploy it through Sites. Automatically switch to html when Sites is unavailable, publishing fails, or the user explicitly declines Sites. MCP servers and other callable tools remain valid evidence sources.mcp-app by default. After a successful final MCP report handoff, offer Sites as an optional coworker-sharing follow-up; do not publish unless the user explicitly requests or accepts it.html. Do not automatically publish to Sites or select mcp-app in this branch.html.html rather than omitting the report.On ChatGPT Desktop outside Work Mode, 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 positively identifies Work Mode, treat the MCP artifact as the wrong delivery mode regardless of surface. Rebuild through sites-app when the full Sites create, checkpoint, and deployment lifecycle is callable, and otherwise rebuild the report as self-contained HTML before final handoff.
Select exactly one delivery mode per run. sites-app is one delivery mode, not an MCP app plus an HTML report. 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. Switch a Sites run to HTML only when the full Sites lifecycle is unavailable, publishing fails, or the user explicitly declines Sites. For every selected HTML report path, including ChatGPT Desktop explicit HTML, Work Mode fallback HTML, and HTML created for PDF, Google Docs, or Google Slides conversion, author the same canonical artifact.json shape accepted by validate_artifact, then package and verify it once with npm run report:deliver -- --input artifact.json --output report.html from the plugin root. Do not maintain a separate HTML-only chart or layout implementation.
Define the reporting job.
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 the matching audience specification.
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.
Gather and bound the evidence.
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.
Distill the report spine.
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.
Plan the reader-facing structure.
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:
Apply report standards and audience requirements.
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.
Design visuals and tables.
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.
Choose and build one delivery 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. In HTML mode, follow Portable HTML Packaging in ../../src/analytics-app-core.md: save the full validated report input as artifact.json and run the packaged delivery command to create and verify report.html.
For sites-app, read the MCP app report specification and shared analytics app core, build the same complete manifest and bounded snapshot, and call validate_artifact. In Work Mode, do not call render_artifact; after validation succeeds, create or reopen a Sites worker-starter checkout and call export_artifact_package with that project id and checkout path as output_dir.
Invoke $publish-artifact-to-sites for the Sites handoff. In ChatGPT Desktop outside Work Mode, do this only after an explicit request or acceptance of the post-handoff sharing offer; in Work Mode, the report request authorizes the automatic Sites handoff. Follow the current sites-hosting workflow for version saving, deployment, and polling; use one Site per logical report and deploy a new version when refreshing it. If the Sites exporter cannot hand its files to the hosting workflow or deployment fails in Work Mode, automatically switch this run to self-contained HTML, report the Sites blocker briefly, and do not claim that a Site was published.
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.
Validate the finished report.
Review the rendered report itself, not just its source files. Confirm that:
Fix the report before handoff when any of these checks fail.
Hand off the selected report.
Lead with the selected report artifact result or blocker. Then list only the relevant MCP app artifact, Sites URL, or HTML report path, plus supporting source, SQL, code, notebook, and chart artifacts. For sites-app, include the snapshot timestamp and say that the Site contains a published snapshot rather than a live connection. After a successful final MCP app handoff in ChatGPT Desktop outside Work Mode, offer to publish the report to Sites if the user wants to share it with coworkers; do not invoke the publishing workflow until they explicitly accept. 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 mcp-app or sites-app. That file owns the shared manifest/snapshot mechanics plus the different visible-render and hosted-export handoffs so this root workflow stays delivery-mode neutral.
Skill Configuration; on ChatGPT Desktop outside Work Mode, do not choose it before an MCP attempt unless the user or downstream conversion explicitly requires HTML.../../src/analytics-app-core.md, including Shared Contract and Portable HTML Packaging. Author artifact.json as a complete validate_artifact input with surface: "report", ordered native manifest blocks, bounded snapshot datasets, canonical sources, and any required access issues. Use the same report block, card, chart, table, and source contract as the MCP artifact reader.npm run report:deliver -- --input artifact.json --output report.html once from the plugin root. This one command revalidates the artifact, invokes the only HTML renderer for this workflow, and, when a compatible installed Chromium is available, extracts shared-renderer chart SVGs and runs the bounded browser verifier against the same artifact. The renderer always embeds the read-only artifact reader with the shared app tokens and layout and generates the semantic no-script/print/conversion representation from the same data.<meta name="color-scheme" content="light dark"> and prefers-color-scheme-driven tokens intact. Verify content, charts, semantic fallbacks, source affordances, and focus states in both light and dark system modes; do not replace this behavior with a manual-only theme toggle.source metadata or a sourceId that resolves to manifest.sources[]. Include exact source identity and, for structured data, the fully qualified table or view; list every material source for joined or multi-input evidence. Use precise dataset, file, or document names for non-tabular evidence. Never invent provenance; preserve unavailable-source gaps in access issues, source metadata, or report notes as appropriate.sourceId only when every quantitative claim in that block comes from the same canonical source. Split mixed-provenance claims into separate markdown blocks, omit sourceId on title-only or prose-only blocks, and never guess a source. The referenced source may be a structured query, file, or document and does not require SQL.artifact.json. The builder replaces package_info with the portable read-only delivery envelope; that envelope is runtime configuration, not provenance.stages.verification: "passed" as sufficient per-report QA. It confirms that the HTML embeds the exact canonical artifact, then reuses an installed Chromium—never downloading a browser—to verify the enhanced reader at desktop and narrow widths, content counts and visibility, overflow, no network calls or browser errors, and a representative source menu/dialog flow. Do not write a bespoke Playwright script, take routine screenshots, or repeat browser inspection when it passes; screenshots are failure-only. A successful receipt with stages.verification: "structural_only" means no compatible browser was available: exact payload equality and the required runtime, reader, and semantic-fallback roots passed, but chart SVG extraction and per-artifact browser QA did not run. Keep the delivered semantic chart tables, report that QA limitation, and do not install a browser during report generation.report-to-pdf, report-to-google-doc, or report-to-google-slides with the generated HTML, not a live MCP app report.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.sourceId only under the single-source rule above so generated readers can expose provenance on those values. Do not attach a source to unsourced prose merely to create a tooltip.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.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 notes5fd93af
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.