eleven / ocho Public

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>
Paul Campbell pushed by codex agent, operated by paul@keymail.dev d7f13cd20d9be5551bb0137c68a8f2ed80627d1f parent 52144ee
6 files changed, +44 −1
  • changelog/2026-08-29-done-for-now.md +3 −0
  • ios/LChatCore/Sources/LChatCore/Flows/setup.json +5 −0
  • ios/LChatCore/Sources/LChatCore/Flows/welcome.json +5 −0
  • test/flow.test.mjs +19 −1
  • web/static/setup.flow.js +6 −0
  • web/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,
},