Skip to content

spec: drift from a 360-call strict sweep and a HAR capture - #123

Merged
fa0311 merged 3 commits into
mainfrom
fix/sweep-2026-10-17
Oct 17, 2026
Merged

fa0311 merged 3 commits into
mainfrom
fix/sweep-2026-10-17

Conversation

@fa0311

@fa0311 fa0311 commented Oct 17, 2026 •

Copy link
Copy Markdown
Owner

A broad strict sweep on the sandbox account (360 calls: 12 search queries × Top / Latest / Media × 2 pages, 20 accounts × UserTweets / TweetsAndReplies / Media / Highlights × 2 pages, 72 tweet details, home, explore tabs, lists, communities, notifications, bookmarks, Community Notes; paced by X's x-rate-limit-* headers) plus the 33 response bodies of a browser HAR capture surfaced the following. Every stored response, 804 now (3,909 distinct tweets from the sweep alone, 1,171 from the HAR), deserializes at match rate 1.0 with these changes.

Values X keeps extending → plain strings (known values in comments)

  • ConversationDetails.conversationSection: RelatedTweet joined HighQuality.
  • BirdwatchPivot.iconType: BirdwatchLink joined BirdwatchV1Icon / BirdwatchCameraVideo / BirdwatchPhoto (added only yesterday).

New fields

  • Tweet.voiceInfo (always {} so far, TweetDetail).
  • CashtagAttachment.size_variant (integer).
  • ArticleResult.summary_text, and ArticleResult.content_state is typed (ArticleContentState, draft.js): blocks with inlineStyleRanges (style: Bold / Italic), entityRanges, data.urls / data.mentions, and entityMap entries of type MEDIA (entityKey, mediaItems, caption), TWEMOJI (url) and TWEET (tweetId), from 5 articles in the sweep and the cache. That leaves TweetLegacy.place and TweetInterstitialRevealText as the only untyped sites.
  • ModuleHeader.socialContext (TimelineGeneralContext with the new contextType: TextOnly, "Sourced from across X" on TweetDetail modules).

Optional now

  • UserTweetsResultV1.timeline / UserHighlightsTweetsResult.timeline: the result is a bare UserUnavailable for unavailable accounts (@Support).
  • MediaResult.media_key: media_results.result is {} on some media.
  • GrokImageAnnotation.upsampled_prompt: some annotations carry only prompt.

Second sweep (355 more calls: other languages, cards and accounts, 4,309 distinct tweets)

  • GrokEntityRef.type gains TimelineRichTextMention (with id, screen_name): a Grok-translated Community Note mentioning a user.
  • TweetLegacy.place is typed at last (27 geo-tagged posts recorded: TweetLegacyPlace with a GeoJSON bounding_box), and the sibling coordinates / geo points are added. TweetInterstitialRevealText is now the only untyped site.
  • NoteTweetResultData.entity_set / .text optional: a note tweet result can be just {id}.

Verification

  • 1,160 stored responses at match rate exactly 1.0 (both sweeps and the HAR included).
  • Strict live test with the nightly settings, rerun after the second sweep's fixes: 124 calls, all 124 at match rate exactly 1.0 (7 responses with partial errors beside complete data are logged as warnings).

🤖 Generated with Claude Code

fa0311 and others added 2 commits October 17, 2026 05:43
Plain strings where X keeps adding values (conversationSection: RelatedTweet,
BirdwatchPivot.iconType: BirdwatchLink); new fields Tweet.voiceInfo,
CashtagAttachment.size_variant, ArticleResult.summary_text,
ModuleHeader.socialContext (contextType TextOnly); ArticleResult.content_state
typed from a plain-text article; timeline optional on user timeline results
(UserUnavailable), MediaResult.media_key and GrokImageAnnotation.
upsampled_prompt optional.

Verified: 804 stored responses (3,909 distinct tweets from the sweep) at match
rate exactly 1.0; strict live test 123/124 at 1.0, the other call a 503 from
X that replays fine.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
draft.js blocks with inlineStyleRanges (Bold / Italic), entityRanges and
data.urls / data.mentions; entityMap entries of type MEDIA, TWEMOJI and
TWEET. 805 stored responses still at match rate exactly 1.0.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
GrokEntityRef.type += TimelineRichTextMention (id, screen_name);
TweetLegacy.place typed from 27 geo-tagged posts (GeoJSON bounding box) plus
the coordinates / geo points; NoteTweetResultData.entity_set / text optional
(a note tweet result can be just {id}). 1,160 stored responses at match rate
exactly 1.0.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@fa0311
fa0311 merged commit 20dc186 into main Oct 17, 2026
1 check passed
@fa0311
fa0311 deleted the fix/sweep-2026-10-17 branch October 17, 2026 17:28
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant