[object Object]

← back to Exo

feat(app): add friendly context message to bug report prompt (#1959)

8993ccaf091b81004bd78a84c1f4e99a7cc7f80e · 2026-04-22 18:39:36 +0100 · Alex Cheema

## Motivation

When a user clicks **Send Bug Report** in the macOS app, we already give
them the option to add more context via an optional text field. But the
current prompt is just a terse label — `"What's the issue? (optional)"`
— which doesn't tell the user why bothering to fill it in matters. A
friendly one-line explanation increases the chance they'll describe what
went wrong, which is the single most useful signal when we triage the
resulting diagnostic bundle.

## Changes

- `app/EXO/EXO/ContentView.swift`: In the `.prompting` phase of
`sendBugReportButton`, replace the single label with a two-line
hierarchy:
  - Primary: `Tell us what went wrong (optional)`
- Helper: `A quick description of what you were doing and what happened
helps us track down the bug for you.`
- The helper uses `.caption2` + `.secondary` + `.opacity(0.8)` +
`.fixedSize(horizontal: false, vertical: true)` so it stays visually
subordinate and wraps cleanly inside the 340pt popover.

No changes to `BugReportService`, the `user_description` payload, or any
other flow.

## Why It Works

The optional description is already plumbed end-to-end (text editor →
`bugReportUserDescription` state → `BugReportService.sendReport(...,
userDescription:)` → `report.json`'s `user_description` field → GitHub
issue pre-fill). The only gap was user-facing motivation, so this is
purely a copy/layout tweak inside the existing `.prompting` case — no
new state, bindings, or service changes.

## Test Plan

### Manual Testing
<!-- Hardware: MacBook Pro (macOS app build via Xcode) -->
- Build the macOS app in Xcode (`app/EXO/EXO.xcodeproj`) and launch it.
- Open the menubar popover → expand **Debug Info** → click **Send Bug
Report**.
- Verify the new primary label and helper sentence both appear above the
text editor and wrap cleanly within the popover width.
- Leave the field empty → click **Send** → upload should succeed (no
`user_description` in payload, same as before).
- Fill in a description → click **Send** → upload succeeds and the
success card with **Create GitHub Issue** appears; clicking it opens
GitHub with the description pre-filled.
- Click **Cancel** from the prompting state → returns to idle.

### Automated Testing
<!-- Describe changes to automated tests, or how existing tests cover
this change -->
- No new automated tests. This is a SwiftUI copy/layout change; existing
`EXOTests` are smoke-level and don't cover `ContentView` view bodies,
and UI snapshot tests aren't worth adding for a two-line copy tweak.
- `nix fmt` reports 0 files changed after the edit; `nix flake check` in
CI will verify formatting/lint for the rest of the tree.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

Files touched

Diff

commit 8993ccaf091b81004bd78a84c1f4e99a7cc7f80e
Author: Alex Cheema <41707476+AlexCheema@users.noreply.github.com>
Date:   Wed Apr 22 18:39:36 2026 +0100

    feat(app): add friendly context message to bug report prompt (#1959)
    
    ## Motivation
    
    When a user clicks **Send Bug Report** in the macOS app, we already give
    them the option to add more context via an optional text field. But the
    current prompt is just a terse label — `"What's the issue? (optional)"`
    — which doesn't tell the user why bothering to fill it in matters. A
    friendly one-line explanation increases the chance they'll describe what
    went wrong, which is the single most useful signal when we triage the
    resulting diagnostic bundle.
    
    ## Changes
    
    - `app/EXO/EXO/ContentView.swift`: In the `.prompting` phase of
    `sendBugReportButton`, replace the single label with a two-line
    hierarchy:
      - Primary: `Tell us what went wrong (optional)`
    - Helper: `A quick description of what you were doing and what happened
    helps us track down the bug for you.`
    - The helper uses `.caption2` + `.secondary` + `.opacity(0.8)` +
    `.fixedSize(horizontal: false, vertical: true)` so it stays visually
    subordinate and wraps cleanly inside the 340pt popover.
    
    No changes to `BugReportService`, the `user_description` payload, or any
    other flow.
    
    ## Why It Works
    
    The optional description is already plumbed end-to-end (text editor →
    `bugReportUserDescription` state → `BugReportService.sendReport(...,
    userDescription:)` → `report.json`'s `user_description` field → GitHub
    issue pre-fill). The only gap was user-facing motivation, so this is
    purely a copy/layout tweak inside the existing `.prompting` case — no
    new state, bindings, or service changes.
    
    ## Test Plan
    
    ### Manual Testing
    <!-- Hardware: MacBook Pro (macOS app build via Xcode) -->
    - Build the macOS app in Xcode (`app/EXO/EXO.xcodeproj`) and launch it.
    - Open the menubar popover → expand **Debug Info** → click **Send Bug
    Report**.
    - Verify the new primary label and helper sentence both appear above the
    text editor and wrap cleanly within the popover width.
    - Leave the field empty → click **Send** → upload should succeed (no
    `user_description` in payload, same as before).
    - Fill in a description → click **Send** → upload succeeds and the
    success card with **Create GitHub Issue** appears; clicking it opens
    GitHub with the description pre-filled.
    - Click **Cancel** from the prompting state → returns to idle.
    
    ### Automated Testing
    <!-- Describe changes to automated tests, or how existing tests cover
    this change -->
    - No new automated tests. This is a SwiftUI copy/layout change; existing
    `EXOTests` are smoke-level and don't cover `ContentView` view bodies,
    and UI snapshot tests aren't worth adding for a two-line copy tweak.
    - `nix fmt` reports 0 files changed after the edit; `nix flake check` in
    CI will verify formatting/lint for the rest of the tree.
    
    🤖 Generated with [Claude Code](https://claude.com/claude-code)
    
    Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
---
 app/EXO/EXO/ContentView.swift | 11 ++++++++++-
 1 file changed, 10 insertions(+), 1 deletion(-)

diff --git a/app/EXO/EXO/ContentView.swift b/app/EXO/EXO/ContentView.swift
index 0743df13..c30df992 100644
--- a/app/EXO/EXO/ContentView.swift
+++ b/app/EXO/EXO/ContentView.swift
@@ -584,9 +584,18 @@ struct ContentView: View {
 
             case .prompting:
                 VStack(alignment: .leading, spacing: 6) {
-                    Text("What's the issue? (optional)")
+                    VStack(alignment: .leading, spacing: 2) {
+                        Text("Tell us what went wrong (optional)")
+                            .font(.caption2)
+                            .foregroundColor(.secondary)
+                        Text(
+                            "A quick description of what you were doing and what happened helps us track down the bug for you."
+                        )
                         .font(.caption2)
                         .foregroundColor(.secondary)
+                        .opacity(0.8)
+                        .fixedSize(horizontal: false, vertical: true)
+                    }
                     TextEditor(text: $bugReportUserDescription)
                         .font(.caption2)
                         .frame(height: 60)

← 4939fbe9 feat(dashboard): add Pi integration tab (#1925)  ·  back to Exo  ·  Fix Gemma 4 E2B TP + DeepSeek V32 thinking parsing (#1967) 3894cf13 →