---
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.