compact flow: populate source_uris on likes-derived observations
the bot now records provenance (source_uris: list[AtUri]) on every
observation row — sources are what the claim is anchored to. the likes
pipeline has the sources for free (the URIs of the posts nate liked that
fed the extraction), but was throwing them away.
changes:
- load_recent_liked_posts SQL now selects subject_uri alongside the
other columns
- LikesObservation gets a source_uris field (default empty). the LLM
doesn't see URIs in its prompt (only post text), so the orchestrator
attaches them post-extraction: every observation for an author gets
the full deduped ordered set of URIs from that author's batch of
liked posts — coarse but always-true
- USER_NAMESPACE_SCHEMA aligned with the bot: added status, supersedes,
source_uris columns that previously diverged
- write_likes_observations_to_turbopuffer writes status="active",
supersedes="", source_uris=[...] so bot reads (which filter on
status != superseded) find them
bot side (separate commit) reads source_uris defensively via
getattr(row, "source_uris", []) so older rows missing the column don't
break anything.
Co-Authored-By: Claude Opus 4 (1M context) <noreply@anthropic.com>