---
name: propagate-classification
description: Propagate verified classifications between ML filters using `skraak calls propagate`. Common case is many folders at once.
---

# Propagate Classification

Use the `skraak calls propagate` CLI tool. It does all the work — overlap detection, certainty gating, conflict handling, JSON report. Read its `--help` output for full semantics.

## Usage

```
skraak calls propagate --folder <path> --from <filter> --to <filter> --species <species>
skraak calls propagate --file   <path> --from <filter> --to <filter> --species <species>
```

## Many-folder loop (the common case)

Ask the user for the folder list, filter pair, and species. Then:

```bash
FOLDERS=(
  "/media/david/Pomona-4/Pomona/A05/2026-04-06"
  # ...
)
TO=opensoundscape-kiwi-1.5

for F in "${FOLDERS[@]}"; do
  tag=$(echo "$F" | awk -F/ '{print $(NF-2)"_"$(NF-1)}')
  ./skraak calls propagate --folder "$F" \
      --from opensoundscape-kiwi-1.2 --to "$TO" --species Kiwi \
      > "/tmp/propagate_logs/${tag}_${TO}.json"
done
```

- Tag must disambiguate colliding site codes (e.g. G05 in Pomona-4 and TwentyFourSeven) — use at least two path components.
- Invoke the tool **once** per folder. Don't re-run for display; it's idempotent and will report zero.

## Report back

Tally totals and surface any conflicts for manual review:

```bash
jq -s 'map({p:.propagated,fc:.files_changed,c:.skipped_conflict}) |
       reduce .[] as $x ({p:0,fc:0,c:0};
         {p:(.p+$x.p), fc:(.fc+$x.fc), c:(.c+$x.c)})' \
  /tmp/propagate_logs/*_${TO}.json

jq -r '.conflicts[]? | "\(.file) @ \(.target_start)s  \([.source_choices[].calltype]|join(","))"' \
  /tmp/propagate_logs/*_${TO}.json
```

Conflicts = target overlaps ≥2 verified sources with different calltypes; user resolves in the TUI.