App icon was missing — AppIcon.appiconset/Contents.json declared 10 size slots
but no PNG files filled in, so Jarvis showed the generic blank-app placeholder
in Dock/Finder/cmd-tab. This commit fills all 10 slots with a generated icon
derived from the existing menu-bar arc-reactor PDF, plus consolidates the
helper Info.plists onto the same MACOSX_DEPLOYMENT_TARGET pattern the main
target already uses.
Icon generation
---------------
- Render Icon-MenuBar-Template.pdf at 1024×1024 via qlmanage
- Composite via scripts/build-app-icon.swift (Core Graphics):
- Squircle clip (radius = size × 0.2237 per Apple HIG)
- Radial gradient backplate: #4FC3F7 cyan core → #0D47A1 navy → #061229
near-black (Iron Man arc-reactor palette)
- Inner glow ring at 35% radius for energized feel
- Silhouette as luminosity mask, filled near-white with cyan tint
- 2.5px cyan rim for definition against any wallpaper
- Resize to 7 unique pixel sizes (16/32/64/128/256/512/1024) via sips
- Map into the 10 AppIcon.appiconset slots (each idiom×scale combination
gets its own filename for clarity, even though sizes overlap)
- AppIcon.icns is now produced by Xcode's actool at 52KB
Helper deployment-target sync
-----------------------------
The macOS 14 deployment-target bump in 722e25b (Phase 6 close-out, Voice
package's ORT 1.24.2 floor) updated the main Jarvis target via project.yml
but missed the three MCP helper Info.plists, which still hardcoded
LSMinimumSystemVersion=13.0. xcodebuild auto-corrected at build time but
emitted a warning per helper. Update each to use $(MACOSX_DEPLOYMENT_TARGET)
so future deployment-target changes propagate automatically (matches the
pattern the main App/Info.plist already uses).
Files
-----
- App/Assets.xcassets/AppIcon.appiconset/Contents.json — slot filenames
- App/Assets.xcassets/AppIcon.appiconset/icon_*.png — 10 icon PNGs
- scripts/build-app-icon.swift — reproducible icon-generation script
- mcp-servers/mcp-{clipboard,applescript,time}/Support/Info.plist — sync to $(MACOSX_DEPLOYMENT_TARGET)
Verification
------------
- xcodebuild Debug build: BUILD SUCCEEDED, zero LSMinimumSystem warnings
- AppIcon.icns present in Jarvis.app/Contents/Resources/ (52KB)
- HudState enum (5 cases) with verbatim UI-SPEC Surface 3 VoiceOver labels
- BrandColor.arcReactorGlow: #1E88E5@85% light / #64B5F6@90% dark with Increase Contrast fallback to controlAccentColor
- CAAnimationFactory with makeBreath/makeRotate/makeShimmer/makeGlow/makeStateCrossfade, each Reduce Motion-guarded
- 22×22pt arc-reactor silhouette placeholder PDF (outer 18pt ring + mid 12pt ring + filled 4pt core + six 60° spokes) via Core Graphics
- Icon-MenuBar-Template.imageset Contents.json pointed at the PDF with template-rendering-intent=template and preserves-vector-representation=true
- Create Jarvis.xcodeproj with App target, Hardened Runtime, Swift 6 strict
concurrency, Manual codesign, ad-hoc identity for Debug
- Pin com.apple.security.cs.allow-jit, com.apple.developer.speech-recognition-assets,
and com.apple.security.device.audio-input in App/Jarvis.entitlements (SEC-02/SEC-03);
forbidden keys allow-unsigned-executable-memory and automation.apple-events are
explicitly excluded
- Set LSUIElement=YES, JarvisEntitlementsVerified=NO, and all four TCC usage-description
keys in App/Info.plist for future phases to consume
- Register four local SPM package refs (Keychain, Config, Logging, Shell) against
packages/ and link their library products to the Jarvis target
- Add PBXCopyFilesBuildPhase (Wrapper subpath Contents/Helpers, dstSubfolderSpec=1)
plus a post-build script that materializes the empty directory — MCP-05 codesign
infrastructure in place before Plan 05
- Add CODE_SIGNING_ALLOWED=NO for Debug only because the managed
speech-recognition-assets entitlement requires a provisioning profile;
Release signing is wired properly in Plan 05
- Stub JarvisApp.swift and AppDelegate.swift per D-02 (lifecycle-only; wiring
lands in Plan 03); asset catalog carries placeholder AppIcon set and
Icon-MenuBar-Template imageset metadata
- Track ATS public-key pinning finding in deferred-items.md — out of P1 scope
(no networking code yet; pinning is a P4/P8 Rule-4 architectural decision)