feat: T4 wave 6 - reminders and morning digest, next steps UI, warnings and notifications UI

- In-app reminders: task due (skips rescheduled tasks, catch-up wording)
  and a per-user morning digest step in the daily job
- Frontend: "Als Nächstes" on the colony page, "Heute" on the dashboard,
  inspection-due card, season chip, apiary overview fields, cleanup
  sheet for ended colonies
- Frontend: plausibility warnings that stay until dismissed, withdrawal
  spans in the calendar, notification bell with categories and links,
  notification settings in the profile
- ARCHITECTURE.md: T4a sections 11.1-11.10, assumptions 31-41, handler
  table and daily job step order

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
This commit is contained in:
Nick SzaunigandClaude Opus 5.5 committed 2026-10-14 17:05:32 +02:00
1 parent ef33e5549b
commit 32c61c8e14
77 files changed
+5309 -142

No files matched your search

@@ -200,10 +200,16 @@ describe('Worker runtime (e2e)', () => {
where: { aggregateId: `${suffix}-0` },
include: { deliveries: true },
});
expect(event).toMatchObject({
status: 'DONE',
deliveries: [{ handler: 'test.worker-counter', status: 'DONE' }],
});
// TaskDue also has the real reminder handler (the task does not exist: a no-op).
expect(event.status).toBe('DONE');
expect(
event.deliveries.map(({ handler, status }) => ({ handler, status })),
).toEqual(
expect.arrayContaining([
{ handler: 'test.worker-counter', status: 'DONE' },
{ handler: 'notifications.task-due', status: 'DONE' },
]),
);
});
it('wakes the calendar outbox loop on a calendar_sync notification', async () => {