96 lines
5.4 KiB
Markdown
96 lines
5.4 KiB
Markdown
# 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`
|