refactor(activities): single-pass schedule talent emits anticipated activity records
Replaces the schedule 2-pass flow (markdown → anticipation post-hook re-extracts
JSON) with a single-pass JSON-output talent processed by a new schedule post-hook
that writes activity records with source: "anticipated" directly to
facets/{facet}/activities/{target_date}.jsonl.
Key changes:
- New talent/schedule.py post-hook parses JSON result, validates per-item, and
writes via append_activity_record (atomic fcntl-locked dedup by stable ID).
- New dedup_anticipation helper + ANTICIPATION_FUZZY_THRESHOLD (0.85) in
think/activities.py supersedes pending rows whose title drifted between runs.
- Cancelled calendar events captured with cancelled: true and hidden: true.
- Home today-card merges anticipated activities into events and suppresses them
from the recent-activity strip to avoid double display.
- activities list gains --source {anticipated,user,cogitate} filter.
- Sweep replaces 16 stale sol call calendar references across talents, skills,
and routine templates with sol call activities list equivalents.
- Deletes talent/anticipation.{md,py}; removes anticipation from settings
extraction-exposure tuples; updates fixtures, docs, and API baselines.
Closes Sprint 3 of the schedule→activities refactor (req_hfwtzduq). Parallel
investigation of the schedule dup-bomb (req_b46jht3a) is closed by the
structural fix (atomic ID-dedup under fcntl lock).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>