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 / NavigationStack
ObservableObject + @Published → @Observable
WKWebView + Representable → Native WebView
NSVisualEffectView → NSGlassEffectView / .glassEffect()
XCTest → Swift Testing
@StateObject → @State with @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)