[2Ksparkyfitness-db  | 	  (exercise_entry_id IS NOT NULL AND EXISTS (SELECT 1 FROM public.exercise_entries ee WHERE ee.id = exercise_entry_id AND has_diary_access(ee.user_id))) OR
[2Ksparkyfitness-db  | 	  (exercise_preset_entry_id IS NOT NULL AND EXISTS (SELECT 1 FROM public.exercise_preset_entries epe WHERE epe.id = exercise_preset_entry_id AND has_diary_access(epe.user_id)))
[2Ksparkyfitness-db  | 	);
[2Ksparkyfitness-db  | 	
[2Ksparkyfitness-db  | 	-- Shared View-Only (Tier 2)
[2Ksparkyfitness-db  | 	SELECT create_checkin_policy('fasting_logs');
[2Ksparkyfitness-db  | 	SELECT create_diary_policy('user_meal_visibilities');
[2Ksparkyfitness-db  | 	SELECT create_checkin_policy('sleep_need_calculations');
[2Ksparkyfitness-db  | 	SELECT create_checkin_policy('daily_sleep_need');
[2Ksparkyfitness-db  | 	-- Day classification is a sleep/wellness (check-in) feature, used only by the
[2Ksparkyfitness-db  | 	-- sleep-science service. It must use the check-in policy so check-in delegates
[2Ksparkyfitness-db  | 	-- can manage it; the previous diary policy was a misclassification.
[2Ksparkyfitness-db  | 	SELECT create_checkin_policy('day_classification_cache');
[2Ksparkyfitness-db  | 	-- Onboarding data/status: delegates can read (to avoid repeated onboarding prompts when viewing
[2Ksparkyfitness-db  | 	-- another user's diary) but only the account owner can submit or reset their own onboarding.
[2Ksparkyfitness-db  | 	CREATE POLICY select_policy ON public.onboarding_data FOR SELECT TO PUBLIC USING (has_profile_read_access(user_id));
[2Ksparkyfitness-db  | 	CREATE POLICY modify_policy ON public.onboarding_data FOR ALL TO PUBLIC
[2Ksparkyfitness-db  | 	USING (authenticated_user_id() = user_id)
[2Ksparkyfitness-db  | 	WITH CHECK (authenticated_user_id() = user_id);
[2Ksparkyfitness-db  | 	
[2Ksparkyfitness-db  | 	CREATE POLICY select_policy ON public.onboarding_status FOR SELECT TO PUBLIC USING (has_profile_read_access(user_id));
[2Ksparkyfitness-db  | 	CREATE POLICY modify_policy ON public.onboarding_status FOR ALL TO PUBLIC
[2Ksparkyfitness-db  | 	USING (authenticated_user_id() = user_id)
[2Ksparkyfitness-db  | 	WITH CHECK (authenticated_user_id() = user_id);
[2Ksparkyfitness-db  | 	
[2Ksparkyfitness-db  | 	-- Medications & Symptoms (Tier 3 - Delegate Writable with medications permission)
[2Ksparkyfitness-db  | 	SELECT create_medication_policy('medications');
[2Ksparkyfitness-db  | 	SELECT create_medication_policy('medication_schedules');
[2Ksparkyfitness-db  | 	SELECT create_medication_policy('medication_entries');
[2Ksparkyfitness-db  | 	SELECT create_medication_policy('medication_pens');
[2Ksparkyfitness-db  | 	SELECT create_medication_policy('injection_entries');
[2Ksparkyfitness-db  | 	SELECT create_medication_policy('medication_titration_steps');
[2Ksparkyfitness-db  | 	SELECT create_medication_policy('user_custom_symptoms');
[2Ksparkyfitness-db  | 	SELECT create_medication_policy('symptom_entries');
[2Ksparkyfitness-db  | 	SELECT create_medication_policy('user_custom_symptom_locations');
[2Ksparkyfitness-db  | 	
[2Ksparkyfitness-db  | 	-- Medications Display Preferences (Tier 2 - Owner-Only Write, Delegate Read)
[2Ksparkyfitness-db  | 	CREATE POLICY select_policy ON public.user_medication_display_preferences FOR SELECT TO PUBLIC USING (has_medication_read_access(user_id));
[2Ksparkyfitness-db  | 	CREATE POLICY modify_policy ON public.user_medication_display_preferences FOR ALL TO PUBLIC USING (authenticated_user_id() = user_id) WITH CHECK (authenticated_user_id() = user_id);
[2Ksparkyfitness-db  | 	
[2Ksparkyfitness-server  |   code: '42P01',
[2Ksparkyfitness-server  |   detail: undefined,
[2Ksparkyfitness-server  |   hint: undefined,
[2Ksparkyfitness-server  |   position: undefined,
[2Ksparkyfitness-server  |   internalPosition: undefined,
[2Ksparkyfitness-server  |   internalQuery: undefined,
[2Ksparkyfitness-server  |   where: 'SQL statement "ALTER TABLE public.user_custom_symptom_locations ENABLE ROW LEVEL SECURITY;"\n' +
[2Ksparkyfitness-server  |     'PL/pgSQL function inline_code_block line 86 at EXECUTE',
[2Ksparkyfitness-server  |   schema: undefined,
[2Ksparkyfitness-server  |   table: undefined,
[2Ksparkyfitness-server  |   column: undefined,
[2Ksparkyfitness-server  |   dataType: undefined,
[2Ksparkyfitness-server  |   constraint: undefined,
[2Ksparkyfitness-server  |   file: 'namespace.c',
[2Ksparkyfitness-server  |   line: '631',
[2Ksparkyfitness-server  |   routine: 'RangeVarGetRelidExtended'
[2Ksparkyfitness-server  | }
[2Ksparkyfitness-server  | Failed to start server: error: relation "public.user_custom_symptom_locations" does not exist
[2Ksparkyfitness-server  |     at /app/SparkyFitnessServer/node_modules/.pnpm/pg@8.20.0/node_modules/pg/lib/client.js:631:17
[2Ksparkyfitness-server  |     at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
[2Ksparkyfitness-server  |     at async applyRlsPolicies (/app/SparkyFitnessServer/utils/applyRlsPolicies.ts:15:5) {
[2Ksparkyfitness-server  |   length: 282,
[2Ksparkyfitness-server  |   severity: 'ERROR',
[2Ksparkyfitness-server  |   code: '42P01',
[2Ksparkyfitness-server  |   detail: undefined,
[2Ksparkyfitness-server  |   hint: undefined,
[2Ksparkyfitness-server  |   position: undefined,
[2Ksparkyfitness-server  |   internalPosition: undefined,
[2Ksparkyfitness-server  |   internalQuery: undefined,
[2Ksparkyfitness-server  |   where: 'SQL statement "ALTER TABLE public.user_custom_symptom_locations ENABLE ROW LEVEL SECURITY;"\n' +
[2Ksparkyfitness-server  |     'PL/pgSQL function inline_code_block line 86 at EXECUTE',
[2Ksparkyfitness-server  |   schema: undefined,
[2Ksparkyfitness-server  |   table: undefined,
[2Ksparkyfitness-server  |   column: undefined,
[2Ksparkyfitness-server  |   dataType: undefined,
[2Ksparkyfitness-server  |   constraint: undefined,
[2Ksparkyfitness-server  |   file: 'namespace.c',
[2Ksparkyfitness-server  |   line: '631',
[2Ksparkyfitness-server  |   routine: 'RangeVarGetRelidExtended'
[2Ksparkyfitness-server  | }