Skip to content

Emit overlay identity and presentation parent on route_change - #49

Closed
Chinmay-KB wants to merge 2 commits into
mainfrom
cursor/route-change-overlay-identity-ae5d
Closed

Emit overlay identity and presentation parent on route_change#49
Chinmay-KB wants to merge 2 commits into
mainfrom
cursor/route-change-overlay-identity-ae5d

Conversation

@Chinmay-KB

@Chinmay-KB Chinmay-KB commented Sep 1, 2026

Copy link
Copy Markdown
Collaborator

Why

Manifest (visual app map) cannot nest overlays under the screen that opened them. Unnamed sheets collapsed to ModalBottomSheetRoute<void>, overlayKind called bottom sheets modal, and exploration screenshot suppression dropped overlay after-frames when there was no claimed tap.

This change is additive. fromRoute, route, and navigation keep their existing meaning. The SDK does not invent RouteSettings.name or product CTA copy.

What

On every route_change:

  • Split identity: routeName / routeType / routeNamed (and matching from*)
  • Closed overlayKind: page | sheet | dialog | popup | unknown (sheets are sheet, not modal)
  • Overlay push presentation parent: presentedOver* (route immediately below on the same navigator) and hostPage* (walk down to overlayKind == page, then parent navigators)
  • Bounded same-navigator routeStack (max 16, routeStackTruncated when trimmed)
  • Copy causeTargetFingerprint / causeGesture from the claimed interaction at emit time (claim-time snapshots miss post-pointer-up target resolution)
  • Bypass exploration screenshot suppression when causeEventId != null or overlayKind != page

Presentation parent and hostPage* are omitted on page pushes, pops, and when the observer never recorded the underlying page. The SDK does not invent /home.

Paywall → unnamed sheet

fromRoute          = /subscriptionPaywall
overlayKind        = sheet
presentedOverRoute = /subscriptionPaywall
hostPageRoute      = /home

Tests

  • Unit coverage for mechanical overlay classification
  • Widget coverage for named popup → unnamed sheet identity, presentation parent, routeStack, claimed cause fingerprint, and overlay capture under exploration suppression
  • Collector mapper passthrough for the new fields (routeNamed: false included)
  • Existing modal visual fixtures assert sheet / dialog kinds without inventing an unobserved host page

Package version is 0.8.13. Route-change schema version stays 2.

Full packages/tugboat suite: 376 tests passed.

Open in Web Open in Cursor 

cursoragent and others added 2 commits September 1, 2026 15:21
Split routeName/routeType/routeNamed without changing fromRoute, route, or
navigation. Classify overlays as page|sheet|dialog|popup|unknown, record
presentedOver/hostPage and a bounded routeStack, copy cause fingerprints
from claimed taps, and capture overlay after-frames under exploration
screenshot suppression.

Co-authored-by: Chinmay Kabi <chinmay@blend.to>
Claim-time snapshots miss tap target fingerprints that resolve after
pointer-up. Refresh causeTargetFingerprint and causeGesture from the
claimed interaction when the event is published. Widget tests now
observe /home before overlay pushes and avoid inventing hostPageRoute
when the initial page was not recorded.

Co-authored-by: Chinmay Kabi <chinmay@blend.to>
@cursor

cursor Bot commented Sep 1, 2026

Copy link
Copy Markdown

Folded into #47 (native-capture branch) so overlay identity and native CPU land on one PR. Closing this duplicate.

@Chinmay-KB Chinmay-KB closed this Sep 1, 2026
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.

2 participants