personal memory agent

remove(schedules): drop the retired granola sync entry master

The Granola import retirement left owners' own `sync:granola` entry in config/schedules.json. Nothing stops it: scheduler.load_config validates entry shape only and never checks that a `sync:` backend exists, and the supervisor records last_run on every completion including non-zero exits, so the entry re-fires at each hour boundary and fails every time with "Unknown sync backend: granola". There is no in-product way off it — `journal schedule` is display-only and the settings sync POST that could have toggled it is gone with the retirement. Add maint 009 to remove exactly that one key. The predicate matches only the literal name `sync:granola` and only when the entry has no cmd or its cmd invokes the granola importer sync, accepting the current, pre-maint-007, and `--sync=granola` forms; anything else under that key is preserved with a warning. Removal ignores `enabled`, since a disabled entry for a source that no longer exists is still dead config. The only write routes through schedule_config.remove_schedule_entry, the registered owner for config/schedules.json. Read-side malformed input (missing, empty, non-JSON, non-dict) sets a skip reason and exits 0; errors and exit 1 are reserved for lock and write failures, which MAINT_RETRY_ON_NEXT_START retries on the next supervisor start. Sibling schedule entries, health/scheduler.json, and the granola sync-state file are untouched. Bumps the tests/test_maint.py opt-in inventory guard to carry the new retry-only task. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>