Skip to main content
Glama
norton77930

Podcast Ingestion Core MCP Server

by norton77930

Podcast Ingestion Core

Spec034 Task #77 현재 터미널은 startup/plugin closed; credential_provider BLOCKED; overall BLOCKED 상태입니다. H2로 고정된 정확히 20개 파일의 공식 NousResearch/hermes-agent 번들은 정적/오프라인 전용입니다. startup 순서와 고정된 security-guidance 플러그인 identity chain은 닫혀 있고, credential/provider 구성 데이터 흐름, 전체 프로그램 폐쇄(whole-program closure), 동적/사용자/프로젝트/엔트리포인트 플러그인 경로, 런타임/시크릿 엣지, 실제 활성화는 여전히 차단되었거나 관찰되지 않았습니다. runtime_status=not_run; live_actions_authorized=false. 새로 만든 review 전용 bootstrap/final trust chain은 두 review가 모두 PASS된 후 Main을 위해 예약되어 있으며 아직 실행되지 않았습니다.

Podcast Ingestion Core는 범용 Podcast 수집 코어입니다. 현재 RSS episode listing, episode lookup, 오디오 다운로드, 로컬 faster-whisper 전사, transcript validation, 결정적 추출형 Markdown 요약, OpenAI 호환 LLM semantic summary pipeline, 결정적 mention 추출, SQLite metadata cache / search, 그리고 동일한 FastMCP 인스턴스를 공유하는 로컬 stdio 및 loopback Streamable HTTP sidecar가 완성되어 있습니다. Hermes direct MCP/config/Skills 연동은 작동 가능합니다. Spec 026의 C6 before/after metadata/content endpoint equality는 required reviewers와 유일한 live v2 run에서 PASS-current로 검증되었으며, snapshots 사이에 transient mutation이 없다고 주장하지 않습니다. C7은 여전히 안전한 runtime evidence가 부족합니다. v0.20.0 태그 v2026.8.3 hooks는 단지 후보일 뿐이며, 전체 상태는 Blocked로 유지됩니다. Web UI, 스케줄링, embedding 및 vector search는 아직 구현되지 않았습니다.

첫 번째 podcast profile은 Gooaye 股癌이지만, 코어 프로그램은 股癌을 하드코딩해서는 안 됩니다. 모든 podcast별 설정은 config/podcasts.yaml에 있습니다.

AI Agent Handoff / 시작 위치

이 README는 빠른 오리엔테이션(디렉터리 구조, CLI 예제, phase history)이며, 완전한 governance 소스는 아닙니다. 새로 투입되는 AI agent나 개발자는 여기서 시작하세요:

Related MCP server: Podcast Index MCP Server

프로젝트 목표

  • 동일한 core functions 세트로 여러 Podcast를 지원한다.

  • CLI scripts는 인자 파싱과 core functions 호출만 담당하게 한다.

  • 핵심 기능을 향후 MCP tools로 직접 감쌀 수 있게 한다.

  • 모든 출력 파일은 data/에 두고, 결정적(deterministic) 이름을 사용해 도구가 쉽게 찾을 수 있게 한다.

디렉터리 구조

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/

Core Functions

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는 OpenAI 호환 API를 사용해 의미론적 요약을 생성하며, 중요한 판단에는 가능한 한 timestamp evidence를 첨부해야 하고 투자 조언을 구성하지 않습니다. extract_mentions는 결정적 규칙을 사용해 transcript segments에서 mentions를 추출하며, 각 mention은 timestamp evidence를 유지합니다. generate_episode_intelligence_report는 결정적 규칙을 사용해 기존 transcript와 mentions artifact에서 단일 에피소드 intelligence report를 생성하며, LLM을 호출하지 않고 외부 시장 데이터를 조회하지 않으며 주식 매핑이나 투자 조언을 생성하지 않습니다. generate_industry_chain_mapping은 로컬 결정적 mapping config를 사용해 기존 episode intelligence report에서 산업 체인 노드와 주식 후보를 생성하며, podcast의 명시적 evidence와 inferred / needs-verification 연구 단서를 명확히 구분합니다. generate_external_data_boundary는 로컬 boundary config를 사용해 기존 industry mapping에서 외부 데이터 검증 경계 scaffold를 생성하며, 외부 provider를 호출하지 않고 API key를 읽지 않으며 시장 현황 사실을 생성하지 않습니다. verify_external_data_boundary는 Phase 6M fixture provider scaffold입니다. dry-run 우선이며, confirm=True일 때만 로컬 fixture를 사용해 기존 external boundary를 업데이트하려 시도합니다. confirm guard가 있고, live market API가 없으며, MCP tool 변경이 없고, 투자 조언을 제공하지 않습니다. load_gooaye_lens_model은 로컬 Gooaye Lens 분석 프레임워크만 로드하고 검증하며, 주식 보고서를 생성하지 않고 LLM을 호출하지 않으며 외부 시장 데이터를 조회하지 않습니다. generate_stock_lens_report는 podcast 전체 로컬 artifacts와 Gooaye Lens를 사용해 주식/회사 연구 프레임워크를 생성하며, LLM을 호출하지 않고 외부 시장 데이터를 조회하지 않으며 매수/매도 조언, 목표가 또는 보장 수익을 제공하지 않습니다. generate_stock_lens_synthesis_report는 Phase 6J Stock Lens LLM Synthesis입니다. dry-run 우선이며, 기본 LLM input boundary는 6F stock lens JSON 전용이고, confirmed execution은 정확한 api_cost_ack를 제공해야 합니다. Phase 6V에서는 검토된 semantic summary context를 명시적으로 opt in할 수 있지만, 여전히 raw transcript를 읽지 않고 외부 시장 데이터를 조회하지 않으며 MCP tool 변경이 없고 매수/매도 조언을 제공하지 않습니다. run_research_workflow는 dry-run 우선의 로컬 research workflow runner로, mentions, episode intelligence, industry mapping, external boundary 및 선택적 stock lens를 연결합니다. Phase 6I는 research workflow 내부에서 선택적 semantic summary 실행을 지원하고, Phase 6K는 workflow opt-in synthesis를 지원하며, include_stock_lens_synthesis=True를 사용해 Phase 6J synthesis를 stock lens report 뒤에 연결할 수 있습니다. Phase 6N은 선택적 workflow fixture verification을 지원하며, include_external_data_verification=True를 사용해 external boundary 뒤에 로컬 fixture provider로 외부 검증 상태를 업데이트할 수 있습니다. 이 단계는 live market API가 없고, API key가 없고, MCP tool 변경이 없고, 자동 cache rebuild가 없으며, 투자 조언을 제공하지 않습니다. generate_corpus_index는 로컬 per-episode artifacts와 semantic review metadata만 스캔하여 결정적 corpus status JSON/Markdown을 작성합니다. RSS를 읽지 않고 SQLite cache를 읽지 않으며 LLM을 호출하지 않고 .env를 읽지 않으며 MCP tool을 추가하지 않고 raw transcript/evidence/semantic body를 출력하지 않습니다. generate_corpus_remediation_plan은 먼저 corpus index를 새로 고친 다음, 로컬 status metadata에서 full-ladder 격차, blockers, warnings 및 manual-only action 텍스트를 도출하여 결정적 remediation JSON/Markdown을 작성합니다. 다운로드, 전사, 요약, workflow, LLM, MCP 또는 cache rebuild를 실행하지 않으며 raw transcript/evidence/semantic body/prompt/raw LLM output을 출력하지 않습니다. run_corpus_audio_download는 먼저 remediation plan을 새로 고치고, dry-run은 audio missing이고 action ready인 후보 metadata만 반환하며 RSS를 읽지 않고 network/downloader를 호출하지 않으며 run report를 작성하지 않습니다. confirmed execution은 단일 에피소드를 지정해야 하며, 그때만 기존 download_audio()를 호출하고 최신 결정적 audio download run report를 작성합니다. 이 report에는 source URL, query string, secret 또는 traceback이 포함되지 않습니다. run_corpus_remediation은 먼저 remediation plan을 새로 고치고, dry-run은 selected/skipped/blocked/excluded metadata만 반환합니다. confirmed execution은 에피소드 또는 action family를 지정해야 하며, transcript-ready 결정적 families(extractive summary, mentions, episode intelligence, industry mapping, external boundary)만 실행하고 최신 결정적 run report를 작성합니다. run_corpus_local_transcription은 먼저 remediation plan을 새로 고치고, dry-run은 로컬 audio available이고 transcript missing인 후보 metadata만 반환합니다. confirmed execution은 단일 에피소드를 지정해야 하며, 명시적 로컬 audio_path만 사용해 기존 전사 코어를 호출하고 오디오를 다운로드하지 않으며 corrupt/partial transcript를 수리하지 않고 LLM/MCP/cache rebuild를 건드리지 않으며 최신 결정적 local transcription run report를 작성합니다. run_corpus_episode_workflow는 새 에피소드를 위한 dry-run-first 안전 진입점입니다. intake, audio download, local transcription, deterministic remediation의 다음 safe stage를 순서대로 판단합니다. dry-run은 workflow report를 작성하지 않고 stage를 실행하지 않으며, confirmed execution은 stage="next"를 사용해야 하고 단 하나의 stage만 실행하며 최신 결정적 workflow run report를 작성합니다. LLM 단계는 모두 confirm=True이고 정확한 api_cost_ack를 제공해야 외부 LLM을 호출합니다. 이 workflow는 여전히 외부 시장 데이터를 조회하지 않고, stock lens synthesis에 raw transcript를 사용하지 않으며, MCP tool 변경이 없고, cache를 자동으로 rebuild하지 않습니다. rebuild_cache는 기존 artifacts만 인덱싱하며, 자동으로 다운로드, 전사, 요약, mentions 추출, 연구 보고서 생성, mapping 생성, external boundary 생성 또는 stock lens report 생성을 하지 않습니다.

014 안정화의 정확한 계약: confirm=False는 strict zero-file이며, 구성된 podcast RSS feed와 로컬 artifacts를 읽는 것 외에는 어떤 파일도 생성, 수정 또는 삭제하지 않습니다. seeded selection은 메모리 내 index/plan snapshot 하나만 만들고 012/011/010을 순서대로 preview합니다. 이는 standalone 010/011/012 dry-run이 의도적으로 유지하는 fresh 008/009 persistence 동작과 다릅니다.

run_corpus_semantic_remediation(...)은 standalone, single-episode 015 semantic remediation Core입니다. 각 유효한 요청은 정확히 하나의 fresh in-memory 008/009 snapshot만 만들고, 먼저 명시적 canonical episode를 격리한 다음 semantic_summary, semantic_review, completed 또는 blocked/manual-only를 선택합니다. 010이나 014를 호출하지 않습니다. Dry-run은 strict zero-file이며 profile, .env, credential 또는 provider를 해석하지 않습니다. Confirmed semantic_summary는 명시적 action이어야 하고 before profile / .env / provider construction에서 정확한 api_cost_ack를 검증해야 합니다. confirmed semantic_review는 결정적이며 LLM 설정을 전혀 읽지 않습니다. 각 confirmed run은 최대 하나의 executor를 호출하고 confirmed-only 최신 JSON/Markdown report(no generated_at)를 작성하며 index, plan 또는 SQLite cache를 rebuild하지 않고 MCP tool을 추가하지 않습니다. 당시 registry는 정확히 12개 tools를 유지합니다.

run_corpus_episode_completion_workflow(...)은 016의 single-episode completion Core입니다. dry-run은 strict zero-file로 intake부터 semantic review까지의 다음 action을 판단합니다. 인간 확인 후에만 canonical episode에 대해 명시적으로 일치하는 action 하나를 실행하고 중지합니다. stdio MCP의 동일한 이름 run_corpus_episode_completion_workflow tool은 이 preview → human approval → one action 경계를 유지하며, .env를 읽지 않고 cache를 자동으로 rebuild하지 않으며 투자 조언을 제공하지 않습니다.

run_corpus_latest_episode_deterministic_workflow(...)은 017의 one-request latest-episode Core입니다. dry-run은 현재 latest만 해석하고 strict-zero-file 결정적 처리 계획을 반환합니다. SPEC 017은 구현되었습니다. 2026-07-17의 seeded/downloaded child-outcome 매핑 문제는 해결된 과거 blocker입니다. 기록된 metadata-only confirmed EP679 evidence는 outcome=ready_for_semantic_summary, ready_count=1, blocked_count=0, failed_count=0으로 끝납니다. 계약은 시작 시 하나의 canonical episode를 고정하고, intake, 다운로드, 로컬 전사 및 필요한 결정적 remediation을 처리하며, 실패/차단된 stage에서 fail closed하고 .env, provider, semantic summary/review, retry 또는 cache rebuild 없이 ready_for_semantic_summary에서 중지합니다.

run_latest_episode_verified_research_report_workflow(...)은 SPEC 018의 latest-episode verified research report Core입니다. 기본 confirm=False는 latest를 한 번만 해석하고 strict-zero-file preview를 반환하며 checkpoint, staging 또는 report bundle을 만들지 않습니다. confirmed request는 RSS, 환경/provider, writer 및 child stage 전에 preview에서 얻은 정확한 expected_episode_ref와 완전히 동일한 api_cost_ack를 제공해야 합니다. 고정된 017 결정적 ladder를 재사용하고, semantic summary/review의 정확한 passed gate 이후 고정된 안전한 research options로 결정적 JSON, Markdown 및 manifest bundle을 만듭니다. bundle은 content digest version, atomic directory publish, identical-content reuse 및 conflict fail-closed를 사용합니다. cache를 자동으로 rebuild하지 않고 live market API를 조회하지 않으며 투자 조언을 구성하지 않습니다.

run_episode_verified_research_report_workflow(...)은 SPEC 019의 explicit-episode verified research report Core입니다. 명시적 episode_ref(과거 에피소드 가능, latest/next 거부)를 요구하며, preview는 로컬 readiness만 확인하고 파일을 전혀 쓰지 않습니다. confirm은 lineage와 review가 통과된 경우에만 018과 동등한 digest bundle을 assemble/publish하며, api_cost_ack가 필요 없고 LLM/RSS/download를 호출하지 않으며 015–017을 연결하지 않습니다. 누락된 항목이 있으면 blocked를 반환하고 missing/stale roles를 나열합니다.

SPEC 020은 list_verified_research_reports(...), search_verified_research_reports(...) 및 inspect_verified_research_report(...)의 오프라인 읽기 전용 manifest-first catalog seams를 제공합니다. 안전한 manifest 파생 metadata를 나열, 검색하거나 정확한 bundle의 로컬 self-consistency를 검사합니다. body search를 하지 않고 raw manifest나 absolute paths를 반환하지 않으며 내보내지 않고 DB/FTS/vector/cache를 사용하지 않으며 network/LLM을 사용하지 않고 source latest/currentness를 주장하지 않습니다. Inspect는 항상 source_currentness_status=not_evaluated를 반환합니다.

SPEC 022는 list_verified_research_report_coverage(podcast_id, *, has_bundle=None, limit=50)을 제공합니다. 정확한 podcast로 로컬 inventory × verified-report bundle의 episode 중심 coverage join을 수행하며, 선택적으로 bundle이 없거나 이미 있는 에피소드만 나열할 수 있습니다. offline / zero-write / report body를 읽지 않으며 source revalidation이나 currentness 주장을 하지 않습니다.

validate_transcript는 전사본이 완전한지, 비어 있는지, 부분 완료인지, 누락되었는지 또는 손상되었는지 확인하는 데 사용할 수 있습니다.

run_corpus_episode_intake는 dry-run first RSS episode bootstrap runner입니다. dry-run은 latest 또는 단일 명시적 episode selector를 해석할 수 있지만 파일을 쓰지 않고 다운로드하지 않으며 전사하지 않고 LLM/MCP/cache를 건드리지 않습니다. confirmed execution은 안전한 seed metadata와 최신 결정적 intake report만 작성하여 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

  • 트랜스크립트 metadata: 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과 podcast profile의 default_episode_prefix로 해석됩니다(예: EP672). 파일명 title slug는 Windows에서 허용되지 않는 문자, 제어 문자, emoji 및 고위험 기호를 제거합니다.

CLI 예시

podcast-level corpus status index 생성:

python scripts/generate_corpus_index.py --podcast gooaye

이 CLI는 로컬 per-episode artifacts만 읽고 data/corpus/{podcast_id}/corpus-index.json 및 .md를 다시 씁니다. stdout은 출력 경로, episode count, warning count 및 artifact family counts를 포함하는 metadata-only JSON입니다. transcript 원문, evidence snippet, semantic summary body, prompt, raw LLM output, API key 또는 provider secret은 포함하지 않습니다.

podcast-level 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은 출력 경로, episode count, warning count, action count, blocked/optional/gated action counts를 포함하는 metadata-only JSON입니다. remediation action을 실행하지 않으며, RSS/SQLite cache/.env를 읽지 않고, network/LLM/MCP를 호출하지 않으며, transcript/evidence/semantic body/prompt/raw LLM output 또는 secret을 출력하지 않습니다.

Preview 또는 confirmed 단일 에피소드 audio download 실행:

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을 새로 고칩니다. 따라서 standalone dry-run도 fresh corpus index와 remediation plan을 영속화합니다. 기본 dry-run은 stdout에 metadata-only JSON만 반환하며, RSS를 읽지 않고, network/downloader를 호출하지 않으며, corpus-audio-download-run.json/.md를 쓰지 않고, audio를 쓰지 않습니다. --confirm은 단일 --episode와 함께 사용해야 하며, audio status가 missing이고 audio action이 ready인 경우에만 기존 download_audio()를 호출합니다. Confirmed run은 최신 data/corpus/{podcast_id}/corpus-audio-download-run.json 및 .md를 씁니다. 내용에는 timestamp, source URL/query string/secret/traceback이 없으며 투자 조언을 제공하지 않습니다. audio를 쓰거나 재사용한 후에는 transcription, downstream remediation 및 cache rebuild가 여전히 수동으로 실행되어야 한다는 점만 안내합니다.

Preview 또는 confirmed deterministic corpus 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을 새로 고칩니다. 따라서 standalone dry-run도 fresh corpus index와 remediation plan을 영속화합니다. 기본 dry-run은 stdout에 metadata-only JSON만 반환하며, corpus-remediation-run.json/.md를 쓰지 않고 artifact generator를 실행하지 않습니다. --confirm은 --episode 또는 --action-family와 함께 사용해야 하며, 기존 deterministic core functions만 호출하고 scripts로 shell out하지 않습니다. v1은 download, transcribe, semantic summary/review, stock-lens, LLM, RSS/network, SQLite cache rebuild, .env 또는 MCP를 실행하지 않습니다. Confirmed run은 최신 data/corpus/{podcast_id}/corpus-remediation-run.json 및 .md를 씁니다. 내용에는 timestamp, raw transcript/evidence/semantic body/prompt/raw LLM output/secret이 없으며 투자 조언을 제공하지 않습니다.

Preview 또는 confirmed 단일 에피소드 로컬 transcription 실행:

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을 새로 고칩니다. 따라서 standalone dry-run도 fresh corpus index와 remediation plan을 영속화합니다. 기본 dry-run은 stdout에 metadata-only JSON만 반환하며, corpus-local-transcription-run.json/.md를 쓰지 않고, transcript를 쓰지 않고, Whisper model을 로드하지 않고, audio 파일을 다운로드하지 않습니다. --confirm은 단일 --episode와 함께 사용해야 하며, 로컬 audio path가 존재하고 transcript status가 missing인 경우에만 기존 transcribe_episode()를 호출하고 audio_path와 force=False를 명시적으로 전달합니다. Confirmed run은 최신 data/corpus/{podcast_id}/corpus-local-transcription-run.json 및 .md를 씁니다. 내용에는 timestamp, raw transcript/prompt/raw LLM output/secret/traceback이 없으며 투자 조언을 제공하지 않습니다. transcript를 쓴 후에는 cache가 stale일 수 있다는 점만 안내하고 cache를 자동으로 rebuild하지 않습니다.

Preview 또는 confirmed fresh episode workflow의 다음 safe stage 실행:

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

이 CLI의 014 dry-run은 strict zero-file입니다. 013은 configured RSS parsing selector를 읽을 수 있습니다. seed가 있으면 fresh in-memory corpus index/plan snapshot을 한 번만 만들고 동일한 snapshot으로 012/011/010을 preview합니다. seed, audio, transcript, index, plan, 010-014 reports, downstream artifacts 또는 .part를 생성, 수정 또는 삭제하지 않습니다. planned reads에는 안전한 로컬 dependency paths가 포함될 수 있으며, non-path 값은 두 개의 exact labels만 허용됩니다. Confirmed execution은 반드시 --stage next --confirm을 명시해야 하며, 매번 기존 public runner 하나만 dispatch합니다. 해당 runner는 원래 계약에 따라 index/plan을 새로 고치고 selected-stage artifacts를 쓸 수 있으며, 014는 결과를 기록한 후 중지하고 최신 workflow report를 씁니다. semantic/LLM/stock-lens/MCP/cache rebuild/batch 작업은 여전히 manual follow-up으로만 나열되며 자동으로 실행되지 않습니다.

Preview 또는 confirmed 단일 에피소드 semantic remediation 실행:

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는 metadata만 반환하고 strict zero-file입니다. Confirmed summary의 exact api_cost_ack은 profile, .env, credential 및 provider construction보다 먼저 이루어져야 합니다. review는 acknowledgement가 필요 없으며 profile/.env를 resolve하거나 LLM을 호출하지 않습니다. Validated confirmed attempt는 corpus-semantic-remediation-run.json/.md를 씁니다. 내용에는 generated_at, transcript/semantic/prompt/raw response/base URL/secret/traceback이 없습니다. index, plan 및 cache는 stale일 수 있으므로 수동으로 새로 고쳐야 합니다.

Preview 또는 사용자의 명시적 확인 후 단일 에피소드 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."

016 dry-run은 strict zero-file입니다. seed가 있으면 메모리에 fresh 008/009 snapshot을 하나만 만들고 순서대로 intake, audio download, local transcription, deterministic remediation, semantic summary 또는 semantic review의 다음 safe action을 선택합니다. confirmed는 dry-run이 반환한 canonical episode와 동일한 explicit action을 사용해야 합니다. next, latest 또는 stale action은 거부되며, 매번 기존 runner 하나만 dispatch한 후 중지합니다. semantic summary의 exact ack은 profile/.env/provider 작업 전에 완료되어야 합니다. semantic review는 LLM 설정을 읽지 않습니다. 유효한 confirmed attempt만 data/corpus/{podcast_id}/corpus-episode-completion-workflow-run.json 및 .md를 원자적으로 쓰며, index, plan 또는 SQLite cache를 자동으로 새로 고치지 않습니다.

Agent가 조작하는 경우 동일한 이름의 MCP tool run_corpus_episode_completion_workflow와 repository의 portable corpus-episode-completion Skill을 사용합니다. 먼저 preview하고, 위험을 설명하고, canonical action에 대한 인간의 명시적 동의를 기다린 다음, action 하나를 실행하고 중지합니다. MCP가 없으면 CLI, terminal, scheduler 또는 자동 재시도를 사용해서는 안 됩니다.

Preview 또는 controlled confirmed 최신 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 최신 에피소드 처리해줘"와 같은 명시적 요청을 받으면 corpus-latest-episode-processing Skill은 해당 explicit natural-language request를 한 번의 execution authorization으로 간주합니다. 한 번 acknowledge하고, confirm=true로 dedicated run_corpus_latest_episode_deterministic_workflow MCP tool을 한 번만 호출하고, metadata-only result를 한 번 보고한 후 중지합니다. MCP tool 자체는 여전히 기본적으로 confirm=false dry-run입니다. Skill은 preview하지 말고, second call도 하지 말며, CLI/terminal fallback, scheduling, batch, retry, cache rebuild 또는 semantic summary/review를 사용해서는 안 됩니다.

Preview 최신 verified research report workflow:

python scripts/run_latest_episode_verified_research_report_workflow.py --podcast gooaye

SPEC 018의 preview는 strict zero-write이며 canonical episode reference와 exact required acknowledgement를 반환합니다. 사용자가 해당 previewed episode에 명시적으로 동의한 경우에만 동일한 --expected-episode-ref와 exact --api-cost-ack으로 --confirm을 한 번 실행합니다. 확인은 RSS, environment/provider, writer 또는 child stage 이전에 이루어져야 합니다. workflow는 pinned deterministic ladder를 재사용하고 semantic review exact passed를 요구한 다음 고정된 안전한 options로 deterministic research를 완료합니다. 완료 후 source digest version의 report.json, report.md 및 manifest.json을 원자적으로 게시하고, identical bundle reuse, conflict fail-closed를 적용합니다. retry, scheduler, live market API 또는 cache rebuild를 하지 않으며 투자 조언을 구성하지 않습니다.

offline read-only verified research report catalog 조회(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>

이 세 개의 subcommands는 canonical 로컬 data/research-reports manifest-first bundles만 읽습니다. list는 exact filters를 사용할 수 있고, search는 safe metadata만 검색하며, inspect는 하나의 exact bundle의 로컬 self-consistency만 검증합니다. report/transcript body를 검색하지 않고, raw manifest/absolute paths를 반환하지 않으며, export를 제공하지 않고, DB/FTS/vector/cache, RSS/HTTP/network, LLM, .env, download, transcription 또는 remediation을 사용하지 않습니다. latest selector를 허용하지 않으며 source latest/currentness claim을 하지 않습니다. inspect는 source_currentness_status=not_evaluated로 고정합니다. 경계 약어: no raw manifest; no DB/FTS/vector/cache; no RSS/HTTP/LLM/.env/download/transcription/remediation; no latest selector.

episode-centric verified research report coverage 조회(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

로컬 inventory와 canonical bundles를 join합니다. report가 없는 에피소드 또는 이미 digest가 있는 에피소드를 찾습니다. offline / zero-write / report body를 읽지 않습니다. 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 transcription은 먼저 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 process가 남아 있으면 해당 process를 수동으로 중지한 후 다시 실행하세요.

deterministic 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만 읽으며 자동으로 다운로드하거나 transcribe하지 않습니다. 지정된 에피소드에 transcript가 없으면 CLI는 transcript missing을 보고합니다. transcript가 partial이면 summary는 기본적으로 거부합니다. 그래도 생성하려면 --allow-partial을 추가할 수 있습니다.

LLM semantic summary를 생성하려면 API key와 model이 필요합니다. 수동 테스트에는 로컬 .env를 권장합니다. 이 파일은 .gitignore에 의해 무시되며 commit할 수 없습니다:

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을 실행하고, transcript를 기본 600초와 chunk당 120 segments 단위로 나누어 provider에 전송합니다. LLM 지향 CLI는 기본적으로 .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는 semantic summary smoke validation을 보강합니다. 이 경로는 confirmed execution에서 transcript text를 이 머신 외부로 전송하며, dry-run은 planned reads/writes, transcript 전송 위험, 비용 위험, 필수 확인 사항만 나열하고 LLM을 호출하지 않으며, artifact를 쓰지 않고, 대본 내용을 출력하지 않습니다. Confirmed semantic summary smoke와 직접 --mode semantic CLI 모두 정확한 api_cost_ack를 제공해야 합니다. CLI stdout은 raw transcript를 출력하지 않으며 secret 값을 표시하지 않습니다. 이 단계에서는 MCP tool 변경, 라이브 시장 API, 자동 캐시 재구축, 투자 조언이 없습니다.

Phase 6U.1은 semantic review guard 오탐지를 수정합니다. semantic summary review는 팟캐스트 콘텐츠에서 화자가 과거에 매수/보유했다는 transcript 파생 설명은 허용하지만, 직접적인 매수/매도/보유, 매수 권고, 목표가, 수익 보장은 계속 거부합니다. Confirmed semantic smoke에도 stderr 진행률이 추가되며, stdout은 계속 JSON을 유지하고, 진행률에 raw transcript, 프롬프트, API key, LLM 응답을 출력하지 않습니다. Phase 6V는 stock lens 합성에 선택적 검토 semantic 컨텍스트를 추가합니다. 기본 합성은 phase-6f-stock-lens-json-only로 유지되며 .semantic.md를 읽지 않습니다. --include-semantic-context로 명시적으로 활성화하면, 합성에는 최신 통과 검토 보고서가 있는 일치하는 에피소드 semantic 요약만 포함될 수 있으며, 입력 경계는 phase-6f-stock-lens-json-plus-reviewed-semantic-summary가 됩니다. 이 컨텍스트는 ## Chunk Summaries를 제외하고, raw transcript 텍스트를 읽지 않으며, .env를 읽지 않고, 라이브 시장 데이터를 가져오지 않으며, MCP tool 변경도 없습니다. 검토된 semantic summary 컨텍스트는 LLM 중간 artifact이지 팟캐스트 원본 증거나 외부 시장 사실이 아닙니다. Phase 6V.1은 결정적 검토 게이트를 경계/컨텍스트 일관성에 맞춥니다. JSON 전용 합성에는 semantic 컨텍스트가 없어야 하며, 검토된 semantic 합성에는 비어 있지 않고 검토를 통과한 semantic 컨텍스트가 포함되어야 합니다.

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 profile은 config/llm_profiles.yaml에 저장할 수 있으며, provider, model, base URL, API key 환경 변수 이름만 저장하고 API key 값은 저장하지 않습니다. 작업 중인 pro4500 profile은 api_key_env=API_KEY를 사용하므로 .env의 API_KEY=...와 함께 사용할 수 있습니다. 커밋된 gb10 profile은 unavailable로 표시되어 있으며, 로드 시 실패하고 pro4500 사용을 안내합니다. YAML에 API key, token, secret을 쓰지 마십시오.

결정적 멘션 추출:

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 추출은 LLM을 사용하지 않으며 완전한 의미 이해를 의미하지 않고, 결정적 규칙에 따라 transcript segments에서 회사, 티커, 산업, 매크로 주제, 암호화폐, 장소 등의 멘션을 스캔합니다. 각 멘션에는 timestamp evidence가 첨부되며 투자 조언을 구성하지 않습니다. Phase 3 캐시는 멘션을 SQLite로 가져와 기본적인 에피소드 간 쿼리를 제공할 수 있습니다. 향후 MCP 도구가 이러한 핵심 함수를 직접 래핑할 수 있습니다.

결정적 에피소드 인텔리전스 리포트 생성:

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

에피소드 인텔리전스 리포트는 기존 transcript와 mentions artifact만 읽으며, 자동 다운로드, 전사, 요약, 멘션 추출, LLM 호출, 외부 시장 데이터 조회를 하지 않습니다. mentions artifact가 없어도 리포트는 생성되지만 source warning이 표시되고 mention 파생 섹션은 비어 있습니다. 부분 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

산업 매핑은 기존 에피소드 인텔리전스 리포트와 config/industry_chain_mappings.yaml만 읽으며 LLM을 호출하거나 외부 시장 데이터를 조회하지 않습니다. podcast_explicit은 팟캐스트 증거에 명시적으로 언급되었음을 의미하고, inferred_from_industry는 로컬 매핑 설정에서 추론된 미검증 연구 단서일 뿐이며 기본적으로 needs_verification으로 표시되며, 주식 고밤(Gooaye)이 명시적으로 언급했음을 의미하지 않으며 투자 조언을 구성하지 않습니다.

외부 시장 데이터 경계 스캐폴드 생성:

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

외부 데이터 경계는 기존 산업 매핑과 config/external_data_boundary.yaml만 읽으며, 외부 시장 데이터 제공자를 호출하지 않고, API key를 읽지 않으며, 가격, 시가총액, 재무제표, 뉴스, 회사 현황 사실을 생성하지 않습니다. 각 후보에는 external_verification_status=not_requested, source_status=not_fetched, data_date=null이 표시되고 이후 검증이 필요한 외부 데이터 유형이 나열됩니다.

로컬 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은 artifacts를 쓰지 않습니다. --confirm은 confirm guard이며, 확인 후 로컬 config/external_market_data_fixtures.yaml 또는 지정된 fixture 경로만 읽고 company_name / ticker를 정확히 일치시켜 기존 .external-boundary.json/.md를 업데이트합니다. 이 단계에서는 라이브 시장 API가 없고, API key를 읽지 않으며, MCP 도구를 추가하지 않고, 리서치 워크플로우에 연결하지 않으며, no investment advice 외의 어떤 시장 조언도 제공하지 않습니다.

Gooaye Lens 모델 확인:

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

Gooaye Lens 모델은 Phase 6F stock lens 리포트의 결정적 분석 프레임워크 소스로, 산업 사슬 위치, 수급 및 재고, 경기 사이클, 금리 및 밸류에이션 민감도, 자본 지출 및 생산 능력, 지정학 및 불확실성 등의 차원을 정의합니다. Phase 6E는 로컬 설정만 로드하고 검증하며, 주식 입력을 받지 않고, artifacts를 쓰지 않으며, LLM을 호출하지 않고, 외부 시장 데이터를 조회하지 않으며, 매매 조언, 목표가, 수익 보장을 생성하지 않습니다.

팟캐스트 전반의 결정적 stock lens 리포트 생성:

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 리포트는 해당 팟캐스트의 기존 data/mappings/ 및 data/external/ artifacts를 스캔하여 후보의 company_name 및 tickers를 보수적으로 비교합니다. podcast_explicit은 직접 팟캐스트 증거로 나열되고, inferred_from_industry는 검증 필요 연구 단서로만 나열되며 팟캐스트가 명시적으로 언급했음을 의미하지 않습니다. 직접 팟캐스트 증거가 없어도 리포트는 생성되며 no-direct-podcast-evidence로 명확히 표시됩니다. 이 단계에서는 LLM을 호출하지 않고, 외부 시장 데이터를 조회하지 않으며, API key를 읽지 않고, MCP 도구를 추가하지 않으며, 매매 조언, 목표가, 수익 보장을 제공하지 않습니다.

Phase 6J Stock Lens LLM 합성 생성:

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 합성은 기본적으로 dry-run이며 planned reads/writes, LLM API/비용 위험, 필수 확인 사항만 나열하고 API key를 읽지 않고, LLM을 호출하지 않으며, artifacts를 쓰지 않습니다. Confirmed execution은 6F stock lens JSON 전용의 간결한 증거, lens 차원, 외부 경계 상태, 경고만 LLM에 전달합니다. raw transcript, .semantic.md 입력, 외부 시장 데이터 조회, MCP 도구 변경, run_research_workflow 연결이 없습니다. LLM 출력에 buy/sell/hold, 목표가, 수익 보장 등의 투자 조언 문구가 포함되면 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 호환 smoke 및 Codex 수동 검토 하네스입니다. 실제 LLM 호출은 여전히 OpenAI 호환 /chat/completions를 사용합니다. 현재 직접적인 Codex-session 백엔드는 없으며 Codex는 수동 검토자가 artifacts, 프롬프트 경계, 품질을 검사하는 데만 사용됩니다. Smoke는 기본적으로 stock lens 합성을 실행하고 fixture 외부 검증을 활성화합니다. semantic summary는 transcript 텍스트를 전송하므로 명시적으로 --include-semantic-summary를 추가해야 합니다. 이 단계에서는 라이브 시장 데이터가 없고, MCP 도구를 추가하지 않으며, 투자 조언 경계를 변경하지 않고, 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 로더를 추가하며, LLM 지향 CLI는 기본적으로 .env의 API_KEY, MODEL, BASE_URL을 읽고 JSON 메타데이터에 로드된 env var 이름만 표시하고 값을 표시하지 않습니다. 공급자 응답을 진단하려면 --debug-llm-output를 추가할 수 있으며, raw LLM 출력은 .gitignore에 의해 무시되는 evals/research-llm-smoke/raw/에만 기록되며 공식 artifact가 되지 않습니다. Phase 6T는 결정적 검토 리포트/품질 게이트를 추가합니다. Confirmed smoke 후 다음 명령으로 타임스탬프가 있는 검토 리포트를 생성할 수 있습니다. 기존 artifacts만 읽으며 LLM 호출, .env 읽기, 외부 시장 데이터가 없고 synthesis artifacts를 다시 쓰지 않습니다.

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

LLM smoke 문서 및 검토 템플릿:

Phase 6U semantic summary smoke 검증:

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 또는 실행:

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

리서치 워크플로우는 먼저 dry-run을 수행하여 planned reads/writes, 단계 순서, semantic LLM 외부 API 위험, 캐시 오래됨 위험, 확인 상태를 나열합니다. 기본적으로 extract_mentions, generate_episode_intelligence_report, generate_industry_chain_mapping, generate_external_data_boundary의 로컬 결정적 단계만 실행하며 --stock이 제공되면 stock lens 리포트를 생성합니다. Phase 6I는 --include-semantic-summary로 옵트인할 수 있고, Phase 6K는 --include-stock-lens-synthesis로 옵트인하여 stock lens 리포트 뒤에 stock lens 합성을 배치할 수 있습니다. Phase 6N은 --include-external-data-verification으로 옵트인하여 external boundary 뒤, stock lens 리포트 앞에 fixture 검증을 배치할 수 있습니다. 이 단계는 --external-data-provider fixture만 지원하며 로컬 fixture만 읽고 라이브 시장 API를 조회하지 않으며 API key를 읽지 않습니다. Dry-run은 semantic/synthesis/fixture 계획과 필수 확인 사항만 나열하며, confirmed execution에서 LLM 단계만 정확한 --api-cost-ack를 제공해야 합니다. Stock lens 합성에는 --stock이 필요하며 기본적으로 6F stock lens JSON만 사용합니다. Phase 6V는 --include-semantic-context / --include-semantic-context-in-synthesis로 검토된 semantic 컨텍스트를 옵트인할 수 있으며, 여전히 raw transcript를 읽지 않고 외부 시장 데이터를 조회하지 않습니다. 이 워크플로우는 캐시를 자동으로 재구축하지 않고, MCP 도구를 추가하지 않으며, 투자 조언을 제공하지 않습니다.

SQLite 메타데이터 캐시 재구축 및 검색:

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 캐시는 파생 데이터이므로 삭제 후 재구축할 수 있습니다. 원본 source of truth는 여전히 data/transcripts/, data/summaries/, data/mentions/입니다. Phase 3B는 선택적 SQLite FTS5를 지원합니다. 로컬 SQLite가 FTS5를 지원하지 않거나 쿼리가 중국어 정확한 부분 문자열인 경우 search_transcripts()는 LIKE 폴백을 사용합니다. 검색 결과에는 highlighted_text, 실제 search_mode가 포함되며 --context-segments로 히트 세그먼트 주변 컨텍스트를 가져올 수 있습니다. 이 단계에서는 여전히 embedding, vector search, LLM 검색을 수행하지 않습니다.

로컬 MCP 서버 시작:

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 서버는 공식 Python MCP SDK의 단일 FastMCP 인스턴스를 사용합니다. 로컬 Codex/Claude 클라이언트는 계속 stdio를 사용합니다. Spec 026 승인을 받은 Hermes sidecar는 동일한 레지스트리에서 127.0.0.1:8767/mcp에만 바인딩된 Streamable HTTP를 제공하며 레거시 SSE를 사용하지 않고 포트를 공개하지 않습니다. 읽기/쿼리 도구는 다음과 같습니다:

  • list_episodes

  • get_episode

  • validate_transcript

  • search_transcripts

  • search_mentions

  • rebuild_cache

  • query_verified_research_report_catalog(도구 17, 오프라인 읽기 전용 manifest 우선 목록/검색/검사)

  • revalidate_verified_research_report_sources(도구 18, 정확한 로케이터 오프라인 소스 재검증)

  • query_verified_research_report_coverage(도구 19, 에피소드 중심 오프라인 적용 범위 조인)

  • suggest_historical_verified_report_next_step(도구 20, 과거 다음 단계 제안)

  • list_verified_report_gap_backlog(도구 21, 인벤토리 갭 백로그)

  • generate_stock_lens_report(도구 22, 결정적 stock lens 리포트, 부작용, dry-run 우선)

  • ingest_x_video(도구 23, X 비디오 수집, 미리보기는 쓰기 없음이지만 공개 메타데이터를 읽음)

  • ingest_youtube_video(도구 24, YouTube 비디오 수집, 미리보기는 쓰기 없음이지만 공개 메타데이터를 읽음)

부작용 도구는 다음과 같습니다:

  • 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

로컬 검토 stdio 레지스트리에는 총 24개의 도구가 있습니다. 도구 24 ingest_youtube_video는 추가 전용입니다. 도구 123의 계약/순서는 변경되지 않습니다. 도구 23 ingest_x_video는 여전히 X 수집입니다. 미리보기는 쓰기 없음이지만 공개 메타데이터를 읽으며 코퍼스 러너의 제로 네트워크 dry-run이 아닙니다. 도구 22 generate_stock_lens_report는 여전히 추가 전용 dry-run 우선 stock lens입니다. 부작용, dry-run 우선의 결정적 stock lens 리포트이며 로컬 매핑/경계 artifacts만 읽고 라이브 시장 API, 네트워크, LLM이 없으며 투자 조언을 제공하지 않습니다. 도구 21 list_verified_report_gap_backlog는 추가 전용입니다. 도구 120의 계약/순서는 변경되지 않습니다. 인벤토리 갭 백로그 읽기 쿼리입니다. 도구 20은 여전히 과거 다음 단계 제안입니다. 도구 19는 여전히 에피소드 중심 적용 범위입니다. 도구 18은 여전히 정확한 로케이터 오프라인 소스 재검증입니다. 도구 17은 카탈로그 목록/검색/검사 계약을 유지합니다. 위의 부작용 도구는 기본적으로 confirm=false이며 dry-run 작업 계획만 반환하고 다운로드, 전사, 파일 쓰기를 하지 않습니다. 작업 계획을 확인한 후에만 confirm=true를 사용하십시오. run_corpus_episode_completion_workflow는 미리보기 → 사람 승인 → 명시적 작업 하나를 유지하고, run_corpus_latest_episode_deterministic_workflow는 최신 에피소드의 로컬 결정적 단계만 처리하고 semantic summary 전에 중지합니다. run_latest_episode_verified_research_report_workflow는 먼저 미리보기를 수행해야 하며, 사용자가 동일한 정식 expected_episode_ref와 정확한 api_cost_ack를 제공한 후 confirmed로 한 번만 호출해야 합니다. run_episode_verified_research_report_workflow는 명시적 episode_ref(과거 에피소드 가능)로 준비 미리보기를 수행하고, 확인 후 동일한 다이제스트 번들을 조립/게시만 하며 api_cost_ack가 필요 없고 LLM을 호출하지 않습니다. 모든 부작용 도구는 완료 후 SQLite 캐시를 자동으로 재구축하지 않으며 투자 조언을 제공하지 않습니다. 예:

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 응답은 JSON 봉투를 사용합니다. 성공은 {"ok": true, "data": ...}, 오류는 {"ok": false, "error_type": "...", "message": "..."}입니다. Dry-run 작업 계획은 {"ok": true, "dry_run": true, "requires_confirmation": true, ...}를 반환합니다. 부작용 도구 완료 후 캐시가 자동으로 재구축되지 않습니다. 검색 메타데이터를 업데이트하려면 rebuild_cache를 수동으로 호출하십시오. MCP 검색, 멘션, 요약은 모두 투자 조언을 구성하지 않습니다.

semantic_summarize_episode는 더 엄격한 API 비용 도구입니다. transcript 텍스트를 외부 LLM 공급자에게 전송하므로 API 비용이 발생할 수 있습니다. 따라서 confirm=true 외에도 정확한 확인 문구를 제공해야 합니다:

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

처음에는 confirm=false로 호출하여 dry-run 작업 계획, transcript 검증 미리보기, 청크 설정, 위험을 확인하십시오. 외부 API, 데이터 전송, 비용 위험을 수락하는 경우에만 confirm=true와 정확한 api_cost_ack로 실행하십시오. MCP 응답은 API key를 반환하지 않으며 dry-run에서 대본 원문도 반환하지 않습니다. 성공 후 캐시가 자동으로 재구축되지 않습니다. SQLite 캐시가 새 .semantic.md artifact를 인식하도록 하려면 rebuild_cache를 수동으로 실행하십시오.

Phase 6L은 run_research_workflow MCP 노출을 추가했습니다. 이 통합 워크플로우 도구는 dry-run 우선입니다. confirm=false는 계획된 읽기/쓰기, 단계 순서, 외부 API/비용 위험, 캐시 오래됨 경고 및 필수 확인 사항만 나열하며, 아티팩트를 쓰지 않고, LLM을 호출하지 않으며, 원시 대화록을 반환하지 않고, API 키 값을 읽지 않습니다. confirm=true는 기존 핵심 워크플로우를 호출하며, 의미론적 요약이나 주식 렌즈 합성이 포함된 경우에도 정확한 확인/api_cost_ack을 제공해야 합니다. 워크플로우 MCP 도구는 외부 시장 데이터를 조회하지 않고, 자동 캐시 재구축이 없으며, 매수/매도 추천, 목표 주가 또는 수익 보장을 추가하지 않습니다.

MCP 클라이언트 통합

Codex/Claude 계열 로컬 클라이언트는 기존 stdio 전송을 사용합니다:

python scripts/run_mcp_server.py

Hermes/OpenAB는 별도 사이드카와 동일한 정확한 21개 도구 레지스트리를 사용합니다:

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 검증기 및 이식 방법은 deploy/hermes/README.md 및 specs/026-hermes-mcp-integration/quickstart.md를 참조하세요. Direct 전송은 검증되었습니다. C6의 boolean 전용 endpoint-equality 검증기는 targeted 테스트, POSIX 합성 검사, 검토자 2명 및 유일한 라이브 v2 실행을 통과했으며, 상태는 PASS-current이며 다시 실행해서는 안 됩니다. C7은 여전히 차단됨. Hermes v0.20.0 태그 v2026.8.3 훅은 설치되지 않았고 실기 검증되지 않은 후보 기능일 뿐입니다. 라이브 구성 값/세션 덤프를 읽거나, 원시 응답을 저장하거나, 훅을 업그레이드/활성화하여 증거를 보강하는 것은 금지됩니다. Spec 027 계약 계층은 완료되었으며(오프라인 보증 전용), 실제 Hermes 런타임 라우팅은 BLOCKED/not_evaluated이며 런타임 PASS가 아닙니다. Spec 028 기능 게이트는 완료되었으며 Hermes v0.20.0 태그 v2026.8.3에 대해 BLOCKED_CAPABILITY에서 올바르게 종료됩니다. 업그레이드, Skill 동기화, 훅, 수집기, 추론 또는 런타임 관찰은 수행되지 않았습니다. C6은 PASS-current로 유지되며 다시 실행되지 않았습니다. 실제 Hermes Skill 라우팅은 여전히 BLOCKED/not_run 상태입니다.

Codex/Claude 계열 MCP 클라이언트에 연결하기 전에 먼저 로컬 준비 상태 확인을 실행하는 것이 좋습니다:

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

클라이언트 설정 문서:

이 문서들은 자리 표시자 경로만 사용합니다. 개인 .codex/config.toml, 개인 절대 경로가 포함된 설정, .env 또는 API 키를 커밋하지 마십시오.

MCP 도구 사용 평가

Codex/Claude 계열 MCP 클라이언트에 연결한 후 eval 프롬프트 모음을 사용하여 도구 사용이 기대에 부합하는지 확인할 수 있습니다. 시작하기 전에 다음을 실행하세요:

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

작성 가능한 Codex MCP 세션 평가 보고서를 생성합니다:

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

평가 문서:

Phase 5B 평가는 실제 외부 LLM API 호출, 실제 다운로드/전사/요약/아티팩트 쓰기 실행을 요구하지 않습니다. 핵심은 도구 선택, dry-run, 확인 가드, 캐시 오래됨 설명, 투자 조언 미생성을 확인하는 것입니다. Phase 5C는 사용자가 실제 Codex MCP 세션 결과를 evals/에 기록할 수 있는 보고서 캡처 프로세스를 제공합니다.

연구 안전 평가

Phase 6H는 연구 계층과 향후 LLM 워크플로우가 환각을 일으키지 않고, api_cost_ack을 건너뛰지 않으며, 원시 대화록/API 키를 유출하지 않고, 외부 경계를 검증된 시장 데이터로 취급하지 않으며, 투자 조언을 생성하지 않도록 검증하는 LLM 사전 안전 게이트입니다.

연구 평가 문서:

Phase 6H는 LLM을 호출하지 않고, API 키를 읽지 않으며, 외부 시장 데이터를 조회하지 않고, MCP 도구를 추가하지 않으며, Phase 6G 워크플로우를 변경하지 않습니다. Phase 6I는 연구 워크플로우 내부에 선택적 의미론적 요약 실행을 추가했습니다. Phase 6J는 Stock Lens LLM 합성을 추가했으며, 입력 경계는 6F stock lens JSON 전용이고, 정확한 api_cost_ack이 필요하며, 원시 대화록, 외부 시장 데이터, MCP 도구 변경이 없습니다. Phase 6K는 워크플로우 옵트인 합성을 추가했습니다. include_stock_lens_synthesis는 워크플로우가 확인되고 정확한 확인 후에만 합성을 실행합니다. Phase 6L은 run_research_workflow MCP 노출을 추가했습니다. dry-run 우선이며, 확인된 실행만 핵심 워크플로우를 래핑하고, LLM 단계에는 여전히 정확한 확인이 필요하며 자동 캐시 재구축이 없습니다. Phase 6N은 include_external_data_verification 선택적 워크플로우 픽스처 검증을 추가했습니다. 로컬 픽스처 공급자만 지원하며, 라이브 마켓 API, API 키, MCP 도구 변경, 자동 캐시 재구축이 없고 투자 조언을 제공하지 않습니다. Phase 6O는 research-llm-smoke를 추가했습니다. 실제 OpenAI 호환 스모크 + Codex 수동 검토, 정확한 확인, 직접 Codex 세션 백엔드 없음, 라이브 시장 데이터 없음, 투자 조언 없음. Phase 6Q는 LLM 프로필 구성을 추가했습니다. --llm-profile pro4500은 공급자/모델/기본 URL/env var 이름을 재사용할 수 있지만 API 키 값은 저장하지 않습니다. Phase 6R은 로컬 .env 시크릿 로더를 추가했습니다. 수동 LLM 스모크는 API_KEY, MODEL, BASE_URL을 사용할 수 있으며, CLI 메타데이터는 env var 이름만 표시하고 시크릿 값은 표시하지 않습니다. Phase 6T는 연구 LLM 스모크 검토 보고서/품질 게이트를 추가했습니다. 확인된 스모크 후 결정적 검토 아티팩트를 생성할 수 있으며, LLM 호출, .env 읽기, 외부 시장 데이터가 없습니다. Phase 6V는 검토된 의미론적 컨텍스트 옵트인을 추가했습니다. 주식 렌즈 합성은 기본적으로 여전히 6F stock lens JSON 전용이며, 명시적으로 활성화한 경우에만 검토 통과 .semantic.md 컨텍스트를 사용하고, 원시 대화록, 라이브 시장 데이터, MCP 도구 변경, 투자 조언이 없습니다. Phase 6V.1은 검토 게이트 경계/컨텍스트 일관성을 정렬했습니다. JSON 전용 아티팩트는 의미론적 컨텍스트를 포함할 수 없으며, 검토된 의미론적 경계는 검토 통과 컨텍스트를 포함해야 합니다.

Spec Kit / 아키텍처

Phase 7A는 아키텍처/Spec Kit 안정화로, 범위는 docs/spec 전용입니다. 현재 Phase 6T 연구 시스템을 spec-kit 추적 가능 구조로 정리하며, 런타임을 변경하지 않고, MCP를 변경하지 않으며, LLM을 호출하지 않고, .env를 읽지 않으며, 외부 시장 데이터를 조회하지 않고, no investment advice 경계를 완화하지 않습니다. Phase 7A 이후 다음 기능 후보 단계는 Phase 6U 의미론적 요약 스모크 또는 소규모 LLM 출력 품질 튜닝입니다.

Phase 7B는 공식 Spec Kit 부트스트랩입니다. 프로젝트는 공식 specify init과 동등한 스캐폴드를 공식적으로 채택했습니다. .specify는 Spec Kit 메모리, 템플릿, 스크립트, 워크플로우 및 통합 메타데이터를 저장하고, .agents/skills는 Codex skills 모드의 $speckit-* 스킬을 저장하며, AGENTS.md는 저장소 수준 에이전트 규칙을 저장합니다. Phase 7B는 런타임을 변경하지 않고, MCP를 변경하지 않으며, LLM을 호출하지 않고, .env를 읽지 않고, 라이브 마켓 API를 조회하지 않으며, no investment advice 경계를 완화하지 않습니다.

Phase 7C는 Spec Kit 헌법 + 워크플로우 정렬입니다. 이 단계는 .specify/memory/constitution.md를 공식 자리 표시자에서 프로젝트화하고 .specify/templates/, AGENTS.md, 아키텍처, 로드맵 및 사양 계획을 동기화합니다. Phase 7C는 docs/spec/테스트 전용입니다. 런타임 동작 변경 없음, MCP 동작 변경 없음, LLM 호출 없음, .env 읽기 없음, 라이브 마켓 API 없음, 투자 조언 없음. Phase 7C 이후 새 기능은 전체 Spec Kit 흐름을 따라야 합니다: $speckit-constitution, $speckit-specify, $speckit-clarify, $speckit-plan, $speckit-checklist, $speckit-tasks, $speckit-analyze, $speckit-implement, $speckit-converge; $speckit-taskstoissues는 GitHub 이슈 핸드오프가 필요할 때만 사용합니다. Phase 6U 의미론적 요약 스모크는 여전히 향후 가능한 기능 단계입니다.

Phase 7D는 전체 워크플로우를 통한 Spec Kit 백필입니다. 이 단계는 전체 Spec Kit 흐름을 사용하여 개발된 기능을 기능 그룹별로 백필합니다. specs/README.md는 레지스트리이고, 001-gooaye-research-system은 포괄 제품 사양으로 유지되며, 002-ingestion-transcript-core부터 007-spec-kit-governance까지 as-built 기능 패키지를 기록하며, 006-llm-safety-synthesis-smoke-review는 선택적 LLM/스모크/검토 게이트를 다룹니다. Phase 7D는 docs/spec/테스트 전용입니다. 런타임 동작 변경 없음, MCP 동작 변경 없음, LLM 호출 없음, .env 읽기 없음, 라이브 마켓 API 없음, 투자 조언 없음, $speckit-clarify, $speckit-analyze, $speckit-converge의 백필 단계를 명시적으로 문서화합니다.

Phase 7D.1은 Spec Kit 활성 기능 지침입니다. 이 단계는 공식 Spec Kit 명령 사용성을 명확히 합니다. 기능 패키지의 올바른 위치는 specs/<feature>이고, .specify/는 스캐폴드/메모리/템플릿/스크립트 메타데이터입니다. 여러 백필된 패키지는 단일 활성 기능을 기본적으로 고정하지 않습니다. 특정 패키지에 대해 공식 스크립트/스킬을 실행하려면 먼저 SPECIFY_FEATURE_DIRECTORY를 설정하세요(예: $env:SPECIFY_FEATURE_DIRECTORY="specs/003-metadata-search-mcp-core"). 공식 스크립트는 .specify/feature.json에 저장될 수 있으므로 패키지를 전환할 때 다시 설정하면 됩니다. Phase 7D.1은 런타임을 변경하지 않고, MCP를 변경하지 않으며, LLM을 호출하지 않고, .env를 읽지 않고, 라이브 마켓 API를 조회하지 않으며, 투자 조언을 제공하지 않습니다. Phase 6U 의미론적 요약 스모크는 여전히 향후 가능한 기능 단계입니다.

Spec-kit 문서:

라이선스

이 저장소는 MIT 라이선스에 따라 라이선스가 부여됩니다. LICENSE를 참조하세요. 해당 저작권은 자체 저작물에만 적용됩니다. 두 개의 사양 패키지는 자체 MIT 라이선스를 보유한 타사 NousResearch/hermes-agent 저장소의 바이트 고정 스냅샷을 공급합니다. THIRD-PARTY-NOTICES.md를 참조하세요.

개발 명령어

python -m pytest
python -m compileall src scripts

개발 종속성을 설치하려면:

python -m pip install -e .[dev]

Spec034 작업 #82 v8 검토 수리 — 현재

startup/plugin 닫힘; credential_provider BLOCKED; 전체 BLOCKED. Spec034은 H1 SHA-256 90ba45ccf11bbcbf446f7d16904964073e84837a04aaaa0c6f4887d3ea75109d에서 정확히 20개의 업스트림 경로가 있는 H2로 오프라인/정적 전용으로 유지됩니다. 21번째 경로는 허용되지 않습니다. 격리된 하위 프로세스는 페이로드 cwd로 일반적인 no-link/reparse-free 프로젝트 스냅샷만 허용하며, sentinel/Pytest/제품 가져오기 전에 해당 디렉터리로 변경하고, 기능 스냅샷, 프로젝트 스냅샷, stdlib만 유지합니다. 결과적으로 C6의 세 가지 상대 구성 읽기는 스냅샷 이후 원래 작업 영역 구성이 변경되더라도 스냅샷 승인 바이트를 사용합니다. 공개 영수증 프로젝션에는 주입된 검증기가 없습니다. 비공개 발행은 현재 정식 사실을 다시 계산합니다. AST 증명은 소유자 로컬 패키지 사양/모듈/로더/반환/등록/컨텍스트 흐름을 따릅니다. 번들 이름 바꾸기 상위 fsync는 명시적 플랫폼 최선 노력 폴백과 함께 bundle_renamed 저널보다 먼저 수행되며, 정확한 nonce 바인딩 양쪽 누락 복구만 재시도에 안전합니다. 실행기/저널/신뢰 테스트는 여전히 최종이 아닙니다. 이전의 모든 루트는 승인 증거가 아닙니다. 새로운 코드 및 아키텍처 재검토가 여전히 필요합니다. Main만 두 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