| name: | Layer refactor | |||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| overview: | Refactor cron layers into shared, configurable primitives so each layer composes selection, gating (updated-since / stalest), and Beeminder dispatch without duplicating logic. | |||||||||||||||||||||
| todos: |
|
collectUpdatedIssues(...) (shared fetch + last-run handling)filterByLabels(...) (subset selection for tagged rules)gateByStalestPrefix(...) (oldest/stalest gating using snapshot table + temporal ordering)sendBeeminderDatapoints(...) (daily de-dupe + comment + dispatch)backend/layers/pipeline.ts for shared flow pieces.backend/database/lastRunState.ts to support multiple jobs and optional “last snapshot timestamp” for stalest gating.backend/database/stalestSnapshot.ts as a generic “prefix snapshot” keyed by jobId to support stalest gating for multiple layers.main.cron.tsx uses collectUpdatedIssues + sendBeeminderDatapoints.only-oldest-issues.cron.tsx uses collectUpdatedIssues + gateByStalestPrefix + sendBeeminderDatapoints.third-layer.cron.tsx uses collectUpdatedIssues + filterByLabels + optional gateByStalestPrefix (for “only-oldest” on subset) + sendBeeminderDatapoints.Rendering mermaid diagram...
jobId so multiple layers can persist their own “stalest prefix”.issue.updated_at: process the stalest prefix in order and only emit a contiguous run of updated issues (if the first stale item is unchanged, stop)._1 suffix) where needed.