Skip to main content
Glama
norton77930

Podcast Ingestion Core MCP Server

by norton77930

Podcast Ingestion Core

Spec034 Task #77 current terminal is startup/plugin closed; credential_provider BLOCKED; overall BLOCKED. Its H2-frozen exact 20-file official NousResearch/hermes-agent bundle is static/offline only: startup order and the fixed security-guidance plugin identity chain are closed, while credential/provider construction data flow, whole-program closure, dynamic/user/project/entry-point plugin paths, runtime/secret edges, and actual activation remain blocked or unobserved. runtime_status=not_run; live_actions_authorized=false. The fresh review-only bootstrap/final trust chain is reserved for Main after both reviews PASS and remains unrun.

Podcast Ingestion Core — это универсальное ядро для приёма подкастов. В настоящее время реализованы: список эпизодов RSS, поиск эпизода, загрузка аудио, локальное транскрибирование faster-whisper, проверка транскриптов, детерминированное экстрактивное реферирование в Markdown, конвейер семантического реферирования через LLM, совместимый с OpenAI, детерминированное извлечение упоминаний, кэш/поиск метаданных SQLite, а также локальный stdio и loopback Streamable HTTP sidecar, использующие общий экземпляр FastMCP. Прямая интеграция Hermes MCP/config/Skills работает; проверка равенства конечных точек контента/метаданных C6 до/после из Spec 026 подтверждена обязательными рецензентами и единственным живым прогоном v2 как PASS-current, при этом не утверждается отсутствие транзиентных мутаций между снимками. C7 по-прежнему не имеет безопасных сред выполнения; тег v0.20.0 v2026.8.3 hooks — лишь кандидат, общий статус остаётся Blocked. Веб-интерфейс, планировщик, эмбеддинги и векторный поиск ещё не реализованы.

Первый профиль подкаста — Gooaye 股癌, но ядро не должно быть жёстко привязано к 股癌. Все настройки, специфичные для подкаста, хранятся в config/podcasts.yaml.

Передача ИИ-агенту / С чего начать

Этот README — краткая ориентация (структура каталогов, примеры CLI, история фаз), а не полный источник правил. Новому ИИ-агенту или разработчику следует начать отсюда:

  • Точка входа для передачи (10 минут на понимание репозитория): docs/agent-handoff.md

  • Структура разработки ИИ (иерархия инструкций, классификация изменений, DoR/DoD): docs/ai-development-framework.md

  • Матрица верификации (какие тесты запускать для каждого типа изменений): docs/verification-matrix.md

  • Журнал архитектурных решений (индекс ADR): docs/architecture-decision-records/README.md

  • Жёсткие ограничения агента на уровне репозитория: AGENTS.md

Related MCP server: Podcast Index MCP Server

Цели проекта

  • Поддержка нескольких подкастов с помощью одного набора основных функций.

  • CLI-скрипты должны только разбирать аргументы и вызывать основные функции.

  • Возможность в будущем упаковать основные возможности непосредственно в MCP tools.

  • Все выходные файлы размещаются в data/ с детерминированными именами для удобства поиска инструментами.

Структура каталогов

config/
  podcasts.yaml
  industry_chain_mappings.yaml
  external_data_boundary.yaml
  external_market_data_fixtures.yaml
  gooaye_lens.yaml
  llm_profiles.yaml
data/
  audio/
  transcripts/
  summaries/
  mentions/
  reports/
  mappings/
  external/
  stock-lens/
  cache/
  corpus/
docs/
  agent-handoff.md
  ai-development-framework.md
  verification-matrix.md
  architecture-decision-records/
  architecture.md
  mvp-requirements.md
  roadmap.md
  mcp-readiness.md
  mcp-usage.md
  codex-mcp-setup.md
  claude-mcp-setup.md
  mcp-troubleshooting.md
scripts/
  list_episodes.py
  download_episode.py
  transcribe_episode.py
  validate_transcript.py
  summarize_episode.py
  run_corpus_episode_intake.py
  generate_corpus_index.py
  generate_corpus_remediation_plan.py
  run_corpus_audio_download.py
  run_corpus_remediation.py
  run_corpus_local_transcription.py
  run_corpus_episode_workflow.py
  run_corpus_semantic_remediation.py
  run_corpus_episode_completion_workflow.py
  run_corpus_latest_episode_deterministic_workflow.py
  run_latest_episode_verified_research_report_workflow.py
  run_episode_verified_research_report_workflow.py
  query_verified_research_report_catalog.py
  revalidate_verified_research_report_sources.py
  query_verified_research_report_coverage.py
  suggest_historical_verified_report_next_step.py
  list_verified_report_gap_backlog.py
  extract_mentions.py
  rebuild_cache.py
  search_transcripts.py
  search_mentions.py
  validate_mcp_setup.py
  validate_hermes_integration.py
  manage_hermes_integration.py
  run_mcp_server.py
  run_mcp_http_server.py
deploy/
  hermes/
src/
  podcast_ingest_core/
tests/

Основные функции

list_episodes(podcast_id, limit)
get_episode(podcast_id, episode_ref)
download_audio(podcast_id, episode_ref)
transcribe_episode(
    podcast_id,
    episode_ref,
    model=None,
    device="cpu",
    compute_type="int8",
    vad_filter=False,
    force=False,
    audio_path=None,
    progress_callback=None,
)
validate_transcript(podcast_id, episode_ref)
summarize_episode(
    podcast_id,
    episode_ref,
    force=False,
    max_quotes=10,
    window_seconds=300,
    allow_partial=False,
)
semantic_summarize_episode(
    podcast_id,
    episode_ref,
    provider="openai-compatible",
    model=None,
    base_url=None,
    api_key_env="OPENAI_API_KEY",
    force=False,
    chunk_seconds=600,
    max_segments_per_chunk=120,
    allow_partial=False,
)
extract_mentions(
    podcast_id,
    episode_ref,
    force=False,
    allow_partial=False,
    max_evidence_per_mention=5,
)
generate_episode_intelligence_report(
    podcast_id,
    episode_ref,
    force=False,
    allow_partial=False,
    window_seconds=300,
    max_evidence_per_section=5,
)
generate_industry_chain_mapping(
    podcast_id,
    episode_ref,
    force=False,
    allow_partial=False,
    max_candidates_per_node=5,
    max_evidence_per_candidate=5,
)
generate_external_data_boundary(
    podcast_id,
    episode_ref,
    force=False,
    allow_partial=False,
)
verify_external_data_boundary(
    podcast_id,
    episode_ref,
    confirm=False,
    force=False,
    allow_partial=False,
    provider="fixture",
    fixture_path=DEFAULT_EXTERNAL_MARKET_DATA_FIXTURE_PATH,
)
load_gooaye_lens_model(path=DEFAULT_GOOAYE_LENS_CONFIG_PATH)
generate_stock_lens_report(
    podcast_id,
    stock_query,
    force=False,
    allow_partial=False,
    max_evidence_items=10,
)
generate_stock_lens_synthesis_report(
    podcast_id,
    stock_query,
    confirm=False,
    force=False,
    allow_partial=False,
    api_cost_ack="",
    provider="openai-compatible",
    model=None,
    base_url=None,
    api_key_env="OPENAI_API_KEY",
    max_prompt_chars=24000,
)
run_research_workflow(
    podcast_id,
    episode_ref,
    stock_query=None,
    confirm=False,
    force=False,
    allow_partial=False,
    include_semantic_summary=False,
    include_stock_lens_synthesis=False,
    include_external_data_verification=False,
    api_cost_ack="",
    semantic_provider="openai-compatible",
    semantic_model=None,
    semantic_base_url=None,
    semantic_api_key_env="OPENAI_API_KEY",
    semantic_chunk_seconds=600,
    semantic_max_segments_per_chunk=120,
    synthesis_provider="openai-compatible",
    synthesis_model=None,
    synthesis_base_url=None,
    synthesis_api_key_env="OPENAI_API_KEY",
    synthesis_max_prompt_chars=24000,
    external_data_provider="fixture",
    external_fixture_path=DEFAULT_EXTERNAL_MARKET_DATA_FIXTURE_PATH,
    max_evidence_per_mention=5,
    report_window_seconds=300,
    max_evidence_per_section=5,
    max_candidates_per_node=5,
    max_evidence_per_candidate=5,
    max_stock_evidence_items=10,
)
initialize_cache(db_path=None)
index_episode(podcast_id, episode_ref, force=False, db_path=None)
rebuild_cache(podcast_id=None, force=False, db_path=None)
search_transcripts(query, podcast_id=None, limit=20, db_path=None, search_mode="auto", context_segments=0, case_sensitive=False)
search_mentions(query, podcast_id=None, mention_type=None, limit=20, db_path=None, case_sensitive=False)
run_corpus_episode_intake(podcast_id, episode_ref="latest", confirm=False)
generate_corpus_index(podcast_id)
generate_corpus_remediation_plan(podcast_id)
run_corpus_audio_download(podcast_id, episode_ref=None, confirm=False)
run_corpus_remediation(
    podcast_id,
    confirm=False,
    episode_ref=None,
    action_family=None,
    max_actions=None,
    force=False,
    allow_partial=False,
)
run_corpus_local_transcription(
    podcast_id,
    episode_ref=None,
    confirm=False,
    model=None,
    device="cpu",
    compute_type="int8",
    vad_filter=False,
)
run_corpus_episode_workflow(
    podcast_id,
    episode_ref="latest",
    stage="next",
    confirm=False,
    model=None,
    device="cpu",
    compute_type="int8",
    vad_filter=False,
    force=False,
    allow_partial=False,
    max_actions=None,
)
run_corpus_semantic_remediation(
    podcast_id,
    episode_ref,
    action="next",
    confirm=False,
    api_cost_ack="",
    provider="openai-compatible",
    model=None,
    base_url=None,
    api_key_env="OPENAI_API_KEY",
    chunk_seconds=600,
    max_segments_per_chunk=120,
    progress_callback=None,
)
run_corpus_episode_completion_workflow(
    podcast_id,
    episode_ref="latest",
    action="next",
    confirm=False,
    api_cost_ack="",
    transcription_model=None,
    transcription_device="cpu",
    transcription_compute_type="int8",
    transcription_vad_filter=False,
    semantic_provider="openai-compatible",
    semantic_model=None,
    semantic_base_url=None,
    semantic_api_key_env="OPENAI_API_KEY",
    semantic_chunk_seconds=600,
    semantic_max_segments_per_chunk=120,
    progress_callback=None,
)
run_corpus_latest_episode_deterministic_workflow(
    podcast_id,
    confirm=False,
    transcription_model=None,
    transcription_device="cpu",
    transcription_compute_type="int8",
    transcription_vad_filter=False,
)
run_latest_episode_verified_research_report_workflow(
    podcast_id,
    confirm=False,
    expected_episode_ref=None,
    api_cost_ack="",
    stock_query=None,
    include_fixture_verification=False,
)
run_episode_verified_research_report_workflow(
    podcast_id,
    episode_ref,
    confirm=False,
    stock_query=None,
    include_fixture_verification=False,
)

summarize_episode — это детерминированный / экстрактивный шаблон, не вызывающий внешний LLM API и не выполняющий семантических выводов. semantic_summarize_episode использует API, совместимый с OpenAI, для создания семантической сводки; к важным выводам следует по возможности прикладывать временные метки, и это не является инвестиционной рекомендацией. extract_mentions использует детерминированные правила для извлечения упоминаний из сегментов транскрипта; каждое упоминание сохраняется с временной меткой. generate_episode_intelligence_report использует детерминированные правила для создания отчёта по эпизоду из существующего транскрипта и артефакта упоминаний; не вызывает LLM, не запрашивает внешние рыночные данные, не создаёт маппинг акций и не даёт инвестиционных рекомендаций. generate_industry_chain_mapping использует локальный детерминированный конфиг маппинга для создания узлов производственной цепочки и кандидатов в акции из существующего отчёта по эпизоду; чётко различает явные доказательства из подкаста и выведенные / требующие проверки исследовательские зацепки. generate_external_data_boundary использует локальный конфиг границ для создания каркаса границ проверки внешних данных из существующего отраслевого маппинга; не вызывает внешних провайдеров, не читает API-ключи и не формирует факты о текущей рыночной ситуации. verify_external_data_boundary — это каркас провайдера фикстур Phase 6M: сначала dry-run; только с confirm=True пытается обновить существующую внешнюю границу с помощью локальных фикстур; имеет защиту confirm, не использует live market API, не вносит изменений в MCP tools и не даёт инвестиционных рекомендаций. load_gooaye_lens_model только загружает и проверяет локальную аналитическую структуру Gooaye Lens; не создаёт отчётов по акциям, не вызывает LLM и не запрашивает внешние рыночные данные. generate_stock_lens_report использует общеподкастовые локальные артефакты и Gooaye Lens для создания структуры исследования акций/компании; не вызывает LLM, не запрашивает внешние рыночные данные, не даёт рекомендаций по покупке/продаже, целевых цен или гарантий доходности. generate_stock_lens_synthesis_report — это Phase 6J Stock Lens LLM Synthesis: сначала dry-run; по умолчанию входная граница LLM — только JSON 6F stock lens; подтверждённое выполнение должно предоставить точный api_cost\_ack; Phase 6V позволяет явно отказаться от проверенного контекста семантической сводки, но по-прежнему не читает сырые транскрипты, не запрашивает внешние рыночные данные, не вносит изменений в MCP tools и не даёт рекомендаций по покупке/продаже. run_research_workflow — это локальный раннер исследовательских процессов с приоритетом dry-run, связывающий упоминания, отчёты по эпизодам, отраслевой маппинг, внешние границы и опционально stock lens; Phase 6I поддерживает опциональное выполнение семантической сводки внутри исследовательского процесса; Phase 6K поддерживает опт-ин синтез в процессе с помощью include_stock_lens_synthesis=True, подключая синтез Phase 6J после отчёта stock lens. Phase 6N поддерживает опциональную проверку фикстур процесса с помощью include_external_data_verification=True, обновляя статус внешней проверки после внешней границы через локального провайдера фикстур; этот шаг не использует live market API, не требует API-ключей, не вносит изменений в MCP tools, не пересобирает кэш автоматически и не даёт инвестиционных рекомендаций. generate_corpus_index только сканирует локальные артефакты по эпизодам и метаданные семантической проверки, записывая детерминированный статус корпуса в JSON/Markdown; не читает RSS, не читает SQLite-кэш, не вызывает LLM, не читает .env, не добавляет MCP tools и не выводит сырые транскрипты/доказательства/семантическое содержимое. generate_corpus_remediation_plan сначала обновляет индекс корпуса, затем выводит из локальных метаданных статуса пробелы полной лестницы, блокировки, предупреждения и текст действий только вручную, записывая детерминированный план исправлений в JSON/Markdown; не выполняет загрузку, транскрибирование, реферирование, процессы, LLM, MCP или пересборку кэша и не выводит сырые транскрипты/доказательства/семантическое содержимое/подсказки/необработанные выходные данные LLM. run_corpus_audio_download сначала обновляет план исправлений; dry-run возвращает только метаданные кандидатов с отсутствующим аудио и готовых к действию, не читает RSS, не вызывает сеть/загрузчик, не пишет отчёт о запуске; подтверждённое выполнение должно указать один эпизод, затем вызывает существующий download_audio() и записывает последний детерминированный отчёт о загрузке аудио, не содержащий исходных URL, строк запросов, секретов или трассировок. run_corpus_remediation сначала обновляет план исправлений; dry-run возвращает только метаданные выбранных/пропущенных/заблокированных/исключённых элементов; подтверждённое выполнение должно указать эпизод или семейство действий и выполняет только детерминированные семейства, готовые к транскрипции (экстрактивная сводка, упоминания, отчёт по эпизоду, отраслевой маппинг, внешняя граница), записывая последний детерминированный отчёт о запуске. run_corpus_local_transcription сначала обновляет план исправлений; dry-run возвращает только метаданные кандидатов с локальным аудио и отсутствующим транскриптом; подтверждённое выполнение должно указать один эпизод и использует только явный локальный audio_path для вызова существующего ядра транскрибирования; не загружает аудио, не исправляет повреждённые/частичные транскрипты, не трогает LLM/MCP/пересборку кэша и записывает последний детерминированный отчёт о локальном транскрибировании. run_corpus_episode_workflow — это безопасная точка входа с приоритетом dry-run для новых эпизодов: последовательно определяет следующий безопасный этап приёма, загрузки аудио, локального транскрибирования и детерминированного исправления; dry-run не пишет отчёт о процессе и не выполняет этапы; подтверждённое выполнение должно использовать stage="next" и выполнять только один этап, записывая последний детерминированный отчёт о процессе. Все шаги LLM требуют confirm=True и точного api_cost_ack перед вызовом внешней LLM. Этот процесс по-прежнему не запрашивает внешние рыночные данные, не передаёт сырые транскрипты в синтез stock lens, не вносит изменений в MCP tools и не пересобирает кэш автоматически. rebuild_cache только индексирует существующие артефакты и не загружает, не транскрибирует, не реферирует, не извлекает упоминания, не создаёт отчёты, маппинги, внешние границы или отчёты stock lens автоматически.

Точный контракт стабилизации 014: confirm=False — это строго нулевой файл; за исключением чтения настроенного RSS-канала подкаста и локальных артефактов, не создаются, не изменяются и не удаляются никакие файлы; выбранная выборка создаёт только один снимок индекса/плана в памяти и последовательно предпросматривает 012/011/010. Это отличается от поведения свежих 008/009, намеренно сохранённого в автономных dry-run 010/011/012.

run_corpus_semantic_remediation(...) — это автономное ядро семантического исправления 015 для одного эпизода. Каждый допустимый запрос создаёт ровно один свежий снимок 008/009 в памяти, сначала изолируя явный канонический эпизод, затем выбирая semantic_summary, semantic_review, completed или заблокированный/ручной; он не вызывает 010 или 014. Dry-run — строго нулевой файл и не разрешает профиль, .env, учётные данные или провайдера. Подтверждённый semantic_summary требует явного действия и проверки точного api_cost_ack до создания профиля/.env/провайдера; подтверждённый semantic_review детерминирован и вообще не читает никаких настроек LLM. Каждый подтверждённый запуск вызывает не более одного исполнителя, записывает подтверждённый отчёт только в формате JSON/Markdown (без generated_at), не пересобирает индекс, план или SQLite-кэш и не добавляет MCP tools; реестр остаётся ровно с 12 инструментами.

run_corpus_episode_completion_workflow(...) — это ядро завершения эпизода 016 для одного эпизода: dry-run со строго нулевым файлом определяет следующее действие от приёма до семантической проверки; после подтверждения человеком выполняет ровно одно соответствующее действие для канонического эпизода и останавливается. Одноимённый инструмент stdio MCP run_corpus_episode_completion_workflow сохраняет эту границу «предпросмотр → одобрение человека → одно действие», не читает .env, не пересобирает кэш автоматически и не даёт инвестиционных рекомендаций.

run_corpus_latest_episode_deterministic_workflow(...) — это ядро 017 для последнего эпизода по одному запросу: dry-run только анализирует текущий последний и возвращает детерминированный план обработки со строго нулевым файлом. SPEC 017 реализован. Проблема сопоставления дочерних результатов seeded/downloaded от 2026-07-17 — это решённый исторический блокер; записанные метаданные подтверждённого эпизода EP679 заканчиваются outcome=ready_for_semantic_summary, ready_count=1, blocked_count=0 и failed_count=0. Контракт фиксирует один канонический эпизод в начале, обрабатывает приём, загрузку, локальное транскрибирование и необходимое детерминированное исправление, завершается сбоем при сбое/блокировке этапа и останавливается на ready_for_semantic_summary без .env, провайдера, семантической сводки/проверки, повторов или пересборки кэша.

run_latest_episode_verified_research_report_workflow(...) — это ядро отчёта исследования последнего эпизода SPEC 018. По умолчанию confirm=False только анализирует последний и возвращает предпросмотр со строго нулевым файлом, не создавая контрольных точек, промежуточных или итоговых пакетов. Подтверждённый запрос должен предоставить точный expected_episode_ref, полученный при предпросмотре, до RSS, окружения/провайдера, записи и дочерних этапов, а также точно такой же api_cost_ack; он повторно использует закреплённую детерминированную лестницу 017 и после точного прохождения passed семантической сводки/проверки создаёт детерминированный JSON, Markdown и манифест с фиксированными безопасными параметрами исследования. Пакет использует версионирование по дайджесту контента, атомарную публикацию каталога, повторное использование идентичного содержимого и конфликт-фейл-закрытие; не пересобирает кэш автоматически, не запрашивает live market API и не является инвестиционной рекомендацией.

run_episode_verified_research_report_workflow(...) — это ядро отчёта исследования для явного эпизода SPEC 019. Требуется явный episode_ref (может быть историческим; latest/next отклоняются); предпросмотр только проверяет локальную готовность и не записывает файлы; подтверждение собирает/публикует пакет с дайджестом, эквивалентным 018, только если происхождение и проверка пройдены; api_cost_ack не требуется, LLM/RSS/загрузка не вызываются, 015–017 не связываются. При отсутствии компонентов возвращается blocked с перечислением отсутствующих/устаревших ролей.

SPEC 020 предоставляет офлайн-каталог-ориентированные слоты list_verified_research_reports(...), search_verified_research_reports(...) и inspect_verified_research_report(...) только для чтения. Они перечисляют, ищут безопасные метаданные из манифеста или проверяют локальную самосогласованность точного пакета; не выполняют поиск по телу, не возвращают необработанные манифесты или абсолютные пути, не экспортируют, не используют БД/FTS/вектор/кэш, не используют сеть/LLM и не заявляют об актуальности/свежести источника. Inspect всегда возвращает source_currentness_status=not_evaluated.

SPEC 022 предоставляет list_verified_research_report_coverage(podcast_id, *, has_bundle=None, limit=50): выполняет эпизодо-центричное соединение покрытия локальной инвентаризации × проверенных пакетов отчётов для точного подкаста, опционально перечисляя только эпизоды без пакета или с пакетом; офлайн / без записи / не читает тело отчёта, не выполняет повторную проверку источника и не заявляет об актуальности.

validate_transcript можно использовать для проверки того, является ли стенограмма полной, пустой, частично завершённой, отсутствующей или повреждённой.

run_corpus_episode_intake — это раннер начальной загрузки эпизодов RSS с приоритетом dry-run: dry-run может анализировать latest или один явный селектор эпизода, но не записывает файлы, не загружает, не транскрибирует и не трогает LLM/MCP/кэш; подтверждённое выполнение записывает только безопасные начальные метаданные и последний детерминированный отчёт о приёме, чтобы 008/009/012 могли обнаруживать, планировать и загружать аудио.

Правила выходных путей

Все артефакты находятся в data/:

  • Аудио: data/audio/{podcast_id}/{episode_ref}__{safe_title_slug}.{ext}

  • Транскрипт: data/transcripts/{podcast_id}/{episode_ref}__{safe_title_slug}.txt

  • Субтитры: data/transcripts/{podcast_id}/{episode_ref}__{safe_title_slug}.srt

  • Метаданные транскрипта: data/transcripts/{podcast_id}/{episode_ref}__{safe_title_slug}.json

  • Сводка: data/summaries/{podcast_id}/{episode_ref}__{safe_title_slug}.md

  • Семантическая сводка: data/summaries/{podcast_id}/{episode_ref}__{safe_title_slug}.semantic.md

  • Mentions JSON: data/mentions/{podcast_id}/{episode_ref}__{safe_title_slug}.mentions.json

  • Mentions Markdown: data/mentions/{podcast_id}/{episode_ref}__{safe_title_slug}.mentions.md

  • Episode intelligence JSON: data/reports/{podcast_id}/{episode_ref}__{safe_title_slug}.intelligence.json

  • Episode intelligence Markdown: data/reports/{podcast_id}/{episode_ref}__{safe_title_slug}.intelligence.md

  • Industry mapping JSON: data/mappings/{podcast_id}/{episode_ref}__{safe_title_slug}.industry-map.json

  • Industry mapping Markdown: data/mappings/{podcast_id}/{episode_ref}__{safe_title_slug}.industry-map.md

  • External data boundary JSON: data/external/{podcast_id}/{episode_ref}__{safe_title_slug}.external-boundary.json

  • External data boundary Markdown: data/external/{podcast_id}/{episode_ref}__{safe_title_slug}.external-boundary.md

  • Stock lens JSON: data/stock-lens/{podcast_id}/{safe_stock_query}.stock-lens.json

  • Stock lens Markdown: data/stock-lens/{podcast_id}/{safe_stock_query}.stock-lens.md

  • Stock lens synthesis JSON: data/stock-lens/{podcast_id}/{safe_stock_query}.stock-lens-synthesis.json

  • Stock lens synthesis Markdown: data/stock-lens/{podcast_id}/{safe_stock_query}.stock-lens-synthesis.md

  • Corpus index JSON: data/corpus/{podcast_id}/corpus-index.json

  • Corpus index Markdown: data/corpus/{podcast_id}/corpus-index.md

  • Corpus episode seed JSON: data/corpus/{podcast_id}/episode-seeds/{episode_ref}.episode-seed.json

  • Corpus episode intake run JSON: data/corpus/{podcast_id}/corpus-episode-intake-run.json

  • Corpus episode intake run Markdown: data/corpus/{podcast_id}/corpus-episode-intake-run.md

  • Corpus remediation plan JSON: data/corpus/{podcast_id}/corpus-remediation-plan.json

  • Corpus remediation plan Markdown: data/corpus/{podcast_id}/corpus-remediation-plan.md

  • Corpus remediation run JSON: data/corpus/{podcast_id}/corpus-remediation-run.json

  • Corpus remediation run Markdown: data/corpus/{podcast_id}/corpus-remediation-run.md

  • Corpus local transcription run JSON: data/corpus/{podcast_id}/corpus-local-transcription-run.json

  • Corpus local transcription run Markdown: data/corpus/{podcast_id}/corpus-local-transcription-run.md

  • Corpus audio download run JSON: data/corpus/{podcast_id}/corpus-audio-download-run.json

  • Corpus audio download run Markdown: data/corpus/{podcast_id}/corpus-audio-download-run.md

  • Corpus episode workflow run JSON: data/corpus/{podcast_id}/corpus-episode-workflow-run.json

  • Corpus episode workflow run Markdown: data/corpus/{podcast_id}/corpus-episode-workflow-run.md

  • Corpus semantic remediation run JSON: data/corpus/{podcast_id}/corpus-semantic-remediation-run.json

  • Corpus semantic remediation run Markdown: data/corpus/{podcast_id}/corpus-semantic-remediation-run.md

  • Corpus episode completion workflow run JSON: data/corpus/{podcast_id}/corpus-episode-completion-workflow-run.json

  • Corpus episode completion workflow run Markdown: data/corpus/{podcast_id}/corpus-episode-completion-workflow-run.md

  • Corpus latest deterministic workflow run JSON: data/corpus/{podcast_id}/corpus-latest-episode-deterministic-workflow-run.json

  • Corpus latest deterministic workflow run Markdown: data/corpus/{podcast_id}/corpus-latest-episode-deterministic-workflow-run.md

  • Verified research checkpoint: data/corpus/{podcast_id}/verified-research/{episode_ref}.checkpoint.json

  • Verified research report bundle: data/research-reports/{podcast_id}/{episode_ref}/v1-{source_digest}/report.json, report.md, manifest.json

  • SQLite metadata cache: data/cache/podcast_ingest.sqlite3

  • Episode cache: data/cache/{podcast_id}/episodes.json

podcast_id должен быть slug в нижнем регистре. Episode ref разрешается из RSS title и default_episode_prefix профиля подкаста, например EP672. Title slug в имени файла удаляет недопустимые в Windows символы, управляющие символы, эмодзи и символы высокого риска.

Примеры CLI

Создание corpus status index уровня подкаста:

python scripts/generate_corpus_index.py --podcast gooaye

Этот CLI читает только локальные per-episode артефакты и перезаписывает data/corpus/{podcast_id}/corpus-index.json и .md. stdout — это metadata-only JSON, содержащий пути вывода, количество эпизодов, количество предупреждений и количество по семействам артефактов; он не содержит исходного текста транскрипта, фрагментов evidence, тела семантической сводки, промптов, raw LLM output, API-ключей или секретов провайдера.

Создание corpus remediation plan уровня подкаста:

python scripts/generate_corpus_remediation_plan.py --podcast gooaye

Этот CLI сначала обновляет corpus index, затем перезаписывает data/corpus/{podcast_id}/corpus-remediation-plan.json и .md. stdout — это metadata-only JSON, содержащий пути вывода, количество эпизодов, количество предупреждений, количество действий, а также количество заблокированных/необязательных/условных действий; он не выполняет никаких remediation-действий, не читает RSS/SQLite cache/.env, не вызывает network/LLM/MCP и не выводит transcript/evidence/semantic body/prompt/raw LLM output или секреты.

Предпросмотр или подтверждённое выполнение загрузки аудио одного эпизода:

python scripts/run_corpus_audio_download.py --podcast gooaye
python scripts/run_corpus_audio_download.py --podcast gooaye --episode EP672 --confirm

Этот CLI сначала обновляет corpus remediation plan; поэтому отдельный dry-run всё равно сохраняет свежие corpus index и remediation plan. По умолчанию dry-run возвращает в stdout только metadata-only JSON, не читает RSS, не вызывает network/downloader, не пишет corpus-audio-download-run.json/.md и не пишет аудио. --confirm должен использоваться ровно с одним --episode и вызывает существующую download_audio() только если audio status равен missing, а audio action — ready. Подтверждённый запуск записывает последние data/corpus/{podcast_id}/corpus-audio-download-run.json и .md; содержимое не содержит timestamp, source URL/query string, секретов и traceback и не является инвестиционной рекомендацией; после записи или повторного использования аудио он лишь сообщает, что транскрибация, нижестоящие remediation и пересборка кэша должны быть выполнены вручную.

Предпросмотр или подтверждённое выполнение детерминированного исправления корпуса:

python scripts/run_corpus_remediation.py --podcast gooaye
python scripts/run_corpus_remediation.py --podcast gooaye --action-family mentions --confirm
python scripts/run_corpus_remediation.py --podcast gooaye --episode EP672 --confirm

Этот CLI сначала обновляет corpus remediation plan; поэтому отдельный dry-run всё равно сохраняет свежие corpus index и remediation plan. По умолчанию dry-run возвращает в stdout только metadata-only JSON, не пишет corpus-remediation-run.json/.md и не запускает генераторы артефактов. --confirm должен использоваться с --episode или --action-family; он вызывает только существующие детерминированные основные функции и не выполняет shell-вызовы скриптов; v1 не выполняет download, transcribe, semantic summary/review, stock-lens, LLM, RSS/network, пересборку SQLite cache, .env или MCP. Подтверждённый запуск записывает последние data/corpus/{podcast_id}/corpus-remediation-run.json и .md; содержимое не содержит timestamp, raw transcript/evidence/semantic body/prompt/raw LLM output/secret и не является инвестиционной рекомендацией.

Предпросмотр или подтверждённое выполнение локальной транскрибации одного эпизода:

python scripts/run_corpus_local_transcription.py --podcast gooaye
python scripts/run_corpus_local_transcription.py --podcast gooaye --episode EP672 --confirm
python scripts/run_corpus_local_transcription.py --podcast gooaye --episode EP672 --confirm --model small --device cuda --compute-type float16

Этот CLI сначала обновляет corpus remediation plan; поэтому отдельный dry-run всё равно сохраняет свежие corpus index и remediation plan. По умолчанию dry-run возвращает в stdout только metadata-only JSON, не пишет corpus-local-transcription-run.json/.md, не пишет транскрипт, не загружает модель Whisper и не скачивает аудиофайл. --confirm должен использоваться ровно с одним --episode и вызывает существующую transcribe_episode() только если локальный путь к аудио существует, а статус транскрипта — missing, при этом явно передаются audio_path и force=False. Подтверждённый запуск записывает последние data/corpus/{podcast_id}/corpus-local-transcription-run.json и .md; содержимое не содержит timestamp, raw transcript/prompt/raw LLM output/secret/traceback и не является инвестиционной рекомендацией; после записи транскрипта он лишь предупреждает, что кэш может быть устаревшим, и не пересобирает кэш автоматически.

Предпросмотр или подтверждённое выполнение следующего безопасного этапа свежего workflow эпизода:

python scripts/run_corpus_episode_workflow.py --podcast gooaye --episode latest
python scripts/run_corpus_episode_workflow.py --podcast gooaye --episode latest --stage next --confirm
python scripts/run_corpus_episode_workflow.py --podcast gooaye --episode EP677 --stage next --confirm --model small --device cuda --compute-type float16

Dry-run 014 в этом CLI — strict zero-file: 013 может читать настроенный RSS-селектор разбора; при наличии seed он лишь один раз создаёт свежий in-memory snapshot corpus index/plan и использует этот же snapshot для preview 012/011/010. Он не создаёт, не изменяет и не удаляет seed, audio, transcript, index, plan, отчёты 010-014, downstream-артефакты или .part; planned reads могут включать безопасные локальные пути зависимостей, а для не-путевых значений допускаются только две точные метки. Подтверждённое выполнение должно явно использовать --stage next --confirm и каждый раз диспатчит только один существующий public runner; этот runner может согласно своему контракту обновить index/plan и записать артефакты выбранного этапа, а 014 после записи результата останавливается и пишет последний workflow report. Задачи semantic/LLM/stock-lens/MCP/cache rebuild/batch по-прежнему перечислены только как ручные follow-up и автоматически не выполняются.

Предпросмотр или подтверждённое выполнение семантического исправления одного эпизода:

python scripts/run_corpus_semantic_remediation.py --podcast gooaye --episode EP700
python scripts/run_corpus_semantic_remediation.py --podcast gooaye --episode EP700 --action semantic_summary --confirm --api-cost-ack "I understand this may call an external LLM API, send transcript text outside this machine, and incur costs."
python scripts/run_corpus_semantic_remediation.py --podcast gooaye --episode EP700 --action semantic_review --confirm

015 не принимает latest; dry-run action=next возвращает только метаданные и является strict zero-file. Для подтверждённой сводки точный api_cost_ack должен быть указан до создания profile, .env, credential и provider; для review подтверждение не требуется, и он не резолвит profile/.env и не вызывает LLM. Валидированная подтверждённая попытка записывает corpus-semantic-remediation-run.json/.md; содержимое не содержит generated_at, transcript/semantic/prompt/raw response/base URL/secret/traceback; index, plan и cache могут быть устаревшими, их нужно обновить вручную.

Предпросмотр или выполнение completion workflow одного эпизода после явного подтверждения пользователя:

python scripts/run_corpus_episode_completion_workflow.py --podcast gooaye
python scripts/run_corpus_episode_completion_workflow.py --podcast gooaye --episode EP677 --action audio_download --confirm
python scripts/run_corpus_episode_completion_workflow.py --podcast gooaye --episode EP677 --action semantic_summary --confirm --api-cost-ack "I understand this may call an external LLM API, send transcript text outside this machine, and incur costs."

Dry-run 016 — strict zero-file: при наличии seed он создаёт в памяти только один свежий snapshot 008/009 и последовательно выбирает следующее безопасное действие среди intake, audio download, local transcription, deterministic remediation, semantic summary или semantic review. Подтверждённый запуск должен использовать canonical episode, возвращённый dry-run, и то же самое explicit action; next, latest или устаревшие действия отклоняются, и после каждого запуска диспатчится не более одного существующего runner, затем выполнение останавливается. Точный ack для semantic summary должен быть завершён до любой работы с profile/.env/provider; semantic review не читает настройки LLM. Только валидированная подтверждённая попытка атомарно записывает data/corpus/{podcast_id}/corpus-episode-completion-workflow-run.json и .md; index, plan или SQLite cache автоматически не обновляются.

Если это делает Agent, используйте одноимённый MCP tool run_corpus_episode_completion_workflow и портативный Skill corpus-episode-completion из репозитория: сначала preview, объясните риски, дождитесь явного согласия человека на canonical action, затем выполните одно действие и остановитесь; при отсутствии MCP нельзя переключаться на CLI, terminal, scheduler или автоматические повторы.

Предпросмотр или контролируемое подтверждённое выполнение latest deterministic workflow:

python scripts/run_corpus_latest_episode_deterministic_workflow.py --podcast gooaye
python scripts/run_corpus_latest_episode_deterministic_workflow.py --podcast gooaye --confirm

SPEC 017 реализован. Если Agent получает явный запрос вроде «помоги мне обработать последний эпизод Gooaye», Skill corpus-latest-episode-processing рассматривает этот явный запрос на естественном языке как одну авторизацию выполнения: подтвердите один раз, вызовите dedicated MCP tool run_corpus_latest_episode_deterministic_workflow ровно один раз с confirm=true, однократно сообщите metadata-only result и остановитесь. Сам MCP tool по-прежнему по умолчанию работает в режиме dry-run с confirm=false; Skill не должен сначала делать preview, не должен делать повторный вызов, а также не должен использовать CLI/terminal fallback, планировщик, пакетный режим, повторы, cache rebuild или semantic summary/review.

Предпросмотр workflow последнего verified research report:

python scripts/run_latest_episode_verified_research_report_workflow.py --podcast gooaye

Preview в SPEC 018 — strict zero-write и возвращает canonical episode reference и точное требуемое подтверждение. Только после явного согласия пользователя на этот previewed episode выполняется один --confirm с тем же --expected-episode-ref и точным --api-cost-ack. Подтверждение должно произойти до работы с RSS, environment/provider, writer или child stage; workflow переиспользует закреплённую детерминированную лестницу, требует exact passed от semantic review, а затем завершает детерминированное исследование с фиксированными безопасными опциями. По завершении атомарно публикуются report.json, report.md и manifest.json с версией source digest; повторное использование идентичного бандла, при конфликте — fail-closed; никаких retry, scheduler, live market API или cache rebuild, и это не является инвестиционной рекомендацией.

Запрос к offline read-only каталогу verified research report (SPEC 020):

python scripts/query_verified_research_report_catalog.py list --podcast-id gooaye --limit 50
python scripts/query_verified_research_report_catalog.py search "EP672" --podcast-id gooaye
python scripts/query_verified_research_report_catalog.py inspect gooaye EP672 <lowercase-64-hex-source-digest>

Эти три subcommand читают только канонические локальные manifest-first бандлы из data/research-reports: list поддерживает точные фильтры, search ищет только по безопасным метаданным, inspect проверяет только локальную самосогласованность одного точного бандла. Они не ищут по телу report/transcript, не возвращают raw manifest/absolute paths, не предоставляют export и не используют DB/FTS/vector/cache, RSS/HTTP/network, LLM, .env, download, transcription или remediation; не принимают latest selector и не делают заявлений о latest/currentness источника. inspect всегда возвращает source_currentness_status=not_evaluated. Краткая граница: нет raw manifest; нет DB/FTS/vector/cache; нет RSS/HTTP/LLM/.env/download/transcription/remediation; нет latest selector.

Запрос покрытия verified research report по эпизодам (SPEC 022):

python scripts/query_verified_research_report_coverage.py gooaye
python scripts/query_verified_research_report_coverage.py gooaye --has-bundle false --limit 20

Выполняется join локального inventory и canonical bundles: находятся эпизоды, у которых отсутствует report, или эпизоды, у которых уже есть digest. offline / zero-write / не читает тело report; не перезапускает 021 revalidation и не заявляет source currentness.

Список последних эпизодов:

python scripts/list_episodes.py --podcast gooaye --limit 10
python scripts/list_episodes.py --podcast gooaye --episode latest

Скачать аудиофайл:

python scripts/download_episode.py --podcast gooaye --episode latest

Для транскрибации на CPU рекомендуется сначала проверить процесс на моделях tiny или base:

python scripts/transcribe_episode.py --podcast gooaye --episode latest --model tiny --device cpu --compute-type int8

Полный длинный эпизод на CPU может занять очень много времени. Если нужно лишь убедиться, что faster-whisper, ffmpeg/PyAV и процесс вывода работают, можно использовать короткий аудиофайл для smoke test:

python scripts/transcribe_episode.py --audio-path path\to\sample.mp3 --podcast gooaye --episode smoke-test --model tiny --device cpu --compute-type int8 --force

Если есть NVIDIA GPU, при поддержке CUDA окружением можно попробовать:

python scripts/transcribe_episode.py --podcast gooaye --episode latest --model small --device cuda --compute-type float16

Рекомендуемый процесс для длинных аудиофайлов:

python scripts/transcribe_episode.py --podcast gooaye --episode latest --model tiny --device cpu --compute-type int8
python scripts/validate_transcript.py --podcast gooaye --episode latest
python scripts/summarize_episode.py --podcast gooaye --episode latest --force

На CPU обработка 50-минутного аудио может быть медленной. tiny / base подходят для первичной проверки процесса, small / medium можно использовать для повышения качества. При наличии NVIDIA GPU можно попробовать --device cuda --compute-type float16. Если после timeout остаётся высоконагружающий CPU процесс Python, сначала остановите этот процесс вручную, затем запустите заново.

Создать детерминированную Markdown-сводку:

python scripts/summarize_episode.py --podcast gooaye --episode smoke-test --mode extractive --force
python scripts/summarize_episode.py --podcast gooaye --episode EP672 --mode extractive --max-quotes 5 --window-seconds 300

Сводка читает только существующий transcript и не скачивает и не транскрибирует автоматически. Если для указанного эпизода ещё нет transcript, CLI сообщит transcript missing. Если transcript является partial, сводка по умолчанию отклонит его; чтобы всё же создать сводку, можно добавить --allow-partial.

Для создания LLM semantic summary требуются API key и model. Для ручного тестирования рекомендуется использовать локальный .env; этот файл игнорируется .gitignore и не может быть закоммичен:

API_KEY=your-api-key
MODEL=your-model
BASE_URL=https://api.openai.com/v1
python scripts/summarize_episode.py --podcast gooaye --episode EP672 --mode semantic --force --api-cost-ack "I understand this may call an external LLM API, send transcript text outside this machine, and incur costs."

Можно также переопределить настройки напрямую через CLI:

python scripts/summarize_episode.py --podcast gooaye --episode EP672 --mode semantic --model your-model --base-url https://api.openai.com/v1 --api-cost-ack "I understand this may call an external LLM API, send transcript text outside this machine, and incur costs."

Режим semantic сначала выполняет проверку транскрипта (transcript validation) и отправляет транскрипт провайдеру порциями по умолчанию 600 секунд и 120 сегментов на chunk. CLI, работающий с LLM, по умолчанию загружает .env; можно указать другой файл с помощью --env-file path\to\.env или отключить загрузку с помощью --no-env-file. Если переменная с одинаковым именем есть и в .env, и в сессии PowerShell, приоритет имеет сессия PowerShell. MODEL / BASE_URL — рекомендуемые имена; если они не заданы, для совместимости будут читаться старые OPENAI_MODEL / OPENAI_BASE_URL. Если отсутствует API key или model, CLI чётко сообщит об ошибке конфигурации; режиму extractive API key не требуется. Семантическое резюме не является инвестиционной рекомендацией; все важные рыночные мнения, компании, лица и события должны по возможности опираться на timestamp evidence.

Phase 6U добавляет smoke-валидацию семантического резюме. Этот путь при confirmed execution отправляет текст транскрипта за пределы этой машины; dry-run только перечисляет planned reads/writes, риск передачи транскрипта, ценовой риск и required acknowledgement, не вызывает LLM, не записывает артефакты и не выводит содержимое транскрипта. Confirmed semantic summary smoke, а также прямой CLI-вызов --mode semantic должны предоставлять точный api_cost_ack. stdout CLI остаётся без вывода raw transcript и без отображения секретных значений; на этом этапе — no MCP tool changes, no live market API, no automatic cache rebuild, no investment advice.

Phase 6U.1 исправляет ложное срабатывание semantic review guard: semantic summary review допускает описания, производные от транскрипта, такие как прошлые покупки/удержание спикером в содержании подкаста, но по-прежнему отклоняет прямые buy/sell/hold, рекомендации покупать, целевые цены и гарантированную доходность. Confirmed semantic smoke также добавляет прогресс в stderr; stdout остаётся JSON, и прогресс не выводит raw transcript, prompt, API key или ответ LLM. Phase 6V добавляет опциональный проверенный семантический контекст (reviewed semantic context) для синтеза stock lens. Синтез по умолчанию остаётся phase-6f-stock-lens-json-only и не читает .semantic.md. При явном включении с помощью --include-semantic-context синтез может включать только совпавшие семантические резюме эпизодов с последним пройденным отчётом проверки; граница входных данных становится phase-6f-stock-lens-json-plus-reviewed-semantic-summary. Контекст исключает ## Chunk Summaries, не читает raw-текст транскрипта, не читает .env, не получает данные живого рынка и не вносит изменений в MCP tools. Проверенный контекст семантического резюме — это промежуточный артефакт LLM, а не raw-доказательство из подкаста и не внешний рыночный факт. Phase 6V.1 приводит детерминированный шлюз проверки в соответствие с согласованностью границ/контекста: синтез только из JSON не должен иметь семантического контекста, а проверенный семантический синтез должен включать непустой семантический контекст, прошедший проверку.

python scripts/run_research_llm_smoke.py --podcast gooaye --episode EP672 --stock 台積電 --llm-profile pro4500 --confirm --force --include-semantic-context --api-cost-ack "I understand this may call an external LLM API, send transcript text outside this machine, and incur costs."

Профиль LLM provider можно разместить в config/llm_profiles.yaml; он хранит только provider, model, base URL и имя переменной окружения для API key, но не значение API key. Рабочий профиль pro4500 использует api_key_env=API_KEY, поэтому его можно использовать вместе с API_KEY=... из .env. Зафиксированный профиль gb10 помечен как unavailable; при загрузке произойдёт ошибка с подсказкой использовать pro4500. Не записывайте API key, token или secret в YAML.

Извлечение детерминированных mentions:

python scripts/extract_mentions.py --podcast gooaye --episode EP672 --force
python scripts/extract_mentions.py --podcast gooaye --episode EP672 --max-evidence-per-mention 3

Mention extraction не использует LLM и не означает полного семантического понимания; он лишь сканирует сегменты транскрипта по детерминированным правилам на предмет mentions компаний, ticker, отраслей, макроэкономических тем, crypto и мест. Каждый mention сопровождается timestamp evidence и не является инвестиционной рекомендацией. Кэш Phase 3 может импортировать mentions в SQLite и предоставлять базовые межэпизодные запросы; в будущем MCP tools смогут напрямую оборачивать эти core functions.

Создание детерминированного отчёта об эпизоде (episode intelligence report):

python scripts/generate_episode_intelligence_report.py --podcast gooaye --episode EP672 --force
python scripts/generate_episode_intelligence_report.py --podcast gooaye --episode EP672 --window-seconds 600 --max-evidence-per-section 3

Episode intelligence report читает только существующие артефакты transcript и mentions; он не загружает, не транскрибирует, не резюмирует, не извлекает mentions, не вызывает LLM и не запрашивает внешние рыночные данные. Если артефакт mentions отсутствует, отчёт всё равно может быть создан, но будет помечен source warning, а разделы, производные от mentions, останутся пустыми. Partial transcript по умолчанию отклоняется; чтобы всё же создать черновик, можно добавить --allow-partial.

Создание детерминированного сопоставления отраслевых цепочек / кандидатов в акции:

python scripts/generate_industry_chain_mapping.py --podcast gooaye --episode EP672 --force
python scripts/generate_industry_chain_mapping.py --podcast gooaye --episode EP672 --max-candidates-per-node 3 --max-evidence-per-candidate 2

Industry mapping читает только существующий episode intelligence report и config/industry_chain_mappings.yaml; он не вызывает LLM и не запрашивает внешние рыночные данные. podcast_explicit означает, что это явно упомянуто в podcast evidence; inferred_from_industry представляет лишь непроверенную исследовательскую зацепку, выведенную из локального mapping config, по умолчанию needs_verification, и не означает, что 股癌 явно упомянул это, а также не является инвестиционной рекомендацией.

Создание каркаса границы внешних рыночных данных:

python scripts/generate_external_data_boundary.py --podcast gooaye --episode EP672 --force
python scripts/generate_external_data_boundary.py --podcast gooaye --episode EP672 --allow-partial

External data boundary читает только существующий industry mapping и config/external_data_boundary.yaml; он не вызывает внешних провайдеров рыночных данных, не читает API key и не формирует факты о ценах, рыночной капитализации, финансовой отчётности, новостях или текущем состоянии компаний. Каждый candidate помечается external_verification_status=not_requested, source_status=not_fetched и data_date=null, а также перечисляются типы внешних данных, которые потребуется проверить в дальнейшем.

Проверка external boundary с помощью локального fixture provider:

python scripts/verify_external_data_boundary.py --podcast gooaye --episode EP672
python scripts/verify_external_data_boundary.py --podcast gooaye --episode EP672 --confirm --force
python scripts/verify_external_data_boundary.py --podcast gooaye --episode EP672 --confirm --fixture-path config/external_market_data_fixtures.yaml

Phase 6M предоставляет только каркас fixture provider. По умолчанию dry-run не записывает артефакты; --confirm — это confirm guard, после подтверждения читается только локальный config/external_market_data_fixtures.yaml или указанный путь к fixture, выполняется точное сопоставление по company_name / ticker и обновляются существующие .external-boundary.json/.md. На этом этапе — no live market API, не читается API key, не добавляются MCP tools, не подключается research workflow, и не предоставляются никакие рыночные рекомендации, кроме no investment advice.

Проверка модели Gooaye Lens:

python scripts/inspect_gooaye_lens.py
python scripts/inspect_gooaye_lens.py --path config/gooaye_lens.yaml

Модель Gooaye Lens — источник детерминированной аналитической структуры для stock lens report Phase 6F; она определяет такие измерения, как положение в отраслевой цепочке, спрос/предложение и запасы, экономический цикл, чувствительность к процентным ставкам и оценке, капитальные расходы и мощности, геополитика и неопределённость. Phase 6E только загружает и проверяет локальный config; он не принимает ввод акций, не записывает артефакты, не вызывает LLM, не запрашивает внешние рыночные данные и не формирует рекомендации по покупке/продаже, целевые цены или гарантированную доходность.

Создание детерминированного stock lens report по всему подкасту:

python scripts/generate_stock_lens_report.py --podcast gooaye --stock 台積電 --force
python scripts/generate_stock_lens_report.py --podcast gooaye --stock NVDA --max-evidence-items 5

Stock lens report сканирует существующие артефакты data/mappings/ и data/external/ этого подкаста и консервативно сопоставляет company_name и tickers кандидатов. podcast_explicit указывается как direct podcast evidence; inferred_from_industry указывается только как needs-verification research lead и не означает, что подкаст явно упомянул это. Если direct podcast evidence отсутствует, отчёт всё равно создаётся и явно помечается no-direct-podcast-evidence. На этом этапе не вызывается LLM, не запрашиваются внешние рыночные данные, не читается API key, не добавляются MCP tools и не предоставляются рекомендации по покупке/продаже, целевые цены или гарантированная доходность.

Создание Phase 6J Stock Lens LLM Synthesis:

python scripts/generate_stock_lens_synthesis_report.py --podcast gooaye --stock 台積電
python scripts/generate_stock_lens_synthesis_report.py --podcast gooaye --stock 台積電 --confirm --api-cost-ack "I understand this may call an external LLM API, send transcript text outside this machine, and incur costs." --model your-model
python scripts/generate_stock_lens_synthesis_report.py --podcast gooaye --stock 台積電 --llm-profile pro4500 --confirm --api-cost-ack "I understand this may call an external LLM API, send transcript text outside this machine, and incur costs."

Stock lens synthesis по умолчанию работает в режиме dry-run, перечисляя только planned reads/writes, LLM API/cost risk и required acknowledgement; он не читает API key, не вызывает LLM и не записывает артефакты. Confirmed execution передаёт LLM только compact evidence, lens dimensions, external boundary status и warnings из 6F stock lens JSON only; no raw transcript, no .semantic.md input, no external market data lookup, no MCP tool changes, и не подключается run_research_workflow. Если вывод LLM содержит формулировки инвестиционных рекомендаций, такие как buy/sell/hold, target price или guaranteed return, запись в synthesis artifact будет отклонена.

Выполнение Phase 6O LLM research smoke:

python scripts/run_research_llm_smoke.py --podcast gooaye --episode EP672 --stock 台積電 --model your-model
python scripts/run_research_llm_smoke.py --podcast gooaye --episode EP672 --stock 台積電 --confirm --api-cost-ack "I understand this may call an external LLM API, send transcript text outside this machine, and incur costs." --model your-model --force
python scripts/run_research_llm_smoke.py --podcast gooaye --episode EP672 --stock 台積電 --llm-profile pro4500 --confirm --api-cost-ack "I understand this may call an external LLM API, send transcript text outside this machine, and incur costs." --force --debug-llm-output
python scripts/run_research_llm_smoke.py --podcast gooaye --episode EP672 --stock 台積電 --confirm --include-semantic-summary --api-cost-ack "I understand this may call an external LLM API, send transcript text outside this machine, and incur costs." --model your-model --force

Phase 6O — это OpenAI-compatible smoke + Codex manual review harness. Реальные вызовы LLM по-прежнему идут через OpenAI-compatible /chat/completions; в настоящее время нет прямого backend для Codex-сессии, и Codex выступает только как manual reviewer, проверяющий артефакты, границы prompt и качество. Smoke по умолчанию запускает stock lens synthesis с включённой fixture external verification; semantic summary требует явного добавления --include-semantic-summary, поскольку он передаёт текст транскрипта. На этом этапе — no live market data, не добавляются MCP tools, не изменяется investment-advice boundary, и сохраняется no investment advice. Phase 6Q добавляет конфигурацию LLM profile; для ручного тестирования можно использовать --llm-profile pro4500 для чтения config/llm_profiles.yaml. Явно переданные в CLI --model, --base-url, --api-key-env переопределяют profile; YAML не должен содержать значения API key, token или secret. Phase 6R добавляет локальный загрузчик .env; CLI, работающий с LLM, по умолчанию читает API_KEY, MODEL, BASE_URL из .env и отображает в JSON metadata только имена загруженных env var, но не их значения. Для диагностики ответа провайдера можно добавить --debug-llm-output; raw LLM output записывается только в evals/research-llm-smoke/raw/, который игнорируется .gitignore, и не становится официальным артефактом. Phase 6T добавляет детерминированный review report / quality gate. После confirmed smoke можно сгенерировать review report с меткой времени следующей командой; он читает только существующие артефакты — no LLM call, no .env read, no external market data — и не перезаписывает synthesis artifacts:

python scripts/review_research_llm_smoke.py --podcast gooaye --episode EP672 --stock 台積電

Документация LLM smoke и шаблон review:

python scripts/run_semantic_summary_smoke.py --podcast gooaye --episode EP672 --llm-profile pro4500
python scripts/run_semantic_summary_smoke.py --podcast gooaye --episode EP672 --llm-profile pro4500 --confirm --force --api-cost-ack "I understand this may call an external LLM API, send transcript text outside this machine, and incur costs."
python scripts/review_semantic_summary_smoke.py --podcast gooaye --episode EP672

Dry-run или выполнение локального детерминированного research workflow:

python scripts/run_research_workflow.py --podcast gooaye --episode EP672
python scripts/run_research_workflow.py --podcast gooaye --episode EP672 --confirm
python scripts/run_research_workflow.py --podcast gooaye --episode EP672 --confirm --stock 台積電
python scripts/run_research_workflow.py --podcast gooaye --episode EP672 --include-semantic-summary
python scripts/run_research_workflow.py --podcast gooaye --episode EP672 --confirm --include-semantic-summary --api-cost-ack "I understand this may call an external LLM API, send transcript text outside this machine, and incur costs." --semantic-model your-model
python scripts/run_research_workflow.py --podcast gooaye --episode EP672 --include-external-data-verification
python scripts/run_research_workflow.py --podcast gooaye --episode EP672 --confirm --include-external-data-verification --external-fixture-path config/external_market_data_fixtures.yaml
python scripts/run_research_workflow.py --podcast gooaye --episode EP672 --stock 台積電 --include-stock-lens-synthesis
python scripts/run_research_workflow.py --podcast gooaye --episode EP672 --confirm --stock 台積電 --include-stock-lens-synthesis --api-cost-ack "I understand this may call an external LLM API, send transcript text outside this machine, and incur costs." --synthesis-model your-model

Research workflow сначала выполняет dry-run, перечисляя planned reads/writes, порядок шагов, риск внешнего API для semantic LLM, риск устаревшего кэша и статус подтверждения. По умолчанию выполняются только локальные детерминированные шаги: extract_mentions, generate_episode_intelligence_report, generate_industry_chain_mapping, generate_external_data_boundary, а при указании --stock создаётся stock lens report. Phase 6I позволяет opt in с помощью --include-semantic-summary; Phase 6K позволяет opt in с помощью --include-stock-lens-synthesis, размещая stock lens synthesis после stock lens report. Phase 6N позволяет opt in с помощью --include-external-data-verification, размещая fixture verification после external boundary и перед stock lens report; этот шаг поддерживает только --external-data-provider fixture, читает только локальные fixture, не запрашивает live market API и не читает API key. Dry-run перечисляет только план semantic / synthesis / fixture и required acknowledgement; в confirmed execution только LLM-шаги должны предоставлять точный --api-cost-ack. Stock lens synthesis требует --stock и по умолчанию использует только 6F stock lens JSON; Phase 6V позволяет opt in reviewed semantic context с помощью --include-semantic-context / --include-semantic-context-in-synthesis, по-прежнему не читая raw transcript и не запрашивая внешние рыночные данные. Этот workflow не выполняет автоматический rebuild cache, не добавляет MCP tools и не предоставляет инвестиционных рекомендаций.

Пересоздание SQLite metadata cache и поиск:

python scripts/rebuild_cache.py --podcast gooaye --force
python scripts/search_transcripts.py --podcast gooaye --query 台積電 --limit 10 --search-mode auto
python scripts/search_transcripts.py --podcast gooaye --query 台積電 --limit 10 --search-mode like --context-segments 1
python scripts/search_mentions.py --podcast gooaye --query 台積電
python scripts/search_mentions.py --podcast gooaye --query 台積電 --type company

SQLite cache — это производные данные, которые можно удалить и пересоздать. Первоначальный source of truth по-прежнему находится в data/transcripts/, data/summaries/ и data/mentions/. Phase 3B поддерживает опциональный SQLite FTS5; если локальный SQLite не поддерживает FTS5 или query является точной подстрокой на китайском, search_transcripts() использует LIKE fallback. Результаты поиска содержат highlighted_text, фактический search_mode, а с помощью --context-segments можно получить контекст вокруг найденных фрагментов. На этом этапе по-прежнему не выполняются embedding, vector search или LLM search.

Запуск локального MCP server:

python scripts/rebuild_cache.py --podcast gooaye --force
python scripts/search_transcripts.py --podcast gooaye --query 台積電 --limit 5 --search-mode auto
python scripts/run_mcp_server.py

MCP server использует единый FastMCP instance из официального Python MCP SDK. Локальные Codex / Claude client продолжают использовать stdio; одобренный Spec 026 Hermes sidecar предоставляет через тот же registry Streamable HTTP, привязанный только к 127.0.0.1:8767/mcp, без legacy SSE и без публикации порта. Read/query tools:

  • list_episodes

  • get_episode

  • validate_transcript

  • search_transcripts

  • search_mentions

  • rebuild_cache

  • query_verified_research_report_catalog(Tool 17; автономный read-only list/search/inspect на основе манифеста)

  • revalidate_verified_research_report_sources(Tool 18; автономная повторная проверка источников по точному локатору)

  • query_verified_research_report_coverage(Tool 19; автономное объединение покрытия с фокусом на эпизод)

  • suggest_historical_verified_report_next_step(Tool 20; предложение следующего шага по историческим данным)

  • list_verified_report_gap_backlog(Tool 21; инвентаризация бэклога пробелов)

  • generate_stock_lens_report(Tool 22; детерминированный stock lens report, side-effect, dry-run-first)

  • ingest_x_video(Tool 23; ingest видео из X, preview без записи, но с чтением публичных metadata)

  • ingest_youtube_video(Tool 24; ingest видео из YouTube, preview без записи, но с чтением публичных metadata)

Side-effect tools:

  • download_audio

  • transcribe_episode

  • summarize_episode_extractive

  • extract_mentions

  • semantic_summarize_episode

  • run_research_workflow

  • run_corpus_episode_completion_workflow

  • run_corpus_latest_episode_deterministic_workflow

  • run_latest_episode_verified_research_report_workflow

  • run_episode_verified_research_report_workflow

  • generate_stock_lens_report

  • ingest_x_video

  • ingest_youtube_video

Локальный reviewed stdio registry содержит 24 tools. Tool 24 ingest_youtube_video — append-only; contracts/order Tools 1–23 не меняются. Tool 23 ingest_x_video по-прежнему является X ingest. Preview — zero-write, но читает публичные metadata; это не zero-network dry-run от corpus runner. Tool 22 generate_stock_lens_report по-прежнему является append-only dry-run-first stock lens. Это side-effect, dry-run-first детерминированный stock lens report, который читает только локальные mapping/boundary artifacts; без live market API, без сети, без LLM и без инвестиционных рекомендаций. Tool 21 list_verified_report_gap_backlog — append-only; contracts/order Tools 1–20 не меняются. Это read-query для inventory gap backlog. Tool 20 по-прежнему является historical next-step suggestion. Tool 19 по-прежнему является episode-centric coverage. Tool 18 по-прежнему является exact-locator offline source revalidation. Tool 17 сохраняет контракт catalog list/search/inspect. Указанные выше side-effect tools по умолчанию имеют confirm=false и возвращают только dry-run action plan; они не загружают, не транскрибируют и не записывают файлы; confirm=true используется только после подтверждения action plan. run_corpus_episode_completion_workflow сохраняет preview → human approval → one explicit action; run_corpus_latest_episode_deterministic_workflow обрабатывает только локальные детерминированные этапы latest episode и останавливается перед semantic summary. run_latest_episode_verified_research_report_workflow сначала требует preview, затем пользователь предоставляет тот же канонический expected_episode_ref и точный api_cost_ack, после чего выполняется только один confirmed вызов. run_episode_verified_research_report_workflow выполняет readiness preview с явным episode_ref (может быть историческим эпизодом); после подтверждения он только собирает/публикует эквивалентный digest bundle, без api_cost_ack и без вызова LLM. После завершения всех side-effect tools SQLite cache не пересоздаётся автоматически, и инвестиционные рекомендации не предоставляются. Например:

Call transcribe_episode with confirm=false first to review the action plan.
Call transcribe_episode again with confirm=true only if you accept the runtime and resource cost.

MCP responses используют JSON envelope: при успехе — {"ok": true, "data": ...}, при ошибке — {"ok": false, "error_type": "...", "message": "..."}. Dry-run action plan возвращает {"ok": true, "dry_run": true, "requires_confirmation": true, ...}. После завершения side-effect tools cache не пересоздаётся автоматически; чтобы обновить search metadata, вручную вызовите rebuild_cache. MCP search, mentions и summaries не являются инвестиционными рекомендациями.

semantic_summarize_episode — более строгий API-cost tool. Он передаёт текст транскрипта внешнему LLM provider, что может привести к расходам на API, поэтому помимо confirm=true необходимо предоставить точное acknowledgement:

I understand this may call an external LLM API, send transcript text outside this machine, and incur costs.

При первом вызове используйте confirm=false и проверьте dry-run action plan, preview проверки транскрипта, настройки chunk и риски. Только если вы принимаете риски внешнего API, передачи данных и расходов, выполняйте с confirm=true и точным api_cost_ack. MCP response не возвращает API key и не возвращает исходный текст транскрипта в dry-run. После успеха cache не пересоздаётся автоматически; чтобы SQLite cache узнал о новом артефакте .semantic.md, вручную выполните rebuild_cache.

Phase 6L добавляет MCP exposure для run_research_workflow. Этот consolidated workflow tool работает по принципу dry-run first: при confirm=false он только перечисляет planned reads/writes, порядок шагов (step order), external API / cost risk, предупреждение об устаревшем кэше (cache stale warning) и required acknowledgement, не записывает artifacts, не вызывает LLM, не возвращает raw transcript и не читает значение API key. При confirm=true вызывается существующий core workflow; если включены semantic summary или stock lens synthesis, всё равно необходимо предоставить exact ack / api_cost_ack. Workflow MCP tool не запрашивает external market data, не выполняет automatic cache rebuild и не добавляет рекомендаций по покупке/продаже, целевых цен или гарантий доходности.

Интеграция MCP-клиента

Локальные клиенты типа Codex / Claude используют существующий stdio transport:

python scripts/run_mcp_server.py

Hermes/OpenAB используют отдельный sidecar и тот же exact 21-tool registry:

wsl.exe -d UbuntuProd -u root bash scripts/build_hermes_sidecar.sh podcast-ingest-core-mcp:local
docker compose -f deploy/hermes/docker-compose.sidecar.yml config --quiet

Развёртывание, config/Skill plan→apply→rollback, direct-safe validator и способ переноса см. в deploy/hermes/README.md и specs/026-hermes-mcp-integration/quickstart.md. Direct transport проверен и работает; boolean-only endpoint-equality validator C6 прошёл targeted tests, POSIX synthetic checks, двух reviewers и единственный live v2 run, его статус — PASS-current, и его нельзя перезапускать. C7 по-прежнему Blocked; hooks Hermes v0.20.0 tag v2026.8.3 — это лишь не установленные и не проверенные на реальном оборудовании кандидатные возможности. Запрещается читать live config values/session dump, сохранять raw response, обновлять или включать hooks для дополнительного подтверждения. Spec 027 contract layer завершён (только offline assurance); фактическая маршрутизация Hermes runtime — BLOCKED/not_evaluated и не является runtime PASS. Spec 028 capability gate завершён и корректно завершается на BLOCKED_CAPABILITY для Hermes v0.20.0 tag v2026.8.3; никаких upgrade, Skill sync, hooks, collector, inference или runtime observation не выполнялось. C6 остаётся PASS-current и не перезапускался; фактическая маршрутизация Hermes Skill остаётся BLOCKED/not_run.

Перед подключением к MCP-клиенту типа Codex / Claude рекомендуется сначала запустить локальную проверку готовности (readiness check):

python scripts/validate_mcp_setup.py --podcast gooaye --query 台積電

Документация по настройке клиента (Client setup):

Эти документы используют только placeholder path. Не коммитьте личные .codex/config.toml, конфигурации с личными абсолютными путями, .env или API key.

Оценка использования инструментов MCP (MCP Tool-use Eval)

После подключения к MCP-клиенту типа Codex / Claude можно использовать eval prompt suite для проверки соответствия использования инструментов ожиданиям. Перед началом запустите:

python scripts/validate_mcp_setup.py --podcast gooaye --query 台積電

Создайте заполняемый Codex MCP session eval report:

python scripts/new_mcp_eval_report.py --name codex-session-001

Документация по eval:

Eval Phase 5B не требует реальных вызовов внешнего LLM API и не требует фактического выполнения загрузки, транскрипции, суммаризации или записи artifacts; основное внимание уделяется подтверждению tool selection, dry-run, acknowledgement guard, объяснению cache stale и отсутствию инвестиционных рекомендаций. Phase 5C предоставляет процесс report capture, позволяющий пользователю заполнить фактические результаты Codex MCP session обратно в evals/.

Оценка безопасности исследований (Research Safety Eval)

Phase 6H — это предварительный safety gate для LLM, который проверяет, что исследовательский слой и будущий LLM workflow не будут галлюцинировать, пропускать api_cost_ack, утекать raw transcript / API key, принимать external boundary за проверенные рыночные данные или выдавать инвестиционные рекомендации.

Документация по research eval:

Phase 6H не вызывает LLM, не читает API key, не запрашивает внешние рыночные данные, не добавляет MCP tools и не изменяет workflow Phase 6G. Phase 6I добавила optional semantic summary execution внутри research workflow. Phase 6J добавила Stock Lens LLM Synthesis, входная граница — только 6F stock lens JSON, обязателен exact api_cost_ack, no raw transcript, no external market data, no MCP tool changes. Phase 6K добавила workflow opt-in synthesis: include_stock_lens_synthesis выполняет synthesis только после подтверждения workflow и exact ack. Phase 6L добавила MCP exposure для run_research_workflow: dry-run first, confirmed execution только оборачивает core workflow, LLM steps по-прежнему требуют exact ack, и no automatic cache rebuild. Phase 6N добавила optional workflow fixture verification include_external_data_verification: поддерживается только локальный fixture provider, no live market API, no API key, no MCP tool changes, no automatic cache rebuild, и не предоставляет инвестиционных рекомендаций. Phase 6O добавила research-llm-smoke: real OpenAI-compatible smoke + Codex manual review, exact ack, no direct Codex-session backend, no live market data, no investment advice. Phase 6Q добавила конфигурацию LLM profile: --llm-profile pro4500 позволяет переиспользовать имена provider/model/base URL/env var, но не сохраняет значение API key. Phase 6R добавила локальный загрузчик секретов .env: для ручного LLM smoke можно использовать API_KEY, MODEL, BASE_URL, а CLI metadata показывает только имена env var, не показывая secret value. Phase 6T добавила research LLM smoke review report / quality gate: после confirmed smoke можно создавать deterministic review artifacts, no LLM call, no .env read, no external market data. Phase 6V добавила reviewed semantic context opt-in: stock lens synthesis по умолчанию по-прежнему только 6F stock lens JSON, и только после явного включения используется review-passed контекст .semantic.md, no raw transcript, no live market data, no MCP tool changes, no investment advice. Phase 6V.1 выровняла review gate boundary/context consistency: JSON-only artifact не может нести semantic context, reviewed semantic boundary обязана нести review-passed context.

Spec Kit / Архитектура

Phase 7A — это Architecture / Spec Kit Stabilization, ограниченная только docs/spec. Она приводит текущую исследовательскую систему Phase 6T обратно в отслеживаемую структуру spec-kit, не меняя runtime, не меняя MCP, не вызывая LLM, не читая .env, не запрашивая external market data и не ослабляя границу no investment advice. После Phase 7A следующий кандидат на функциональный этап — Phase 6U semantic summary smoke или небольшая настройка качества вывода LLM (LLM output-quality tuning).

Phase 7B — это Official Spec Kit Bootstrap. Проект официально добавил scaffold, эквивалентный specify init: .specify хранит Spec Kit memory, templates, scripts, workflow и integration metadata; .agents/skills хранит skills $speckit-* для Codex skills mode; AGENTS.md хранит repo-level agent rules. Phase 7B не меняет runtime, не меняет MCP, не вызывает LLM, не читает .env, не запрашивает live market API и не ослабляет границу no investment advice.

Phase 7C — это Spec Kit Constitution + Workflow Alignment. Этот этап превращает .specify/memory/constitution.md из официального placeholder в проектную конституцию и синхронизирует .specify/templates/, AGENTS.md, architecture, roadmap и spec plan. Phase 7C — только docs/spec/tests: no runtime behavior change, no MCP behavior change, no LLM call, no .env read, no live market API, no investment advice. После Phase 7C новые функции должны проходить полный Spec Kit flow: $speckit-constitution, $speckit-specify, $speckit-clarify, $speckit-plan, $speckit-checklist, $speckit-tasks, $speckit-analyze, $speckit-implement, $speckit-converge; $speckit-taskstoissues используется только при необходимости GitHub issue handoff. Phase 6U semantic summary smoke по-прежнему остаётся возможным последующим функциональным этапом.

Phase 7D — это Spec Kit Backfill via Full Workflow. Этот этап использует полный Spec Kit flow для capability-group backfill уже разработанных возможностей: specs/README.md — это registry, 001-gooaye-research-system остаётся umbrella product spec, 002-ingestion-transcript-core — 007-spec-kit-governance фиксируют as-built capability packages, где 006-llm-safety-synthesis-smoke-review покрывает optional LLM/smoke/review gate. Phase 7D — только docs/spec/tests: no runtime behavior change, no MCP behavior change, no LLM call, no .env read, no live market API, no investment advice, и явно фиксирует шаги backfill для $speckit-clarify, $speckit-analyze, $speckit-converge.

Phase 7D.1 — это Spec Kit Active Feature Guidance. Этот этап уточняет usability официальных команд Spec Kit: правильное расположение feature packages — specs/<feature>, .specify/ — это scaffold/memory/templates/scripts metadata; несколько backfilled packages по умолчанию не закрепляют один active feature. Чтобы запустить official scripts / skills для конкретного package, сначала задайте SPECIFY_FEATURE_DIRECTORY, например $env:SPECIFY_FEATURE_DIRECTORY="specs/003-metadata-search-mcp-core"; официальный script может сохраняться в .specify/feature.json, при переключении package просто задайте его заново. Phase 7D.1 не меняет runtime, не меняет MCP, не вызывает LLM, не читает .env, не запрашивает live market API и не предоставляет investment advice. Phase 6U semantic summary smoke по-прежнему остаётся возможным последующим функциональным этапом.

Документация Spec-kit:

Лицензия

Этот репозиторий лицензирован под MIT License. См. LICENSE. Это авторское право распространяется только на работы первой стороны: два spec packages включают byte-pinned snapshot стороннего репозитория NousResearch/hermes-agent, который имеет собственную лицензию MIT. См. THIRD-PARTY-NOTICES.md.

Команды разработки

python -m pytest
python -m compileall src scripts

Чтобы установить зависимости для разработки:

python -m pip install -e .[dev]

Spec034 Task #82 v8 review repair — текущий

startup/plugin закрыт; credential_provider BLOCKED; в целом BLOCKED. Spec034 остаётся offline/static-only, с H2 ровно 20 upstream paths при H1 SHA-256 90ba45ccf11bbcbf446f7d16904964073e84837a04aaaa0c6f4887d3ea75109d; никакой 21-й path не авторизован. Изолированный child принимает только обычный no-link/reparse-free project snapshot в качестве payload cwd, изменяет его до импорта sentinel/Pytest/product и сохраняет только capability snapshot, затем project snapshot, затем stdlib. Следовательно, три относительных чтения конфигурации C6 используют snapshot-approved bytes, даже если исходные конфигурации рабочей области изменятся после создания snapshot. Публичная проекция receipt не имеет внедрённого verifier; приватная выдача пересчитывает текущие canonical facts. AST proof следует одному owner-local flow package spec/module/loader/return/register/context. Bundle rename parent fsync предшествует журналу bundle_renamed с явным platform best-effort fallback, и только точное nonce-bound восстановление both-missing является retry-safe. Тесты runner/journal/trust остаются нефинальными. Каждый предыдущий root не является доказательством одобрения. Требуются свежие повторные ревью кода и архитектуры; только Main может запустить документированную one-shot command после обоих PASS, и здесь она не запускалась.

Available Tools

25 tools
derive_workflow_bundleC

Side-effect tool:confirm=false 是 preview(零寫入、零網路)。

ParametersJSON Schema
NameRequiredDescriptionDefault
forceNo
confirmNo
podcast_idNo
episode_refNo
api_cost_ackNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

C2/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It does disclose that the tool has side effects and that confirm=false provides a safe preview, which is useful. However, it doesn't describe what side effects occur when confirm=true (what writes, what network calls), the impact on data, or any other behavioral traits like idempotency or error cases. The disclosure is partial and leaves critical unknown behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single concise sentence, front-loaded with the 'side-effect tool' warning and the preview condition. There is no wasted wording, but it is under-specified for a tool with 5 parameters and many siblings. The conciseness is appropriate in length but not in content, so it earns a middle score.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness1/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex tool with 5 parameters, no annotations, an output schema (unseen), and 25 siblings, this description is drastically incomplete. It doesn't explain the tool's core function, differentiate it from similar workflow tools, define parameters (except confirm), or discuss return values or failure modes. An agent would not be able to call it correctly or decide when to use it.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It adds meaning for the confirm parameter (confirm=false = preview), but ignores force, api_cost_ack, podcast_id, and episode_ref entirely. Even for confirm, it doesn't explain what confirm=true does beyond being not-preview. Other parameters remain unexplained, leaving agents to guess their purpose.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose2/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description labels the tool as a 'side-effect tool' but never states what 'derive_workflow_bundle' actually does. It doesn't specify a clear verb+resource or explain what a workflow bundle is or how deriving it differs from running workflows (siblings like run_research_workflow). The purpose remains vague and relies on the tool name for meaning.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description only mentions that confirm=false is a preview mode with zero writes/network, which is a condition for using the tool, not guidance on when to use this tool versus alternatives. No context is given for selecting this over the many run_* or query_* siblings, nor any prerequisites for calling it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

download_audioC

Side-effect tool:需要 confirm=true 才會下載 podcast audio。

ParametersJSON Schema
NameRequiredDescriptionDefault
forceNo
confirmNo
podcast_idNogooaye
episode_refNolatest

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

C2.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the behavioral disclosure burden. It does clearly disclose that this is a side-effect operation and that confirm=true is required, which is valuable guardrail context. However, it omits other behavioral details such as what happens when confirm is false, what side effects occur (e.g., file writes, network fetches), or any irreversibility/permission considerations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is very short and front-loads the most important warning ('Side-effect tool'). Every word earns its place; there is no filler. However, the extreme brevity borders on under-specification, which prevents a higher score.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a side-effecting download tool with four undocumented parameters and no annotations, the description is not complete. The output schema helps with return values, but the agent still lacks enough context about force, episode selection semantics, defaults, and the practical consequences of invoking this tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate for all four parameters. It only explains confirm (must be true to download) and leaves force, podcast_id, and episode_ref semantically unexplained, despite their non-obvious defaults like 'gooaye' and 'latest'.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action ('download podcast audio') and the gating condition (confirm=true), making the core purpose clear. It does not explicitly name or differentiate from sibling read-only or workflow tools, but the side-effect framing helps separate it from the many analytical siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies use cases by labeling the tool a side-effect tool and requiring confirmation, but it gives no explicit guidance on when to use this tool versus transcribe_episode, list_episodes, or the workflow tools. There is no 'when-not-to-use' or alternative routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

extract_mentionsC

Side-effect tool:需要 confirm=true 才會寫入 deterministic mention artifacts。

ParametersJSON Schema
NameRequiredDescriptionDefault
forceNo
confirmNo
podcast_idNogooaye
episode_refNolatest
allow_partialNo
max_evidence_per_mentionNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

C2.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description explicitly declares the tool is a 'Side-effect tool' and clarifies that writes happen only when confirm=true. With no annotations present, this is valuable behavioral disclosure beyond the tool name. It does not detail overwrite behavior or artifact location, but the key side-effect warning and confirmation requirement are clearly stated.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence with no filler, and the critical 'Side-effect tool' warning is front-loaded. It loses one point because it is so minimal that it sacrifices useful explanatory content, but structurally and stylistically it is very concise.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a six-parameter tool with no annotations and no schema descriptions, the description is far too incomplete. It does not explain the extraction workflow, how episodes are selected, what force or allow_partial control, or what the output artifacts represent. The output schema may cover return values, but the description still leaves major operational questions unanswered.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema description coverage is 0% and the description provides no explanation of any parameter. Confirm, force, allow_partial, max_evidence_per_mention, podcast_id, and episode_ref are all left undocumented in prose. Even though some parameter names are self-explanatory, the description itself adds no semantic value.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose3/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states the tool writes 'deterministic mention artifacts' and that it has side effects, coupling with the name 'extract_mentions.' However, it never explicitly says the tool extracts mentions from episodes, and 'deterministic mention artifacts' is vague jargon. It also does not differentiate itself from sibling tools like search_mentions or validate_transcript.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is given for when to use this tool instead of alternatives. The only usage-related information is 'needs confirm=true to write', which is a safety gate rather than a selection criterion. There is no mention of prerequisites, pipeline ordering, or exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

generate_stock_lens_reportC

Side-effect tool:需要 confirm=true 才會寫入 deterministic stock lens report。

ParametersJSON Schema
NameRequiredDescriptionDefault
forceNo
confirmNo
podcast_idNogooaye
stock_queryNo
allow_partialNo
max_evidence_itemsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

C2.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full disclosure burden. It does disclose the two most critical behavioral traits: the tool has side effects (it writes state) and it will not write unless confirm=true, which is genuinely valuable guardrail information. But it omits what happens when confirm=false, whether the write overwrites or destoys an existing report, and how force or allow_partial modify execution. Partial disclosure for a mutation tool that needed complete disclosure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The definition is one sentence with the critical side-effect warning front-loaded and zero filler, which is structurally efficient. But the brevity crosses into under-specification for a tool with six parameters, no annotations, and 25 siblings; it is short because it says too little, not because everything needed has been said.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema covers return values, but everything else an agent needs before safely invoking a guarded mutation is missing: the outcome of a non-confirmed call, the destructiveness of the write, the semantics of force and allow_partial, and how a stock lens report relates to the verified-research-report family. For a side-effect tool at 0% schema coverage with no annotations, this is a significant gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate, yet it assigns meaning to only one of six parameters: confirm=true gates the write. The remaining parameters — force, podcast_id, stock_query, allow_partial, max_evidence_items — receive no semantic explanation beyond their names, and the interaction between force and confirm (does force bypass the gate?) is left entirely to inference.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose3/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource — '寫入 deterministic stock lens report' (write a deterministic stock lens report) — and flags the tool as side-effecting, so an agent knows it persists state. However, it never explains what a stock lens report actually is or how it relates to the podcast domain, and the distinction from sibling workflow generators like run_latest_episode_verified_research_report_workflow or run_corpus_latest_episode_deterministic_workflow is left implicit. The description reads more like a safety banner than a purpose statement.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No when-to-use, when-not-to-use, or alternative routing guidance is present. Among 25 siblings that include several workflow runners and report generators, nothing helps an agent decide between this tool and run_corpus_latest_episode_deterministic_workflow or run_latest_episode_verified_research_report_workflow. The confirm=true note is invocation syntax, not usage context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_episodeA

查詢單一 podcast episode metadata;支援 latest 與大小寫不敏感 EP ref。

ParametersJSON Schema
NameRequiredDescriptionDefault
podcast_idNogooaye
episode_refNolatest

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the disclosure burden. It usefully reveals two non-obvious behaviors: the 'latest' keyword and case-insensitive episode references. However, it does not mention failure behavior, data freshness, source details, or any side effects, though the read-only 'metadata' framing lessens the risk.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single compact sentence that front-loads the core purpose and then packs the two most important behavioral details into a short clause. Every phrase adds value and there is no repetition of schema information or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is a simple read-only getter with an output schema and defaults for both parameters, and the description covers the main calling conventions: single episode, latest support, and case-insensitive refs. It slightly under-specifies the exact episode ref format and error behavior, but an agent has enough to make a correct call.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It adds meaningful semantics for episode_ref by documenting 'latest' and case-insensitive matching, but it leaves podcast_id's meaning implicit beyond its name and default value, and it does not specify the expected format of a non-latest episode ref.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb '查詢' (query) plus a specific resource '單一 podcast episode metadata', clearly identifying this as a single-episode metadata lookup. This differentiates it from siblings like list_episodes, which handle collections of episodes.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The usage context is implied: the description says 'single' episode and mentions the supported 'latest' and case-insensitive episode refs, so an agent can infer this tool is for one specific episode. However, it never explicitly names list_episodes as the alternative when multiple episodes are needed, and it gives no when-not-to-use guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ingest_x_videoC

Side-effect tool:confirm=false 是 preview(零寫入,會讀公開 metadata)。

ParametersJSON Schema
NameRequiredDescriptionDefault
urlNo
forceNo
titleNo
confirmNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

C2.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden, and it does disclose the most safety-critical trait: confirm=false is a zero-write preview mode that reads public metadata, while the tool itself is a side-effect operation. However, it stays silent on what confirm=true actually writes, what force does, and whether ingestion is idempotent or rate-limited — notable omissions for a mutation tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The entire description is a single sentence that front-loads the risk class ('Side-effect tool') before the preview semantics, with zero wasted words. Each phrase earns its place, though the extreme brevity means there is minimal content to structure.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

A side-effect tool with 4 parameters, no annotations, and 0% schema coverage needs substantially more than one sentence. The existence of an output schema reduces the need to explain return values, but the undocumented url/force/title semantics and the absence of any differentiation from ingest_youtube_video leave the definition materially incomplete for safe invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate for the schema's silence, but it only explains one of four parameters: confirm. The url, force, and title parameters receive no semantic explanation at all, leaving an agent to guess at URL format requirements and the meaning of force and title.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose2/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description labels the tool 'Side-effect tool' and explains the confirm flag's preview behavior, but never states what it actually does — ingesting an X/Twitter video — or what the ingestion accomplishes. The core purpose is only recoverable from the tool name, not from the description itself, which makes this closer to a tautology than a real purpose statement.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is given on when to use this tool versus the closely related sibling ingest_youtube_video or any of the other ingestion/search tools. The only conditional hint, that confirm=false corresponds to preview, is a safety instruction about a flag rather than a when-to-use selection rule.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ingest_youtube_videoC

Side-effect tool:confirm=false 是 preview(零寫入,會讀公開 metadata)。

ParametersJSON Schema
NameRequiredDescriptionDefault
urlNo
forceNo
titleNo
confirmNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

C2.6/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and only discloses that confirm=false is a zero-write preview that reads public metadata. It does not disclose the real side effects of confirm=true, such as what gets written, downloaded, or persisted, nor any auth, idempotency, or rate-limit behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The single sentence is concise and front-loaded with the most important safety distinction, but it is under-specified rather than efficiently complete. It earns its place yet leaves critical content missing.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a side-effect tool with no annotations, no schema descriptions, four parameters, and an output schema, the description is far from complete. It omits the core ingest behavior, side effects, parameter meanings, and sibling differentiation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate for all four parameters, but it only touches confirm. url, force, and title remain completely unexplained, and confirm=true's meaning is left ambiguous.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose3/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description identifies the tool as a side-effect tool and explains the preview mode, but it never explicitly states that the tool ingests a YouTube video; that action is only implied by the tool name. It distinguishes confirm=false behavior but does not differentiate the tool from siblings like ingest_x_video.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies a usage pattern: use confirm=false to preview with zero writes. However, it does not say when to use this tool instead of alternatives, nor what confirm=true actually triggers, leaving the when-to-use guidance incomplete.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_episodesB

列出指定 podcast 最近集數;不回傳完整 audio_url。

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
podcast_idNogooaye

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the behavioral disclosure burden. It discloses one important behavior — it does not return the full audio_url — which is genuinely useful. However, it does not mention other behavioral traits such as sorting, pagination, read-only status, or what happens when the podcast has no episodes.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single short sentence with no filler. It front-loads the core purpose and then adds the key exclusion, earning its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is simple and has an output schema, so return-value documentation is covered. However, the description is minimal: it does not define 'recent', mention that both parameters are optional, or provide guidance for choosing among the many sibling tools. It is usable but has clear gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate, but it only implicitly maps '指定 podcast' to podcast_id. It does not explain the limit parameter, its meaning, or the defaults. The schema's default values for limit and podcast_id are the only guidance for those parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a clear action and resource: list recent episodes for a specified podcast. It also adds a distinguishing boundary ('不回傳完整 audio_url'), which helps separate it from download_audio. However, it does not explicitly name sibling alternatives like get_episode, so differentiation is implicit rather than explicit.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to use the tool: when you need recent episodes of a podcast and do not need full audio URLs. It does not explicitly state when to prefer get_episode, download_audio, or search_transcripts, leaving the choice to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_verified_report_gap_backlogB

List inventory episodes missing a verified research report bundle.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
podcast_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the behavioral disclosure burden. It clearly indicates a read-only listing operation and the selection criterion, which is useful. However, it does not disclose pagination behavior, ordering, what happens when no gaps exist, or how 'verified research report bundle' is determined.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single concise sentence with no filler. The core action and target resource are front-loaded, making it easy to scan and quickly understand.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Although an output schema exists and reduces the need to explain return shapes, the overall context is incomplete: parameter semantics are absent, no alternative routing is provided, and the description alone is too minimal to fully support correct tool selection and invocation among many related sibling tools.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has 0% description coverage, so the description must compensate, but it provides no parameter-level guidance. It never mentions that the list is scoped by podcast_id or that limit controls the number of results, leaving both parameters essentially undocumented.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb, 'List', and a specific resource, 'inventory episodes missing a verified research report bundle.' This makes the tool's focus immediately distinct from siblings like list_episodes or query_verified_research_report_coverage.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies the tool is used to identify gaps in verified research report coverage, but it does not explicitly state when to prefer this tool over siblings such as list_episodes or query_verified_research_report_coverage, nor does it mention any exclusions or alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

query_verified_research_report_catalogC

List, search, or inspect read-only verified research report bundles.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
queryNo
actionNolist
podcast_idNo
episode_refNo
source_digestNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

C2.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden of behavioral disclosure. It does state 'read-only,' which is a meaningful safety signal for an agent. However, it does not describe how action values behave, what query matching is used, whether pagination or limits apply, or what an 'inspect' operation returns.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One sentence, front-loaded with verbs and resource, with no filler. It is efficient, but the verb 'inspect' is vaguely defined and the sentence sacrifices necessary parameter/action detail for brevity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with six optional parameters, zero parameter descriptions, no enums, and no annotation coverage, the description is too thin. Although an output schema exists and return values may be defined there, the absence of action semantics and filter meanings leaves an agent unable to reliably choose or correctly invoke the tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% and the description does not mention any of the six parameters: action, query, limit, podcast_id, episode_ref, or source_digest. An agent has no guidance on how to populate these fields or what the allowed action values are, especially since action has no enum.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description identifies specific actions (list, search, inspect) and a specific resource (read-only verified research report bundles). It clearly conveys this is a query-oriented catalog tool and the read-only qualifier helps separate it from generation/revalidation siblings, though it does not name sibling tools explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives no explicit guidance on when to use this tool versus alternatives, and no exclusions or conditions are stated. Sibling tools like query_verified_research_report_coverage and list_verified_report_gap_backlog are similar in spirit, but the description does not differentiate them or explain what problem this tool uniquely solves.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

query_verified_research_report_coverageC

List episode-centric coverage of local verified research report bundles.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
has_bundleNo
podcast_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

C2.4/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of disclosing behavior. It only says 'List', which implies a read-only operation, but it does not explain what 'coverage' means, whether results are filtered by has_bundle, how limiting works, or any other behavioral nuance. The description adds little beyond the tool name.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single short sentence with no filler, which is structurally economical. However, it is under-specified: the brevity comes at the cost of clarity about what the tool actually does. It is concise but not optimally informative for an agent.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Although an output schema exists and return values need not be described, the description still fails to explain the core concept of 'coverage', the role of the required podcast_id, or the meaning of has_bundle. With three parameters and no annotations, this is insufficient context for an agent to invoke the tool confidently.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate by explaining parameters. It does not mention podcast_id, limit, or has_bundle at all. The schema property names and types provide some self-evident meaning, but the description itself adds no parameter-level guidance.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('List') and names a distinct resource ('episode-centric coverage of local verified research report bundles'), which clearly distinguishes it from the catalog-style sibling query_verified_research_report_catalog. However, the term 'coverage' is somewhat vague and the meaning of 'local verified research report bundles' is not fully unpacked, so it is not perfectly clear.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool over alternatives. It does not mention filters, prerequisites, or related tools like query_verified_research_report_catalog or list_episodes. The usage context is only implied by the name and input schema, not stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

rebuild_cacheA

Maintenance tool:重建 SQLite cache;只索引既有 artifacts,不下載、不轉錄、不摘要。

ParametersJSON Schema
NameRequiredDescriptionDefault
forceNo
podcast_idNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden of disclosure. It clearly states the maintenance nature and the non-destructive boundaries (no download/transcribe/summarize). However, it does not disclose whether 'rebuild' deletes or overwrites the existing cache, or mention any side effects, permissions, or rate considerations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise and front-loaded with the most important context ('Maintenance tool'). Every clause adds value: target resource, scope, and explicit exclusions. There is no fluff or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Although the tool is simple and has an output schema, the description omits any guidance on parameter semantics and when to trigger a rebuild. Given the absence of annotations and 0% schema coverage, this leaves important invocation details unresolved for an agent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, and the description provides no explanation for the two parameters 'force' and 'podcast_id'. An agent is left to infer their meaning purely from names and defaults, which is insufficient for a low-coverage schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action and resource: rebuilding the SQLite cache. It further distinguishes itself by explicitly listing what it does not do ('不下载、不转录、不摘要'), which differentiates it from sibling tools like download_audio, transcribe_episode, and summarize_episode_extractive.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description labels this as a 'Maintenance tool' and clarifies it only indexes existing artifacts, giving clear context for when to use it. The explicit exclusions ('不下载、不轉錄、不摘要') help an agent avoid selecting it for content-fetching or processing tasks, though it does not name alternative tools or describe conditions like 'use when cache is stale'.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

revalidate_verified_research_report_sourcesC

Revalidate one exact verified-report bundle's local source metadata.

ParametersJSON Schema
NameRequiredDescriptionDefault
podcast_idYes
episode_refYes
source_digestYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

C2.7/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden of behavioral disclosure, but it does not explain what 'revalidate' actually does, whether it mutates local metadata, what side effects occur, or what happens if validation fails. The word 'local' adds some scope, but the behavioral implications remain unclear.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single compact sentence with no filler words. It front-loads the verb and resource, and every word contributes to the core meaning. It is appropriately concise, though it sacrifices useful detail.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with three required parameters, no annotations, and a non-obvious operation like 'revalidate', this description is incomplete. It does not explain prerequisites, expected behavior, failure semantics, or how the parameters relate. The presence of an output schema reduces the need to describe return values, but the core invocation context is still missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, and the description does not define podcast_id, episode_ref, or source_digest. The phrase 'one exact verified-report bundle' implies these parameters together identify a specific bundle, but no format, constraints, or relationships are explained. The parameter names are somewhat self-explanatory but not sufficient.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action ('Revalidate') and a specific resource ('one exact verified-report bundle's local source metadata'), which is reasonably clear. It does not explicitly name or contrast sibling tools, but the scope of 'one exact bundle' partially differentiates it from the broader workflow and catalog tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided on when to use this tool versus alternatives such as query_verified_research_report_catalog or the verified report workflow tools. The phrase 'one exact' hints at targeting a single bundle, but there is no explicit when-to-use or when-not-to-use instruction.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

run_corpus_episode_completion_workflowC

Preview or advance one episode by one explicitly confirmed action.

ParametersJSON Schema
NameRequiredDescriptionDefault
actionNonext
confirmNo
podcast_idYes
episode_refNolatest
api_cost_ackNo
semantic_modelNo
semantic_base_urlNo
semantic_providerNoopenai-compatible
transcription_modelNo
semantic_api_key_envNoOPENAI_API_KEY
transcription_deviceNocpu
semantic_chunk_secondsNo
transcription_vad_filterNo
transcription_compute_typeNoint8
semantic_max_segments_per_chunkNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

C2/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden of behavioral disclosure. It implies both a read-like mode ('preview') and a mutating mode ('advance') but never explains side effects, what state changes occur, cost implications (despite the api_cost_ack parameter), or how confirmation gates execution. The confirmation mechanic is hinted at but never disclosed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness2/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is short and front-loaded, but this is under-specification rather than conciseness. The awkward phrase 'by one explicitly confirmed action' obscures rather than clarifies, and the single sentence does not earn its place given the tool's complexity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness1/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a workflow tool with 15 parameters, zero schema descriptions, no annotations, and numerous workflow siblings, a single opaque sentence is wholly inadequate. Even with an output schema present, the agent cannot determine what the workflow does, what parameters mean, or what side effects to expect.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate, but it adds nothing about the 15 parameters. Only the word 'confirmed' loosely maps to the confirm parameter; semantic_model, transcription_*, api_cost_ack, episode_ref, and semantic_chunk_seconds are all left completely unexplained.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose3/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names verbs ('preview', 'advance') and a resource ('one episode'), so it avoids pure tautology. However, 'by one explicitly confirmed action' is vague, and nothing distinguishes this from the many workflow siblings (run_research_workflow, run_episode_verified_research_report_workflow, etc.). What 'completion' means and what advancing entails remain unclear.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is given on when to use this tool versus the sibling workflow tools, nor when to choose 'preview' over 'advance'. The phrase 'explicitly confirmed action' hints that confirmation is required, but the description never states the condition or workflow position for using this tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

run_corpus_latest_episode_deterministic_workflowC

Preview or process one current latest episode through local deterministic stages.

ParametersJSON Schema
NameRequiredDescriptionDefault
confirmNo
podcast_idYes
transcription_modelNo
transcription_deviceNocpu
transcription_vad_filterNo
transcription_compute_typeNoint8

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

C2.4/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries full responsibility for disclosing behavior. 'Preview or process' implies two modes and 'local deterministic stages' hints at reproducibility, but it does not say what the stages are, whether processing writes data, whether preview has side effects, or what confirm controls.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is short and readable, with no wasted words. However, it is under-specified to the point that phrases like 'local deterministic stages' and 'Preview or process' carry jargon and ambiguity rather than concrete operational meaning.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness1/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a workflow tool with six parameters, no annotations, and a large set of sibling workflow tools, this one-line description is far from complete. It does not explain the confirm flag, the transcription settings, the workflow outcome, side effects, or how this tool relates to the other run_*_workflow siblings.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate for documenting six parameters. It does not clarify that podcast_id identifies the corpus, that confirm switches between preview and full processing, or what the transcription_model/device/vad/compute_type options do.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action ('Preview or process') on a specific resource ('one current latest episode') and mentions a method ('local deterministic stages'). However, it does not differentiate this workflow from sibling workflow tools like run_corpus_episode_completion_workflow or run_latest_episode_erified_research_reort_workflow, so it falls short of the top score.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to choose this tool over its many sibling workflow tools. The description does not explain when preview mode is appropriate versus full processing, nor does it mention any prerequisites or conditions that should trigger this workflow.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

run_episode_verified_research_report_workflowC

Preview or publish one explicit-episode verified research report (assemble only).

ParametersJSON Schema
NameRequiredDescriptionDefault
confirmNo
podcast_idYes
episode_refYes
stock_queryNo
include_fixture_verificationNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

C2.7/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure and only reveals that the tool has two modes (preview/publish) and is limited to assembly. It does not disclose the side effects of publishing, whether confirmation gates the action, auth requirements, or what 'assemble only' actually does or leaves undone. This is potentially a mutating workflow, so the gap is significant.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One dense sentence with no filler; every phrase carries information (modes, episode scoping, artifact type, assembly constraint). It is efficiently structured and front-loaded, though slightly under-sized for the tool's complexity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The output schema covers return values, so that is not the issue, but the tool is a complex 5-parameter workflow with publish side effects, zero annotation coverage, and many close siblings. A single sentence cannot convey sibling routing, parameter meaning, or publish behavior, leaving the definition materially incomplete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate, but it only indirectly hints at two parameters: 'explicit-episode' maps to episode_ref, and 'Preview or publish' maps to the confirm flag. stock_query and include_fixture_verification are left completely unexplained, and podcast_id semantics are assumed rather than stated.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names specific actions ('Preview or publish'), a specific resource ('one explicit-episode verified research report'), and a scope constraint ('assemble only'). The 'explicit-episode' phrasing differentiates it from the sibling run_latest_episode_verified_research_report_workflow, so an agent can discriminate at a glance. Minor deduction because 'assemble only' is cryptic and the artifact type 'verified research report' is never defined.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage context is only implied by the phrase 'explicit-episode', which weakly contrasts with the latest-episode sibling, and by 'assemble only', which hints this is a partial workflow. There is no explicit statement of when to choose this over run_research_workflow or the corpus/latest-episode variants, and no guidance on when to preview versus publish.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

run_latest_episode_verified_research_report_workflowC

Preview or complete one approved latest verified research report workflow.

ParametersJSON Schema
NameRequiredDescriptionDefault
confirmNo
podcast_idYes
stock_queryNo
api_cost_ackNo
semantic_modelNo
semantic_providerNoopenai-compatible
transcription_modelNo
expected_episode_refNo
transcription_deviceNocpu
semantic_chunk_secondsNo
transcription_vad_filterNo
transcription_compute_typeNoint8
include_fixture_verificationNo
semantic_max_segments_per_chunkNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

C2.4/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden, but 'Preview or complete' only hints at a two-phase execution model. It does not disclose side effects, whether confirm=true triggers an expensive or write-heavy run, or whether records are written to the verified report catalog.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The single sentence is compact with no filler, earning efficiency credit. But it is more of a label than an informative definition; 'approved latest' is awkward and consumes words without adding precision.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness1/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 14-parameter workflow with no annotations, this definition is severely under-specified. The agent cannot know when confirmation is required, what the cost-acknowledgment parameter means, or how model/device parameters should be set; the output schema covers return shape, not operational prerequisites.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0% across 14 parameters and the description adds no parameter information. The 'preview or complete' wording loosely maps to the confirm boolean, but parameters like api_cost_ack and include_fixture_verification are never explained.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States two concrete actions ('Preview or complete') and names the resource type ('approved latest verified research report workflow'), which separates it from the sibling run_episode_verified_research_report_workflow by focusing on the latest episode. However, 'approved latest' is slightly ambiguous about whether the episode or the workflow is approved, and what qualifies as 'latest.'

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided about when to choose this tool over closely related siblings such as run_episode_verified_research_report_workflow or the corpus latest-episode workflow. The phrase 'latest' implies a use case but does not state selection conditions or mention the confirm-based preview/execute flow as a usage decision.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

run_research_workflowC

Side-effect workflow tool:dry-run first,confirmed LLM steps require exact ack。

ParametersJSON Schema
NameRequiredDescriptionDefault
forceNo
confirmNo
podcast_idNogooaye
episode_refNolatest
stock_queryNo
api_cost_ackNo
allow_partialNo
semantic_modelNo
synthesis_modelNo
semantic_base_urlNo
semantic_providerNoopenai-compatible
synthesis_base_urlNo
synthesis_providerNoopenai-compatible
semantic_api_key_envNoOPENAI_API_KEY
report_window_secondsNo
synthesis_api_key_envNoOPENAI_API_KEY
semantic_chunk_secondsNo
max_candidates_per_nodeNo
include_semantic_summaryNo
max_evidence_per_mentionNo
max_evidence_per_sectionNo
max_stock_evidence_itemsNo
max_evidence_per_candidateNo
synthesis_max_prompt_charsNo
include_stock_lens_synthesisNo
semantic_max_segments_per_chunkNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

C2.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral disclosure burden. It does disclose that the tool has side effects and that a dry-run-then-confirm protocol is required, which is valuable. However, it does not describe what side effects occur, what an 'exact ack' means in concrete terms, whether costs are incurred, or what state gets changed, leaving significant behavioral ambiguity.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness2/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely short, but that brevity is not appropriate for a complex 26-parameter tool with a workflow, confirmation protocol, and many model/provider options. While the sentence contains useful safety information, it lacks any structural organization and is under-specified rather than economically concise.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness1/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the high complexity, zero schema description coverage, no annotations, and a large sibling set, this description is far from complete. It provides almost no information about what the workflow does, what its key parameters control, what side effects to expect, or how it differs from similar workflow tools. An agent cannot reliably select or invoke this tool based on this description alone.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% across 26 parameters, and the description adds essentially no meaning to the parameters. Terms like 'dry-run' and 'ack' vaguely relate to confirm and api_cost_ack, but no parameter is explained, mapped, or contextualized. The description fails to compensate for the complete absence of parameter documentation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose2/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description only labels the tool as a 'Side-effect workflow tool' and mentions a dry-run/confirmation procedure; it never states what the research workflow actually does, what inputs it consumes, or what output it produces. It is essentially a generic category label, restating the name without distinguishing it from the many run_* workflow siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It does provide some procedural guidance: run a dry-run first, and confirmed LLM steps require an exact ack. This implicitly tells an agent how to approach invocation safely, but it does not say when to choose this tool over alternatives like run_latest_episode_verified_research_report_workflow or run_corpus_episode_completion_workflow.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_mentionsC

搜尋 SQLite cache 中的 deterministic mentions 與 timestamp evidence。

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
queryYes
podcast_idNogooaye
mention_typeNo
case_sensitiveNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

C2.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden of behavioral disclosure. It adds some value by stating the data source (SQLite cache) and result focus (deterministic mentions and timestamp evidence). However, it does not explicitly state read-only behavior, cache staleness, or any operational side effects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence with no filler, front-loading the core behavior. Every word contributes to identifying the tool's purpose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 5-parameter search tool with zero parameter documentation and no annotations, this terse description is insufficient. The agent is left guessing about parameter formats, defaults, and filter behavior. The presence of an output schema mitigates return-shape concerns but not the missing operational and parameter guidance.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% and the description names no parameters. It does not explain what query syntax is expected, how mention_type should be expressed, what podcast_id default 'gooaye' means, or how limit and case_sensitive affect results. The description fails to compensate for the schema's lack of parameter documentation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb (搜尋/search) and names a concrete resource: 'SQLite cache 中的 deterministic mentions 與 timestamp evidence'. This makes the tool's object and scope reasonably clear. It does not explicitly differentiate from sibling search_transcripts, but the mention-vs-transcript distinction is implied.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to use this tool versus alternatives like search_transcripts, extract_mentions, or rebuild_cache. No exclusions or conditions are provided, so an agent cannot easily decide whether this is the right search tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_transcriptsA

搜尋 SQLite cache 中的 transcript segments;不會自動 rebuild cache。

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
queryYes
podcast_idNogooaye
search_modeNoauto
case_sensitiveNo
context_segmentsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses one genuinely useful behavioral trait beyond the name: the tool reads from the SQLite cache and will not rebuild it, implying results may be stale or empty on a cache miss. However, with no annotations provided, the description carries the full burden and does not state read-only guarantees, cache-miss behavior, or any side effects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A two-clause description with the primary action front-loaded and zero filler. The behavioral warning about not rebuilding the cache is appended efficiently in the second clause; every word earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with 6 parameters, no annotations, and 0% description coverage, this is too thin. While an output schema covers return values, the interplay of search_mode, case_sensitive, context_segments, and podcast_id is unexplained, leaving an agent guessing at valid invocations. The core purpose is clear, but the surrounding context a caller needs is largely absent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, and the description contributes no parameter-level meaning. Ambiguous values such as search_mode='auto' and context_segments are left undefined, and with no enum constraints in the schema the agent has no way to know valid modes or semantics. The description must compensate for the low coverage but does not.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource — searching transcript segments within the SQLite cache — and adds the explicit caveat that it will not rebuild the cache, which differentiates it from the rebuild_cache sibling. An agent understands exactly what object this operates on and can distinguish it from related search tools like search_mentions.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The 'won't auto-rebuild cache' clause implies a usage context (use this when searching existing cached data, not when fresh data is needed), but no alternative tools are named directly and no explicit when-to-use/when-not-to-use guidance is given. Routing to rebuild_cache or search_mentions is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

semantic_summarize_episodeC

API-cost side-effect tool:需要 confirm=true 與 exact api_cost_ack 才會呼叫外部 LLM。

ParametersJSON Schema
NameRequiredDescriptionDefault
forceNo
modelNo
confirmNo
base_urlNo
providerNoopenai-compatible
podcast_idNogooaye
api_key_envNoOPENAI_API_KEY
episode_refNolatest
api_cost_ackNo
allow_partialNo
chunk_secondsNo
max_segments_per_chunkNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

C2.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full behavioral disclosure burden. It clearly reveals that this tool has side effects (API cost, external LLM call) and sets an explicit precondition (confirm=true and exact api_cost_ack) before the external call occurs. This is useful transparency, though it does not cover all behavioral consequences such as caching, write effects, or failure modes.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single front-loaded sentence with no filler, and it highlights the most critical operational caveat (cost and confirm/ack gating) early. It is appropriately concise, though slightly cryptic due to mixed-language jargon.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given a 12-parameter tool with no annotations and only an output schema, the description is too thin to be complete. It explains the cost gate but does not clarify what input the tool expects beyond the ack, how to choose episode_ref, what configuration parameters like model/base_url/api_key_env do, or what the semantic summary result looks like.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It adds meaning for confirm and api_cost_ack by identifying them as required gates for the external LLM call, but the other 10 parameters (force, model, base_url, podcast_id, api_key_env, episode_ref, allow_partial, chunk_seconds, max_segments_per_chunk) receive no semantic explanation beyond their raw schemas.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose3/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description identifies the tool as an 'API-cost side-effect tool' that calls an external LLM when confirm=true and api_cost_ack match, but it never explicitly states that the tool summarizes an episode. The intended action is mostly inferable from the tool name and sibling context, making the purpose vague rather than fully specified.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives no guidance on when to use this tool versus alternatives like summarize_episode_extractive or other workflow tools. It only implies caution due to cost, but does not state conditions for selection, exclusions, or recommended alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

suggest_historical_verified_report_next_stepC

Suggest one next human-gated step for a named historical episode.

ParametersJSON Schema
NameRequiredDescriptionDefault
podcast_idYes
episode_refYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

C2.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The phrase 'human-gated' and the verb 'suggest' imply the tool proposes an action rather than executing it, which is useful behavioral context in the absence of annotations. However, it does not disclose side effects, prerequisites, or how the suggestion is determined.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single front-loaded sentence with no filler. Slightly more detail would be appropriate given the lack of annotations, but the structure itself is efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool has no annotations, minimal parameter documentation, and many related workflow siblings. The description leaves the agent without enough context to know when to invoke this tool or how it differs from nearby tools, despite the output schema covering return values.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, and the description only hints at 'episode_ref' via 'named historical episode'. It does not clarify the role or expected format of podcast_id or episode_ref beyond their names.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action ('Suggest one next human-gated step') and a clear target ('a named historical episode'). It is clear about what the tool does, though it does not explicitly differentiate it from related workflow and backlog sibling tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is given about when to use this tool versus alternatives such as list_verified_report_gap_backlog or run_episode_verified_research_report_workflow. The description implies use for historical episodes but does not explain the intended context or exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

summarize_episode_extractiveA

Side-effect tool:需要 confirm=true 才會寫入 deterministic extractive summary。

ParametersJSON Schema
NameRequiredDescriptionDefault
forceNo
confirmNo
max_quotesNo
podcast_idNogooaye
episode_refNolatest
allow_partialNo
window_secondsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the burden of behavioral disclosure. It clearly warns that this is a side-effect tool and that writes only occur with confirm=true, which is essential transparency. Still, it does not mention consequences of force, allow_partial, or default behavior around latest episode references, leaving gaps for a mutation-capable tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence with the most important behavioral warning ('Side-effect tool') front-loaded. There is no filler or redundant restatement of the tool name, and every word adds useful information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite having an output schema, the description is too thin for a seven-parameter side-effect tool with no annotations and no schema descriptions. It omits what the other parameters do, when the tool should be run, and how it relates to semantic_summarize_episode, so an agent would still need substantial inference to invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate for the seven undocumented parameters. It explains only confirm=true's gating role, while force, max_quotes, podcast_id, episode_ref, allow_partial, and window_seconds receive no semantic explanation in either the schema or the description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states that this tool writes a deterministic extractive summary when confirm=true, giving a clear verb ('write'), resource ('summary'), and side-effect condition. The word 'extractive' and 'deterministic' also differentiate it from the sibling semantic_summarize_episode, making its purpose unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It tells the agent that confirm=true is required before any write happens, which is useful operational guidance for a side-effect tool. However, it does not state when to choose this tool over semantic_summarize_episode or other summarization/workflow siblings, so the usage context is only partially conveyed.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

transcribe_episodeA

Long-running side-effect tool:需要 confirm=true 才會下載/取得音檔並轉錄。

ParametersJSON Schema
NameRequiredDescriptionDefault
forceNo
modelNotiny
deviceNocpu
confirmNo
podcast_idNogooaye
vad_filterNo
episode_refNolatest
compute_typeNoint8

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations present, the description carries the behavioral burden and does well by flagging long-running execution, side effects, and the confirm=true gate before any work happens. It could add more detail about what the side effects affect, but the core safety-relevant behavior is disclosed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One dense sentence with the most important facts—long-running, side-effect, and the confirmation requirement—placed right at the start. There is no redundant or filler text.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an 8-parameter, side-effectful, long-running tool with no annotations, this description is too thin. It explains the confirmation gate and the core operation but omits guidance on the many optional parameters and does not clarify what makes this transcribe tool distinct from nearby sibling tools.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate, but only confirm is explained. Parameters like force, vad_filter, model, device, compute_type, and episode_ref have defaults but no intended meaning or interaction, leaving an agent to guess.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a concrete action ('transcribe') and resource ('episode'), and adds that it downloads/obtains audio before transcribing. It does not explicitly contrast itself with sibling tools like download_audio or the summarization tools, so it misses the top score for sibling differentiation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives clear usage context: the tool is long-running and side-effectful, and must be invoked with confirm=true. However, it does not state when not to use it or name an alternative, so it stops short of full usage guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

validate_transcriptC

檢查既有 transcript artifacts 是否完整、有效或疑似 partial。

ParametersJSON Schema
NameRequiredDescriptionDefault
podcast_idNogooaye
episode_refNolatest

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

C2.6/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden of behavioral disclosure. It only states what is checked and does not disclose whether the tool is read-only, whether it has side effects, permissions, or rate limits. '檢查' weakly implies non-destructive behavior, but this is not explicit.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single front-loaded, efficient sentence with no filler. It is concise, though slightly under-specified, so it earns a 4 rather than a 5.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no annotations, no parameter explanations, and no usage guidance, the description is insufficient for an agent to safely pick this tool among many related siblings. The presence of an output schema covers return values, but not selection, parameter, or behavioral context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate by explaining podcast_id and episode_ref, but it does not mention either parameter. The only clues come from the schema's self-describing names and defaults (gooaye, latest), not from the description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('檢查'/'check') and resource ('既有 transcript artifacts') and states the three evaluation outcomes: complete, valid, or suspected partial. This distinguishes it from transcription/search siblings, though it does not name an alternative explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives no explicit guidance on when to use this tool versus alternatives such as transcribe_episode, search_transcripts, or get_episode. The word '既有' (existing) implies a precondition that artifacts already exist, but no when-to-use or when-not-to-use context is provided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 25 tool updatesv0.2.0
    • First observedderive_workflow_bundle
    • First observeddownload_audio
    • First observedextract_mentions
    • First observedgenerate_stock_lens_report
    • First observedget_episode
    • First observedingest_x_video
    • First observedingest_youtube_video
    • First observedlist_episodes
    • First observedlist_verified_report_gap_backlog
    • First observedquery_verified_research_report_catalog
    • First observedquery_verified_research_report_coverage
    • First observedrebuild_cache
    • First observedrevalidate_verified_research_report_sources
    • First observedrun_corpus_episode_completion_workflow
    • First observedrun_corpus_latest_episode_deterministic_workflow
    • First observedrun_episode_verified_research_report_workflow
    • First observedrun_latest_episode_verified_research_report_workflow
    • First observedrun_research_workflow
    • First observedsearch_mentions
    • First observedsearch_transcripts
    • First observedsemantic_summarize_episode
    • First observedsuggest_historical_verified_report_next_step
    • First observedsummarize_episode_extractive
    • First observedtranscribe_episode
    • First observedvalidate_transcript

TDQS

C2.7/5.0

Scored across 25 tools

Disambiguation2/5

The base episode/transcript/search tools are distinct, but the workflow surface is crowded: run_research_workflow and the four run_*_workflow variants, plus two query_verified_research_report_* tools, have highly similar names and only subtle distinctions. An agent would likely struggle to select the correct workflow tool without very careful reading.

Naming Consistency4/5

Tool names overwhelmingly follow a snake_case verb_noun pattern and form a recognizable family. Minor inconsistencies like summarize_episode_extractive vs semantic_summarize_episode, and some very long workflow names with awkward modifier placement, keep it from being perfectly consistent.

Tool Count3/5

25 tools sits at the high end of the heavy-but-acceptable range. The core ingestion operations are well represented, but the many workflow/report variants make the count feel bloated for a server named 'Podcast Ingestion Core'.

Completeness4/5

The tool set covers the core ingestion lifecycle well: list/get, download, transcribe, summarize, extract mentions, search, validate, cache rebuild, and extended X/YouTube ingestion and report workflows. Notable minor gaps are the lack of a direct transcript retrieval tool and no delete/update artifact operations, but agents can work around these.

Maintenance

ActivitySlowing
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers