@devo-bmad-custom/agent-orchestration 1.0.4 → 1.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (86) hide show
  1. package/package.json +1 -1
  2. package/src/.agents/skills/tmux-commands/SKILL.md +353 -0
  3. package/src/bmm/data/project-context-template.md +26 -26
  4. package/src/bmm/teams/default-party.csv +20 -20
  5. package/src/bmm/workflows/2-plan-workflows/create-prd/data/domain-complexity.csv +14 -14
  6. package/src/bmm/workflows/2-plan-workflows/create-prd/data/prd-purpose.md +197 -197
  7. package/src/bmm/workflows/2-plan-workflows/create-prd/data/project-types.csv +10 -10
  8. package/src/bmm/workflows/2-plan-workflows/create-prd/templates/prd-template.md +10 -10
  9. package/src/bmm/workflows/3-solutioning/create-architecture/data/domain-complexity.csv +12 -12
  10. package/src/bmm/workflows/4-implementation/code-review/instructions.xml +226 -226
  11. package/src/bmm/workflows/4-implementation/correct-course/checklist.md +288 -288
  12. package/src/bmm/workflows/4-implementation/correct-course/instructions.md +207 -207
  13. package/src/bmm/workflows/4-implementation/retrospective/instructions.md +1444 -1444
  14. package/src/bmm/workflows/4-implementation/sprint-planning/sprint-status-template.yaml +55 -55
  15. package/src/bmm/workflows/4-implementation/sprint-status/instructions.md +230 -230
  16. package/src/bmm/workflows/bmad-quick-flow/quick-spec/tech-spec-template.md +74 -74
  17. package/src/bmm/workflows/document-project/instructions.md +130 -130
  18. package/src/bmm/workflows/document-project/templates/project-scan-report-schema.json +160 -160
  19. package/src/bmm/workflows/document-project/workflows/deep-dive-instructions.md +298 -298
  20. package/src/bmm/workflows/document-project/workflows/deep-dive.yaml +31 -31
  21. package/src/bmm/workflows/document-project/workflows/full-scan-instructions.md +1106 -1106
  22. package/src/bmm/workflows/document-project/workflows/full-scan.yaml +31 -31
  23. package/src/bmm/workflows/qa-generate-e2e-tests/checklist.md +33 -33
  24. package/src/bmm/workflows/qa-generate-e2e-tests/instructions.md +110 -110
  25. package/src/core/agents/bmad-master.md +56 -56
  26. package/src/core/workflows/party-mode/steps/step-02-discussion-orchestration.md +187 -187
  27. package/src/core/workflows/party-mode/steps/step-03-graceful-exit.md +168 -168
  28. package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/vision-framework/SKILL.md +0 -475
  29. package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/vision-framework/references/vision-requests.md +0 -736
  30. package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/vision-framework/references/visionkit-scanner.md +0 -738
  31. package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/weatherkit/SKILL.md +0 -410
  32. package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/weatherkit/references/weatherkit-patterns.md +0 -567
  33. package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/widgetkit/SKILL.md +0 -497
  34. package/src/.agents/skills/ui-ux-pro-custom/data/swift-ios-skills/widgetkit/references/widgetkit-advanced.md +0 -871
  35. package/src/.agents/skills/ui-ux-pro-custom/data/typography.csv +0 -58
  36. package/src/.agents/skills/ui-ux-pro-custom/data/ui-reasoning.csv +0 -101
  37. package/src/.agents/skills/ui-ux-pro-custom/data/ux-guidelines.csv +0 -100
  38. package/src/.agents/skills/ui-ux-pro-custom/data/web-interface.csv +0 -31
  39. package/src/.agents/skills/ui-ux-pro-custom/scripts/core.py +0 -253
  40. package/src/.agents/skills/ui-ux-pro-custom/scripts/design_system.py +0 -1067
  41. package/src/.agents/skills/ui-ux-pro-custom/scripts/search.py +0 -114
  42. package/src/.agents/skills/ux-audit/SKILL.md +0 -151
  43. package/src/.agents/skills/websocket-engineer/SKILL.md +0 -168
  44. package/src/.agents/skills/websocket-engineer/references/alternatives.md +0 -391
  45. package/src/.agents/skills/websocket-engineer/references/patterns.md +0 -400
  46. package/src/.agents/skills/websocket-engineer/references/protocol.md +0 -195
  47. package/src/.agents/skills/websocket-engineer/references/scaling.md +0 -333
  48. package/src/.agents/skills/websocket-engineer/references/security.md +0 -474
  49. package/src/.agents/skills/writing-skills/SKILL.md +0 -655
  50. package/src/.agents/skills/writing-skills/anthropic-best-practices.md +0 -1150
  51. package/src/.agents/skills/writing-skills/examples/CLAUDE_MD_TESTING.md +0 -189
  52. package/src/.agents/skills/writing-skills/graphviz-conventions.dot +0 -172
  53. package/src/.agents/skills/writing-skills/persuasion-principles.md +0 -187
  54. package/src/.agents/skills/writing-skills/render-graphs.js +0 -168
  55. package/src/.agents/skills/writing-skills/testing-skills-with-subagents.md +0 -384
  56. package/src/.claude/commands/bmad-track-compact.md +0 -19
  57. package/src/.claude/commands/bmad-track-extended.md +0 -19
  58. package/src/.claude/commands/bmad-track-large.md +0 -19
  59. package/src/.claude/commands/bmad-track-medium.md +0 -19
  60. package/src/.claude/commands/bmad-track-nano.md +0 -19
  61. package/src/.claude/commands/bmad-track-rv.md +0 -18
  62. package/src/.claude/commands/bmad-track-small.md +0 -19
  63. package/src/.claude/commands/master-orchestrator.md +0 -15
  64. package/src/_memory/master-orchestrator-sidecar/docs-index.md +0 -3
  65. package/src/_memory/master-orchestrator-sidecar/instructions.md +0 -2616
  66. package/src/_memory/master-orchestrator-sidecar/memories.md +0 -8
  67. package/src/_memory/master-orchestrator-sidecar/session-state.md +0 -15
  68. package/src/_memory/master-orchestrator-sidecar/triage-history.md +0 -3
  69. package/src/_memory/master-orchestrator-sidecar/workflows-overview.html +0 -1230
  70. package/src/core/agents/master-orchestrator.md +0 -54
  71. package/src/docs/dev/tmux/actions_popup.py +0 -291
  72. package/src/docs/dev/tmux/actions_popup.sh +0 -110
  73. package/src/docs/dev/tmux/claude_usage.sh +0 -15
  74. package/src/docs/dev/tmux/colors.conf +0 -26
  75. package/src/docs/dev/tmux/cpu_usage.sh +0 -7
  76. package/src/docs/dev/tmux/dispatch.sh +0 -10
  77. package/src/docs/dev/tmux/float_init.sh +0 -13
  78. package/src/docs/dev/tmux/float_term.sh +0 -23
  79. package/src/docs/dev/tmux/open_clip.sh +0 -14
  80. package/src/docs/dev/tmux/paste_clipboard.sh +0 -13
  81. package/src/docs/dev/tmux/paste_image_wrapper.sh +0 -94
  82. package/src/docs/dev/tmux/ram_usage.sh +0 -3
  83. package/src/docs/dev/tmux/title_sync.sh +0 -54
  84. package/src/docs/dev/tmux/tmux-setup.md +0 -867
  85. package/src/docs/dev/tmux/tmux.conf +0 -127
  86. package/src/docs/dev/tmux/xclip +0 -18
@@ -1,475 +0,0 @@
1
- ---
2
- name: vision-framework
3
- description: "Implement computer vision features including text recognition (OCR), face detection, barcode scanning, image segmentation, object tracking, and document scanning in iOS apps. Covers both the modern Swift-native Vision API (iOS 16+) and legacy VNRequest patterns, VisionKit DataScannerViewController for live camera scanning, and VNCoreMLRequest for custom model inference. Use when adding OCR, barcode scanning, face detection, or custom Core ML model inference with Vision."
4
- ---
5
-
6
- # Vision Framework
7
-
8
- Detect text, faces, barcodes, objects, and body poses in images and video using
9
- on-device computer vision. Patterns target iOS 26+ with Swift 6.2,
10
- backward-compatible where noted.
11
-
12
- See `references/vision-requests.md` for complete code patterns and
13
- `references/visionkit-scanner.md` for DataScannerViewController integration.
14
-
15
- ## Contents
16
-
17
- - [Two API Generations](#two-api-generations)
18
- - [Request Pattern (Modern API)](#request-pattern-modern-api)
19
- - [Text Recognition (OCR)](#text-recognition-ocr)
20
- - [Face Detection](#face-detection)
21
- - [Barcode Detection](#barcode-detection)
22
- - [Document Scanning (iOS 26+)](#document-scanning-ios-26)
23
- - [Image Segmentation](#image-segmentation)
24
- - [Object Tracking](#object-tracking)
25
- - [Other Request Types](#other-request-types)
26
- - [Core ML Integration](#core-ml-integration)
27
- - [VisionKit: DataScannerViewController](#visionkit-datascannerviewcontroller)
28
- - [Common Mistakes](#common-mistakes)
29
- - [Review Checklist](#review-checklist)
30
- - [References](#references)
31
-
32
- ## Two API Generations
33
-
34
- Vision has two distinct API layers. Prefer the modern API for new code.
35
-
36
- | Aspect | Modern (iOS 18+) | Legacy |
37
- |---|---|---|
38
- | Pattern | `let result = try await request.perform(on: image)` | `VNImageRequestHandler` + completion handler |
39
- | Request types | Swift types — structs and classes (`RecognizeTextRequest`, `DetectFaceRectanglesRequest`) | ObjC classes (`VNRecognizeTextRequest`, `VNDetectFaceRectanglesRequest`) |
40
- | Concurrency | Native async/await | Completion handlers or synchronous `perform` |
41
- | Observations | Typed return values | Cast `results` from `[Any]` |
42
- | Availability | iOS 18+ / macOS 15+ | iOS 11+ |
43
-
44
- The modern API uses the `ImageProcessingRequest` protocol. Each request type
45
- has a `perform(on:orientation:)` method that accepts `CGImage`, `CIImage`,
46
- `CVPixelBuffer`, `CMSampleBuffer`, `Data`, or `URL`. Most requests are
47
- structs; stateful requests for video tracking (e.g., `TrackObjectRequest`,
48
- `TrackRectangleRequest`, `DetectTrajectoriesRequest`) are final classes.
49
-
50
- ## Request Pattern (Modern API)
51
-
52
- All modern Vision requests follow the same pattern: create a request struct,
53
- call `perform(on:)`, and handle the typed result.
54
-
55
- ```swift
56
- import Vision
57
-
58
- func recognizeText(in image: CGImage) async throws -> [String] {
59
- var request = RecognizeTextRequest()
60
- request.recognitionLevel = .accurate
61
- request.recognitionLanguages = [Locale.Language(identifier: "en-US")]
62
-
63
- let observations = try await request.perform(on: image)
64
- return observations.compactMap { observation in
65
- observation.topCandidates(1).first?.string
66
- }
67
- }
68
- ```
69
-
70
- ### Legacy Pattern (Pre-iOS 18)
71
-
72
- Use `VNImageRequestHandler` with completion-based requests when targeting
73
- older deployment versions.
74
-
75
- ```swift
76
- import Vision
77
-
78
- func recognizeTextLegacy(in image: CGImage) throws -> [String] {
79
- var recognized: [String] = []
80
- let request = VNRecognizeTextRequest { request, error in
81
- guard let observations = request.results as? [VNRecognizedTextObservation] else { return }
82
- recognized = observations.compactMap { $0.topCandidates(1).first?.string }
83
- }
84
- request.recognitionLevel = .accurate
85
-
86
- let handler = VNImageRequestHandler(cgImage: image)
87
- try handler.perform([request])
88
- return recognized
89
- }
90
- ```
91
-
92
- ## Text Recognition (OCR)
93
-
94
- ### Modern: RecognizeTextRequest (iOS 18+)
95
-
96
- ```swift
97
- var request = RecognizeTextRequest()
98
- request.recognitionLevel = .accurate // .fast for real-time
99
- request.recognitionLanguages = [
100
- Locale.Language(identifier: "en-US"),
101
- Locale.Language(identifier: "fr-FR"),
102
- ]
103
- request.usesLanguageCorrection = true
104
- request.customWords = ["SwiftUI", "Xcode"] // domain-specific terms
105
-
106
- let observations = try await request.perform(on: cgImage)
107
- for observation in observations {
108
- guard let candidate = observation.topCandidates(1).first else { continue }
109
- let text = candidate.string
110
- let confidence = candidate.confidence // 0.0 ... 1.0
111
- let bounds = observation.boundingBox // normalized coordinates
112
- }
113
- ```
114
-
115
- ### Legacy: VNRecognizeTextRequest
116
-
117
- ```swift
118
- let request = VNRecognizeTextRequest()
119
- request.recognitionLevel = .accurate
120
- request.recognitionLanguages = ["en-US", "fr-FR"]
121
- request.usesLanguageCorrection = true
122
- ```
123
-
124
- **Key differences:** Modern API uses `Locale.Language` for languages; legacy
125
- uses string identifiers. Both support `.accurate` (best quality) and `.fast`
126
- (real-time suitable) recognition levels.
127
-
128
- ## Face Detection
129
-
130
- Detect face rectangles, landmarks (eyes, nose, mouth), and capture quality.
131
-
132
- ```swift
133
- // Modern API
134
- let faceRequest = DetectFaceRectanglesRequest()
135
- let faces = try await faceRequest.perform(on: cgImage)
136
-
137
- for face in faces {
138
- let boundingBox = face.boundingBox // normalized CGRect
139
- let roll = face.roll // Measurement<UnitAngle>
140
- let yaw = face.yaw // Measurement<UnitAngle>
141
- }
142
-
143
- // Landmarks (eyes, nose, mouth contours)
144
- var landmarkRequest = DetectFaceLandmarksRequest()
145
- let landmarkFaces = try await landmarkRequest.perform(on: cgImage)
146
- for face in landmarkFaces {
147
- let landmarks = face.landmarks
148
- let leftEye = landmarks?.leftEye?.normalizedPoints
149
- let nose = landmarks?.nose?.normalizedPoints
150
- }
151
- ```
152
-
153
- ### Coordinate System
154
-
155
- Vision uses a normalized coordinate system with origin at the bottom-left.
156
- Convert to UIKit (top-left origin) before display:
157
-
158
- ```swift
159
- func convertToUIKit(_ rect: CGRect, imageHeight: CGFloat) -> CGRect {
160
- CGRect(
161
- x: rect.origin.x,
162
- y: imageHeight - rect.origin.y - rect.height,
163
- width: rect.width,
164
- height: rect.height
165
- )
166
- }
167
- ```
168
-
169
- ## Barcode Detection
170
-
171
- Detect 1D and 2D barcodes including QR codes.
172
-
173
- ```swift
174
- var request = DetectBarcodesRequest()
175
- request.symbologies = [.qr, .ean13, .code128, .pdf417]
176
-
177
- let barcodes = try await request.perform(on: cgImage)
178
- for barcode in barcodes {
179
- let payload = barcode.payloadString // decoded content
180
- let symbology = barcode.symbology // .qr, .ean13, etc.
181
- let bounds = barcode.boundingBox // normalized rect
182
- }
183
- ```
184
-
185
- Common symbologies: `.qr`, `.aztec`, `.pdf417`, `.dataMatrix`, `.ean8`,
186
- `.ean13`, `.code39`, `.code128`, `.upce`, `.itf14`.
187
-
188
- ## Document Scanning (iOS 26+)
189
-
190
- `RecognizeDocumentsRequest` provides structured document reading with layout
191
- understanding beyond basic OCR. Returns `DocumentObservation` objects with a
192
- nested `Container` structure for paragraphs, tables, lists, and barcodes.
193
-
194
- ```swift
195
- var request = RecognizeDocumentsRequest()
196
- let documents = try await request.perform(on: cgImage)
197
-
198
- for observation in documents {
199
- let container = observation.document
200
-
201
- // Full text content
202
- let fullText = container.text
203
-
204
- // Structured access to paragraphs
205
- for paragraph in container.paragraphs {
206
- let paragraphText = paragraph.text
207
- }
208
-
209
- // Tables and lists
210
- for table in container.tables { /* structured table data */ }
211
- for list in container.lists { /* structured list data */ }
212
-
213
- // Embedded barcodes detected within the document
214
- for barcode in container.barcodes { /* barcode data */ }
215
-
216
- // Document title if detected
217
- if let title = container.title { print(title) }
218
- }
219
- ```
220
-
221
- For simpler document camera scanning, use VisionKit's
222
- `VNDocumentCameraViewController` which provides a full-screen camera UI with
223
- auto-capture, perspective correction, and multi-page scanning.
224
-
225
- ## Image Segmentation
226
-
227
- ### Modern: GeneratePersonSegmentationRequest (iOS 18+)
228
-
229
- ```swift
230
- var request = GeneratePersonSegmentationRequest()
231
- request.qualityLevel = .accurate // .balanced, .fast
232
-
233
- let mask = try await request.perform(on: cgImage)
234
- // mask is a PersonSegmentationObservation with a pixelBuffer property
235
- let maskBuffer = mask.pixelBuffer
236
- // Apply mask using Core Image: CIFilter.blendWithMask()
237
- ```
238
-
239
- ### Legacy: VNGeneratePersonSegmentationRequest
240
-
241
- ```swift
242
- let request = VNGeneratePersonSegmentationRequest()
243
- request.qualityLevel = .accurate // .balanced, .fast
244
- request.outputPixelFormat = kCVPixelFormatType_OneComponent8
245
-
246
- let handler = VNImageRequestHandler(cgImage: cgImage)
247
- try handler.perform([request])
248
-
249
- guard let mask = request.results?.first?.pixelBuffer else { return }
250
- // Apply mask using Core Image: CIFilter.blendWithMask()
251
- ```
252
-
253
- Quality levels:
254
- - `.accurate` -- best quality, slowest (~1s), full resolution
255
- - `.balanced` -- good quality, moderate speed (~100ms), 960x540
256
- - `.fast` -- lowest quality, fastest (~10ms), 256x144, suitable for real-time
257
-
258
- ### Instance Segmentation (iOS 18+)
259
-
260
- Separate masks per person for individual effects.
261
-
262
- ```swift
263
- // Modern API (iOS 18+)
264
- let request = GeneratePersonInstanceMaskRequest()
265
- let observation = try await request.perform(on: cgImage)
266
- let indices = observation.allInstances
267
-
268
- for index in indices {
269
- let mask = try observation.generateMask(forInstances: IndexSet(integer: index))
270
- // mask is a CVPixelBuffer with only this person visible
271
- }
272
- ```
273
-
274
- ```swift
275
- // Legacy API (iOS 17+)
276
- let request = VNGeneratePersonInstanceMaskRequest()
277
- let handler = VNImageRequestHandler(cgImage: cgImage)
278
- try handler.perform([request])
279
-
280
- guard let result = request.results?.first else { return }
281
- let indices = result.allInstances
282
- for index in indices {
283
- let instanceMask = try result.generateMaskedImage(
284
- ofInstances: IndexSet(integer: index),
285
- from: handler,
286
- croppedToInstancesExtent: false
287
- )
288
- }
289
- ```
290
-
291
- See `references/vision-requests.md` for mask composition and Core Image filter
292
- integration patterns.
293
-
294
- ## Object Tracking
295
-
296
- ### Modern: TrackObjectRequest (iOS 18+)
297
-
298
- `TrackObjectRequest` is a stateful request that maintains tracking context
299
- across frames. Conforms to both `ImageProcessingRequest` and `StatefulRequest`.
300
-
301
- ```swift
302
- // Initialize with a detected object's bounding box
303
- let initialObservation = DetectedObjectObservation(boundingBox: detectedRect)
304
- var request = TrackObjectRequest(observation: initialObservation)
305
- request.trackingLevel = .accurate
306
-
307
- // For each video frame:
308
- let results = try await request.perform(on: pixelBuffer)
309
- if let tracked = results.first {
310
- let updatedBounds = tracked.boundingBox
311
- let confidence = tracked.confidence
312
- }
313
- ```
314
-
315
- ### Legacy: VNTrackObjectRequest
316
-
317
- ```swift
318
- let trackRequest = VNTrackObjectRequest(detectedObjectObservation: initialObservation)
319
- trackRequest.trackingLevel = .accurate
320
-
321
- let sequenceHandler = VNSequenceRequestHandler()
322
- // For each frame:
323
- try sequenceHandler.perform([trackRequest], on: pixelBuffer)
324
- if let result = trackRequest.results?.first {
325
- let updatedBounds = result.boundingBox
326
- trackRequest.inputObservation = result
327
- }
328
- ```
329
-
330
- ## Other Request Types
331
-
332
- Vision provides additional requests covered in `references/vision-requests.md`:
333
-
334
- | Request | Purpose |
335
- |---|---|
336
- | `ClassifyImageRequest` | Classify scene content (outdoor, food, animal, etc.) |
337
- | `GenerateAttentionBasedSaliencyImageRequest` | Heat map of where viewers focus attention |
338
- | `GenerateObjectnessBasedSaliencyImageRequest` | Heat map of object-like regions |
339
- | `GenerateForegroundInstanceMaskRequest` | Foreground object segmentation (not person-specific) |
340
- | `DetectRectanglesRequest` | Detect rectangular shapes (documents, cards, screens) |
341
- | `DetectHorizonRequest` | Detect horizon angle for auto-leveling photos |
342
- | `DetectHumanBodyPoseRequest` | Detect body joints (shoulders, elbows, knees) |
343
- | `DetectHumanBodyPose3DRequest` | 3D human body pose estimation |
344
- | `DetectHumanHandPoseRequest` | Detect hand joints and finger positions |
345
- | `DetectAnimalBodyPoseRequest` | Detect animal body joint positions |
346
- | `DetectFaceCaptureQualityRequest` | Face capture quality scoring (0–1) for photo selection |
347
- | `TrackRectangleRequest` | Track rectangular objects across video frames |
348
- | `TrackOpticalFlowRequest` | Optical flow between video frames |
349
- | `DetectTrajectoriesRequest` | Detect object trajectories in video |
350
-
351
- All modern request types above are iOS 18+ / macOS 15+.
352
-
353
- ## Core ML Integration
354
-
355
- Run custom Core ML models through Vision for automatic image preprocessing
356
- (resizing, normalization, color space conversion).
357
-
358
- ```swift
359
- // Modern API (iOS 18+)
360
- let model = try MLModel(contentsOf: modelURL)
361
- let request = CoreMLRequest(model: .init(model))
362
- let results = try await request.perform(on: cgImage)
363
-
364
- // Classification model
365
- if let classification = results.first as? ClassificationObservation {
366
- let label = classification.identifier
367
- let confidence = classification.confidence
368
- }
369
- ```
370
-
371
- ```swift
372
- // Legacy API
373
- let vnModel = try VNCoreMLModel(for: model)
374
- let request = VNCoreMLRequest(model: vnModel) { request, error in
375
- guard let results = request.results as? [VNClassificationObservation] else { return }
376
- let topResult = results.first
377
- }
378
- let handler = VNImageRequestHandler(cgImage: cgImage)
379
- try handler.perform([request])
380
- ```
381
-
382
- For model conversion and optimization, see the `coreml` skill.
383
-
384
- ## VisionKit: DataScannerViewController
385
-
386
- `DataScannerViewController` provides a full-screen live camera scanner for text
387
- and barcodes. See `references/visionkit-scanner.md` for complete patterns.
388
-
389
- ### Quick Start
390
-
391
- ```swift
392
- import VisionKit
393
-
394
- // Check availability (requires A12+ chip and camera)
395
- guard DataScannerViewController.isSupported,
396
- DataScannerViewController.isAvailable else { return }
397
-
398
- let scanner = DataScannerViewController(
399
- recognizedDataTypes: [
400
- .text(languages: ["en"]),
401
- .barcode(symbologies: [.qr, .ean13])
402
- ],
403
- qualityLevel: .balanced,
404
- recognizesMultipleItems: true,
405
- isHighFrameRateTrackingEnabled: true,
406
- isHighlightingEnabled: true
407
- )
408
- scanner.delegate = self
409
- present(scanner, animated: true) {
410
- try? scanner.startScanning()
411
- }
412
- ```
413
-
414
- ### SwiftUI Integration
415
-
416
- Wrap `DataScannerViewController` in `UIViewControllerRepresentable`. See
417
- `references/visionkit-scanner.md` for the full implementation.
418
-
419
- ## Common Mistakes
420
-
421
- **DON'T:** Use the legacy `VNImageRequestHandler` API for new iOS 18+ projects.
422
- **DO:** Use modern struct-based requests with `perform(on:)` and async/await.
423
- **Why:** Modern API provides type safety, better Swift concurrency support, and cleaner error handling.
424
-
425
- **DON'T:** Forget to convert normalized coordinates before drawing bounding boxes.
426
- **DO:** Use `VNImageRectForNormalizedRect(_:_:_:)` or manual conversion from bottom-left origin to UIKit top-left origin.
427
- **Why:** Vision uses normalized coordinates (0...1) with bottom-left origin; UIKit uses points with top-left origin.
428
-
429
- **DON'T:** Run Vision requests on the main thread.
430
- **DO:** Perform requests on a background thread or use async/await from a detached task.
431
- **Why:** Image analysis is CPU/GPU-intensive and blocks the UI if run on the main actor.
432
-
433
- **DON'T:** Use `.accurate` recognition level for real-time camera feeds.
434
- **DO:** Use `.fast` for live video, `.accurate` for still images or offline processing.
435
- **Why:** Accurate recognition is too slow for 30fps video; fast recognition trades quality for speed.
436
-
437
- **DON'T:** Ignore the `confidence` score on observations.
438
- **DO:** Filter results by confidence threshold (e.g., > 0.5) appropriate for your use case.
439
- **Why:** Low-confidence results are often incorrect and degrade user experience.
440
-
441
- **DON'T:** Create a new `VNImageRequestHandler` for each frame when tracking objects.
442
- **DO:** Use `VNSequenceRequestHandler` for video frame sequences.
443
- **Why:** Sequence handler maintains temporal context for tracking; per-frame handlers lose state.
444
-
445
- **DON'T:** Request all barcode symbologies when you only need QR codes.
446
- **DO:** Specify only the symbologies you need in the request.
447
- **Why:** Fewer symbologies means faster detection and fewer false positives.
448
-
449
- **DON'T:** Assume `DataScannerViewController` is available on all devices.
450
- **DO:** Check both `isSupported` (hardware) and `isAvailable` (user permissions) before presenting.
451
- **Why:** Requires A12+ chip; `isAvailable` also checks camera access authorization.
452
-
453
- ## Review Checklist
454
-
455
- - [ ] Uses modern Vision API (iOS 18+) unless targeting older deployments
456
- - [ ] Vision requests run off the main thread (async/await or background queue)
457
- - [ ] Normalized coordinates converted before UI display
458
- - [ ] Confidence threshold applied to filter low-quality observations
459
- - [ ] Recognition level matches use case (`.fast` for video, `.accurate` for stills)
460
- - [ ] Language hints set for text recognition when input language is known
461
- - [ ] Barcode symbologies limited to only those needed
462
- - [ ] `DataScannerViewController` availability checked before presentation
463
- - [ ] Camera usage description (`NSCameraUsageDescription`) in Info.plist for VisionKit
464
- - [ ] Person segmentation quality level appropriate for use case
465
- - [ ] `VNSequenceRequestHandler` used for video frame tracking (not per-frame handler)
466
- - [ ] Error handling covers request failures and empty results
467
-
468
- ## References
469
-
470
- - Vision request patterns: `references/vision-requests.md`
471
- - VisionKit scanner integration: `references/visionkit-scanner.md`
472
- - Apple docs: [Vision](https://sosumi.ai/documentation/vision) |
473
- [VisionKit](https://sosumi.ai/documentation/visionkit) |
474
- [RecognizeTextRequest](https://sosumi.ai/documentation/vision/recognizetextrequest) |
475
- [DataScannerViewController](https://sosumi.ai/documentation/visionkit/datascannerviewcontroller)