feat: iOS EventKit calendar payload — tags, location, status (Slice 3 of calendar sync payload) #244
No reviewers
Labels
No labels
agent:hermes
bug
chore
dependency
feature
status:blocked
status:in-progress
status:needs-info
status:needs-review
status:ready
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
owlburtoe/Shiftd!244
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "feat/calendar-sync-slice-3-ios-payload"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Slice 3 of the Calendar Sync Payload enrichment (spec: docs/superpowers/specs/2026-05-28-calendar-sync-payload-design.md, Section D). Builds on merged Slices 1 (#225, facility address) and 2 (#242, assignment tags). iOS-only; no backend/openapi contract change.
Changes
CalendarSyncPayloadgainstags,location, andassignmentStatus(a calendar-seamCalendarAssignmentStatusenum mapped from the generated type — generated types stay out of the struct/formatters).CalendarTitleFormatter.swift): pureCalendarTitleFormatter.format(base:tags:)(first 3 tags +, +Noverflow) andCalendarNotesFormatter.format(scheduleName:tags:)(full uncapped tag list). Parity-locked by a shared JSON fixture (docs/specs/fixtures/calendar-renderer-fixtures.json) that the Slice 4A Node ICS renderer will also load.makeEvent; setsLOCATION, busy/tentative availability by status, and branches all-day (null start/end → single all-day day, no alarm) vs timed (30-min alarm, overnight roll preserved). All-day uses a same-day endDate — EventKit treats all-day end as inclusive, so the spec's ICS-flavored next-day end would render a bogus 2-day block.CalendarSyncStorefetches the dept facility once per session (cached by deptSlug, invalidated on actor change / logout, best-effort so a facility hiccup never blocks shift sync), mapsformattedAddress→ location andtags→ tags.facility(in:)decodesGET /api/d/{deptSlug}/facilityinto a flatDepartmentFacilityDTO (the spec op is unnamed andFacilityWithAddressis an allOf schema the generator nests).Test plan
Incidental
Second commit repairs two pre-existing iOS test literals that failed to compile once ShiftdKit regenerated:
StaffUpcomingAssignmentnow requirestags[](Slice 2) andSchedulerequirescoverageBasis. iOS test drift, unrelated to this feature, surfaced because there is no iOS CI.