Root cause: Prisma schema uses 'assignedToId' but getTasks was passing 'assigneeId' directly to the where clause, causing PrismaClientValidationError
Added PlantTouchPoint and IPMSchedule models. Implemented touch-points and IPM controllers/routes. Updated frontend with Dashboard feed and IPM widgets.