The file /Users/neog/Apps/iOS/PROD-Planner2026/Planner2026-iOS/Models/Project.swift has been updated. Here's the result of running `cat -n` on a snippet of the edited file: 60→ var taskCount: Int { 61→ taskIds.count 62→ } 63→ 64→ var isOverdue: Bool { 65→ guard let deadline = deadline, status != .completed else { return false } 66→ return deadline < Date() 67→ } 68→} 69→ 70→// MARK: - Codable 71→ 72→extension Project: Codable { 73→ init(from decoder: Decoder) throws { 74→ let container = try decoder.container(keyedBy: CodingKeys.self) 75→ id = try container.decode(UUID.self, forKey: .id) 76→ name = try container.decode(String.self, forKey: .name) 77→ projectDescription = try container.decodeIfPresent(String.self, forKey: .projectDescription) ?? "" 78→ status = try container.decodeIfPresent(ProjectStatus.self, forKey: .status) ?? .active 79→ deadline = try container.decodeIfPresent(Date.self, forKey: .deadline) 80→ colorHex = try container.decodeIfPresent(String.self, forKey: .colorHex) ?? "#007AFF" 81→ icon = try container.decodeIfPresent(String.self, forKey: .icon) ?? "folder.fill" 82→ taskIds = try container.decodeIfPresent([UUID].self, forKey: .taskIds) ?? [] 83→ tags = try container.decodeIfPresent([UUID].self, forKey: .tags) ?? [] 84→ defaultLocationId = try container.decodeIfPresent(UUID.self, forKey: .defaultLocationId) 85→ isAISuggested = try container.decodeIfPresent(Bool.self, forKey: .isAISuggested) ?? false 86→ createdAt = try container.decodeIfPresent(Date.self, forKey: .createdAt) ?? Date() 87→ completedAt = try container.decodeIfPresent(Date.self, forKey: .completedAt) 88→ modifiedAt = try container.decodeIfPresent(Date.self, forKey: .modifiedAt) ?? Date() 89→ 90→ if let recordName = try container.decodeIfPresent(String.self, forKey: .cloudKitRecordName) { 91→ cloudKitRecordID = CKRecord.ID(recordName: recordName) 92→ } 93→ } 94→ 95→ func encode(to encoder: Encoder) throws { 96→ var container = encoder.container(keyedBy: CodingKeys.self) 97→ try container.encode(id, forKey: .id) 98→ try container.encode(name, forKey: .name) 99→ try container.encode(projectDescription, forKey: .projectDescription) 100→ try container.encode(status, forKey: .status) 101→ try container.encodeIfPresent(deadline, forKey: .deadline) 102→ try container.encode(colorHex, forKey: .colorHex) 103→ try container.encode(icon, forKey: .icon) 104→ try container.encode(taskIds, forKey: .taskIds) 105→ try container.encode(tags, forKey: .tags) 106→ try container.encodeIfPresent(defaultLocationId, forKey: .defaultLocationId) 107→ try container.encode(isAISuggested, forKey: .isAISuggested) 108→ try container.encode(createdAt, forKey: .createdAt) 109→ try container.encodeIfPresent(completedAt, forKey: .completedAt) 110→ try container.encode(modifiedAt, forKey: .modifiedAt) 111→ try container.encodeIfPresent(cloudKitRecordID?.recordName, forKey: .cloudKitRecordName) 112→ } 113→} 114→ 115→// MARK: - CloudKit Integration 116→ 117→extension Project: CloudKitConvertible { 118→ static var recordType: String { "Project" } 119→ 120→ func toCKRecord() -> CKRecord { 121→ let record = createRecord() 122→ 123→ record.set(uuid: id, forKey: "id") 124→ record["name"] = name 125→ record["projectDescription"] = projectDescription 126→ record["status"] = status.rawValue 127→ record["deadline"] = deadline 128→ record["colorHex"] = colorHex 129→ record["icon"] = icon 130→ record.set(uuid: defaultLocationId, forKey: "defaultLocationId") 131→ record.set(bool: isAISuggested, forKey: "isAISuggested") 132→ record["createdAt"] = createdAt 133→ record["completedAt"] = completedAt 134→ record["modifiedAt"] = Date() 135→ 136→ // Arrays as JSON 137→ record.encode(taskIds, forKey: "taskIds") 138→ record.encode(tags, forKey: "tags") 139→ 140→ return record 141→ } 142→ 143→ static func from(record: CKRecord) -> Project? { 144→ guard let id = record.uuid(forKey: "id"), 145→ let name = record.string(forKey: "name") else { 146→ return nil 147→ } 148→ 149→ var project = Project(name: name) 150→ project.id = id 151→ project.cloudKitRecordID = record.recordID 152→ project.projectDescription = record.string(forKey: "projectDescription") ?? "" 153→ 154→ if let statusStr = record.string(forKey: "status"), 155→ let status = ProjectStatus(rawValue: statusStr) { 156→ project.status = status 157→ } 158→ 159→ project.deadline = record.date(forKey: "deadline") 160→ project.colorHex = record.string(forKey: "colorHex") ?? "#007AFF" 161→ project.icon = record.string(forKey: "icon") ?? "folder.fill" 162→ project.defaultLocationId = record.uuid(forKey: "defaultLocationId") 163→ project.isAISuggested = record.bool(forKey: "isAISuggested") 164→ project.createdAt = record.date(forKey: "createdAt") ?? Date() 165→ project.completedAt = record.date(forKey: "completedAt") 166→ project.modifiedAt = record.date(forKey: "modifiedAt") ?? Date() 167→ 168→ project.taskIds = record.decode([UUID].self, forKey: "taskIds") ?? [] 169→ project.tags = record.decode([UUID].self, forKey: "tags") ?? [] 170→ 171→ return project 172→ } 173→} 174→ 175→// MARK: - Preview Support 176→ 177→#if DEBUG 178→extension Project { 179→ static var preview: Project {