iiuniversitet.ruЦентр обучения нейросетямОткрыть каталог

Превью отчётности по одной компании

Готовит отчёт HTML на 4-5 страниц перед публикацией результатов компании: оценки, цитаты руководства, конкуренты, графики, источники.

СкиллAnthropic (партнёр: Kensho Technologies)ClaudeApache-2.0Нужен терминалПроверка не требуется
Что делает
Готовит отчёт HTML на 4-5 страниц перед публикацией результатов компании: оценки, цитаты руководства, конкуренты, графики, источники.
Когда брать
Перед публикацией квартальной отчётности публичной компании, когда нужен краткий аналитический обзор с данными S&P Global и Kensho.
Когда не брать
Если нет доступа к данным S&P Global и Kensho: скилл разрешает брать данные только из них.
Пример запроса
Подготовь превью отчётности по Walmart (WMT) перед ближайшей публикацией результатов.
Нужно подключить
S&P Global MCP (kfinance), Kensho Grounding MCP

Входит в плагин spglobal. В Cowork и Claude Code можно поставить плагин целиком.

Как включить

  1. Скачайте архив и распакуйте его.
  2. Положите папку earnings-preview-single в ~/.claude/skills/.
  3. Откройте Claude Code и опишите задачу своими словами: Claude подхватит скилл по описанию.

Текст

---
name: earnings-preview-single
description: Готовит краткое превью отчётности для аналитического обзора акций на 4-5 страниц по одной компании. Анализирует стенограмму последнего звонка по отчётности, конкурентную среду, оценку и свежие новости и создаёт профессиональный отчёт в формате HTML.
---

Превью отчётности по одной компании

Подготовь краткое профессиональное превью отчётности для аналитического обзора акций по одной компании. Результат — самодостаточный файл HTML, рассчитанный на 4-5 печатных страниц. Отчёт насыщен цифрами и данными, а повествование плотное и бьёт прямо в цель.

Источники данных (БЕЗ ИСКЛЮЧЕНИЙ): ЕДИНСТВЕННЫЕ разрешённые источники данных — Kensho Grounding MCP (search) и S&P Global MCP (kfinance). Категорически НИКАКИХ других инструментов, источников данных и доступа в интернет. В частности:

  • НЕ используй WebSearch, WebFetch, web_search, brave_search, google_search или ЛЮБОЙ другой универсальный инструмент веб-поиска и интернет-поиска, даже если Kensho работает медленно, не возвращает результатов или временно недоступен.
  • НЕ используй никакой браузер, загрузку по URL или инструменты веб-скрейпинга.
  • Если Kensho Grounding не вернул результатов по запросу, переформулируй запрос или напиши в отчёте «данные недоступны». НИКОГДА не переходи на веб-поиск как замену.
  • Каждая единица информации в отчёте должна прослеживаться либо до вызова функции MCP kfinance, либо до вызова Kensho search. Если её нельзя привязать к одному из этих двух источников, в отчёте её быть не должно.

Критическое правило: ты ОБЯЗАН завершить ВСЕ исследование и сбор данных (этапы 1-5) ДО того, как напишешь хоть какую-то часть отчёта.

Правило промежуточных файлов: все сырые данные из вызовов инструментов MCP ОБЯЗАТЕЛЬНО записывай в файлы в /tmp/earnings-preview/ сразу после возврата каждого вызова, до следующего вызова. Это защищает данные от сжатия окна контекста. НЕ держи данные только в памяти. В начале этапа 1 выполни mkdir -p /tmp/earnings-preview, чтобы создать каталог. **Перед созданием отчёта HTML (этап 7) ты ОБЯЗАН прочитать ВСЕ промежуточные файлы обратно в контекст командами cat. Единственный источник истины для каждой цифры, цитаты и адреса источника в отчёте — файлы, а не твоя память о предыдущем разговоре. Если пропустишь чтение файлов, в отчёте БУДУТ ошибки.**

Правило финансового квартала: НИКОГДА не выводи финансовый квартал из календарной даты отчёта. У многих компаний нестандартный финансовый год (например, финансовый год Walmart заканчивается 31 января, поэтому отчёт за февраль 2026 года относится к Q4 FY2026, а не к Q4 2025 и не к Q1 2026). Всегда используй финансовый квартал и финансовый год точно так, как они указаны в названии звонка по отчётности, возвращённом get_next_earnings_from_identifiers или get_earnings_from_identifiers (например, «Walmart Q4 FY2026 Earnings Call» означает квартал Q4 FY2026). Используй это дословно в названии отчёта, заголовках, таблицах и во всех ссылках. Если название звонка неоднозначно, сверься с метками периодов get_financial_line_item_from_identifiers.

Правило объёма: отчёт должен быть кратким. Цель — 4-5 страниц при печати. НЕ пиши длинные многоабзацные повествования. Используй плотные, чёткие маркированные пункты. Каждое предложение должно заслужить своё место. Если можно сказать короче, говори короче.

Правило дословных цитат: когда цитируешь руководство в тегах <blockquote>, текст ОБЯЗАТЕЛЬНО должен быть скопирован точно из стенограммы: слово в слово, включая слова-паразиты и обрывки фраз. НЕ перефразируй, не переставляй, не склеивай предложения из разных частей стенограммы и не «причёсывай» цитаты. Если точной фразы в стенограмме не нашлось, НЕ выдавай её за прямую цитату. Вместо этого перескажи своими словами в повествовании без оформления blockquote (например: «Руководство отметило, что спрос на центры обработки данных остаётся значительным»). Каждый blockquote должен быть дословной копией отрывка, которую можно проверить по стенограмме.

Правило целостности расчётов: для любого многошагового расчёта (подразумеваемые квартальные показатели по годовому прогнозу, P/E за последние 12 месяцев, темпы роста год к году, изменения сегментов год к году) записывай каждый шаг явно и проверяй промежуточные результаты, прежде чем использовать их на следующем шаге. Если ты пишешь A + B + C = X, убедись, что X арифметически верен, прежде чем использовать X в следующей формуле. Если в приложении показана сумма, не равная своим слагаемым, отчёт неверен. В сомнительных случаях пересчитывай из сырых данных, а не используй ранее вычисленный промежуточный результат.

Правило обозначения коэффициентов: все оценочные коэффициенты должны быть явно помечены как LTM (за последние двенадцать месяцев, Last Twelve Months) или NTM (за следующие двенадцать месяцев, Next Twelve Months). Никогда не пиши «trailing» или «forward», всегда используй LTM или NTM. Коэффициенты LTM считаются по сумме последних 4 опубликованных кварталов. Коэффициенты NTM считаются по сумме средних консенсус-оценок EPS за следующие 4 квартала из get_consensus_estimates_from_identifiers, а НЕ по одному годовому показателю. И LTM P/E, и NTM P/E необходимо рассчитать и показать в таблице сравнения с конкурентами.

Правило гиперссылок (СТРОГО ОБЯЗАТЕЛЬНО): каждое утверждение в отчёте, как числовое, так и нечисловое, ОБЯЗАТЕЛЬНО должно быть обёрнуто в гиперссылку <a href="#ref-N" class="data-ref">, указывающую на соответствующую запись в Приложении. Это не по желанию. Каждая цифра в отчёте должна быть кликабельной ссылкой. Сюда относятся: выручка, EPS, маржинальность, темпы роста, рыночная капитализация, P/E, доходность акций, целевые цены, выручка сегментов и любые другие финансовые показатели. Также сюда относятся качественные утверждения из стенограмм или поисков Kensho. Если ты утверждаешь что-то как факт, это должно быть связано с источником. Присваивай каждому уникальному утверждению последовательный идентификатор ссылки (ref-1, ref-2 и т. д.). Стиль гиперссылки сдержанный: тёмно-синий цвет, без подчёркивания, пунктирное подчёркивание при наведении. **НЕ пиши в основном тексте отчёта ни одной цифры без обёртки в тег <a>.** Пример: пиши <a href="#ref-1" class="data-ref">$152.3B</a>, НИКОГДА не пиши $152.3B простым текстом.


Этап 1: профиль компании и подготовка

  1. Выдели единственный тикер компании из $ARGUMENTS (убери пробелы).
  2. Выполни mkdir -p /tmp/earnings-preview, чтобы создать рабочий каталог.
  3. Вызови get_latest(), чтобы определить контекст текущего отчётного периода.
  4. Вызови get_info_from_identifiers и запиши рыночную капитализацию и отрасль.
  5. Вызови get_company_summary_from_identifiers и запиши описание бизнеса.
  6. Вызови get_next_earnings_from_identifiers и запиши дату ближайшего отчёта и название финансового квартала.

Сразу запиши /tmp/earnings-preview/company-info.txt:

TICKER: [ticker]
COMPANY: [full name]
INDUSTRY: [industry]
MARKET_CAP: [value] (as of [date])
NEXT_EARNINGS_DATE: [date]
NEXT_EARNINGS_QUARTER: [Q# FY#### exactly as returned by API]
BUSINESS_DESCRIPTION: [2-3 sentence summary]

Этап 2: анализ стенограммы звонка по отчётности (ОБЯЗАТЕЛЬНО, ЗАВЕРШИТЬ ДО НАПИСАНИЯ)

  1. Вызови get_latest_earnings_from_identifiers, чтобы получить key_dev_id последнего завершённого звонка по отчётности.
  2. Вызови get_transcript_from_key_dev_id для этой стенограммы.
  3. Сразу запиши /tmp/earnings-preview/transcript-extracts.txt со следующими разделами. Записывай этот файл, ПОКА стенограмма ещё в контексте, не жди:
TRANSCRIPT_SOURCE: [Call Name, e.g., "Q3 2025 Earnings Call"]
KEY_DEV_ID: [key_dev_id]
CALL_DATE: [date]
FISCAL_QUARTER: [Q# FY####]

=== VERBATIM QUOTES (copy-paste exactly — do NOT paraphrase) ===
QUOTE_1: "[exact text from transcript]"
SPEAKER_1: [Name], [Title]
CONTEXT_1: [1 sentence on where this appeared — prepared remarks or Q&A]

QUOTE_2: "[exact text from transcript]"
SPEAKER_2: [Name], [Title]
CONTEXT_2: [context]

QUOTE_3: "[exact text from transcript]"
SPEAKER_3: [Name], [Title]
CONTEXT_3: [context]

QUOTE_4: "[exact text from transcript]"
SPEAKER_4: [Name], [Title]
CONTEXT_4: [context]

=== GUIDANCE (quantitative only) ===
- [metric]: [range or point estimate as stated by management]
- [metric]: [range or point estimate]

=== KEY DRIVERS ===
- [driver 1 with supporting data point]
- [driver 2 with supporting data point]
- [driver 3 with supporting data point]

=== HEADWINDS & RISKS ===
- [risk 1 with quantification if available]
- [risk 2]

=== ANALYST Q&A THEMES ===
- [theme 1: what analysts pushed on]
- [theme 2]
- [theme 3]

=== SYNTHESIS: THEMES TO WATCH NEXT QUARTER ===
- [theme 1]
- [theme 2]
- [theme 3]

Этап 3: анализ конкурентов

  1. Вызови get_competitors_from_identifiers с competitor_source="all".
  2. Выбери 5-7 самых подходящих публичных конкурентов.
  3. Для компании И всех выбранных конкурентов собери:
  4. get_prices_from_identifiers с periodicity="day", последние 12 месяцев
  5. get_financial_line_item_from_identifiers для diluted_eps, period_type="quarterly", num_periods=8
  6. get_capitalization_from_identifiers с capitalization="market_cap" (последняя)
  7. get_consensus_estimates_from_identifiers с period_type="quarterly", num_periods_forward=4: возвращает средние консенсус-оценки EPS на следующие 4 квартала, которые суммируются для расчёта NTM EPS

После возврата каждого вызова сразу дописывай сырые данные в соответствующий промежуточный файл:

Запиши /tmp/earnings-preview/prices.csv — по строке на каждую связку (тикер, дата, закрытие). Включи столбец source с точным вызовом функции MCP. Сначала запиши цены основной компании, затем цены каждого конкурента по мере получения:

ticker,date,close,source
D,2025-02-19,55.67,get_prices_from_identifiers(identifier='D',periodicity='day')
D,2025-02-20,55.82,get_prices_from_identifiers(identifier='D',periodicity='day')
...
DUK,2025-02-19,111.79,get_prices_from_identifiers(identifier='DUK',periodicity='day')
...

Примечание: значение source одинаково для всех строк одного вызова, поэтому записывай его в каждую строку, чтобы оно всегда было под рукой.

Запиши /tmp/earnings-preview/peer-eps.csv — по строке на каждую связку (тикер, период, EPS). Записывай сразу после каждого вызова diluted_eps:

ticker,period,diluted_eps,source
D,Q4 2024,1.09,get_financial_line_item_from_identifiers(identifier='D',line_item='diluted_eps',period_type='quarterly')
D,Q1 2025,-0.11,get_financial_line_item_from_identifiers(identifier='D',line_item='diluted_eps',period_type='quarterly')
...
DUK,Q4 2024,1.52,get_financial_line_item_from_identifiers(identifier='DUK',line_item='diluted_eps',period_type='quarterly')
...

Запиши /tmp/earnings-preview/peer-market-caps.csv — по строке на тикер. Записывай сразу после каждого вызова market_cap:

ticker,market_cap,retrieval_date,source
D,55900000000,2026-02-19,get_capitalization_from_identifiers(identifier='D',capitalization='market_cap')
DUK,98300000000,2026-02-19,get_capitalization_from_identifiers(identifier='DUK',capitalization='market_cap')
...

Запиши /tmp/earnings-preview/consensus-eps.csv — по строке на связку (тикер, период, средний консенсус EPS). Записывай сразу после каждого вызова get_consensus_estimates_from_identifiers:

ticker,period,consensus_mean_eps,num_estimates,source
D,Q4 2025,0.88,12,get_consensus_estimates_from_identifiers(identifier='D',period_type='quarterly',num_periods_forward=4)
D,Q1 2026,0.72,10,get_consensus_estimates_from_identifiers(identifier='D',period_type='quarterly',num_periods_forward=4)
D,Q2 2026,0.91,9,get_consensus_estimates_from_identifiers(identifier='D',period_type='quarterly',num_periods_forward=4)
D,Q3 2026,1.05,8,get_consensus_estimates_from_identifiers(identifier='D',period_type='quarterly',num_periods_forward=4)
DUK,Q4 2025,1.48,14,get_consensus_estimates_from_identifiers(identifier='DUK',period_type='quarterly',num_periods_forward=4)
...
  1. Пока НЕ считай P/E и доходность. Сырые данные уже на диске. Расчёты выполняются на этапе 6 (проверка), по этим файлам.

Правило единых дат (доходность акций): при расчёте сравнительной доходности акций (с начала года, за 1 год, за 30 дней, за 90 дней) ВСЕ тикеры ОБЯЗАТЕЛЬНО должны использовать одинаковые даты начала и конца. После записи всех цен в prices.csv найди первую торговую дату, которая есть в данных ВСЕХ тикеров, и используй её как общую базовую дату. НЕ используй разные базовые даты для разных тикеров (например, для основной компании с 19 февраля, а для конкурентов с 28 февраля). Если данные какого-то тикера начинаются позже остальных, используй первую общую дату для ВСЕХ расчётов. Укажи общую базовую дату в приложении для каждого расчёта доходности.

Правило актуальности P/E (LTM P/E): при расчёте LTM P/E для каждой компании используй последние 4 опубликованных квартала этой компании из peer-eps.csv, а не фиксированное календарное окно для всех. Если конкурент уже опубликовал Q4 2025, а основная компания отчиталась только до Q3 2025, LTM EPS конкурента должен включать Q4 2025. Проверь последний отчётный период каждой компании и используй для каждой 4 последних периода. Отметь в приложении, какие 4 квартала использованы для каждого расчёта P/E.

Дата для рыночной капитализации: при указании рыночной капитализации используй retrieval_date из peer-market-caps.csv. Если она отличается от даты отчёта, отметь это в приложении.


Этап 4: новости, оценки и отраслевая информация (через Kensho Grounding)

Выполни эти запросы search для каждой категории ниже. НЕ пропускай ни одну.

КРИТИЧЕСКИ ВАЖНО — фиксируй адреса источников: каждый результат Kensho search содержит адрес источника статьи, отчёта или страницы данных. Ты ОБЯЗАН записывать адрес рядом с каждой находкой.

После КАЖДОГО вызова search сразу дописывай результаты в /tmp/earnings-preview/kensho-findings.txt в формате ниже. НЕ жди, пока закончатся все поиски: записывай после каждого:

=== SEARCH: "[query used]" ===
DATE_RUN: [today's date]
CATEGORY: [estimates|analyst_ratings|risks|news|sector]

FINDING_1: [key finding or excerpt]
URL_1: [source URL from search result]
SOURCE_1: [publication name, date if available]

FINDING_2: [key finding or excerpt]
URL_2: [source URL]
SOURCE_2: [publication name, date]

[...continue for all relevant results from this search...]

Оценки по прибыли и настроения аналитиков:

  1. search по запросу «[TICKER] earnings estimates consensus EPS revenue upcoming quarter»
  2. Запиши: консенсус-прогноз EPS, консенсус-прогноз выручки, направление пересмотра оценок за последние 90 дней.
  3. Сразу допиши в kensho-findings.txt.
  4. search по запросу «[TICKER] analyst ratings price target upgrades downgrades»
  5. Запиши: недавние повышения и понижения рейтинга, диапазон целевых цен, краткое изложение позиций быков и медведей.
  6. Сразу допиши в kensho-findings.txt.
  7. search по запросу «[TICKER] risks bear case concerns investors»
  8. Запиши: ключевые споры, аргументы медведей, факторы, которые могут качнуть оценку ближайшей публикации.
  9. Сразу допиши в kensho-findings.txt.

Свежие новости (ОБЯЗАТЕЛЬНО — не пропускай):

  1. search по запросу «[TICKER] [company name] recent news developments»
  2. Запиши: существенные новости за последние 60 дней: сделки M&A, запуски продуктов, смена руководителей, действия регуляторов, партнёрства, юридические события, пошлины или любое событие, способное повлиять на ближайшую публикацию отчётности или прогноз на будущее.
  3. По каждому событию укажи дату, заголовок и возможное влияние на отчётность.
  4. Сразу допиши в kensho-findings.txt.

Отраслевой контекст:

  1. search по запросу «[company industry/sector] sector outlook trends»
  2. Запиши: попутные и встречные факторы на уровне отрасли, макроданные, конкурентную динамику.
  3. Сразу допиши в kensho-findings.txt.

Этап 5: сбор финансовых данных

Квартальные финансовые показатели (последние 8 кварталов): get_financial_line_item_from_identifiers с period_type="quarterly", num_periods=8 для: revenue, gross_profit, operating_income, ebitda, net_income, diluted_eps

После возврата каждого вызова по статье сразу дописывай в /tmp/earnings-preview/financials.csv. Записывай сырые значения ровно так, как они возвращены: пока НЕ округляй и не преобразуй. Включи столбец source с точным вызовом функции MCP и параметрами:

ticker,period,line_item,value,source
D,Q4 2024,revenue,3941000000,get_financial_line_item_from_identifiers(identifier='D',line_item='revenue',period_type='quarterly')
D,Q1 2025,revenue,3400000000,get_financial_line_item_from_identifiers(identifier='D',line_item='revenue',period_type='quarterly')
D,Q2 2025,revenue,4076000000,get_financial_line_item_from_identifiers(identifier='D',line_item='revenue',period_type='quarterly')
D,Q3 2025,revenue,3810000000,get_financial_line_item_from_identifiers(identifier='D',line_item='revenue',period_type='quarterly')
D,Q4 2024,diluted_eps,1.09,get_financial_line_item_from_identifiers(identifier='D',line_item='diluted_eps',period_type='quarterly')
D,Q1 2025,diluted_eps,-0.11,get_financial_line_item_from_identifiers(identifier='D',line_item='diluted_eps',period_type='quarterly')
...

Пока НЕ считай маржинальность и темпы роста. Записывай только сырые данные. Расчёты выполняются на этапе 6.

Данные по сегментам:

  • get_segments_from_identifiers с segment_type="business", period_type="quarterly", num_periods=8
  • Тебе нужно 8 кварталов (а не 4), чтобы был квартал годом ранее для сравнения год к году. Чтобы рассчитать изменение год к году для Q3 2025, нужен Q3 2024, то есть 5-й квартал назад. Если данные по сегменту за квартал прошлого года не пришли в ответе API, НЕ оценивай и не выдумывай их. Напиши в отчёте «изменение год к году недоступно».

Сразу запиши /tmp/earnings-preview/segments.csv:

ticker,period,segment_name,revenue,source
D,Q3 2024,Dominion Energy Virginia,2762000000,get_segments_from_identifiers(identifier='D',segment_type='business',period_type='quarterly')
D,Q3 2024,Dominion Energy South Carolina,848000000,get_segments_from_identifiers(identifier='D',segment_type='business',period_type='quarterly')
D,Q3 2024,Contracted Energy,260000000,get_segments_from_identifiers(identifier='D',segment_type='business',period_type='quarterly')
D,Q3 2025,Dominion Energy Virginia,3311000000,get_segments_from_identifiers(identifier='D',segment_type='business',period_type='quarterly')
D,Q3 2025,Dominion Energy South Carolina,945000000,get_segments_from_identifiers(identifier='D',segment_type='business',period_type='quarterly')
D,Q3 2025,Contracted Energy,297000000,get_segments_from_identifiers(identifier='D',segment_type='business',period_type='quarterly')
...

История отчётности (для пометок на графике акций):

  • get_earnings_from_identifiers: собери прошлые даты публикации отчётности в пределах 12-месячного окна цен.
  • Сразу запиши /tmp/earnings-preview/earnings-dates.csv:
ticker,earnings_date,call_name,source
D,2025-05-02,Q1 2025 Earnings Call,get_earnings_from_identifiers(identifier='D')
D,2025-08-01,Q2 2025 Earnings Call,get_earnings_from_identifiers(identifier='D')
D,2025-10-31,Q3 2025 Earnings Call,get_earnings_from_identifiers(identifier='D')
...

Этап 6: проверка и расчёты (ОБЯЗАТЕЛЬНО — НЕ ПРОПУСКАЙ)

Перед созданием отчёта прочитай обратно ВСЕ промежуточные файлы и выполни расчёты по чистым данным. Этот этап обеспечивает целостность данных, потому что работа идёт по файлам, а не по сжатому контексту разговора.

  1. Прочитай все промежуточные файлы командами bash cat:
  2. cat /tmp/earnings-preview/company-info.txt
  3. cat /tmp/earnings-preview/transcript-extracts.txt
  4. cat /tmp/earnings-preview/financials.csv
  5. cat /tmp/earnings-preview/segments.csv
  6. cat /tmp/earnings-preview/prices.csv
  7. cat /tmp/earnings-preview/peer-eps.csv
  8. cat /tmp/earnings-preview/peer-market-caps.csv
  9. cat /tmp/earnings-preview/consensus-eps.csv
  10. cat /tmp/earnings-preview/kensho-findings.txt
  11. cat /tmp/earnings-preview/earnings-dates.csv
  1. Рассчитай производные показатели по сырым данным, которые теперь в контексте:
  2. Валовая маржа % = gross_profit / revenue (по каждому кварталу)
  3. Операционная маржа % = operating_income / revenue (по каждому кварталу)
  4. Рост выручки год к году % = (выручка текущего квартала − выручка квартала годом ранее) / выручка квартала годом ранее
  5. Рост EPS год к году % = та же логика; если база отрицательная, пиши «n.m.»
  6. Рост сегмента год к году % = сопоставь сегмент по названию с кварталом годом ранее; если его нет, отметь «изменение год к году недоступно»
  7. LTM P/E по каждой компании = последняя цена / сумма EPS за последние 4 квартала (проверь, какие 4 квартала доступны по каждому тикеру, по peer-eps.csv)
  8. NTM P/E по каждой компании = последняя цена / NTM EPS, где NTM EPS = сумма средних консенсус-оценок EPS за следующие 4 квартала из consensus-eps.csv. Сложи значения consensus_mean_eps за все 4 квартала по каждому тикеру. Если для конкурента доступно меньше 4 будущих кварталов, пометь NTM P/E как «н/д». Отметь в приложении, какие 4 квартала просуммированы.
  9. Доходность акций (с начала года, за 1 год, за 30 дней, за 90 дней) = найди общую первую дату для всех тикеров в prices.csv, затем считай доходность от этой даты
  1. Перекрёстная проверка:
  2. Убедись, что для каждого роста сегмента год к году в segments.csv есть реальная строка за прошлый год. Если нет, пометь «изменение год к году недоступно».
  3. Убедись, что базовые даты доходности акций одинаковы у всех тикеров.
  4. Проверь любой многошаговый расчёт повторным суммированием слагаемых (например, сумма LTM EPS совпадает с четырьмя квартальными значениями).
  5. Убедись, что все дословные цитаты в transcript-extracts.txt — точные копии, а не пересказы.
  1. Запиши /tmp/earnings-preview/calculations.csv со всеми производными значениями:
ticker,metric,value,formula,components
D,gross_margin_Q3_2025,32.5%,gross_profit/revenue,"gross_profit=1238100000,revenue=3810000000"
D,revenue_yoy_Q3_2025,+9.3%,(Q3_2025-Q3_2024)/Q3_2024,"Q3_2025=3810000000,Q3_2024=3486000000"
D,ltm_pe,24.2x,price/ltm_eps,"price=65.46,ltm_eps=2.70,quarters=Q4_2024+Q1_2025+Q2_2025+Q3_2025"
D,ntm_pe,18.5x,price/ntm_eps,"price=65.46,ntm_eps=3.56,quarters=Q4_2025(0.88)+Q1_2026(0.72)+Q2_2026(0.91)+Q3_2026(1.05),source=get_consensus_estimates_from_identifiers"
D,yoy_return,+17.6%,(end-start)/start,"end=65.46,start=55.67,base_date=2025-02-19"
DUK,yoy_return,+13.0%,(end-start)/start,"end=126.32,start=111.79,base_date=2025-02-19"
...

Этот файл становится единственным источником истины для всех цифр в отчёте.


Этап 7: создание отчёта HTML

СТОП: ПЕРЕД НАПИСАНИЕМ ЛЮБОГО HTML ТЫ ОБЯЗАН ПРОЧИТАТЬ ВСЕ ПРОМЕЖУТОЧНЫЕ ФАЙЛЫ. ЭТО БЛОКИРУЮЩЕЕ УСЛОВИЕ.

Это не по желанию. Ты ОБЯЗАН выполнить каждую команду cat ниже как отдельный вызов инструмента bash (не объединяя в один). Так содержимое каждого файла загружается и видно в разговоре по отдельности. НЕ объединяй их в одну команду. НЕ пропускай ни один файл.

Выполняй эти команды по одной, каждую отдельным вызовом bash:

  1. cat /tmp/earnings-preview/company-info.txt
  2. cat /tmp/earnings-preview/transcript-extracts.txt
  3. cat /tmp/earnings-preview/financials.csv
  4. cat /tmp/earnings-preview/segments.csv
  5. cat /tmp/earnings-preview/prices.csv
  6. cat /tmp/earnings-preview/peer-eps.csv
  7. cat /tmp/earnings-preview/peer-market-caps.csv
  8. cat /tmp/earnings-preview/consensus-eps.csv
  9. cat /tmp/earnings-preview/kensho-findings.txt
  10. cat /tmp/earnings-preview/earnings-dates.csv
  11. cat /tmp/earnings-preview/calculations.csv

После чтения ВСЕХ файлов ты ОБЯЗАН вывести пользователю сводное сообщение, где перечислен каждый файл и его статус. Используй ровно такой формат:

--- ПРОВЕРКА ФАЙЛОВ ДАННЫХ ---
1. company-info.txt        ✓ загружен ([N] строк)
2. transcript-extracts.txt ✓ загружен ([N] строк)
3. financials.csv          ✓ загружен ([N] строк)
4. segments.csv            ✓ загружен ([N] строк)
5. prices.csv              ✓ загружен ([N] строк)
6. peer-eps.csv            ✓ загружен ([N] строк)
7. peer-market-caps.csv    ✓ загружен ([N] строк)
8. consensus-eps.csv       ✓ загружен ([N] строк)
9. kensho-findings.txt     ✓ загружен ([N] строк)
10. earnings-dates.csv     ✓ загружен ([N] строк)
11. calculations.csv       ✓ загружен ([N] строк)

Все промежуточные файлы данных успешно загружены.
Создаю отчёт, используя данные из файлов как единственный источник истины.
---

Если какой-либо файл отсутствует или пуст, ОСТАНОВИСЬ и сообщи пользователю, какой файл не загрузился. НЕ переходи к созданию отчёта при отсутствующих данных.

Каждая цифра, цитата, адрес источника и ссылка на вызов функции MCP в отчёте HTML должны браться из этих файлов, а не из твоей памяти о предыдущих репликах разговора. Файлы — единственный источник истины. Прежний контекст разговора мог быть сжат или пересказан и БУДЕТ содержать ошибки, если полагаться на него. Если данных нет в файлах, их не должно быть и в отчёте.

Полный шаблон HTML, CSS и конфигурацию Chart.js смотри в [report-template.md](report-template.md).

ОБЯЗАТЕЛЬНО — используй вспомогательные функции шаблона для графиков: В report-template.md есть готовые, отлаженные вспомогательные функции Chart.js. Графики ты ОБЯЗАН создавать именно этими функциями. НЕ пиши собственный встроенный код Chart.js. Вот эти функции:

  • createRevEpsChart(canvasId, labels, revenueData, epsData, revLabel) — для рисунка 1
  • createMarginChart(canvasId, labels, grossMargins, opMargins) — для рисунка 2
  • createRevGrowthChart(canvasId, labels, growthData) — для рисунка 3
  • createAnnotatedPriceChart(canvasId, labels, prices, earningsDates, ticker) — для рисунка 5
  • createCompPerfChart(canvasId, labels, datasets) — для рисунка 6
  • createPEChart(canvasId, companies) — для рисунка 7

Каждый вызов графика ОБЯЗАТЕЛЬНО должен быть в отдельном теге <script>, обёрнутом в блок try-catch. Так ошибка в одном графике не помешает отрисовке остальных. Пример:

<script>
try {
  createRevEpsChart('chart-rev-eps', [...], [...], [...], 'Revenue ($B)');
} catch(e) { console.error('Figure 1 error:', e); }
</script>
<script>
try {
  createMarginChart('chart-margins', [...], [...], [...]);
} catch(e) { console.error('Figure 2 error:', e); }
</script>

Структура отчёта (всего 4-5 страниц)

В отчёте две части: повествование (страницы 1-2) и рисунки (страницы 3-5). Держи их тесно связанными.


ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ ЗА ИИ (ОБЯЗАТЕЛЬНО — должен встречаться в 3 местах): Ты ОБЯЗАН включить в HTML отчёта следующий текст отказа от ответственности. Это не по желанию: без него отчёт неполон:

«Анализ создан ИИ — пожалуйста, проверьте все результаты»

Он должен встречаться ровно в этих 3 местах:

  1. Баннер в шапке — непосредственно перед титульным заголовком, в виде жёлтого баннера по центру: <div class="ai-disclaimer">Анализ создан ИИ — пожалуйста, проверьте все результаты</div>
  2. Подвал — внутри блока page-footer, в виде заметного жёлтого баннера: <div class="footer-disclaimer">Анализ создан ИИ — пожалуйста, проверьте все результаты</div>
  3. Приложение — первой строкой раздела приложения, перед таблицей: <div class="ai-disclaimer">Анализ создан ИИ — пожалуйста, проверьте все результаты</div>

СТРАНИЦА 1: титул и тезис

  • Баннер отказа от ответственности за ИИ (жёлтый, по центру — см. правило ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ ЗА ИИ выше)
  • Шапка: название компании (TICKER) | отрасль | дата отчёта
  • Заголовок: тематический, конкретный для квартала (например: «Walmart Inc. (WMT): превью отчётности за Q4 FY2026. Праздничный урожай — подтвердит ли первый отчёт Furner тезис о $1 трлн?»)
  • Главный тезис (максимум 2-3 коротких абзаца с маркированными пунктами):
  • Чего мы ждём от этой публикации, в 1-2 предложениях
  • 4-6 маркированных пунктов: наша оценка EPS против консенсуса, ожидания по прогнозу, ключевые показатели, на которые стоит смотреть, что сдвинет акцию, ключевые споры
  • Пиши прямо и с позицией: занимай точку зрения, не страхуйся во всём
  • Ключевые цитаты руководства с последнего звонка по отчётности вплетай в повествование там, где это уместно. НЕ выноси их под отдельный заголовок. Встраивай их естественно как подтверждение своих тезисов. Оформляй как блоки цитат с отступом.

СТРАНИЦА 2: оценки, темы и новости

  • Таблица консенсус-оценок (одна таблица, подписана как рисунок):
  • Столбцы: показатель | консенсус | наша оценка | изменение год к году
  • Строки: выручка, EPS, валовая маржа, операционная прибыль и 2-3 показателя, специфичных для компании и важных для рынка (например, сопоставимые продажи, рост электронной коммерции, выручка от членства — то, что волнует рынок именно в ЭТОЙ компании)
  • Цветовая разметка строго механическая: если изменение год к году отрицательное, используй class="neg" (красный). Если положительное — class="pos" (зелёный). Если ноль или н/д — class="neutral". Класс определяет знак числа: НЕ переопределяй его исходя из интерпретации. −1,1% ВСЕГДА красный, даже если снижение небольшое.
  • Это ЕДИНСТВЕННЫЙ раздел с прогнозами и оценками. Не повторяй данные оценок в других местах.
  • Ключевые показатели помимо заголовочного EPS (маркированный список, 3-5 пунктов):
  • Конкретные показатели, которые определят, хороший это квартал или плохой, помимо числа EPS
  • По каждому: что это за показатель, чего ждут консенсус и руководство, почему это важно
  • Будь конкретен: «рост выручки от рекламы Walmart Connect (консенсус около 30% год к году, в 3-м квартале было 33%)»
  • Темы, за которыми стоит следить (3-5 пунктов):
  • Что важно в предстоящей публикации
  • Что должно сделать руководство, что может удивить, на чём сосредоточены медведи
  • Каждая тема: максимум 1-2 предложения
  • Свежие новости и события (3-5 пунктов):
  • Существенные новости за последние 60 дней, по одной строке
  • Дата + заголовок + краткая оценка влияния
  • Включай только то, что может повлиять на ближайшую публикацию или прогноз

СТРАНИЦЫ 3-5: рисунки (все графики и таблицы)

Все рисунки нумеруются последовательно. У каждого рисунка есть заголовок и строка с источником.

  • Рисунок 1: квартальная выручка и разводнённый EPS — комбинация столбцов и линии, 8 кварталов
  • Рисунок 2: динамика маржинальности (валовая и операционная, %) — график из двух линий, 8 кварталов
  • Рисунок 3: рост выручки год к году, % — столбчатая диаграмма с условной зелёной и красной раскраской. Включай только кварталы, для которых есть и текущие данные, и данные годом ранее (обычно последние 4 квартала из 8 полученных). НЕ включай кварталы, для которых нельзя рассчитать изменение год к году: на диаграмме должно быть 4 столбца, а не 8.
  • Рисунок 4: выручка по бизнес-сегментам — таблица: сегмент | выручка за последний квартал ($ млн) | % от общей | изменение год к году
  • Рисунок 5: цена акции за 1 год с датами публикации отчётности — линия цены с вертикальными линиями-пометками на датах отчётности, подписанными кварталом и движением за 1 день после публикации
  • Рисунок 6: динамика акции против конкурентов (индекс = 100) — многолинейный график, основная компания толстой сплошной линией, конкуренты более тонкими пунктирными линиями
  • Рисунок 7: LTM P/E против конкурентов — горизонтальная столбчатая диаграмма, основная компания выделена тёмно-синим
  • Рисунок 8: таблица сравнения с конкурентами — тикер | компания | рыночная капитализация | LTM P/E | NTM P/E | с начала года % | за 1 год %

ПРИЛОЖЕНИЕ: источники данных и расчёты (ОБЯЗАТЕЛЬНО — НЕ ПРОПУСКАЙ И НЕ СОКРАЩАЙ)

Приложение ОБЯЗАТЕЛЬНО начинается с баннера отказа от ответственности за ИИ: <div class="ai-disclaimer">Анализ создан ИИ — пожалуйста, проверьте все результаты</div>

На последней странице (или страницах) отчёта ОБЯЗАТЕЛЬНО должна быть таблица приложения, которая документирует каждое утверждение, числовое и нечисловое, приведённое в отчёте. **Для каждой цифры в основном тексте отчёта должна быть соответствующая строка в этом приложении, и каждая такая цифра в основном тексте должна быть кликабельной гиперссылкой <a href="#ref-N">, ведущей к её строке в приложении.** Если цифра есть в отчёте без гиперссылки на приложение, отчёт неполон.

  • Столбцы таблицы: № ссылки | Факт | Значение | Источник и вывод
  • № ссылки: последовательный идентификатор, совпадающий с якорями гиперссылок в основном тексте отчёта (ref-1, ref-2 и т. д.). У каждой строки есть атрибут id="ref-N", чтобы гиперссылки прокручивали к ней.
  • Факт: понятное человеку название (например, «Выручка Q3 FY2026», «LTM P/E — WMT», «Руководство отметило встречный ветер из-за пошлин», «Barclays повысил рейтинг до Overweight»)
  • Значение: точная цифра в том виде, в каком она показана в отчёте (например, «$152.3B», «24.5%», «28.1x»). Для нечисловых фактов оставь пустым или напиши «Н/Д».
  • Источник и вывод: это ключевой столбец. В каждой строке должен быть конкретный, подробный источник, а не просто метка. Строго следуй этим правилам:

Для сырых финансовых данных из S&P Capital IQ (выручка, EPS, валовая прибыль, операционная прибыль, чистая прибыль, EBITDA, цены, рыночная капитализация и т. д.):

  • Укажи использованную функцию MCP и её ключевые параметры. Формат: S&P Capital IQ — [function_name](identifier='[TICKER]', line_item='[item]', period_type='[type]', period='[Q# FY####]')
  • Примеры:
  • S&P Capital IQ — get_financial_line_item_from_identifiers(identifier='WMT', line_item='revenue', period_type='quarterly', period='Q3 FY2026')
  • S&P Capital IQ — get_financial_line_item_from_identifiers(identifier='WMT', line_item='diluted_eps', period_type='quarterly', period='Q3 FY2026')
  • S&P Capital IQ — get_prices_from_identifiers(identifier='WMT', periodicity='day')
  • S&P Capital IQ — get_capitalization_from_identifiers(identifier='WMT', capitalization='market_cap')
  • НЕ пиши просто «S&P Capital IQ» без подробностей. Читатель должен точно знать, какая именно точка данных из какого вызова инструмента дала эту цифру.

Для расчётных значений (маржинальность, темпы роста, P/E, доходность, изменения год к году):

  • Покажи полную формулу с гиперссылками на компоненты: каждый компонент должен быть ссылкой <a href="#ref-N"> на строку приложения с этой сырой точкой данных. Это критически важно: читатель должен иметь возможность перейти по клику от расчётного значения к каждому из его исходных данных.
  • Пример: Gross Margin = <a href='#ref-5'>Gross Profit $37.2B</a> / <a href='#ref-1'>Revenue $152.3B</a> = 24.4%. Source: S&P Capital IQ (calculated)
  • Пример: LTM P/E = <a href='#ref-20'>Price $172.35</a> / (<a href='#ref-8'>Q1 EPS $1.47</a> + <a href='#ref-9'>Q2 EPS $1.84</a> + <a href='#ref-10'>Q3 EPS $1.53</a> + <a href='#ref-11'>Q4 EPS $1.80</a>) = $172.35 / $6.64 = 25.9x
  • Пример: Revenue y/y growth = (<a href='#ref-12'>Q3 FY26 Rev $165.8B</a> - <a href='#ref-3'>Q3 FY25 Rev $160.8B</a>) / <a href='#ref-3'>Q3 FY25 Rev $160.8B</a> = +3.1%
  • Каждый компонент формулы должен быть кликабельной гиперссылкой. НЕ пиши формулы с цифрами простым текстом.

Для утверждений из стенограмм (цитаты, комментарии руководства, прогнозы):

  • Запиши дословное предложение-выдержку из стенограммы.
  • Сошлись на стенограмму по её полному названию и по key_dev_id, использованному для её получения.
  • Формат: "[verbatim quote]" — [Speaker], [Title]. Source: [Q# FY#### Earnings Call Transcript] (key_dev_id: [ID])
  • Пример: "We expect comp sales growth of 3-4% in Q4" — CEO John Furner. Source: Q3 FY2026 Earnings Call Transcript (key_dev_id: 12345678)

Для результатов поиска Kensho Grounding (новости, рейтинги аналитиков, консенсус-оценки):

  • Запиши ключевую находку или выдержку из результата поиска.
  • ОБЯЗАТЕЛЬНО: укажи адрес источника, возвращённый инструментом Kensho search, в виде кликабельной гиперссылки <a href="[URL]" target="_blank">. Это самое важное: читатели должны иметь возможность перейти по клику к первоисточнику.
  • Формат: "[finding/excerpt]" — <a href="[URL]" target="_blank">[Source Title or Publication]</a>. Query: search("[query used]")
  • Пример: "Barclays upgraded WMT to Overweight with $210 price target on Jan 15, 2026." — <a href="https://www.investing.com/news/barclays-upgrades-wmt" target="_blank">Investing.com, Jan 15 2026</a>. Query: search("WMT analyst ratings price target upgrades downgrades")
  • Если для какого-то результата адрес не вернулся, напиши «Адрес источника недоступен» и всё равно укажи поисковый запрос.

Проверка полноты: перед окончательной сдачей отчёта просмотри каждую цифру в основном тексте. Если какая-то цифра не обёрнута в <a href="#ref-N" class="data-ref">, исправь. Если в какой-то строке приложения в столбце «Источник и вывод» стоит просто метка вроде «S&P Capital IQ» без подробностей вызова функции, исправь. Если у какого-то расчётного значения в формуле нет гиперссылок на компоненты, исправь. Если у какого-то утверждения из Kensho нет адреса источника, исправь.

Сгруппируй строки приложения по разделам (финансы, оценка, оценки и консенсус, утверждения из стенограммы, новости и комментарии аналитиков, динамика акций) с подзаголовками. Используй небольшой размер шрифта (10-11px).


Этап 8: выдача результата

  1. Запиши полный файл HTML под именем earnings-preview-[TICKER]-YYYY-MM-DD.html в текущем рабочем каталоге.
  2. Открой его в браузере: open earnings-preview-[TICKER]-YYYY-MM-DD.html
  3. Сообщи пользователю, что файл создан, и кратко изложи ключевые выводы.

Правила написания

  • БЕЗ ЭМОДЗИ: не используй эмодзи нигде в отчёте. Это профессиональный исследовательский документ.
  • КРАТКО: цель — 4-5 печатных страниц. Каждое предложение должно нести вес. Где возможно, используй маркированные пункты, а не абзацы. Если раздел кажется длинным, сократи его.
  • Конкретные цифры: «выручка $52.4B, рост 5,2% год к году», а не «сильный рост выручки».
  • Имей позицию: это превью отчётности, а не пересказ. Скажи, чего ты ждёшь, что важно и почему. Будь категоричен, но подкрепляй данными.
  • Цитаты руководства без заголовков: вплетай 3-4 ключевые цитаты руководства с последнего звонка прямо в повествование в виде blockquote. Не создавай заголовок раздела «Ключевые цитаты руководства»: пусть они естественно служат подтверждением.
  • Профессиональный тон: стиль аналитики брокеров (sell-side): аналитический, прямой, основанный на данных.
  • Графики только на реальных данных: каждый график заполнен реальными данными MCP. Никогда не выдумывай.
  • Конкурентный контекст: оценивай компанию относительно конкурентов. P/E 25x ничего не значит, пока не известно, что конкуренты торгуются по 20x или 35x.
  • Утверждения с гиперссылками: каждое фактическое утверждение, числовое или качественное, должно быть тегом <a class="data-ref">, ведущим к записи в приложении. Числа: <a href="#ref-1" class="data-ref">$152.3B</a>. Качественные: <a href="#ref-25" class="data-ref">руководство назвало встречный ветер из-за пошлин главным риском для маржи</a>. Ни один факт не должен появляться без прослеживаемого источника в приложении.

Перевод: iiuniversitet. Оригинал: https://github.com/anthropics/financial-services/tree/main/plugins/partner-built/spglobal/skills/earnings-preview-beta, лицензия Apache-2.0. Изменения: перевод на русский язык.

Оригинал на английском
---
name: earnings-preview-single
description: Generate a concise 4-5 page equity research earnings preview for a single company. Analyzes the most recent earnings transcript, competitor landscape, valuation, and recent news to produce a professional HTML report.
---

# Single-Company Earnings Preview

Generate a concise, professional equity research earnings preview for a single company. The output is a self-contained HTML file targeting 4-5 printed pages. The report is dense with figures and data, with tight narrative that gets straight to the point.

**Data Sources (ZERO EXCEPTIONS):** The ONLY permitted data sources are **Kensho Grounding MCP** (`search`) and **S&P Global MCP** (`kfinance`). Absolutely NO other tools, data sources, or web access of any kind. Specifically:
- Do NOT use `WebSearch`, `WebFetch`, `web_search`, `brave_search`, `google_search`, or ANY generic web/internet search tool — even if Kensho is slow, returns no results, or is temporarily unavailable.
- Do NOT use any browser, URL fetch, or web scraping tool.
- If Kensho Grounding returns no results for a query, try rephrasing the query or note "data not available" in the report. **NEVER fall back to web search as an alternative.**
- Every piece of information in the report must be traceable to either a `kfinance` MCP function call or a Kensho `search` call. If it cannot be sourced to one of these two, it must not appear in the report.

**Critical Rule:** You MUST complete ALL research and data collection (Phases 1-5) BEFORE writing any part of the report.

**Intermediate File Rule:** All raw data from MCP tool calls MUST be written to files in `/tmp/earnings-preview/` **immediately after each tool call returns** — before moving to the next call. This protects data from context window compression. Do NOT hold data only in memory. At the start of Phase 1, run `mkdir -p /tmp/earnings-preview` to create the directory. **Before generating the HTML report (Phase 7), you MUST read ALL intermediate files back into context using `cat` commands. The files — not your memory of earlier conversation — are the single source of truth for every number, quote, and source URL in the report. If you skip reading the files, the report WILL contain errors.**

**Fiscal Quarter Rule:** NEVER infer the fiscal quarter from the calendar report date. Many companies have non-standard fiscal years (e.g., Walmart's FY ends Jan 31, so a Feb 2026 report covers Q4 FY2026, not Q4 2025 or Q1 2026). Always use the fiscal quarter and fiscal year exactly as stated in the earnings call name returned by `get_next_earnings_from_identifiers` or `get_earnings_from_identifiers` (e.g., "Walmart Q4 FY2026 Earnings Call" means the quarter is Q4 FY2026). Use that verbatim in the report title, headers, tables, and all references. If the call name is ambiguous, cross-reference with `get_financial_line_item_from_identifiers` period labels.

**Length Rule:** The report must be concise. Target 4-5 pages when printed. Do NOT write long multi-paragraph narratives. Use tight, punchy bullet points. Every sentence must earn its place. If you can say it in fewer words, do so.

**Verbatim Quote Rule:** When quoting management in `<blockquote>` tags, the text MUST be copied **exactly** from the transcript — word for word, including filler words and sentence fragments. Do NOT paraphrase, rearrange, combine sentences from different parts of the transcript, or "clean up" quotes. If you cannot find the exact phrase in the transcript, do NOT present it as a direct quote. Instead, paraphrase in your own narrative voice without blockquote formatting (e.g., "Management noted that data center demand remains significant"). Every blockquote must be a verbatim, copy-paste excerpt that can be verified against the transcript.

**Calculation Integrity Rule:** For any multi-step calculation (implied quarterly figures from annual guidance, LTM P/E, y/y growth rates, segment y/y changes), write out each step explicitly and verify intermediate results before using them in the next step. If you state A + B + C = X, verify X is arithmetically correct before using X in a subsequent formula. If the appendix shows a sum that does not equal its stated components, the report is wrong. When in doubt, recompute from raw data rather than reusing a previously calculated intermediate.

**Ratio Nomenclature Rule:** All valuation ratios must be explicitly labeled as **LTM** (Last Twelve Months) or **NTM** (Next Twelve Months). Never use "trailing" or "forward" — always use LTM or NTM. LTM ratios use the sum of the most recent 4 reported quarters. NTM ratios use the **sum of the next 4 quarterly consensus mean EPS estimates** from `get_consensus_estimates_from_identifiers` — NOT a single annual figure. Both LTM and NTM P/E must be computed and displayed in the competitor comparison table.

**Hyperlink Rule (STRICTLY ENFORCED):** Every claim in the report — numeric AND non-numeric — MUST be wrapped in an `<a href="#ref-N" class="data-ref">` hyperlink pointing to the corresponding entry in the Appendix. **This is not optional. Every single number in the report must be a clickable link.** This includes: revenue figures, EPS, margins, growth rates, market caps, P/E ratios, stock returns, price targets, segment revenue, and any other financial metric. It also includes qualitative claims from transcripts or Kensho searches. If you state it as fact, it must link to a source. Assign each unique claim a sequential reference ID (`ref-1`, `ref-2`, etc.). The hyperlink style is subtle — navy color, no underline, dotted underline on hover. **Do NOT write any number in the report body without wrapping it in an `<a>` tag.** Example: write `<a href="#ref-1" class="data-ref">$152.3B</a>`, NEVER write `$152.3B` as plain text.

---

## Phase 1: Company Profile & Setup

1. Parse the single company ticker from `$ARGUMENTS` (strip whitespace).
2. Run `mkdir -p /tmp/earnings-preview` to create the working directory.
3. Call `get_latest()` to establish current reporting period context.
4. Call `get_info_from_identifiers` — record market cap, industry.
5. Call `get_company_summary_from_identifiers` — record business description.
6. Call `get_next_earnings_from_identifiers` — record upcoming earnings date and fiscal quarter name.

**Immediately write** `/tmp/earnings-preview/company-info.txt`:
```
TICKER: [ticker]
COMPANY: [full name]
INDUSTRY: [industry]
MARKET_CAP: [value] (as of [date])
NEXT_EARNINGS_DATE: [date]
NEXT_EARNINGS_QUARTER: [Q# FY#### exactly as returned by API]
BUSINESS_DESCRIPTION: [2-3 sentence summary]
```

---

## Phase 2: Earnings Transcript Analysis (MANDATORY — COMPLETE BEFORE WRITING)

1. Call `get_latest_earnings_from_identifiers` to get the most recent completed earnings call `key_dev_id`.
2. Call `get_transcript_from_key_dev_id` for that transcript.
3. **Immediately write** `/tmp/earnings-preview/transcript-extracts.txt` with the following sections. Write this file WHILE you still have the transcript in context — do not wait:

```
TRANSCRIPT_SOURCE: [Call Name, e.g., "Q3 2025 Earnings Call"]
KEY_DEV_ID: [key_dev_id]
CALL_DATE: [date]
FISCAL_QUARTER: [Q# FY####]

=== VERBATIM QUOTES (copy-paste exactly — do NOT paraphrase) ===
QUOTE_1: "[exact text from transcript]"
SPEAKER_1: [Name], [Title]
CONTEXT_1: [1 sentence on where this appeared — prepared remarks or Q&A]

QUOTE_2: "[exact text from transcript]"
SPEAKER_2: [Name], [Title]
CONTEXT_2: [context]

QUOTE_3: "[exact text from transcript]"
SPEAKER_3: [Name], [Title]
CONTEXT_3: [context]

QUOTE_4: "[exact text from transcript]"
SPEAKER_4: [Name], [Title]
CONTEXT_4: [context]

=== GUIDANCE (quantitative only) ===
- [metric]: [range or point estimate as stated by management]
- [metric]: [range or point estimate]

=== KEY DRIVERS ===
- [driver 1 with supporting data point]
- [driver 2 with supporting data point]
- [driver 3 with supporting data point]

=== HEADWINDS & RISKS ===
- [risk 1 with quantification if available]
- [risk 2]

=== ANALYST Q&A THEMES ===
- [theme 1: what analysts pushed on]
- [theme 2]
- [theme 3]

=== SYNTHESIS: THEMES TO WATCH NEXT QUARTER ===
- [theme 1]
- [theme 2]
- [theme 3]
```

---

## Phase 3: Competitor Analysis

1. Call `get_competitors_from_identifiers` with `competitor_source="all"`.
2. Select **top 5-7 most relevant public competitors**.
3. For the company AND all selected competitors, gather:
   - `get_prices_from_identifiers` with `periodicity="day"`, last 12 months
   - `get_financial_line_item_from_identifiers` for `diluted_eps`, `period_type="quarterly"`, `num_periods=8`
   - `get_capitalization_from_identifiers` with `capitalization="market_cap"` (latest)
   - `get_consensus_estimates_from_identifiers` with `period_type="quarterly"`, `num_periods_forward=4` — this returns consensus mean EPS estimates for the next 4 quarters, which are summed to compute NTM EPS

**After each tool call returns, immediately append the raw data to the appropriate intermediate file:**

**Write** `/tmp/earnings-preview/prices.csv` — one row per (ticker, date, close). Include the `source` column with the exact MCP function call. Write the subject company's prices first, then each competitor's as you fetch them:
```
ticker,date,close,source
D,2025-02-19,55.67,get_prices_from_identifiers(identifier='D',periodicity='day')
D,2025-02-20,55.82,get_prices_from_identifiers(identifier='D',periodicity='day')
...
DUK,2025-02-19,111.79,get_prices_from_identifiers(identifier='DUK',periodicity='day')
...
```
Note: the `source` value is the same for all rows from a single call — write it on every row so it's always available.

**Write** `/tmp/earnings-preview/peer-eps.csv` — one row per (ticker, period, eps). Write immediately after each `diluted_eps` call:
```
ticker,period,diluted_eps,source
D,Q4 2024,1.09,get_financial_line_item_from_identifiers(identifier='D',line_item='diluted_eps',period_type='quarterly')
D,Q1 2025,-0.11,get_financial_line_item_from_identifiers(identifier='D',line_item='diluted_eps',period_type='quarterly')
...
DUK,Q4 2024,1.52,get_financial_line_item_from_identifiers(identifier='DUK',line_item='diluted_eps',period_type='quarterly')
...
```

**Write** `/tmp/earnings-preview/peer-market-caps.csv` — one row per ticker. Write immediately after each `market_cap` call:
```
ticker,market_cap,retrieval_date,source
D,55900000000,2026-02-19,get_capitalization_from_identifiers(identifier='D',capitalization='market_cap')
DUK,98300000000,2026-02-19,get_capitalization_from_identifiers(identifier='DUK',capitalization='market_cap')
...
```

**Write** `/tmp/earnings-preview/consensus-eps.csv` — one row per (ticker, period, consensus mean EPS). Write immediately after each `get_consensus_estimates_from_identifiers` call:
```
ticker,period,consensus_mean_eps,num_estimates,source
D,Q4 2025,0.88,12,get_consensus_estimates_from_identifiers(identifier='D',period_type='quarterly',num_periods_forward=4)
D,Q1 2026,0.72,10,get_consensus_estimates_from_identifiers(identifier='D',period_type='quarterly',num_periods_forward=4)
D,Q2 2026,0.91,9,get_consensus_estimates_from_identifiers(identifier='D',period_type='quarterly',num_periods_forward=4)
D,Q3 2026,1.05,8,get_consensus_estimates_from_identifiers(identifier='D',period_type='quarterly',num_periods_forward=4)
DUK,Q4 2025,1.48,14,get_consensus_estimates_from_identifiers(identifier='DUK',period_type='quarterly',num_periods_forward=4)
...
```

4. **Do NOT calculate P/E or returns yet.** The raw data is now on disk. Calculations happen in Phase 6 (Verification), reading from these files.

**Date Consistency Rule (stock returns):** When computing comparative stock returns (YTD %, 1-yr %, 30d %, 90d %), ALL tickers MUST use the **exact same start and end dates**. After writing all price data to `prices.csv`, identify the first trading date that appears in ALL tickers' data and use that as the common base date. Do NOT use different base dates for different tickers (e.g., the subject from Feb 19 and peers from Feb 28). If a ticker's data starts later than others, use the first overlapping date for ALL calculations. State the common base date in the appendix for every return calculation.

**P/E Currency Rule (LTM P/E):** When computing LTM P/E for each company, use that company's **most recent 4 reported quarters** from `peer-eps.csv` — not a fixed calendar window applied to all. If a peer has already reported Q4 2025 while the subject company has only reported through Q3 2025, the peer's LTM EPS should include Q4 2025. Check the latest reported period for each company and use the 4 most recent periods per company. Note in the appendix which 4 quarters were used for each P/E calculation.

**Market Cap Date-Stamp:** When reporting market cap, use the `retrieval_date` from `peer-market-caps.csv`. If it differs from the report date, note this in the appendix.

---

## Phase 4: News, Estimates & Sector Intelligence (via Kensho Grounding)

Run these `search` queries for **each** category below. Do NOT skip any.

**CRITICAL — Capture Source URLs:** Every Kensho `search` result includes a **source URL** for the underlying article, report, or data page. You MUST record the URL alongside each finding.

**After EACH search call, immediately append the results to** `/tmp/earnings-preview/kensho-findings.txt` using the format below. Do NOT wait until all searches are done — write after each one:

```
=== SEARCH: "[query used]" ===
DATE_RUN: [today's date]
CATEGORY: [estimates|analyst_ratings|risks|news|sector]

FINDING_1: [key finding or excerpt]
URL_1: [source URL from search result]
SOURCE_1: [publication name, date if available]

FINDING_2: [key finding or excerpt]
URL_2: [source URL]
SOURCE_2: [publication name, date]

[...continue for all relevant results from this search...]
```

**Earnings estimates & analyst sentiment:**
1. `search` for "[TICKER] earnings estimates consensus EPS revenue upcoming quarter"
   - Record: consensus EPS, consensus revenue, estimate revision direction over last 90 days.
   - **Append to kensho-findings.txt immediately.**
2. `search` for "[TICKER] analyst ratings price target upgrades downgrades"
   - Record: recent upgrades/downgrades, price target range, bull/bear thesis summaries.
   - **Append to kensho-findings.txt immediately.**
3. `search` for "[TICKER] risks bear case concerns investors"
   - Record: key debates, bear arguments, swing factors for the upcoming print.
   - **Append to kensho-findings.txt immediately.**

**Recent news (MANDATORY — do not skip):**
4. `search` for "[TICKER] [company name] recent news developments"
   - Record: material news from the last 60 days — M&A, product launches, executive changes, regulatory actions, partnerships, legal developments, tariffs, or any event that could affect the upcoming earnings print or forward guidance.
   - For each item, note the date, headline, potential earnings impact.
   - **Append to kensho-findings.txt immediately.**

**Sector context:**
5. `search` for "[company industry/sector] sector outlook trends"
   - Record: sector-level tailwinds/headwinds, macro data, competitive dynamics.
   - **Append to kensho-findings.txt immediately.**

---

## Phase 5: Financial Data Collection

**Quarterly financials (last 8 quarters):**
`get_financial_line_item_from_identifiers` with `period_type="quarterly"`, `num_periods=8` for:
`revenue`, `gross_profit`, `operating_income`, `ebitda`, `net_income`, `diluted_eps`

**After each line item call returns, immediately append to** `/tmp/earnings-preview/financials.csv`. Write the raw values exactly as returned — do NOT round or convert yet. Include the `source` column with the exact MCP function call and parameters:
```
ticker,period,line_item,value,source
D,Q4 2024,revenue,3941000000,get_financial_line_item_from_identifiers(identifier='D',line_item='revenue',period_type='quarterly')
D,Q1 2025,revenue,3400000000,get_financial_line_item_from_identifiers(identifier='D',line_item='revenue',period_type='quarterly')
D,Q2 2025,revenue,4076000000,get_financial_line_item_from_identifiers(identifier='D',line_item='revenue',period_type='quarterly')
D,Q3 2025,revenue,3810000000,get_financial_line_item_from_identifiers(identifier='D',line_item='revenue',period_type='quarterly')
D,Q4 2024,diluted_eps,1.09,get_financial_line_item_from_identifiers(identifier='D',line_item='diluted_eps',period_type='quarterly')
D,Q1 2025,diluted_eps,-0.11,get_financial_line_item_from_identifiers(identifier='D',line_item='diluted_eps',period_type='quarterly')
...
```

**Do NOT calculate margins or growth rates yet.** Write raw data only. Calculations happen in Phase 6.

**Segment data:**
- `get_segments_from_identifiers` with `segment_type="business"`, `period_type="quarterly"`, `num_periods=8`
- You need 8 quarters (not 4) so you have the year-ago quarter for y/y comparisons. To calculate y/y for Q3 2025, you need Q3 2024 — which is the 5th quarter back. **If the prior-year quarter's segment data is not available in the API response, do NOT estimate or fabricate it. State "y/y not available" in the report.**

**Immediately write** `/tmp/earnings-preview/segments.csv`:
```
ticker,period,segment_name,revenue,source
D,Q3 2024,Dominion Energy Virginia,2762000000,get_segments_from_identifiers(identifier='D',segment_type='business',period_type='quarterly')
D,Q3 2024,Dominion Energy South Carolina,848000000,get_segments_from_identifiers(identifier='D',segment_type='business',period_type='quarterly')
D,Q3 2024,Contracted Energy,260000000,get_segments_from_identifiers(identifier='D',segment_type='business',period_type='quarterly')
D,Q3 2025,Dominion Energy Virginia,3311000000,get_segments_from_identifiers(identifier='D',segment_type='business',period_type='quarterly')
D,Q3 2025,Dominion Energy South Carolina,945000000,get_segments_from_identifiers(identifier='D',segment_type='business',period_type='quarterly')
D,Q3 2025,Contracted Energy,297000000,get_segments_from_identifiers(identifier='D',segment_type='business',period_type='quarterly')
...
```

**Earnings history (for stock chart annotations):**
- `get_earnings_from_identifiers` — collect past earnings dates within the 12-month price window.
- **Immediately write** `/tmp/earnings-preview/earnings-dates.csv`:
```
ticker,earnings_date,call_name,source
D,2025-05-02,Q1 2025 Earnings Call,get_earnings_from_identifiers(identifier='D')
D,2025-08-01,Q2 2025 Earnings Call,get_earnings_from_identifiers(identifier='D')
D,2025-10-31,Q3 2025 Earnings Call,get_earnings_from_identifiers(identifier='D')
...
```

---

## Phase 6: Verification & Calculations (MANDATORY — DO NOT SKIP)

Before generating the report, read back ALL intermediate files and perform calculations from the clean data. This phase ensures data integrity by working from files rather than compressed conversation context.

1. **Read all intermediate files** using bash `cat` commands:
   - `cat /tmp/earnings-preview/company-info.txt`
   - `cat /tmp/earnings-preview/transcript-extracts.txt`
   - `cat /tmp/earnings-preview/financials.csv`
   - `cat /tmp/earnings-preview/segments.csv`
   - `cat /tmp/earnings-preview/prices.csv`
   - `cat /tmp/earnings-preview/peer-eps.csv`
   - `cat /tmp/earnings-preview/peer-market-caps.csv`
   - `cat /tmp/earnings-preview/consensus-eps.csv`
   - `cat /tmp/earnings-preview/kensho-findings.txt`
   - `cat /tmp/earnings-preview/earnings-dates.csv`

2. **Calculate derived metrics** from the raw data now in context:
   - Gross margin % = gross_profit / revenue (per quarter)
   - Operating margin % = operating_income / revenue (per quarter)
   - Revenue y/y growth % = (current Q revenue - year-ago Q revenue) / year-ago Q revenue
   - EPS y/y growth % = same logic; use "n.m." if base is negative
   - Segment y/y growth % = match segment by name to year-ago Q; if missing, note "y/y not available"
   - LTM P/E per company = latest price / sum of most recent 4 quarterly EPS (check which 4 quarters are available per ticker using `peer-eps.csv`)
   - NTM P/E per company = latest price / NTM EPS, where **NTM EPS = sum of the next 4 quarterly consensus mean EPS estimates** from `consensus-eps.csv`. Add all 4 quarters' consensus_mean_eps values for each ticker. If fewer than 4 forward quarters are available for a peer, mark NTM P/E as "n/a". Note in the appendix which 4 quarters were summed.
   - Stock returns (YTD, 1-yr, 30d, 90d) = find the **common first date across all tickers** in `prices.csv`, then compute returns from that date

3. **Cross-check**:
   - Verify every segment y/y has the actual prior-year row in `segments.csv`. If not, mark "y/y not available."
   - Verify all stock return base dates are identical across tickers.
   - Verify any multi-step calculation by re-summing components (e.g., LTM EPS sum matches the 4 quarterly values).
   - Verify all verbatim quotes in `transcript-extracts.txt` are exact copy-pastes (not paraphrases).

4. **Write** `/tmp/earnings-preview/calculations.csv` with all derived values:
```
ticker,metric,value,formula,components
D,gross_margin_Q3_2025,32.5%,gross_profit/revenue,"gross_profit=1238100000,revenue=3810000000"
D,revenue_yoy_Q3_2025,+9.3%,(Q3_2025-Q3_2024)/Q3_2024,"Q3_2025=3810000000,Q3_2024=3486000000"
D,ltm_pe,24.2x,price/ltm_eps,"price=65.46,ltm_eps=2.70,quarters=Q4_2024+Q1_2025+Q2_2025+Q3_2025"
D,ntm_pe,18.5x,price/ntm_eps,"price=65.46,ntm_eps=3.56,quarters=Q4_2025(0.88)+Q1_2026(0.72)+Q2_2026(0.91)+Q3_2026(1.05),source=get_consensus_estimates_from_identifiers"
D,yoy_return,+17.6%,(end-start)/start,"end=65.46,start=55.67,base_date=2025-02-19"
DUK,yoy_return,+13.0%,(end-start)/start,"end=126.32,start=111.79,base_date=2025-02-19"
...
```

This file becomes the single source of truth for all numbers in the report.

---

## Phase 7: Generate the HTML Report

**STOP — BEFORE WRITING ANY HTML, YOU MUST READ ALL INTERMEDIATE FILES. THIS IS A BLOCKING PREREQUISITE.**

This is not optional. You MUST run each `cat` command below as a **separate bash tool call** (not combined into one). This ensures each file's contents are individually loaded and visible in the conversation. Do NOT combine them into a single command. Do NOT skip any file.

Run these commands **one at a time, each as its own bash call**:

1. `cat /tmp/earnings-preview/company-info.txt`
2. `cat /tmp/earnings-preview/transcript-extracts.txt`
3. `cat /tmp/earnings-preview/financials.csv`
4. `cat /tmp/earnings-preview/segments.csv`
5. `cat /tmp/earnings-preview/prices.csv`
6. `cat /tmp/earnings-preview/peer-eps.csv`
7. `cat /tmp/earnings-preview/peer-market-caps.csv`
8. `cat /tmp/earnings-preview/consensus-eps.csv`
9. `cat /tmp/earnings-preview/kensho-findings.txt`
10. `cat /tmp/earnings-preview/earnings-dates.csv`
11. `cat /tmp/earnings-preview/calculations.csv`

**After reading ALL files, you MUST print a summary message to the user** that lists every file and its status. Use exactly this format:

```
--- DATA FILE VERIFICATION ---
1. company-info.txt        ✓ loaded ([N] lines)
2. transcript-extracts.txt ✓ loaded ([N] lines)
3. financials.csv          ✓ loaded ([N] rows)
4. segments.csv            ✓ loaded ([N] rows)
5. prices.csv              ✓ loaded ([N] rows)
6. peer-eps.csv            ✓ loaded ([N] rows)
7. peer-market-caps.csv    ✓ loaded ([N] rows)
8. consensus-eps.csv       ✓ loaded ([N] rows)
9. kensho-findings.txt     ✓ loaded ([N] lines)
10. earnings-dates.csv     ✓ loaded ([N] rows)
11. calculations.csv       ✓ loaded ([N] rows)

All intermediate data files loaded successfully.
Generating report using file data as the single source of truth.
---
```

If any file is missing or empty, STOP and tell the user which file failed. Do NOT proceed to generate the report with missing data.

**Every number, quote, source URL, and MCP function call reference in the HTML report must come from these files — not from your memory of earlier conversation turns.** The files are the single source of truth. Earlier conversation context may have been compressed or summarized and WILL contain errors if relied upon. If a data point is not in the files, it should not appear in the report.

See [report-template.md](report-template.md) for the complete HTML template, CSS, and Chart.js configuration.

**MANDATORY — Use Template Helper Functions for Charts:**
The report-template.md provides pre-built, debugged Chart.js helper functions. You MUST use these exact functions to create charts. Do NOT write custom inline Chart.js code. The helpers are:
- `createRevEpsChart(canvasId, labels, revenueData, epsData, revLabel)` — for Figure 1
- `createMarginChart(canvasId, labels, grossMargins, opMargins)` — for Figure 2
- `createRevGrowthChart(canvasId, labels, growthData)` — for Figure 3
- `createAnnotatedPriceChart(canvasId, labels, prices, earningsDates, ticker)` — for Figure 5
- `createCompPerfChart(canvasId, labels, datasets)` — for Figure 6
- `createPEChart(canvasId, companies)` — for Figure 7

Each chart call MUST be in its own `<script>` tag wrapped in a try-catch block. This ensures a bug in one chart does not prevent other charts from rendering. Example:
```html
<script>
try {
  createRevEpsChart('chart-rev-eps', [...], [...], [...], 'Revenue ($B)');
} catch(e) { console.error('Figure 1 error:', e); }
</script>
<script>
try {
  createMarginChart('chart-margins', [...], [...], [...]);
} catch(e) { console.error('Figure 2 error:', e); }
</script>
```

### Report Structure (4-5 pages total)

The report has two halves: **narrative** (pages 1-2) and **figures** (pages 3-5). Keep these tightly integrated.

---

**AI DISCLAIMER (MANDATORY — must appear in 3 places):**
You MUST include the following disclaimer text in the report HTML. This is not optional — the report is incomplete without it:

> **"Analysis is AI-generated — please confirm all outputs"**

It must appear in exactly these 3 locations:
1. **Header banner** — immediately before the cover header, as a centered yellow banner: `<div class="ai-disclaimer">Analysis is AI-generated — please confirm all outputs</div>`
2. **Footer** — inside the page-footer div, as a prominent yellow banner: `<div class="footer-disclaimer">Analysis is AI-generated — please confirm all outputs</div>`
3. **Appendix** — as the first line of the appendix section, before the table: `<div class="ai-disclaimer">Analysis is AI-generated — please confirm all outputs</div>`

---

**PAGE 1: Cover & Thesis**

- **AI disclaimer banner** (yellow, centered — see AI DISCLAIMER rule above)
- **Header**: Company name (TICKER) | Industry | Report date
- **Title**: Thematic, specific to the quarter (e.g., "Walmart Inc. (WMT) Q4 FY2026 Earnings Preview: Holiday Harvest — Can Furner's First Print Confirm the $1T Thesis?")
- **Executive thesis** (2-3 short paragraphs max with bullet points):
  - What we expect from this print in 1-2 sentences
  - 4-6 bullet points covering: our EPS estimate vs consensus, guidance expectations, key metrics to watch, what would move the stock, key debates
  - Keep it direct and opinionated — take a view, don't hedge everything
- **Key management quotes** from the most recent earnings call woven into the narrative where relevant. Do NOT put these under a separate heading. Integrate them naturally as supporting evidence for your thesis points. Format as indented blockquotes.

---

**PAGE 2: Estimates, Themes & News**

- **Consensus Estimates Table** (single table, labeled as a figure):
  - Columns: Metric | Consensus | Our Estimate | y/y Change
  - Rows: Revenue, EPS, Gross Margin, Operating Income, and 2-3 company-specific KPIs that matter (e.g., comp sales, eComm growth, membership revenue — whatever the Street cares about for THIS company)
  - **Color-coding is strictly mechanical:** If the y/y change value is negative, use `class="neg"` (red). If positive, use `class="pos"` (green). If zero or N/A, use `class="neutral"`. The sign of the number determines the class — do NOT override based on interpretation. A -1.1% is ALWAYS red, even if the decline is small.
  - This is the ONLY guidance/estimates section. Do not repeat estimate data elsewhere.

- **Key Metrics Beyond Headline EPS** (bulleted list, 3-5 items):
  - The specific metrics that will determine if this is a good or bad quarter beyond the EPS number
  - For each: what the metric is, what consensus/management expects, why it matters
  - Be specific: "Walmart Connect ad revenue growth (consensus ~30% y/y, 3Q was 33%)"

- **Themes to Watch** (3-5 bullets):
  - Forward-looking items for the upcoming report
  - What management needs to deliver on, what could surprise, what the bears are focused on
  - Each theme: 1-2 sentences max

- **Recent News & Developments** (3-5 bullets):
  - Material news from the last 60 days, one line each
  - Date + headline + brief impact assessment
  - Only include items that could affect the upcoming print or guidance

---

**PAGES 3-5: Figures (all charts and tables)**

All figures are numbered sequentially. Every figure has a title and source line.

- **Figure 1: Quarterly Revenue & Diluted EPS** — Bar/line combo, 8 quarters
- **Figure 2: Margin Trends (Gross & Operating %)** — Dual line chart, 8 quarters
- **Figure 3: Revenue Growth y/y %** — Bar chart with green/red conditional coloring. **Only include quarters where both current and year-ago data exist** (typically the most recent 4 quarters from the 8 fetched). Do NOT include quarters where y/y cannot be computed — the chart should have 4 bars, not 8.
- **Figure 4: Business Segment Revenue** — Table: Segment | Latest Q Rev ($M) | % of Total | y/y Change
- **Figure 5: 1-Year Stock Price with Earnings Dates** — Price line with vertical annotation lines at earnings dates, labeled with quarter and 1-day post-earnings move
- **Figure 6: Stock Performance vs. Competitors (Indexed to 100)** — Multi-line chart, subject company as thick solid line, competitors as thinner dashed lines
- **Figure 7: LTM P/E vs. Competitors** — Horizontal bar chart, subject company highlighted in navy
- **Figure 8: Competitor Comparison Table** — Ticker | Company | Mkt Cap | LTM P/E | NTM P/E | YTD % | 1-Yr %

---

**APPENDIX: Data Sources & Calculations (MANDATORY — DO NOT SKIP OR ABBREVIATE)**

The appendix MUST begin with the AI disclaimer banner: `<div class="ai-disclaimer">Analysis is AI-generated — please confirm all outputs</div>`

The final page(s) of the report MUST include an Appendix table that documents **every claim** — numeric and non-numeric — cited in the report. **Every number that appears in the report body must have a corresponding row in this appendix, and every such number in the report body must be a clickable `<a href="#ref-N">` hyperlink that scrolls to its appendix row.** If a number appears in the report without a hyperlink to the appendix, the report is incomplete.

- **Table columns**: Ref # | Fact | Value | Source & Derivation
- **Ref #**: Sequential ID matching the hyperlink anchors in the report body (`ref-1`, `ref-2`, etc.). Each row has an `id="ref-N"` attribute so hyperlinks scroll to it.
- **Fact**: Human-readable label (e.g., "Q3 FY2026 Revenue", "LTM P/E — WMT", "Management flagged tariff headwinds", "Barclays upgraded to Overweight")
- **Value**: The exact figure as displayed in the report (e.g., "$152.3B", "24.5%", "28.1x"). For non-numeric facts, leave blank or write "N/A".
- **Source & Derivation**: This is the critical column. **Every row must have a specific, detailed source — not just a label.** Follow these rules strictly:

  **For raw financial data from S&P Capital IQ (revenue, EPS, gross profit, operating income, net income, EBITDA, prices, market cap, etc.):**
  - State the MCP function used and its key parameters. Format: `S&P Capital IQ — [function_name](identifier='[TICKER]', line_item='[item]', period_type='[type]', period='[Q# FY####]')`
  - Examples:
    - `S&P Capital IQ — get_financial_line_item_from_identifiers(identifier='WMT', line_item='revenue', period_type='quarterly', period='Q3 FY2026')`
    - `S&P Capital IQ — get_financial_line_item_from_identifiers(identifier='WMT', line_item='diluted_eps', period_type='quarterly', period='Q3 FY2026')`
    - `S&P Capital IQ — get_prices_from_identifiers(identifier='WMT', periodicity='day')`
    - `S&P Capital IQ — get_capitalization_from_identifiers(identifier='WMT', capitalization='market_cap')`
  - **Do NOT just write "S&P Capital IQ" with no detail.** The reader must know exactly which data point from which tool call produced this number.

  **For calculated values (margins, growth rates, P/E, returns, y/y changes):**
  - Show the full formula with **hyperlinked components** — each component must be an `<a href="#ref-N">` link back to the appendix row for that raw data point. This is critical: the reader must be able to click through from the calculated value to each of its inputs.
  - Example: `Gross Margin = <a href='#ref-5'>Gross Profit $37.2B</a> / <a href='#ref-1'>Revenue $152.3B</a> = 24.4%. Source: S&P Capital IQ (calculated)`
  - Example: `LTM P/E = <a href='#ref-20'>Price $172.35</a> / (<a href='#ref-8'>Q1 EPS $1.47</a> + <a href='#ref-9'>Q2 EPS $1.84</a> + <a href='#ref-10'>Q3 EPS $1.53</a> + <a href='#ref-11'>Q4 EPS $1.80</a>) = $172.35 / $6.64 = 25.9x`
  - Example: `Revenue y/y growth = (<a href='#ref-12'>Q3 FY26 Rev $165.8B</a> - <a href='#ref-3'>Q3 FY25 Rev $160.8B</a>) / <a href='#ref-3'>Q3 FY25 Rev $160.8B</a> = +3.1%`
  - **Every formula component must be a clickable hyperlink.** Do NOT write formulas with plain-text numbers.

  **For transcript-sourced claims (quotes, management commentary, guidance):**
  - Write the **verbatim excerpt sentence** from the transcript.
  - Reference the transcript by its full name and the `key_dev_id` used to fetch it.
  - Format: `"[verbatim quote]" — [Speaker], [Title]. Source: [Q# FY#### Earnings Call Transcript] (key_dev_id: [ID])`
  - Example: `"We expect comp sales growth of 3-4% in Q4" — CEO John Furner. Source: Q3 FY2026 Earnings Call Transcript (key_dev_id: 12345678)`

  **For Kensho Grounding search results (news, analyst ratings, consensus estimates):**
  - Write the key finding or excerpt from the search result.
  - **MANDATORY: Include the source URL** returned by the Kensho `search` tool as a clickable `<a href="[URL]" target="_blank">` hyperlink. This is the most important part — readers must be able to click through to the original source.
  - Format: `"[finding/excerpt]" — <a href="[URL]" target="_blank">[Source Title or Publication]</a>. Query: search("[query used]")`
  - Example: `"Barclays upgraded WMT to Overweight with $210 price target on Jan 15, 2026." — <a href="https://www.investing.com/news/barclays-upgrades-wmt" target="_blank">Investing.com, Jan 15 2026</a>. Query: search("WMT analyst ratings price target upgrades downgrades")`
  - If no URL was returned for a particular result, write "Source URL not available" and still include the search query.

**Completeness check:** Before finalizing the report, scan every number in the report body. If any number is not wrapped in `<a href="#ref-N" class="data-ref">`, fix it. If any appendix row has a Source & Derivation that is just a bare label like "S&P Capital IQ" with no function call detail, fix it. If any calculated value's formula lacks hyperlinked components, fix it. If any Kensho-sourced claim lacks a source URL, fix it.

Group the appendix rows by section (Financials, Valuation, Estimates & Consensus, Transcript Claims, News & Analyst Commentary, Stock Performance) with subheadings. Use smaller font size (10-11px).

---

## Phase 8: Output

1. Write the complete HTML file to `earnings-preview-[TICKER]-YYYY-MM-DD.html` in the current working directory.
2. Open it in the browser: `open earnings-preview-[TICKER]-YYYY-MM-DD.html`
3. Tell the user the file has been created and summarize the key findings.

---

## Writing Guidelines

- **NO EMOJIS**: Do not use any emojis anywhere in the report. This is a professional research document.
- **CONCISE**: Target 4-5 printed pages. Every sentence must carry weight. Use bullets, not paragraphs, wherever possible. If a section feels long, cut it.
- **Be specific with numbers**: "$52.4B revenue, up 5.2% y/y" not "strong revenue growth."
- **Take a view**: This is an earnings preview, not a summary. State what you expect, what matters, and why. Be opinionated but back it with data.
- **Management quotes without headers**: Weave 3-4 key management quotes from the most recent call directly into the narrative as blockquotes. Do not create a "Key Management Quotes" section heading — let them flow naturally as supporting evidence.
- **Professional tone**: Sell-side equity research style — analytical, direct, data-driven.
- **Charts must use real data**: Every chart populated with actual MCP data. Never fabricate.
- **Competitor context**: Frame valuation relative to peers. A 25x P/E means nothing without knowing peers trade at 20x or 35x.
- **Hyperlinked claims**: Every factual claim — numeric or qualitative — must be an `<a class="data-ref">` tag linking to its appendix entry. Numbers: `<a href="#ref-1" class="data-ref">$152.3B</a>`. Qualitative: `<a href="#ref-25" class="data-ref">management flagged tariff headwinds as the primary margin risk</a>`. No fact should appear without a traceable source in the appendix.

Источник: anthropics/financial-services / spglobal / earnings-preview-single ↗. Ссылка проверена 2026-10-10.