Skip to content

Remove dead FirstMeeting onboarding flow#18907

Merged
ashleeradka merged 3 commits into
mainfrom
devin/1773873692-lum-282-migrate-capabilities-modal-to-vmodal
Mar 19, 2026
Merged

Remove dead FirstMeeting onboarding flow#18907
ashleeradka merged 3 commits into
mainfrom
devin/1773873692-lum-282-migrate-capabilities-modal-to-vmodal

Conversation

@devin-ai-integration

@devin-ai-integration devin-ai-integration Bot commented Mar 18, 2026

Copy link
Copy Markdown
Contributor

Summary

The FirstMeeting/ onboarding flow (FirstMeetingFlowView and its 9 child views) is dead code — FirstMeetingFlowView is never instantiated anywhere in the codebase. The active onboarding uses OnboardingFlowView with a completely different step sequence (WakeUp → APIKey → APIKeyEntry → ImproveExperience). This PR deletes the unreachable code and cleans up associated state.

Why this is safe to remove — git history evidence

The FirstMeeting flow was an experimental variant that lasted ~1 day before being deliberately disconnected. The files were never reconnected.

Date Commit What happened
Feb 12 7738d6efe (#1350) FirstMeetingFlowView added, wired into OnboardingWindow via variant routing (if state.onboardingVariant == .firstMeeting)
Feb 12–13 #1352#1356 Child views built out (CapabilitiesBriefing, Observation, Egg/Hatch, Introduction)
Feb 13 1b2c0bdc0 (#1405) "Remove onboarding variant picker and fix card centering" — deliberately removed variant routing from OnboardingWindow, making FirstMeetingFlowView unreachable. Commit message: "simplify onboarding to use only the default flow."
Feb 13 – present Multiple PRs Onboarding redesigned 3+ times (avatar evolution #4682, managed sign-in #16668, API key redesign #17344). FirstMeeting files never reconnected — only received mechanical changes (color token migrations, icon swaps, preview removals).

What changed

Deleted (10 files, ~1,660 lines):

  • FirstMeetingFlowView, FirstMeetingEggView, FirstMeetingHatchView
  • FirstMeetingIntroductionView, FirstMeetingIntroductionViewModel
  • CapabilitiesBriefingView, CapabilitiesModalView
  • ObservationModeView, ObservationSessionView, ObservationSummaryView

Kept (2 files in FirstMeeting/):

  • JITPermissionManager.swift — actively used by MainWindowView
  • JITPermissionView.swift — actively used by MainWindowView

Cleaned up in OnboardingState.swift:

  • Removed OnboardingVariant enum (.default / .firstMeeting)
  • Removed 7 first-meeting-specific properties (firstMeetingCrackProgress, conversationCompleted, capabilitiesBriefingShown, observationCompleted, firstTaskCandidate, observationDurationMinutes, observationInsights)
  • Removed variant-based branching in crackProgress, init(), and persist()
  • Simplified step clamping to a constant maxStep = 3
  • clearPersistedState() still removes the old onboarding.variant and onboarding.firstMeetingCrackProgress keys so they get cleaned up on logout/retire

Review & Testing Checklist for Human

  • Verify step clamping simplification — The old code checked MacOSClientFeatureFlagManager.shared.isEnabled("managed_sign_in_enabled") before falling through to maxStep = 3. Both managed and non-managed paths already resolved to maxStep = 3; only the now-deleted firstMeeting variant had maxStep = 4. Confirm let maxStep = 3 is equivalent in all flag states.
  • Build in Xcode — Swift-only changes, cannot verify compilation on Linux.
  • Spot-check onboarding — Run through the active flow (WakeUp → APIKey → APIKeyEntry → ImproveExperience → hatching) to confirm no regressions.
  • Verify JIT permission flowJITPermissionManager and JITPermissionView were kept. Confirm the JIT permission overlay in MainWindowView still works.

Test plan: Launch the app → trigger onboarding → complete all steps through to hatching. Separately, trigger a JIT permission prompt (e.g. accessibility) to verify the overlay still appears.

Notes

  • clearPersistedState() retains the old onboarding.variant and onboarding.firstMeetingCrackProgress keys in its cleanup list so any orphaned UserDefaults values are removed on logout/retire. persist() no longer writes them.
  • This was originally scoped as a VModal migration for CapabilitiesModalView (LUM-282), but investigation revealed the view is unreachable. Issue updated to Won't Do.

Link to Devin session: https://app.devin.ai/sessions/771fad2a97c547ee91fb8306e99a216f
Requested by: @ashleeradka


Open with Devin

Co-Authored-By: ashlee@vellum.ai <ashlee@vellum.ai>
@devin-ai-integration

Copy link
Copy Markdown
Contributor Author

🤖 Devin AI Engineer

I'll be helping with this pull request! Here's what you should know:

✅ I will automatically:

  • Address comments on this PR. Add '(aside)' to your comment to have me ignore it.
  • Look at CI failures and help fix them

⚙️ Control Options:

  • Disable automatic comment and CI monitoring

@linear

linear Bot commented Mar 18, 2026

Copy link
Copy Markdown
LUM-282 Migrate CapabilitiesModalView to use VModal

Context

Sub-issue of LUM-276 (lower priority). Migrate CapabilitiesModalView to use the shared VModal component.

File: clients/macos/vellum-assistant/Features/Onboarding/FirstMeeting/CapabilitiesModalView.swift

Current State

  • Uses Meadow/material background (.ultraThinMaterial + Meadow.panelBackground) instead of standard VColor.surfaceOverlay
  • No header with title/close button
  • Single "Got it" VButton as footer
  • Uses @Environment(\.dismiss) for dismiss
  • 400x480pt frame with VRadius.xl corner radius
  • Onboarding-only view (specialized context)

Considerations

  • This view has a unique visual style (Meadow theme) that may intentionally differ from standard modals
  • VModal may need to support custom background overrides, or this view may be an exception

Acceptance Criteria

  • Replace hand-rolled chrome with VModal where appropriate
  • Determine if Meadow background should be preserved or standardized
  • Add proper header with close button if appropriate for onboarding context
  • Preserve all capability sections content
  • No visual regressions
  • Verify visually after migration

Summary: Migrate the onboarding CapabilitiesModalView to the shared VModal component while preserving its current layout and verifying visual parity.

Key Context:

  • Current view uses a Meadow/material-styled background (.ultraThinMaterial + Meadow.panelBackground) instead of VColor.surfaceOverlay; decide whether to preserve this or standardize.
  • Modal chrome is currently custom (no header/title/close), with a single “Got it” footer button and dismissal via @Environment(\.dismiss).
  • Fixed sizing/styling today: 400×480pt frame and VRadius.xl corner radius; ensure no regressions after migration.

Generated by Linear Issue Context Agent

@devin-ai-integration devin-ai-integration Bot left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ Devin Review: No Issues Found

Devin Review analyzed this PR and found no potential bugs to report.

View in Devin Review to see 2 additional findings.

Open in Devin Review

@devin-ai-integration devin-ai-integration Bot changed the title Migrate CapabilitiesModalView to use VModal (LUM-282) refactor: Use shared VModal in CapabilitiesModalView Mar 18, 2026
@devin-ai-integration

Copy link
Copy Markdown
Contributor Author

Closing this PR — CapabilitiesModalView is dead code. FirstMeetingFlowView (the only consumer) is never instantiated anywhere in the codebase. The current onboarding flow (OnboardingFlowView) uses a completely different step sequence (WakeUp → APIKey → APIKeyEntry → ImproveExperience) that doesn't include the capabilities briefing step.

Delete 10 unused files from FirstMeeting/ directory and remove
first-meeting-specific state from OnboardingState. The FirstMeetingFlowView
(the only consumer of these files) is never instantiated — the active
onboarding uses OnboardingFlowView with a different step sequence.

JITPermissionManager and JITPermissionView are retained as they are
still used by MainWindowView.

Co-Authored-By: ashlee@vellum.ai <ashlee@vellum.ai>
@devin-ai-integration devin-ai-integration Bot changed the title refactor: Use shared VModal in CapabilitiesModalView Remove dead FirstMeeting onboarding flow Mar 18, 2026

@devin-ai-integration devin-ai-integration Bot left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Devin Review found 2 new potential issues.

View 2 additional findings in Devin Review.

Open in Devin Review

Comment thread clients/macos/vellum-assistant/Features/Onboarding/OnboardingState.swift Outdated
Co-Authored-By: ashlee@vellum.ai <ashlee@vellum.ai>

@devin-ai-integration devin-ai-integration Bot left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Devin Review found 1 new potential issue.

View 2 additional findings in Devin Review.

Open in Devin Review

@devin-ai-integration

Copy link
Copy Markdown
Contributor Author

Git History Evidence: Why These Files Are Dead Code

The FirstMeeting/ flow was an experimental onboarding variant that lasted ~1 day before being deliberately disconnected. The files were never cleaned up.

Timeline

Date Commit What happened
Feb 12, 2026 7738d6efe (#1350) FirstMeetingFlowView added and wired into OnboardingWindow via variant routing (if state.onboardingVariant == .firstMeeting)
Feb 12, 2026 #1352#1356 Child views built out: CapabilitiesBriefing, Observation, Egg/Hatch, Introduction
Feb 13, 2026 1b2c0bdc0 (#1405) "Remove onboarding variant picker and fix card centering" — explicitly removed the FirstMeetingFlowView routing from OnboardingWindow, simplifying to default-only flow. Commit message: "simplify onboarding to use only the default flow."
Feb 13 – present Multiple PRs Onboarding redesigned multiple times (managed sign-in, API key flow, avatar evolution). FirstMeeting files never reconnected.

Key Evidence

Kept Files

  • JITPermissionManager.swift and JITPermissionView.swift are still actively used by MainWindowView for just-in-time permission prompts.

@ashleeradka ashleeradka merged commit 499bf02 into main Mar 19, 2026
3 checks passed
@ashleeradka ashleeradka deleted the devin/1773873692-lum-282-migrate-capabilities-modal-to-vmodal branch March 19, 2026 01:05
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant