| name | ios-worker |
| description | Implements and tests SwiftUI views, navigation flows, and shared iOS design-system work for ADE |
iOS Worker
NOTE: Startup and cleanup are handled by worker-base. This skill defines the WORK PROCEDURE.
When to Use This Skill
Use for features that are primarily iOS UI work inside apps/ios/ADE/, including:
- SwiftUI screen extraction and file splitting
- mobile information architecture changes inside existing tabs
- shared iOS design-system and Liquid Glass component work
- accessibility and motion-polish work
- iOS-side performance cleanup in view code
- iOS tests in
apps/ios/ADETests/
Do not use this skill for desktop sync-host, shared contract, SyncService, RemoteModels, or database features. Those belong to a sync/backend worker.
Work Procedure
1. Understand the Feature
Read the feature description, preconditions, expectedBehavior, and verificationSteps carefully. Then:
- Read
mission.md for overall mission context
- Read
AGENTS.md for boundaries and conventions
- Read
.factory/library/architecture.md for app architecture and patterns
- Read
.factory/library/tab-parity.md and .factory/library/performance.md when the feature touches parity or lag-sensitive flows
- Read the existing code files you'll be modifying in full
- If the feature touches a tab other than Lanes, still read the relevant Lanes benchmark components to match the established mobile quality bar
2. Plan the Changes
Before writing any code:
- List every file you'll create or modify
- Identify which existing code to preserve vs. rewrite
- Note which existing
syncService methods the views need to call
- Identify which shared components should be promoted into
Views/Components/ instead of duplicated inside a tab
- Check that your plan stays on the iOS/UI side of the boundary; if the feature needs
SyncService, RemoteModels, Database, or desktop host changes, stop and return to the orchestrator
3. Write Tests First (Red)
For any testable logic (filters, computed properties, data transformations, directory grouping):
- Add test cases to
ADETests.swift (the single test file)
- Tests should fail initially (red phase)
- Use
@testable import ADE and XCTest patterns matching existing tests
- Focus on logic tests, not UI rendering tests
4. Implement (Green)
Write the SwiftUI code:
- File organization: Each major screen or slice gets its own file under the relevant tab folder (
Views/Lanes/, Views/Files/, Views/Work/, Views/PRs/, Views/Settings/). Keep files under 500 lines; if a feature leaves a file bigger than that, split again before handing off.
- Design system: Use
ADEColor.*, ADEMotion.*, .adeGlassCard(), .adeInsetField(), .adeNavigationGlass(), .adeScreenBackground(), ADENoticeCard, ADEStatusPill, ADEEmptyStateView, ADESkeletonView, ADECardSkeleton, and shared glass helpers instead of ad-hoc styling.
- Liquid Glass: Prefer shared glass primitives and matched navigation transitions over one-off background/stroke recipes. When adding repeated chips or buttons, prefer reusable shared components instead of tab-local copies.
- Accessibility: Add
.accessibilityLabel to all interactive elements. Use ADEMotion which respects reduceMotion. Preserve .sensoryFeedback on appropriate interactions.
- Data access: Use
@EnvironmentObject var syncService: SyncService. Call existing SyncService methods — never add new ones.
- State management: Use
@State for local state. Prefer debounced .task(id: syncService.localStateRevision) patterns matching the Lanes benchmark when reloading cached projections.
- Performance: Use lazy containers for large lists, avoid heavy parsing/computation in
body, cache expensive derived values in state/view-model helpers, and preserve source-tab context on return navigation.
- Boundary: No changes to
SyncService.swift, RemoteModels.swift, Database.swift, desktop services, or shared sync contracts from this skill.
5. Update Xcode Project
When creating new Swift files, you MUST add them to the Xcode project:
- Edit
apps/ios/ADE.xcodeproj/project.pbxproj to add file references and build phase entries
- Follow the existing pattern in the pbxproj for file references (PBXFileReference, PBXBuildFile, PBXGroup children)
- Alternatively, if the project uses folder references, ensure files are in the correct directory
6. Verify
Run these commands and fix any issues:
DESTINATION="platform=iOS Simulator,name=iPhone 17 Pro,OS=26.3.1"
xcodebuild build -project apps/ios/ADE.xcodeproj -scheme ADE -destination "$DESTINATION" -quiet
xcodebuild test -project apps/ios/ADE.xcodeproj -scheme ADE -destination "$DESTINATION" -quiet
xcodebuild -project apps/ios/ADE.xcodeproj -scheme ADE -destination "$DESTINATION" -derivedDataPath /tmp/ade-build analyze
find apps/ios/ADE -name '*.swift' -exec wc -l {} + | sort -rn | head -20
All must pass for the touched surface. If build or tests fail, fix immediately. If a failure is clearly pre-existing and outside the feature boundary, return to the orchestrator with evidence instead of hand-waving past it.
7. Manual Verification
Do the strongest manual verification the feature allows:
- Trace the full data flow from
SyncService through the view hierarchy
- Verify
syncService method calls and model property names match the existing API exactly
- If the feature can be checked in the simulator without a live host, do so
- If the feature depends on live sync data, validate against the paired desktop host when that service is available in the mission
- Check that navigation back/return preserves the source context for mobile triage flows
- Ensure no unused imports, dead code, placeholder copy, or TODO markers remain
8. Commit
Commit with a clear message describing what was implemented.
Example Handoff
{
"salientSummary": "Split the Work tab into mobile-first subviews, added a reusable glass section/chip stack in Views/Components, and stabilized session list/detail navigation so filters and context survive round-trips. Build, tests, and analyzer passed on the mission simulator target.",
"whatWasImplemented": "Refactored WorkTabView.swift into focused files under Views/Work/, promoted reusable glass chips/section containers into Views/Components/, and updated the Work list/detail flows to preserve lane/search/filter context when opening sessions and returning. The new UI keeps chat/terminal sessions readable on iPhone, uses shared glass styling, and removes several hot-path computations from SwiftUI body evaluation.",
"whatWasLeftUndone": "",
"verification": {
"commandsRun": [
{
"command": "xcodebuild build -project apps/ios/ADE.xcodeproj -scheme ADE -destination 'platform=iOS Simulator,name=iPhone 17 Pro,OS=26.3.1' -quiet",
"exitCode": 0,
"observation": "Build succeeded with no errors or warnings"
},
{
"command": "xcodebuild test -project apps/ios/ADE.xcodeproj -scheme ADE -destination 'platform=iOS Simulator,name=iPhone 17 Pro,OS=26.3.1' -quiet",
"exitCode": 0,
"observation": "The iOS test suite passed on the mission destination"
},
{
"command": "xcodebuild -project apps/ios/ADE.xcodeproj -scheme ADE -destination 'platform=iOS Simulator,name=iPhone 17 Pro,OS=26.3.1' -derivedDataPath /tmp/ade-build analyze",
"exitCode": 0,
"observation": "Static analysis completed without blocking diagnostics"
},
{
"command": "find apps/ios/ADE -name '*.swift' -exec wc -l {} + | sort -rn | head -20",
"exitCode": 0,
"observation": "New and modified Swift files stayed within the file-size limit after extraction"
}
],
"interactiveChecks": [
{
"action": "Traced session list → session detail → back navigation on the refactored Work surface",
"observed": "The source lane/filter/search context remained intact after returning from detail"
},
{
"action": "Reviewed all promoted shared components and the new Work subviews against the existing SyncService API",
"observed": "All property and method accesses remained within the existing iOS/UI boundary and matched current signatures"
}
]
},
"tests": {
"added": []
},
"discoveredIssues": []
}
When to Return to Orchestrator
- The feature requires changes to
SyncService, RemoteModels, Database, desktop services, or shared sync contracts
- The existing API/data shape cannot support the feature without backend or contract work
- Xcode project state becomes corrupted or unrecoverable
- Build/test/analyzer failures are outside the touched iOS surface and cannot be repaired safely inside the feature boundary
- A file still exceeds 500 lines after a reasonable split attempt