web+ios: Eleven's finish line offers "Done for now" (#1477)
"Where would you like to start?" offered only destinations, so being finished had no answer — the last beat of setup implied there was somewhere else you ought to be. Adds a Done for now chip to both finish steps, which says the thing out loud: you're set up, nothing is outstanding, Eleven is here if you want it. Flow data only; native bundles regenerated. Claude-Session: https://claude.ai/code/session_01GUA1EJFYwgr2nZNVBRFf8k
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
6 files changed,
+44
−1
changelog/2026-08-29-done-for-now.md+3 −0ios/LChatCore/Sources/LChatCore/Flows/setup.json+5 −0ios/LChatCore/Sources/LChatCore/Flows/welcome.json+5 −0test/flow.test.mjs+19 −1web/static/setup.flow.js+6 −0web/static/welcome.flow.js+6 −0
diff --git a/changelog/2026-08-29-done-for-now.md b/changelog/2026-08-29-done-for-now.md| new file mode 100644 |
| index 0000000..b033a45 |
| --- /dev/null |
| +++ b/changelog/2026-08-29-done-for-now.md |
| @@ -0,0 +1,3 @@ |
| +🤖 Eleven's setup and welcome chats now end with **Done for now** alongside the |
| +places you could go next — because most of the time you're finished, and |
| +"where would you like to start?" deserves an answer that means "nowhere, thanks". |
diff --git a/ios/LChatCore/Sources/LChatCore/Flows/setup.json b/ios/LChatCore/Sources/LChatCore/Flows/setup.json| index bc75ccc..844b172 100644 |
| --- a/ios/LChatCore/Sources/LChatCore/Flows/setup.json |
| +++ b/ios/LChatCore/Sources/LChatCore/Flows/setup.json |
| @@ -975,6 +975,11 @@ |
| "effect": { |
| "verb": "startTour" |
| } |
| + }, |
| + { |
| + "label": "Done for now", |
| + "spent": "Done", |
| + "say": "You're all set. 👍 I'm here whenever you want me — just say hello, or type `/` to see what I can do." |
| } |
| ], |
| "end": true |
diff --git a/ios/LChatCore/Sources/LChatCore/Flows/welcome.json b/ios/LChatCore/Sources/LChatCore/Flows/welcome.json| index 2d312ee..a663f23 100644 |
| --- a/ios/LChatCore/Sources/LChatCore/Flows/welcome.json |
| +++ b/ios/LChatCore/Sources/LChatCore/Flows/welcome.json |
| @@ -461,6 +461,11 @@ |
| "effect": { |
| "verb": "startTour" |
| } |
| + }, |
| + { |
| + "label": "Done for now", |
| + "spent": "Done", |
| + "say": "You're all set. 👍 I'm here whenever you want me — just say hello, or type `/` to see what I can do." |
| } |
| ], |
| "end": true |
diff --git a/test/flow.test.mjs b/test/flow.test.mjs| index f0feff5..0c92092 100644 |
| --- a/test/flow.test.mjs |
| +++ b/test/flow.test.mjs |
| @@ -840,11 +840,29 @@ await test("welcome: skip everything — nudge acks, photo skip disarms, nag on |
| const fin = h.transcript.find((t) => t.extra.key === "q-finish"); |
| assert.match(fin.text, /^No problem — you can add one anytime from your profile\./); |
| assert.match(fin.text, /One more reminder before you go/); |
| - assert.deepEqual(h.lastChips.map((c) => c.label), ["Sign in", "Take the tour"], "the parting sign-in chip rides the finish"); |
| + assert.deepEqual(h.lastChips.map((c) => c.label), ["Sign in", "Take the tour", "Done for now"], |
| + "the parting sign-in chip rides the finish, and every finish offers a way to just be done"); |
| // No open groups in this env — the mention and its chip stay hidden. |
| assert.equal(/open groups/.test(fin.text), false); |
| }); |
| +// "Where would you like to start?" used to offer only destinations, so being |
| +// finished had no answer (Paul, 2026-08-29). |
| +await test("both finishes offer 'Done for now', which says you're set", async () => { |
| + for (const [flow, label] of [[SETUP_FLOW, "setup"], [WELCOME_FLOW, "welcome"]]) { |
| + const h = harness({ done: { name: true, group: true, email: true, photo: true, invites: true, |
| + extras: true, "ai-optin": true, plan: true, keys: true, |
| + access: true, nudge: true, tour: true }, |
| + enrolled: true, envExtra: label === "welcome" ? welcomeEnv() : {} }); |
| + if (label === "welcome") h.env.accessBackedUp = () => true; |
| + runFlow(flow, h.env, h.io); |
| + await tick(); |
| + assert.ok(h.lastChips.map((c) => c.label).includes("Done for now"), `${label} offers it`); |
| + await h.tap("Done for now"); |
| + assert.match(h.lastText(), /^You're all set\. 👍/, `${label} acknowledges it`); |
| + } |
| +}); |
| + |
| await test("welcome: open groups get a finish mention + a Browse chip", async () => { |
| const h = harness({ enrolled: true, envExtra: welcomeEnv({ openGroups: true }) }); |
| h.env.accessBackedUp = () => true; |
diff --git a/web/static/setup.flow.js b/web/static/setup.flow.js| index 063b734..029a186 100644 |
| --- a/web/static/setup.flow.js |
| +++ b/web/static/setup.flow.js |
| @@ -680,6 +680,12 @@ export default { |
| { label: "Open admin", advancing: false, effect: { verb: "openAdmin" } }, |
| // The tour is the web's guided overlay — web-only for now. |
| { if: "!native", label: "Take the tour", advancing: false, effect: { verb: "startTour" } }, |
| + // "Where would you like to start?" needs an answer that ISN'T a |
| + // destination: most people are finished, and every chip pointing |
| + // somewhere else made leaving feel like the one thing on offer. |
| + // Advancing (so it spends itself), and it says the thing out loud — |
| + // you're set up, nothing is outstanding, Eleven is here if you want it. |
| + { label: "Done for now", spent: "Done", say: "You're all set. 👍 I'm here whenever you want me — just say hello, or type `/` to see what I can do." }, |
| ], |
| end: true, |
| }, |
diff --git a/web/static/welcome.flow.js b/web/static/welcome.flow.js| index 6598a93..2613183 100644 |
| --- a/web/static/welcome.flow.js |
| +++ b/web/static/welcome.flow.js |
| @@ -327,6 +327,12 @@ export default { |
| { if: "openGroups", label: "Browse open groups", advancing: false, effect: { verb: "openDiscover" } }, |
| // The tour is the web's guided overlay — web-only for now. |
| { if: "!native", label: "Take the tour", advancing: false, effect: { verb: "startTour" } }, |
| + // "Where would you like to start?" needs an answer that ISN'T a |
| + // destination: most people are finished, and every chip pointing |
| + // somewhere else made leaving feel like the one thing on offer. |
| + // Advancing (so it spends itself), and it says the thing out loud — |
| + // you're set up, nothing is outstanding, Eleven is here if you want it. |
| + { label: "Done for now", spent: "Done", say: "You're all set. 👍 I'm here whenever you want me — just say hello, or type `/` to see what I can do." }, |
| ], |
| end: true, |
| }, |