Sync — issue codes (i18nprune.sync.*)
locale_file_not_found
Severity: warning
When: sync --target requested a locale basename with no matching *.json under localesDir (skipped).
Who: sync, runSync.
What to do: Create the locale file (e.g. generate) or fix --target spelling.
metadata_flag_conflict
Severity: warning
When: sync receives both metadata-write intent and strip intent in the same run (for example --metadata and --strip-metadata).
Who: sync, runSync.
What to do: Treat it as a precedence notice: strip wins and leaves are written as plain strings (legacy_string mode). Remove one flag for clearer intent. See Sync metadata flag conflict and Locales config metadata mode.
scan_extras_retained
Severity: info
When: After sync, a target locale still has key paths extra vs the code scan that were retained (preserve / uncertain keep). Reasons on each path: copyKey, copyPrefix, uncertainPrefix, or autoUncertain.
Who: sync, runSync.
JSON: additive data.scanExtrasRetained[] — { localeCode, localeFile, retained: [{ path, reason }] }. Issue includes paths and a short sample in message.
What to do: This is not a failure. sync aligns to scan ∩ source + preserve expansion and is conservative around dynamic / declared keep trees. To preview scan-based removal from the target file, run:
i18nprune cleanup --target <code> --dry-runReview output, then apply with cleanup --target <code> --yes or --ask. Optional: --rg for a substring presence guard. See Sync vs tips vs cleanup.