Files
obsidian-vault/work/wiki/apple-browsers/chat-path-onboarding-tracker-blocking.md
T

5.4 KiB

iOS: Chat-Path Onboarding — Tracker Blocking Demo

Asana: Ship Review task
Branch stack: demo-tracker-blocking-onboardingui-polishchat-path-dialog-polishsr-feedbackuti-flow
Due: 2026-05-15

PR Stack

PR Branch Status
#4544 demo-tracker-blocking-onboarding Open — review required
#4591 demo-tracker-blocking-onboarding-ui-polish Approved
#4664 demo-tracker-blocking-onboarding-chat-path-dialog-polish Approved
#4668 demo-tracker-blocking-onboarding-uti-flow Open — no review yet
#4855 demo-tracker-blocking-onboarding-sr-feedback Open — no review yet

Required Changes

PR #4544

  • Danger CI: no @UserDefaultsWrapper remains
  • Mock refactor (alessandroboron): MockDaxDialogsSettings.chatPathPhase plain stored property
  • Sync restore exclusionAlessandro May 7: "if the user selects 'Restore My Stuff' we disable Dax dialogs — we should not enrol those users in the experiment". Fixed: uncommented guard case .introDialog(isReturningUser: false) = introSteps.first in insertExperimentStepIfNeeded()
  • return .treatmentA override removed from resolveDuckAIQueryExperimentCohortID()
  • Pixels: onboardingChatPathTryVisitSiteUnique / onboardingChatPathTrackersBlockedUnique defined, no overlap with PR #4687

PR #4664

  • Title scope fix (alessandroboron): createSubsequentDialog uses correct title per chat-path vs standard path

PR #4668

  • Dialog position, dismiss, UTI bar, completion path resolved
  • .unifiedToggleInput feature flag has no hardcoded defaultValue: .enabled

PR #4855

  • setBarsHidden(true/false, animated: false, customAnimationDuration: nil) replaces setNavigationBarHidden + setChatPathVisitSiteControlsLocked in show/dismiss/dismissHostingController
  • newTabPageControllerCurrentTabIsLoading added to NewTabPageControllerDelegate; all (parent as? MainViewController)? casts gone from NewTabPageViewController
  • Loading guard folded into outer if via delegate method
  • searchAndDuckAIOption reverted to "Toggle between\nSearch and Duck.ai" in UserText.swift + all 26 lproj files
  • DuckAIQuery toggle copyGary May 6: "change 'Duck.ai' to 'Ask AI' in the toggle screen in onboarding only, not the standard toggle". Fixed: DuckAIQueryExperiment.toggleAILabel = "Ask AI" (uses NotLocalizedString)

Before Going Live

1. UTI experiment exclusion

Source: Pete Apr 30, ship review: "to avoid impacting any live onboarding experiments we can exclude those experiment participants when we release. Continue coordination in O-J <> O-N Coordination."

Task O-J <> O-N Coordination (owned by Pete) lists O-N experiments the UTI team needs to be aware of for exclusion at UTI rollout. Already lists this iOS experiment under "iOS - O-N will handle".

2. Privacy config targeting

  • Added "targets": [{ "localeLanguage": "en", "localeCountry": "US" }] to onboardingDuckAIQueryExperiment in privacy-configuration/overrides/ios-override.json

3. Experiment rename

No explicit Asana comment or PR review requested this — no source found.

  • Decide: rename onboardingDuckAIQueryExperiment before production rollout? If yes: requires new AIChatSubfeature case in BSK + new privacy config entry + disable old one.

Resolved / Dismissed

  • GJ6c — No longer required; address bar hidden for visit-site step; Gary + Costas confirmed search after trackers-blocked is acceptable
  • GJ2 — X button removed from chat-path dialogs (PR #4664)
  • GJ3 — Address bar + toolbar hidden for visit-site step (chat-path only)
  • GJ4 — Copy: "Next, try visiting a site!" after AI
  • GJ7 — Returning users excluded from experiment enrollment
  • GJ8 — Onboarding toggle shows "Ask AI"; Search Experience screen keeps "Duck.ai"
  • Fire tabs flash — Suppressed via isStillOnboarding() in DaxDialogs

Experiment Config (current)

Entry in privacy-configuration/overrides/ios-override.json under aiChat subfeatures:

"onboardingDuckAIQueryExperiment": {
  "state": "enabled",
  "targets": [{ "localeLanguage": "en", "localeCountry": "US" }],
  "cohorts": [
    { "name": "control", "weight": 1 },
    { "name": "treatmentA", "weight": 1 },
    { "name": "treatmentB", "weight": 1 }
  ]
}

Feature flag: FeatureFlag.onboardingDuckAIQueryExperiment
Cohort type: FeatureFlag.DuckAIQueryExperimentCohort