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

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