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.

32 subscriptions, 46 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.
record806Measurements 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.
dismiss4010Close 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()0RootDetection—every look—
2observe.leftStartupobserveleaveStartupPhase()0GamePlaying, GamePause, StartPage, TsumsPage, TsumTsumStorePage—every look—
3record.feverTimerecordgFever.update()0GamePlaying, GamePause, ScorePage, HighScore, TsumLevelUp, AccountLevelUp, RankUp, EventMain, EventCardReveal, EventGift, MagicalTime, StartPage, FriendPage, FriendInfo, ProfilePage, SquarePage, ClosePage, TapOpenPage, TapOpenPageDeprecated, TsumsPage, TsumSortOrder, RaiseLevelCap, LevelCapRaised, TsumTsumStorePage, ConfirmPurchasePage, BoxPurchasedPage, BoxPurchaseResult, NotEnoughCoins, BoxTenTimeRefused, OutOfMedals, RubyResetDifficulty, MailBox, Received, ReceiveHeart, ReceiveHeartWithoutCoins, ReceiveSkillTicket, ReceivePremiumTicket, GiftHeart, HeartSent, TodayMission, TodayMissions, RootDetection, NetworkDisable, NetworkTimeout, ExtraUpdate, unknown—every look—
4record.corpusUnknownrecordsaveCorpusFrame()0unknown—on arrival—
5record.baseCoinsrecordsampleBaseCoins()0TsumLevelUp—every look—
6record.myTsumLevelCaprecordnoteLevelUpMyTsumCap()0TsumLevelUp—every look—
7record.myTsumrecordidentifyMyTsum()0StartPage—on arrival—
8record.tallyRowrecordreadTallyRow()0ScorePage—every look—
9guard.rootDetectionguarddismissSystemDialog()0RootDetection—every look—
10dismiss.magicalTimedismisslog play.magicalTimeCancelled → tap back → sleep 500ms0MagicalTime—every look—
11dismiss.highScoredismisslog page.highScore.closing → tap back → settle 2000ms0HighScore—every look—
12dismiss.accountLevelUpdismisslog page.accountLevelUp.closing → tap back → settle 2000ms0AccountLevelUp—every look—
13dismiss.rankUpdismisslog page.rankUp.closing → tap back → settle 2000ms0RankUp—every look—
14dismiss.eventMaindismisslog page.eventMain.closing → tap back → settle 2000ms0EventMain—every look—
15dismiss.eventCardRevealdismisslog page.eventCardReveal.closing → tap back → settle 2000ms0EventCardReveal—every look—
16dismiss.eventGiftdismisslog page.eventGift.closing → tap back → settle 2000ms0EventGift—every look—
17dismiss.tallyCountUpdismissmarkTallySkipTap() → log page.scorePage.skipping → tap (540, 1000) → settle 1500ms0ScorePage—every lookrecord.tallyRow
18dismiss.notEnoughCoinsdismisslog box.noCoins → tap back → settle 2000ms0NotEnoughCoins—every look—
19dismiss.resumeGamedismisslog page.gamePause.resuming → tap next → sleep 500ms0GamePause—every look—
20nav.wait.transientnavigatewait the page out100TsumLevelUpanyevery look—
21nav.move.tallyToGamenavigatemarkTallyPlayPressed() → tap next → settle 3000ms60ScorePageGamePlayingevery lookrecord.tallyRow
22nav.move.friendToGamenavigatetap next → settle 3000ms60FriendPageGamePlayingevery look—
23nav.move.startToGamenavigatesettle 1500ms → checkGameItem() → openRound() → tap Button.outStart → awaitRoundStart()60StartPageGamePlayingevery lookobserve.leftStartup
24nav.move.toTsumsnavigatetap tsums → settle 3000ms60ProfilePage, FriendPage, StartPageTsumsPageevery look—
25nav.move.toMailnavigatetap mail → settle 3000ms60FriendPageMailBoxevery look—
26nav.move.toHomenavigatetap home → settle 3000ms60SquarePage, FriendPageProfilePageevery look—
27nav.move.toStorenavigatetap store → settle 3000ms60TsumsPageTsumTsumStorePageevery look—
28nav.move.closePagenavigatetap back → tap (310, 1448) → settle 1500ms40ClosePageanyevery look—
29nav.move.unknownnavigateexitUnknownPage()30unknownanyevery lookrecord.corpusUnknown
30nav.move.exitnavigatetap back → settle 1500ms0StartPage, GamePlaying, MagicalTime, HighScore, AccountLevelUp, RankUp, EventMain, EventCardReveal, EventGift, TsumLevelUp, ScorePage, TsumSortOrder, RaiseLevelCap, LevelCapRaised, TsumTsumStorePage, ConfirmPurchasePage, BoxPurchasedPage, BoxPurchaseResult, BoxTenTimeRefused, TsumsPage, ProfilePage, SquarePage, MailBox, Received, ReceiveHeart, ReceiveSkillTicket, ReceivePremiumTicket, GiftHeart, HeartSent, FriendInfo, TodayMission, TodayMissions, TapOpenPage, TapOpenPageDeprecated, OutOfMedals, RubyResetDifficulty, ExtraUpdate, NetworkDisable, NetworkTimeoutanyevery look—
31notify.trailnotifygPages.trail()0GamePlaying, GamePause, ScorePage, HighScore, TsumLevelUp, AccountLevelUp, RankUp, EventMain, EventCardReveal, EventGift, MagicalTime, StartPage, FriendPage, FriendInfo, ProfilePage, SquarePage, ClosePage, TapOpenPage, TapOpenPageDeprecated, TsumsPage, TsumSortOrder, RaiseLevelCap, LevelCapRaised, TsumTsumStorePage, ConfirmPurchasePage, BoxPurchasedPage, BoxPurchaseResult, NotEnoughCoins, BoxTenTimeRefused, OutOfMedals, RubyResetDifficulty, MailBox, Received, ReceiveHeart, ReceiveHeartWithoutCoins, ReceiveSkillTicket, ReceivePremiumTicket, GiftHeart, HeartSent, TodayMission, TodayMissions, RootDetection, NetworkDisable, NetworkTimeout, ExtraUpdate, unknown—on arrival—
32notify.forecastnotifyforecastEmit()0GamePlaying, GamePause, ScorePage, HighScore, TsumLevelUp, AccountLevelUp, RankUp, EventMain, EventCardReveal, EventGift, MagicalTime, StartPage, FriendPage, FriendInfo, ProfilePage, SquarePage, ClosePage, TapOpenPage, TapOpenPageDeprecated, TsumsPage, TsumSortOrder, RaiseLevelCap, LevelCapRaised, TsumTsumStorePage, ConfirmPurchasePage, BoxPurchasedPage, BoxPurchaseResult, NotEnoughCoins, BoxTenTimeRefused, OutOfMedals, RubyResetDifficulty, MailBox, Received, ReceiveHeart, ReceiveHeartWithoutCoins, ReceiveSkillTicket, ReceivePremiumTicket, GiftHeart, HeartSent, TodayMission, TodayMissions, RootDetection, NetworkDisable, NetworkTimeout, ExtraUpdate, unknown—every 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.myTsumLevelCap — Read whether the level-up screen shows the MyTsum at its level cap -- the padlock on its card, where the others draw an EXP bar -- so the round can be followed by one trip to the collection to raise it. Only the trigger: the collection page is where the offer is checked before coins go.
  • 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.
  • record.tallyRow — Read the score tally's button row -- out yet, with a medals row, with Play -- off one fresh frame into tallyRow, for the count-up tap, the Play shortcut and the stats read to share rather than capture three times over.
  • 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.rankUp — Close the ranking panel. It stands on the score tally until Close is pressed, and the score wait takes no navigation taps -- so without this it sat there until the wait gave up and the round's score and coins went unread.
  • 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.tallyCountUp — Tap the score tally through its count-up. The game counts the score and coins up from zero and holds the button row back until it has finished, and any tap on the panel skips to the final figures with the row -- so Play or Close comes sooner, whether or not the round's stats are being read. The spot is the panel's number rows, inert once the row is out.
  • 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 gameUp———The 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 gameUp———Pause menu; Continue resumes it.
ScorePagepermanenttally———Post-round tally. Close and Play both wait; after a point battle it draws Close alone, centred.
HighScorepermanentpreTally———New-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.
AccountLevelUppermanentpreTally———The 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.
RankUppermanentpreTally———The ranking panel after a round that passes a friend. Like AccountLevelUp it sits on the tally until Close is pressed.
MagicalTimepermanentpreTally interrupt———The 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.
EventMainpermanentpreTally———The event's own page, reached by tapping the result overlay away. Close is what puts the score tally back in front.
EventCardRevealpermanentpreTally———The 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.
EventGiftpermanentpreTally———The 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, and the Pick-Up Capsule ends on it when the prize is an item rather than a tsum. Also "Last Prize!" (the lastPrize configuration), the same dialog over the store once the last capsule is bought.
StartPagepermanentgameUp———Pre-round screen: items, Start, Tsums.
FriendPagepermanentheartSweep———The hub the script navigates back to.
FriendInfopermanentheartSweep———A friend card, or the settings social panel.
ProfilePagepermanentheartSweep———The 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————
ClosePagepermanent————Not one screen: a deliberate single-pixel catch-all for anything with the standard close button at centre bottom (events, My Info, settings).
TapOpenPagepermanent————Waits for the "TAP!" it asks for.
TapOpenPageDeprecatedpermanent————Older capsule art for the same screen. Also what the capsule machine reads as while it turns after the tap -- the same art without the prompt -- which the Box Buying sweep taps through blind.
TsumsPagepermanentgameUp———
TsumSortOrderpermanent————The collection's Change Order dialog; Close is the only exit.
RaiseLevelCappermanent————Cancel / OK, and OK spends the coins.
LevelCapRaisedpermanent————The "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———
ConfirmPurchasePagepermanent————OK / Cancel.
BoxPurchasedPagepermanent————One box's reveal card, with Close. What a 1-Time purchase ends on -- a Pick-Up Capsule that drops a tsum too; a 10-Time one shows ten of these without the Close and then BoxPurchaseResult. Also the "You got a Patch!" popup (the patch configuration), which a purchase carrying a patch shows after its reveals, with a Close of its own.
BoxPurchaseResultpermanent————The 10-box tally: all ten in a grid, and Close. Only a 10-Time purchase reaches it.
NotEnoughCoinspermanent————Cancel / Buy with Rubies, over whatever asked for the coins. Both anchors are Cancel -- see the Page entry.
BoxTenTimeRefusedpermanent————The "You can't use 10-Time Purchases" toast: the box holds fewer than ten. Like HeartSent, whose sprite it is, it carries no button and waits for a tap anywhere. Targeted -- only the Box Buying sweep asks for it, right after pressing 10-Time Purchase.
OutOfMedalspermanent————Two buttons; neither times out.
RubyResetDifficultypermanent————OK / Cancel.
MailBoxpermanent————
ReceivedpermanentheartSweep———The received-items panel, with OK.
ReceiveHeartpermanent————
ReceiveHeartWithoutCoinspermanent————
ReceiveSkillTicketpermanent————
ReceivePremiumTicketpermanent————
GiftHeartpermanentheartSweep———
HeartSentpermanentheartSweep———The "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————
RootDetectionpermanentinterrupt———An 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.
NetworkDisablepermanentinterrupt———OK button.
NetworkTimeoutpermanentinterrupt———OK button.
ExtraUpdatepermanent————OK / Cancel.
unknownpermanent————What 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 ms—FriendPage
ProfilePage2 sweep(s), 1000ms budget1000 ms500 ms——
MailBox2 sweep(s), 2000ms budget1000 ms500 ms—FriendPage
TsumTsumStorePage2 sweep(s), 2000ms budget0 ms0 ms—TsumsPage

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 45 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
GamePlayingunknown ⬡9—2026-08-252026-08-25
StartPageGamePlaying1—2026-08-252026-08-25
unknown ⬡GamePlaying8—2026-08-252026-08-25
unknown ⬡TsumLevelUp1—2026-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, RankUp, MagicalTime, EventMain, EventCardReveal, EventGift, FriendPage, FriendInfo, ProfilePage, SquarePage, ClosePage, TapOpenPage, TapOpenPageDeprecated, TsumsPage, TsumSortOrder, RaiseLevelCap, LevelCapRaised, TsumTsumStorePage, ConfirmPurchasePage, BoxPurchasedPage, BoxPurchaseResult, NotEnoughCoins, BoxTenTimeRefused, 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
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.

ScorePage permanent​

#subscriptionbandwhen
1record.feverTimerecordevery look
2record.tallyRowrecordevery look
3dismiss.tallyCountUpdismissevery look
4nav.move.tallyToGamenavigateevery look, goal GamePlaying
5nav.move.exitnavigateevery look, any goal
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.

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
3record.myTsumLevelCaprecordevery look
4nav.wait.transientnavigateevery look, any goal
5nav.move.exitnavigateevery look, any goal
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.

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.

RankUp permanent​

#subscriptionbandwhen
1record.feverTimerecordevery look
2dismiss.rankUpdismissevery 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.

BoxTenTimeRefused 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.

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.