# iOS: Chat-Path Onboarding — Tracker Blocking Demo > **Asana:** [Ship Review task](https://app.asana.com/1/137249556945/task/1214147157456478) > **Branch stack:** `demo-tracker-blocking-onboarding` → `ui-polish` → `chat-path-dialog-polish` → `sr-feedback` → `uti-flow` > **Due:** 2026-05-15 ## PR Stack | PR | Branch | Status | |---|---|---| | [#4544](https://github.com/duckduckgo/apple-browsers/pull/4544) | `demo-tracker-blocking-onboarding` | Open — review required | | [#4591](https://github.com/duckduckgo/apple-browsers/pull/4591) | `demo-tracker-blocking-onboarding-ui-polish` | Approved | | [#4664](https://github.com/duckduckgo/apple-browsers/pull/4664) | `demo-tracker-blocking-onboarding-chat-path-dialog-polish` | Approved | | [#4668](https://github.com/duckduckgo/apple-browsers/pull/4668) | `demo-tracker-blocking-onboarding-uti-flow` | Open — no review yet | | [#4855](https://github.com/duckduckgo/apple-browsers/pull/4855) | `demo-tracker-blocking-onboarding-sr-feedback` | Open — no review yet | --- ## Required Changes ### PR #4544 - [x] Danger CI: no `@UserDefaultsWrapper` remains - [x] Mock refactor (alessandroboron): `MockDaxDialogsSettings.chatPathPhase` plain stored property - [x] **Sync restore exclusion** — [Alessandro May 7](https://app.asana.com/1/137249556945/task/1214147157456478): *"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()` - [x] `return .treatmentA` override removed from `resolveDuckAIQueryExperimentCohortID()` - [x] Pixels: `onboardingChatPathTryVisitSiteUnique` / `onboardingChatPathTrackersBlockedUnique` defined, no overlap with PR #4687 ### PR #4664 - [x] Title scope fix (alessandroboron): `createSubsequentDialog` uses correct title per chat-path vs standard path ### PR #4668 - [x] Dialog position, dismiss, UTI bar, completion path resolved - [x] `.unifiedToggleInput` feature flag has no hardcoded `defaultValue: .enabled` ### PR #4855 - [x] `setBarsHidden(true/false, animated: false, customAnimationDuration: nil)` replaces `setNavigationBarHidden` + `setChatPathVisitSiteControlsLocked` in show/dismiss/dismissHostingController - [x] `newTabPageControllerCurrentTabIsLoading` added to `NewTabPageControllerDelegate`; all `(parent as? MainViewController)?` casts gone from `NewTabPageViewController` - [x] Loading guard folded into outer `if` via delegate method - [x] `searchAndDuckAIOption` reverted to `"Toggle between\nSearch and Duck.ai"` in `UserText.swift` + all 26 lproj files - [x] **DuckAIQuery toggle copy** — [Gary May 6](https://app.asana.com/1/137249556945/task/1214147157456478): *"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](https://app.asana.com/1/137249556945/task/1214147157456478/1214600831548835): *"to avoid impacting any live onboarding experiments we can exclude those experiment participants when we release. Continue coordination in [O-J <> O-N Coordination](https://app.asana.com/1/137249556945/project/1214157224317277/task/1214288645859692)."* Task [O-J <> O-N Coordination](https://app.asana.com/1/137249556945/project/1214157224317277/task/1214288645859692) (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". - [ ] Confirm experiment is listed and named correctly in [O-J <> O-N Coordination](https://app.asana.com/1/137249556945/project/1214157224317277/task/1214288645859692) before going live. ### 2. Privacy config targeting - [x] 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: ```json "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`