swiftui-pro — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited swiftui-pro (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Write and review SwiftUI for correctness, modern APIs, and performance. Report real problems only — no nitpicking.
Trigger: /swiftui-pro or natural language ("review this SwiftUI view").
Swift and SDK rather than legacy defaults.
Use @Observable (Observation framework), not ObservableObject/@Published.
❌ Legacy
final class CounterModel: ObservableObject {
@Published var count = 0
}
struct CounterView: View {
@StateObject private var model = CounterModel()
var body: some View { Text("\(model.count)") }
}✅ Modern
@Observable
final class CounterModel {
var count = 0
}
struct CounterView: View {
@State private var model = CounterModel()
var body: some View { Text("\(model.count)") }
}Rules:
@State. Pass it down plainly; use @Bindable only where you needtwo-way bindings to its properties.
@Environment for app-wide models, not singletons.foregroundStyle() not foregroundColor()..background { ... } / .overlay { ... } closure form, not deprecated overloads.Grid, ViewThatFits, and layout containers over manual GeometryReader math.❌
Text("Hi").foregroundColor(.red)✅
Text("Hi").foregroundStyle(.red)Use NavigationStack with a typed path. NavigationView is deprecated.
❌
NavigationView {
NavigationLink("Detail", destination: DetailView())
}✅
NavigationStack(path: $path) {
List(items) { item in
NavigationLink(item.name, value: item.id)
}
.navigationDestination(for: Item.ID.self) { id in
DetailView(id: id)
}
}LazyVStack/LazyHStack inside ScrollView for long content; plain VStackrenders everything eagerly.
ForEach stable identity (Identifiable or id:), never array indices formutable collections.
body cheap. Move expensive work out of body into the model or .task.❌ Index identity on a mutable list
ForEach(0..<items.count, id: \.self) { i in Row(items[i]) }✅
ForEach(items) { item in Row(item) }Use .task (auto-cancelled on disappear), not onAppear { Task { } }.
✅
.task { await model.load() }.font(.body) etc..accessibilityLabel for icon-only controls.ObservableObject/@Published instead of @Observable.foregroundColor / NavigationView / other deprecated APIs.VStack where LazyVStack is needed.ForEach keyed by index on a mutable collection.body.Walk the code top to bottom. For each real problem give: the file:line, a one-line statement of what's wrong, and a tight before → after snippet. Don't mention files that are already fine. Close with the two or three fixes that matter most, in priority order.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.