Skip to content

[8/12] feat: onboarding, feature tour & live transcript window - #17

Open
Mvkd108 wants to merge 2 commits into
feat/computer-use-plannerfrom
feat/meeting-live-transcript-window
Open

[8/12] feat: onboarding, feature tour & live transcript window#17
Mvkd108 wants to merge 2 commits into
feat/computer-use-plannerfrom
feat/meeting-live-transcript-window

Conversation

@Mvkd108

@Mvkd108 Mvkd108 commented Aug 4, 2026

Copy link
Copy Markdown
Collaborator

Status: REVIEW ONLY — do not merge. PR 8 of 12 in a stacked series; stacked on #16. This PR shows only its own chunk. Series intro, divergence notes and full map: #10. Next: #18.

This PR (8/12): onboarding, feature tour & live transcript window

Commits:

  • 213e414 feat: onboarding window, feature tour and product experience state — OnboardingWindow.xaml(.cs), FeatureTourWindow.xaml(.cs), Services/OnboardingProgressStore.cs, Services/ProductExperienceState.cs, Services/Phase12PreviewMode.cs, docs/PHASE12_PRODUCT_EXPERIENCE.md
  • 9298051 feat: meeting live transcript window — MeetingLiveTranscriptWindow.xaml(.cs)

10 files, +897.

Review focus

  • Onboarding flow parity with macOS (step order, skippability, restart behavior via OnboardingProgressStore).
  • FeatureTourWindow — trigger conditions and one-shot semantics.
  • MeetingLiveTranscriptWindow — update cadence against the PR 6 live session; speaker rendering hooks.
  • Phase12PreviewMode / ProductExperienceState — gating of preview experiences.

Expected — do not flag: these windows are not shown by the app shell until PR 9/10 wiring; live transcription remains Off by default (PR 6 limits).

Known limits

  • Physical visual evidence at 100%/150%/200% DPI and multi-monitor is incomplete — verified on a single 125% monitor only (desktop approval limit). This is an environment gap, not a code defect; scripts/verify-phase12-ui.ps1 (PR 12) exists for the physical pass.

Test evidence

  • Full stack at tip: build clean (--no-restore); 484/484 passing; visual parity cells 352/352.
  • Suite lands in PR 11; class covering this chunk: Phase12ProductExperienceTests.

Previous: #16 | Next: #18

Copilot AI lite review requested due to automatic review settings August 4, 2026 09:04
@coderabbitai

coderabbitai Bot commented Aug 4, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 4c5aed20-a642-48a7-9190-b8846ce4e392

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Pull request overview

Introduces Phase 12 “product experience” surfaces (onboarding + feature tour) and a standalone live transcript window, along with an isolated --phase12-* visual verification mode intended to render these UI states without touching production services or user data.

Changes:

  • Added onboarding progress persistence/reconciliation (OnboardingProgressStore) plus the new onboarding window UI (OnboardingWindow).
  • Added a feature tour window (FeatureTourWindow) and Phase 12 visual verification entry point/argument parsing (Phase12PreviewMode).
  • Added a meeting live transcript window UI (MeetingLiveTranscriptWindow) and documented the Phase 12 product experience and verification matrix.

Reviewed changes

Copilot reviewed 10 out of 10 changed files in this pull request and generated 4 comments.

Show a summary per file
File Description
windows-native/Muesli.Windows/Services/ProductExperienceState.cs Adds DTO-style records for representing product experience state and recent history.
windows-native/Muesli.Windows/Services/Phase12PreviewMode.cs Adds isolated Phase 12 preview/visual verification mode and argument parsing for page/case/theme/size.
windows-native/Muesli.Windows/Services/OnboardingProgressStore.cs Adds durable onboarding progress storage + reconciliation helpers for selection changes.
windows-native/Muesli.Windows/OnboardingWindow.xaml.cs Implements onboarding flow UI logic and gating (microphone/model/hotkey/pipeline checks).
windows-native/Muesli.Windows/OnboardingWindow.xaml Adds onboarding window layout and navigation controls.
windows-native/Muesli.Windows/MeetingLiveTranscriptWindow.xaml.cs Adds live transcript window behavior (positioning, UI updates, copy).
windows-native/Muesli.Windows/MeetingLiveTranscriptWindow.xaml Adds live transcript window layout including partial text and waveform display.
windows-native/Muesli.Windows/FeatureTourWindow.xaml.cs Adds a multi-step feature tour window implementation.
windows-native/Muesli.Windows/FeatureTourWindow.xaml Adds the feature tour window layout.
docs/PHASE12_PRODUCT_EXPERIENCE.md Documents Phase 12 onboarding/preview isolation goals and DPI/monitor verification approach.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.


private static string? Option(IReadOnlyList<string> args, string name, string? fallback, out string? error)
{
var values = args.Where(arg => arg.StartsWith(name, StringComparison.OrdinalIgnoreCase)).ToArray(); error = null;
private void ChangeModelFreeDraft(OnboardingDraft draft) { SaveDraft(draft); RenderStep(); }
private void AddCompletion() => ContentPanel.Children.Add(new TextBlock { Text = $"Microphone: {(_progress.MicrophoneVerified ? "ready" : "needs test")}\nModels: {(_progress.ModelsVerified ? "ready" : "needs preparation")}\nShortcut: {(_progress.HotkeyVerified ? "ready" : "needs check")}\nDictation test: {(_progress.PipelineVerified ? "passed" : "needs successful transcript")}", TextWrapping = TextWrapping.Wrap, FontSize = 15 });

private WpfButton ActionButton(string text, Func<Task> action, System.Windows.Controls.Panel? parent = null)
Comment on lines +21 to +22
<Button Grid.Column="1" Content="Copy" Margin="8,0,0,0" Padding="8,3" Click="Copy_Click" Style="{StaticResource GhostButton}" />
<Button Grid.Column="2" Content="×" Margin="6,0,0,0" Padding="8,3" Click="Dismiss_Click" Style="{StaticResource GhostButton}" />
@@ -0,0 +1 @@
<Window x:Class="Muesli.Windows.FeatureTourWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="Muesli feature tour" Width="620" Height="440" MinWidth="500" MinHeight="360" WindowStartupLocation="CenterOwner" Background="{DynamicResource BackgroundBaseBrush}" Foreground="{DynamicResource TextPrimaryBrush}" PreviewKeyDown="Window_PreviewKeyDown" Loaded="Window_Loaded"><DockPanel Margin="28"><Grid DockPanel.Dock="Bottom" Margin="0,20,0,0"><Grid.ColumnDefinitions><ColumnDefinition Width="Auto"/><ColumnDefinition Width="*"/><ColumnDefinition Width="Auto"/></Grid.ColumnDefinitions><Button x:Name="BackButton" Style="{StaticResource GhostButton}" Content="Back" Click="Back_Click" AutomationProperties.Name="Previous tour step"/><Button x:Name="NextButton" Grid.Column="2" Style="{StaticResource PrimaryButton}" Content="Next" Click="Next_Click" AutomationProperties.Name="Next tour step"/></Grid><StackPanel><TextBlock x:Name="PreviewModeText" Style="{StaticResource SectionLabel}" Foreground="{DynamicResource WarningOrangeBrush}" Visibility="Collapsed"/><TextBlock x:Name="ProgressText" Style="{StaticResource SectionLabel}" AutomationProperties.LiveSetting="Polite"/><TextBlock x:Name="TitleText" Style="{StaticResource PageTitle}"/><TextBlock x:Name="BodyText" Style="{StaticResource PageSubtitle}" TextWrapping="Wrap" AutomationProperties.LiveSetting="Polite"/><TextBlock Text="The tour is always replayable from About or the tray." Margin="0,18,0,0" TextWrapping="Wrap" Foreground="{DynamicResource TextSecondaryBrush}"/></StackPanel></DockPanel></Window>
Mvkd108 and others added 2 commits August 18, 2026 20:21
Adds first-run onboarding covering permissions and model setup, a feature
tour for returning users, persistent onboarding progress, and a preview
mode flag so the experience can be exercised without a fresh profile.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
A separate always-on-top window showing the live transcript during a
meeting, positioned via the shared window placement service.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@Mvkd108
Mvkd108 force-pushed the feat/meeting-live-transcript-window branch from 9298051 to b207701 Compare August 18, 2026 14:51
@claude

claude Bot commented Aug 18, 2026

Copy link
Copy Markdown

Claude finished @Mvkd108's task in 2m 12s —— View job


Claude finished reviewing PR #17

Tasks

  • Gather context (PR body, existing Copilot review, CLAUDE.md)
  • Diff review: Phase12PreviewMode.cs, OnboardingWindow.xaml(.cs), MeetingLiveTranscriptWindow.xaml(.cs), FeatureTourWindow.xaml(.cs), OnboardingProgressStore.cs, MainWindow.xaml.cs, StartupRegistrationService.cs, docs
  • Post findings

High: MainWindow.CreateVisualPreview doesn't isolate anything — it just constructs the real production window

windows-native/Muesli.Windows/MainWindow.xaml.cs:671:

public static Window CreateVisualPreview(Phase12PreviewMode mode) => new MainWindow();

This is reached for every product-page preview case (dashboard, meetings, search, dictionary, models, shortcuts, settings, about — 8 of the 22 cataloged cases) via Phase12PreviewMode.CreateWindow() (Services/Phase12PreviewMode.cs:116). It ignores the mode argument entirely and calls the ordinary parameterless MainWindow() constructor, which:

  • calls _settingsStore.Load() and LoadPersistedData() (real %APPDATA%\muesli\*.json),
  • enumerates real microphones via _dictationCoordinator.ListMicrophones(),
  • constructs a real DictationCoordinator and MeetingRecordingCoordinator(_logService).

That directly contradicts the guarantees this PR's own doc and code claim for this mode:

  • Phase12PreviewMode.cs:9-11 (class doc): "no store, filesystem, registry, network, device, logging, native-client, hook, tray, or production lifecycle dependency."
  • Phase12PreviewMode.BlocksProductionActions / PresentationStatus default case: "Preview isolation: zero user history, zero statistics, and no production services."
  • docs/PHASE12_PRODUCT_EXPERIENCE.md:26,43-45: "Product-page cases construct the real MainWindow.xaml tree through its isolated preview constructor... The preview constructor does not create stores, AppData, onboarding progress, logging, dictation/native clients, tray, hooks, meeting detection, registry access, or external services."

No such isolated constructor exists — CreateVisualPreview is just an alias for new MainWindow(). Running --phase12-page-case=dashboard/empty (or meetings, search, dictionary, models, shortcuts, settings, about) would load and display the user's actual dictation/meeting history and settings rather than the documented empty/synthetic preview state — the opposite of what the visual-verification banner ("isolated / no user data") tells the operator. Given CLAUDE.md's "No placeholder/fake data" and "surface gaps in UI/logs rather than fabricating" guidance, the safer fix is either implementing the real isolated preview path this doc describes, or — if that's intentionally deferred — updating the doc/banner to stop asserting isolation for these 8 cases until it's implemented.

Medium: Phase12PreviewMode.Option() still matches by prefix, not exact switch name (unresolved from existing review)

Services/Phase12PreviewMode.cs:124-131 (Option helper) filters candidate args with arg.StartsWith(name, ...) rather than requiring an exact --name= match. This was already flagged in the earlier Copilot review pass and is still present in the current diff. Concretely: --phase12-theme-extra=foo starts with --phase12-theme and gets picked up as a candidate for the --phase12-theme option, then fails the subsequent StartsWith(name + "=") check and produces a misleading "--phase12-theme must be supplied exactly once as --phase12-theme=<value>." error even though the user never passed --phase12-theme at all. Restrict the match to arg == name (bare) or arg.StartsWith(name + "=", ...).

Confirmed still-open findings from the existing Copilot review (all verified present in the current HEAD, not yet addressed)

  1. OnboardingWindow.xaml.cs:347ActionButton(string text, Func<Task> action, System.Windows.Controls.Panel? parent = null) still has the unused parent parameter; no call site passes it.
  2. MeetingLiveTranscriptWindow.xaml:22 — the dismiss Button Content="×" still has no AutomationProperties.Name, so screen readers will likely announce "multiplication sign" rather than "Close"/"Dismiss". (The adjacent Copy button also has no automation name, for consistency.)
  3. FeatureTourWindow.xaml:1 — still committed as a single very long line, inconsistent with the multi-line/indented XAML style used elsewhere (e.g. MainWindow.xaml, OnboardingWindow.xaml in this same PR).

Note: the malformed-code snippet shown in the earlier Copilot comment's diff context for Phase12PreviewMode.CreateWindow() ({ visual verification · onboarding/{Case}" }) is not present in the current HEAD — that line is now valid (Title = $"Muesli visual verification · onboarding/{Case}"), so that specific concern appears already resolved.

Not flagged (per PR's own "expected" callouts)

  • Windows not yet wired into the app shell (PR 9/10) and live transcription being off by default — explicitly called out as expected in the PR description.
  • Multi-monitor/DPI physical verification gap — explicitly called out as a known environment limitation.

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.

2 participants