The most comprehensive analysis of Google Discover's internal systems, derived from SDK instrumentation, telemetry constants, and client-side observable behavior.
PCTR_MODEL_TRIGGERED was extracted from the Google Search SDK. However, deeper analysis reveals it is in a generic telemetry event enum alongside ~100+ non-Discover events (PAYMENTS_*, KEYBOARD_*, PARTICLE_*, etc.). It is NOT in a Discover-specific class.MAX_HIT_WEIGHT scoring formula (MUL _MAX_HIT_WEIGHT (DIV (MAX _CLICK_COUNT 0) (ADD 1 (MAX _CLICK_COUNT 0)))) exists in the SDK, but the containing class works with SuggestRequest/SuggestResponse protos and CrossProfileIcingApi — it is the on-device Icing search suggest scoring, NOT Discover ranking. Zero Discover-related strings appear near this formula.| Claim | SDK Evidence | Verdict |
|---|---|---|
| pCTR model exists | PCTR_MODEL_TRIGGERED event string present | EXISTS (but generic enum, not Discover-specific) |
og:title is a pCTR input | og:title and PCTR are in separate SDK modules with ZERO class overlap. ContentMetadata (OG output) not referenced in scoring module. | NOT CONFIRMED in client SDK |
| MAX_HIT_WEIGHT is Discover's scoring formula | The containing SDK module operates on SuggestRequest/SuggestResponse, not Discover protos. ZERO overlap with OG metadata classes. | NOT CONFIRMED — this is Icing search suggest |
| Input Signal | Source | SDK Evidence |
|---|---|---|
| Image quality | og:image + dimension checks | LOW_QUALITY_IMAGE, image_width, image_height |
| Freshness | Content age | freshness_delta_in_seconds |
| Historical CTR | Per-URL metrics | click_count / show_count |
| Thumbnail download | Image fetch | EMBER_FEED_THUMBNAILS_DOWNLOADED |
| Image load failure | Error tracking | image_load_failure_count (telemetry) |
discover-pa.googleapis.com, but the actual pCTR evaluation is not visible in the client-side SDK. Whether og:title is a pCTR input is plausible but cannot be confirmed from SDK analysis alone.dkpg.java, self-described as SchemaOrg{parsedMetatags, jsonLdScripts}) handles significantly more than 6 signals. In addition to the 5 OG tags and 1 article meta tag below, it also parses: twitter:image, twitter:title, twitter:image:src, author, title, inLanguage, isAccessibleForFree, image (generic), and Schema.org JSON-LD structured data. The 6 OG tags listed here are the primary signals, but the parser's scope is broader. All handled within a single SDK module.| Tag | SDK Evidence | Handler | Role | Required |
|---|---|---|---|---|
og:image | CONFIRMED | Image Callable | Card thumbnail. No og:image = no card rendered. EMBER_FEED_THUMBNAILS_DOWNLOADED fails. | MANDATORY |
og:title | CONFIRMED | Title Supplier | Card title text. Extracted into ContentMetadata protobuf. pCTR input plausible but unconfirmed. | MANDATORY |
og:site_name | CONFIRMED | Title Supplier | Publisher name on card header. Attribution display. | Recommended |
og:locale | CONFIRMED | Locale Extractor | Content language/region. Matched against user locale for feed eligibility. | Recommended |
og:image:secure_url | CONFIRMED | Fallback Supplier | HTTPS variant of image URL. Preferred over HTTP. | Optional |
article:content_tier | CONFIRMED | Paywall Detector | Paywall classification: free / metered / locked. Affects card treatment and user expectation. | Recommended |
| Signal | Fallback Chain (in order) | SDK Handler |
|---|---|---|
| Title | Schema.org (TEXT_TYPE_TITLE) → og:title → twitter:title → title (HTML name attr) | Title Supplier + Fallback Supplier (dkri.java:1088-1092, dknl.java:27-29) |
| Image | og:image → twitter:image → og:image:secure_url → twitter:image:src → image | Image Callable + Fallback Supplier (dkri.java:1100, dkpj.java switch cases 0,2,3,4) |
| Publisher | Schema.org (TEXT_TYPE_PUBLISHER) → og:site_name → author (HTML name attr) | Title Supplier (dkri.java:1097-1099) |
| Author | Schema.org (TEXT_TYPE_AUTHOR) → author (HTML name attr) | Title Supplier |
| Language | og:locale → inLanguage (JSON-LD typed) → hardcoded "en" | Locale Extractor + Title Supplier |
| Paywall | article:content_tier + isAccessibleForFree (JSON-LD boolean) | Paywall Detector |
"The page contains blocking metatag: %s". Two values found (from dkri.java:304-309): nopagereadaloud is ALWAYS checked (unconditional), while notranslate is CONDITIONALLY checked — only when a server config flag is not the default value. Note: these halt the article content extraction/readout parser, not necessarily the Discover card rendering pipeline. They are in the same codebase but may be separate processing paths.| Requirement | Details |
|---|---|
| Minimum width | 1200px for hero card format. Smaller = thumbnail card (lower CTR). |
| Quality check | LOW_QUALITY_IMAGE flag marks images below threshold |
| Load tracking | elements_interaction/image_load_failure_count (telemetry counter) |
| Robots.txt | Image URL must NOT be blocked by robots.txt |
| Format | JPEG, PNG, WebP. DISCOVERY_CARD_WEBP_IMAGE_SUPPORT confirmed. |
| Integration | Evidence |
|---|---|
| Discover API endpoint | discover-pa.googleapis.com in SDK |
| Content viewer consistency | silk_discover_consistency_port |
| Datastore updates | silk_discover_datastore_update_port |
| Dismiss handling | silk_discover_dismiss_port |
| Content viewer rendering | silk_modern_content_viewer_port → ModernContentViewer |
| Content opening event | DISCOVER_CONTENT_VIEWER_OPEN |
freshness_delta_in_seconds appears in eblv.java (Smartspace weather/air quality metrics, not Discover). staleness_in_hours appears in the same weather metrics class. The bucket strings (1_TO_7_DAYS, etc.) appear in bemp.java:215 inside GestureSettingsPreferenceFragment, not a Discover class. The strings exist, but their confirmed scope is broader than Discover alone.| Bucket | Window | Weight |
|---|---|---|
1_TO_7_DAYS | 1-7 days old | Highest freshness weight |
8_TO_14_DAYS | 8-14 days old | Medium freshness weight |
15_TO_30_DAYS | 15-30 days old | Lowest freshness weight |
staleness_in_hours | 30+ days | Continuous staleness decay |
| Subtype | Meaning | Persistent Logging |
|---|---|---|
MID_BASED_NAIADES | Entity-driven personalization (Knowledge Graph MIDs) | ✓ |
QUERY_BASED_NAIADES | Search-history-driven personalization | ✓ |
RANKING_CHANGE | Ranking adjustment signal | ✓ |
RECALL_BOOST | Boosted retrieval priority from candidate pool | ✓ |
WPAS | Web Publisher Articles Signal (Google News Publisher Center) | ✓ |
QUERY_FOLLOW | Matched to queries user explicitly follows | — |
SPORTS | Sports content with dedicated treatment | ✓ |
FINANCE_TRIGGERED | Finance content triggered by interest | — |
FLIGHT_DEALS | Flight deals content | ✓ |
SHOPPING_PRICE | Shopping price update content | ✓ |
MEGASITELINKS | Megasitelinks content type | ✓ |
UPCOMING_DATES_TRIGGERED | Upcoming dates/events | ✓ |
HISTORICAL_SIRIUS | Historical Sirius content | — |
CACHE_EXPIRED | Cache-expired content refresh | — |
MULTIPLE_TRIGGERING | Content triggered by multiple signals simultaneously | — |
TRENDING | Trending content | ✓ (long + medium duration) |
TRENDING_WITH_LABEL | Trending content with topic label | ✓ |
TRENDING_AITN_WITH_LABEL | AITN trending with label | ✓ |
| Level | Telemetry Counter | Scope | Effect |
|---|---|---|---|
| Collection | filter_collection_status | Entire publisher/domain | ALL content from collection blocked |
| Entity | filter_entity_status | Individual URL | One item filtered |
filter_collection_status and filter_entity_status from bupa.java, tracked at /client_streamz/android_gsa/discover/app_content/. There is NO graduated suppression — it's binary. And there is NO equivalent "boost collection" flag anywhere in the system. Note: isCollectionHiddenFromEmberFeed (from boov.java, CollectionDetailsData) controls the Ember tab (a separate visual image discovery tab), NOT the Discover feed.| Mechanism | SDK String | Description |
|---|---|---|
| Counterfactual holdback | SHOW_SKIPPED_DUE_TO_COUNTERFACTUAL | Content withheld for A/B experiments |
| Counterfactual delivery | DELIVERED_COUNTERFACTUAL | Content delivered in counterfactual group |
| Fetched counterfactual | FETCHED_COUNTERFACTUAL | Content fetched but suppressed |
| Visibility repressed | VISIBILITY_REPRESSED_COUNTERFACTUAL | Visibility explicitly repressed (Google-wide VE logging from eyxv.java, not Discover-specific — used across Assistant, Lens, Search, etc.) |
| Rug pull | background_refresh_rug_pull_count | Cards withdrawn after being pushed |
CLIENT_COUNTERFACTUAL, SUBTYPE_COUNTERFACTUAL_DUMMY, DATA_USAGE_COUNTERFACTUAL_EXPERIMENT, SUBTYPE_ENTITY_PREVIEW_COUNTERFACTUAL, SUBTYPE_PROMPT_EXPANSION_COUNTERFACTUAL, SUBTYPE_MODELESS_BACK_TO_ALL_COUNTERFACTUAL, SUBTYPE_MODELESS_EASY_SWITCH_COUNTERFACTUAL — indicating counterfactual experiments run across multiple system components.bqmt.java, Beacon handles exactly two content types: ordinal 0 = SportsScoreAmbientDataDocument and ordinal 1 = InvestmentRecapAmbientDataDocument. Any other content type triggers: "Unsupported BeaconContent type: %s" and is rejected. Beacon is a narrow pipeline for sports scores and investment recaps only.| Event | SDK Evidence | Role |
|---|---|---|
DISCOVER_BEACON_PUSH_RECEIVED | CONFIRMED | Push received from server |
DISCOVER_BEACON_PUSH_ACCEPTED | CONFIRMED | Push accepted (budget/quality passed) |
DISCOVER_BEACON_PUSH_REJECTED | CONFIRMED | Push rejected (budget/quality/pref failed) |
DISCOVER_BEACON_PUSH_FINISHED | CONFIRMED | Push processing completed |
DISCOVER_BEACON_CONTENT_PUSH | CONFIRMED | Content push type identifier |
| Event | Role |
|---|---|
DISCOVER_BEACON_SEARCH_WRITE_START/END/FAILED | Search integration for beacon content |
DISCOVER_BEACON_SEARCH_DOCUMENT_CONVERSION_START/END/FAILED | Document conversion for search indexing |
DISCOVER_BEACON_RESOURCE_DOWNLOAD_START/END/FAILED/SKIPPED | Resource download for beacon content |
DISCOVER_BEACON_WORK_MANAGER_ENQUEUED/EXECUTION_START | WorkManager scheduling for beacon tasks |
DISCOVER_BEACON_PREFERENCE_OPENED/OPEN_INTENT_RECEIVED | User beacon preference management |
donated_sports_documents_count | Sports docs pushed to local search index |
dropped_sports_notifications_count | Sports notifications dropped |
incoming_sports_notifications_count | Incoming sports notification count |
search_cleared_count | Beacon search index data cleared |
| Service | Role |
|---|---|
google.internal.discover.discofeed.feedrenderer.v1.DiscoverFeedRenderer | Feed content rendering |
google.internal.discover.discofeed.streamingfeedrenderer.v1.DiscoverStreamingFeedRenderer | Streaming feed rendering |
google.internal.discover.discofeed.actions.v1.DiscoverActions | User action processing |
google.internal.discover.channels.v1.DiscoverChannelsRenderer | Topic channel rendering |
google.internal.discover.discofeed.homestack.v1.DiscoverHomestackFeedRenderer | Homestack widget feed |
tng.ga.discover.streaming | Real-time streaming protocol |
preprod-discover-pa.googleapis.com | Pre-production API endpoint |
| Event | Phase |
|---|---|
DISCOVER_STREAMING_CONNECTION_START | Connection initiated |
DISCOVER_STREAMING_INITIALIZATION_SENT | Init payload sent |
DISCOVER_STREAMING_INITIALIZATION_ACKNOWLEDGED | Server acknowledged init |
DISCOVER_STREAMING_ACTION_PAYLOAD_SENT | User action sent |
DISCOVER_STREAMING_ACTION_PAYLOAD_ACKNOWLEDGED | Server acknowledged action |
DISCOVER_STREAMING_TOKEN_UPDATE_SENT | Token refresh sent |
DISCOVER_STREAMING_NEXT_PAGE_REQUEST_SENT | Pagination request |
DISCOVER_STREAMING_NEXT_PAGE_RESPONSE_RECEIVED | Pagination response |
DISCOVER_STREAMING_DATA_OPERATIONS_PAYLOAD_RECEIVED | Data operations received |
DISCOVER_STREAMING_FEED_CLEAN_UP_REQUEST_SENT | Feed cleanup request |
DISCOVER_STREAMING_FEED_CLEAN_UP_RESPONSE_RECEIVED | Cleanup response |
DISCOVER_STREAMING_CONNECTION_CLOSED | Connection closed |
DISCOVER_STREAMING_CONNECTION_RETRY | Reconnection attempt |
INLINE_STAMP_VIEWER_FRAGMENT), carousel placement (INLINE_STAMP_VIEWER_SLIDE_FRAGMENT), and their own recommendation engine (STAMP_VIEWER_RECOMMENDATIONS). Standard entity matching and pCTR history are NOT required.| Event | SDK Evidence | Role |
|---|---|---|
STAMP_VIEWER_OPEN_FROM_DISCOVER | CONFIRMED | Web Story opened from Discover feed |
STAMP_VIEWER_OPEN_FROM_SEARCH | CONFIRMED | Web Story opened from Search results |
STAMP_VIEWER_OPEN_FROM_DEEPLINK | CONFIRMED | Web Story opened from deeplink |
INLINE_STAMP_VIEWER_FRAGMENT | CONFIRMED | Inline rendering in feed (not behind click) |
INLINE_STAMP_VIEWER_SLIDE_FRAGMENT | CONFIRMED | Carousel slide placement |
STAMP_VIEWER_RECOMMENDATIONS | CONFIRMED | Own recommendation engine |
STAMP_VIEWER_RECOMMENDATIONS_READY_BEFORE_USER_REACHED_END | CONFIRMED | Recommendations preloaded before story ends |
SEARCH_WEB_STORY | CONFIRMED | Web Story in search results |
| Event | SDK Evidence |
|---|---|
DISCOVER_ADS_CARD_CLICK | CONFIRMED — paid ad card click event |
DISCOVER_ADS_BOC_ICON | CONFIRMED — Back-of-Card "Ad" icon |
FEED_AD_WTA | CONFIRMED — "Why This Ad" transparency |
discover-ads | CONFIRMED — ads subsystem identifier |
| Cluster Type | Description |
|---|---|
neoncluster | Primary content cluster |
geotargetingstories | Location-based stories |
deeptrendsfable | Deep trend narratives |
deeptrends | Trending topics |
freshvideos | Recent video content |
mustntmiss | Priority/must-read content |
newsstoriesheadlines | Breaking news headlines |
homestack | Widget cards (weather, sports) |
garamondrelatedarticlegrouping | Related article groups |
trendingugc | User-generated trending content |
signinlure | User acquisition / sign-in prompt |
iospromo | Cross-platform promotion |
moonstone | Internal codename cluster |
| Event | SDK Evidence | Stage |
|---|---|---|
FETCH_ELIGIBILITY_START | CONFIRMED | Check begins |
FETCH_ELIGIBILITY_END_LOCAL | CONFIRMED | Stage 1: Local device checks |
FETCH_ELIGIBILITY_END_NETWORK | CONFIRMED | Stage 2: Server validation |
FETCH_ELIGIBILITY_END_GMSCORE | CONFIRMED | Stage 3: Google Mobile Services |
| Reason | SDK String |
|---|---|
| Discover disabled | INELIGIBLE_DISCOVER_DISABLED |
| Non-Google search engine | INELIGIBLE_DISCOVER_DISABLED_BY_DSE |
| Enterprise policy | INELIGIBLE_DISCOVER_DISABLED_BY_ENTERPRISE_POLICY |
| User-level block | USER_INELIGIBLE_FOR_DISCOVER |
INELIGIBLE_DISCOVER_DISABLED_BY_DSE means if a user changes their default search engine to anything other than Google, Discover is automatically disabled. Search engine choice directly controls content feed access./persistent/ namespace, with paths dynamically created per content item. This reveals the complete data model for how Discover tracks user behavior. Path counts vary per user — structure and category names are universal./persistent/do_{contentID} (the dismiss action) and dismiss_overlay_{contentID} (the overlay UI state). This dual-write pattern enables both server-side sync and local UI persistence. Content IDs are 64-bit signed integers.| Path Pattern | Function | Count |
|---|---|---|
/persistent/do_{id} | Records that user opened the dismiss overlay for content | Per-content IDs |
dismiss_overlay_{id} | Tracks the actual dismissal state within the overlay | Paired with do_{id} |
Version suffix 2] | Serialized version marker for state synchronization | 25 trailing |
/persistent/heart/ID_TYPE_CANONICAL_URL/{canonical_url}. Likes are keyed by the article's canonical URL, not by an internal ID. This means the like signal is directly tied to the URL and feeds back into personalization ranking.| URL Pattern | Content Types |
|---|---|
| Standard article URLs (major publishers) | News articles, features |
YouTube videos (youtube.com/watch?v=) | Video content |
Social media posts (x.com/*/status/*) | Social media posts |
| Niche/specialty publisher URLs | Specialized content |
/persistent/follows/{entity} with /g/ (Google KG) or /m/ (Freebase MID) prefixes. Subscriptions are a parallel key: /persistent/subscriptions/{entity}. Each follow also has a timestamp_identifier for ordering.| Path Pattern | Entity Type | Examples |
|---|---|---|
/persistent/follows//m/{mid} | Freebase MID entities | /m/0xxxx_, /m/0yyyy_, /m/0zzzz (demo MIDs) |
/persistent/follows//g/{id} | Google KG entities | /g/11xxxxxxxxx, /g/11yyyyyyyyy (demo KG IDs) |
/persistent/follows/{name} | Named publishers | {publisher_name} (demo — publisher names redacted) |
/persistent/subscriptions/{entity} | Parallel subscription key | Same entities as follows |
/persistent/tombstone_{contentID}/data permanently prevents that content from resurfacing. Content IDs in tombstones match the dismiss overlay IDs, creating a three-layer dismissal chain: do_{id} → dismiss_overlay_{id} → tombstone_{id}/data./persistent/save/{contentID}. Saved articles share the same 64-bit content IDs used across the entire state model. This allows cross-referencing between saved, liked, dismissed, and expanded content.| Category | Path Pattern | Function |
|---|---|---|
| Text Expansion | /persistent/expandable_text/{id}/expansion_state | Tracks whether user expanded AI summary or article text |
| Content Interaction | /persistent/content_on_back/{id}/SURVEY_ON_CLICK/{timestamp}/... | Tracks back-button survey responses, tap state, long-click duration |
| Card Menu | /persistent/cardMenuActiveSubmenu | Which card menu submenu is currently active |
| Gallery | /persistent/gallery/{id}/slide_index | Current position in carousel galleries |
| Feed State | /persistent/discoverfeed/State | Overall feed session state |
| Game Content | /persistent/-game-content-data-/{entity} | Gaming content state |
| WAA State | /persistent/waa_state | Web & App Activity toggle state |
Category.flag_name flags control Discover rendering, video handling, content viewer behavior, weather widgets, sports widgets, and AI summaries in real-time.| Category | Count | Flags |
|---|---|---|
| ContentViewer | 13 | enable_creator_header_in_video_anchor_content, enable_creator_header_in_viewer, enable_deep_dive_entry_point_for_aio_videos, enable_deep_dive_entry_point_for_videos, enable_divider_in_video_viewer_anchor, enable_extra_padding_in_video_anchor, enable_font_updates, enable_icon_entrypoint_for_non_embeddable_videos, enable_status_bar_scrim_protection, enable_video_anchor_expanded_tap_target, enable_viewer_header_back_button, force_immersive_initial_state, use_icon_entry_point_button |
| HomestackFeed | 9 | enable_chance_of_rain_on_weather_widget, enable_cta_on_weather_widget_, enable_divider_after_homestack, enable_divider_with_utilities, enable_greater_sign_as_weather_cta, enable_high_and_low_on_weather_widget, enable_sds_aligned_sports_widget_status_chip, enable_chance_of_rain_and_high_low_on_weather_widget_with_precip_icon, enable_chance_of_rain_and_high_low_on_weather_widget_with_precip_text |
| PrefabsRendering | 9 | disable_ai_summary_disclaimer, disable_creator_header_secodary_image, disable_gallery_horizontal_swipe_on_minus_one, enable_ai_summary_alternative_expandable_text, enable_favicon_outline, enable_increased_header_height_for_aio, enable_vertically_centered_gallery_buttons, title_expands_ai_summary, title_overlay_cta_arrow |
| TenForwardVideoPackaged | 3 | enable_xuikit_rendering_for_header_and_anchored_content, enable_framework_multi_state_viewer, enable_lfv_viewer |
| SportsWidget | 3 | disable_sports_widget_design_tweaks_status_pill, enable_status_tweaks_for_all_sports, enable_status_tweaks_live_text_color_for_all_sports |
| DiscoverPostContentRendering | 3 | append_open_content_text_to_post_body, move_post_title_above_media, enable_post_singleton_source_cta_on_footer |
| HomestackChrome | 2 | enable_homestack_on_bling, enable_homestack_on_clank |
| DiscoverGaramondRendering | 2 | apply_fake_garamond_header, show_publisher_in_footer |
| DiscoverArticleContentRendering | 1 | enable_title_overlay_for_non_aio_articles |
| DiscoverCreatorProfileLinkRendering | 1 | increase_header_height_with_secondary_text |
| DiscoverRenderNext | 1 | use_discover_time_stamp_text |
| DiscoverRowCompositeRendering | 1 | enable_hiding_and_showing_carousel |
| HomestackBentoFramework | 1 | enable_follow_widget_for_trending_sports |
| HomestackTopOfFeed | 1 | homestack_containment |
| TweedRendering | 1 | enable_mvr_prefab_full_bleed_ui_mobile_web |
HomestackChrome.enable_homestack_on_clank — "Clank" is Chrome's internal codename, confirming Homestack integration with ChromePrefabsRendering.disable_ai_summary_disclaimer — flag to remove "Generated with AI" disclaimerstitle_expands_ai_summary — clicking a title can auto-expand the AI summaryapply_fake_garamond_header — can simulate related-article groupings syntheticallyDiscoverRowCompositeRendering.enable_hiding_and_showing_carousel — controls carousel visibility dynamicallygws:NNNNNNN. Each represents a server-side A/B test or feature rollout controlling ranking, rendering, and feed composition. Stored in SESSION::ServerExperimentIds. Actual IDs redacted — format and scale are authentic.| Metric | Value |
|---|---|
| Total experiments per session | ~150 |
| ID format | gws:NNNNNNN (7–9 digit numeric) |
| ID range span | Primary cluster + occasional high outliers |
At any given time, a single user is enrolled in ~150 concurrent experiments. These experiment IDs control:
| Meta Label | Observed Value | Significance |
|---|---|---|
Panoptic Source Channel | Per-card channel identifier | Identifies the source pipeline (e.g., neoncluster, geotargetingstories) that surfaced this content |
DocFingerprint | 14-char alphanumeric hash (e.g., tDSTsgTVG0c5FM) | Unique document fingerprint for deduplication across sessions and devices |
Web and App Activity Enabled | Boolean | Whether WAA is active — controls personalization eligibility |
Discover Personalization Enabled | Boolean | Whether per-user interest personalization is active for this card |
NeoformId | 8-char hash (e.g., uoPWxbzo) | Neoform rendering template identifier — maps to specific card layout variant |
Is Feature Personalized | Boolean | Whether this specific card was personalized (vs. generic/trending) |
Is User Signed-In | Boolean | Signed-in state affects which signals feed the ranking model |
Sherlog URL | URL or "Not opted in to Sherlog" | Google's internal debugging/logging system URL for this card render — when present, enables detailed server-side diagnostics |
| Signal | Example | Purpose |
|---|---|---|
Card Title | Full article title as served | Title as delivered to the ranking model |
Card URL | Canonical content URL | The URL Discover associates with this content |
Card category | Topic entities (e.g., "Winter storm, Road conditions, Meteorology") | Entity tags used for interest matching |
Need bundle Type | Content delivery classification | How the card was bundled for delivery |
Each card exposes a standardized menu with these actions:
fake_publisher_block_menu_line string reveals the publisher-level block UI. When a user selects "Don't show content from [Publisher]", it creates a filter_collection_status event that blocks ALL content from that domain — not just the specific article.| Config | Size | Key Fields | Decoded Value |
|---|---|---|---|
DiscoverEligibility | 2 B | Field 1: boolean | true — Discover is eligible for this user |
DiscoverLanguage | 4 B | Field 1 → Field 4: boolean | false — Language not manually selected (auto-detected) |
RefreshMetadata | 9 B | Field 1: timestamp (microseconds) | Last refresh: 202X-XX-XX XX:XX:XX UTC |
GrowthTracking | 13.2 KB | Field 5: feature milestones; Field 6: daily usage | 79 days tracked (2025-11-25 → 2026-02-23), 2 feature milestones |
| Feature | Start | End | Milestones |
|---|---|---|---|
| Feature 1 | 2025-08-03 | 2025-09-22 | Aug 19, Sep 22 |
| Feature 2 | 2025-09-22 | 2025-10-14 | Oct 14 |
| Metric | Value |
|---|---|
| Days tracked | 93 days |
| First seen | 2025-07-18 |
| Last seen | 2025-10-19 |
| Entries (Field 6) | 95 daily usage records |
| Field | Value |
|---|---|
| Active Feed | MAIN_FEED |
| Session State Size | 9,145 bytes |
| Root Node | TYPE_UNDEFINED::root::0 |
| Tree Structure | childgroup.f::828783447 |
| Rendering State Key | /discoverfeed/renderingstate |
| Last Interaction | 202X-XX-XX XX:XX:XX (Unix: 1766996656) |
| # | Title (demo) | Source (demo) | AI | URLs | Paths | Size (B) |
|---|---|---|---|---|---|---|
| 1 | Major weather system brings record conditions to eastern seaboard... | Regional News Outlet A | AI | 18 | 14 | ~12.7K |
| 2 | Senior lawmaker makes bold prediction ahead of midterm cycle... | National News Network | AI | 19 | 14 | ~12.8K |
| 3 | Creator Profile Link card | (Creator card) | 19 | 21 | ~13.8K | |
| 4 | Federal agency releases large cache of previously undisclosed records... | News Outlet B | AI | 19 | 14 | ~13.2K |
| 5 | Professional sports team extends historic winning streak... | (Sports) | AI | 20 | 14 | ~12.7K |
| 6 | Two neighboring nations reach diplomatic agreement after tensions... | Wire Service | AI | 20 | 14 | ~13.1K |
| 7 | Creator card — [Business Publisher] | Follow [Business Publisher] | 13 | 18 | ~11.9K | |
| 8 | League team dominates rival in late-season matchup... | Sports/League | AI | 18 | 14 | ~12.8K |
| 9 | Creator card — [Entertainment Publisher] | Follow [Entertainment] | 18 | 19 | ~11.7K | |
| 10 | Creator card — [International News Outlet] | Follow [International News] | 13 | 18 | ~10.5K | |
| 11 | Creator card — [Major Newspaper] | Follow [Major Newspaper] | 18 | 16 | ~14.2K | |
| 12 | Upcoming year to feature rare astronomical events... | (Science) | AI | 19 | 13 | ~12.7K |
| 13 | Creator card — [Cable News Network] | Follow [Cable News] | 10 | 18 | ~10.1K | |
| 14 | Creator card — [Education Publisher] | Follow [Education] | 10 | 18 | ~10.4K | |
| 15–16 | Creator cards (various) | (Creator cards) | 10 | 18 | ~10.5K | |
| 17 | Emergency services respond to infrastructure incident in metro area... | Local TV Station | AI | 18 | 14 | ~12.6K |
| 18 | Creator card (various) | (Creator card) | 10 | 18 | ~10.5K | |
| 19 | Iconic cultural figure passes away at advanced age... | International Broadcaster | AI | 20 | 14 | ~13.0K |
| 20 | Creator card (various) | (Creator card) | 12 | 19 | ~13.8K | |
| 21 | Government agency announces new policy affecting travelers... | National Broadcaster | AI | 19 | 14 | ~12.8K |
| 22 | Creator card (various) | (Creator card) | 10 | 18 | ~10.7K | |
| 23 | Centenarian veteran honored at professional sporting event... | Sports Team Media | AI | 19 | 14 | ~12.9K |
| 24 | Military government proceeds with disputed electoral process... | International News Service | AI | 19 | 14 | ~13.0K |
| 25 | New research reveals health concerns linked to everyday consumer product... | (Health) | AI | 13 | 13 | ~11.7K |
| 26 | Creator card — [Finance Publisher] | Follow [Finance] | 18 | 19 | ~11.9K | |
| 27 | Civilian population faces humanitarian crisis amid ongoing conflict... | International News Service | AI | 20 | 14 | ~13.2K |
| 28 | Significant seismic event detected near island nation's coast... | Global News Channel | AI | 19 | 14 | ~13.0K |
| 29 | Region braces for extreme cold as arctic weather system approaches... | Regional TV Station | AI | 20 | 14 | ~13.0K |
| Type | Count | % |
|---|---|---|
| News articles with AI summaries | 17 | 59% |
| Creator profile link cards (follow CTAs) | 12 | 41% |
| Metric | Value |
|---|---|
| Avg card size (articles) | ~12,800 bytes |
| Avg card size (creator) | ~11,400 bytes |
| Total feed payload | ~350 KB for 29 cards |
***Generated with AI, which can make mistakes disclaimersNDiscoverCreatorProfileLinkRendering.increase_header_height_with_secondary_text flagPrefabsRendering.title_expands_ai_summary and PrefabsRendering.disable_ai_summary_disclaimer| Period | Value |
|---|---|
| First observation | 2025-07-18 |
| Last observation | 2025-10-19 |
| Duration | 93 days (continuous) |
| Daily records | 95 entries (some gaps filled) |
DISCOVER_LAUNCH | DISCOVER_LAUNCH_FINISHED | DISCOVER_LAUNCH_FINISHED_OFFLINE |
DISCOVER_LAUNCH_FOREGROUND_START | DISCOVER_UI_STARTING | DISCOVER_FRAGMENT_INSTANTIATE |
DISCOVER_VIEW_SHOWN | DISCOVER_VISIBLE_TO_USER | DISCOVER_HIDDEN_FROM_USER |
DISCOVER_ENABLED | DISCOVER_DISABLED_USER | DISCOVER_AUTO_ENABLED |
DISCOVER_AUTO_ENABLE_ELIGIBLE | DISCOVER_INELIGIBLE_USER | DISCOVER_STATE |
DISCOVER_HOME_FEED_VIEW_CONTROLLER_INSTANTIATE | DISCOVER_NON_HOME_FEED_VIEW_CONTROLLER_INSTANTIATE | FIRST_DRAW_DONE_DISCOVER_GOOGLE_APP |
DISCOVER_FEED_REQUEST_START | DISCOVER_FEED_REQUEST_SENT | DISCOVER_FEED_REQUEST_SUCCESS |
DISCOVER_FEED_REQUEST_FAILURE | DISCOVER_FEED_REQUEST_FINISHED | DISCOVER_FEED_RESPONSE_RECEIVED |
DISCOVER_INTERACTIVE_FEED_REQUEST_START | DISCOVER_INTERACTIVE_FEED_REQUEST_FINISHED | DISCOVER_BACKGROUND_FEED_REQUEST_START |
DISCOVER_HOMESTACK_FEED_REQUEST_START | DISCOVER_CHANNELS_FEED_REQUEST_START | DISCOVER_VIEWER_FEED_REQUEST_START |
DISCOVER_SINGLE_WEB_FEED_REQUEST_START | DISCOVER_PINNED_CONTENT_FEED_REQUEST_START | DISCOVER_RELATED_VIDEOS_FEED_REQUEST_START |
DISCOVER_FEED_TUNING_REFRESH_REQUEST_START | DISCOVER_REQUEST_BACKEND_DISCOFEED | DISCOVER_REQUEST_BACKEND_GWS |
DISCOVER_REQUEST_BACKEND_UNSPECIFIED | DISCOVER_REQUEST_SERVER_NETWORK_SPLIT | DISCOVER_REQUEST_BUILDER |
DISCOVER_NEXT_PAGE | DISCOVER_NEXT_PAGE_START | DISCOVER_NEXT_PAGE_END |
DISCOVER_NEXT_PAGE_END_OFFLINE | DISCOVER_NEXT_PAGE_EAGER_START | DISCOVER_NEXT_PAGE_SILENT_START |
DISCOVER_NEXT_PAGE_REQUEST_START | DISCOVER_NEXT_PAGE_FEED_REQUEST_START | DISCOVER_PAGINATION_NEXT_PAGE |
DISCOVER_FEED_PAGINATION_START | DISCOVER_FEED_PAGINATION_END | DISCOVER_FEED_PAGINATION_REQUEST_FINISHED |
DISCOVER_SILENT_PAGINATION_START | DISCOVER_SILENT_PAGINATION_END |
DISCOVER_REFRESH | DISCOVER_REFRESH_SUCCESS | DISCOVER_REFRESH_ERROR |
DISCOVER_REFRESH_DISABLED | DISCOVER_REFRESH_FETCH_SUCCEEDED | DISCOVER_REFRESH_FETCH_FAILED |
DISCOVER_REFRESH_DISPLAY_CANCELLED | DISCOVER_REFRESH_PILL_TAP | DISCOVER_REFRESH_PILL_TAP_START |
DISCOVER_REFRESH_PILL_TAP_END | DISCOVER_REFRESH_PILL_PREPARATION | DISCOVER_REFRESH_PILL_PREPARATION_END |
DISCOVER_MANUAL_REFRESH | DISCOVER_MODEL_REFRESH_START | DISCOVER_MODEL_REFRESH_END |
DISCOVER_MODEL_REFRESH_DECISION_START | DISCOVER_MODEL_REFRESH_DECISION_END | DISCOVER_RELOAD_FINISHED |
DISCOVER_TNG_INTERACTIVE_REFRESH | DISCOVER_TNG_INTERACTIVE_REFRESH_START | DISCOVER_TNG_INTERACTIVE_REFRESH_COMPLETED |
DISCOVER_TNG_PULL_TO_REFRESH_START | DISCOVER_TNG_PULL_TO_REFRESH_SUCCESS | DISCOVER_TNG_PULL_TO_REFRESH_ERROR |
DISCOVER_TNG_PULL_TO_REFRESH_CANCEL | DISCOVER_TNG_PULL_TO_REFRESH_DISABLED | DISCOVER_TNG_BACKGROUND_REFRESH_START |
DISCOVER_TNG_BACKGROUND_REFRESH_SUCCESS | DISCOVER_TNG_BACKGROUND_REFRESH_FAILURE | DISCOVER_TNG_BACKGROUND_REFRESH_COMPLETE |
DISCOVER_TNG_ACTION_UPLOAD_START | DISCOVER_TNG_ACTION_UPLOAD_SUCCESS | DISCOVER_TNG_ACTION_UPLOAD_FAILURE |
DISCOVER_TNG_ACTION_UPLOAD_COMPLETE | DISCOVER_TNG_TAP_TO_UPDATE_START | DISCOVER_TNG_HOME_TAB_REFRESH_START |
| Category | Counter |
|---|---|
| Surface | surface_name |
| Attention | attention_log |
| Folding | folding_state |
| GC | feeds_gc_count, persisted_feeds_post_gc_count |
| Session close | session_close/enqueue, session_close/refresh, session_close/ineligible |
| Actions | client_actions_count |
| Auth | response_auth_refresh, missing_auth_header_count |
| Search box | search_box_click_count |
| Cache | stream_cache_hit_count, stream_cache_miss_count, stream_cache_cleared_count |
| Feed show | suggestions_shown_count, minus_one_feed_show_count |
| Refresh pill | refresh_pill_hidden_count, scrolled_till_refresh_pill_delta_count |
| URL fetcher | url_fetcher/request_count, url_fetcher/http_error_count |
| Offline | cui/offline_to_online_count, cui/next_page_response_received |
| Trim memory | minusone/on_trim_memory_count |
| Streaming | streaming_connection_lock, streaming_connection_unlock, streaming_connection_duration, streaming_session_type_mismatch_v2, streaming_next_page_response_received, streaming_connection_reopened_due_to_session_switch, streaming_connection_state_when_sending_client_actions_failed |
| Filtering | content/filter_entity_status, content/filter_collection_status |
| Refresh | background_refresh_for_type_count, background_refresh_rug_pull_count, deferred_background_refresh_count, background_refresh_scheduled_delay, background_refresh/schedule_attempt |
| Content | content_viewer_empty_data_count, discover_subtree_content_fetch_duration |
| Beacon | beacon/search_cleared_count, beacon/donated_sports_documents_count, beacon/dropped_sports_notifications_count, beacon/incoming_sports_notifications_count |
| Scroll | scroll_while_viewport_hidden_count |
| Back to top | back_to_top_button_shown_count |
| TNG | classic_minus_one_created_in_tng, touches_on_orphaned_minusone_window_count, minus_one_non_gced_window_count |
| Notification | feed_launch_from_notification_appflow_count |
| Image | elements_interaction/image_load_failure_count |
| Gestures | gesture_exclusion/count, gesture_exclusion/total_height |
| On-device | on_device_content/metadata_size |
| Session | session/exception_v1_v2_difference_count |
| SRS | srs/hydration_status |
| Finding | SDK Evidence | Verdict |
|---|---|---|
| pCTR model exists and is triggered | PCTR_MODEL_TRIGGERED — exists as event string, but in a generic telemetry enum, not a Discover-specific class | PARTIAL |
| og:image is mandatory for card rendering | og:image + EMBER_FEED_THUMBNAILS_DOWNLOADED | CONFIRMED |
| og:title feeds into ranking | og:title extracted into ContentMetadata protobuf and sent to server. No direct client-side link to pCTR scoring. The pCTR model is server-side. | PARTIAL |
| article:content_tier parsed for paywall | article:content_tier — exact string | CONFIRMED |
| isCollectionHiddenFromEmberFeed is boolean | isCollectionHiddenFromEmberFeed= (field assignment pattern) — confirmed as boolean, but on CollectionDetailsData (boov.java) for the Ember tab, not the Discover feed. The Discover-specific filters are filter_collection_status / filter_entity_status from bupa.java. | PARTIAL |
| filter_collection_status counter exists | filter_collection_status telemetry counter | CONFIRMED |
| filter_entity_status counter exists | filter_entity_status telemetry counter | CONFIRMED |
| Counterfactual suppression mechanism | SHOW_SKIPPED_DUE_TO_COUNTERFACTUAL, DELIVERED_COUNTERFACTUAL, FETCHED_COUNTERFACTUAL, VISIBILITY_REPRESSED_COUNTERFACTUAL | CONFIRMED |
| Rug pull mechanism exists | background_refresh_rug_pull_count | CONFIRMED |
| Beacon push system (5 events) | All 5 DISCOVER_BEACON_PUSH_* events confirmed | CONFIRMED |
| Web Stories have dedicated pipeline | INLINE_STAMP_VIEWER_FRAGMENT, STAMP_VIEWER_RECOMMENDATIONS | CONFIRMED |
| Paid ads in Discover feeds | DISCOVER_ADS_CARD_CLICK, DISCOVER_ADS_BOC_ICON | CONFIRMED |
| 18 PERSONAL_UPDATE subtypes | 18 Discover-specific subtypes extracted from SDK (3 AIM-only excluded) | CONFIRMED |
| Freshness measured in seconds | freshness_delta_in_seconds — string exists but appears in eblv.java (Smartspace weather/air quality metrics), not a confirmed Discover class | PARTIAL |
| 3 freshness decay buckets | 1_TO_7_DAYS, 8_TO_14_DAYS, 15_TO_30_DAYS — strings exist but appear in bemp.java (GestureSettingsPreferenceFragment), not a confirmed Discover class | PARTIAL |
| Staleness measured in hours | staleness_in_hours — string exists but appears in eblv.java (weather metrics), not a confirmed Discover class | PARTIAL |
| Geller interest graph syncs via named synclets (shared infra, consumed by Discover) | SYNCLET_NAME_ASSISTANT_AIP_TOP_ENTITIES_PERIODIC_REFRESH | CONFIRMED |
| 276 DISCOVER_ events | 276 unique DISCOVER_ prefixed strings extracted | CONFIRMED |
| 56 Discover telemetry counters | 56 unique instrumentation points for Discover feed behavior | CONFIRMED |
| 6 gRPC services | All 6 service paths extracted including streaming variant | CONFIRMED |
| WPAS content type from Publisher Center | SUBTYPE_PERSONAL_UPDATE_WPAS | CONFIRMED |
| RECALL_BOOST increases retrieval priority | SUBTYPE_PERSONAL_UPDATE_RECALL_BOOST | CONFIRMED |
| DSE lock-in disables Discover | INELIGIBLE_DISCOVER_DISABLED_BY_DSE | CONFIRMED |
| Enterprise policy can disable Discover | INELIGIBLE_DISCOVER_DISABLED_BY_ENTERPRISE_POLICY | CONFIRMED |
| WebP image support | DISCOVERY_CARD_WEBP_IMAGE_SUPPORT | CONFIRMED |
| Multi-language feed support | discover_multi_language_visibility, DISCOVER_MULTIPLE_LANGUAGE_PAGE_LINK | CONFIRMED |
| Beacon push bypasses normal ranking | Beacon pipeline separate from ranking events; ACCEPTED/REJECTED suggests filtering | PARTIAL |
| Finding | Evidence | Status |
|---|---|---|
| 14 persistent state categories track all user interactions | 14 path categories under /persistent/ namespace captured from SDK state | CONFIRMED |
| Hearts/likes are keyed by canonical URL, not internal ID | /persistent/heart/ID_TYPE_CANONICAL_URL/{url} pattern observed | CONFIRMED |
Follows use Knowledge Graph MIDs (/m/) and KG IDs (/g/) | Follow paths with /m/ and /g/ prefixes + named publishers | CONFIRMED |
| Tombstones create permanent per-content suppression | /persistent/tombstone_{id}/data paths matching dismiss overlay IDs | CONFIRMED |
| Three-layer dismissal chain (do → dismiss_overlay → tombstone) | Dismiss paths + tombstones share same content IDs | CONFIRMED |
| 51 runtime feature flags across 15 categories | All Category.flag_name flags captured from rendered feed cards | CONFIRMED |
| ~150 concurrent GWS experiments per session | 150 gws:NNNNNNN IDs from SESSION::ServerExperimentIds | CONFIRMED |
| Majority of articles carry AI-generated summaries | Observed articles with ***Generated with AI disclaimer | CONFIRMED |
| Significant portion of feed entries are creator follow cards | Feed contains NDiscoverCreatorProfileLinkRendering cards | CONFIRMED |
| Per-card diagnostic metadata includes 8 signal fields | Panoptic Source, DocFingerprint, WAA, NeoformId, Sherlog, etc. on every card | CONFIRMED |
| Growth tracking covers 90+ days of daily usage | GrowthTracking payload: daily records spanning multiple months | CONFIRMED |
| DiscoverEligibility is a single boolean config | 2-byte serialized config: Field 1 = true | CONFIRMED |
| Feed tree: TYPE_UNDEFINED::root::0 → COLLECTION → CLUSTER → CARD | Root node, childgroup.f, and 13 cluster types observed in session state | CONFIRMED |
| HomestackChrome.enable_homestack_on_clank confirms Chrome = Clank | Feature flag with "clank" (Chrome's internal codename) in SDK state | CONFIRMED |
| Finding | Evidence | Status |
|---|---|---|
| OG tags exist exclusively in a single SDK module (5 tags, 0 in other 11 modules) | Binary search across all 12 SDK modules: og:title×1, og:image×2, og:image:secure_url×1, og:locale×1, og:site_name×1 — all in one module only | CONFIRMED |
| Title fallback chain: Schema.org (TEXT_TYPE_TITLE) → og:title → twitter:title → title | Deobfuscated Title Supplier + Fallback Supplier shows exact Optional.or() chain with const-string instructions. Schema.org JSON-LD checked first via dkri.java:1088-1092 + dknl.java:27-29. | CONFIRMED |
| Image fallback chain: og:image → twitter:image → og:image:secure_url → twitter:image:src → image | Deobfuscated Image Callable + Fallback Supplier shows 5-step Optional.or() fallback. From dkpj.java: case 0 = twitter:image, case 2 = og:image:secure_url, case 3 = twitter:image:src, case 4 = image. After og:image (from dkri.java:1100). | CONFIRMED |
Blocking metatags nopagereadaloud and notranslate halt pipeline | Paywall Detector: const-string "nopagereadaloud" + "notranslate" checked via Stream.concat → filter → allMatch, throws "The page contains blocking metatag: %s" | CONFIRMED |
eblv.java), 3 freshness buckets (exist in gesture settings bemp.java), staleness_in_hours (weather metrics), beacon bypass (inference). Zero findings contradicted by evidence. pCTR/scoring claims corrected after deobfuscation revealed MAX_HIT_WEIGHT formula belongs to Icing search suggest, not Discover.