@olegkoval/agent-skills 1.12.0 โ†’ 1.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (28) hide show
  1. package/.claude-plugin/plugin.json +5 -2
  2. package/.cursor-plugin/index.json +10 -0
  3. package/.kiro/steering/apple-store-submit.md +146 -0
  4. package/.kiro/steering/macos-menubar-app.md +226 -0
  5. package/.windsurf/rules/apple-store-submit.md +145 -0
  6. package/.windsurf/rules/macos-menubar-app.md +225 -0
  7. package/catalog/skills.json +66 -0
  8. package/package.json +1 -1
  9. package/packages/software-development/apple-store-submit/SKILL.md +157 -0
  10. package/packages/software-development/apple-store-submit/adapters/claude/plugin.json +5 -0
  11. package/packages/software-development/apple-store-submit/adapters/claude/skills/apple-store-submit/SKILL.md +158 -0
  12. package/packages/software-development/apple-store-submit/adapters/codex/README.md +3 -0
  13. package/packages/software-development/apple-store-submit/adapters/cursor/plugin.json +6 -0
  14. package/packages/software-development/apple-store-submit/adapters/cursor/skills/apple-store-submit/SKILL.md +158 -0
  15. package/packages/software-development/apple-store-submit/adapters/kiro/steering/apple-store-submit.md +145 -0
  16. package/packages/software-development/apple-store-submit/adapters/windsurf/rules/apple-store-submit.md +144 -0
  17. package/packages/software-development/macos-menubar-app/SKILL.md +237 -0
  18. package/packages/software-development/macos-menubar-app/adapters/claude/plugin.json +5 -0
  19. package/packages/software-development/macos-menubar-app/adapters/claude/skills/macos-menubar-app/SKILL.md +238 -0
  20. package/packages/software-development/macos-menubar-app/adapters/codex/README.md +3 -0
  21. package/packages/software-development/macos-menubar-app/adapters/cursor/plugin.json +6 -0
  22. package/packages/software-development/macos-menubar-app/adapters/cursor/skills/macos-menubar-app/SKILL.md +238 -0
  23. package/packages/software-development/macos-menubar-app/adapters/kiro/steering/macos-menubar-app.md +225 -0
  24. package/packages/software-development/macos-menubar-app/adapters/windsurf/rules/macos-menubar-app.md +224 -0
  25. package/packages/software-development/skill-budget-audit/SKILL.md +145 -0
  26. package/packages/software-development/skill-budget-audit/adapters/claude/plugin.json +5 -0
  27. package/packages/software-development/skill-budget-audit/adapters/claude/skills/skill-budget-audit/SKILL.md +146 -0
  28. package/scripts/build-adapters.sh +8 -6
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "olko-agent-skills",
3
3
  "description": "Agent-agnostic skill catalog for Codex, Claude, Cursor, and other skill-aware tools.",
4
- "version": "1.11.1",
4
+ "version": "1.12.0",
5
5
  "author": {
6
6
  "name": "Oleg Koval"
7
7
  },
@@ -24,6 +24,9 @@
24
24
  "./packages/marketing/search-console-indexing-audit",
25
25
  "./packages/software-development/cloudflare-block-countries",
26
26
  "./packages/software-development/obsidian-pr-sync",
27
- "./packages/software-development/obsidian-task-rollover"
27
+ "./packages/software-development/obsidian-task-rollover",
28
+ "./packages/software-development/apple-store-submit",
29
+ "./packages/software-development/macos-menubar-app",
30
+ "./packages/software-development/skill-budget-audit"
28
31
  ]
29
32
  }
@@ -80,6 +80,16 @@
80
80
  "name": "olko:obsidian-task-rollover",
81
81
  "source": "./packages/software-development/obsidian-task-rollover/adapters/cursor",
82
82
  "description": "Bullet-journal end-of-day task migration: copy unchecked tasks from today's Obsidian daily note to the next workday's note under '## Carried over', and mark them [>] in the source. Skips weekends, idempotent."
83
+ },
84
+ {
85
+ "name": "olko:apple-store-submit",
86
+ "source": "./packages/software-development/apple-store-submit/adapters/cursor",
87
+ "description": "Handle Apple App Store rejection emails end-to-end: parse rejection reasons, plan fixes, implement code changes, navigate App Store Connect, and resubmit."
88
+ },
89
+ {
90
+ "name": "olko:macos-menubar-app",
91
+ "source": "./packages/software-development/macos-menubar-app/adapters/cursor",
92
+ "description": "Build a production-quality macOS menubar or notch app in SwiftUI โ€” MenuBarExtra, sandbox entitlements, keyboard shortcuts, sound effects, accessibility permissions, and App Store preparation."
83
93
  }
84
94
  ]
85
95
  }
@@ -0,0 +1,146 @@
1
+ <!-- Generated by scripts/build-adapters.sh. Do not edit directly. -->
2
+
3
+ ---
4
+ inclusion: manual
5
+ description: "Handle Apple App Store rejection emails end-to-end: parse rejection reasons, plan fixes, implement code changes, navigate App Store Connect, and resubmit."
6
+ ---
7
+
8
+
9
+ > ๐Ÿค– *Auto-generated by **weekly-pattern-learner** ยท App Store rejection handling workflow observed in FocusNotch App Store session, Jun 2026 (92 user turns covering rejection โ†’ plan โ†’ code fixes โ†’ metadata โ†’ resubmit)*
10
+
11
+ # Apple App Store Submission & Rejection Handling
12
+
13
+ ## Overview
14
+
15
+ Parse Apple rejection feedback, implement targeted fixes, update App Store Connect metadata, and resubmit โ€” covering the complete cycle from rejection email to approved build.
16
+
17
+ ## When to Use
18
+
19
+ - Apple review team sends a rejection email
20
+ - App fails automated pre-review checks (binary rejected at upload)
21
+ - Preparing metadata for first-time submission (screenshots, keywords, privacy labels)
22
+ - Resolving App Store Connect errors before submitting for review
23
+
24
+ ## Workflow
25
+
26
+ ### 1. Parse the Rejection
27
+
28
+ Read the full rejection email. Extract and list:
29
+
30
+ - **Guideline numbers** violated (e.g., 2.1, 4.2.0, 5.1.1)
31
+ - **Code-level issues** โ€” missing entitlements, incorrect privacy strings, sandbox violations
32
+ - **Metadata issues** โ€” wrong screenshot sizes, subtitle policy, keyword stuffing
33
+ - **UX issues** โ€” crashes described by reviewer, broken flows, missing functionality
34
+
35
+ Create a numbered fix plan: one item per rejection point, with the type of fix needed.
36
+
37
+ ### 2. Classify Fixes by Type
38
+
39
+ | Type | Location |
40
+ |------|----------|
41
+ | Privacy usage strings missing | `Info.plist` |
42
+ | Entitlement missing/wrong | `<AppName>.entitlements` |
43
+ | Crash or broken feature | Source code |
44
+ | Screenshots wrong size/content | App Store Connect |
45
+ | Keywords/subtitle/description | App Store Connect |
46
+ | Build number conflict | Xcode + App Store Connect |
47
+
48
+ ### 3. Implement Code Fixes
49
+
50
+ **Privacy permission strings** (`Info.plist`):
51
+
52
+ ```xml
53
+ <key>NSMicrophoneUsageDescription</key>
54
+ <string>Used for voice input during focus sessions.</string>
55
+
56
+ <key>NSCalendarsUsageDescription</key>
57
+ <string>Used to sync tasks with your calendar.</string>
58
+ ```
59
+
60
+ **Entitlements** (`<AppName>.entitlements`):
61
+
62
+ ```xml
63
+ <key>com.apple.security.app-sandbox</key>
64
+ <true/>
65
+ <key>com.apple.security.network.client</key>
66
+ <true/>
67
+ <key>com.apple.security.files.user-selected.read-write</key>
68
+ <true/>
69
+ ```
70
+
71
+ **Sandbox violations** โ€” remove `NoEscapeBlock` patterns, replace deprecated APIs, use only sandboxed file access via Security-Scoped Bookmarks when needed.
72
+
73
+ ### 4. Build and Archive
74
+
75
+ ```bash
76
+ # Clean build
77
+ xcodebuild clean \
78
+ -scheme <AppName> \
79
+ -destination 'generic/platform=macOS'
80
+
81
+ # Archive
82
+ xcodebuild archive \
83
+ -scheme <AppName> \
84
+ -archivePath build/<AppName>.xcarchive \
85
+ -destination 'generic/platform=macOS'
86
+
87
+ # Export for App Store
88
+ xcodebuild -exportArchive \
89
+ -archivePath build/<AppName>.xcarchive \
90
+ -exportPath build/export \
91
+ -exportOptionsPlist ExportOptions.plist
92
+ ```
93
+
94
+ Validate codesigning before upload:
95
+
96
+ ```bash
97
+ codesign --verify --deep --strict --verbose=4 build/export/<AppName>.app
98
+ spctl --assess --verbose=4 build/export/<AppName>.app
99
+ ```
100
+
101
+ ### 5. Update App Store Connect Metadata
102
+
103
+ Navigate: **My Apps โ†’ [App] โ†’ App Store tab**
104
+
105
+ Common metadata fixes:
106
+
107
+ - **App name**: max 30 chars
108
+ - **Subtitle**: max 30 chars, no duplicate keywords from the title field
109
+ - **Keywords**: 100-char total limit, comma-separated, no spaces after commas
110
+ - **Screenshots**: exact pixel dimensions per device type (check Apple's current spec)
111
+ - **Privacy Nutrition Labels**: must accurately reflect data collected/linked to user
112
+ - **Build selection**: select the newly uploaded build before submitting
113
+
114
+ ### 6. Write Reviewer Notes
115
+
116
+ In the submission form, fill **Notes for Reviewer**:
117
+
118
+ - Explain each rejection point and what was changed
119
+ - Reference specific guideline numbers: "Addressing 2.1 โ€” added NSMicrophoneUsageDescription to Info.plist"
120
+ - If a feature requires special credentials to test, provide test account details
121
+
122
+ ### 7. Submit and Track
123
+
124
+ 1. Upload via **Xcode Organizer โ†’ Distribute App โ†’ App Store Connect**
125
+ 2. In App Store Connect: select the new build, fill notes, **Submit for Review**
126
+ 3. Typical re-review: 24โ€“48h
127
+ 4. If rejected again: respond in the **Resolution Center** thread (same case number)
128
+ 5. Escalate via Resolution Center for policy disagreements โ€” do not open a new submission
129
+
130
+ ## Build Number Protocol
131
+
132
+ Apple rejects builds with a duplicate build number. Increment `CFBundleVersion` in `Info.plist` or Xcode target settings before every upload:
133
+
134
+ ```bash
135
+ # Bump build number (e.g., 9 โ†’ 10)
136
+ xcrun agvtool new-version -all 10
137
+ ```
138
+
139
+ ## Verification
140
+
141
+ - [ ] Every rejection guideline number has a corresponding fix in the plan
142
+ - [ ] `xcodebuild archive` exits 0 with no warnings about entitlements
143
+ - [ ] `codesign --verify` passes
144
+ - [ ] App Store Connect shows build status as "Ready to Submit"
145
+ - [ ] Reviewer Notes reference each changed item
146
+ - [ ] Build number is higher than any previously uploaded build
@@ -0,0 +1,226 @@
1
+ <!-- Generated by scripts/build-adapters.sh. Do not edit directly. -->
2
+
3
+ ---
4
+ inclusion: manual
5
+ description: "Build a production-quality macOS menubar or notch app in SwiftUI โ€” MenuBarExtra, sandbox entitlements, keyboard shortcuts, sound effects, accessibility permissions, and App Store preparation."
6
+ ---
7
+
8
+
9
+ > ๐Ÿค– *Auto-generated by **weekly-pattern-learner** ยท SwiftUI macOS menubar app pattern observed in FocusNotch session, Jun 2026 (364 user turns, ~48 MB transcript covering idea โ†’ spec โ†’ impl โ†’ critique cycles โ†’ App Store)*
10
+
11
+ # macOS Menubar / Notch App (SwiftUI)
12
+
13
+ ## Overview
14
+
15
+ Build a macOS app that lives in the menu bar or notch using SwiftUI's `MenuBarExtra`. Covers the full lifecycle: project setup, window management, entitlements, user interaction (keyboard shortcuts, sound), and App Store preparation.
16
+
17
+ ## When to Use
18
+
19
+ - User asks to build an app for the macOS menubar, status bar, or notch
20
+ - Adding a menubar presence to an existing macOS app
21
+ - Debugging sandbox rejections or entitlement errors in a SwiftUI app
22
+
23
+ ## Workflow
24
+
25
+ ### 1. Project Setup
26
+
27
+ Create a new macOS App target in Xcode:
28
+
29
+ - **Interface**: SwiftUI
30
+ - **App Sandbox**: Enabled (required for App Store)
31
+ - **Bundle ID**: `com.yourname.AppName`
32
+ - **Deployment target**: macOS 13+ (for `MenuBarExtra`)
33
+
34
+ In `Info.plist`, set:
35
+
36
+ ```xml
37
+ <key>LSUIElement</key>
38
+ <true/>
39
+ ```
40
+
41
+ This hides the app from the Dock โ€” the menu bar becomes the only entry point.
42
+
43
+ ### 2. MenuBarExtra (SwiftUI native)
44
+
45
+ ```swift
46
+ @main
47
+ struct FocusApp: App {
48
+ var body: some Scene {
49
+ MenuBarExtra {
50
+ ContentView()
51
+ .frame(width: 320, height: 480)
52
+ } label: {
53
+ Label("Focus", systemImage: "timer")
54
+ }
55
+ .menuBarExtraStyle(.window)
56
+ }
57
+ }
58
+ ```
59
+
60
+ Use `.menuBarExtraStyle(.window)` for a popover-style panel. Use `.menuBarExtraStyle(.menu)` for a dropdown menu.
61
+
62
+ ### 3. Notch Detection
63
+
64
+ On MacBooks with a notch, the safe area changes. Detect and adapt:
65
+
66
+ ```swift
67
+ func isNotchPresent() -> Bool {
68
+ guard let screen = NSScreen.main else { return false }
69
+ // The notch area is excluded from visibleFrame top
70
+ let screenHeight = screen.frame.height
71
+ let visibleTop = screen.visibleFrame.maxY
72
+ return visibleTop < screenHeight
73
+ }
74
+ ```
75
+
76
+ Position windows below the notch:
77
+
78
+ ```swift
79
+ window.setFrameOrigin(NSPoint(
80
+ x: window.frame.origin.x,
81
+ y: NSScreen.main!.frame.height - window.frame.height - notchOffset
82
+ ))
83
+ ```
84
+
85
+ ### 4. Sandbox Entitlements
86
+
87
+ Minimum `.entitlements` for a sandboxed menubar app:
88
+
89
+ ```xml
90
+ <?xml version="1.0" encoding="UTF-8"?>
91
+ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
92
+ <plist version="1.0">
93
+ <dict>
94
+ <key>com.apple.security.app-sandbox</key>
95
+ <true/>
96
+ <!-- Add only what the app actually uses: -->
97
+ <!-- <key>com.apple.security.network.client</key> -->
98
+ <!-- <true/> -->
99
+ </dict>
100
+ </plist>
101
+ ```
102
+
103
+ For focus/blocking features that need accessibility:
104
+
105
+ ```xml
106
+ <key>com.apple.security.temporary-exception.apple-events</key>
107
+ <array>
108
+ <string>com.apple.systemevents</string>
109
+ </array>
110
+ ```
111
+
112
+ ### 5. Accessibility Permission (Focus Detection)
113
+
114
+ To detect which app is in focus (required for distraction blocking):
115
+
116
+ ```swift
117
+ import ApplicationServices
118
+
119
+ func requestAccessibilityPermission() -> Bool {
120
+ let options: NSDictionary = [kAXTrustedCheckOptionPrompt.takeUnretainedValue() as String: true]
121
+ return AXIsProcessTrustedWithOptions(options)
122
+ }
123
+ ```
124
+
125
+ Call this on first launch and prompt the user to grant access in **System Settings โ†’ Privacy โ†’ Accessibility**.
126
+
127
+ ### 6. Sound Effects
128
+
129
+ ```swift
130
+ import AVFoundation
131
+
132
+ class SoundPlayer {
133
+ private var player: AVAudioPlayer?
134
+
135
+ func play(_ filename: String, extension ext: String = "mp3") {
136
+ guard let url = Bundle.main.url(forResource: filename, withExtension: ext) else { return }
137
+ player = try? AVAudioPlayer(contentsOf: url)
138
+ player?.play()
139
+ }
140
+ }
141
+ ```
142
+
143
+ Add sound files to the Xcode target (check **Target Membership** in file inspector).
144
+
145
+ For system sounds (no file needed):
146
+
147
+ ```swift
148
+ NSSound.beep()
149
+ // or
150
+ NSSound(named: .init("Hero"))?.play()
151
+ ```
152
+
153
+ ### 7. Keyboard Shortcuts
154
+
155
+ Global shortcuts (work when app is not focused) โ€” requires Accessibility permission:
156
+
157
+ ```swift
158
+ NSEvent.addGlobalMonitorForEvents(matching: .keyDown) { event in
159
+ if event.modifierFlags.contains([.command, .shift]) && event.keyCode == 36 { // โŒ˜โ‡งโ†ฉ
160
+ // Handle shortcut
161
+ }
162
+ }
163
+ ```
164
+
165
+ Local shortcuts (SwiftUI):
166
+
167
+ ```swift
168
+ .keyboardShortcut("s", modifiers: [.command, .shift])
169
+ ```
170
+
171
+ ### 8. Persistent State (AppStorage)
172
+
173
+ ```swift
174
+ @AppStorage("timerDuration") private var timerDuration: Double = 25 * 60
175
+ @AppStorage("soundEnabled") private var soundEnabled: Bool = true
176
+ ```
177
+
178
+ For complex state, use `UserDefaults` with a suite name to share across extensions.
179
+
180
+ ### 9. Polish Cycle
181
+
182
+ After each implementation slice:
183
+
184
+ > **Optional skills**: Steps 1 and 3 require `/critique` and `/whimsy-injector` from the agent-skills catalog. Install them via `skillshare` if not already available; skip these steps if not installed.
185
+
186
+ 1. Run `/critique` โ€” evaluate against Apple HIG, WCAG contrast, interaction consistency
187
+ 2. Fix all P0/P1 findings
188
+ 3. Run `/whimsy-injector` on completion screens and idle states
189
+ 4. Test on a machine **without** a notch to verify layout
190
+
191
+ ### 10. App Store Preparation
192
+
193
+ See `olko:apple-store-submit` for the full submission and rejection-handling workflow.
194
+
195
+ Pre-submission checklist:
196
+
197
+ ```bash
198
+ # Validate archive
199
+ xcodebuild archive -scheme <AppName> -archivePath build/<AppName>.xcarchive
200
+
201
+ # Check sandbox
202
+ codesign --verify --deep --strict build/<AppName>.xcarchive/Products/Applications/<AppName>.app
203
+
204
+ # Verify entitlements
205
+ codesign -d --entitlements :- build/<AppName>.xcarchive/Products/Applications/<AppName>.app
206
+ ```
207
+
208
+ ## Key Pitfalls
209
+
210
+ | Symptom | Cause | Fix |
211
+ |---------|-------|-----|
212
+ | App appears in Dock | `LSUIElement` missing | Add to `Info.plist` |
213
+ | Menubar icon missing after build | Asset catalog misconfigured | Use PDF or SVG template image, tick **Template Image** |
214
+ | Crash on click | View not loaded in popover window | Add `.frame()` to `MenuBarExtra` content |
215
+ | Sound not playing | File not in target | Check Target Membership in file inspector |
216
+ | Accessibility prompt not shown | Missing entitlement | Add `temporary-exception.apple-events` or use XPC |
217
+ | Notch overlap | Hardcoded y-position | Detect `visibleFrame` vs `frame` delta |
218
+
219
+ ## Verification
220
+
221
+ - [ ] App does not appear in Dock (`LSUIElement` = true)
222
+ - [ ] MenuBarExtra icon renders as template image (respects dark/light mode)
223
+ - [ ] Sound plays on timer events
224
+ - [ ] Keyboard shortcuts respond both globally and locally
225
+ - [ ] App passes `codesign --verify --deep --strict`
226
+ - [ ] Layout correct on M1 MacBook (no notch) and M3 MacBook Pro (notch)
@@ -0,0 +1,145 @@
1
+ <!-- Generated by scripts/build-adapters.sh. Do not edit directly. -->
2
+
3
+ ---
4
+ description: "Handle Apple App Store rejection emails end-to-end: parse rejection reasons, plan fixes, implement code changes, navigate App Store Connect, and resubmit."
5
+ ---
6
+
7
+
8
+ > ๐Ÿค– *Auto-generated by **weekly-pattern-learner** ยท App Store rejection handling workflow observed in FocusNotch App Store session, Jun 2026 (92 user turns covering rejection โ†’ plan โ†’ code fixes โ†’ metadata โ†’ resubmit)*
9
+
10
+ # Apple App Store Submission & Rejection Handling
11
+
12
+ ## Overview
13
+
14
+ Parse Apple rejection feedback, implement targeted fixes, update App Store Connect metadata, and resubmit โ€” covering the complete cycle from rejection email to approved build.
15
+
16
+ ## When to Use
17
+
18
+ - Apple review team sends a rejection email
19
+ - App fails automated pre-review checks (binary rejected at upload)
20
+ - Preparing metadata for first-time submission (screenshots, keywords, privacy labels)
21
+ - Resolving App Store Connect errors before submitting for review
22
+
23
+ ## Workflow
24
+
25
+ ### 1. Parse the Rejection
26
+
27
+ Read the full rejection email. Extract and list:
28
+
29
+ - **Guideline numbers** violated (e.g., 2.1, 4.2.0, 5.1.1)
30
+ - **Code-level issues** โ€” missing entitlements, incorrect privacy strings, sandbox violations
31
+ - **Metadata issues** โ€” wrong screenshot sizes, subtitle policy, keyword stuffing
32
+ - **UX issues** โ€” crashes described by reviewer, broken flows, missing functionality
33
+
34
+ Create a numbered fix plan: one item per rejection point, with the type of fix needed.
35
+
36
+ ### 2. Classify Fixes by Type
37
+
38
+ | Type | Location |
39
+ |------|----------|
40
+ | Privacy usage strings missing | `Info.plist` |
41
+ | Entitlement missing/wrong | `<AppName>.entitlements` |
42
+ | Crash or broken feature | Source code |
43
+ | Screenshots wrong size/content | App Store Connect |
44
+ | Keywords/subtitle/description | App Store Connect |
45
+ | Build number conflict | Xcode + App Store Connect |
46
+
47
+ ### 3. Implement Code Fixes
48
+
49
+ **Privacy permission strings** (`Info.plist`):
50
+
51
+ ```xml
52
+ <key>NSMicrophoneUsageDescription</key>
53
+ <string>Used for voice input during focus sessions.</string>
54
+
55
+ <key>NSCalendarsUsageDescription</key>
56
+ <string>Used to sync tasks with your calendar.</string>
57
+ ```
58
+
59
+ **Entitlements** (`<AppName>.entitlements`):
60
+
61
+ ```xml
62
+ <key>com.apple.security.app-sandbox</key>
63
+ <true/>
64
+ <key>com.apple.security.network.client</key>
65
+ <true/>
66
+ <key>com.apple.security.files.user-selected.read-write</key>
67
+ <true/>
68
+ ```
69
+
70
+ **Sandbox violations** โ€” remove `NoEscapeBlock` patterns, replace deprecated APIs, use only sandboxed file access via Security-Scoped Bookmarks when needed.
71
+
72
+ ### 4. Build and Archive
73
+
74
+ ```bash
75
+ # Clean build
76
+ xcodebuild clean \
77
+ -scheme <AppName> \
78
+ -destination 'generic/platform=macOS'
79
+
80
+ # Archive
81
+ xcodebuild archive \
82
+ -scheme <AppName> \
83
+ -archivePath build/<AppName>.xcarchive \
84
+ -destination 'generic/platform=macOS'
85
+
86
+ # Export for App Store
87
+ xcodebuild -exportArchive \
88
+ -archivePath build/<AppName>.xcarchive \
89
+ -exportPath build/export \
90
+ -exportOptionsPlist ExportOptions.plist
91
+ ```
92
+
93
+ Validate codesigning before upload:
94
+
95
+ ```bash
96
+ codesign --verify --deep --strict --verbose=4 build/export/<AppName>.app
97
+ spctl --assess --verbose=4 build/export/<AppName>.app
98
+ ```
99
+
100
+ ### 5. Update App Store Connect Metadata
101
+
102
+ Navigate: **My Apps โ†’ [App] โ†’ App Store tab**
103
+
104
+ Common metadata fixes:
105
+
106
+ - **App name**: max 30 chars
107
+ - **Subtitle**: max 30 chars, no duplicate keywords from the title field
108
+ - **Keywords**: 100-char total limit, comma-separated, no spaces after commas
109
+ - **Screenshots**: exact pixel dimensions per device type (check Apple's current spec)
110
+ - **Privacy Nutrition Labels**: must accurately reflect data collected/linked to user
111
+ - **Build selection**: select the newly uploaded build before submitting
112
+
113
+ ### 6. Write Reviewer Notes
114
+
115
+ In the submission form, fill **Notes for Reviewer**:
116
+
117
+ - Explain each rejection point and what was changed
118
+ - Reference specific guideline numbers: "Addressing 2.1 โ€” added NSMicrophoneUsageDescription to Info.plist"
119
+ - If a feature requires special credentials to test, provide test account details
120
+
121
+ ### 7. Submit and Track
122
+
123
+ 1. Upload via **Xcode Organizer โ†’ Distribute App โ†’ App Store Connect**
124
+ 2. In App Store Connect: select the new build, fill notes, **Submit for Review**
125
+ 3. Typical re-review: 24โ€“48h
126
+ 4. If rejected again: respond in the **Resolution Center** thread (same case number)
127
+ 5. Escalate via Resolution Center for policy disagreements โ€” do not open a new submission
128
+
129
+ ## Build Number Protocol
130
+
131
+ Apple rejects builds with a duplicate build number. Increment `CFBundleVersion` in `Info.plist` or Xcode target settings before every upload:
132
+
133
+ ```bash
134
+ # Bump build number (e.g., 9 โ†’ 10)
135
+ xcrun agvtool new-version -all 10
136
+ ```
137
+
138
+ ## Verification
139
+
140
+ - [ ] Every rejection guideline number has a corresponding fix in the plan
141
+ - [ ] `xcodebuild archive` exits 0 with no warnings about entitlements
142
+ - [ ] `codesign --verify` passes
143
+ - [ ] App Store Connect shows build status as "Ready to Submit"
144
+ - [ ] Reviewer Notes reference each changed item
145
+ - [ ] Build number is higher than any previously uploaded build