Skip to main content

Page dispatch

:::info Copied from the repository This page is app.gap.Tsum/PAGE_DISPATCH.md, copied in by the site's sync step. Regenerate it there with npm run pages:docs; edits here are lost at the next sync. :::

What the script does when it works out which screen is on display.

gPages (src/pages.ts) detects the page, then broadcasts it to the subscriptions registered in src/pageHandlers.ts. They run one at a time, in the order below, and the first one to touch the screen ends the round -- everything after it would be acting on a frame that no longer exists.

A subscription is a list of steps rather than a function body, so the steps column below is the whole of what it does: which button, which wait, in what order. settle is a ceiling and not a cost -- it ends when the screen stops moving -- where sleep is spent in full, and is only used where there is no still frame to wait for.

28 subscriptions, 44 pages, 6 navigation destinations.

The pipeline

The first subscription to touch the screen ends the queue, and everything below it is skipped -- it would be reading a frame that no longer exists. Which ones touch it is the band's answer rather than each one's: guard, dismiss and navigate act unless their acts declined. notify is the exception and runs either way: it records what was seen rather than acting on what is there.

bandprioritysubscriptionspurpose
observe1002Read-only state updates derived from the page itself. No taps and no expensive captures -- these describe the frame the recorders are about to measure, and they are the only band guaranteed to run whatever else the queue decides.
record804Measurements and captures that are only valid while the screen is untouched: round statistics, corpus frames, debug shots. Everything below this line may tap.
guard601Anything that is not a game screen at all (native dialogs, the root warning) is handled here, before the rest of the queue is allowed to act on what it sees.
dismiss408Close the interruptions that stand between the script and where it is going -- offers, popups, error panels.
navigate2011Move the app toward the goal the look was made with. Silent when the caller gave none -- every look outside navigate() -- and never on the goal page itself, so nothing can tap the script off its destination.
notify102Logging and progress bookkeeping. Nothing here changes what is on screen or what anything else decides -- which is why this band runs even when something above it has acted: it is recording what was seen, not acting on it.

Within a band the order is order descending, then registration order, then a topological pass over after. A dependency that names a subscription which is not in the same queue is satisfied vacuously: it did not run, and it was never going to.

Every subscription, in dispatch order

#idbandstepsorderpagesgoalsfiresafter
1observe.startupPhaseobserveenterStartupPhase()0RootDetectionevery look
2observe.leftStartupobserveleaveStartupPhase()0GamePlaying, GamePause, StartPage, TsumsPage, TsumTsumStorePageevery look
3record.feverTimerecordgFever.update()0GamePlaying, GamePause, ScorePage, HighScore, TsumLevelUp, AccountLevelUp, EventMain, EventCardReveal, EventGift, MagicalTime, StartPage, FriendPage, FriendInfo, ProfilePage, SquarePage, ClosePage, TapOpenPage, TapOpenPageDeprecated, TsumsPage, TsumSortOrder, RaiseLevelCap, LevelCapRaised, TsumTsumStorePage, ConfirmPurchasePage, BoxPurchasedPage, BoxPurchaseResult, NotEnoughCoins, OutOfMedals, RubyResetDifficulty, MailBox, Received, ReceiveHeart, ReceiveHeartWithoutCoins, ReceiveSkillTicket, ReceivePremiumTicket, GiftHeart, HeartSent, TodayMission, TodayMissions, RootDetection, NetworkDisable, NetworkTimeout, ExtraUpdate, unknownevery look
4record.corpusUnknownrecordsaveCorpusFrame()0unknownon arrival
5record.baseCoinsrecordsampleBaseCoins()0TsumLevelUpevery look
6record.myTsumrecordidentifyMyTsum()0StartPageon arrival
7guard.rootDetectionguarddismissSystemDialog()0RootDetectionevery look
8dismiss.magicalTimedismisslog play.magicalTimeCancelled → tap back → sleep 500ms0MagicalTimeevery look
9dismiss.highScoredismisslog page.highScore.closing → tap back → settle 2000ms0HighScoreevery look
10dismiss.accountLevelUpdismisslog page.accountLevelUp.closing → tap back → settle 2000ms0AccountLevelUpevery look
11dismiss.eventMaindismisslog page.eventMain.closing → tap back → settle 2000ms0EventMainevery look
12dismiss.eventCardRevealdismisslog page.eventCardReveal.closing → tap back → settle 2000ms0EventCardRevealevery look
13dismiss.eventGiftdismisslog page.eventGift.closing → tap back → settle 2000ms0EventGiftevery look
14dismiss.notEnoughCoinsdismisslog box.noCoins → tap back → settle 2000ms0NotEnoughCoinsevery look
15dismiss.resumeGamedismisslog page.gamePause.resuming → tap next → sleep 500ms0GamePauseevery look
16nav.wait.transientnavigatewait the page out100TsumLevelUpanyevery look
17nav.move.tallyToGamenavigatemarkTallyPlayPressed() → tap next → settle 3000ms60ScorePageGamePlayingevery look
18nav.move.friendToGamenavigatetap next → settle 3000ms60FriendPageGamePlayingevery look
19nav.move.startToGamenavigatesettle 1500ms → checkGameItem()openRound() → tap Button.outStartawaitRoundStart()60StartPageGamePlayingevery lookobserve.leftStartup
20nav.move.toTsumsnavigatetap tsums → settle 3000ms60ProfilePage, FriendPage, StartPageTsumsPageevery look
21nav.move.toMailnavigatetap mail → settle 3000ms60FriendPageMailBoxevery look
22nav.move.toHomenavigatetap home → settle 3000ms60SquarePage, FriendPageProfilePageevery look
23nav.move.toStorenavigatetap store → settle 3000ms60TsumsPageTsumTsumStorePageevery look
24nav.move.closePagenavigatetap back → tap (310, 1448) → settle 1500ms40ClosePageanyevery look
25nav.move.unknownnavigateexitUnknownPage()30unknownanyevery lookrecord.corpusUnknown
26nav.move.exitnavigatetap back → settle 1500ms0StartPage, GamePlaying, GamePause, MagicalTime, HighScore, AccountLevelUp, EventMain, EventCardReveal, EventGift, TsumLevelUp, ScorePage, TsumSortOrder, RaiseLevelCap, LevelCapRaised, TsumTsumStorePage, ConfirmPurchasePage, BoxPurchasedPage, BoxPurchaseResult, TsumsPage, ProfilePage, SquarePage, MailBox, Received, ReceiveHeart, ReceiveSkillTicket, ReceivePremiumTicket, GiftHeart, HeartSent, FriendInfo, TodayMission, TodayMissions, TapOpenPage, TapOpenPageDeprecated, OutOfMedals, RubyResetDifficulty, ExtraUpdate, NetworkDisable, NetworkTimeoutanyevery look
27notify.trailnotifygPages.trail()0GamePlaying, GamePause, ScorePage, HighScore, TsumLevelUp, AccountLevelUp, EventMain, EventCardReveal, EventGift, MagicalTime, StartPage, FriendPage, FriendInfo, ProfilePage, SquarePage, ClosePage, TapOpenPage, TapOpenPageDeprecated, TsumsPage, TsumSortOrder, RaiseLevelCap, LevelCapRaised, TsumTsumStorePage, ConfirmPurchasePage, BoxPurchasedPage, BoxPurchaseResult, NotEnoughCoins, OutOfMedals, RubyResetDifficulty, MailBox, Received, ReceiveHeart, ReceiveHeartWithoutCoins, ReceiveSkillTicket, ReceivePremiumTicket, GiftHeart, HeartSent, TodayMission, TodayMissions, RootDetection, NetworkDisable, NetworkTimeout, ExtraUpdate, unknownon arrival
28notify.forecastnotifyforecastEmit()0GamePlaying, GamePause, ScorePage, HighScore, TsumLevelUp, AccountLevelUp, EventMain, EventCardReveal, EventGift, MagicalTime, StartPage, FriendPage, FriendInfo, ProfilePage, SquarePage, ClosePage, TapOpenPage, TapOpenPageDeprecated, TsumsPage, TsumSortOrder, RaiseLevelCap, LevelCapRaised, TsumTsumStorePage, ConfirmPurchasePage, BoxPurchasedPage, BoxPurchaseResult, NotEnoughCoins, OutOfMedals, RubyResetDifficulty, MailBox, Received, ReceiveHeart, ReceiveHeartWithoutCoins, ReceiveSkillTicket, ReceivePremiumTicket, GiftHeart, HeartSent, TodayMission, TodayMissions, RootDetection, NetworkDisable, NetworkTimeout, ExtraUpdate, unknownevery look

What each one is for

  • observe.startupPhase — The root warning means the game is coming up (or has just been restarted), so the navigation loops go back to their slower startup timings.
  • observe.leftStartup — Any of the screens that only exist once the game is fully up ends the startup phase, which is what stops the navigation loops from waiting five seconds a round for event windows that are no longer arriving.
  • record.feverTime — Keep the fever state up to date, and broadcast a fever starting or ending. A fever is a mode of the board rather than a screen of its own, so nothing else in this file can report it -- see src/fever.ts.
  • record.corpusUnknown — Keep an unrecognised screen before anything taps it. By definition nothing in the table matched, so this is the single best source of corpus frames -- and the escape below is about to change what is on display.
  • record.baseCoins — Read the in-game coin counter off the level-up screen. The board goes on paying out after the round timer stops, and this is the first screen that is certainly after that -- so it is where the counter first holds the round's figure, and it holds it there for seconds rather than frames.
  • record.myTsum — Read which tsum is selected off the thumbnail in the pre-round screen's lower-right button, so the round about to be played can be attributed to it in the stats CSV and named on the floating banner. Matched against a library rebuilt from the sprite art the game itself ships, so the comparison is against the same drawing rather than a photograph of it.
  • guard.rootDetection — Dismiss the root warning wherever it appears. It is an Android dialog laid out in device pixels, so it is found and pressed structurally; the coordinates recorded for whichever variant matched are passed only as a last-resort hint, because they belong to one emulator and dpi.
  • dismiss.magicalTime — Cancel the offer to play on. OK spends a time ticket and, once those run out, rubies -- and the offer also stands between the round and the score page, so leaving it up costs the round's statistics as well.
  • dismiss.highScore — Close the new-record panel. Like the Magical Time offer it stands between the round and the score page, and it waits for input -- so left alone it holds the tally behind it until whatever is waiting for that gives up.
  • dismiss.accountLevelUp — Close the rank-up panel. The player levelling up drops this over the score tally a moment after the tally appears, and like the new-record panel it waits for input -- so the round's score and coins stay behind it until something presses Close.
  • dismiss.eventMain — Press Close on the event's own page. Tapping the event's result overlay away (waitForScorePage does that blind: the overlay is event art) lands here, one screen further from the score tally the round is waiting to read, and Close is what puts the tally back in front.
  • dismiss.eventCardReveal — Tap the event's card reveal on. It is put up at the event's milestones on the way back to the tally and waits for input; the gift dialog it leads to has a handler of its own.
  • dismiss.eventGift — Press Close on the GET! gift dialog. The game's generic reward dialog, so it is closed wherever it shows, event or not -- the gift itself waits in the mailbox for the mail sweep.
  • dismiss.notEnoughCoins — Cancel the offer to trade Rubies for Coins, wherever it comes up. Nothing in this project may spend the player's Rubies, and the Box Buying sweep is only one of the ways the game can ask -- so the refusal lives here as well as in that flow, and the page's next anchor is Cancel too, so no generic mover can press the other button either.
  • dismiss.resumeGame — Press Continue on the game's own pause menu. It stands between the script and the board it was playing, and the script did not necessarily open it: the host presses Pause for the user through onPause, so a round comes back from a script pause through here.
  • nav.wait.transient — Sit out a page that dismisses itself rather than tapping it. This is the whole reason pages are classified: a tap aimed at a transient page lands after it has gone, on whatever replaced it.
  • nav.move.tallyToGame — From the score tally, Play opens the pre-round screen directly, saving the hop through the hub between one round and the next. Only when the button can be seen, and only once per tally: a round played in a point battle ends on a tally with one centred Close and no Play, and anything this does not press lands on nav.move.exit below, which closes to the hub as before.
  • nav.move.friendToGame — From the friend hub, Play opens the pre-round screen.
  • nav.move.startToGame — Set the bonus items the settings asked for, open the round, then start it. The round is opened here rather than on the board so round.start goes out with the items still in frame -- a recorder listening for it opens on what the round is being played with. The wait afterwards watches the pre-round screen leave and the board arrive, so the next poll neither reads the round fading in as this screen and checks the items all over again, nor sits out a flat five seconds for a board that came up in two.
  • nav.move.toTsums — Any screen carrying a tsums anchor has a route straight into the collection, so take it rather than backing out one screen at a time.
  • nav.move.toMail — Any screen carrying a mail anchor has the mailbox icon on it, so open the mailbox directly rather than backing out to the hub and hoping.
  • nav.move.toHome — The left rail is on every tab of the hub, so the Home tab is one tap from any of them. The heart sweep goes through here between its two halves: reopening the ranking is what puts our own row back in view.
  • nav.move.toStore — The collection carries the Tsum Tsum Store button, so take it rather than backing out towards it. The Box Buying sweep is what asks for the store, and NavPlans.TsumTsumStorePage is what routes it via the collection.
  • nav.move.closePage — The standard close button at centre bottom, plus the second tap that clears the panel some of these screens leave behind.
  • nav.move.unknown — Blind escape from a screen nothing fingerprinted: look for a native dialog first, then work through the cancel and close buttons the game reuses.
  • nav.move.exit — Leave a page by the way it was entered -- its back -- where the page declares that as its way out (PageRoutes). Last in the band, so anything that knows better has already had its turn. A page with no declared exit is not tapped: navigate reports it and the stall guard takes it from there.
  • notify.trail — Log the last few screens with how long each was up, and who claimed this one. Debug only -- this is the history stack in one line, and it is what a report of "it got stuck" is usually missing.
  • notify.forecast — Write what the script is about to do next: which subscription is expected to act on this frame, which task the scheduler runs after this one, and the ways off this screen with where each leads. Debug only and deduplicated -- see src/forecast.ts. It fires on every look rather than only on a change, so a navigation loop tapping the same screen is visible as the loop it is.

Declared dependencies

These hold in addition to the band order, and outrank it: a subscription waits for everything it declares, even one in a lower band.

How each page behaves

Durations are wall-clock at undefinedfps. The game counts these windows in frames, so PageRouter.durationOf scales them by the Device frame rate setting -- the same page is up for half as long at NaNfps.

roles is what the page is to the flows (PageRole, src/pages.ts): the lists a flow hands the sweep as expect -- what a running round can be looking at, what the heart sender can -- are read off these, so a page is in every list its roles put it in and in no other.

pagekindrolesat undefinedfpsat NaNfpssourcenote
GamePlayingpermanentboard gameUpThe board. It does end on its own when the round timer runs out, but not on a window anything can wait out -- the script plays until the HUD stops fingerprinting, which is what confirmGameOver is for.
GamePausepermanentboard gameUpPause menu; Continue resumes it.
ScorePagepermanenttallyPost-round tally. Close and Play both wait; after a point battle it draws Close alone, centred.
HighScorepermanentpreTallyNew-record panel with a close button.
TsumLevelUptransientpreTally2900 ms1450 msestimateThe post-round panel listing what each tsum in the party earned -- the one with Close and Share. Not the banner that flashes over the board mid-round, which is an animation rather than a page and has no fingerprint, and not AccountLevelUp, which is the player ranking up.
AccountLevelUppermanentpreTallyThe player's own rank going up. It arrives a moment after the score tally and sits on top of it until Close is pressed, so unlike TsumLevelUp there is no window to wait out.
MagicalTimepermanentpreTally interruptThe offer to play on for a time ticket, and the one page here that plainly runs a countdown: left alone it cancels itself. The script cancels it anyway (accepting spends tickets and then rubies), so the window is only used to keep the navigation band from tapping into the screen behind it. Ten seconds is the observed order of magnitude, not a timed figure -- see DEVELOPMENT.md on how to measure it.
EventMainpermanentpreTallyThe event's own page, reached by tapping the result overlay away. Close is what puts the score tally back in front.
EventCardRevealpermanentpreTallyThe event's card reveal, "Tap to Next" -- put up at its milestones on the way to the tally. Waits for input; any tap moves it on.
EventGiftpermanentpreTallyThe GET! gift dialog ("Claim your gift from your mailbox") with its Close. The game's generic reward dialog; the event raises it after a card reveal.
StartPagepermanentgameUpPre-round screen: items, Start, Tsums.
FriendPagepermanentheartSweepThe hub the script navigates back to.
FriendInfopermanentheartSweepA friend card, or the settings social panel.
ProfilePagepermanentheartSweepThe Home tab of the hub -- your own tsum, high score and the daily missions. Named for the profile it shows rather than for the tab; StartPage is the pre-round screen, not this.
SquarePagepermanent
ClosePagepermanentNot one screen: a deliberate single-pixel catch-all for anything with the standard close button at centre bottom (events, My Info, settings).
TapOpenPagepermanentWaits for the "TAP!" it asks for.
TapOpenPageDeprecatedpermanentOlder capsule art for the same screen.
TsumsPagepermanentgameUp
TsumSortOrderpermanentThe collection's Change Order dialog; Close is the only exit.
RaiseLevelCappermanentCancel / OK, and OK spends the coins.
LevelCapRaisedpermanentThe "level cap has been raised" toast. Like HeartSent -- whose sprite it is -- it carries no button and does not clear itself; a tap anywhere is the only way past it.
TsumTsumStorePagepermanentgameUp
ConfirmPurchasePagepermanentOK / Cancel.
BoxPurchasedPagepermanentOne box's reveal card, with Close. What a 1-Time purchase ends on; a 10-Time one shows ten of these without the Close and then BoxPurchaseResult.
BoxPurchaseResultpermanentThe 10-box tally: all ten in a grid, and Close. Only a 10-Time purchase reaches it.
NotEnoughCoinspermanentCancel / Buy with Rubies, over whatever asked for the coins. Both anchors are Cancel -- see the Page entry.
OutOfMedalspermanentTwo buttons; neither times out.
RubyResetDifficultypermanentOK / Cancel.
MailBoxpermanent
ReceivedpermanentheartSweepThe received-items panel, with OK.
ReceiveHeartpermanent
ReceiveHeartWithoutCoinspermanent
ReceiveSkillTicketpermanent
ReceivePremiumTicketpermanent
GiftHeartpermanentheartSweep
HeartSentpermanentheartSweepThe "Heart sent!" toast. It carries no button, but it does not clear itself either -- it waits for a tap anywhere, so it is permanent by the definition that matters here: left alone it is still there, and the only way past it is a tap.
TodayMissionpermanent
TodayMissionspermanent
RootDetectionpermanentinterruptAn Android AlertDialog rather than a game screen, and it never goes away by itself -- see dialogs.ts for why it is dismissed structurally instead of by the recorded coordinates.
NetworkDisablepermanentinterruptOK button.
NetworkTimeoutpermanentinterruptOK button.
ExtraUpdatepermanentOK / Cancel.
unknownpermanentWhat the router reports when nothing fingerprinted. Permanent is the safe reading: an unrecognised screen that would have cleared itself costs one wasted escape attempt, where treating a stuck one as transient would wait forever.

gPages.navigate(page) polls until it is there. The navigate band only runs inside it, and never on the destination itself.

destinationpollhold budgetreststartup waitvia
FriendPage2 sweep(s), 1000ms budget3000 ms1000 ms5000 ms
GamePlaying2 sweep(s), 2000ms budget0 ms0 ms
TsumsPage2 sweep(s), 2000ms budget0 ms0 msFriendPage
ProfilePage2 sweep(s), 1000ms budget1000 ms500 ms
MailBox2 sweep(s), 2000ms budget1000 ms500 msFriendPage
TsumTsumStorePage2 sweep(s), 2000ms budget0 ms0 msTsumsPage

The sitemap

Which screen has been seen to follow which. Measured, not declared -- harvested off a device and accumulated in docs/transitions.json. Two sources feed it: a recorded walkthrough, which carries the taps, and the page-change frames PageRouter.saveHistoryShot leaves behind, which do not.

4 distinct transition(s) over 4 of 43 pages, from 1 harvest(s), last 2026-08-25.

Hexagons are interruptions, stadiums are navigate() destinations, and the edge labels are how many times the pair has been observed.

unknown is not a screen: it is where nothing in the table matched. An edge through it marks a gap in detection rather than a route -- a screen with no fingerprint, or one obscured while the game animates over it.

An interruption can follow any page, which is the reason this graph is a map and not a filter. RootDetection is an Android dialog, and the two network panels arrive whenever the connection does -- none of them is a successor of anything in particular. Narrowing detection on a successor set would therefore have to admit all of them at every node, which is most of what the narrowing was for. heartSweepPages() (src/pages.ts, read off the roles each page declares) is the shape that works instead: a list the one caller that knows its own context passes in.

fromtoseenby tappingfirstlast
GamePlayingunknown92026-08-252026-08-25
StartPageGamePlaying12026-08-252026-08-25
unknownGamePlaying82026-08-252026-08-25
unknownTsumLevelUp12026-08-252026-08-25

Not yet observed

Pages the table can recognise that no harvest has caught at either end of a transition. Absence of evidence: GamePause, ScorePage, HighScore, AccountLevelUp, MagicalTime, EventMain, EventCardReveal, EventGift, FriendPage, FriendInfo, ProfilePage, SquarePage, ClosePage, TapOpenPage, TapOpenPageDeprecated, TsumsPage, TsumSortOrder, RaiseLevelCap, LevelCapRaised, TsumTsumStorePage, ConfirmPurchasePage, BoxPurchasedPage, BoxPurchaseResult, NotEnoughCoins, OutOfMedals, RubyResetDifficulty, MailBox, Received, ReceiveHeart, ReceiveHeartWithoutCoins, ReceiveSkillTicket, ReceivePremiumTicket, GiftHeart, HeartSent, TodayMission, TodayMissions, RootDetection, NetworkDisable, NetworkTimeout, ExtraUpdate.

The queue, page by page

Read a row as "this runs, unless something above it acted first".

In game

GamePlaying permanent

#subscriptionbandwhen
1observe.leftStartupobserveevery look
2record.feverTimerecordevery look
3nav.move.exitnavigateevery look, any goal
4notify.trailnotifyon arrival
5notify.forecastnotifyevery look

On a repeat look at the same page, 4 of these 5 run: the rest fire only when the page changes.

GamePause permanent

#subscriptionbandwhen
1observe.leftStartupobserveevery look
2record.feverTimerecordevery look
3dismiss.resumeGamedismissevery look
4nav.move.exitnavigateevery look, any goal
5notify.trailnotifyon arrival
6notify.forecastnotifyevery look

On a repeat look at the same page, 5 of these 6 run: the rest fire only when the page changes.

ScorePage permanent

#subscriptionbandwhen
1record.feverTimerecordevery look
2nav.move.tallyToGamenavigateevery look, goal GamePlaying
3nav.move.exitnavigateevery look, any goal
4notify.trailnotifyon arrival
5notify.forecastnotifyevery look

On a repeat look at the same page, 4 of these 5 run: the rest fire only when the page changes.

HighScore permanent

#subscriptionbandwhen
1record.feverTimerecordevery look
2dismiss.highScoredismissevery look
3nav.move.exitnavigateevery look, any goal
4notify.trailnotifyon arrival
5notify.forecastnotifyevery look

On a repeat look at the same page, 4 of these 5 run: the rest fire only when the page changes.

TsumLevelUp transient

#subscriptionbandwhen
1record.feverTimerecordevery look
2record.baseCoinsrecordevery look
3nav.wait.transientnavigateevery look, any goal
4nav.move.exitnavigateevery look, any goal
5notify.trailnotifyon arrival
6notify.forecastnotifyevery look

On a repeat look at the same page, 5 of these 6 run: the rest fire only when the page changes.

AccountLevelUp permanent

#subscriptionbandwhen
1record.feverTimerecordevery look
2dismiss.accountLevelUpdismissevery look
3nav.move.exitnavigateevery look, any goal
4notify.trailnotifyon arrival
5notify.forecastnotifyevery look

On a repeat look at the same page, 4 of these 5 run: the rest fire only when the page changes.

MagicalTime permanent

#subscriptionbandwhen
1record.feverTimerecordevery look
2dismiss.magicalTimedismissevery look
3nav.move.exitnavigateevery look, any goal
4notify.trailnotifyon arrival
5notify.forecastnotifyevery look

On a repeat look at the same page, 4 of these 5 run: the rest fire only when the page changes.

EventMain permanent

#subscriptionbandwhen
1record.feverTimerecordevery look
2dismiss.eventMaindismissevery look
3nav.move.exitnavigateevery look, any goal
4notify.trailnotifyon arrival
5notify.forecastnotifyevery look

On a repeat look at the same page, 4 of these 5 run: the rest fire only when the page changes.

EventCardReveal permanent

#subscriptionbandwhen
1record.feverTimerecordevery look
2dismiss.eventCardRevealdismissevery look
3nav.move.exitnavigateevery look, any goal
4notify.trailnotifyon arrival
5notify.forecastnotifyevery look

On a repeat look at the same page, 4 of these 5 run: the rest fire only when the page changes.

EventGift permanent

#subscriptionbandwhen
1record.feverTimerecordevery look
2dismiss.eventGiftdismissevery look
3nav.move.exitnavigateevery look, any goal
4notify.trailnotifyon arrival
5notify.forecastnotifyevery look

On a repeat look at the same page, 4 of these 5 run: the rest fire only when the page changes.

Home / navigation

StartPage permanent

#subscriptionbandwhen
1observe.leftStartupobserveevery look
2record.feverTimerecordevery look
3record.myTsumrecordon arrival
4nav.move.startToGamenavigateevery look, goal GamePlaying
5nav.move.toTsumsnavigateevery look, goal TsumsPage
6nav.move.exitnavigateevery look, any goal
7notify.trailnotifyon arrival
8notify.forecastnotifyevery look

On a repeat look at the same page, 6 of these 8 run: the rest fire only when the page changes.

FriendPage permanent

#subscriptionbandwhen
1record.feverTimerecordevery look
2nav.move.friendToGamenavigateevery look, goal GamePlaying
3nav.move.toTsumsnavigateevery look, goal TsumsPage
4nav.move.toMailnavigateevery look, goal MailBox
5nav.move.toHomenavigateevery look, goal ProfilePage
6notify.trailnotifyon arrival
7notify.forecastnotifyevery look

On a repeat look at the same page, 6 of these 7 run: the rest fire only when the page changes.

FriendInfo permanent

#subscriptionbandwhen
1record.feverTimerecordevery look
2nav.move.exitnavigateevery look, any goal
3notify.trailnotifyon arrival
4notify.forecastnotifyevery look

On a repeat look at the same page, 3 of these 4 run: the rest fire only when the page changes.

ProfilePage permanent

#subscriptionbandwhen
1record.feverTimerecordevery look
2nav.move.toTsumsnavigateevery look, goal TsumsPage
3nav.move.exitnavigateevery look, any goal
4notify.trailnotifyon arrival
5notify.forecastnotifyevery look

On a repeat look at the same page, 4 of these 5 run: the rest fire only when the page changes.

SquarePage permanent

#subscriptionbandwhen
1record.feverTimerecordevery look
2nav.move.toHomenavigateevery look, goal ProfilePage
3nav.move.exitnavigateevery look, any goal
4notify.trailnotifyon arrival
5notify.forecastnotifyevery look

On a repeat look at the same page, 4 of these 5 run: the rest fire only when the page changes.

ClosePage permanent

#subscriptionbandwhen
1record.feverTimerecordevery look
2nav.move.closePagenavigateevery look, any goal
3notify.trailnotifyon arrival
4notify.forecastnotifyevery look

On a repeat look at the same page, 3 of these 4 run: the rest fire only when the page changes.

TapOpenPage permanent

#subscriptionbandwhen
1record.feverTimerecordevery look
2nav.move.exitnavigateevery look, any goal
3notify.trailnotifyon arrival
4notify.forecastnotifyevery look

On a repeat look at the same page, 3 of these 4 run: the rest fire only when the page changes.

TapOpenPageDeprecated permanent

#subscriptionbandwhen
1record.feverTimerecordevery look
2nav.move.exitnavigateevery look, any goal
3notify.trailnotifyon arrival
4notify.forecastnotifyevery look

On a repeat look at the same page, 3 of these 4 run: the rest fire only when the page changes.

Tsum collection and store

TsumsPage permanent

#subscriptionbandwhen
1observe.leftStartupobserveevery look
2record.feverTimerecordevery look
3nav.move.toStorenavigateevery look, goal TsumTsumStorePage
4nav.move.exitnavigateevery look, any goal
5notify.trailnotifyon arrival
6notify.forecastnotifyevery look

On a repeat look at the same page, 5 of these 6 run: the rest fire only when the page changes.

TsumSortOrder permanent

#subscriptionbandwhen
1record.feverTimerecordevery look
2nav.move.exitnavigateevery look, any goal
3notify.trailnotifyon arrival
4notify.forecastnotifyevery look

On a repeat look at the same page, 3 of these 4 run: the rest fire only when the page changes.

RaiseLevelCap permanent

#subscriptionbandwhen
1record.feverTimerecordevery look
2nav.move.exitnavigateevery look, any goal
3notify.trailnotifyon arrival
4notify.forecastnotifyevery look

On a repeat look at the same page, 3 of these 4 run: the rest fire only when the page changes.

LevelCapRaised permanent

#subscriptionbandwhen
1record.feverTimerecordevery look
2nav.move.exitnavigateevery look, any goal
3notify.trailnotifyon arrival
4notify.forecastnotifyevery look

On a repeat look at the same page, 3 of these 4 run: the rest fire only when the page changes.

TsumTsumStorePage permanent

#subscriptionbandwhen
1observe.leftStartupobserveevery look
2record.feverTimerecordevery look
3nav.move.exitnavigateevery look, any goal
4notify.trailnotifyon arrival
5notify.forecastnotifyevery look

On a repeat look at the same page, 4 of these 5 run: the rest fire only when the page changes.

ConfirmPurchasePage permanent

#subscriptionbandwhen
1record.feverTimerecordevery look
2nav.move.exitnavigateevery look, any goal
3notify.trailnotifyon arrival
4notify.forecastnotifyevery look

On a repeat look at the same page, 3 of these 4 run: the rest fire only when the page changes.

BoxPurchasedPage permanent

#subscriptionbandwhen
1record.feverTimerecordevery look
2nav.move.exitnavigateevery look, any goal
3notify.trailnotifyon arrival
4notify.forecastnotifyevery look

On a repeat look at the same page, 3 of these 4 run: the rest fire only when the page changes.

BoxPurchaseResult permanent

#subscriptionbandwhen
1record.feverTimerecordevery look
2nav.move.exitnavigateevery look, any goal
3notify.trailnotifyon arrival
4notify.forecastnotifyevery look

On a repeat look at the same page, 3 of these 4 run: the rest fire only when the page changes.

NotEnoughCoins permanent

#subscriptionbandwhen
1record.feverTimerecordevery look
2dismiss.notEnoughCoinsdismissevery look
3notify.trailnotifyon arrival
4notify.forecastnotifyevery look

On a repeat look at the same page, 3 of these 4 run: the rest fire only when the page changes.

OutOfMedals permanent

#subscriptionbandwhen
1record.feverTimerecordevery look
2nav.move.exitnavigateevery look, any goal
3notify.trailnotifyon arrival
4notify.forecastnotifyevery look

On a repeat look at the same page, 3 of these 4 run: the rest fire only when the page changes.

RubyResetDifficulty permanent

#subscriptionbandwhen
1record.feverTimerecordevery look
2nav.move.exitnavigateevery look, any goal
3notify.trailnotifyon arrival
4notify.forecastnotifyevery look

On a repeat look at the same page, 3 of these 4 run: the rest fire only when the page changes.

Mail / hearts

MailBox permanent

#subscriptionbandwhen
1record.feverTimerecordevery look
2nav.move.exitnavigateevery look, any goal
3notify.trailnotifyon arrival
4notify.forecastnotifyevery look

On a repeat look at the same page, 3 of these 4 run: the rest fire only when the page changes.

Received permanent

#subscriptionbandwhen
1record.feverTimerecordevery look
2nav.move.exitnavigateevery look, any goal
3notify.trailnotifyon arrival
4notify.forecastnotifyevery look

On a repeat look at the same page, 3 of these 4 run: the rest fire only when the page changes.

ReceiveHeart permanent

#subscriptionbandwhen
1record.feverTimerecordevery look
2nav.move.exitnavigateevery look, any goal
3notify.trailnotifyon arrival
4notify.forecastnotifyevery look

On a repeat look at the same page, 3 of these 4 run: the rest fire only when the page changes.

ReceiveHeartWithoutCoins permanent

#subscriptionbandwhen
1record.feverTimerecordevery look
2notify.trailnotifyon arrival
3notify.forecastnotifyevery look

On a repeat look at the same page, 2 of these 3 run: the rest fire only when the page changes.

ReceiveSkillTicket permanent

#subscriptionbandwhen
1record.feverTimerecordevery look
2nav.move.exitnavigateevery look, any goal
3notify.trailnotifyon arrival
4notify.forecastnotifyevery look

On a repeat look at the same page, 3 of these 4 run: the rest fire only when the page changes.

ReceivePremiumTicket permanent

#subscriptionbandwhen
1record.feverTimerecordevery look
2nav.move.exitnavigateevery look, any goal
3notify.trailnotifyon arrival
4notify.forecastnotifyevery look

On a repeat look at the same page, 3 of these 4 run: the rest fire only when the page changes.

GiftHeart permanent

#subscriptionbandwhen
1record.feverTimerecordevery look
2nav.move.exitnavigateevery look, any goal
3notify.trailnotifyon arrival
4notify.forecastnotifyevery look

On a repeat look at the same page, 3 of these 4 run: the rest fire only when the page changes.

HeartSent permanent

#subscriptionbandwhen
1record.feverTimerecordevery look
2nav.move.exitnavigateevery look, any goal
3notify.trailnotifyon arrival
4notify.forecastnotifyevery look

On a repeat look at the same page, 3 of these 4 run: the rest fire only when the page changes.

Missions

TodayMission permanent

#subscriptionbandwhen
1record.feverTimerecordevery look
2nav.move.exitnavigateevery look, any goal
3notify.trailnotifyon arrival
4notify.forecastnotifyevery look

On a repeat look at the same page, 3 of these 4 run: the rest fire only when the page changes.

TodayMissions permanent

#subscriptionbandwhen
1record.feverTimerecordevery look
2nav.move.exitnavigateevery look, any goal
3notify.trailnotifyon arrival
4notify.forecastnotifyevery look

On a repeat look at the same page, 3 of these 4 run: the rest fire only when the page changes.

Interruptions

RootDetection permanent

#subscriptionbandwhen
1observe.startupPhaseobserveevery look
2record.feverTimerecordevery look
3guard.rootDetectionguardevery look
4notify.trailnotifyon arrival
5notify.forecastnotifyevery look

On a repeat look at the same page, 4 of these 5 run: the rest fire only when the page changes.

NetworkDisable permanent

#subscriptionbandwhen
1record.feverTimerecordevery look
2nav.move.exitnavigateevery look, any goal
3notify.trailnotifyon arrival
4notify.forecastnotifyevery look

On a repeat look at the same page, 3 of these 4 run: the rest fire only when the page changes.

NetworkTimeout permanent

#subscriptionbandwhen
1record.feverTimerecordevery look
2nav.move.exitnavigateevery look, any goal
3notify.trailnotifyon arrival
4notify.forecastnotifyevery look

On a repeat look at the same page, 3 of these 4 run: the rest fire only when the page changes.

ExtraUpdate permanent

#subscriptionbandwhen
1record.feverTimerecordevery look
2nav.move.exitnavigateevery look, any goal
3notify.trailnotifyon arrival
4notify.forecastnotifyevery look

On a repeat look at the same page, 3 of these 4 run: the rest fire only when the page changes.

unknown permanent

#subscriptionbandwhen
1record.feverTimerecordevery look
2record.corpusUnknownrecordon arrival
3nav.move.unknownnavigateevery look, any goal
4notify.trailnotifyon arrival
5notify.forecastnotifyevery look

On a repeat look at the same page, 3 of these 5 run: the rest fire only when the page changes.

Findings

Notes

  • TsumLevelUp is transient on an estimated duration (2900ms at undefinedfps), not a measured one.