ardaatahan commited on
Commit
6b28c2b
·
1 Parent(s): f1a7d8d

Add new check for wer discrepancy

Browse files
.github/scripts/wer_regression_check.py ADDED
@@ -0,0 +1,389 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python3
2
+ """
3
+ WhisperKit WER Regression Detection Script
4
+
5
+ This script detects significant WER (Word Error Rate) regressions across:
6
+ - Different devices
7
+ - OS versions
8
+ - Previous WhisperKit releases
9
+
10
+ If any model shows WER discrepancy > 20%, it alerts via Slack.
11
+ """
12
+
13
+ import json
14
+ import os
15
+ import statistics
16
+ from collections import defaultdict
17
+ from typing import Dict, List, Tuple, Optional
18
+ import pandas as pd
19
+
20
+
21
+ def load_performance_data(file_path: str, commit_hash: Optional[str] = None) -> List[Dict]:
22
+ """Load performance data from JSON file, optionally filtering by commit hash."""
23
+ data = []
24
+ try:
25
+ with open(file_path, "r") as f:
26
+ for line in f:
27
+ try:
28
+ item = json.loads(line.strip())
29
+ if commit_hash is None or item.get("commit_hash") == commit_hash:
30
+ data.append(item)
31
+ except json.JSONDecodeError:
32
+ continue
33
+ except FileNotFoundError:
34
+ print(f"Warning: Performance data file not found: {file_path}")
35
+ return []
36
+
37
+ return data
38
+
39
+
40
+ def calculate_wer_statistics(wer_values: List[float]) -> Dict[str, float]:
41
+ """Calculate WER statistics for a list of values."""
42
+ if not wer_values:
43
+ return {"mean": 0, "median": 0, "min": 0, "max": 0, "std": 0}
44
+
45
+ return {
46
+ "mean": statistics.mean(wer_values),
47
+ "median": statistics.median(wer_values),
48
+ "min": min(wer_values),
49
+ "max": max(wer_values),
50
+ "std": statistics.stdev(wer_values) if len(wer_values) > 1 else 0
51
+ }
52
+
53
+
54
+ def detect_device_regressions(data: List[Dict], threshold: float = 20.0) -> List[Dict]:
55
+ """
56
+ Detect WER regressions across different devices for each model/OS combination.
57
+ Returns list of regression alerts.
58
+ """
59
+ regressions = []
60
+
61
+ # Group by model and OS, then compare across devices
62
+ model_os_data = defaultdict(list)
63
+ for entry in data:
64
+ model_os_key = (entry["model"], entry["os"])
65
+ model_os_data[model_os_key].append(entry)
66
+
67
+ for (model, os), entries in model_os_data.items():
68
+ if len(entries) < 2: # Need at least 2 data points to compare
69
+ continue
70
+
71
+ # Group by device
72
+ device_wer = defaultdict(list)
73
+ for entry in entries:
74
+ device_wer[entry["device"]].append(entry["average_wer"])
75
+
76
+ # Calculate statistics for each device
77
+ device_stats = {}
78
+ for device, wer_values in device_wer.items():
79
+ device_stats[device] = calculate_wer_statistics(wer_values)
80
+
81
+ # Find significant discrepancies between devices
82
+ devices = list(device_stats.keys())
83
+ for i in range(len(devices)):
84
+ for j in range(i + 1, len(devices)):
85
+ device_1, device_2 = devices[i], devices[j]
86
+ mean_1 = device_stats[device_1]["mean"]
87
+ mean_2 = device_stats[device_2]["mean"]
88
+
89
+ # Calculate percentage difference
90
+ if mean_1 > 0: # Avoid division by zero
91
+ pct_diff = abs(mean_2 - mean_1) / mean_1 * 100
92
+
93
+ if pct_diff > threshold:
94
+ regressions.append({
95
+ "type": "device_discrepancy",
96
+ "model": model,
97
+ "os": os,
98
+ "device_1": device_1,
99
+ "device_2": device_2,
100
+ "wer_1": round(mean_1, 2),
101
+ "wer_2": round(mean_2, 2),
102
+ "percentage_diff": round(pct_diff, 1)
103
+ })
104
+
105
+ return regressions
106
+
107
+
108
+ def detect_os_regressions(data: List[Dict], threshold: float = 20.0) -> List[Dict]:
109
+ """
110
+ Detect WER regressions across different OS versions for each model/device combination.
111
+ Returns list of regression alerts.
112
+ """
113
+ regressions = []
114
+
115
+ # Group by model and device, then compare across OS versions
116
+ model_device_data = defaultdict(list)
117
+ for entry in data:
118
+ model_device_key = (entry["model"], entry["device"])
119
+ model_device_data[model_device_key].append(entry)
120
+
121
+ for (model, device), entries in model_device_data.items():
122
+ if len(entries) < 2: # Need at least 2 data points to compare
123
+ continue
124
+
125
+ # Group by OS
126
+ os_wer = defaultdict(list)
127
+ for entry in entries:
128
+ os_wer[entry["os"]].append(entry["average_wer"])
129
+
130
+ # Calculate statistics for each OS
131
+ os_stats = {}
132
+ for os, wer_values in os_wer.items():
133
+ os_stats[os] = calculate_wer_statistics(wer_values)
134
+
135
+ # Find significant discrepancies between OS versions
136
+ os_versions = list(os_stats.keys())
137
+ for i in range(len(os_versions)):
138
+ for j in range(i + 1, len(os_versions)):
139
+ os_1, os_2 = os_versions[i], os_versions[j]
140
+ mean_1 = os_stats[os_1]["mean"]
141
+ mean_2 = os_stats[os_2]["mean"]
142
+
143
+ # Calculate percentage difference
144
+ if mean_1 > 0: # Avoid division by zero
145
+ pct_diff = abs(mean_2 - mean_1) / mean_1 * 100
146
+
147
+ if pct_diff > threshold:
148
+ regressions.append({
149
+ "type": "os_discrepancy",
150
+ "model": model,
151
+ "device": device,
152
+ "os_1": os_1,
153
+ "os_2": os_2,
154
+ "wer_1": round(mean_1, 2),
155
+ "wer_2": round(mean_2, 2),
156
+ "percentage_diff": round(pct_diff, 1)
157
+ })
158
+
159
+ return regressions
160
+
161
+
162
+ def detect_release_regressions(current_data: List[Dict], previous_data: List[Dict],
163
+ threshold: float = 20.0) -> List[Dict]:
164
+ """
165
+ Detect WER regressions between WhisperKit releases.
166
+ Returns list of regression alerts.
167
+ """
168
+ regressions = []
169
+
170
+ if not previous_data:
171
+ print("No previous release data available for comparison")
172
+ return regressions
173
+
174
+ # Create lookup dictionaries by (model, device, os)
175
+ current_lookup = {}
176
+ previous_lookup = {}
177
+
178
+ for entry in current_data:
179
+ key = (entry["model"], entry["device"], entry["os"])
180
+ current_lookup[key] = entry["average_wer"]
181
+
182
+ for entry in previous_data:
183
+ key = (entry["model"], entry["device"], entry["os"])
184
+ previous_lookup[key] = entry["average_wer"]
185
+
186
+ # Compare common configurations
187
+ common_configs = set(current_lookup.keys()) & set(previous_lookup.keys())
188
+
189
+ for config in common_configs:
190
+ model, device, os = config
191
+ current_wer = current_lookup[config]
192
+ previous_wer = previous_lookup[config]
193
+
194
+ if previous_wer > 0: # Avoid division by zero
195
+ pct_change = (current_wer - previous_wer) / previous_wer * 100
196
+
197
+ # Only flag significant WER increases (regressions)
198
+ if pct_change > threshold:
199
+ regressions.append({
200
+ "type": "release_regression",
201
+ "model": model,
202
+ "device": device,
203
+ "os": os,
204
+ "previous_wer": round(previous_wer, 2),
205
+ "current_wer": round(current_wer, 2),
206
+ "percentage_increase": round(pct_change, 1)
207
+ })
208
+
209
+ return regressions
210
+
211
+
212
+ def generate_slack_message(regressions: List[Dict]) -> Dict:
213
+ """Generate Slack message payload for WER regression alerts."""
214
+
215
+ if not regressions:
216
+ return None
217
+
218
+ blocks = [
219
+ {
220
+ "type": "header",
221
+ "text": {
222
+ "type": "plain_text",
223
+ "text": "WhisperKit WER Regression Alert",
224
+ "emoji": True
225
+ }
226
+ },
227
+ {
228
+ "type": "context",
229
+ "elements": [
230
+ {
231
+ "type": "mrkdwn",
232
+ "text": f"*Detected {len(regressions)} significant WER regression(s)*"
233
+ }
234
+ ]
235
+ },
236
+ {"type": "divider"}
237
+ ]
238
+
239
+ # Group regressions by type
240
+ device_regressions = [r for r in regressions if r["type"] == "device_discrepancy"]
241
+ os_regressions = [r for r in regressions if r["type"] == "os_discrepancy"]
242
+ release_regressions = [r for r in regressions if r["type"] == "release_regression"]
243
+
244
+ if device_regressions:
245
+ blocks.append({
246
+ "type": "section",
247
+ "text": {
248
+ "type": "mrkdwn",
249
+ "text": "*Device Discrepancies:*"
250
+ }
251
+ })
252
+
253
+ for regression in device_regressions:
254
+ blocks.append({
255
+ "type": "section",
256
+ "text": {
257
+ "type": "mrkdwn",
258
+ "text": f"*{regression['model']}* on {regression['os']}\n"
259
+ f"• {regression['device_1']}: {regression['wer_1']}% WER\n"
260
+ f"• {regression['device_2']}: {regression['wer_2']}% WER\n"
261
+ f"• Difference: {regression['percentage_diff']}%"
262
+ }
263
+ })
264
+
265
+ if os_regressions:
266
+ if device_regressions:
267
+ blocks.append({"type": "divider"})
268
+
269
+ blocks.append({
270
+ "type": "section",
271
+ "text": {
272
+ "type": "mrkdwn",
273
+ "text": "*OS Version Discrepancies:*"
274
+ }
275
+ })
276
+
277
+ for regression in os_regressions:
278
+ blocks.append({
279
+ "type": "section",
280
+ "text": {
281
+ "type": "mrkdwn",
282
+ "text": f"*{regression['model']}* on {regression['device']}\n"
283
+ f"• {regression['os_1']}: {regression['wer_1']}% WER\n"
284
+ f"• {regression['os_2']}: {regression['wer_2']}% WER\n"
285
+ f"• Difference: {regression['percentage_diff']}%"
286
+ }
287
+ })
288
+
289
+ if release_regressions:
290
+ if device_regressions or os_regressions:
291
+ blocks.append({"type": "divider"})
292
+
293
+ blocks.append({
294
+ "type": "section",
295
+ "text": {
296
+ "type": "mrkdwn",
297
+ "text": "*Release-to-Release Regressions:*"
298
+ }
299
+ })
300
+
301
+ for regression in release_regressions:
302
+ blocks.append({
303
+ "type": "section",
304
+ "text": {
305
+ "type": "mrkdwn",
306
+ "text": f"*{regression['model']}* on {regression['device']} ({regression['os']})\n"
307
+ f"• Previous: {regression['previous_wer']}% WER\n"
308
+ f"• Current: {regression['current_wer']}% WER\n"
309
+ f"• Increase: +{regression['percentage_increase']}%"
310
+ }
311
+ })
312
+
313
+ return {"blocks": blocks}
314
+
315
+
316
+ def check_wer_regressions():
317
+ """Main function to check for WER regressions and generate alerts."""
318
+
319
+ # Load version data to get commit hashes
320
+ try:
321
+ with open("dashboard_data/version.json", "r") as f:
322
+ version_data = json.load(f)
323
+ except FileNotFoundError:
324
+ print("Error: version.json not found")
325
+ return
326
+
327
+ releases = version_data.get("releases", [])
328
+ if len(releases) < 1:
329
+ print("Not enough release data for comparison")
330
+ return
331
+
332
+ # Get current and previous commit hashes
333
+ current_commit = releases[-1] if releases else None
334
+ previous_commit = releases[-2] if len(releases) >= 2 else None
335
+
336
+ print(f"Checking WER regressions for current commit: {current_commit}")
337
+ if previous_commit:
338
+ print(f"Comparing against previous commit: {previous_commit}")
339
+
340
+ # Load performance data - get all historical data for cross-version analysis
341
+ all_historical_data = load_performance_data("dashboard_data/performance_data.json")
342
+ current_data = load_performance_data("dashboard_data/performance_data.json", current_commit)
343
+ previous_data = load_performance_data("dashboard_data/performance_data.json", previous_commit) if previous_commit else []
344
+
345
+ print(f"Loaded {len(current_data)} current data points, {len(previous_data)} previous data points")
346
+ print(f"Loaded {len(all_historical_data)} total historical data points for cross-version analysis")
347
+
348
+ all_regressions = []
349
+
350
+ # Check for device discrepancies across all WhisperKit versions
351
+ device_regressions = detect_device_regressions(all_historical_data, threshold=20.0)
352
+ all_regressions.extend(device_regressions)
353
+ print(f"Found {len(device_regressions)} device discrepancies across WhisperKit versions")
354
+
355
+ # Check for OS discrepancies across all WhisperKit versions
356
+ os_regressions = detect_os_regressions(all_historical_data, threshold=20.0)
357
+ all_regressions.extend(os_regressions)
358
+ print(f"Found {len(os_regressions)} OS discrepancies across WhisperKit versions")
359
+
360
+ # Check for release-to-release regressions
361
+ release_regressions = detect_release_regressions(current_data, previous_data, threshold=20.0)
362
+ all_regressions.extend(release_regressions)
363
+ print(f"Found {len(release_regressions)} release regressions")
364
+
365
+ # Generate outputs
366
+ github_output = os.getenv("GITHUB_OUTPUT")
367
+ if github_output:
368
+ with open(github_output, "a") as f:
369
+ print(f"has_wer_regressions={'true' if all_regressions else 'false'}", file=f)
370
+ print(f"wer_regression_count={len(all_regressions)}", file=f)
371
+
372
+ if all_regressions:
373
+ slack_payload = generate_slack_message(all_regressions)
374
+ if slack_payload:
375
+ f.write("wer_regression_slack_payload<<EOF\n")
376
+ json.dump(slack_payload, f, indent=2)
377
+ f.write("\nEOF\n")
378
+
379
+ # Print summary for debugging
380
+ if all_regressions:
381
+ print(f"\nALERT: Found {len(all_regressions)} WER regressions!")
382
+ for regression in all_regressions:
383
+ print(f" - {regression['type']}: {regression.get('model', 'N/A')}")
384
+ else:
385
+ print("No significant WER regressions detected")
386
+
387
+
388
+ if __name__ == "__main__":
389
+ check_wer_regressions()
.github/workflows/dataset_update.yml CHANGED
@@ -146,3 +146,18 @@ jobs:
146
  }
147
  env:
148
  SLACK_BOT_TOKEN: ${{ secrets.SLACK_BOT_TOKEN }}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
146
  }
147
  env:
148
  SLACK_BOT_TOKEN: ${{ secrets.SLACK_BOT_TOKEN }}
149
+
150
+ - name: Check for WER Regressions
151
+ if: steps.check.outputs.has_updates == 'true'
152
+ id: wer_check
153
+ run: python .github/scripts/wer_regression_check.py
154
+
155
+ - name: Alert WER Regressions
156
+ if: steps.check.outputs.has_updates == 'true' && steps.wer_check.outputs.has_wer_regressions == 'true'
157
+ uses: slackapi/slack-github-action@v1.27.0
158
+ with:
159
+ channel-id: ${{ secrets.SLACK_CHANNEL_ID }}
160
+ payload: |
161
+ ${{ steps.wer_check.outputs.wer_regression_slack_payload }}
162
+ env:
163
+ SLACK_BOT_TOKEN: ${{ secrets.SLACK_BOT_TOKEN }}
dashboard_data/support_data_3f451e1.csv ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ,Model,"Apple M2 (Mac14,3)","Apple M4 (Mac16,10)","Apple M4 Pro (Mac16,8)","Apple M1 (Macmini9,1)","iPad Air (5th generation) (iPad13,16)","iPad (10th generation) (iPad13,18)","iPad mini (6th generation) (iPad14,1)","iPad Air 11-inch (M2) (iPad14,8)","iPad Air 11-inch (M3) (iPad15,3)","iPad (A16) (iPad15,7)","iPad mini (A17 Pro) (iPad16,1)","iPad Pro 11-inch (M4) (iPad16,3)","iPhone 12 mini (iPhone13,1)","iPhone 13 (iPhone14,5)","iPhone 14 (iPhone14,7)","iPhone 15 (iPhone15,4)","iPhone 16 Pro (iPhone17,1)","iPhone 16e (iPhone17,5)","iPhone 17 Pro (iPhone18,1)","iPhone 17 (iPhone18,3)"
2
+ distil-whisper_distil-large-v3,distil-whisper_distil-large-v3,✅ macOS 26.0,✅ macOS 15.6.1,✅ macOS 15.7,⚠️ <a style='color: #3B82F6; text-decoration: underline; text-decoration-style: dotted;' href=https://huggingface.co/datasets/argmaxinc/whisperkit-evals-dataset/blob/main/benchmark_data/2025-09-20T205036_3f451e1/Macmini9%2C1_summary_2025-09-22T120503.json>macOS 26.0</a>,Not Supported,Not Supported,Not Supported,? iPadOS 26.0,? iPadOS 26.0,Not Supported,Not Supported,✅ iPadOS 26.0,Not Supported,Not Supported,Not Supported,Not Supported,Not Supported,Not Supported,⚠️ <a style='color: #3B82F6; text-decoration: underline; text-decoration-style: dotted;' href=https://huggingface.co/datasets/argmaxinc/whisperkit-evals-dataset/blob/main/benchmark_data/2025-09-20T205036_3f451e1/iPhone18%2C1_summary_2025-09-24T114907.json>iOS 26.0</a>,⚠️ <a style='color: #3B82F6; text-decoration: underline; text-decoration-style: dotted;' href=https://huggingface.co/datasets/argmaxinc/whisperkit-evals-dataset/blob/main/benchmark_data/2025-09-20T205036_3f451e1/iPhone18%2C3_summary_2025-09-24T114907.json>iOS 26.0</a>
3
+ distil-whisper_distil-large-v3_594MB,distil-whisper_distil-large-v3_594MB,✅ macOS 26.0,✅ macOS 15.6.1,✅ macOS 15.7,✅ macOS 26.0,Not Supported,Not Supported,✅ iPadOS 18.7,? iPadOS 26.0,? iPadOS 26.0,✅ iPadOS 18.7,✅ iPadOS 18.7,? iPadOS 26.0,Not Supported,✅ iOS 18.7,✅ iOS 18.7,✅ iOS 26.0,⚠️ <a style='color: #3B82F6; text-decoration: underline; text-decoration-style: dotted;' href=https://huggingface.co/datasets/argmaxinc/whisperkit-evals-dataset/blob/main/benchmark_data/2025-09-20T205036_3f451e1/iPhone17%2C1_summary_2025-09-24T114907.json>iOS 26.0</a>,✅ iOS 18.6.2,⚠️ <a style='color: #3B82F6; text-decoration: underline; text-decoration-style: dotted;' href=https://huggingface.co/datasets/argmaxinc/whisperkit-evals-dataset/blob/main/benchmark_data/2025-09-20T205036_3f451e1/iPhone18%2C1_summary_2025-09-24T114907.json>iOS 26.0</a>,⚠️ <a style='color: #3B82F6; text-decoration: underline; text-decoration-style: dotted;' href=https://huggingface.co/datasets/argmaxinc/whisperkit-evals-dataset/blob/main/benchmark_data/2025-09-20T205036_3f451e1/iPhone18%2C3_summary_2025-09-24T114907.json>iOS 26.0</a>
4
+ distil-whisper_distil-large-v3_turbo,distil-whisper_distil-large-v3_turbo,⚠️ <a style='color: #3B82F6; text-decoration: underline; text-decoration-style: dotted;' href=https://huggingface.co/datasets/argmaxinc/whisperkit-evals-dataset/blob/main/benchmark_data/2025-09-20T205036_3f451e1/Mac14%2C3_summary_2025-09-22T150754.json>macOS 26.0</a>,✅ macOS 15.6.1,✅ macOS 15.7,Not Supported,Not Supported,Not Supported,Not Supported,? iPadOS 26.0,? iPadOS 26.0,Not Supported,Not Supported,? iPadOS 26.0,Not Supported,Not Supported,Not Supported,Not Supported,Not Supported,Not Supported,⚠️ <a style='color: #3B82F6; text-decoration: underline; text-decoration-style: dotted;' href=https://huggingface.co/datasets/argmaxinc/whisperkit-evals-dataset/blob/main/benchmark_data/2025-09-20T205036_3f451e1/iPhone18%2C1_summary_2025-09-24T114907.json>iOS 26.0</a>,⚠️ <a style='color: #3B82F6; text-decoration: underline; text-decoration-style: dotted;' href=https://huggingface.co/datasets/argmaxinc/whisperkit-evals-dataset/blob/main/benchmark_data/2025-09-20T205036_3f451e1/iPhone18%2C3_summary_2025-09-24T114907.json>iOS 26.0</a>
5
+ distil-whisper_distil-large-v3_turbo_600MB,distil-whisper_distil-large-v3_turbo_600MB,✅ macOS 26.0,✅ macOS 15.6.1,✅ macOS 15.7,Not Supported,Not Supported,Not Supported,✅ iPadOS 18.7,? iPadOS 26.0,? iPadOS 26.0,✅ iPadOS 18.7,✅ iPadOS 18.7,? iPadOS 26.0,Not Supported,✅ iOS 18.7,✅ iOS 18.7,✅ iOS 26.0,⚠️ <a style='color: #3B82F6; text-decoration: underline; text-decoration-style: dotted;' href=https://huggingface.co/datasets/argmaxinc/whisperkit-evals-dataset/blob/main/benchmark_data/2025-09-20T205036_3f451e1/iPhone17%2C1_summary_2025-09-24T114907.json>iOS 26.0</a>,✅ iOS 18.6.2,⚠️ <a style='color: #3B82F6; text-decoration: underline; text-decoration-style: dotted;' href=https://huggingface.co/datasets/argmaxinc/whisperkit-evals-dataset/blob/main/benchmark_data/2025-09-20T205036_3f451e1/iPhone18%2C1_summary_2025-09-24T114907.json>iOS 26.0</a>,⚠️ <a style='color: #3B82F6; text-decoration: underline; text-decoration-style: dotted;' href=https://huggingface.co/datasets/argmaxinc/whisperkit-evals-dataset/blob/main/benchmark_data/2025-09-20T205036_3f451e1/iPhone18%2C3_summary_2025-09-24T114907.json>iOS 26.0</a>
6
+ openai_whisper-base,openai_whisper-base,✅ macOS 26.0,✅ macOS 15.6.1,✅ macOS 15.7,✅ macOS 26.0,✅ iPadOS 26.0,✅ iPadOS 18.6.2,✅ iPadOS 18.7,✅ iPadOS 26.0,✅ iPadOS 26.0,✅ iPadOS 18.7,✅ iPadOS 18.7,✅ iPadOS 26.0,✅ iOS 18.7,✅ iOS 18.7,✅ iOS 18.7,✅ iOS 26.0,✅ iOS 26.0,✅ iOS 18.6.2,✅ iOS 26.0,✅ iOS 26.0
7
+ openai_whisper-base.en,openai_whisper-base.en,✅ macOS 26.0,✅ macOS 15.6.1,✅ macOS 15.7,✅ macOS 26.0,✅ iPadOS 26.0,✅ iPadOS 18.6.2,✅ iPadOS 18.7,✅ iPadOS 26.0,✅ iPadOS 26.0,✅ iPadOS 18.7,✅ iPadOS 18.7,✅ iPadOS 26.0,✅ iOS 18.7,✅ iOS 18.7,✅ iOS 18.7,✅ iOS 26.0,✅ iOS 26.0,✅ iOS 18.6.2,✅ iOS 26.0,✅ iOS 26.0
8
+ openai_whisper-large-v2,openai_whisper-large-v2,✅ macOS 26.0,✅ macOS 15.6.1,✅ macOS 15.7,⚠️ <a style='color: #3B82F6; text-decoration: underline; text-decoration-style: dotted;' href=https://huggingface.co/datasets/argmaxinc/whisperkit-evals-dataset/blob/main/benchmark_data/2025-09-20T205036_3f451e1/Macmini9%2C1_summary_2025-09-22T120503.json>macOS 26.0</a>,Not Supported,Not Supported,Not Supported,? iPadOS 26.0,? iPadOS 26.0,Not Supported,Not Supported,✅ iPadOS 26.0,Not Supported,Not Supported,Not Supported,Not Supported,Not Supported,Not Supported,✅ iOS 26.0,⚠️ <a style='color: #3B82F6; text-decoration: underline; text-decoration-style: dotted;' href=https://huggingface.co/datasets/argmaxinc/whisperkit-evals-dataset/blob/main/benchmark_data/2025-09-20T205036_3f451e1/iPhone18%2C3_summary_2025-09-24T114907.json>iOS 26.0</a>
9
+ openai_whisper-large-v2_949MB,openai_whisper-large-v2_949MB,✅ macOS 26.0,✅ macOS 15.6.1,✅ macOS 15.7,✅ macOS 26.0,Not Supported,Not Supported,✅ iPadOS 18.7,? iPadOS 26.0,? iPadOS 26.0,✅ iPadOS 18.7,✅ iPadOS 18.7,? iPadOS 26.0,Not Supported,✅ iOS 18.7,✅ iOS 18.7,✅ iOS 26.0,✅ iOS 26.0,✅ iOS 18.6.2,✅ iOS 26.0,✅ iOS 26.0
10
+ openai_whisper-large-v2_turbo,openai_whisper-large-v2_turbo,✅ macOS 26.0,✅ macOS 15.6.1,✅ macOS 15.7,Not Supported,Not Supported,Not Supported,Not Supported,? iPadOS 26.0,? iPadOS 26.0,Not Supported,Not Supported,? iPadOS 26.0,Not Supported,Not Supported,Not Supported,Not Supported,Not Supported,Not Supported,⚠️ <a style='color: #3B82F6; text-decoration: underline; text-decoration-style: dotted;' href=https://huggingface.co/datasets/argmaxinc/whisperkit-evals-dataset/blob/main/benchmark_data/2025-09-20T205036_3f451e1/iPhone18%2C1_summary_2025-09-24T114907.json>iOS 26.0</a>,⚠️ <a style='color: #3B82F6; text-decoration: underline; text-decoration-style: dotted;' href=https://huggingface.co/datasets/argmaxinc/whisperkit-evals-dataset/blob/main/benchmark_data/2025-09-20T205036_3f451e1/iPhone18%2C3_summary_2025-09-24T114907.json>iOS 26.0</a>
11
+ openai_whisper-large-v2_turbo_955MB,openai_whisper-large-v2_turbo_955MB,✅ macOS 26.0,✅ macOS 15.6.1,✅ macOS 15.7,Not Supported,Not Supported,Not Supported,✅ iPadOS 18.7,? iPadOS 26.0,? iPadOS 26.0,✅ iPadOS 18.7,✅ iPadOS 18.7,? iPadOS 26.0,Not Supported,✅ iOS 18.7,✅ iOS 18.7,✅ iOS 26.0,✅ iOS 26.0,✅ iOS 18.6.2,✅ iOS 26.0,✅ iOS 26.0
12
+ openai_whisper-large-v3,openai_whisper-large-v3,✅ macOS 26.0,✅ macOS 15.6.1,✅ macOS 15.7,⚠️ <a style='color: #3B82F6; text-decoration: underline; text-decoration-style: dotted;' href=https://huggingface.co/datasets/argmaxinc/whisperkit-evals-dataset/blob/main/benchmark_data/2025-09-20T205036_3f451e1/Macmini9%2C1_summary_2025-09-22T120503.json>macOS 26.0</a>,Not Supported,Not Supported,Not Supported,? iPadOS 26.0,? iPadOS 26.0,Not Supported,Not Supported,✅ iPadOS 26.0,Not Supported,Not Supported,Not Supported,Not Supported,Not Supported,Not Supported,✅ iOS 26.0,✅ iOS 26.0
13
+ openai_whisper-large-v3-v20240930,openai_whisper-large-v3-v20240930,✅ macOS 26.0,✅ macOS 15.6.1,✅ macOS 15.7,⚠️ <a style='color: #3B82F6; text-decoration: underline; text-decoration-style: dotted;' href=https://huggingface.co/datasets/argmaxinc/whisperkit-evals-dataset/blob/main/benchmark_data/2025-09-20T205036_3f451e1/Macmini9%2C1_summary_2025-09-22T120503.json>macOS 26.0</a>,Not Supported,Not Supported,Not Supported,? iPadOS 26.0,? iPadOS 26.0,Not Supported,Not Supported,? iPadOS 26.0,Not Supported,Not Supported,Not Supported,Not Supported,Not Supported,Not Supported,⚠️ <a style='color: #3B82F6; text-decoration: underline; text-decoration-style: dotted;' href=https://huggingface.co/datasets/argmaxinc/whisperkit-evals-dataset/blob/main/benchmark_data/2025-09-20T205036_3f451e1/iPhone18%2C1_summary_2025-09-24T114907.json>iOS 26.0</a>,⚠️ <a style='color: #3B82F6; text-decoration: underline; text-decoration-style: dotted;' href=https://huggingface.co/datasets/argmaxinc/whisperkit-evals-dataset/blob/main/benchmark_data/2025-09-20T205036_3f451e1/iPhone18%2C3_summary_2025-09-24T114907.json>iOS 26.0</a>
14
+ openai_whisper-large-v3-v20240930_626MB,openai_whisper-large-v3-v20240930_626MB,✅ macOS 26.0,✅ macOS 15.6.1,✅ macOS 15.7,✅ macOS 26.0,Not Supported,Not Supported,✅ iPadOS 18.7,⚠️ <a style='color: #3B82F6; text-decoration: underline; text-decoration-style: dotted;' href=https://huggingface.co/datasets/argmaxinc/whisperkit-evals-dataset/blob/main/benchmark_data/2025-09-20T205036_3f451e1/iPad14%2C8_summary_2025-09-26T141736.json>iPadOS 26.0</a>,⚠️ <a style='color: #3B82F6; text-decoration: underline; text-decoration-style: dotted;' href=https://huggingface.co/datasets/argmaxinc/whisperkit-evals-dataset/blob/main/benchmark_data/2025-09-20T205036_3f451e1/iPad15%2C3_summary_2025-09-26T141736.json>iPadOS 26.0</a>,✅ iPadOS 18.7,✅ iPadOS 18.7,⚠️ <a style='color: #3B82F6; text-decoration: underline; text-decoration-style: dotted;' href=https://huggingface.co/datasets/argmaxinc/whisperkit-evals-dataset/blob/main/benchmark_data/2025-09-20T205036_3f451e1/iPad16%2C3_summary_2025-09-26T141736.json>iPadOS 26.0</a>,Not Supported,✅ iOS 18.7,✅ iOS 18.7,✅ iOS 26.0,⚠️ <a style='color: #3B82F6; text-decoration: underline; text-decoration-style: dotted;' href=https://huggingface.co/datasets/argmaxinc/whisperkit-evals-dataset/blob/main/benchmark_data/2025-09-20T205036_3f451e1/iPhone17%2C1_summary_2025-09-24T114907.json>iOS 26.0</a>,✅ iOS 18.6.2,⚠️ <a style='color: #3B82F6; text-decoration: underline; text-decoration-style: dotted;' href=https://huggingface.co/datasets/argmaxinc/whisperkit-evals-dataset/blob/main/benchmark_data/2025-09-20T205036_3f451e1/iPhone18%2C1_summary_2025-09-24T114907.json>iOS 26.0</a>,⚠️ <a style='color: #3B82F6; text-decoration: underline; text-decoration-style: dotted;' href=https://huggingface.co/datasets/argmaxinc/whisperkit-evals-dataset/blob/main/benchmark_data/2025-09-20T205036_3f451e1/iPhone18%2C3_summary_2025-09-24T114907.json>iOS 26.0</a>
15
+ openai_whisper-large-v3-v20240930_turbo,openai_whisper-large-v3-v20240930_turbo,✅ macOS 26.0,✅ macOS 15.6.1,✅ macOS 15.7,Not Supported,Not Supported,Not Supported,Not Supported,? iPadOS 26.0,? iPadOS 26.0,Not Supported,Not Supported,? iPadOS 26.0,Not Supported,Not Supported,Not Supported,Not Supported,Not Supported,Not Supported,⚠️ <a style='color: #3B82F6; text-decoration: underline; text-decoration-style: dotted;' href=https://huggingface.co/datasets/argmaxinc/whisperkit-evals-dataset/blob/main/benchmark_data/2025-09-20T205036_3f451e1/iPhone18%2C1_summary_2025-09-24T114907.json>iOS 26.0</a>,⚠️ <a style='color: #3B82F6; text-decoration: underline; text-decoration-style: dotted;' href=https://huggingface.co/datasets/argmaxinc/whisperkit-evals-dataset/blob/main/benchmark_data/2025-09-20T205036_3f451e1/iPhone18%2C3_summary_2025-09-24T114907.json>iOS 26.0</a>
16
+ openai_whisper-large-v3-v20240930_turbo_632MB,openai_whisper-large-v3-v20240930_turbo_632MB,✅ macOS 26.0,✅ macOS 15.6.1,✅ macOS 15.7,Not Supported,Not Supported,Not Supported,✅ iPadOS 18.7,? iPadOS 26.0,? iPadOS 26.0,✅ iPadOS 18.7,✅ iPadOS 18.7,? iPadOS 26.0,Not Supported,✅ iOS 18.7,✅ iOS 18.7,✅ iOS 26.0,⚠️ <a style='color: #3B82F6; text-decoration: underline; text-decoration-style: dotted;' href=https://huggingface.co/datasets/argmaxinc/whisperkit-evals-dataset/blob/main/benchmark_data/2025-09-20T205036_3f451e1/iPhone17%2C1_summary_2025-09-24T114907.json>iOS 26.0</a>,✅ iOS 18.6.2,⚠️ <a style='color: #3B82F6; text-decoration: underline; text-decoration-style: dotted;' href=https://huggingface.co/datasets/argmaxinc/whisperkit-evals-dataset/blob/main/benchmark_data/2025-09-20T205036_3f451e1/iPhone18%2C1_summary_2025-09-24T114907.json>iOS 26.0</a>,⚠️ <a style='color: #3B82F6; text-decoration: underline; text-decoration-style: dotted;' href=https://huggingface.co/datasets/argmaxinc/whisperkit-evals-dataset/blob/main/benchmark_data/2025-09-20T205036_3f451e1/iPhone18%2C3_summary_2025-09-24T114907.json>iOS 26.0</a>
17
+ openai_whisper-large-v3_947MB,openai_whisper-large-v3_947MB,✅ macOS 26.0,✅ macOS 15.6.1,✅ macOS 15.7,✅ macOS 26.0,Not Supported,Not Supported,✅ iPadOS 18.7,? iPadOS 26.0,? iPadOS 26.0,✅ iPadOS 18.7,✅ iPadOS 18.7,? iPadOS 26.0,Not Supported,✅ iOS 18.7,✅ iOS 18.7,✅ iOS 26.0,✅ iOS 26.0,✅ iOS 18.6.2,? iOS 26.0,✅ iOS 26.0
18
+ openai_whisper-large-v3_turbo,openai_whisper-large-v3_turbo,✅ macOS 26.0,✅ macOS 15.6.1,✅ macOS 15.7,Not Supported,Not Supported,Not Supported,Not Supported,? iPadOS 26.0,? iPadOS 26.0,Not Supported,Not Supported,? iPadOS 26.0,Not Supported,Not Supported,Not Supported,Not Supported,Not Supported,Not Supported,⚠️ <a style='color: #3B82F6; text-decoration: underline; text-decoration-style: dotted;' href=https://huggingface.co/datasets/argmaxinc/whisperkit-evals-dataset/blob/main/benchmark_data/2025-09-20T205036_3f451e1/iPhone18%2C1_summary_2025-09-24T114907.json>iOS 26.0</a>,⚠️ <a style='color: #3B82F6; text-decoration: underline; text-decoration-style: dotted;' href=https://huggingface.co/datasets/argmaxinc/whisperkit-evals-dataset/blob/main/benchmark_data/2025-09-20T205036_3f451e1/iPhone18%2C3_summary_2025-09-24T114907.json>iOS 26.0</a>
19
+ openai_whisper-large-v3_turbo_954MB,openai_whisper-large-v3_turbo_954MB,✅ macOS 26.0,✅ macOS 15.6.1,✅ macOS 15.7,Not Supported,Not Supported,Not Supported,✅ iPadOS 18.7,? iPadOS 26.0,? iPadOS 26.0,✅ iPadOS 18.7,✅ iPadOS 18.7,? iPadOS 26.0,Not Supported,✅ iOS 18.7,✅ iOS 18.7,✅ iOS 26.0,⚠️ <a style='color: #3B82F6; text-decoration: underline; text-decoration-style: dotted;' href=https://huggingface.co/datasets/argmaxinc/whisperkit-evals-dataset/blob/main/benchmark_data/2025-09-20T205036_3f451e1/iPhone17%2C1_summary_2025-09-24T114907.json>iOS 26.0</a>,✅ iOS 18.6.2,⚠️ <a style='color: #3B82F6; text-decoration: underline; text-decoration-style: dotted;' href=https://huggingface.co/datasets/argmaxinc/whisperkit-evals-dataset/blob/main/benchmark_data/2025-09-20T205036_3f451e1/iPhone18%2C1_summary_2025-09-24T114907.json>iOS 26.0</a>,⚠️ <a style='color: #3B82F6; text-decoration: underline; text-decoration-style: dotted;' href=https://huggingface.co/datasets/argmaxinc/whisperkit-evals-dataset/blob/main/benchmark_data/2025-09-20T205036_3f451e1/iPhone18%2C3_summary_2025-09-24T114907.json>iOS 26.0</a>
20
+ openai_whisper-small,openai_whisper-small,✅ macOS 26.0,✅ macOS 15.6.1,✅ macOS 15.7,✅ macOS 26.0,✅ iPadOS 26.0,✅ iPadOS 18.6.2,✅ iPadOS 18.7,✅ iPadOS 26.0,✅ iPadOS 26.0,✅ iPadOS 18.7,✅ iPadOS 18.7,✅ iPadOS 26.0,✅ iOS 18.7,✅ iOS 18.7,✅ iOS 18.7,✅ iOS 26.0,✅ iOS 26.0,✅ iOS 18.6.2,✅ iOS 26.0,✅ iOS 26.0
21
+ openai_whisper-small.en,openai_whisper-small.en,✅ macOS 26.0,✅ macOS 15.6.1,✅ macOS 15.7,✅ macOS 26.0,✅ iPadOS 26.0,✅ iPadOS 18.6.2,✅ iPadOS 18.7,✅ iPadOS 26.0,✅ iPadOS 26.0,✅ iPadOS 18.7,✅ iPadOS 18.7,✅ iPadOS 26.0,✅ iOS 18.7,✅ iOS 18.7,✅ iOS 18.7,✅ iOS 26.0,✅ iOS 26.0,✅ iOS 18.6.2,✅ iOS 26.0,✅ iOS 26.0
22
+ openai_whisper-tiny,openai_whisper-tiny,✅ macOS 26.0,✅ macOS 15.6.1,✅ macOS 15.7,✅ macOS 26.0,✅ iPadOS 26.0,✅ iPadOS 18.6.2,✅ iPadOS 18.7,✅ iPadOS 26.0,✅ iPadOS 26.0,✅ iPadOS 18.7,✅ iPadOS 18.7,✅ iPadOS 26.0,✅ iOS 18.7,✅ iOS 18.7,✅ iOS 18.7,✅ iOS 26.0,✅ iOS 26.0,✅ iOS 18.6.2,✅ iOS 26.0,✅ iOS 26.0
23
+ openai_whisper-tiny.en,openai_whisper-tiny.en,✅ macOS 26.0,✅ macOS 15.6.1,✅ macOS 15.7,✅ macOS 26.0,✅ iPadOS 26.0,✅ iPadOS 18.6.2,✅ iPadOS 18.7,✅ iPadOS 26.0,✅ iPadOS 26.0,✅ iPadOS 18.7,✅ iPadOS 18.7,✅ iPadOS 26.0,✅ iOS 18.7,✅ iOS 18.7,✅ iOS 18.7,✅ iOS 26.0,✅ iOS 26.0,✅ iOS 18.6.2,✅ iOS 26.0,✅ iOS 26.0
dashboard_data/test_coverage_3f451e1.json ADDED
@@ -0,0 +1,230 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "commit_hash": "3f451e1",
3
+ "total_devices": 137,
4
+ "tested_devices": 94,
5
+ "skipped_devices": 45,
6
+ "coverage_percentage": 68.61313868613139,
7
+ "tested_device_list": [
8
+ "iPhone15,2",
9
+ "iPad14,5",
10
+ "MacBookAir10,1",
11
+ "iPad15,8",
12
+ "iPad14,2",
13
+ "iPad15,5",
14
+ "iPad13,11",
15
+ "iMac21,2",
16
+ "iPhone15,5",
17
+ "Mac14,4",
18
+ "Mac16,9",
19
+ "iPad15,7",
20
+ "iPhone18,3",
21
+ "iPhone17,1",
22
+ "Mac16,13",
23
+ "iPad14,4",
24
+ "iPhone13,4",
25
+ "Mac14,8",
26
+ "Mac14,10",
27
+ "Mac16,8",
28
+ "iPad13,16",
29
+ "iPad14,1",
30
+ "iPad13,5",
31
+ "iPhone14,5",
32
+ "iPhone14,8",
33
+ "iPad13,7",
34
+ "iPad16,5",
35
+ "iPhone17,3",
36
+ "Mac16,2",
37
+ "iPad16,6",
38
+ "iPad16,3",
39
+ "MacBookPro18,4",
40
+ "Mac14,7",
41
+ "iPad13,10",
42
+ "iPad13,17",
43
+ "Mac14,14",
44
+ "Mac16,3",
45
+ "iPad14,9",
46
+ "Mac16,1",
47
+ "iPad16,2",
48
+ "iPhone13,1",
49
+ "Mac14,5",
50
+ "iPhone15,3",
51
+ "MacBookPro18,1",
52
+ "iPad15,4",
53
+ "Mac14,6",
54
+ "Mac16,12",
55
+ "iPad14,6",
56
+ "Mac14,13",
57
+ "MacBookPro18,3",
58
+ "Mac16,10",
59
+ "iPad13,8",
60
+ "iPhone17,4",
61
+ "iPhone13,3",
62
+ "Mac16,11",
63
+ "iPhone14,6",
64
+ "iPhone13,2",
65
+ "Mac13,1",
66
+ "Macmini9,1",
67
+ "iPhone18,1",
68
+ "iPad13,19",
69
+ "iPad13,9",
70
+ "iPad14,8",
71
+ "Mac14,2",
72
+ "iPad14,11",
73
+ "iPhone15,4",
74
+ "MacBookPro17,1",
75
+ "Mac14,9",
76
+ "Mac16,7",
77
+ "iPad16,1",
78
+ "Mac13,2",
79
+ "iPhone14,3",
80
+ "iPad13,1",
81
+ "Mac16,6",
82
+ "Mac16,5",
83
+ "iPhone17,2",
84
+ "iPhone14,4",
85
+ "iPad15,3",
86
+ "Mac14,3",
87
+ "MacBookPro18,2",
88
+ "iPad14,3",
89
+ "Mac14,15",
90
+ "iPad13,4",
91
+ "iPad14,10",
92
+ "iPhone14,7",
93
+ "iPad15,6",
94
+ "iPad13,2",
95
+ "Mac14,12",
96
+ "iPad16,4",
97
+ "iPad13,6",
98
+ "iMac21,1",
99
+ "iPad13,18",
100
+ "iPhone14,2",
101
+ "iPhone17,5"
102
+ ],
103
+ "skipped_device_list": [
104
+ "iPhone12,3",
105
+ "iPhone16,2",
106
+ "iPhone11,6",
107
+ "iPhone11,2",
108
+ "iPad8,3",
109
+ "Mac15,12",
110
+ "iPad11,4",
111
+ "Mac15,9",
112
+ "Mac15,11",
113
+ "iPhone12,4",
114
+ "iPad8,6",
115
+ "Mac15,7",
116
+ "iPad11,1",
117
+ "Mac15,8",
118
+ "iPad8,9",
119
+ "iPad11,7",
120
+ "Mac15,5",
121
+ "iPad8,8",
122
+ "Mac15,3",
123
+ "iPhone11,4",
124
+ "iPad8,12",
125
+ "iPad11,2",
126
+ "iPad8,10",
127
+ "iPad8,7",
128
+ "iPhone12,5",
129
+ "iPhone11,5",
130
+ "iPad8,1",
131
+ "Mac15,4",
132
+ "iPad11,6",
133
+ "iPad8,5",
134
+ "iPhone12,8",
135
+ "iPad8,4",
136
+ "iPhone12,1",
137
+ "iPhone16,1",
138
+ "iPhone12,2",
139
+ "Mac15,10",
140
+ "iPad8,2",
141
+ "iPhone11,3",
142
+ "iPad8,11",
143
+ "iPad12,1",
144
+ "Mac15,13",
145
+ "iPad11,3",
146
+ "iPad12,2",
147
+ "Mac15,6",
148
+ "iPhone11,8"
149
+ ],
150
+ "tested_os_versions": [
151
+ "iPadOS_18.7",
152
+ "iOS_18.6.2",
153
+ "iOS_26.0",
154
+ "iPadOS_26.0",
155
+ "macOS_15.7",
156
+ "iOS_18.7",
157
+ "iPadOS_18.6.2",
158
+ "macOS_15.7.0",
159
+ "macOS_15.6.1",
160
+ "macOS_26.0",
161
+ "macOS_26.0.0"
162
+ ],
163
+ "has_target_os_coverage": false,
164
+ "covered_target_versions": [
165
+ "macOS 15",
166
+ "macOS 26",
167
+ "iOS 18",
168
+ "iOS 26"
169
+ ],
170
+ "missing_target_versions": [
171
+ "macOS 14",
172
+ "iOS 17"
173
+ ],
174
+ "has_target_chip_coverage": false,
175
+ "platform_chip_coverage": {
176
+ "iPad": {
177
+ "total_chips": 8,
178
+ "tested_chips": 8,
179
+ "coverage_percentage": 100.0,
180
+ "covered_chips": [
181
+ "A14",
182
+ "A15",
183
+ "A16",
184
+ "A17 Pro",
185
+ "M1",
186
+ "M2",
187
+ "M3",
188
+ "M4"
189
+ ],
190
+ "missing_chips": []
191
+ },
192
+ "iPhone": {
193
+ "total_chips": 6,
194
+ "tested_chips": 5,
195
+ "coverage_percentage": 83.33333333333334,
196
+ "covered_chips": [
197
+ "A14",
198
+ "A15",
199
+ "A16",
200
+ "A18",
201
+ "A18 Pro"
202
+ ],
203
+ "missing_chips": [
204
+ "A17 Pro"
205
+ ]
206
+ },
207
+ "Mac": {
208
+ "total_chips": 4,
209
+ "tested_chips": 3,
210
+ "coverage_percentage": 75.0,
211
+ "covered_chips": [
212
+ "M1",
213
+ "M2",
214
+ "M4"
215
+ ],
216
+ "missing_chips": [
217
+ "M3"
218
+ ]
219
+ }
220
+ },
221
+ "missing_target_chips": {
222
+ "iPad": [],
223
+ "iPhone": [
224
+ "A17 Pro"
225
+ ],
226
+ "Mac": [
227
+ "M3"
228
+ ]
229
+ }
230
+ }