@mmerterden/multi-agent-pipeline 20.7.0 → 20.8.0
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.
- package/CHANGELOG.md +9 -0
- package/LICENSE +0 -10
- package/docs/facts.json +1 -1
- package/manifest.json +266 -267
- package/package.json +2 -2
- package/pipeline/scripts/_notices.mjs +1 -1
- package/pipeline/skills/.skill-manifest.json +68 -68
- package/pipeline/skills/shared/README.md +70 -70
- package/pipeline/skills/shared/external/alarmkit/SKILL.md +373 -381
- package/pipeline/skills/shared/external/alarmkit/evals/evals.json +23 -18
- package/pipeline/skills/shared/external/alarmkit/references/alarmkit-patterns.md +328 -378
- package/pipeline/skills/shared/external/app-clips/SKILL.md +260 -160
- package/pipeline/skills/shared/external/app-clips/evals/evals.json +27 -27
- package/pipeline/skills/shared/external/app-clips/references/data-handoff-notifications-location.md +150 -83
- package/pipeline/skills/shared/external/app-clips/references/routing-and-experiences.md +135 -83
- package/pipeline/skills/shared/external/app-clips/references/size-capabilities-and-promotion.md +143 -85
- package/pipeline/skills/shared/external/app-intents/SKILL.md +302 -304
- package/pipeline/skills/shared/external/app-intents/evals/evals.json +21 -21
- package/pipeline/skills/shared/external/app-intents/references/appintents-advanced.md +594 -894
- package/pipeline/skills/shared/external/app-store-optimization/SKILL.md +339 -277
- package/pipeline/skills/shared/external/app-store-optimization/evals/evals.json +27 -23
- package/pipeline/skills/shared/external/app-store-optimization/references/keyword-research-methodology.md +105 -122
- package/pipeline/skills/shared/external/app-store-optimization/references/product-page-variants.md +143 -166
- package/pipeline/skills/shared/external/app-store-review/SKILL.md +307 -326
- package/pipeline/skills/shared/external/app-store-review/evals/evals.json +21 -21
- package/pipeline/skills/shared/external/app-store-review/references/privacy-manifest.md +105 -67
- package/pipeline/skills/shared/external/app-store-review/references/review-checklists.md +114 -101
- package/pipeline/skills/shared/external/apple-on-device-ai/SKILL.md +333 -360
- package/pipeline/skills/shared/external/apple-on-device-ai/evals/evals.json +24 -27
- package/pipeline/skills/shared/external/apple-on-device-ai/references/coreml-conversion.md +215 -322
- package/pipeline/skills/shared/external/apple-on-device-ai/references/coreml-optimization.md +161 -256
- package/pipeline/skills/shared/external/apple-on-device-ai/references/foundation-models.md +277 -387
- package/pipeline/skills/shared/external/apple-on-device-ai/references/mlx-swift.md +196 -210
- package/pipeline/skills/shared/external/authentication/SKILL.md +265 -381
- package/pipeline/skills/shared/external/authentication/evals/evals.json +25 -25
- package/pipeline/skills/shared/external/authentication/references/keychain-biometric.md +133 -178
- package/pipeline/skills/shared/external/authentication/references/passkeys.md +111 -147
- package/pipeline/skills/shared/external/avkit/SKILL.md +267 -364
- package/pipeline/skills/shared/external/avkit/evals/evals.json +26 -26
- package/pipeline/skills/shared/external/avkit/references/avkit-patterns.md +375 -493
- package/pipeline/skills/shared/external/background-processing/SKILL.md +270 -382
- package/pipeline/skills/shared/external/background-processing/evals/evals.json +22 -22
- package/pipeline/skills/shared/external/background-processing/references/background-task-patterns.md +169 -317
- package/pipeline/skills/shared/external/callkit-voip/SKILL.md +290 -371
- package/pipeline/skills/shared/external/callkit-voip/evals/evals.json +24 -24
- package/pipeline/skills/shared/external/callkit-voip/references/callkit-patterns.md +175 -343
- package/pipeline/skills/shared/external/cloudkit-sync/SKILL.md +292 -381
- package/pipeline/skills/shared/external/cloudkit-sync/evals/evals.json +33 -30
- package/pipeline/skills/shared/external/cloudkit-sync/references/cloudkit-patterns.md +227 -355
- package/pipeline/skills/shared/external/contacts-framework/SKILL.md +197 -346
- package/pipeline/skills/shared/external/contacts-framework/evals/evals.json +19 -21
- package/pipeline/skills/shared/external/contacts-framework/references/contacts-patterns.md +169 -308
- package/pipeline/skills/shared/external/core-bluetooth/SKILL.md +226 -376
- package/pipeline/skills/shared/external/core-bluetooth/evals/evals.json +25 -22
- package/pipeline/skills/shared/external/core-bluetooth/references/ble-patterns.md +257 -337
- package/pipeline/skills/shared/external/core-data/SKILL.md +292 -368
- package/pipeline/skills/shared/external/core-data/evals/evals.json +30 -27
- package/pipeline/skills/shared/external/core-motion/SKILL.md +235 -324
- package/pipeline/skills/shared/external/core-motion/evals/evals.json +31 -27
- package/pipeline/skills/shared/external/core-motion/references/motion-patterns.md +210 -310
- package/pipeline/skills/shared/external/core-nfc/SKILL.md +292 -366
- package/pipeline/skills/shared/external/core-nfc/evals/evals.json +22 -24
- package/pipeline/skills/shared/external/core-nfc/references/nfc-patterns.md +233 -329
- package/pipeline/skills/shared/external/coreml/SKILL.md +323 -367
- package/pipeline/skills/shared/external/coreml/evals/evals.json +24 -21
- package/pipeline/skills/shared/external/coreml/references/coreml-swift-integration.md +562 -565
- package/pipeline/skills/shared/external/cryptokit/SKILL.md +253 -394
- package/pipeline/skills/shared/external/cryptokit/evals/evals.json +20 -18
- package/pipeline/skills/shared/external/cryptokit/references/cryptokit-patterns.md +299 -488
- package/pipeline/skills/shared/external/debugging-instruments/SKILL.md +270 -323
- package/pipeline/skills/shared/external/debugging-instruments/evals/evals.json +27 -30
- package/pipeline/skills/shared/external/debugging-instruments/references/instruments-guide.md +167 -315
- package/pipeline/skills/shared/external/debugging-instruments/references/lldb-patterns.md +140 -193
- package/pipeline/skills/shared/external/device-integrity/SKILL.md +230 -353
- package/pipeline/skills/shared/external/device-integrity/evals/evals.json +25 -21
- package/pipeline/skills/shared/external/device-integrity/references/device-integrity-patterns.md +159 -197
- package/pipeline/skills/shared/external/energykit/SKILL.md +225 -392
- package/pipeline/skills/shared/external/energykit/evals/evals.json +29 -28
- package/pipeline/skills/shared/external/energykit/references/energykit-patterns.md +174 -470
- package/pipeline/skills/shared/external/eventkit-calendar/SKILL.md +261 -383
- package/pipeline/skills/shared/external/eventkit-calendar/evals/evals.json +25 -22
- package/pipeline/skills/shared/external/eventkit-calendar/references/eventkit-patterns.md +165 -268
- package/pipeline/skills/shared/external/healthkit/SKILL.md +252 -303
- package/pipeline/skills/shared/external/healthkit/evals/evals.json +24 -23
- package/pipeline/skills/shared/external/healthkit/references/healthkit-patterns.md +369 -523
- package/pipeline/skills/shared/external/homekit-matter/SKILL.md +233 -348
- package/pipeline/skills/shared/external/homekit-matter/evals/evals.json +27 -22
- package/pipeline/skills/shared/external/homekit-matter/references/matter-commissioning.md +199 -305
- package/pipeline/skills/shared/external/ios-accessibility/SKILL.md +368 -340
- package/pipeline/skills/shared/external/ios-accessibility/evals/evals.json +28 -27
- package/pipeline/skills/shared/external/ios-accessibility/references/a11y-patterns.md +314 -260
- package/pipeline/skills/shared/external/ios-accessibility/references/media-accessibility.md +97 -67
- package/pipeline/skills/shared/external/ios-accessibility/references/nutrition-labels.md +165 -101
- package/pipeline/skills/shared/external/ios-localization/SKILL.md +258 -371
- package/pipeline/skills/shared/external/ios-localization/evals/evals.json +23 -23
- package/pipeline/skills/shared/external/ios-localization/references/formatstyle-locale.md +283 -491
- package/pipeline/skills/shared/external/ios-localization/references/string-catalogs.md +313 -440
- package/pipeline/skills/shared/external/ios-networking/SKILL.md +265 -341
- package/pipeline/skills/shared/external/ios-networking/evals/evals.json +24 -24
- package/pipeline/skills/shared/external/ios-networking/references/background-websocket.md +425 -652
- package/pipeline/skills/shared/external/ios-networking/references/file-storage-patterns.md +143 -285
- package/pipeline/skills/shared/external/ios-networking/references/lightweight-clients.md +93 -53
- package/pipeline/skills/shared/external/ios-networking/references/network-framework.md +231 -456
- package/pipeline/skills/shared/external/ios-networking/references/urlsession-patterns.md +517 -784
- package/pipeline/skills/shared/external/ios-simulator/SKILL.md +265 -393
- package/pipeline/skills/shared/external/ios-simulator/evals/evals.json +21 -21
- package/pipeline/skills/shared/external/ios-simulator/references/simctl-commands.md +177 -270
- package/pipeline/skills/shared/external/live-activities/SKILL.md +318 -360
- package/pipeline/skills/shared/external/live-activities/evals/evals.json +21 -21
- package/pipeline/skills/shared/external/live-activities/references/activitykit-patterns.md +478 -710
- package/pipeline/skills/shared/external/mapkit-location/SKILL.md +295 -267
- package/pipeline/skills/shared/external/mapkit-location/evals/evals.json +28 -24
- package/pipeline/skills/shared/external/mapkit-location/references/mapkit-corelocation-patterns.md +378 -532
- package/pipeline/skills/shared/external/mapkit-location/references/mapkit-patterns.md +397 -499
- package/pipeline/skills/shared/external/metrickit-diagnostics/SKILL.md +165 -348
- package/pipeline/skills/shared/external/metrickit-diagnostics/evals/evals.json +26 -23
- package/pipeline/skills/shared/external/metrickit-diagnostics/references/metrickit-patterns.md +123 -130
- package/pipeline/skills/shared/external/musickit-audio/SKILL.md +189 -315
- package/pipeline/skills/shared/external/musickit-audio/evals/evals.json +22 -21
- package/pipeline/skills/shared/external/musickit-audio/references/musickit-patterns.md +181 -270
- package/pipeline/skills/shared/external/natural-language/SKILL.md +188 -340
- package/pipeline/skills/shared/external/natural-language/evals/evals.json +21 -21
- package/pipeline/skills/shared/external/natural-language/references/translation-patterns.md +171 -225
- package/pipeline/skills/shared/external/passkit-wallet/SKILL.md +258 -392
- package/pipeline/skills/shared/external/passkit-wallet/evals/evals.json +30 -29
- package/pipeline/skills/shared/external/passkit-wallet/references/wallet-passes.md +164 -231
- package/pipeline/skills/shared/external/pdfkit/SKILL.md +312 -344
- package/pipeline/skills/shared/external/pdfkit/evals/evals.json +19 -19
- package/pipeline/skills/shared/external/pdfkit/references/pdfkit-patterns.md +413 -624
- package/pipeline/skills/shared/external/pencilkit-drawing/SKILL.md +242 -358
- package/pipeline/skills/shared/external/pencilkit-drawing/evals/evals.json +25 -21
- package/pipeline/skills/shared/external/pencilkit-drawing/references/pencilkit-patterns.md +161 -226
- package/pipeline/skills/shared/external/permissionkit/SKILL.md +282 -400
- package/pipeline/skills/shared/external/permissionkit/evals/evals.json +27 -30
- package/pipeline/skills/shared/external/permissionkit/references/permissionkit-patterns.md +237 -350
- package/pipeline/skills/shared/external/photos-camera-media/SKILL.md +276 -325
- package/pipeline/skills/shared/external/photos-camera-media/references/av-playback.md +299 -545
- package/pipeline/skills/shared/external/photos-camera-media/references/camera-capture.md +344 -588
- package/pipeline/skills/shared/external/photos-camera-media/references/image-loading-caching.md +316 -660
- package/pipeline/skills/shared/external/photos-camera-media/references/photokit-patterns.md +270 -416
- package/pipeline/skills/shared/external/push-notifications/SKILL.md +312 -340
- package/pipeline/skills/shared/external/push-notifications/evals/evals.json +27 -26
- package/pipeline/skills/shared/external/push-notifications/references/notification-patterns.md +328 -485
- package/pipeline/skills/shared/external/push-notifications/references/rich-notifications.md +327 -560
- package/pipeline/skills/shared/external/realitykit-ar/SKILL.md +218 -410
- package/pipeline/skills/shared/external/realitykit-ar/evals/evals.json +24 -27
- package/pipeline/skills/shared/external/realitykit-ar/references/realitykit-patterns.md +221 -348
- package/pipeline/skills/shared/external/shareplay-activities/SKILL.md +222 -393
- package/pipeline/skills/shared/external/shareplay-activities/evals/evals.json +23 -24
- package/pipeline/skills/shared/external/shareplay-activities/references/shareplay-patterns.md +280 -420
- package/pipeline/skills/shared/external/speech-recognition/SKILL.md +217 -421
- package/pipeline/skills/shared/external/speech-recognition/evals/evals.json +23 -26
- package/pipeline/skills/shared/external/speech-recognition/references/speechanalyzer-patterns.md +133 -125
- package/pipeline/skills/shared/external/storekit/SKILL.md +228 -204
- package/pipeline/skills/shared/external/storekit/evals/evals.json +27 -24
- package/pipeline/skills/shared/external/storekit/references/app-review-guidelines.md +98 -109
- package/pipeline/skills/shared/external/storekit/references/core-patterns.md +298 -242
- package/pipeline/skills/shared/external/storekit/references/storekit-advanced.md +356 -649
- package/pipeline/skills/shared/external/swift-api-design-guidelines/SKILL.md +274 -399
- package/pipeline/skills/shared/external/swift-api-design-guidelines/evals/evals.json +22 -24
- package/pipeline/skills/shared/external/swift-api-design-guidelines/references/argument-labels-and-parameters.md +107 -108
- package/pipeline/skills/shared/external/swift-api-design-guidelines/references/conventions-and-special-rules.md +93 -165
- package/pipeline/skills/shared/external/swift-api-design-guidelines/references/naming-and-clarity.md +99 -137
- package/pipeline/skills/shared/external/swift-api-design-guidelines/references/side-effects-and-mutating-pairs.md +77 -120
- package/pipeline/skills/shared/external/swift-architecture/SKILL.md +334 -350
- package/pipeline/skills/shared/external/swift-architecture/evals/evals.json +22 -22
- package/pipeline/skills/shared/external/swift-charts/SKILL.md +208 -394
- package/pipeline/skills/shared/external/swift-charts/evals/evals.json +27 -30
- package/pipeline/skills/shared/external/swift-charts/references/charts-patterns.md +351 -762
- package/pipeline/skills/shared/external/swift-codable/SKILL.md +339 -343
- package/pipeline/skills/shared/external/swift-codable/evals/evals.json +20 -20
- package/pipeline/skills/shared/external/swift-concurrency/SKILL.md +303 -351
- package/pipeline/skills/shared/external/swift-concurrency/evals/evals.json +27 -24
- package/pipeline/skills/shared/external/swift-concurrency/references/approachable-concurrency.md +65 -80
- package/pipeline/skills/shared/external/swift-concurrency/references/async-algorithms.md +48 -84
- package/pipeline/skills/shared/external/swift-concurrency/references/bridging-interop.md +134 -79
- package/pipeline/skills/shared/external/swift-concurrency/references/concurrency-patterns.md +145 -167
- package/pipeline/skills/shared/external/swift-concurrency/references/diagnostics.md +62 -50
- package/pipeline/skills/shared/external/swift-concurrency/references/swiftui-concurrency.md +92 -121
- package/pipeline/skills/shared/external/swift-concurrency/references/synchronization-primitives.md +177 -241
- package/pipeline/skills/shared/external/swift-formatstyle/SKILL.md +258 -234
- package/pipeline/skills/shared/external/swift-language/SKILL.md +342 -382
- package/pipeline/skills/shared/external/swift-language/evals/evals.json +24 -27
- package/pipeline/skills/shared/external/swift-language/references/swift-attributes-interop.md +79 -56
- package/pipeline/skills/shared/external/swift-language/references/swift-patterns-extended.md +297 -340
- package/pipeline/skills/shared/external/swift-security/SKILL.md +180 -161
- package/pipeline/skills/shared/external/swift-security/evals/evals.json +25 -25
- package/pipeline/skills/shared/external/swift-security/references/biometric-authentication.md +314 -469
- package/pipeline/skills/shared/external/swift-security/references/certificate-trust.md +408 -476
- package/pipeline/skills/shared/external/swift-security/references/common-anti-patterns.md +260 -530
- package/pipeline/skills/shared/external/swift-security/references/compliance-owasp-mapping.md +270 -477
- package/pipeline/skills/shared/external/swift-security/references/credential-storage-patterns.md +573 -571
- package/pipeline/skills/shared/external/swift-security/references/cryptokit-public-key.md +370 -441
- package/pipeline/skills/shared/external/swift-security/references/cryptokit-symmetric.md +332 -433
- package/pipeline/skills/shared/external/swift-security/references/keychain-access-control.md +346 -468
- package/pipeline/skills/shared/external/swift-security/references/keychain-fundamentals.md +352 -472
- package/pipeline/skills/shared/external/swift-security/references/keychain-item-classes.md +431 -432
- package/pipeline/skills/shared/external/swift-security/references/keychain-sharing.md +328 -425
- package/pipeline/skills/shared/external/swift-security/references/migration-legacy-stores.md +341 -579
- package/pipeline/skills/shared/external/swift-security/references/secure-enclave.md +396 -457
- package/pipeline/skills/shared/external/swift-security/references/testing-security-code.md +354 -614
- package/pipeline/skills/shared/external/swift-testing/SKILL.md +188 -175
- package/pipeline/skills/shared/external/swift-testing/evals/evals.json +26 -24
- package/pipeline/skills/shared/external/swift-testing/references/testing-advanced.md +80 -84
- package/pipeline/skills/shared/external/swift-testing/references/testing-patterns.md +317 -433
- package/pipeline/skills/shared/external/swiftdata/SKILL.md +392 -256
- package/pipeline/skills/shared/external/swiftdata/evals/evals.json +24 -24
- package/pipeline/skills/shared/external/swiftdata/references/core-data-coexistence.md +206 -402
- package/pipeline/skills/shared/external/swiftdata/references/indexing.md +59 -52
- package/pipeline/skills/shared/external/swiftdata/references/predicate-pitfalls.md +57 -33
- package/pipeline/skills/shared/external/swiftdata/references/swiftdata-advanced.md +354 -747
- package/pipeline/skills/shared/external/swiftdata/references/swiftdata-queries.md +300 -508
- package/pipeline/skills/shared/external/swiftlint/SKILL.md +175 -226
- package/pipeline/skills/shared/external/swiftlint/references/adoption-and-configuration.md +141 -208
- package/pipeline/skills/shared/external/swiftlint/references/custom-rules-and-analyze.md +100 -109
- package/pipeline/skills/shared/external/swiftlint/references/plugins-run-scripts-and-integrations.md +159 -179
- package/pipeline/skills/shared/external/swiftlint/references/rule-reference.md +383 -18
- package/pipeline/skills/shared/external/swiftlint/references/rules-suppressions-and-baselines.md +143 -229
- package/pipeline/skills/shared/external/swiftui-animation/SKILL.md +283 -366
- package/pipeline/skills/shared/external/swiftui-animation/references/animation-advanced.md +396 -608
- package/pipeline/skills/shared/external/swiftui-animation/references/core-animation-bridge.md +336 -385
- package/pipeline/skills/shared/external/swiftui-gestures/SKILL.md +239 -349
- package/pipeline/skills/shared/external/swiftui-gestures/references/gesture-patterns.md +228 -310
- package/pipeline/skills/shared/external/swiftui-layout-components/SKILL.md +260 -249
- package/pipeline/skills/shared/external/swiftui-layout-components/references/form.md +92 -74
- package/pipeline/skills/shared/external/swiftui-layout-components/references/grids.md +112 -177
- package/pipeline/skills/shared/external/swiftui-layout-components/references/list.md +61 -64
- package/pipeline/skills/shared/external/swiftui-layout-components/references/scrollview.md +94 -134
- package/pipeline/skills/shared/external/swiftui-liquid-glass/SKILL.md +193 -225
- package/pipeline/skills/shared/external/swiftui-liquid-glass/references/liquid-glass.md +173 -327
- package/pipeline/skills/shared/external/swiftui-navigation/SKILL.md +193 -168
- package/pipeline/skills/shared/external/swiftui-navigation/references/deeplinks.md +127 -150
- package/pipeline/skills/shared/external/swiftui-navigation/references/navigationstack.md +132 -133
- package/pipeline/skills/shared/external/swiftui-navigation/references/sheets.md +152 -117
- package/pipeline/skills/shared/external/swiftui-navigation/references/tabview.md +106 -140
- package/pipeline/skills/shared/external/swiftui-patterns/SKILL.md +316 -252
- package/pipeline/skills/shared/external/swiftui-patterns/references/architecture-patterns.md +341 -332
- package/pipeline/skills/shared/external/swiftui-patterns/references/deprecated-migration.md +547 -854
- package/pipeline/skills/shared/external/swiftui-patterns/references/design-polish.md +485 -537
- package/pipeline/skills/shared/external/swiftui-patterns/references/platform-and-sharing.md +417 -499
- package/pipeline/skills/shared/external/swiftui-performance/SKILL.md +213 -376
- package/pipeline/skills/shared/external/swiftui-performance/references/demystify-swiftui-performance-wwdc23.md +86 -175
- package/pipeline/skills/shared/external/swiftui-performance/references/optimizing-swiftui-performance-instruments.md +89 -195
- package/pipeline/skills/shared/external/swiftui-performance/references/understanding-hangs-in-your-app.md +95 -182
- package/pipeline/skills/shared/external/swiftui-performance/references/understanding-improving-swiftui-performance.md +71 -149
- package/pipeline/skills/shared/external/swiftui-performance/references/wwdc-session-sources.md +21 -27
- package/pipeline/skills/shared/external/swiftui-uikit-interop/SKILL.md +303 -295
- package/pipeline/skills/shared/external/swiftui-uikit-interop/references/hosting-migration.md +204 -387
- package/pipeline/skills/shared/external/swiftui-uikit-interop/references/representable-recipes.md +469 -683
- package/pipeline/skills/shared/external/swiftui-webkit/SKILL.md +140 -186
- package/pipeline/skills/shared/external/swiftui-webkit/references/loading-and-observation.md +75 -86
- package/pipeline/skills/shared/external/swiftui-webkit/references/local-content-and-custom-schemes.md +63 -60
- package/pipeline/skills/shared/external/swiftui-webkit/references/migration-and-fallbacks.md +69 -137
- package/pipeline/skills/shared/external/swiftui-webkit/references/navigation-and-javascript.md +95 -67
- package/pipeline/skills/shared/external/tipkit/SKILL.md +220 -335
- package/pipeline/skills/shared/external/tipkit/references/tipkit-patterns.md +356 -494
- package/pipeline/skills/shared/external/vision-framework/SKILL.md +260 -375
- package/pipeline/skills/shared/external/vision-framework/references/vision-requests.md +393 -515
- package/pipeline/skills/shared/external/vision-framework/references/visionkit-scanner.md +363 -539
- package/pipeline/skills/shared/external/weatherkit/SKILL.md +152 -310
- package/pipeline/skills/shared/external/weatherkit/references/weatherkit-patterns.md +288 -407
- package/pipeline/skills/shared/external/widgetkit/SKILL.md +216 -288
- package/pipeline/skills/shared/external/widgetkit/references/widgetkit-advanced.md +414 -719
- package/pipeline/skills/shared/external/NOTICE-swift-ios-skills.md +0 -39
|
@@ -3,43 +3,46 @@
|
|
|
3
3
|
"evals": [
|
|
4
4
|
{
|
|
5
5
|
"id": 0,
|
|
6
|
-
"
|
|
7
|
-
"
|
|
6
|
+
"name": "production-ingestion-pipeline",
|
|
7
|
+
"prompt": "We want MetricKit data from our shipping iOS app in our own backend: daily performance numbers plus crashes and hangs with symbolicated stacks. A teammate registered the subscriber in the settings screen and parses everything inside the callback. Design the pipeline properly.",
|
|
8
|
+
"expected_output": "Registers one long-lived subscriber at startup (didFinishLaunchingWithOptions or App.init), implements both didReceive callbacks, writes each payload's jsonRepresentation() to disk before any parsing, symbolication or upload, moves heavy work off the callback, backfills from pastPayloads and pastDiagnosticPayloads, and does not promise that daily metric payloads show up immediately while developing.",
|
|
8
9
|
"files": [],
|
|
9
10
|
"expectations": [
|
|
10
|
-
"
|
|
11
|
-
"Implements
|
|
12
|
-
"Persists
|
|
13
|
-
"Moves
|
|
14
|
-
"
|
|
15
|
-
"Does not claim
|
|
11
|
+
"Subscribes a long-lived object at app startup rather than in a screen",
|
|
12
|
+
"Implements both the metric and the diagnostic callback",
|
|
13
|
+
"Persists raw JSON before parsing, symbolicating or uploading",
|
|
14
|
+
"Moves heavy processing out of the callback",
|
|
15
|
+
"Backfills with pastPayloads and pastDiagnosticPayloads",
|
|
16
|
+
"Does not claim daily metric payloads arrive immediately during development"
|
|
16
17
|
]
|
|
17
18
|
},
|
|
18
19
|
{
|
|
19
20
|
"id": 1,
|
|
20
|
-
"
|
|
21
|
-
"
|
|
21
|
+
"name": "signpost-and-launch-fix",
|
|
22
|
+
"prompt": "Fix this code: it creates an ID with MXSignpostIntervalData.makeSignpostID(log:), passes it to every mxSignpost call, and extends launch with MXMetricManager.shared.extendLaunchMeasurement(forTaskID:) from a background queue after the first screen appears. Where do the signpost numbers end up?",
|
|
23
|
+
"expected_output": "Says makeSignpostID(log:) is not documented MetricKit API, uses MXMetricManager.makeLogHandle(category:) with default mxSignpost arguments, and points to MXMetricPayload.signpostMetrics in the daily payload. Rewrites extended launch with the throwing type methods extendLaunchMeasurement(forTaskID:) and finishExtendedLaunchMeasurement(forTaskID:), called with try on the main thread before the first scene is active, with at most 16 overlapping tasks that must all be finished.",
|
|
22
24
|
"files": [],
|
|
23
25
|
"expectations": [
|
|
24
|
-
"
|
|
25
|
-
"Uses
|
|
26
|
-
"
|
|
27
|
-
"Uses try
|
|
28
|
-
"
|
|
26
|
+
"Rejects makeSignpostID(log:) as undocumented",
|
|
27
|
+
"Uses makeLogHandle(category:) and default mxSignpost parameters",
|
|
28
|
+
"Names MXMetricPayload.signpostMetrics as where the data appears",
|
|
29
|
+
"Uses try with the static extendLaunchMeasurement and finishExtendedLaunchMeasurement methods instead of the shared instance",
|
|
30
|
+
"States the main-thread, early-start, 16-task, overlapping-window and finish-every-task rules"
|
|
29
31
|
]
|
|
30
32
|
},
|
|
31
33
|
{
|
|
32
34
|
"id": 2,
|
|
33
|
-
"
|
|
34
|
-
"
|
|
35
|
+
"name": "scope-routing",
|
|
36
|
+
"prompt": "Organizer shows rising hang rates and a crash spike after our SwiftUI redesign. Tell us what MetricKit can do here, and what we should take to other tools.",
|
|
37
|
+
"expected_output": "Keeps MetricKit to manager setup, payload handling, reading MXHangDiagnostic and MXCrashDiagnostic, and uploading call-stack JSON with dSYMs to a backend. Sends SwiftUI body cost and invalidation fixes to swiftui-performance and local Instruments, LLDB, Memory Graph or xctrace work to debugging-instruments. Explains that MetricKit is production telemetry aggregated daily, and does not turn into a refactoring plan or an Instruments tutorial.",
|
|
35
38
|
"files": [],
|
|
36
39
|
"expectations": [
|
|
37
|
-
"Keeps
|
|
38
|
-
"
|
|
39
|
-
"
|
|
40
|
-
"
|
|
41
|
-
"
|
|
42
|
-
"Does not expand into a
|
|
40
|
+
"Keeps manager setup, payload handling, hang and crash diagnostics and backend upload in MetricKit",
|
|
41
|
+
"Mentions call-stack JSON uploaded with dSYMs",
|
|
42
|
+
"Sends SwiftUI fixes to swiftui-performance",
|
|
43
|
+
"Sends Instruments, LLDB, Memory Graph and xctrace work to debugging-instruments",
|
|
44
|
+
"Describes MetricKit as production data aggregated daily",
|
|
45
|
+
"Does not expand into a refactor or an Instruments walkthrough"
|
|
43
46
|
]
|
|
44
47
|
}
|
|
45
48
|
]
|
package/pipeline/skills/shared/external/metrickit-diagnostics/references/metrickit-patterns.md
CHANGED
|
@@ -1,180 +1,173 @@
|
|
|
1
|
-
# MetricKit
|
|
1
|
+
# MetricKit patterns
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Worked examples for the `metrickit-diagnostics` skill ([../SKILL.md](../SKILL.md)).
|
|
4
4
|
|
|
5
|
-
##
|
|
5
|
+
## Reading call-stack trees
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
- [Exporting and Uploading Payloads](#exporting-and-uploading-payloads)
|
|
10
|
-
- [Past Payloads](#past-payloads)
|
|
11
|
-
- [Extended Launch Measurement](#extended-launch-measurement)
|
|
12
|
-
- [Xcode Organizer Integration](#xcode-organizer-integration)
|
|
13
|
-
|
|
14
|
-
## Call Stack Trees
|
|
15
|
-
|
|
16
|
-
`MXCallStackTree` is attached to each diagnostic (crash, hang, CPU exception,
|
|
17
|
-
disk write, app launch). Use `jsonRepresentation()` to extract and symbolicate.
|
|
7
|
+
Every diagnostic class (crashes, hangs, CPU and disk-write exceptions, slow
|
|
8
|
+
launches) exposes a `callStackTree`.
|
|
18
9
|
|
|
19
10
|
```swift
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
uploadDiagnostic(
|
|
29
|
-
type: "crash",
|
|
30
|
-
exceptionType: exceptionType,
|
|
31
|
-
signal: signal,
|
|
32
|
-
reason: reason,
|
|
33
|
-
callStack: treeJSON
|
|
11
|
+
import MetricKit
|
|
12
|
+
|
|
13
|
+
func describe(_ crash: MXCrashDiagnostic) -> CrashRecord {
|
|
14
|
+
CrashRecord(
|
|
15
|
+
stack: crash.callStackTree.jsonRepresentation(),
|
|
16
|
+
exception: crash.exceptionType?.intValue,
|
|
17
|
+
signal: crash.signal?.intValue,
|
|
18
|
+
reason: crash.terminationReason
|
|
34
19
|
)
|
|
35
20
|
}
|
|
36
21
|
|
|
37
|
-
func
|
|
38
|
-
let
|
|
39
|
-
|
|
40
|
-
uploadDiagnostic(type: "hang", duration: duration, callStack: tree.jsonRepresentation())
|
|
22
|
+
func describe(_ hang: MXHangDiagnostic) -> HangRecord {
|
|
23
|
+
let seconds = hang.hangDuration.converted(to: .seconds).value
|
|
24
|
+
return HangRecord(stack: hang.callStackTree.jsonRepresentation(), seconds: seconds)
|
|
41
25
|
}
|
|
42
|
-
```
|
|
43
|
-
|
|
44
|
-
The JSON structure contains an array of call stack frames with binary name,
|
|
45
|
-
offset, and address. Symbolicate using `atos` or upload dSYMs to your
|
|
46
|
-
analytics service.
|
|
47
26
|
|
|
48
|
-
|
|
49
|
-
|
|
27
|
+
struct CrashRecord { let stack: Data; let exception: Int?; let signal: Int?; let reason: String? }
|
|
28
|
+
struct HangRecord { let stack: Data; let seconds: Double }
|
|
29
|
+
```
|
|
50
30
|
|
|
51
|
-
|
|
31
|
+
The stack JSON lists each frame with its binary name, offset into the binary
|
|
32
|
+
and address. That is what `atos` or a crash service needs, together with the
|
|
33
|
+
matching dSYMs.
|
|
52
34
|
|
|
53
|
-
|
|
54
|
-
intervals. These appear in the daily `MXMetricPayload` under `signpostMetrics`.
|
|
35
|
+
## Custom signposts end to end
|
|
55
36
|
|
|
56
|
-
###
|
|
57
|
-
|
|
58
|
-
```swift
|
|
59
|
-
let metricLog = MXMetricManager.makeLogHandle(category: "Networking")
|
|
60
|
-
```
|
|
61
|
-
|
|
62
|
-
### Emitting Signposts
|
|
37
|
+
### Emitting
|
|
63
38
|
|
|
64
39
|
```swift
|
|
40
|
+
import MetricKit
|
|
65
41
|
import os
|
|
66
42
|
|
|
67
|
-
|
|
68
|
-
mxSignpost(.begin, log: metricLog, name: "DataFetch")
|
|
69
|
-
let data = try await URLSession.shared.data(from: url).0
|
|
70
|
-
mxSignpost(.end, log: metricLog, name: "DataFetch")
|
|
43
|
+
let syncLog = MXMetricManager.makeLogHandle(category: "Sync")
|
|
71
44
|
|
|
72
|
-
|
|
45
|
+
func pullLatestRoutes(from endpoint: URL) async throws -> Data {
|
|
46
|
+
mxSignpost(.begin, log: syncLog, name: "PullRoutes")
|
|
47
|
+
defer { mxSignpost(.end, log: syncLog, name: "PullRoutes") }
|
|
48
|
+
let session = URLSession(configuration: .ephemeral)
|
|
49
|
+
let (payload, _) = try await session.data(from: endpoint)
|
|
50
|
+
return payload
|
|
73
51
|
}
|
|
74
52
|
```
|
|
75
53
|
|
|
76
|
-
|
|
77
|
-
`MXMetricManager.makeLogHandle(category:)` and leave the `mxSignpost` overload's
|
|
78
|
-
advanced `dso`, `signpostID`, and `format` parameters at their documented
|
|
79
|
-
defaults.
|
|
80
|
-
|
|
81
|
-
### Reading Custom Metrics from Payload
|
|
54
|
+
### Reading them back
|
|
82
55
|
|
|
83
56
|
```swift
|
|
84
|
-
|
|
85
|
-
for metric in
|
|
86
|
-
let
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
}
|
|
57
|
+
func logSignposts(in payload: MXMetricPayload) {
|
|
58
|
+
for metric in payload.signpostMetrics ?? [] {
|
|
59
|
+
let intervals = metric.signpostIntervalData
|
|
60
|
+
telemetryLog.info("""
|
|
61
|
+
\(metric.signpostCategory)/\(metric.signpostName): \(metric.totalCount) runs, \
|
|
62
|
+
avg memory \(String(describing: intervals?.averageMemory)), \
|
|
63
|
+
cpu \(String(describing: intervals?.cumulativeCPUTime))
|
|
64
|
+
""")
|
|
93
65
|
}
|
|
94
66
|
}
|
|
67
|
+
|
|
68
|
+
let telemetryLog = Logger(subsystem: "com.example.trailhead", category: "metrics")
|
|
95
69
|
```
|
|
96
70
|
|
|
97
|
-
|
|
98
|
-
|
|
71
|
+
The system caps how many custom signpost metrics each log may record, to keep
|
|
72
|
+
overhead low. Spend them on the few paths that matter.
|
|
99
73
|
|
|
100
|
-
## Exporting and
|
|
74
|
+
## Exporting and uploading
|
|
101
75
|
|
|
102
|
-
Both payload
|
|
103
|
-
|
|
76
|
+
Both payload classes also conform to `NSSecureCoding`, but JSON is the
|
|
77
|
+
format backends want.
|
|
104
78
|
|
|
105
79
|
```swift
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
80
|
+
enum PayloadArchive {
|
|
81
|
+
static func save(_ json: Data, kind: String) throws -> URL {
|
|
82
|
+
let stamp = ISO8601DateFormatter().string(from: .now)
|
|
83
|
+
let file = FileManager.default.temporaryDirectory
|
|
84
|
+
.appendingPathComponent("metrickit-\(kind)-\(stamp).json")
|
|
85
|
+
try json.write(to: file, options: .atomic)
|
|
86
|
+
return file
|
|
87
|
+
}
|
|
111
88
|
|
|
112
|
-
func
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
89
|
+
static func upload(_ file: URL, to collector: URL) {
|
|
90
|
+
Task.detached(priority: .utility) {
|
|
91
|
+
var request = URLRequest(url: collector)
|
|
92
|
+
request.httpMethod = "POST"
|
|
93
|
+
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
|
|
94
|
+
let json = try Data(contentsOf: file)
|
|
95
|
+
let (_, reply) = try await URLSession.shared.upload(for: request, from: json)
|
|
96
|
+
guard (reply as? HTTPURLResponse)?.statusCode == 200 else { return }
|
|
97
|
+
try FileManager.default.removeItem(at: file)
|
|
98
|
+
}
|
|
119
99
|
}
|
|
120
100
|
}
|
|
121
101
|
```
|
|
122
102
|
|
|
123
|
-
|
|
103
|
+
In production prefer Application Support or Caches over the temporary
|
|
104
|
+
directory if files must survive until the next launch.
|
|
124
105
|
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
106
|
+
## Catching up on missed payloads
|
|
107
|
+
|
|
108
|
+
Deliveries that happened while no subscriber was registered are not lost;
|
|
109
|
+
they stay reachable through `MXMetricManager.shared.pastPayloads` and
|
|
110
|
+
`pastDiagnosticPayloads`, which cover everything produced since the shared
|
|
111
|
+
instance was last allocated.
|
|
128
112
|
|
|
129
113
|
```swift
|
|
130
|
-
|
|
131
|
-
let
|
|
114
|
+
func backfill() throws {
|
|
115
|
+
let manager = MXMetricManager.shared
|
|
116
|
+
for payload in manager.pastPayloads {
|
|
117
|
+
_ = try PayloadArchive.save(payload.jsonRepresentation(), kind: "metric")
|
|
118
|
+
}
|
|
119
|
+
for payload in manager.pastDiagnosticPayloads {
|
|
120
|
+
_ = try PayloadArchive.save(payload.jsonRepresentation(), kind: "diagnostic")
|
|
121
|
+
}
|
|
122
|
+
}
|
|
132
123
|
```
|
|
133
124
|
|
|
134
|
-
## Extended
|
|
125
|
+
## Extended launch rules
|
|
135
126
|
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
Mac Catalyst 16+, macOS 13+, and visionOS 1+.
|
|
127
|
+
Typical tasks worth including: opening the database, restoring saved state,
|
|
128
|
+
fetching the data the first screen shows.
|
|
139
129
|
|
|
140
|
-
|
|
141
|
-
|
|
130
|
+
- Begin the earliest task no later than state restoration, while the first
|
|
131
|
+
scene is still inactive.
|
|
132
|
+
- Up to 16 tasks can be registered.
|
|
133
|
+
- Task windows may overlap.
|
|
134
|
+
- Measurement ends once every running task has finished, so finish each one,
|
|
135
|
+
including on error paths.
|
|
142
136
|
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
137
|
+
```swift
|
|
138
|
+
@MainActor
|
|
139
|
+
func restoreSession() async {
|
|
140
|
+
let restore = MXLaunchTaskID("com.example.trailhead.restore")
|
|
141
|
+
let routes = MXLaunchTaskID("com.example.trailhead.routes")
|
|
142
|
+
try? MXMetricManager.extendLaunchMeasurement(forTaskID: restore)
|
|
143
|
+
try? MXMetricManager.extendLaunchMeasurement(forTaskID: routes)
|
|
144
|
+
|
|
145
|
+
await sessionStore.restore()
|
|
146
|
+
try? MXMetricManager.finishExtendedLaunchMeasurement(forTaskID: restore)
|
|
147
|
+
|
|
148
|
+
await routeCache.warm()
|
|
149
|
+
try? MXMetricManager.finishExtendedLaunchMeasurement(forTaskID: routes)
|
|
150
|
+
}
|
|
148
151
|
```
|
|
149
152
|
|
|
150
|
-
|
|
151
|
-
`MXAppLaunchMetric`.
|
|
152
|
-
|
|
153
|
-
Use these throwing type methods on the main thread. Start the first task before
|
|
154
|
-
or during state restoration, or before the first scene becomes active. The
|
|
155
|
-
system supports up to 16 tasks; task windows need to overlap, and extended
|
|
156
|
-
launch measurement ends when all running tasks finish.
|
|
157
|
-
|
|
158
|
-
## Xcode Organizer Integration
|
|
159
|
-
|
|
160
|
-
Xcode Organizer shows the same MetricKit data aggregated across all users
|
|
161
|
-
who have opted in to share diagnostics. Use Organizer for trend analysis:
|
|
153
|
+
## Xcode Organizer
|
|
162
154
|
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
155
|
+
| Tab | Shows |
|
|
156
|
+
|---|---|
|
|
157
|
+
| Metrics | Battery, performance and disk writes over time |
|
|
158
|
+
| Regressions | Regressions detected automatically between versions |
|
|
159
|
+
| Crashes | Symbolicated crash logs |
|
|
166
160
|
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
by user cohort.
|
|
161
|
+
Organizer covers the aggregate view. Your own on-device collection adds what
|
|
162
|
+
it cannot: your own dashboards and alerts, plus slicing by user segment.
|
|
170
163
|
|
|
171
|
-
## Apple
|
|
164
|
+
## Apple documentation
|
|
172
165
|
|
|
173
|
-
-
|
|
174
|
-
-
|
|
175
|
-
-
|
|
176
|
-
-
|
|
177
|
-
-
|
|
178
|
-
-
|
|
179
|
-
-
|
|
180
|
-
-
|
|
166
|
+
- https://developer.apple.com/documentation/metrickit
|
|
167
|
+
- https://developer.apple.com/documentation/metrickit/mxmetricmanager
|
|
168
|
+
- https://developer.apple.com/documentation/metrickit/mxmetricmanagersubscriber
|
|
169
|
+
- https://developer.apple.com/documentation/metrickit/mxcallstacktree
|
|
170
|
+
- https://developer.apple.com/documentation/metrickit/mxsignpostmetric
|
|
171
|
+
- https://developer.apple.com/documentation/metrickit/mxapplaunchmetric
|
|
172
|
+
- https://developer.apple.com/documentation/metrickit/mxcrashdiagnostic
|
|
173
|
+
- Apple article on analyzing a shipping app's performance, in the Xcode documentation
|