1.5 KiB
1.5 KiB
Schedules Pivot Guardrails
Purpose
- Replace "recurring entries" with first-class "schedules".
- Keep entry creation separate from schedule templates.
- Preserve compatibility during migration.
Terminology
- Use
ScheduleandSchedulesin new UI and API surfaces. - Legacy
/api/recurring-entriesremains compatibility-only and is deprecated.
Data Model Rules
entriesare real posted records.schedulesare templates that can materialize future entries.entries.source_schedule_idlinks posted entries created by schedule execution.- Legacy recurring flags on
entriesare normalized to non-recurring in migration.
Compatibility Window
- Canonical routes:
GET/POST /api/schedulesPATCH/DELETE /api/schedules/[id]
- Compatibility routes (deprecated):
GET/POST /api/recurring-entriesPATCH/DELETE /api/recurring-entries/[id]
Frequency Contract
- Allowed frequencies:
DAILYWEEKLYMONTHLYYEARLY
- Legacy
BIWEEKLYandQUARTERLYvalues are mapped during migration:BIWEEKLY->WEEKLYwith interval doubledQUARTERLY->MONTHLYwith interval tripled
Scheduler Service
- Runs as separate workspace app:
apps/scheduler. - Uses UTC schedule evaluation.
- Uses
FOR UPDATE SKIP LOCKEDand unique index on(source_schedule_id, occurred_at)for idempotency. - Must not log secrets or sensitive payloads.
User Settings
- User-level page size stored in
user_settings.data.entryPanelPageSize. - Default is
10. - Applied to Entries and Schedules tab "Show more" increments.