iOS Code Review Arguments - : Spawn specialized subagents per technology area - Path: Target directory (default: current working directory) Hard gates Complete in order before writing Issues in the output (empty scope is allowed; fabricated findings are not). 1. Scope gate: You have an explicit list of paths under review (from Step 1 or a user-provided path). Pass: List captured in working notes or one line: — then stop with no Issues. 2. Linter gate (style): Step 2 commands ran for this tree; if no / , note that in one line. Pass: You do not report a style issue that SwiftLint would already…

\n```\n\n## Step 2: Verify Linter Status\n\n**CRITICAL**: Run SwiftLint BEFORE flagging any style issues.\n\n```bash\n# Check if SwiftLint config exists and run it\nif [ -f \".swiftlint.yml\" ] || [ -f \".swiftlint.yaml\" ]; then\n swiftlint lint --quiet \u003cchanged_files>\nfi\n```\n\n**Rules:**\n- If SwiftLint passes for a specific rule, DO NOT flag that issue manually\n- SwiftLint configuration is authoritative for style rules\n- Only flag issues that linters cannot detect (semantic issues, architectural problems)\n\n## Step 3: Detect Technologies\n\n```bash\n# SwiftUI (always with swift files that import it)\ngrep -r \"import SwiftUI\" --include=\"*.swift\" -l | head -3\n\n# SwiftData\ngrep -r \"import SwiftData\\|@Model\\|@Query\" --include=\"*.swift\" -l | head -3\n\n# Swift Testing\ngrep -r \"import Testing\\|@Test\\|#expect\" --include=\"*.swift\" -l | head -3\n\n# Combine\ngrep -r \"import Combine\\|AnyPublisher\\|@Published\" --include=\"*.swift\" -l | head -3\n\n# URLSession (explicit async patterns)\ngrep -r \"URLSession\\.shared\\|\\.data(from:\\|\\.download(from:\" --include=\"*.swift\" -l | head -3\n\n# CloudKit\ngrep -r \"import CloudKit\\|CKContainer\\|CKRecord\" --include=\"*.swift\" -l | head -3\n\n# WidgetKit\ngrep -r \"import WidgetKit\\|TimelineProvider\\|WidgetFamily\" --include=\"*.swift\" -l | head -3\n\n# App Intents\ngrep -r \"import AppIntents\\|@AppIntent\\|AppEntity\" --include=\"*.swift\" -l | head -3\n\n# HealthKit\ngrep -r \"import HealthKit\\|HKHealthStore\\|HKQuery\" --include=\"*.swift\" -l | head -3\n\n# WatchKit\ngrep -r \"import WatchKit\\|WKExtension\\|WKInterfaceController\" --include=\"*.swift\" -l | head -3\n\n# Animations (beyond basic withAnimation)\ngrep -r \"PhaseAnimator\\|KeyframeAnimator\\|matchedGeometryEffect\\|navigationTransition\\|scrollTransition\\|CABasicAnimation\\|CASpringAnimation\\|CAKeyframeAnimation\\|UIViewPropertyAnimator\\|UIDynamicAnimator\\|\\.symbolEffect\\|\\.contentTransition\\|CustomAnimation\\|MeshGradient\" --include=\"*.swift\" -l | head -3\n```\n\n## Step 4: Load Verification Protocol\n\nLoad `beagle-ios:review-verification-protocol` skill and keep its checklist in mind throughout the review.\n\n## Step 5: Load Skills\n\nUse the `Skill` tool to load each applicable skill (e.g., `Skill(skill: \"beagle-ios:swift-code-review\")`).\n\n**Always load:**\n- `beagle-ios:swift-code-review`\n- `beagle-ios:swiftui-code-review`\n\n**Conditionally load based on detection:**\n\n| Condition | Skill |\n|-----------|-------|\n| SwiftData detected | `beagle-ios:swiftdata-code-review` |\n| Swift Testing detected | `beagle-ios:swift-testing-code-review` |\n| Combine detected | `beagle-ios:combine-code-review` |\n| URLSession detected | `beagle-ios:urlsession-code-review` |\n| CloudKit detected | `beagle-ios:cloudkit-code-review` |\n| WidgetKit detected | `beagle-ios:widgetkit-code-review` |\n| App Intents detected | `beagle-ios:app-intents-code-review` |\n| HealthKit detected | `beagle-ios:healthkit-code-review` |\n| WatchKit detected | `beagle-ios:watchos-code-review` |\n| Animation code detected | `beagle-ios:ios-animation-code-review` |\n\n## Step 6: Review\n\n**Sequential (default):**\n1. Load applicable skills\n2. Review Swift quality issues first (concurrency, memory, error handling)\n3. Review SwiftUI patterns (view composition, state management, accessibility)\n4. Review detected technology areas\n5. Consolidate findings\n\n**Parallel (--parallel flag):**\n1. Detect all technologies upfront\n2. Spawn one subagent per technology area with `Task` tool\n3. Each agent loads its skill and reviews its domain\n4. Wait for all agents\n5. Consolidate findings\n\n### Before Flagging Issues\n\n1. **Check SwiftLint output** - don't duplicate linter findings\n2. **Check code comments** for intentional patterns (// MARK:, // NOTE:, etc.)\n3. **Consider Apple framework idioms** - what looks wrong generically may be correct for the framework\n4. **Trace async code paths** before claiming missing error handling or race conditions\n\n## Step 7: Verify Findings\n\nBefore reporting any issue:\n1. Re-read the actual code (not just diff context)\n2. For \"unused\" claims - did you search all references?\n3. For \"missing\" claims - did you check framework/parent handling?\n4. For syntax issues - did you verify against current version docs?\n5. Remove any findings that are style preferences, not actual issues\n\n## Step 8: Review Convergence\n\n### Single-Pass Completeness\n\nYou MUST report ALL issues across ALL categories (style, logic, types, tests, security, performance) in a single review pass. Do not hold back issues for later rounds.\n\nBefore submitting findings, ask yourself:\n- \"If all my recommended fixes are applied, will I find NEW issues in the fixed code?\"\n- \"Am I requesting new code (tests, types, modules) that will itself need review?\"\n\nIf yes to either: include those anticipated downstream issues NOW, in this review, so the author can address everything at once.\n\n### Scope Rules\n\n- Review ONLY the code in the diff and directly related existing code\n- Do NOT request new features, test infrastructure, or architectural changes that didn't exist before the diff\n- If test coverage is missing, flag it as ONE Minor issue (\"Missing test coverage for X, Y, Z\") — do NOT specify implementation details like mock libraries, behaviour extraction, or dependency injection patterns that would introduce substantial new code\n- Typespecs, documentation, and naming issues are Minor unless they affect public API contracts\n- Do NOT request adding new dependencies (e.g. Mox, testing libraries, linter plugins)\n\n### Fix Complexity Budget\n\nFixes to existing code should be flagged at their real severity regardless of size.\n\nHowever, requests for **net-new code that didn't exist before the diff** must be classified as Informational:\n- Adding a new dependency (e.g. Mox, a linter plugin)\n- Creating entirely new modules, files, or test suites\n- Extracting new behaviours, protocols, or abstractions\n\nThese are improvement suggestions for the author to consider in future work, not review blockers.\n\n### Iteration Policy\n\nIf this is a re-review after fixes were applied:\n- ONLY verify that previously flagged issues were addressed correctly\n- Do NOT introduce new findings unrelated to the previous review's issues\n- Accept Minor/Nice-to-Have issues that weren't fixed — do not re-flag them\n- The goal of re-review is VERIFICATION, not discovery\n\n## Output Format\n\n```markdown\n## Review Summary\n\n[1-2 sentence overview of findings]\n\n## Issues\n\n### Critical (Blocking)\n\n1. [FILE:LINE] ISSUE_TITLE\n - Issue: Description of what's wrong\n - Why: Why this matters (crash, data loss, security, race condition)\n - Fix: Specific recommended fix\n\n### Major (Should Fix)\n\n2. [FILE:LINE] ISSUE_TITLE\n - Issue: ...\n - Why: ...\n - Fix: ...\n\n### Minor (Nice to Have)\n\nN. [FILE:LINE] ISSUE_TITLE\n - Issue: ...\n - Why: ...\n - Fix: ...\n\n### Informational (For Awareness)\n\nN. [FILE:LINE] SUGGESTION_TITLE\n - Suggestion: ...\n - Rationale: ...\n\n## Good Patterns\n\n- [FILE:LINE] Pattern description (preserve this)\n\n## Verdict\n\nReady: Yes | No | With fixes 1-N (Critical/Major only; Minor items are acceptable)\nRationale: [1-2 sentences]\n```\n\n## Post-Fix Verification\n\nAfter fixes are applied, run:\n\n```bash\n# Swift build and lint\nswift build\nswiftlint lint --quiet\n\n# Run tests if present\nswift test\n```\n\nAll checks must pass before approval.\n\n## Rules\n\n- Load skills BEFORE reviewing (not after)\n- Number every issue sequentially (1, 2, 3...)\n- Include FILE:LINE for each issue\n- Separate Issue/Why/Fix clearly\n- Categorize by actual severity\n- Check for Swift 6 strict concurrency issues\n- Run verification after fixes\n- Report ALL issues in a single pass — do not hold back findings for later iterations\n- Re-reviews verify previous fixes ONLY — no new discovery\n- Requests for net-new code (new modules, dependencies, test suites) are Informational, not blocking\n- The Verdict ignores Minor and Informational items — only Critical and Major block approval\n---","attachment_filenames":[],"attachments":[],"content_json":{"type":"doc","content":[{"type":"heading","attrs":{"level":1},"content":[{"text":"iOS Code Review","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Arguments","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"--parallel","type":"text","marks":[{"type":"code_inline"}]},{"text":": Spawn specialized subagents per technology area","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Path: Target directory (default: current working directory)","type":"text"}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Hard gates","type":"text"}]},{"type":"paragraph","content":[{"text":"Complete in order before writing ","type":"text"},{"text":"Issues","type":"text","marks":[{"type":"strong"}]},{"text":" in the output (empty scope is allowed; fabricated findings are not).","type":"text"}]},{"type":"ordered_list","attrs":{"order":1,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Scope gate:","type":"text","marks":[{"type":"strong"}]},{"text":" You have an explicit list of ","type":"text"},{"text":".swift","type":"text","marks":[{"type":"code_inline"}]},{"text":" paths under review (from Step 1 or a user-provided path). ","type":"text"},{"text":"Pass:","type":"text","marks":[{"type":"strong"}]},{"text":" List captured in working notes ","type":"text"},{"text":"or","type":"text","marks":[{"type":"strong"}]},{"text":" one line: ","type":"text"},{"text":"No Swift files in scope","type":"text","marks":[{"type":"code_inline"}]},{"text":" — then stop with no Issues.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Linter gate (style):","type":"text","marks":[{"type":"strong"}]},{"text":" Step 2 commands ran for this tree; if no ","type":"text"},{"text":".swiftlint.yml","type":"text","marks":[{"type":"code_inline"}]},{"text":" / ","type":"text"},{"text":".swiftlint.yaml","type":"text","marks":[{"type":"code_inline"}]},{"text":", note that in one line. ","type":"text"},{"text":"Pass:","type":"text","marks":[{"type":"strong"}]},{"text":" You do not report a style issue that SwiftLint would already enforce for that line when config exists and ","type":"text"},{"text":"swiftlint","type":"text","marks":[{"type":"code_inline"}]},{"text":" succeeds.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Protocol gate:","type":"text","marks":[{"type":"strong"}]},{"text":" ","type":"text"},{"text":"beagle-ios:review-verification-protocol","type":"text","marks":[{"type":"code_inline"}]},{"text":" is loaded before Step 6. ","type":"text"},{"text":"Pass:","type":"text","marks":[{"type":"strong"}]},{"text":" If you report any Issues, at least one finding was checked against that checklist (name the item in Review Summary or on that Issue); if you report zero Issues, state ","type":"text"},{"text":"Protocol applied; no issues","type":"text","marks":[{"type":"code_inline"}]},{"text":" in Review Summary.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Evidence gate (Critical/Major):","type":"text","marks":[{"type":"strong"}]},{"text":" For each Critical or Major item, you re-read the file at ","type":"text"},{"text":"FILE:LINE","type":"text","marks":[{"type":"code_inline"}]},{"text":" (full surrounding context, not only the diff hunk). ","type":"text"},{"text":"Pass:","type":"text","marks":[{"type":"strong"}]},{"text":" The Issue text matches observable code at that location.","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"Do not begin Step 6 until ","type":"text"},{"text":"Gates 1–3","type":"text","marks":[{"type":"strong"}]},{"text":" are satisfied (skills load order stays Steps 4–5).","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Step 1: Identify Changed Files","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"git diff --name-only $(git merge-base HEAD main)..HEAD | grep -E '\\.swift

iOS Code Review Arguments - : Spawn specialized subagents per technology area - Path: Target directory (default: current working directory) Hard gates Complete in order before writing Issues in the output (empty scope is allowed; fabricated findings are not). 1. Scope gate: You have an explicit list of paths under review (from Step 1 or a user-provided path). Pass: List captured in working notes or one line: — then stop with no Issues. 2. Linter gate (style): Step 2 commands ran for this tree; if no / , note that in one line. Pass: You do not report a style issue that SwiftLint would already…

","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Step 2: Verify Linter Status","type":"text"}]},{"type":"paragraph","content":[{"text":"CRITICAL","type":"text","marks":[{"type":"strong"}]},{"text":": Run SwiftLint BEFORE flagging any style issues.","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"# Check if SwiftLint config exists and run it\nif [ -f \".swiftlint.yml\" ] || [ -f \".swiftlint.yaml\" ]; then\n swiftlint lint --quiet \u003cchanged_files>\nfi","type":"text"}]},{"type":"paragraph","content":[{"text":"Rules:","type":"text","marks":[{"type":"strong"}]}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"If SwiftLint passes for a specific rule, DO NOT flag that issue manually","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"SwiftLint configuration is authoritative for style rules","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Only flag issues that linters cannot detect (semantic issues, architectural problems)","type":"text"}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Step 3: Detect Technologies","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"# SwiftUI (always with swift files that import it)\ngrep -r \"import SwiftUI\" --include=\"*.swift\" -l | head -3\n\n# SwiftData\ngrep -r \"import SwiftData\\|@Model\\|@Query\" --include=\"*.swift\" -l | head -3\n\n# Swift Testing\ngrep -r \"import Testing\\|@Test\\|#expect\" --include=\"*.swift\" -l | head -3\n\n# Combine\ngrep -r \"import Combine\\|AnyPublisher\\|@Published\" --include=\"*.swift\" -l | head -3\n\n# URLSession (explicit async patterns)\ngrep -r \"URLSession\\.shared\\|\\.data(from:\\|\\.download(from:\" --include=\"*.swift\" -l | head -3\n\n# CloudKit\ngrep -r \"import CloudKit\\|CKContainer\\|CKRecord\" --include=\"*.swift\" -l | head -3\n\n# WidgetKit\ngrep -r \"import WidgetKit\\|TimelineProvider\\|WidgetFamily\" --include=\"*.swift\" -l | head -3\n\n# App Intents\ngrep -r \"import AppIntents\\|@AppIntent\\|AppEntity\" --include=\"*.swift\" -l | head -3\n\n# HealthKit\ngrep -r \"import HealthKit\\|HKHealthStore\\|HKQuery\" --include=\"*.swift\" -l | head -3\n\n# WatchKit\ngrep -r \"import WatchKit\\|WKExtension\\|WKInterfaceController\" --include=\"*.swift\" -l | head -3\n\n# Animations (beyond basic withAnimation)\ngrep -r \"PhaseAnimator\\|KeyframeAnimator\\|matchedGeometryEffect\\|navigationTransition\\|scrollTransition\\|CABasicAnimation\\|CASpringAnimation\\|CAKeyframeAnimation\\|UIViewPropertyAnimator\\|UIDynamicAnimator\\|\\.symbolEffect\\|\\.contentTransition\\|CustomAnimation\\|MeshGradient\" --include=\"*.swift\" -l | head -3","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Step 4: Load Verification Protocol","type":"text"}]},{"type":"paragraph","content":[{"text":"Load ","type":"text"},{"text":"beagle-ios:review-verification-protocol","type":"text","marks":[{"type":"code_inline"}]},{"text":" skill and keep its checklist in mind throughout the review.","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Step 5: Load Skills","type":"text"}]},{"type":"paragraph","content":[{"text":"Use the ","type":"text"},{"text":"Skill","type":"text","marks":[{"type":"code_inline"}]},{"text":" tool to load each applicable skill (e.g., ","type":"text"},{"text":"Skill(skill: \"beagle-ios:swift-code-review\")","type":"text","marks":[{"type":"code_inline"}]},{"text":").","type":"text"}]},{"type":"paragraph","content":[{"text":"Always load:","type":"text","marks":[{"type":"strong"}]}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"beagle-ios:swift-code-review","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"beagle-ios:swiftui-code-review","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"paragraph","content":[{"text":"Conditionally load based on detection:","type":"text","marks":[{"type":"strong"}]}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Condition","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Skill","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"SwiftData detected","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"beagle-ios:swiftdata-code-review","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Swift Testing detected","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"beagle-ios:swift-testing-code-review","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Combine detected","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"beagle-ios:combine-code-review","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"URLSession detected","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"beagle-ios:urlsession-code-review","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"CloudKit detected","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"beagle-ios:cloudkit-code-review","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"WidgetKit detected","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"beagle-ios:widgetkit-code-review","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"App Intents detected","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"beagle-ios:app-intents-code-review","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"HealthKit detected","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"beagle-ios:healthkit-code-review","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"WatchKit detected","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"beagle-ios:watchos-code-review","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Animation code detected","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"beagle-ios:ios-animation-code-review","type":"text","marks":[{"type":"code_inline"}]}]}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Step 6: Review","type":"text"}]},{"type":"paragraph","content":[{"text":"Sequential (default):","type":"text","marks":[{"type":"strong"}]}]},{"type":"ordered_list","attrs":{"order":1,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Load applicable skills","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Review Swift quality issues first (concurrency, memory, error handling)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Review SwiftUI patterns (view composition, state management, accessibility)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Review detected technology areas","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Consolidate findings","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"Parallel (--parallel flag):","type":"text","marks":[{"type":"strong"}]}]},{"type":"ordered_list","attrs":{"order":1,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Detect all technologies upfront","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Spawn one subagent per technology area with ","type":"text"},{"text":"Task","type":"text","marks":[{"type":"code_inline"}]},{"text":" tool","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Each agent loads its skill and reviews its domain","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Wait for all agents","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Consolidate findings","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Before Flagging Issues","type":"text"}]},{"type":"ordered_list","attrs":{"order":1,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Check SwiftLint output","type":"text","marks":[{"type":"strong"}]},{"text":" - don't duplicate linter findings","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Check code comments","type":"text","marks":[{"type":"strong"}]},{"text":" for intentional patterns (// MARK:, // NOTE:, etc.)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Consider Apple framework idioms","type":"text","marks":[{"type":"strong"}]},{"text":" - what looks wrong generically may be correct for the framework","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Trace async code paths","type":"text","marks":[{"type":"strong"}]},{"text":" before claiming missing error handling or race conditions","type":"text"}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Step 7: Verify Findings","type":"text"}]},{"type":"paragraph","content":[{"text":"Before reporting any issue:","type":"text"}]},{"type":"ordered_list","attrs":{"order":1,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Re-read the actual code (not just diff context)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"For \"unused\" claims - did you search all references?","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"For \"missing\" claims - did you check framework/parent handling?","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"For syntax issues - did you verify against current version docs?","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Remove any findings that are style preferences, not actual issues","type":"text"}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Step 8: Review Convergence","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Single-Pass Completeness","type":"text"}]},{"type":"paragraph","content":[{"text":"You MUST report ALL issues across ALL categories (style, logic, types, tests, security, performance) in a single review pass. Do not hold back issues for later rounds.","type":"text"}]},{"type":"paragraph","content":[{"text":"Before submitting findings, ask yourself:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"\"If all my recommended fixes are applied, will I find NEW issues in the fixed code?\"","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"\"Am I requesting new code (tests, types, modules) that will itself need review?\"","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"If yes to either: include those anticipated downstream issues NOW, in this review, so the author can address everything at once.","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Scope Rules","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Review ONLY the code in the diff and directly related existing code","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Do NOT request new features, test infrastructure, or architectural changes that didn't exist before the diff","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"If test coverage is missing, flag it as ONE Minor issue (\"Missing test coverage for X, Y, Z\") — do NOT specify implementation details like mock libraries, behaviour extraction, or dependency injection patterns that would introduce substantial new code","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Typespecs, documentation, and naming issues are Minor unless they affect public API contracts","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Do NOT request adding new dependencies (e.g. Mox, testing libraries, linter plugins)","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Fix Complexity Budget","type":"text"}]},{"type":"paragraph","content":[{"text":"Fixes to existing code should be flagged at their real severity regardless of size.","type":"text"}]},{"type":"paragraph","content":[{"text":"However, requests for ","type":"text"},{"text":"net-new code that didn't exist before the diff","type":"text","marks":[{"type":"strong"}]},{"text":" must be classified as Informational:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Adding a new dependency (e.g. Mox, a linter plugin)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Creating entirely new modules, files, or test suites","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Extracting new behaviours, protocols, or abstractions","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"These are improvement suggestions for the author to consider in future work, not review blockers.","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Iteration Policy","type":"text"}]},{"type":"paragraph","content":[{"text":"If this is a re-review after fixes were applied:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"ONLY verify that previously flagged issues were addressed correctly","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Do NOT introduce new findings unrelated to the previous review's issues","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Accept Minor/Nice-to-Have issues that weren't fixed — do not re-flag them","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"The goal of re-review is VERIFICATION, not discovery","type":"text"}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Output Format","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"markdown"},"content":[{"text":"## Review Summary\n\n[1-2 sentence overview of findings]\n\n## Issues\n\n### Critical (Blocking)\n\n1. [FILE:LINE] ISSUE_TITLE\n - Issue: Description of what's wrong\n - Why: Why this matters (crash, data loss, security, race condition)\n - Fix: Specific recommended fix\n\n### Major (Should Fix)\n\n2. [FILE:LINE] ISSUE_TITLE\n - Issue: ...\n - Why: ...\n - Fix: ...\n\n### Minor (Nice to Have)\n\n14. [FILE:LINE] ISSUE_TITLE\n - Issue: ...\n - Why: ...\n - Fix: ...\n\n### Informational (For Awareness)\n\n14. [FILE:LINE] SUGGESTION_TITLE\n - Suggestion: ...\n - Rationale: ...\n\n## Good Patterns\n\n- [FILE:LINE] Pattern description (preserve this)\n\n## Verdict\n\nReady: Yes | No | With fixes 1-N (Critical/Major only; Minor items are acceptable)\nRationale: [1-2 sentences]","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Post-Fix Verification","type":"text"}]},{"type":"paragraph","content":[{"text":"After fixes are applied, run:","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"# Swift build and lint\nswift build\nswiftlint lint --quiet\n\n# Run tests if present\nswift test","type":"text"}]},{"type":"paragraph","content":[{"text":"All checks must pass before approval.","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Rules","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Load skills BEFORE reviewing (not after)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Number every issue sequentially (1, 2, 3...)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Include FILE:LINE for each issue","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Separate Issue/Why/Fix clearly","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Categorize by actual severity","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Check for Swift 6 strict concurrency issues","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Run verification after fixes","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Report ALL issues in a single pass — do not hold back findings for later iterations","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Re-reviews verify previous fixes ONLY — no new discovery","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Requests for net-new code (new modules, dependencies, test suites) are Informational, not blocking","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"The Verdict ignores Minor and Informational items — only Critical and Major block approval","type":"text"}]}]}]},{"type":"hr","attrs":{"markup":"---"}}]},"metadata":{"date":"2026-06-05","name":"review-ios","author":"@skillopedia","source":{"stars":61,"repo_name":"beagle","origin_url":"https://github.com/existential-birds/beagle/blob/HEAD/plugins/beagle-ios/skills/review-ios/SKILL.md","repo_owner":"existential-birds","body_sha256":"7e4fb303183a2b40360d1892ce4252f0a5c351e5facab45fe81cae920cda5062","cluster_key":"3e88a3f74b6dd93e8f71935b4e5f8f6ad8778459eabdc46e2807e4b6ba79439c","clean_bundle":{"format":"clean-skill-bundle-v1","source":"existential-birds/beagle/plugins/beagle-ios/skills/review-ios/SKILL.md","bundle_sha256":"c7e8e1de34f747efbabd2bb972002745a0b59026b2649270b494819d3381febb","attachment_count":0,"text_attachments":0,"binary_attachments":0},"cluster_size":1,"skill_md_path":"plugins/beagle-ios/skills/review-ios/SKILL.md","import_metadata":{"date":"2026-06-05","author":"@skillopedia","version":"v1","category":"web-development","category_label":"Web"},"exact_dupes_collapsed_into_this":0},"version":"v1","category":"web-development","import_tag":"clean-skills-v1","description":"Comprehensive iOS/SwiftUI code review with optional parallel agents","disable-model-invocation":true}},"renderedAt":1782988177947}

iOS Code Review Arguments - : Spawn specialized subagents per technology area - Path: Target directory (default: current working directory) Hard gates Complete in order before writing Issues in the output (empty scope is allowed; fabricated findings are not). 1. Scope gate: You have an explicit list of paths under review (from Step 1 or a user-provided path). Pass: List captured in working notes or one line: — then stop with no Issues. 2. Linter gate (style): Step 2 commands ran for this tree; if no / , note that in one line. Pass: You do not report a style issue that SwiftLint would already…