Labsco
openai logo

moody-s-earnings-brief

✓ Official4,081

by openai · part of openai/plugins

Produce an Earnings Call Summary HTML report for 2–5 companies using Moody's GenAI MCP tools. Use this skill whenever the user asks to summarize earnings calls, generate an earnings call summary, analyze earnings transcripts across peers, or create an earnings call report. Trigger even if they just name companies and mention "earnings" or "transcript".

🧩 One of 7 skills in the openai/plugins package — works on its own, and pairs well with its siblings.

This is the playbook your agent receives when the skill activates — you don't need to read it to use the skill, but it's here to audit before installing.

Earnings Brief Skill

Generates a professional HTML report (styled like a Moody's earnings call summary PDF) for 2–5 companies by pulling data from multiple Moodys MCP server MCP tools and consolidating 13 structured sections plus a hardcoded table of contents into a single HTML artifact.

The workflow is single-artifact delivery: gather all data, then write the entire filled HTML document to a single .html file in /mnt/user-data/outputs/ and present it to the user via present_files. The rendered HTML artifact is the deliverable.

⚠️ CRITICAL — NON-NEGOTIABLE OUTPUT CONTRACT

The LLM MUST deliver the final report as a single standalone HTML artifact file. This is the only acceptable form of delivery for this skill. Specifically:

  • The LLM MUST write the complete, standalone HTML document (<!doctype html></html>), with every section from the streaming protocol populated inline, to a single .html file in /mnt/user-data/outputs/ using the create_file tool, then surface it to the user with present_files.
  • The LLM MUST NOT emit the report inline as a fenced ```html code block, as prose, Markdown, JSON, attachments, or links. The rendered HTML artifact itself is the answer.
  • The LLM MUST NOT split the report across multiple files, multiple messages, partial snippets, or summaries.
  • If data gathering fails partially, still produce the single HTML artifact file with the best-available content. When the earnings call transcript for a company cannot be located, note that fact in the Executive Summary and omit the company from every other section of the report (no rows, no subtitles, no "--" placeholders for that company). When a transcript exists but does not contain information for a specific section, omit that company from that section only (no subtitle, no bullets, no placeholder). Never skip the artifact itself.

Treat any other output shape as a hard failure of the skill.

Allowed data sources

This skill may only extract information from the following two sources:

  1. Moodys MCP server — tools used: findEntity and searchEntityEarningsCall. These are the only MCP tools that may be called. Do not call getEntityCreditOpinion, getEntitySectorOutlook, getEntityEsg, getEntityPeers, searchEntityDocuments, searchNews, or any other MCP tool, regardless of section.
  2. web_search — used only as a fallback when searchEntityEarningsCall returns no usable earnings call transcript for a given company, and used only to locate and extract the text of that company's earnings call transcript on the web. Do not use web_search for credit opinions, sector outlooks, news, peers, ESG, or any other purpose. Recency requirement (web_search fallback): if the transcript located via web_search is older than 100 days from today, discard it and treat the transcript as unavailable for that company. Do not fall back to any other source — handle the company per the missing-transcript policy (note in the Executive Summary, omit from every other section). These rules apply to every section of the report. No section may be enriched with credit, sector, ESG, peer, filings, or news data.

Bundled files

  • assets/template.html — self-contained static report shell (CSS + named section placeholders). No embedded data, no inline script. Treat this file as the read-only structural reference: read it, fill it in, and write the complete filled document to a new .html file in /mnt/user-data/outputs/.

Template (shared)

Before emitting the HTML report, read both:

  1. skills/shared/template/SKILL.md — authoring rules (which classes / snippets are owned by the shared layer, allowed per-skill overrides, outlook-badge usage).
  2. skills/shared/template/assets/template.html — canonical CSS (inside <style id="shared-template-css">) and literal HTML markup snippets (inside <template> tags) for the document head, cover, TOC, section block, sources-section wrapper, footer, and outlook-badge. Lookup order — always check the shared template before inventing. If a class, design token, layout primitive, or scaffold element you need is not defined in this SKILL.md or already present in this skill's assets/template.html, the shared template skill is authoritative. Do not invent CSS, HTML scaffolds, or design tokens that the shared skill already provides; do not silently restyle anything the shared skill owns (cover, TOC, section, sources-section wrapper, footer, outlook-badge, design tokens, reset, body / page base).

At emit time, copy the contents (not the <style> wrapper) of <style id="shared-template-css"> from the shared asset into the parent template's reserved marker region between the CSS-comment markers /* BEGIN shared-template-css ... */ and /* END shared-template-css */. For HTML scaffolds (head boilerplate, cover, TOC, sources-section wrapper, footer), use the literal markup from the matching <template> snippet in the shared asset. The parent template no longer carries duplicated chrome CSS — those rules ship only in the shared asset.

This skill uses the cover-multi variant. Skill-specific overrides retained above the marker region: none for ECS (it inherits the canonical body { font-size: 13px } and .page { max-width: 900px } defaults). Skill-specific CSS that stays local: the ECS .credit-badge, the .yoy-table / .ratings-table rules, and .ratings-factors. All outlook-badge usage in this skill must use the canonical pastel variants (stable / positive / negative / review / na) defined by the shared skill — no solid-fill or inline-color overrides.

Citations (shared)

Before emitting any [n] reference inline, any per-section recap block, or the end-of-document Citations block, read both:

  1. skills/shared/citations/SKILL.md — authoring rules (numbering, hyperlinking, source data shape, carve-outs).
  2. skills/shared/citations/assets/template.html — canonical CSS (inside <style id="shared-citations-css">) and literal HTML markup snippets (inside <template> tags) for inline references, the end-of-document Citations block, and the optional .section-citations recap. At emit time, copy the contents (not the wrapper) of <style id="shared-citations-css"> from the shared asset into the parent template's reserved marker region, located inside assets/template.html between the CSS-comment markers /* BEGIN shared-citations-css … */ and /* END shared-citations-css */. The parent template no longer carries duplicated citation CSS — those rules ship only in the shared asset.

Skill-specific carve-outs that override or extend the shared rules are listed in the section synthesis rules below — most importantly: the numeric .yoy-change cell stays citation-free (no <a class="cite-ref"> or <span class="cite-ref"> inside it). The prefix used for the end-of-document container in this skill is ecs, so the container id is #ecs-sources. Optional per-section recap blocks live in #ecs-cite-a#ecs-cite-l.


Step 1 — Resolve companies

For each company name provided by the user, call findEntity to get the canonical entity name and entity ID (use the canonical name throughout the report).

Collect 2–5 companies. If the user gives fewer than 2, ask for more.


Step 2 — Read the template

Read assets/template.html (relative to this skill directory) once. Keep its exact structure — CSS, <head>, hardcoded TOC, section order, table skeletons, row labels, and element IDs — as the scaffold for the final artifact. Do not copy it to the workspace and do not open it.


Step 3 — Gather earnings call transcripts

For each company, fire the following calls in a single parallel batch (one message, many tool calls):

Earnings call transcript (×4 per company) — primary source

Category labelKeywords
Revenue & PriceRevenue, Net Sales, Sales, Volumes, Units sold, Price, Pricing
Sector & MarketIndustry, Sector Performance, Demand, Market Condition
Supply Chain & RegionSupply Chain, Materials, Tariffs, Input, Logistics, Regional Performance, Geographic Condition, Geography
Guidance & EventsBusiness Outlook, Guidance, Revision, Corporate Events, Transaction

Web search fallback (only if searchEntityEarningsCall returns nothing usable)

If — and only if — searchEntityEarningsCall returns no usable transcript content for a given company, run web_search to locate that company's most recent earnings call transcript on the web, and extract the transcript text from the result. The web search must be scoped solely to finding the earnings call transcript for that entity — not to news, analyst commentary, credit opinions, or any other content.

Apply the 100-day recency rule: check the date of the transcript located via web_search. If the transcript is older than 100 days from today, discard it and treat the transcript as unavailable for that company. Do not substitute any other source.

All synthesis in Step 4 must be derived exclusively from the transcript content gathered in this step (either via searchEntityEarningsCall or, where applicable, the web_search fallback). No other tools may be called.

Missing-tool handling

If any of the tools required for a section do not exist, inform the user: One or more tools required for this section are not available under your current subscription. Unlock more of the expert insights, data, and analytics you trust. Get [in touch] with us to learn more. The [in touch] should be the link Link:https://www.moodys.com/web/en/us/capabilities/gen-ai/ai-ready-data.html


Step 4 — Synthesize + emit the complete artifact

After data is gathered, write the entire filled template.html document — with every element from the streaming protocol populated in place — to a single .html file in /mnt/user-data/outputs/ using the create_file tool, then call present_files on that path. The file is the deliverable; do not also paste the HTML into the chat as a fenced code block.

The HTML file must:

  • Be a complete, standalone HTML document (doctype → </html>) that renders without external dependencies.
  • Preserve the template's <head> (CSS, fonts), hardcoded TOC, section order, table skeletons, row labels, and element IDs exactly. Only the empty targets defined below are populated.
  • Be written in a single create_file call (no progressive str_replace edits, no multi-file split). Render order of content inside the file follows the page top-to-bottom so the artifact is human-readable as well as browser-renderable: cover/TOC fields first, then sections 1 → 13, then sources.

Use earnings call transcript content as the sole source for every section. Do not enrich with credit, sector outlook, ESG, peer, or news data — those tools are not permitted in this skill. Write in professional financial language. Name specific companies in bullets rather than speaking abstractly.

Attribute substantive claims with numbered citation references. The exact inline markup, the URL-less fallback, and the rule that n matches the row position of the source inside #ecs-sources are defined in skills/shared/citations/SKILL.md.

Cover / header fields (write first)

  • #ecs-report-date — e.g. April 4, 2026 (plain text)
  • #ecs-footer-date — same value (plain text)
  • #ecs-company-count — number of companies (plain text)
  • #ecs-company-chips — one <span class="company-chip">Company Name</span> per company (space-separated)
  • #ecs-cover-img-right, #ecs-cover-img-bottom — optional. If you have image URLs or data URIs to use, set the src attributes and add the has-cover-image class to the corresponding container (<div class="cover-top has-cover-image"> and/or <div class="cover-bottom has-cover-image">). If you do not have images, leave the template as-is — the empty image strips will collapse automatically and the cover will render as a clean navy block with the accent bar.

Section synthesis rules

Per-section omit rule (applies to every section a–l). If a company's earnings call transcript exists but does not contain information relevant to a given section, omit that company from that section entirely — do not emit a row, subtitle, bullet, or any "Not disclosed" placeholder for it. The section may legitimately cover fewer companies than the full set. (Companies whose transcript could not be located at all are handled per rule a and are excluded from every section.)

a. Executive Summary#ecs-executive-summary Exactly one combined <p> paragraph of 100 words or less that summarises the entire contents of the newsletter across all covered companies. Do NOT write one paragraph per company and do NOT structure it as a per-company recap — it must be a single, general, combined summary of the whole report based solely on the earnings call transcript content. May carry inline <a class="cite-ref">[n]</a> hyperlink citations. If the earnings call transcript for any requested company could not be located (neither via searchEntityEarningsCall nor a web_search result within the 100-day window), explicitly note that fact in the Executive Summary (e.g., "An earnings call transcript for {Company X} could not be located and it is therefore not covered in this report."). That company must then be omitted from every other section — no row in the YOY tables, no subtitle, no bullets, no placeholder.

b. Overall Credit Consideration#ecs-credit-badge + #ecs-overall-credit Answer the question: Are conditions in the industry and macro-environment credit positive, negative, or neutral? Determine the answer solely from the earnings call transcript content, by looking across all covered companies for industry-wide trends and patterns. Write the sentiment badge into #ecs-credit-badge (see snippet below). Write one intro <p> (≤250 chars) that gives an overview with a clearly formed opinion on whether industry/macro conditions are credit positive, negative, or neutral, followed by a <ul> of exactly 5 <li> bullets (≤150 chars each) into #ecs-overall-credit that list the five considerations supporting that view. The intro paragraph and each bullet may carry inline citations. The view and every supporting consideration must be derived from trends or patterns observed across the covered companies — i.e., the industry as a whole. Do not extrapolate isolated events that apply to just one company into an industry-level claim. Group companies that share a dynamic into a single bullet (e.g., "Company A and Company B both cite easing input cost pressure …"). Do not write one bullet per company. Draw exclusively on the earnings call transcript. Do not consult credit opinions, sector outlooks, or any other tool.

c. Revenue YOY Trend#ecs-tbody-revenue One <tr> per company: company-wide YOY revenue change (+X.XX% / -X.XX% / Up / Down / Flat / Not specified) and a 70–90 char commentary. Not segment-specific. The commentary cell may carry inline citations; the numeric .yoy-change cell stays citation-free.

d. Volumes YOY Trend#ecs-tbody-volumes Same row format as (d) but for sales volumes. The commentary cell may carry inline citations; the numeric .yoy-change cell stays citation-free.

e. Selling Price Trend#ecs-tbody-prices Same row format as (d) but for selling prices. The commentary cell may carry inline citations; the numeric .yoy-change cell stays citation-free.

f. Qualitative / Broad Industry Commentary on Revenue, Volumes & Pricing#ecs-qualitative Exactly three paragraphs in this fixed order: a. Revenue, b. Volumes, c. Pricing. Each paragraph must give a general view of the industry in which the covered companies operate — i.e., synthesise the cross-company patterns observed in the earnings call transcripts into an industry-level commentary, not a per-company recap. Each paragraph must be between 200 and 300 characters. Prefix each paragraph with a <strong class="subsection-title">Revenue</strong> (etc.) subheader. Derive macro framing exclusively from cross-company observations in the earnings call transcripts. Each paragraph may carry inline citations.

g. End Market Conditions#ecs-end-markets Exactly four thematic commentaries describing the market conditions in which the covered companies operate. Each commentary has a <strong class="subsection-title">…</strong> subheader (≤70 chars summarising the bullets) + a <ul> with at least 2 <li> bullets. Combined bullet length per commentary: 250–300 characters. Derive narratives exclusively from the earnings call transcripts. Each bullet may carry inline citations. Provide your view on the trends or patterns observed across all covered companies — these commentaries must reflect cross-company industry dynamics, not isolated single-company facts repackaged. Each bullet (and every comment) must explicitly name the company or companies it applies to by stating the company name directly within the sentence. If two or more companies share the dynamic, name all of them in the same bullet. Do not write company-agnostic bullets.

h. Supply Chain Conditions#ecs-supply-chain Emit exactly three important thematic commentaries, each covering one of the following topic areas: (1) Raw Materials / Input Costs, (2) Trade Relations / Tariffs, or (3) Impact on Business Operations. Pick the three most relevant topics surfaced in the transcripts (the three may be the three distinct topics above, or any combination drawn from them where the same topic recurs across companies in materially different ways). Each commentary has a <strong class="subsection-title">…</strong> subheader (≤70 chars summarising the bullets) + a <ul> with at least 2 <li> bullets. Combined bullet length per commentary: 200–250 characters. Each bullet may carry inline citations. Provide your view on the trends or patterns observed across all covered companies — these commentaries must reflect cross-company industry dynamics, not isolated single-company facts repackaged. Each bullet (and every comment) must explicitly name the company or companies it applies to by stating the company name(s) directly within the sentence. Mention the name of the specific companies that are facing the event being described in each point. If two or more companies share the dynamic, name all of them in the same bullet — e.g., Company A and Company B are both investing in AI and digital transformation to streamline operations and lower delivery costs. Do not write company-agnostic bullets.

i. Business Conditions by Geography#ecs-geography Summarise the general conditions of the market by geography. Emit exactly four regional blocks, in this order: North America, Latin America, Europe, Middle East and Africa, Asia Pacific. No other regions may be added; do not split or rename these four. Each block has a <strong class="subsection-title">…</strong> subheader of no more than 70 characters that summarises the bullets below (single line, no trailing period). Then a <ul> with at least 2 <li> bullets, 200–250 characters combined per region, opens directly after the </strong>. Each bullet may carry inline citations. Provide your view on the trends or patterns observed across all covered companies — each regional block must reflect cross-company observations of conditions in that geography, not a single-company anecdote. Each bullet (and every comment) must explicitly name the company or companies it applies to by stating the company name(s) directly within the sentence. Mention the name of the specific companies that are facing the event being described in each point. If two or more companies share the dynamic in that region, name all of them in the same bullet. Do not write company-agnostic bullets. If none of the covered companies discussed a given region on their earnings call, omit that region's block entirely rather than emitting an empty subheader.

j. Next Quarter & Full Year Business Outlook / Guidance#ecs-outlook One commentary per company (≥2 bullets, 200–250 chars combined). Include next-quarter AND full-year guidance as stated on the earnings call. Include quantitative data where available in the transcript. Each bullet may carry inline citations. The <strong class="subsection-title">…</strong> subtitle must be a single line in the form Company Name: Short General Summary, where the summary is a brief, general descriptor (≤80 chars, no trailing period) of what the bullets below cover. The summary lives inside the <strong> tag, joined to the company name by a colon — it is part of the subtitle itself, not a separate sentence underneath. Example: <strong class="subsection-title">Company Name: Focused on AI-Driven Turnaround and Pipeline Conversion</strong>. The <ul> of bullets opens directly after the </strong>.

k. Earnings Revisions for Applicable Companies#ecs-revisions One commentary per company that revised earnings (≥2 bullets, 200–250 chars combined). Each bullet may carry inline citations. The <strong class="subsection-title">…</strong> subtitle must be a single line in the form Company Name: Short Summary, where the summary is a brief descriptor (≤80 chars, no trailing period) of the revisions covered in the bullets below. The summary lives inside the <strong> tag, joined to the company name by a colon — it is part of the subtitle itself, not a separate sentence underneath. Example: <strong class="subsection-title">Company Name: Narrowed Revenue Decline, Raised Free Cash Flow Guidance</strong>. The <ul> of bullets opens directly after the </strong>. Whenever a bullet states that management raised or lowered a specific financial metric (revenue, EPS, margin, FCF, capex, etc.), it must support the claim with the quantitative data point from the transcript when available — include the new figure, the prior figure, and/or the magnitude of change (e.g., raised FY revenue guidance to $12.4B from $12.1B (+2.5%)). Only omit the figure if the transcript itself does not provide it. If a company did not make or did not mention any revision in its earnings call transcript, omit that company entirely from this section — do not emit a subtitle, summary sentence, bullets, or any "No revisions disclosed" placeholder for it.

l. Corporate Events#ecs-events One commentary per company with relevant events (≥2 bullets, 300–350 chars combined). Cover M&A, restructurings, plant closures, force majeures as discussed on the earnings call. Each bullet may carry inline citations. The <strong class="subsection-title">…</strong> subtitle must be a single line in the form Company Name: Short Summary, where the summary is a brief descriptor (≤80 chars, no trailing period) of the events covered in the bullets below. The summary lives inside the <strong> tag, joined to the company name by a colon — it is part of the subtitle itself, not a separate sentence underneath. Example: <strong class="subsection-title">Company Name: Closed Target Co. Acquisition and Restructured EMEA Operations</strong>. The <ul> of bullets opens directly after the </strong>.

Citations & sources (write last)

  • #ecs-cite-a#ecs-cite-l — optional per-section recap blocks. Use the <div class="section-citations">…</div> markup defined in skills/shared/citations/SKILL.md. Omit any section's block if empty.
  • #ecs-sources — end-of-document Citations rows. One <div class="source-item"> per source, in [1], [2], … order, using the canonical row markup from the shared citations skill.

Streaming protocol (element → content mapping)

Element IDContent type
#ecs-report-datePlain text date
#ecs-footer-datePlain text date (same value)
#ecs-company-countPlain text integer
#ecs-company-chipsSequence of <span class="company-chip">…</span>
#ecs-cover-img-right<img> element — set src attribute
#ecs-cover-img-bottom<img> element — set src attribute
#ecs-executive-summaryOne or more <p>; prose may carry inline citations
#ecs-credit-badgeSingle <div class="credit-badge …"> element
#ecs-overall-credit<p> intro + <ul><li> bullets; prose may carry inline citations
#ecs-tbody-revenue<tr> rows with .yoy-change class; commentary cell may carry inline citations
#ecs-tbody-volumes<tr> rows with .yoy-change class; commentary cell may carry inline citations
#ecs-tbody-prices<tr> rows with .yoy-change class; commentary cell may carry inline citations
#ecs-qualitative<strong class="subsection-title"> + <p> (×3); prose may carry inline citations
#ecs-end-markets<strong class="subsection-title"> + <ul><li> (×4); bullets may carry inline citations
#ecs-supply-chain<strong class="subsection-title"> + <ul><li> (×3); bullets may carry inline citations
#ecs-geography<strong class="subsection-title">Region: Summary</strong> + <ul><li> (×4 fixed regions); bullets may carry inline citations
#ecs-outlook<strong class="subsection-title"> + <ul><li> per company; bullets may carry inline citations
#ecs-revisions<strong class="subsection-title"> + <ul><li> per company; bullets may carry inline citations
#ecs-events<strong class="subsection-title"> + <ul><li> per company; bullets may carry inline citations
#ecs-cite-a#ecs-cite-l<div class="section-citations">…</div> (optional, see shared citations skill)
#ecs-sources<div class="source-item"> rows (see shared citations skill)

Reference HTML snippets

YOY table row (#ecs-tbody-revenue, #ecs-tbody-volumes, #ecs-tbody-prices):

<tr>
  <td class="company-name">Company A</td>
  <td class="yoy-change up">+5.20%</td>
  <td>
    Revenue growth driven by pricing gains in North America
    <a
      href="https://example.com/transcript-q1-2026"
      target="_blank"
      class="cite-ref"
      >[1]</a
    >, partially offset by volume declines in EMEA
    <a
      href="https://example.com/credit-opinion-a"
      target="_blank"
      class="cite-ref"
      >[2]</a
    >.
  </td>
</tr>

Company chip (#ecs-company-chips):

<span class="company-chip">Company A</span>

Credit sentiment badge (#ecs-credit-badge):

<div class="credit-badge positive">Positive</div>

Subsection subheader inside prose containers:

<strong class="subsection-title">North America</strong>
<ul>
  <li>
    Retail demand held up against tariff pass-through
    <a
      href="https://example.com/transcript-q1-2026"
      target="_blank"
      class="cite-ref"
      >[1]</a
    >.
  </li>
  <li>
    Pricing remained disciplined across grocery and consumables
    <a
      href="https://example.com/sector-outlook"
      target="_blank"
      class="cite-ref"
      >[3]</a
    >.
  </li>
</ul>

Section citations recap (#ecs-cite-a#ecs-cite-l) and sources rows (#ecs-sources): see skills/shared/citations/SKILL.md for the canonical markup. Reuse the same [n] numbering across inline references, optional recap blocks, and the end-of-document Citations block.

Class-selection rules

.yoy-change modifier (on the second <td> of YOY rows):

  • up — value starts with +, equals Up, or parses to a positive number
  • down — value starts with -, equals Down, or parses to a negative number
  • flat — value equals Flat or 0
  • na — value is Not specified, N/A, empty, or .credit-badge modifier (for #ecs-credit-badge):
  • positive, negative, or neutral. Label text is the capitalized sentiment.

Conventions

  • Use <p> for paragraphs, <ul><li> for bullets, <strong class="subsection-title">…</strong> for bold subheaders inside prose containers.
  • Emit inline citations per skills/shared/citations/SKILL.md. Inline citations are the primary attribution mechanism — the optional per-section blocks (#ecs-cite-a#ecs-cite-l) remain available as supplementary summary boxes. Numeric .yoy-change cells stay citation-free.
  • Do NOT include overall section titles — the template already has those.
  • yoy_change values: +X.XX% or -X.XX% if numeric, else Up / Down / Flat / Not specified.

Step 5 — Tell the user

After present_files returns, add a single short sentence in chat confirming the report is ready (e.g. Earnings Call Summary for {Company A}, {Company B}, … — the report is available above as a self-contained HTML artifact.). Do not paste the HTML into chat and do not suggest shell commands. The presented file itself is the deliverable.


Tips

  • Run ALL data-gathering tool calls in a single parallel batch (one message, many tool calls).
  • Emit the final HTML as a single .html file written to /mnt/user-data/outputs/ and surfaced via present_files — do not paste it inline as a fenced code block, do not stream partial sections, do not split across multiple files or messages.
  • If searchEntityEarningsCall returns no usable transcript for a company, fall back to web_search only to retrieve that company's earnings call transcript from the web, and apply the 100-day recency rule. If no transcript can be located within that window, note the omission in the Executive Summary and exclude that company from every other section (no rows, no subtitles, no placeholders).
  • Do not call any other MCP tool (no credit opinion, no sector outlook, no news, no peers, no ESG, no document search) — those sources are out of scope for this skill.
  • Pick the correct .yoy-change / .credit-badge modifier class yourself using the rules above — the template no longer does this at render time.
  • Emit <tr> rows directly inside each <tbody id="ecs-tbody-…"> placeholder; do not re-create the <table> or <thead>.
  • Inline citations follow the shared citations skill — read skills/shared/citations/SKILL.md before authoring any [n] reference or the Citations block.