Session card: indicator for auto-merge sessions (CROW-504)#506
Merged
Conversation
Add a small, muted arrow.triangle.merge glyph in the upper-right of each session card when Session.autoMergeEnabledAt is non-nil, so users can tell at a glance which sessions are on the auto-merge track without opening each one. Reads from the same persisted flag the IssueTracker auto-merge watcher writes — no new source of truth. 🐦⬛ Generated with Claude Code, orchestrated by Crow Co-Authored-By: Claude <noreply@anthropic.com> Crow-Session: 5FDFB71B-3BC4-4C57-BA1D-456A204CA967
dhilgaertner
approved these changes
Jun 14, 2026
dhilgaertner
left a comment
Contributor
There was a problem hiding this comment.
Code & Security Review
Critical Issues
None.
Security Review
Strengths:
- Read-only, presentational change. No new state, network, input handling, or persistence — the icon merely reflects the existing
Session.autoMergeEnabledAtflag. No security surface introduced.
Code Quality
- Source of truth is correct and verified.
Session.autoMergeEnabledAt: Date?exists (Packages/CrowCore/Sources/CrowCore/Models/Session.swift:35) and is the same flag written by the watcher (Sources/Crow/App/IssueTracker.swift:1708) and read by its one-shot guard (IssueTracker.swift:1621). BecauseAppStateis@Observable, the icon appears/disappears reactively — as described. - Symbol vocabulary is consistent.
arrow.triangle.mergeis already used in this file atSessionListView.swift:342for the crow:merge context-menu action. - Theme token valid.
CorveilTheme.textSecondaryresolves (CorveilTheme.swift:24); muted tone matches the ticket's request and the sibling status icons. - Layout is sound. Placed between
Spacer()and the status indicator (SessionListView.swift:644-650); the session name carrieslineLimit(1), so the added glyph won't break truncation behavior. - Accessibility covered. Both
.help(...)(tooltip) and.accessibilityLabel(...)(VoiceOver) are present. - Manager scope correctly excluded.
ManagerSessionRowis a separate view and the watcher never setsautoMergeEnabledAtfor managers, so omitting the icon there is consistent.
Summary Table
| Color | Meaning | Verdict effect |
|---|---|---|
| Red | Must fix | Request changes |
| Yellow | Should fix | Request changes |
| Green | Consider | Approve allowed |
Recommendation: Approve — driven by [0 Red, 0 Yellow, 0 Green] findings. Minimal, well-scoped, and all referenced symbols/claims verified against the codebase.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes #504
Summary
Adds a small, muted
arrow.triangle.mergeSF Symbol to each session card in the left pane when the session has had GitHub native auto-merge enabled on its PR. Lets users tell at a glance which sessions are on the auto-merge track without opening each one — useful especially under the multi-workspace flow.Source of truth
Reads
Session.autoMergeEnabledAt: Date?directly — the same persisted flag the existingIssueTrackerauto-merge watcher writes viaattemptEnableAutoMerge(and the same flag its one-shot guard reads). No new state, no new wiring. BecauseAppStateis@Observable, the icon appears/disappears reactively when the watcher mutates that field.Design choices
arrow.triangle.merge— already used in this codebase atSessionListView.swift:342for the "Add label crow:merge to PR" context-menu action, so the vocabulary is consistent..foregroundStyle(CorveilTheme.textSecondary)— informational, not a status alert (per ticket request for muted tone)..font(.caption)— matches the existing inReview/completed status icons.Spacer()and the existing status indicator, so it sits in the upper-right corner of the card without disturbing the session name or other affordances..help("Auto-merge enabled")on hover..accessibilityLabel("Auto-merge enabled")for VoiceOver.SessionRowonly.ManagerSessionRowis intentionally excluded — the watcher explicitly skips managers (IssueTracker.swift:1662).Test plan
swift build --arch arm64— cleanswift test --arch arm64— 211 tests pass, including the existingIssueTrackerAutoMergeTestscoveringautoMergeEnabledAtautoMergeEnabledAtset shows the icon; one without doesn'tautoMergeEnabledAt→ icon disappears without restart (reactive via@Observable)Out of scope (per ticket)
🤖 Generated with Claude Code