feat(memories): match desktop category filter to mobile + add Workflow category#7582
Conversation
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…labels Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…al/About You/Insights/Workflow) Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Greptile SummaryThis PR aligns the desktop Memories filter with mobile by replacing the ad-hoc tag/category hybrid with pure backend
Confidence Score: 3/5Safe to merge on desktop and backend; mobile has a data-visibility gap for existing users whose filter was ever saved. The category addition is mechanically clean and consistent across all three platforms. The concern is in app/lib/providers/memories_provider.dart — the Important Files Changed
Flowchart%%{init: {'theme': 'neutral'}}%%
flowchart TD
A[Backend: MemoryCategory enum\n+ workflow added\n+ CATEGORY_BOOSTS updated\n+ validator allowlist updated] --> B[API Response\ncategory: 'workflow']
B --> C[Mobile: Dart _parseMemoryCategory\n'workflow' to MemoryCategory.workflow]
B --> D[Desktop: Swift MemoryCategory\nCodable decodes 'workflow']
C --> E[CategoryChip widget\nTeal color, account_tree icon\nWorkflow label hardcoded]
C --> F[MemoriesProvider._loadFilter\nfresh install: all 4 categories\nexisting saved filter: workflow absent]
D --> G[MemoryTag.workflow\nrawValue used for SQLite query]
D --> H[MemoriesPage categoryIcon/Color\ndelegates to MemoryCategory.icon]
|
| case MemoryCategory.workflow: | ||
| displayName = "Workflow"; | ||
| break; |
There was a problem hiding this comment.
Hardcoded user-facing strings without l10n
"Workflow" (and the other display names "About You", "Insights", "Manual") are hardcoded strings rather than localisation keys. The project's flutter-localization rule requires all user-facing strings to go through l10n. The PR description flags a dedicated mobile filter-sheet l10n key as a fast-follow, but the chip label itself also needs a key before these strings appear in the 49 non-English locales.
Context Used: Flutter localization - all user-facing strings mus... (source)
Note: If this suggestion doesn't match your team's coding style, reply to this and let me know. I'll remember it for next time!
Re-pulls all backend memories (fixing stale categories after the server-side category cleanup) and soft-deletes local synced rows the backend no longer has, so Manual reflects only what the user actually created. Runs once per user and guards against pruning on a failed/empty pull. Adds MemoryStorage.softDeleteSyncedOrphans. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Problem
The macOS desktop Memories filter showed a different, messier set of categories than mobile — Manual, System, Focus, Interesting, Focused, Distracted, Productivity — built from a mix of the real backend
categoryfield and ad-hoctags(focus/focused/distracted/tips/productivity/…). Mobile only has the three real categories. The "Manual" filter also surfaced auto-extracted memories that the user never created.Changes
Desktop now mirrors mobile — filtering is driven purely by the backend
categoryfield, no tag-derived pseudo-categories:MemoryTagreduced to the real categories with mobile's exact labels: Manual, About You (system), Insights (interesting), and the new Workflow.categoryonly (matches mobile semantics — About You shows allsystem, etc.).New
Workflowcategory (for how the user/AI agents work — AI-agent instructions, etc.), wired end-to-end:workflowadded as a primaryMemoryCategory(boosts + validator).MemoryCategory.workflow+ filter.Notes / follow-ups
Verification
xcrun swift build -c debug— clean.dart analyzeon touched files — no errors.CATEGORY_BOOSTSlookup guarded and updated.🤖 Generated with Claude Code