tech-stack-validator
Tech Stack Validator
Overview
Validate that the chosen technology stack can actually deliver what the PRD promises. This skill catches the expensive mistakes — the ones you discover 6 weeks into implementation when a framework doesn't support a critical requirement.
Core principle: Every tech choice is a trade-off. The job isn't to find the "best" stack — it's to find the stack where the trade-offs align with the project's priorities.
Workflow
Step 1: INGEST → Read PRD + Architecture docs, extract requirements
Step 2: CONSTRAINT MAP → Map requirements to technology constraints
Step 3: VALIDATE → Check each tech choice against constraints
Step 4: RISK SCAN → Flag deprecations, gaps, compatibility issues
Step 5: REPORT → Produce validation report with verdicts
Entry Points
- "Validate my tech stack" → User provides PRD/architecture docs → Full workflow
- "What should I build this with?" → Gather requirements interactively → Recommend stack → Validate
- "Is [framework X] the right choice for [requirement Y]?" → Focused validation on specific choice
- "Review my architecture doc" → Read doc → Steps 2-5
- "I'm deciding between X and Y" → Comparative analysis against requirements
Step 1: Ingest — Extract Requirements
From Documents
If the user provides a PRD and/or architecture document, extract these requirement categories:
PLATFORM REQUIREMENTS
├── Target OS and minimum version (e.g., macOS 26+, iOS 18+)
├── Device targets (Mac, iPhone, iPad, Vision Pro, Watch)
├── Universal or platform-specific builds
└── Apple Silicon only or Intel support needed
DISTRIBUTION REQUIREMENTS
├── App Store (sandbox mandatory)
├── Direct distribution (notarized, no sandbox)
├── Both (dual binary or feature-gated)
└── TestFlight / Enterprise distribution
FUNCTIONAL REQUIREMENTS → TECH IMPLICATIONS
├── Local persistence → SwiftData, Core Data, SQLite, Realm, file-based
├── Cloud sync → CloudKit, custom server, third-party BaaS
├── Real-time collaboration → WebSockets, CloudKit sharing, custom
├── AI/ML features → Core ML, FoundationModels, Vision, NLP
├── Rich text editing → TextKit 2, AttributedString, custom
├── Web content → WebKit (new WebView vs WKWebView bridge)
├── Background processing → BGTaskScheduler, URLSession background
├── System integration → Hotkeys, Accessibility API, pasteboard
├── Notifications → Local, push (APNs), AlarmKit
└── Widgets / Extensions → WidgetKit, App Intents
PERFORMANCE REQUIREMENTS
├── Launch time budget
├── Memory budget
├── Search/query latency at expected data volume
├── Animation frame rate
└── Storage per unit of content
NON-FUNCTIONAL REQUIREMENTS
├── Accessibility (VoiceOver, keyboard nav, Dynamic Type)
├── Localization (RTL support, string extraction)
├── Security (encryption at rest, keychain, network security)
├── Privacy (privacy manifest, tracking transparency)
└── Offline capability (full, partial, online-only)
TEAM & TIMELINE
├── Solo developer or team size
├── Timeline to v1.0
├── Existing codebase or greenfield
├── Team's framework experience
└── Maintenance runway (who maintains this after launch?)
From Conversation
If no documents exist, ask these questions (2-3 at a time):
- What's the app? What platform and minimum OS?
- App Store, direct distribution, or both?
- What data does it persist? Does it sync across devices?
- What system features does it need? (Hotkeys, clipboard, widgets, Siri, etc.)
- What's the team size and timeline?
- Any existing code or starting fresh?
- Any strong preferences or constraints? (e.g., "must use SwiftUI only, no AppKit")
Step 2: Constraint Map
Map each requirement to the technology dimensions it constrains:
Constraint Categories
| Dimension | What It Determines |
|---|---|
| Language version | Swift 6.2 features (default MainActor, @concurrent) need Xcode 26+ |
| UI framework | SwiftUI-only vs SwiftUI+AppKit bridge determines what's possible |
| Persistence | SwiftData vs Core Data vs SQLite — each has different sync, migration, and query capabilities |
| Sync engine | CloudKit (Apple-only) vs custom server vs third-party — determines offline strategy |
| Minimum OS | Gates which frameworks/APIs are available (see availability matrix) |
| Distribution | Sandbox restrictions eliminate certain capabilities |
| Concurrency model | Swift 6 strict concurrency vs 5.x — affects every file in the project |
| Design system | Liquid Glass requires macOS 26+ / iOS 26+ |
OS Availability Matrix (Key Frameworks)
| Framework / API | macOS | iOS | Notes |
|---|---|---|---|
| SwiftUI | 10.15+ | 13+ | Feature set varies significantly by version |
| SwiftData | 14+ | 17+ | Class inheritance: 15+ / 18+ |
| @Observable | 14+ | 17+ | Replaces ObservableObject |
| NavigationSplitView | 13+ | 16+ | Replaces NavigationView |
| Liquid Glass (.glassEffect) | 26+ | 26+ | New design system, not backportable |
| FoundationModels (on-device LLM) | 26+ | 26+ | Apple Silicon with Apple Intelligence |
| WebView (SwiftUI native) | 26+ | 26+ | Replaces WKWebView bridge pattern |
| AlarmKit | — | 18+ | iOS only |
| App Intents | 13+ | 16+ | Advanced features (modes, snippets) in 26+ |
| Swift Testing | Xcode 16+ | Xcode 16+ | Replaces XCTest |
| Swift 6.2 (default MainActor) | Xcode 26 | Xcode 26 | Language-level, not OS-gated |
| GlassEffectContainer | 26+ | 26+ | Required for multiple glass effects |
| Chart3D | 26+ | 26+ | 3D charts, visionOS volumetric |
| WidgetKit | 14+ | 14+ | Accented mode: 26+ |
Sandbox Compatibility Matrix
| Capability | Sandboxed (App Store) | Direct Distribution |
|---|---|---|
| Global hotkeys (Carbon) | ⚠️ Needs entitlement | ✅ |
| Accessibility API (AX) | ⚠️ Entitlement + user permission | ✅ |
| CGEvent keystroke simulation | ❌ Blocked | ✅ (with Accessibility) |
| Clipboard read/write | ✅ | ✅ |
| File access (arbitrary) | ❌ User-selected only | ✅ |
| Network (outbound) | ⚠️ Needs entitlement | ✅ |
| Launch at login | ✅ SMAppService | ✅ |
| iCloud sync | ✅ | ✅ |
| Keychain | ✅ (app-scoped) | ✅ |
| Screen recording | ❌ | ✅ (with permission) |
Step 3: Validate Each Choice
For every technology in the proposed stack, check:
3.1 Availability
- Is it available on the target OS version?
- If targeting multiple platforms, is it available on ALL of them?
- Are there feature gaps between OS versions? (e.g., SwiftData inheritance needs macOS 15+)
3.2 Capability
- Can this technology deliver the specific requirement?
- At the required scale? (e.g., SwiftData with 100K records — is @Query performant enough?)
- With the required latency? (e.g., full-text search in < 50ms)
3.3 Compatibility
- Does it work with the distribution model? (Sandbox restrictions?)
- Does it work with the other chosen technologies? (e.g., SwiftData + CloudKit sync — are there known limitations?)
- Does the concurrency model align? (Swift 6 strict checking + chosen frameworks)
3.4 Maturity
- Is this framework stable or still evolving rapidly?
- Are there known bugs or limitations in the current version?
- Is there sufficient documentation and community knowledge?
3.5 Maintenance
- Who maintains this dependency? (Apple framework vs third-party)
- What happens if it's deprecated? (Migration path?)
- Does the team have experience with it?
Step 4: Risk Scan
Deprecation Risks
Check for deprecated or soon-to-be-deprecated patterns:
NavigationView→NavigationSplitView/NavigationStackObservableObject+@Published→@ObservableWKWebView+ Representable → NativeWebViewNSVisualEffectView→NSGlassEffectView/.glassEffect()XCTest→ Swift Testing@StateObject→@Statewith@Observable
Common Mismatch Patterns
| PRD Says | Architecture Uses | Problem |
|---|---|---|
| "Works on macOS 14+" | Liquid Glass / .glassEffect() | Liquid Glass requires macOS 26+ |
| "App Store distribution" | CGEvent text insertion | Blocked by sandbox |
| "Offline-first with sync" | No local persistence layer | Can't work offline without local DB |
| "< 100ms search on 50K items" | SwiftData @Query | Needs benchmarking; may need raw SQLite for complex queries |
| "Solo developer, 8 weeks" | Custom sync server + REST API | Scope exceeds timeline — use CloudKit instead |
| "Privacy-focused, no cloud" | CloudKit sync | Contradicts privacy requirement |
| "Must support Intel Macs" | FoundationModels framework | Requires Apple Silicon + Apple Intelligence |
| "Real-time collaboration" | CloudKit only | CloudKit is eventual-consistency, not real-time |
Step 5: Validation Report
Produce the report as a file. See references/report-template.md for the full template.
Report Structure
# Tech Stack Validation Report: [App Name]
## Verdict: ✅ GO / ⚠️ GO WITH CHANGES / ❌ STOP
## Stack Summary
[Table of every technology choice with verdict]
## Critical Issues (Must Fix Before Starting)
[Issues that will block the project if not addressed]
## Warnings (Should Address Soon)
[Issues that will cause pain but won't block]
## Recommendations
[Suggested changes with rationale]
## Compatibility Matrix
[Full matrix of requirements vs. tech choices]
## Alternative Options Considered
[For each flagged issue, what alternatives exist]
Verdict Criteria
| Verdict | Criteria |
|---|---|
| ✅ GO | All critical requirements met, no blocking issues, warnings are manageable |
| ⚠️ GO WITH CHANGES | 1-3 specific changes needed, but core stack is sound |
| ❌ STOP | Fundamental mismatch — chosen stack cannot deliver PRD requirements |
Decision Frameworks
When to Use SwiftData vs Core Data vs SQLite
Need iCloud sync + simple models?
└── SwiftData (macOS 14+ / iOS 17+)
Need complex queries + large datasets (>100K rows)?
└── SQLite via GRDB or direct SQLite3
Need class inheritance in models?
└── SwiftData (macOS 15+ / iOS 18+)
Need to support macOS 13 or iOS 16?
└── Core Data
Need both complex queries AND sync?
└── Core Data + CloudKit, or SQLite + custom sync
When to Use SwiftUI-Only vs SwiftUI + AppKit Bridge
App Store sidebar+detail app, standard controls?
└── SwiftUI-only
Need floating panel (NSPanel)?
└── SwiftUI + AppKit bridge
Need global hotkeys or CGEvent?
└── SwiftUI + AppKit (AppDelegate)
Need custom window chrome or levels?
└── SwiftUI + NSWindow/NSPanel
Need menu bar with popover?
└── MenuBarExtra (pure SwiftUI) OR NSStatusItem + NSPopover (more control)
When to Use CloudKit vs Custom Server
Apple-only users, simple data, offline-first?
└── CloudKit (free, built-in, handles conflicts)
Need cross-platform (Android/Web)?
└── Custom server or Firebase/Supabase
Need real-time collaboration?
└── Custom WebSocket server or third-party (Supabase Realtime)
Need fine-grained access control?
└── Custom server
Solo developer, limited budget?
└── CloudKit (zero infrastructure cost)
Interaction Style
- Be direct about risks — sugar-coating wastes the developer's time
- Quantify when possible ("SwiftData @Query on 50K records: ~200ms" not "might be slow")
- Always provide alternatives when flagging issues
- Distinguish between "this won't work" (hard blocker) and "this will hurt" (soft issue)
- If the user has strong preferences, respect them but flag trade-offs clearly
- Remember that the "right" stack depends on team skills, timeline, and priorities — not just technical optimality
Key Principles
- Requirements drive choices, not preferences — "I like SwiftData" is not a justification if Core Data fits the requirements better
- Validate at the boundaries — Most tech works fine in isolation; problems emerge at integration points
- Time is a constraint — A technically superior stack that takes 6 months to learn is worse than a familiar stack that ships in 8 weeks
- Distribution gates capabilities — App Store sandbox restrictions are non-negotiable and must be checked early
- OS version is destiny — Every API has a minimum OS; the lowest target version constrains everything
- Dependencies are debt — Every third-party dependency is a maintenance commitment; prefer Apple frameworks when they're sufficient
- Check the edges, not the middle — Basic CRUD works with anything; validate against the hardest requirements (performance, sync, offline, scale)
More from makgunay/claude-swift-skills
macos-app-structure
macOS application architecture patterns covering App protocol (@main), Scene types (WindowGroup, Window, Settings, MenuBarExtra), multi-window management, NSApplicationDelegateAdaptor for AppKit lifecycle hooks, Info.plist configuration (LSUIElement for menu bar apps, NSAccessibilityUsageDescription), entitlements for sandbox/hardened runtime, and project structure conventions. Use when scaffolding a new macOS app, configuring scenes and windows, setting up menu bar apps, or resolving macOS-specific lifecycle issues. Corrects the common LLM mistake of generating iOS-only app structures.
31macos-permissions
macOS permission handling for Accessibility (AXIsProcessTrusted), Screen Recording, Full Disk Access, input monitoring, camera, microphone, location, and contacts. Covers TCC (Transparency Consent and Control) database, graceful degradation when permissions are denied, permission prompting patterns, opening System Settings to the correct pane, detecting permission changes, and the privacy manifest (PrivacyInfo.xcprivacy) requirement. Use when implementing features that require system permissions, building permission onboarding flows, or handling denied permissions gracefully.
17appkit-bridge
Bridging AppKit components into SwiftUI macOS apps. Covers NSViewRepresentable and NSViewControllerRepresentable protocols for hosting AppKit views in SwiftUI, NSHostingView/NSHostingController for hosting SwiftUI in AppKit, NSPanel for floating windows, NSWindow configuration (styleMask, level, collectionBehavior), responder chain integration, NSEvent monitoring (global and local), NSAnimationContext for AppKit animations, NSPopover, NSStatusItem for menu bar, and NSGlassEffectView for AppKit Liquid Glass. Use when SwiftUI lacks a native equivalent, building floating panels, custom window chrome, or integrating legacy AppKit components.
15swiftui-core
Core SwiftUI patterns for macOS and iOS development including navigation (NavigationSplitView, NavigationStack), state management (@State, @Binding, @Environment, @Bindable with @Observable), the new customizable toolbar system (toolbar IDs, ToolbarSpacer, DefaultToolbarItem, searchToolbarBehavior, matchedTransitionSource, sharedBackgroundVisibility), styled text editing (TextEditor with AttributedString, AttributedTextSelection, transformAttributes, textFormattingDefinition), and layout patterns. Use when building any SwiftUI view, implementing navigation, managing state, creating toolbars, or building rich text editors. Corrects common LLM errors like using deprecated NavigationView, wrong state wrappers, and outdated toolbar APIs.
14global-hotkeys
System-wide keyboard shortcut registration on macOS using NSEvent monitoring (simple, app-level) and Carbon EventHotKey API (reliable, system-wide). Covers NSEvent.addGlobalMonitorForEvents and addLocalMonitorForEvents, CGEvent tap for keystroke simulation, Carbon RegisterEventHotKey for system-wide hotkeys, modifier flag handling (.deviceIndependentFlagsMask), common key code mappings, debouncing, Accessibility permission requirements (AXIsProcessTrusted), and SwiftUI .onKeyPress for in-app shortcuts. Use when implementing global keyboard shortcuts, hotkey-triggered panels, or system-wide key event monitoring.
11swiftui-webkit
Native SwiftUI WebKit integration with the new WebView struct and WebPage observable class. Covers WebView creation from URLs, WebPage for navigation control and state management, JavaScript execution (callJavaScript with arguments and content worlds), custom URL scheme handlers, navigation management (load, reload, back/forward), navigation decisions, text search (findNavigator), content capture (snapshots, PDF generation, web archives), and configuration (data stores, user agents, JS permissions). Use when embedding web content in SwiftUI apps instead of the old WKWebView + UIViewRepresentable/NSViewRepresentable bridge pattern. This is a brand new API — do NOT use the old WKWebView wrapping approach.
10