fix(onboarding): stop promising web-UI visibility for imported history · Entire
fix(onboarding): stop promising web-UI visibility for imported history
c0c0409·
peyton-alt·2d ago·2 files·+63 added/-10 removed
The consent prompt's summary appended 'so your work shows up in the web UI' to every offered step, including the import step — but imported history is local-only (session list, explain) and does not appear in the web UI. Keep the web-UI clause on login/mirror and give import its own honest clause.
Co-Authored-By: Claude Fable 5 noreply@anthropic.com
Sessions
01KXM1FZBVT08VCSEFYDF8HC7BView transcript
[?
Fix Onboarding History and Scan Cache IssuesClaude Code·Fable 5·1 step](/content/gh/entireio/cli/session/4c8ea8be-3447-426e-b8cb-07f2c8a04b71#timeline-01KXM1FZBVT08VCSEFYDF8HC7B/index.html)
Changes
2
cmd/entire/cli
Monboarding_offer.go+19/-10
Monboarding_offer_test.go+44
270 unmodified lines
271
272
273
274
274
275
276
277
276
278
279
280
281
282
280
283
284
282
285
286
284
287
288
289
287
288
290
291
292
293
290
291
292
294
295
296
297
298
299
300
301
302
303
304
270 unmodified lines
// onboardingSetupSummary describes what the fast path will do, e.g.
// "Logs in to entire.io and mirrors this repo so your work shows up in the
// web UI."
// web UI." The import step carries its own benefit clause: imported history
// is local-only (session list, explain) and does not appear in the web UI,
// so the web-UI promise must never attach to it.
func onboardingSetupSummary(missing []onboarding.Result) string {
steps := make([]string, 0, len(missing))
webSteps := make([]string, 0, len(missing))
importStep := false
for _, r := range missing {
switch r.Rung.Key {
case onboarding.KeyAuth:
steps = append(steps, "logs in to entire.io")
webSteps = append(webSteps, "logs in to entire.io")
case onboarding.KeyMirror:
steps = append(steps, "mirrors this repo")
webSteps = append(webSteps, "mirrors this repo")
case onboarding.KeyImport:
steps = append(steps, "imports existing agent history")
importStep = true
}
}
if len(steps) == 0 {
return ""
var sentences []string
if len(webSteps) > 0 {
sentences = append(sentences, formatTokenClassList(webSteps)+" so your work shows up in the web UI.")
}
summary := formatTokenClassList(steps)
// Capitalize the first step: summaries are full sentences in the prompt.
return strings.ToUpper(summary[:1]) + summary[1:] + " so your work shows up in the web UI."
if importStep {
sentences = append(sentences, "imports existing agent history so past sessions show up in entire session list.")
}
// Capitalize each sentence: summaries are full sentences in the prompt.
for i, s := range sentences {
sentences[i] = strings.ToUpper(s[:1]) + s[1:]
}
return strings.Join(sentences, " ")
}
func confirmOnboardingRung(ctx context.Context, r onboarding.Result) (bool, error) {
Mcmd/entire/cli/onboarding_offer.go+19/-10
516 unmodified lines
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
516 unmodified lines
}
}
}
// The consent prompt's summary must never promise web-UI visibility for the
// import step: imported history is local-only (session list, explain) and
// does not appear in the web UI. Login and mirror keep the web-UI clause.
func TestOnboardingSetupSummary_ImportClauseIsLocal(t *testing.T) {
t.Parallel()
result := func(key string) onboarding.Result {
return onboarding.Result{Rung: onboarding.Rung{Key: key}}
}
cases := []struct {
name string
missing []onboarding.Result
want string
}{
{
name: "web steps and import",
missing: []onboarding.Result{result(onboarding.KeyAuth), result(onboarding.KeyMirror), result(onboarding.KeyImport)},
want: "Logs in to entire.io and mirrors this repo so your work shows up in the web UI. Imports existing agent history so past sessions show up in entire session list.",
},
{
name: "import only",
missing: []onboarding.Result{result(onboarding.KeyImport)},
want: "Imports existing agent history so past sessions show up in entire session list.",
},
{
name: "web steps only",
missing: []onboarding.Result{result(onboarding.KeyAuth)},
want: "Logs in to entire.io so your work shows up in the web UI.",
},
{
name: "nothing missing",
want: "",
},
}
for _, tc := range cases {
t.Run(tc.name, func(t *testing.T) {
t.Parallel()
if got := onboardingSetupSummary(tc.missing); got != tc.want {
t.Errorf("onboardingSetupSummary = %q, want %q", got, tc.want)
}
})
}
}
}
Mcmd/entire/cli/onboarding_offer_test.go+44