Repository navigation
spec: 22 more operations (community, birdwatch, lists, explore, viewer) and tonight's drift - #121
Merged
Merged
Conversation
…r), drift from tonight's strict runs Adds the placeholder operations that had a recorded response but no path: CommunitiesFetchOneQuery, CommunityQuery, CommunitiesSearchQuery, TopicCarouselQuery, GlobalCommunities(Latest)PostSearchTimeline (tag community), the five Birdwatch queries (tag birdwatch), BookmarkSearchTimeline, ExploreSidebar, ListSearchTimeline, CombinedLists, ListsManagementPageTimeline, UsersVerifiedAvatars, AuthenticatePeriscope, CreatorStudioTabBarItemQuery, DataSaverMode, GrokHome, PinnedTimelines. The Relay community pages get their own types instead of widening Community and User. The strict harness iterates the two new API classes, tolerates X's partial errors beside complete data (CombinedLists, ListSearchTimeline, ListsManagementPageTimeline, ListByRestId) and tests ListByRestId again; update_placeholder.py fills in variables for entries that have none. Drift: ClientEventInfoDetails.notificationDetails (timelinesDetails optional), RichMessage.entities, ModuleFooter.displayType and FeedbackAction.feedbackType as plain strings, AdMetadataContainer.unifiedCardOverride, promoted trends (TimelineTrend.description / promoted_metadata, TrendMetadata.meta_description) and the TimelineEventSummary item. Verified: 422 stored responses and the strict live test (125 calls) at match rate exactly 1.0. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
ListOwnerships, UsersVerifiedAvatars, GenericTimelineById, ProfileSpotlightsQuery, Likes and isEligibleForVoButtonUpsellQuery carried the identifiers of the account that was logged in during the earlier recordings; they are recorded again on the development sandbox account. UsersVerifiedAvatars.userIds keeps only the viewer id. HomeTimeline is POST per the latest stamped catalog line. The same id leaves the UserTweets id list of the strict test. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…58448897) Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Adds the 22 placeholder operations that had a recorded response but no spec path (64 → 86 operations). Every response schema is typed from the recorded response (required = present in the sample); the strict live test now calls all of them with two cursor pages.
New operations
CommunityApi):CommunitiesFetchOneQuery(community page),CommunityQuery(settings / moderation pages),CommunitiesSearchQuery(cursor inslice_info.next_cursor),TopicCarouselQuery,GlobalCommunitiesPostSearchTimeline,GlobalCommunitiesLatestPostSearchTimeline.BirdwatchApi):BirdwatchFetchAliasSelfSelectStatus,BirdwatchFetchAuthenticatedUserProfile,BirdwatchFetchBirdwatchProfile,BirdwatchFetchGlobalTimeline(segmented timelines),BirdwatchFetchPublicData(public data file urls).BookmarkSearchTimeline,ExploreSidebar. user-list:ListSearchTimeline,CombinedLists(sameUserTweetsResponseshape as ListOwnerships),ListsManagementPageTimeline. users:UsersVerifiedAvatars. default (paths/viewer.yaml):AuthenticatePeriscope,CreatorStudioTabBarItemQuery,DataSaverMode,GrokHome,PinnedTimelines.getAltTextPromptPreference,isEligibleForVoButtonUpsellQuery,usePremiumPaywallOnLoadMutation(their placeholder keys start lowercase, which the strict harness's method-name → key mapping does not handle), and the catalog-only operations that have no placeholder entry.Relay community pages
The three community queries are Relay fragments: node ids on the result wrappers and on rules,
__is…interface markers on the action results, and partial users (facepile users are{__typename, avatar, id}, the settings creator is{__typename, core.screen_name, id, is_blue_verified, verification}). They get their own types (CommunityPageCommunity,CommunitySettingsCommunity,CommunitySearchCommunity,CommunityFacepileUser,CommunityRelayRule,CommunityPageActions, …) instead of wideningCommunity/User; only the objects that are the same at every site are shared (CommunityBannerMedia,CommunityViewerRelationship,UserAvatar,AffiliatesHighlightedLabel,Timeline/TimelineResult).UsersVerifiedAvatarslikewise returns a partialVerifiedAvatarUser.TypeNamegainsCommunityHashtagSliceandCommunityListMembersAction.Placeholder / tooling
tools/update_placeholder.pynow fills invariablesfor an entry that has none (X answers 422 without them); that completedCommunitiesFetchOneQuery,UsersVerifiedAvatarsandisEligibleForVoButtonUpsellQueryfrom the stamped catalog lines.HomeTimelineisPOSTper the latest stamped catalog line.ListOwnerships,UsersVerifiedAvatars,GenericTimelineById,ProfileSpotlightsQuery,Likes,isEligibleForVoButtonUpsellQuery) were re-recorded today on the sandbox account and their sample values set to the usual ones (screen_nameelonmusk,userId44196397,tweetId1349129669258448897; the request shapes are the recorded ones). The same id is removed from theUserTweetsid list of the strict test. catalog: re-record the viewer-bound requests on the sandbox account twitter_api_safe_relay#38 replaces the matching catalog rows.tools/build_config.pyregisters the two new tags;test/python/test_serialize.pyiteratesCommunityApiandBirdwatchApitoo, and treats X's partialerrorsbeside complete data (match rate 1.0) as a warning instead of a failure, which is whatCombinedLists,ListSearchTimeline,ListsManagementPageTimelineandListByRestIdalways return (theListByRestIdskip is gone).tools/json_to_schema.py(local, not committed) drafted the schemas from the recordings; everything was reviewed and renamed by hand.Drift found by the strict runs (X side, 2026-10-16)
ClientEventInfoDetails.timelinesDetailsis optional: notification items carrynotificationDetails {impressionId, metadata}instead.RichMessage.entitieson notifications:TimelineRichTextUserrefs withuser_resultsandTimelineRichTextListrefs withidand a relativeurl.ModuleFooter.displayTypecan be an empty string, so it is a plain string now.AdMetadataContainer.unifiedCardOverride(a JSON string) on a promoted tweet.TimelineTrend.description/promoted_metadata(TrendPromotedMetadata: advertiser, impression ids,promotedTrend),TrendMetadata.meta_description;FeedbackAction.feedbackTypegainedDismiss, so it is a plain string now.TimelineEventSummary(promoted event card on ExplorePage: event id, hero media with a tweet, title, its own promoted metadata whose ad container lacksrenderLegacyWebsiteCard), added toItemContentUnion,ContentItemTypeandTypeName.Verification
🤖 Generated with Claude Code