Files
ten31-database/start9/0.4/startos/versions/v0.1.0.92.ts
T
Keysat f181525926 Add reminders & follow-ups (W1) (v0.1.0:92)
First-class reminders tied to the fundraising grid — foundation of the agreed
reminders -> NL-search -> bot-mutations plan (keep LP data off third-party LLMs).

- reminders table (migration 0006; logical FK to fundraising_investors.id +
  denormalized name), CRUD at /api/reminders (soft-delete; open/done/snoozed/
  cancelled; assignee; source; source_row_id resolution)
- read-only derived reminder_status grid column (overdue/due_soon/open),
  filterable; orphan reconciler cancels reminders when an investor leaves the grid
- Reminders page, Dashboard "Reminders Due" card, daily-digest reminders section
- per-investor last_activity_at recency rollup (shared block for the W2 NL query)
- tests: test_reminders.py + digest reminders test (31/31 green, render-smoke green)
2026-06-18 14:45:46 -05:00

23 lines
1.2 KiB
TypeScript

import { VersionInfo } from '@start9labs/start-sdk'
// Reminders & follow-ups (W1). First-class tickler tied to the fundraising grid: a new
// `reminders` table (in-app migration 0006; logical FK to fundraising_investors.id +
// denormalized name, like the pipeline link), full CRUD at /api/reminders (soft-delete;
// status open/done/snoozed/cancelled; assignee; source human/bot/automation), a read-only
// derived `reminder_status` grid column (overdue/due_soon/open — injected like pipeline_stage,
// filterable so a saved view can drive the follow-up view off real reminders), an orphan
// reconciler (cancels reminders when their investor leaves the grid), a Reminders page, a
// Dashboard "Reminders Due" card, and a "Reminders due" daily-digest section. Pure local CRM
// data — no LLM path. up/down are no-ops; the real SQLite migration runs in-app at startup.
export const v_0_1_0_92 = VersionInfo.of({
version: '0.1.0:92',
releaseNotes: {
en_US: [
'Reminders & follow-ups: set a due-dated reminder on any investor from the grid,',
'track them on the new Reminders page + Dashboard card, and get an overdue/due-today',
'section in the daily digest.',
].join(' '),
},
migrations: { up: async () => {}, down: async () => {} },
})