Skip to content

Date: 2026-08-13 Dept: IT · Project: my_backup

Talbot needed to recover an Ecco Pro backup rotation file (D:\FSS\Misc\Ecco\Main.bk1/Main.eco) and found zero Ecco files anywhere in the Kopia Active repo, at any snapshot age.

fss.kopiaignore (my_backup/config/fss.kopiaignore, restored to D:\FSS\.kopiaignore each pipeline run) had:

Misc/Ecco/
*.eco

Misc/Ecco/ excludes the whole folder, not just .eco — despite the adjacent comment saying “Ecco Pro files are often locked. Back up *.bk* files instead.” The .bk1-.bk5 rotation files this was meant to protect were blocked too, permanently.

Lifeboat: the monthly 7-Zip archives (seven_zip_backups in config.yaml) build from global_excludes only, not .kopiaignore — so Misc/Ecco/*.bk1 was recoverable from D:\bak\FSS_BkUp\FSS_2026-*.7z. Recovered 2 versions of Main.bk1 (2026-08-12 and 2026-06-26 — 7-Zip is monthly-only, no weekly granularity existed) into C:\tmp\Ecco_Recovery\; Talbot confirmed one opened correctly in Ecco Pro, then deleted the recovery folder.

  1. fss.kopiaignore: Misc/Ecco/ → *.eco only. .bk* files no longer blocked from Kopia.
  2. config.yaml global_excludes: per Talbot’s explicit call, keep *.bk2/*.bk4 excluded, drop *.bk3/*.bk5 from the exclude list (alongside *.bk1, which was never excluded) — .eco stays excluded everywhere (locked-file rationale still applies).
  3. Second bug found while wiring #2 up: tasks.py’s snapshots() only pushed the merged excludes policy to Kopia when a snapshot had its own excludes: list (len(excludes) > 0). “FSS (Active)” has none, so global_excludes edits were silently never reaching Kopia’s live policy for it — config.yaml said one thing, the repo enforced another, indefinitely. Fixed the gate to fire on snapshot excludes OR global excludes.
  4. Applied the corrected policy directly to the live D:\FSS Kopia source via kopia policy set --clear-ignore + re-add, so the fix was effective immediately rather than waiting on the next scheduled run.
  5. Committed: my_backup 0b1f4fc.

Live verification (not just committed — actually confirmed)

Section titled “Live verification (not just committed — actually confirmed)”

Windows Task Scheduler could not be triggered from WSL (schtasks /Run, Start-ScheduledTask both failed “system cannot find the file specified” — a WSL→Windows interop/session limitation, not a real missing file; documented in GlobalDevRules.md §3.9). Switched axis: ran the task’s real batch script directly (D:\FSS\Software\Utils\Windows\my_backup-daily-task.bat via cmd.exe), exercising the identical production pipeline.

Run completed exit 0, no errors/warnings. Confirmed via kopia ls on the resulting snapshot (k822db5eab..., 2026-08-13 09:31:35): Misc/Ecco now contains Main.bk1/.bk3/.bk5 (and bk1/bk3/bk5 for every other Ecco file), with .bk2/.bk4/.eco correctly still absent.

Process lesson (promoted to ~/ai-config/AGENTS.md)

Section titled “Process lesson (promoted to ~/ai-config/AGENTS.md)”

When a real test can only run after a scheduled/cron job, default to triggering it now (or scheduling a follow-up and iterating to a confirmed outcome) rather than closing the task on “should work next run.” Talbot’s explicit correction: the agent’s job includes executing, testing, and reporting back to a confirmed outcome — not stopping at “committed, not yet verified.”

Complete investigation + command transcript: my_backup LESSONS.md (2 new entries: whole-folder .kopiaignore rules, global_excludes policy-push gate gap).