fix(ai): pass the sonnet alias to Claude CLI, not claude-sonnet#327
Open
M3NT1 wants to merge 3 commits into
Open
fix(ai): pass the sonnet alias to Claude CLI, not claude-sonnet#327M3NT1 wants to merge 3 commits into
M3NT1 wants to merge 3 commits into
Conversation
The toast that warns the user about missing screen-recording access was gated on 'getSavedPreference() == true || appState.isRecording', but the recorder forces isRecording off the moment it detects the permission is missing, and getSavedPreference() is nil for users who have never explicitly toggled it. Net effect: the notice never surfaced for the exact case it was meant to alert on, and the user had no UI signal that recording was broken (the Resume button appeared to do nothing). Switch the guard to the 'didOnboard' UserDefaults flag so the notice appears whenever the user has completed onboarding and the permission is missing. Also re-evaluate the notice on every tab change to .timeline so a user who lands on the timeline after dismissing elsewhere still sees it (the session-dismiss flag prevents spam).
Cards in the timeline now carry a small 'Provider · Model' badge so the user can see at a glance which model produced them. Older cards saved before this change render without the badge (no placeholder), because the new fields are optional in the JSON metadata column — no DB migration required. Three places show the badge: - Canvas timeline card (CanvasActivityCard) — a small text line below the time range - Right-side detail card (MainView/ActivityCard) — a chip next to the category badge with a sparkles icon - Review-mode swipe card (TimelineReviewCard) — a chip next to the category pill A new 'TimelineActivity.providerBadge' computed property centralises the provider-id → human-label mapping (e.g. 'gemini' → 'Gemini', 'chatgpt_claude' → 'Claude' or 'ChatGPT' based on the model name), and looks up the model alias through ClaudeModel / CodexModel enums so 'sonnet' displays as 'Claude Sonnet' rather than the raw alias. Storage: TimelineCard, TimelineCardShell, TimelineActivity, and the TimelineMetadata JSON envelope gained optional 'providerId' and 'modelId' fields. LLMService stamps these onto every card it writes, using 'activeContext.id.providerLabel' for the provider and a new 'providerModelId(for:)' helper for the model.
The Claude CLI's --model flag accepts aliases (sonnet, opus, fable) or full names (claude-fable-5), but rejects the bare 'claude-sonnet' with 'It may not exist or you may not have access to it' → exit 1. Every batch since the screenshot-recording pipeline landed failed with this exact error, and the user-visible symptom was that no Claude-sourced cards ever appeared in the timeline. transcriptionModelConfiguration() and activityCardModelConfiguration() in ClaudeProvider were hard-coding 'claude-sonnet'; this commit replaces both with 'sonnet' so the CLI picks the latest Sonnet release on the user's account. Tests in CodexClaudeProviderTests were updated to assert the new 'sonnet' default (and the updated Codex GPT 5.6-luna default, which is handled in a separate commit).
5 tasks
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.
Summary
The Claude CLI's
--modelflag accepts aliases (sonnet,opus,fable) or full names (claude-fable-5), but rejects the bareclaude-sonnetwith:→ exit 1. Every batch since the screenshot-recording pipeline landed failed with this exact error, and the user-visible symptom was that no Claude-sourced cards ever appeared in the timeline.
transcriptionModelConfiguration()andactivityCardModelConfiguration()inClaudeProviderwere hard-codingclaude-sonnet. This commit replaces both withsonnetso the CLI picks the latest Sonnet release on the user's account.The follow-up PR (#327) replaces this hard-coded value with the user's choice from a new Settings picker, but this PR is the minimal fix that gets the existing flow working.
Files changed
Dayflow/Core/AI/ClaudeProvider+Transcription.swift—claude-sonnet→sonnetDayflow/Core/AI/ClaudeProvider+ActivityCards.swift—claude-sonnet→sonnetDayflowTests/CodexClaudeProviderTests.swift— updated the two affected assertionsDepends on
feat/per-card-provider-badge(PR feat: surface provider and model on each generated card #326) so this PR includes the badge plumbing the test suite relies on.Test plan
xcodebuild build -configuration Debug— succeedsxcodebuild test -only-testing:DayflowTests— all unit tests passclaude -p --model sonnet --output-format json "OK"and confirm exit 0 withmodelUsage.claude-sonnet-5in the response.llm_callstable now logsmodel=sonnetwithstatus=success(previouslymodel=claude-sonnetwithstatus=failure).