{
	"ai_global_instructions": {
		"save_strategy": "full_object",
		"save_warning": "saveObject replaces the entire document. Sparse field-only payloads wipe omitted fields (name, status, members, etc.). Never patch with a subset.",
		"save_steps": [
			"Retrieve latest object with getObject or understandObject",
			"Merge updates in memory (keep all existing fields)",
			"Ensure all required fields are included",
			"Do not set joeUpdated (server sets it)",
			"Save the FULL object with saveObject"
		],
		"deep_links": {
			"hash_pattern": "#/{itemtype}/{_id}",
			"url_pattern": "{origin}{appBase}/#/{itemtype}/{_id}",
			"notes": [
				"Hash route is always #/{itemtype}/{_id} (example: #/task/a6bc0770-2ea8-436a-91cb-6337dde3a713).",
				"appBase is instance-specific. Many Haddens-style deploys use /JOE (example: http://localhost:8099/JOE/#/task/...). Do not assume site root /.",
				"Prefer the path from the user's working URL or PWA manifest start_url when unsure.",
				"Prod and local share the same hash shape; only origin (and sometimes appBase) differ."
			]
		},
		"timestamps": {
			"update_field": "joeUpdated",
			"format": "ISO8601_with_milliseconds"
		},
		"search_behavior": {
			"default_source": "cache",
			"when_to_use_storage": "after saves or when authoritative",
			"fallback_strategy": "list_and_filter_locally"
		},
		"hydration": {
			"required": true,
			"datasets": [
				"status",
				"tag",
				"dataset",
				"user"
			]
		},
		"protection_handling": {
			"_protected": "restrict access to assigned members or admins"
		}
	}
}
