fix: persist Bird quoted tweets#76
Conversation
|
Codex review: needs maintainer review before merge. Reviewed June 25, 2026, 9:06 AM ET / 13:06 UTC. Summary Reproducibility: yes. Source inspection shows current main keeps the quoted tweet ID but drops the hydrated quoted tweet body before ingest, and the PR body includes real Bird-backed after-fix proof. Review metrics: 2 noteworthy metrics.
Merge readiness Overall follows the weaker of proof and patch quality, so missing proof can cap an otherwise strong patch. Rank-up moves:
Risk before merge
Maintainer options:
Next step before merge
Security Review detailsBest possible solution: Land the narrow persistence fix after the draft is ready and maintainer/project checks pass, preserving included quote rows for rendering without creating standalone timeline or collection membership for included-only tweets. Do we have a high-confidence way to reproduce the issue? Yes. Source inspection shows current main keeps the quoted tweet ID but drops the hydrated quoted tweet body before ingest, and the PR body includes real Bird-backed after-fix proof. Is this the best way to solve the issue? Yes. Treating AGENTS.md: not found in the target repository. Codex review notes: model internal, reasoning high; reviewed against 10f98d3fb36a. Label changesLabel justifications:
Evidence reviewedWhat I checked:
Likely related people:
What the crustacean ranks mean
Shiny media proof means a screenshot, video, or linked artifact directly shows the changed behavior. Runtime, network, CSP, and security claims still need visible diagnostics. How this review workflow works
|
|
@clawsweeper re-review |
|
🦞🧹 I asked ClawSweeper to review this item again. |
Issue
Bird-backed live timeline syncs can return quoted tweets as hydrated nested payloads. Birdclaw normalized the primary tweet reference, but dropped the quoted tweet body during ingest because the quoted payload was not carried through
includes.tweets.That left local timeline items with
quoted_tweet_idset, but no persisted tweet row for the quoted tweet. Result: quote cards could not render until a later hydrate fetched the quoted tweet separately.What changed
quotedTweetobjects intoincludes.tweets.How
The fix treats
payload.dataas the primary timeline surface andpayload.includes.tweetsas canonical tweet records that may be needed for rendering references.Ingest now deduplicates primary and included tweets by ID, writes all canonical tweets into
tweetsandtweets_fts, but only createstweet_account_edges, collection rows, and returned sync IDs for primarypayload.datatweets.Behavior proof
Captured June 25, 2026 from a clean temporary Birdclaw home:
/tmp/birdclaw-pr76-proof-home.clean.tiKXyq.tweets,tweet_account_edges,tweet_collections,tweets_fts, andsync_cachein that temp copy.BIRDCLAW_HOME=/tmp/birdclaw-pr76-proof-home.clean.tiKXyq BIRDCLAW_BACKUP_AUTO_SYNC=0 pnpm cli sync timeline --mode bird --limit 100 --refresh --jsonRedacted quote-card rendering artifact: quote-card-redacted.svg
Redacted terminal proof from that run:
{ "birdSync": { "ok": true, "source": "bird", "kind": "timeline", "feed": "following", "count": 100, "primaryTweets": 100, "includedTweets": 24, "includedUsers": 65 }, "includedOnlyQuoteProof": { "includedOnlyTweetsReferencedAsQuotesByPrimaryTweets": 23, "persistedIncludedOnlyTweetRows": 23, "includedOnlyHomeEdges": 0, "includedOnlyCollectionRows": 0, "includedOnlyFtsRows": 23, "redactedSamples": [ { "text_chars": 365, "home_edges": 0, "collection_rows": 0, "fts_rows": 1 }, { "text_chars": 280, "home_edges": 0, "collection_rows": 0, "fts_rows": 1 }, { "text_chars": 249, "home_edges": 0, "collection_rows": 0, "fts_rows": 1 } ] }, "visibleQuoteCardsInRedactedScreenshot": 13 }No
bird read, hydrate, mention-thread, or other quote-fetch command ran between the clean table reset and the screenshot capture.Validation
pnpm run checkpnpm testpnpm exec vitest run src/lib/bird.test.ts src/lib/timeline-live.test.ts src/lib/profile-analysis.test.ts src/lib/timeline-collections-live.test.ts src/lib/tweet-search-live.test.ts src/lib/mentions-live.test.ts src/lib/mention-threads-live.test.ts