Cache backend tags so offline pill filtering stays accurate
Some checks failed
CI / Build · macos-14 · Debug (push) Has been cancelled
CI / Build · macos-15 · Debug (push) Has been cancelled
CI / Build · macos-14 · Release (push) Has been cancelled
CI / Build · macos-15 · Release (push) Has been cancelled

Add tags[] to CachedStory (defaulted for lightweight migration) and persist
them on upsert; offline StorySummary now carries the cached tags instead of
falling back to topic. Backend stays the source of truth.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Robin Kutesa
2026-06-20 14:14:45 +03:00
parent 7283fd63ed
commit 70ca5a0d3a
2 changed files with 6 additions and 1 deletions

View File

@@ -170,6 +170,9 @@ final class CachedStory {
var headline: String var headline: String
var summary: String var summary: String
var topic: String var topic: String
/// Canonical backend tags, so offline pill filtering stays accurate.
/// Defaulted for lightweight migration of existing cached rows.
var tags: [String] = []
var signalScore: Int var signalScore: Int
var sourceCount: Int var sourceCount: Int
var consensus: String? var consensus: String?
@@ -182,6 +185,7 @@ final class CachedStory {
self.headline = summary.headline self.headline = summary.headline
self.summary = summary.summary self.summary = summary.summary
self.topic = summary.topic self.topic = summary.topic
self.tags = summary.tags ?? []
self.signalScore = summary.signalScore self.signalScore = summary.signalScore
self.sourceCount = summary.sourceCount self.sourceCount = summary.sourceCount
self.consensus = summary.consensus self.consensus = summary.consensus

View File

@@ -466,6 +466,7 @@ struct SignalFeedView: View {
if let found = existing?.first { if let found = existing?.first {
found.signalScore = summary.signalScore found.signalScore = summary.signalScore
found.sourceCount = summary.sourceCount found.sourceCount = summary.sourceCount
found.tags = summary.tags ?? []
found.updatedAt = summary.updatedAt found.updatedAt = summary.updatedAt
} else { } else {
modelContext.insert(CachedStory(from: summary)) modelContext.insert(CachedStory(from: summary))
@@ -483,7 +484,7 @@ extension StorySummary {
headline: cached.headline, headline: cached.headline,
summary: cached.summary, summary: cached.summary,
topic: cached.topic, topic: cached.topic,
tags: nil, tags: cached.tags,
signalScore: cached.signalScore, signalScore: cached.signalScore,
scoreBreakdown: ScoreBreakdown(sourceAuthority: 0, freshness: 0, localRelevance: 0, scoreBreakdown: ScoreBreakdown(sourceAuthority: 0, freshness: 0, localRelevance: 0,
crossSourceConfirmation: 0, topicImportance: 0), crossSourceConfirmation: 0, topicImportance: 0),