# =============================================================================
# config/scout.yaml
# -----------------------------------------------------------------------------
# Run configuration for the daily Scout pass (scripts/scout.py).
#
# WHAT SCOUT DOES (deterministic, code-only):
#   1. Reads source groups below from config/sources.yaml.
#   2. Scaffolds today's daily report from the daily-report template into
#      output_dir, and updates latest_pointer to point at it.
#   3. Computes a registry diff against dedup_against (what skills are already
#      known) so the report can flag "new vs already-tracked".
#
# WHAT SCOUT DOES *NOT* DO (delegated -- see 'judgment'):
#   - It does not crawl the web, score signals, or decide skill value.
#   - Signal gathering + value judgment is done by 'signalcraft:research' +
#     'deep-research' skills and the Hermes automation. Scout only prepares the
#     skeleton and the diff; humans/Hermes fill in findings and decisions.
#
# GLOBAL POLICY REMINDER (mirrors CLAUDE.md / README / HERMES):
#   default private; never auto-publish; never auto-promote a skill to approved;
#   never auto-install plugins/MCP/packages. Scout is read-mostly + scaffold-only.
#
# YAML SUBSET: 2-space indent, block maps/seqs, plain/quoted scalars, empty
# collections only as inline [] / {}. No anchors/flow maps/folding.
# =============================================================================

version: 1
updated: 2026-06-23

# --- Source selection --------------------------------------------------------
# Which groups inside config/sources.yaml Scout enumerates on a normal run.
# Names MUST match the top-level group keys in sources.yaml.
sources_file: config/sources.yaml
source_groups:
  - rss
  - github_search
  - skill_registries
  - youtube
  - docs

# --- Output ------------------------------------------------------------------
# Where the generated daily report lands and the always-current pointer to it.
# scout.py builds the report from the daily-report template (see template_id).
output_dir: 70_Daily_Reports
latest_pointer: 70_Daily_Reports/latest.md
report_filename_pattern: 'scout-{date}.md'   # {date} -> YYYY-MM-DD at run time
template_id: daily-report                     # 60_Templates/<...> daily-report tpl

# --- Dedup / diff ------------------------------------------------------------
# Scout diffs discovered candidates against the skill registry so the report
# can separate genuinely-new finds from things already in the pipeline.
dedup_against: 40_Skills/registry.yaml
# Registry statuses that count as "already handled" -> suppressed from NEW list.
# (Diff is informational only; it never mutates the registry.)
known_statuses:
  - approved
  - candidate
  - watch_only
  - rejected
  - absorbed
  - deprecated

# --- Judgment delegation -----------------------------------------------------
# Hard boundary: Scout produces structure + diff ONLY. Everything below the line
# (what is worth tracking, what overlaps, what to install) is human/Hermes work
# performed via these skills. scout.py prints this note into the report so the
# reader knows the file is a skeleton awaiting analysis.
judgment:
  performed_by:
    - signalcraft:research
    - deep-research
    - Hermes
  # Machine-readable judgment note (plain quoted scalar, no folding):
  summary: 'Scout scaffolds + diffs only. signalcraft + deep-research + Hermes gather signals and judge value. No auto-promote, no auto-install, no auto-publish.'
  applies_skill_policy: config/skill-policy.yaml

# --- Notifications -----------------------------------------------------------
# Discord ping when a run finishes. We store only the ENV VAR NAME that holds
# the webhook URL -- never the secret itself. scout.py reads os.environ[...].
discord_webhook_env: KARNEL_DISCORD_WEBHOOK
notify_on:
  - run_complete
  - new_candidates_found
notify_on_empty: false   # stay quiet on days with zero new candidates

# --- Scheduling --------------------------------------------------------------
# Scout is not self-scheduling; Hermes triggers it. This is documentation for
# the operator, not an active cron definition.
schedule_note: 'daily AM via Hermes cron'
timezone: 'Asia/Seoul'

# --- Behavior flags ----------------------------------------------------------
behavior:
  fail_on_missing_sources: false  # a disabled/absent group is skipped, not fatal
  write_latest_pointer: true      # refresh latest_pointer each run
  max_entries_per_group: 50       # safety cap on how many targets land in report
  dry_run_default: false          # scout.py still always supports --dry-run
