package placement import "time" const ( MaxPostAgeDays = 30 IdealMaxPostAgeDays = 7 WebSearchMaxAgeDays = 14 // MinRecencyCandidatesPerTag triggers wider recency windows when a keyword finds fewer posts. MinRecencyCandidatesPerTag = 1 // MaxRecencyCascadeQueries caps extra Search API calls per patrol run. MaxRecencyCascadeQueries = 10 ) // RecencyCascadeDays is the patrol recency ladder: nearest window first, then shift older. func RecencyCascadeDays() []int { return []int{IdealMaxPostAgeDays, WebSearchMaxAgeDays, MaxPostAgeDays} } func FormatAfterDate(maxAgeDays int, now time.Time) string { if now.IsZero() { now = time.Now() } date := now.AddDate(0, 0, -maxAgeDays).UTC() return date.Format("2006-01-02") } func FormatPublishedAfterISO(maxAgeDays int, now time.Time) string { if now.IsZero() { now = time.Now() } date := now.AddDate(0, 0, -maxAgeDays).UTC() return date.Format("2006-01-02T15:04:05.000Z") }