diff --git a/work/notes/webkit-macos-version-mapping.md b/work/notes/webkit-macos-version-mapping.md
index ce4e869f..a3e1e11e 100755
--- a/work/notes/webkit-macos-version-mapping.md
+++ b/work/notes/webkit-macos-version-mapping.md
@@ -1,149 +1,402 @@
---
-title: Mapping Apple OS builds to WebKit source releases
+title: Apple OS to WebKit release mapping
tags: [webkit, safari, macos, ios, crash, ravel, reference]
created: 2026-10-06
updated: 2026-10-06
---
-# Mapping Apple OS builds to WebKit source releases
+# Apple OS to WebKit release mapping
-## Purpose
+## Read this first
-This document explains how to map a WebKit crash on macOS or iOS to:
+This is the lookup table for DuckDuckGo's supported range: **macOS 12.3+** and **iOS 15.0+**. It includes every stable minor and patch release recorded by AppleDB through **2026-10-06**.
-1. the exact Apple OS build;
-2. the exact system WebKit binary by Mach-O UUID;
-3. its `CFBundleVersion` and WebKit `FULL_VERSION`;
-4. the closest public WebKit source tag;
-5. the presence or absence of a source change.
+Missing version numbers are intentional: Apple did not publish a stable release with that number.
-The DuckDuckGo Apple browsers currently support macOS **12.3+** and iOS **15.0+**. The deployment targets are defined in `macOS/Configuration/Common.xcconfig` and `iOS/DuckDuckGo-iOS.xcodeproj/project.pbxproj` in the Apple browsers repository.
+Evidence labels:
-## Short answer
+| Label | Meaning |
+|---|---|
+| `exact/tag` | Apple published an OS-specific WebKit source tag. The full five-part source version is known. |
+| `exact/binary` | The OS build, WebKit UUID and `CFBundleVersion` were matched in Ravel. |
+| `train` | The Safari/WebKit release family is known, but Apple has not published an exact OS-specific source tag. `.*` is intentional. |
-Use this chain for an exact mapping:
+An OS marketing version alone is not enough for crash forensics. Hardware-specific OS builds can differ, and macOS can receive Safari/WebKit updates separately. For an exact answer, match **OS build + WebKit UUID + `CFBundleVersion`**.
-```text
-OS version + OS build
- -> WebKit Mach-O UUID from the crash report
- -> matching binary and UUID in Ravel
- -> WebKit CFBundleVersion from the OS or app telemetry
- -> remove the platform SYSTEM_VERSION_PREFIX
- -> WebKit FULL_VERSION
- -> public source tag or release branch
- -> inspect the released code for the fix
-```
+## iOS mapping
-An OS major version identifies only a **WebKit release train**. It does not identify the exact WebKit revision because Apple updates WebKit in OS point and security releases.
+iOS production bundle versions use prefix `8`: `CFBundleVersion = 8 + FULL_VERSION`.
-## Version fields
-| Field | Example | Meaning |
-|---|---:|---|
-| OS version | `macOS 27.0.1` | Marketing version |
-| OS build | `26A434` | Exact Apple OS build; use this in Ravel |
-| Mach-O UUID | `70BEE322-...` | Exact WebKit binary identity for one architecture |
-| `CFBundleVersion` | `22625.1.29.11.28` | System framework build version |
-| `SYSTEM_VERSION_PREFIX` | `22` | Platform/OS prefix added by Apple's production build |
-| WebKit `FULL_VERSION` | `625.1.29.11.28` | Release version without the system prefix |
-| Source tag | `WebKit-7625.1.29.11.28` | Candidate public source release |
-| HTTP User-Agent | `AppleWebKit/605.1.15` | Frozen compatibility token; not usable for this mapping |
+### iOS 15
-## Supported OS release trains
+| OS version | Apple build(s) | Safari | WebKit `FULL_VERSION` | Source release | Evidence |
+|---|---|---:|---:|---|---|
+| `15.0` | `19A341`
`19A344`
`19A345`
`19A346` | `15` | `612.1.27.0.31` | `Safari-612.1.27.0.31` | `exact/tag` |
+| `15.0.1` | `19A348` | `15` | `612.1.27.0.31` | `Safari-612.1.27.0.31` | `exact/tag` |
+| `15.0.2` | `19A404` | `15` | `612.1.27.0.31` | `Safari-612.1.27.0.31` | `exact/tag` |
+| `15.1` | `19B74` | `15.1` | `612.2.9.0.20` | `Safari-612.2.9.0.20` | `exact/tag` |
+| `15.1.1` | `19B81` | `15.1` | `612.2.9.0.20` | `Safari-612.2.9.0.20` | `exact/tag` |
+| `15.2` | `19C56`
`19C57` | `15.2` | `612.3.6.0.4` | `Safari-612.3.6.0.4` | `exact/tag` |
+| `15.2.1` | `19C63` | `15.2` | `612.3.6.0.4` | `Safari-612.3.6.0.4` | `exact/tag` |
+| `15.3` | `19D50` | `15.3` | `612.4.9.0.3` | `Safari-612.4.9.0.3` | `exact/tag` |
+| `15.3.1` | `19D52` | `15.3` | `612.4.9.0.4` | `Safari-612.4.9.0.4` | `exact/tag` |
+| `15.4` | `19E241` | `15.4` | `613.1.17.0.7` | `Safari-613.1.17.0.7` | `exact/tag` |
+| `15.4.1` | `19E258` | `15.4` | `613.1.17.0.8` | `Safari-613.1.17.0.8` | `exact/tag` |
+| `15.5` | `19F77` | `15.5` | `613.2.7.0.7` | `WebKit-7613.2.7.0.7` | `exact/tag` |
+| `15.6` | `19G71` | `15.6` | `613.3.9.0.5` | `WebKit-7613.3.9.0.5` | `exact/tag` |
+| `15.6.1` | `19G82` | `15.6` | `613.3.9.*` | `WebKit-7613.3.9.*` | `train` |
+| `15.7` | `19H12` | `15.6.2` | `613.4.1.0.2` | `WebKit-7613.4.1.0.2` | `exact/tag` |
+| `15.7.1` | `19H117` | `15.6.3` | `613.5.1.0.2` | `WebKit-7613.5.1.0.2` | `exact/tag` |
+| `15.7.2` | `19H218` | `15.6.4` | `613.6.1.0.3` | `WebKit-7613.6.1.0.3` | `exact/tag` |
+| `15.7.3` | `19H307` | `15.6.4` | `613.7.1.0.1` | `WebKit-7613.7.1.0.1` | `exact/tag` |
+| `15.7.4` | `19H321` | `15.6.4` | `613.7.1.0.5` | `WebKit-7613.7.1.0.5` | `exact/tag` |
+| `15.7.5` | `19H332` | `15.6.4` | `613.7.1.0.6` | `WebKit-7613.7.1.0.6` | `exact/tag` |
+| `15.7.6` | `19H349` | `15.6.4` | `613.7.1.0.8` | `WebKit-7613.7.1.0.8` | `exact/tag` |
+| `15.7.7` | `19H357` | `15.6.6` | `613.7.1.0.10` | `WebKit-7613.7.1.0.10` | `exact/tag` |
+| `15.7.8` | `19H364` | `15.6.6` | `613.7.1.0.13` | `WebKit-7613.7.1.0.13` | `exact/tag` |
+| `15.7.9` | `19H365` | `15.6.6` | `613.7.1.0.13` | `WebKit-7613.7.1.0.13` | `exact/tag` |
+| `15.8` | `19H370` | `15.6.6` | `613.7.1.0.13` | `WebKit-7613.7.1.0.13` | `exact/tag` |
+| `15.8.1` | `19H380` | `15.6` | `613.7.1.*` | `WebKit-7613.7.1.*` | `train` |
+| `15.8.2` | `19H384` | `15.6` | `613.7.1.*` | `WebKit-7613.7.1.*` | `train` |
+| `15.8.3` | `19H386` | `15.6` | `613.7.1.*` | `WebKit-7613.7.1.*` | `train` |
+| `15.8.4` | `19H390` | `15.6` | `613.7.1.*` | `WebKit-7613.7.1.*` | `train` |
+| `15.8.5` | `19H394` | `15.6` | `613.7.1.*` | `WebKit-7613.7.1.*` | `train` |
+| `15.8.6` | `19H402` | `15.6` | `613.7.1.*` | `WebKit-7613.7.1.*` | `train` |
+| `15.8.7` | `19H411` | `15.6` | `613.7.1.*` | `WebKit-7613.7.1.*` | `train` |
+| `15.8.8` | `19H422` | `15.6` | `613.7.1.*` | `WebKit-7613.7.1.*` | `train` |
-These tables map each supported OS major to its initial Safari/WebKit release train. Always use the exact-build workflow for a crash or API-availability decision.
+### iOS 16
-### macOS 12.3+
+| OS version | Apple build(s) | Safari | WebKit `FULL_VERSION` | Source release | Evidence |
+|---|---|---:|---:|---|---|
+| `16.0` | `20A357`
`20A362` | `16` | `614.1.25.0.30` | `WebKit-7614.1.25.0.30` | `exact/tag` |
+| `16.0.1` | `20A371` | `16` | `614.1.25.0.30` | `WebKit-7614.1.25.0.30` | `exact/tag` |
+| `16.0.2` | `20A380` | `16` | `614.1.25.0.31` | `WebKit-7614.1.25.0.31` | `exact/tag` |
+| `16.0.3` | `20A392` | `16` | `614.1.25.0.31` | `WebKit-7614.1.25.0.31` | `exact/tag` |
+| `16.1` | `20B82` | `16.1` | `614.2.9.0.10` | `WebKit-7614.2.9.0.10` | `exact/tag` |
+| `16.1.1` | `20B101` | `16.1` | `614.2.9.0.10` | `WebKit-7614.2.9.0.10` | `exact/tag` |
+| `16.1.2` | `20B110` | `16.1` | `614.2.9.0.11` | `WebKit-7614.2.9.0.11` | `exact/tag` |
+| `16.2` | `20C65` | `16.2` | `614.3.7.0.6` | `WebKit-7614.3.7.0.6` | `exact/tag` |
+| `16.3` | `20D47`
`20D50` | `16.3` | `614.4.6.0.5` | `WebKit-7614.4.6.0.5` | `exact/tag` |
+| `16.3.1` | `20D67` | `16.3` | `614.4.6.0.6` | `WebKit-7614.4.6.0.6` | `exact/tag` |
+| `16.4` | `20E247` | `16.4` | `615.1.26.10.23` | `WebKit-7615.1.26.10.23` | `exact/tag` |
+| `16.4.1` | `20E252` | `16.4` | `615.1.26.10.24` | `WebKit-7615.1.26.10.24` | `exact/tag` |
+| `16.5` | `20F66` | `16.5` | `615.2.9.10.3` | `WebKit-7615.2.9.10.3` | `exact/tag` |
+| `16.5.1` | `20F75` | `16.5` | `615.2.9.*` | `WebKit-7615.2.9.*` | `train` |
+| `16.6` | `20G75` | `16.6` | `615.3.12.10.2` | `WebKit-7615.3.12.10.2` | `exact/tag` |
+| `16.6.1` | `20G81` | `16.6` | `615.3.12.10.2` | `WebKit-7615.3.12.10.2` | `exact/tag` |
+| `16.7` | `20H19` | `16.6` | `615.3.12.10.4` | `WebKit-7615.3.12.10.4` | `exact/tag` |
+| `16.7.1` | `20H30` | `16.6` | `615.3.12.*` | `WebKit-7615.3.12.*` | `train` |
+| `16.7.2` | `20H115` | `16.6` | `615.3.12.110.2` | `WebKit-7615.3.12.110.2` | `exact/tag` |
+| `16.7.3` | `20H232` | `16.6` | `615.3.12.*` | `WebKit-7615.3.12.*` | `train` |
+| `16.7.4` | `20H240` | `16.6` | `615.3.12.*` | `WebKit-7615.3.12.*` | `train` |
+| `16.7.5` | `20H307` | `16.6` | `615.3.12.*` | `WebKit-7615.3.12.*` | `train` |
+| `16.7.6` | `20H320` | `16.6` | `615.3.12.*` | `WebKit-7615.3.12.*` | `train` |
+| `16.7.7` | `20H330` | `16.6` | `615.3.12.*` | `WebKit-7615.3.12.*` | `train` |
+| `16.7.8` | `20H343` | `16.6` | `615.3.12.*` | `WebKit-7615.3.12.*` | `train` |
+| `16.7.9` | `20H348` | `16.6` | `615.3.12.*` | `WebKit-7615.3.12.*` | `train` |
+| `16.7.10` | `20H350` | `16.6` | `615.3.12.*` | `WebKit-7615.3.12.*` | `train` |
+| `16.7.11` | `20H360` | `16.6` | `615.3.12.*` | `WebKit-7615.3.12.*` | `train` |
+| `16.7.12` | `20H364` | `16.6` | `615.3.12.*` | `WebKit-7615.3.12.*` | `train` |
+| `16.7.13` | `20H365` | `16.6` | `615.3.12.*` | `WebKit-7615.3.12.*` | `train` |
+| `16.7.14` | `20H370` | `16.6` | `615.3.12.*` | `WebKit-7615.3.12.*` | `train` |
+| `16.7.15` | `20H380` | `16.6` | `615.3.12.*` | `WebKit-7615.3.12.*` | `train` |
+| `16.7.16` | `20H392` | `16.6` | `615.3.12.*` | `WebKit-7615.3.12.*` | `train` |
-| macOS | DDG support | Safari release | WebKit base `FULL_VERSION` | macOS prefix | Production bundle base | Public source-tag family |
-|---|---:|---:|---:|---:|---:|---|
-| 12 Monterey | 12.3+ | 15 | `612.1.27` | `17` | `17612.1.27` | `Safari-612.1.27.*` |
-| 13 Ventura | Yes | 16 | `614.1.25` | `18` | `18614.1.25` | `WebKit-7614.1.25.*` |
-| 14 Sonoma | Yes | 17 | `616.1.27` | `19` | `19616.1.27` | `WebKit-7616.1.27.*` |
-| 15 Sequoia | Yes | 18 | `619.1.26` | `20` | `20619.1.26` | `WebKit-7619.1.26.*` |
-| 26 Tahoe | Yes | 26 | `622.1.22` | `21` | `21622.1.22` | `WebKit-7622.1.22.*` |
-| 27 Golden Gate | Yes | 27 | `625.1.29` | `22` | `22625.1.29` | `WebKit-7625.1.29.*` |
+### iOS 17
-### iOS 15.0+
+| OS version | Apple build(s) | Safari | WebKit `FULL_VERSION` | Source release | Evidence |
+|---|---|---:|---:|---|---|
+| `17.0` | `21A326`
`21A327`
`21A329`
`21A331` | `17` | `616.1.27.10.13` | `WebKit-7616.1.27.10.13` | `exact/tag` |
+| `17.0.1` | `21A340` | `17` | `616.1.27.10.15` | `WebKit-7616.1.27.10.15` | `exact/tag` |
+| `17.0.2` | `21A350`
`21A351` | `17` | `616.1.27.10.15` | `WebKit-7616.1.27.10.15` | `exact/tag` |
+| `17.0.3` | `21A360` | `17` | `616.1.27.*` | `WebKit-7616.1.27.*` | `train` |
+| `17.1` | `21B74`
`21B80` | `17.1` | `616.2.9.*` | `WebKit-7616.2.9.*` | `train` |
+| `17.1.1` | `21B91` | `17.1` | `616.2.9.*` | `WebKit-7616.2.9.*` | `train` |
+| `17.1.2` | `21B101` | `17.1` | `616.2.9.*` | `WebKit-7616.2.9.*` | `train` |
+| `17.2` | `21C62` | `17.2` | `617.1.17.10.9` | `WebKit-7617.1.17.10.9` | `exact/tag` |
+| `17.2.1` | `21C66` | `17.2` | `617.1.17.10.9` | `WebKit-7617.1.17.10.9` | `exact/tag` |
+| `17.3` | `21D50` | `17.3` | `617.2.4.*` | `WebKit-7617.2.4.*` | `train` |
+| `17.3.1` | `21D61` | `17.3.1` | `617.2.4.10.8` | `WebKit-7617.2.4.10.8` | `exact/tag` |
+| `17.4` | `21E219` | `17.4` | `618.1.15.10.11` | `WebKit-7618.1.15.10.11` | `exact/tag` |
+| `17.4.1` | `21E236`
`21E237` | `17.4` | `618.1.15.*` | `WebKit-7618.1.15.*` | `train` |
+| `17.5` | `21F79` | `17.5` | `618.2.12.10.9` | `WebKit-7618.2.12.10.9` | `exact/tag` |
+| `17.5.1` | `21F90` | `17.5` | `618.2.12.10.9` | `WebKit-7618.2.12.10.9` | `exact/tag` |
+| `17.6` | `21G80` | `17.6` | `618.3.11.10.5` | `WebKit-7618.3.11.10.5` | `exact/tag` |
+| `17.6.1` | `21G101`
`21G93` | `17.6` | `618.3.11.10.5` | `WebKit-7618.3.11.10.5` | `exact/tag` |
+| `17.7` | `21H16` | `17.6` | `618.3.11.*` | `WebKit-7618.3.11.*` | `train` |
+| `17.7.1` | `21H216` | `17.6` | `618.3.11.*` | `WebKit-7618.3.11.*` | `train` |
+| `17.7.2` | `21H221` | `17.6` | `618.3.11.*` | `WebKit-7618.3.11.*` | `train` |
-WebKit uses `SYSTEM_VERSION_PREFIX = 8` for iPhone-family SDKs. Therefore the iOS production bundle version is `8` concatenated with `FULL_VERSION`.
+### iOS 18
-| iOS | DDG support | Safari release | WebKit base `FULL_VERSION` | iOS prefix | Production bundle base | Public source-tag family |
-|---|---:|---:|---:|---:|---:|---|
-| 15 | 15.0+ | 15 | `612.1.27` | `8` | `8612.1.27` | `Safari-612.1.27.*` |
-| 16 | Yes | 16 | `614.1.25` | `8` | `8614.1.25` | `WebKit-7614.1.25.*` |
-| 17 | Yes | 17 | `616.1.27` | `8` | `8616.1.27` | `WebKit-7616.1.27.*` |
-| 18 | Yes | 18 | `619.1.26` | `8` | `8619.1.26` | `WebKit-7619.1.26.*` |
-| 26 | Yes | 26 | `622.1.22` | `8` | `8622.1.22` | `WebKit-7622.1.22.*` |
-| 27 | Yes | 27 | `625.1.29` | `8` | `8625.1.29` | `WebKit-7625.1.29.*` |
+| OS version | Apple build(s) | Safari | WebKit `FULL_VERSION` | Source release | Evidence |
+|---|---|---:|---:|---|---|
+| `18.0` | `22A3351`
`22A3354` | `18` | `619.1.26.30.5` | `WebKit-7619.1.26.30.5` | `exact/tag` |
+| `18.0.1` | `22A3370` | `18` | `619.1.26.*` | `WebKit-7619.1.26.*` | `train` |
+| `18.1` | `22B83` | `18.1` | `619.2.8.10.7` | `WebKit-7619.2.8.10.7` | `exact/tag` |
+| `18.1.1` | `22B91` | `18.1.1` | `619.2.8.10.9` | `WebKit-7619.2.8.10.9` | `exact/tag` |
+| `18.2` | `22C152` | `18.2` | `620.1.16.10.11` | `WebKit-7620.1.16.10.11` | `exact/tag` |
+| `18.2.1` | `22C161` | `18.2` | `620.1.16.10.11` | `WebKit-7620.1.16.10.11` | `exact/tag` |
+| `18.3` | `22D63`
`22D64`
`22D8063` | `18.3` | `620.2.4.10.7` | `WebKit-7620.2.4.10.7` | `exact/tag` |
+| `18.3.1` | `22D72`
`22D8075` | `18.3` | `620.2.4.10.7` | `WebKit-7620.2.4.10.7` | `exact/tag` |
+| `18.3.2` | `22D8082`
`22D82` | `18.3.1` | `620.2.4.10.8` | `WebKit-7620.2.4.10.8` | `exact/tag` |
+| `18.4` | `22E240` | `18.4` | `621.1.15.*` | `WebKit-7621.1.15.*` | `train` |
+| `18.4.1` | `22E252` | `18.4` | `621.1.15.*` | `WebKit-7621.1.15.*` | `train` |
+| `18.5` | `22F76` | `18.5` | `621.2.5.*` | `WebKit-7621.2.5.*` | `train` |
+| `18.6` | `22G86` | `18.6` | `621.3.11.*` | `WebKit-7621.3.11.*` | `train` |
+| `18.6.1` | `22G90` | `18.6` | `621.3.11.*` | `WebKit-7621.3.11.*` | `train` |
+| `18.6.2` | `22G100` | `18.6` | `621.3.11.*` | `WebKit-7621.3.11.*` | `train` |
+| `18.7` | `22H20` | `18.6` | `621.3.11.*` | `WebKit-7621.3.11.*` | `train` |
+| `18.7.1` | `22H31` | `18.6` | `621.3.11.*` | `WebKit-7621.3.11.*` | `train` |
+| `18.7.2` | `22H124` | `18.6` | `621.3.11.*` | `WebKit-7621.3.11.*` | `train` |
+| `18.7.3` | `22H217` | `18.6` | `621.3.11.*` | `WebKit-7621.3.11.*` | `train` |
+| `18.7.4` | `22H218` | `18.6` | `621.3.11.*` | `WebKit-7621.3.11.*` | `train` |
+| `18.7.5` | `22H311` | `18.6` | `621.3.11.*` | `WebKit-7621.3.11.*` | `train` |
+| `18.7.6` | `22H320` | `18.6` | `621.3.11.*` | `WebKit-7621.3.11.*` | `train` |
+| `18.7.7` | `22H333`
`22H340` | `18.6` | `621.3.11.*` | `WebKit-7621.3.11.*` | `train` |
+| `18.7.8` | `22H352` | `18.6` | `621.3.11.*` | `WebKit-7621.3.11.*` | `train` |
+| `18.7.9` | `22H355` | `18.6` | `621.3.11.*` | `WebKit-7621.3.11.*` | `train` |
+| `18.7.10` | `22H374` | `18.6` | `621.3.11.*` | `WebKit-7621.3.11.*` | `train` |
-iOS versions 19–25 do not exist; Apple changed the public version number from 18 to 26.
+### iOS 26
-## Exact builds verified in Ravel
+| OS version | Apple build(s) | Safari | WebKit `FULL_VERSION` | Source release | Evidence |
+|---|---|---:|---:|---|---|
+| `26.0` | `23A330`
`23A341`
`23A345` | `26` | `622.1.22.*` | `WebKit-7622.1.22.*` | `train` |
+| `26.0.1` | `23A355` | `26` | `622.1.22.*` | `WebKit-7622.1.22.*` | `train` |
+| `26.1` | `23B85` | `26.1` | `622.2.11.*` | `WebKit-7622.2.11.*` | `train` |
+| `26.2` | `23C55` | `26.2` | `623.1.14.*` | `WebKit-7623.1.14.*` | `train` |
+| `26.2.1` | `23C71` | `26.2` | `623.1.14.*` | `WebKit-7623.1.14.*` | `train` |
+| `26.3` | `23D127`
`23D8128` | `26.3` | `623.2.7.*` | `WebKit-7623.2.7.*` | `train` |
+| `26.3.1` | `23D8133` | `26.3` | `623.2.7.*` | `WebKit-7623.2.7.*` | `train` |
+| `26.4` | `23E246` | `26.4` | `624.1.16.*` | `WebKit-7624.1.16.*` | `train` |
+| `26.4.1` | `23E254` | `26.4` | `624.1.16.*` | `WebKit-7624.1.16.*` | `train` |
+| `26.4.2` | `23E261` | `26.4` | `624.1.16.*` | `WebKit-7624.1.16.*` | `train` |
+| `26.5` | `23F77` | `26.5` | `624.2.5.*` | `WebKit-7624.2.5.*` | `train` |
+| `26.5.1` | `23F81` | `26.5` | `624.2.5.*` | `WebKit-7624.2.5.*` | `train` |
+| `26.5.2` | `23F84` | `26.5` | `624.2.5.*` | `WebKit-7624.2.5.*` | `train` |
+| `26.6` | `23G71` | `26.6` | `624.4.5.*` | `WebKit-7624.4.5.*` | `train` |
+| `26.6.1` | `23G83` | `26.6` | `624.4.5.*` | `WebKit-7624.4.5.*` | `train` |
+| `26.6.2` | `23G90` | `26.6` | `624.4.5.*` | `WebKit-7624.4.5.*` | `train` |
+| `26.7` | `23H24` | `26.6` | `624.5.1.*` | `WebKit-7624.5.1.*` | `train` |
+| `26.7.1` | `23H30` | `26.6` | `624.5.1.*` | `WebKit-7624.5.1.*` | `train` |
-Ravel is currently incomplete. A missing build means that Ravel does not index it, not that the OS lacks WebKit.
+### iOS 27
-### macOS examples
+| OS version | Apple build(s) | Safari | WebKit `FULL_VERSION` | Source release | Evidence |
+|---|---|---:|---:|---|---|
+| `27.0` | `24A427`
`24A437`
`24A8428` | `27` | `625.1.29.*` | `WebKit-7625.1.29.*` | `train` |
+| `27.0.1` | `24A446` | `27` | `625.1.29.*` | `WebKit-7625.1.29.*` | `train` |
+
+
+## macOS mapping
+
+macOS production prefixes are: 12 → `17`, 13 → `18`, 14 → `19`, 15 → `20`, 26 → `21`, 27 → `22`.
+
+
+### macOS 12
+
+| OS version | Apple build(s) | Safari | WebKit `FULL_VERSION` | Source release | Evidence |
+|---|---|---:|---:|---|---|
+| `12.3` | `21E230` | `15.4` | `613.1.17.1.6` | `Safari-613.1.17.1.6` | `exact/tag` |
+| `12.3.1` | `21E258` | `15.4` | `613.1.17.1.13` | `Safari-613.1.17.1.13` | `exact/tag` |
+| `12.4` | `21F2081`
`21F2092`
`21F79` | `15.5` | `613.2.7.1.8` | `WebKit-7613.2.7.1.8` | `exact/tag` |
+| `12.5` | `21G72` | `15.6` | `613.3.9.1.5` | `WebKit-7613.3.9.1.5` | `exact/tag` |
+| `12.5.1` | `21G83` | `15.6` | `613.3.9.*` | `WebKit-7613.3.9.*` | `train` |
+| `12.6` | `21G115` | `16` | `614.1.25.*` | `WebKit-7614.1.25.*` | `train` |
+| `12.6.1` | `21G217` | `16.1` | `614.2.9.*` | `WebKit-7614.2.9.*` | `train` |
+| `12.6.2` | `21G320` | `16.2` | `614.3.7.*` | `WebKit-7614.3.7.*` | `train` |
+| `12.6.3` | `21G419` | `16.3` | `614.4.6.*` | `WebKit-7614.4.6.*` | `train` |
+| `12.6.4` | `21G526` | `16.4` | `615.1.26.*` | `WebKit-7615.1.26.*` | `train` |
+| `12.6.5` | `21G531` | `16.4` | `615.1.26.*` | `WebKit-7615.1.26.*` | `train` |
+| `12.6.6` | `21G646` | `16.5` | `615.2.9.*` | `WebKit-7615.2.9.*` | `train` |
+| `12.6.7` | `21G651` | `16.5.1` | `615.2.9.*` | `WebKit-7615.2.9.*` | `train` |
+| `12.6.8` | `21G725` | `16.6` | `615.3.12.*` | `WebKit-7615.3.12.*` | `train` |
+| `12.6.9` | `21G726` | `16.6` | `615.3.12.*` | `WebKit-7615.3.12.*` | `train` |
+| `12.7` | `21G816` | `16.6` | `615.3.12.*` | `WebKit-7615.3.12.*` | `train` |
+| `12.7.1` | `21G920` | `16.6` | `615.3.12.*` | `WebKit-7615.3.12.*` | `train` |
+| `12.7.2` | `21G1974` | `16.6` | `615.3.12.*` | `WebKit-7615.3.12.*` | `train` |
+| `12.7.3` | `21H1015` | `16.6` | `615.3.12.*` | `WebKit-7615.3.12.*` | `train` |
+| `12.7.4` | `21H1123` | `16.6` | `615.3.12.*` | `WebKit-7615.3.12.*` | `train` |
+| `12.7.5` | `21H1222` | `16.6` | `615.3.12.*` | `WebKit-7615.3.12.*` | `train` |
+| `12.7.6` | `21H1320` | `16.6` | `615.3.12.*` | `WebKit-7615.3.12.*` | `train` |
+
+### macOS 13
+
+| OS version | Apple build(s) | Safari | WebKit `FULL_VERSION` | Source release | Evidence |
+|---|---|---:|---:|---|---|
+| `13.0` | `22A380`
`22A8380`
`22A8381` | `16.1` | `614.2.9.1.12` | `WebKit-7614.2.9.1.12` | `exact/tag` |
+| `13.0.1` | `22A400` | `16.1` | `614.2.9.1.12` | `WebKit-7614.2.9.1.12` | `exact/tag` |
+| `13.1` | `22C65` | `16.2` | `614.3.7.1.5` | `WebKit-7614.3.7.1.5` | `exact/tag` |
+| `13.2` | `22D49` | `16.3` | `614.4.6.1.5` | `WebKit-7614.4.6.1.5` | `exact/tag` |
+| `13.2.1` | `22D68` | `16.3` | `614.4.6.1.6` | `WebKit-7614.4.6.1.6` | `exact/tag` |
+| `13.3` | `22E252`
`22E8252` | `16.4` | `615.1.26.11.22` | `WebKit-7615.1.26.11.22` | `exact/tag` |
+| `13.3.1` | `22E261` | `16.4` | `615.1.26.11.23` | `WebKit-7615.1.26.11.23` | `exact/tag` |
+| `13.4` | `22F2063`
`22F2073`
`22F66` | `16.5` | `615.2.9.11.4` | `WebKit-7615.2.9.11.4` | `exact/tag` |
+| `13.4.1` | `22F2083`
`22F82` | `16.5.1` | `615.2.9.11.7` | `WebKit-7615.2.9.11.7` | `exact/tag` |
+| `13.5` | `22G2074`
`22G2080`
`22G74` | `16.6` | `615.3.12.11.2` | `WebKit-7615.3.12.11.2` | `exact/tag` |
+| `13.5.1` | `22G90` | `16.6` | `615.3.12.11.2` | `WebKit-7615.3.12.11.2` | `exact/tag` |
+| `13.5.2` | `22G91` | `16.6` | `615.3.12.11.2` | `WebKit-7615.3.12.11.2` | `exact/tag` |
+| `13.6` | `22G120` | `16.6` | `615.3.12.11.2` | `WebKit-7615.3.12.11.2` | `exact/tag` |
+| `13.6.1` | `22G313` | `16.6` | `615.3.12.11.2` | `WebKit-7615.3.12.11.2` | `exact/tag` |
+| `13.6.2` | `22G2321`
`22G320` | `16.6` | `615.3.12.11.2` | `WebKit-7615.3.12.11.2` | `exact/tag` |
+| `13.6.3` | `22G436` | `16.6` | `615.3.12.11.2` | `WebKit-7615.3.12.11.2` | `exact/tag` |
+| `13.6.4` | `22G513` | `16.6` | `615.3.12.11.2` | `WebKit-7615.3.12.11.2` | `exact/tag` |
+| `13.6.5` | `22G621` | `16.6` | `615.3.12.11.2` | `WebKit-7615.3.12.11.2` | `exact/tag` |
+| `13.6.6` | `22G630` | `16.6` | `615.3.12.11.2` | `WebKit-7615.3.12.11.2` | `exact/tag` |
+| `13.6.7` | `22G720` | `16.6` | `615.3.12.11.2` | `WebKit-7615.3.12.11.2` | `exact/tag` |
+| `13.6.8` | `22G820` | `16.6` | `615.3.12.11.2` | `WebKit-7615.3.12.11.2` | `exact/tag` |
+| `13.6.9` | `22G830` | `16.6` | `615.3.12.11.2` | `WebKit-7615.3.12.11.2` | `exact/tag` |
+| `13.7` | `22H123` | `16.6` | `615.3.12.11.2` | `WebKit-7615.3.12.11.2` | `exact/tag` |
+| `13.7.1` | `22H221` | `16.6` | `615.3.12.11.2` | `WebKit-7615.3.12.11.2` | `exact/tag` |
+| `13.7.2` | `22H313` | `16.6` | `615.3.12.11.2` | `WebKit-7615.3.12.11.2` | `exact/tag` |
+| `13.7.3` | `22H417` | `16.6` | `615.3.12.11.2` | `WebKit-7615.3.12.11.2` | `exact/tag` |
+| `13.7.4` | `22H420` | `16.6` | `615.3.12.11.2` | `WebKit-7615.3.12.11.2` | `exact/tag` |
+| `13.7.5` | `22H527` | `16.6` | `615.3.12.11.2` | `WebKit-7615.3.12.11.2` | `exact/tag` |
+| `13.7.6` | `22H625` | `16.6` | `615.3.12.11.2` | `WebKit-7615.3.12.11.2` | `exact/tag` |
+| `13.7.7` | `22H722` | `16.6` | `615.3.12.*` | `WebKit-7615.3.12.*` | `train` |
+| `13.7.8` | `22H730` | `16.6` | `615.3.12.*` | `WebKit-7615.3.12.*` | `train` |
+
+### macOS 14
+
+| OS version | Apple build(s) | Safari | WebKit `FULL_VERSION` | Source release | Evidence |
+|---|---|---:|---:|---|---|
+| `14.0` | `23A344` | `17` | `616.1.27.211.1` | `WebKit-7616.1.27.211.1` | `exact/tag` |
+| `14.1` | `23B2073`
`23B2077`
`23B74` | `17.1` | `616.2.9.11.7` | `WebKit-7616.2.9.11.7` | `exact/tag` |
+| `14.1.1` | `23B2082`
`23B81` | `17.1` | `616.2.9.11.7` | `WebKit-7616.2.9.11.7` | `exact/tag` |
+| `14.1.2` | `23B2091`
`23B92` | `17.1` | `616.2.9.*` | `WebKit-7616.2.9.*` | `train` |
+| `14.2` | `23C64` | `17.2` | `617.1.17.*` | `WebKit-7617.1.17.*` | `train` |
+| `14.2.1` | `23C71` | `17.2` | `617.1.17.*` | `WebKit-7617.1.17.*` | `train` |
+| `14.3` | `23D2057`
`23D56` | `17.3` | `617.2.4.11.8` | `WebKit-7617.2.4.11.8` | `exact/tag` |
+| `14.3.1` | `23D60` | `17.3` | `617.2.4.*` | `WebKit-7617.2.4.*` | `train` |
+| `14.4` | `23E214` | `17.4` | `618.1.15.11.12` | `WebKit-7618.1.15.11.12` | `exact/tag` |
+| `14.4.1` | `23E224` | `17.4` | `618.1.15.*` | `WebKit-7618.1.15.*` | `train` |
+| `14.5` | `23F79` | `17.5` | `618.2.12.11.6` | `WebKit-7618.2.12.11.6` | `exact/tag` |
+| `14.6` | `23G80` | `17.6` | `618.3.11.11.5` | `WebKit-7618.3.11.11.5` | `exact/tag` |
+| `14.6.1` | `23G93` | `17.6` | `618.3.11.11.5` | `WebKit-7618.3.11.11.5` | `exact/tag` |
+| `14.7` | `23H124` | `17.6` | `618.3.11.11.5` | `WebKit-7618.3.11.11.5` | `exact/tag` |
+| `14.7.1` | `23H222` | `17.6` | `618.3.11.11.5` | `WebKit-7618.3.11.11.5` | `exact/tag` |
+| `14.7.2` | `23H311` | `17.6` | `618.3.11.11.5` | `WebKit-7618.3.11.11.5` | `exact/tag` |
+| `14.7.3` | `23H417` | `17.6` | `618.3.11.11.5` | `WebKit-7618.3.11.11.5` | `exact/tag` |
+| `14.7.4` | `23H420` | `17.6` | `618.3.11.11.5` | `WebKit-7618.3.11.11.5` | `exact/tag` |
+| `14.7.5` | `23H527` | `17.6` | `618.3.11.11.5` | `WebKit-7618.3.11.11.5` | `exact/tag` |
+| `14.7.6` | `23H626` | `17.6` | `618.3.11.11.5` | `WebKit-7618.3.11.11.5` | `exact/tag` |
+| `14.7.7` | `23H723` | `17.6` | `618.3.11.*` | `WebKit-7618.3.11.*` | `train` |
+| `14.7.8` | `23H730` | `17.6` | `618.3.11.*` | `WebKit-7618.3.11.*` | `train` |
+| `14.8` | `23J21` | `17.6` | `618.3.11.*` | `WebKit-7618.3.11.*` | `train` |
+| `14.8.1` | `23J30` | `17.6` | `618.3.11.*` | `WebKit-7618.3.11.*` | `train` |
+| `14.8.2` | `23J126` | `17.6` | `618.3.11.*` | `WebKit-7618.3.11.*` | `train` |
+| `14.8.3` | `23J220` | `17.6` | `618.3.11.*` | `WebKit-7618.3.11.*` | `train` |
+| `14.8.4` | `23J319` | `17.6` | `618.3.11.*` | `WebKit-7618.3.11.*` | `train` |
+| `14.8.5` | `23J423` | `17.6` | `618.3.11.*` | `WebKit-7618.3.11.*` | `train` |
+| `14.8.7` | `23J520` | `17.6` | `618.3.11.*` | `WebKit-7618.3.11.*` | `train` |
+| `14.8.8` | `23J620` | `17.6` | `618.3.11.*` | `WebKit-7618.3.11.*` | `train` |
+| `14.8.9` | `23J631` | `17.6` | `618.3.11.*` | `WebKit-7618.3.11.*` | `train` |
+
+### macOS 15
+
+| OS version | Apple build(s) | Safari | WebKit `FULL_VERSION` | Source release | Evidence |
+|---|---|---:|---:|---|---|
+| `15.0` | `24A335`
`24A8332` | `18` | `619.1.26.31.6` | `WebKit-7619.1.26.31.6` | `exact/tag` |
+| `15.0.1` | `24A340`
`24A348` | `18` | `619.1.26.*` | `WebKit-7619.1.26.*` | `train` |
+| `15.1` | `24B2082`
`24B2083`
`24B83` | `18.1` | `619.2.8.*` | `WebKit-7619.2.8.*` | `train` |
+| `15.1.1` | `24B2091`
`24B91` | `18.1.1` | `619.2.8.11.12` | `WebKit-7619.2.8.11.12` | `exact/tag` |
+| `15.2` | `24C101`
`24C103`
`24C2101`
`24C2103` | `18.2` | `620.1.16.11.8` | `WebKit-7620.1.16.11.8` | `exact/tag` |
+| `15.3` | `24D2059`
`24D60` | `18.3` | `620.2.4.11.5` | `WebKit-7620.2.4.11.5` | `exact/tag` |
+| `15.3.1` | `24D70` | `18.3` | `620.2.4.11.5` | `WebKit-7620.2.4.11.5` | `exact/tag` |
+| `15.3.2` | `24D2082`
`24D81` | `18.3` | `620.2.4.*` | `WebKit-7620.2.4.*` | `train` |
+| `15.4` | `24E248` | `18.4` | `621.1.15.*` | `WebKit-7621.1.15.*` | `train` |
+| `15.4.1` | `24E263` | `18.4` | `621.1.15.*` | `WebKit-7621.1.15.*` | `train` |
+| `15.5` | `24F74` | `18.5` | `621.2.5.*` | `WebKit-7621.2.5.*` | `train` |
+| `15.6` | `24G84` | `18.6` | `621.3.11.*` | `WebKit-7621.3.11.*` | `train` |
+| `15.6.1` | `24G90` | `18.6` | `621.3.11.*` | `WebKit-7621.3.11.*` | `train` |
+| `15.7` | `24G222` | `18.6` | `621.3.11.*` | `WebKit-7621.3.11.*` | `train` |
+| `15.7.1` | `24G231` | `18.6` | `621.3.11.*` | `WebKit-7621.3.11.*` | `train` |
+| `15.7.2` | `24G325` | `18.6` | `621.3.11.*` | `WebKit-7621.3.11.*` | `train` |
+| `15.7.3` | `24G419` | `18.6` | `621.3.11.*` | `WebKit-7621.3.11.*` | `train` |
+| `15.7.4` | `24G517` | `18.6` | `621.3.11.*` | `WebKit-7621.3.11.*` | `train` |
+| `15.7.5` | `24G624` | `18.6` | `621.3.11.*` | `WebKit-7621.3.11.*` | `train` |
+| `15.7.7` | `24G720` | `18.6` | `621.3.11.*` | `WebKit-7621.3.11.*` | `train` |
+| `15.7.8` | `24G824` | `18.6` | `621.3.11.*` | `WebKit-7621.3.11.*` | `train` |
+| `15.7.9` | `24G830` | `18.6` | `621.3.11.*` | `WebKit-7621.3.11.*` | `train` |
+| `15.8` | `24H23` | `18.6` | `621.3.11.*` | `WebKit-7621.3.11.*` | `train` |
+| `15.8.1` | `24H32` | `18.6` | `621.3.11.*` | `WebKit-7621.3.11.*` | `train` |
+
+### macOS 26
+
+| OS version | Apple build(s) | Safari | WebKit `FULL_VERSION` | Source release | Evidence |
+|---|---|---:|---:|---|---|
+| `26.0` | `25A354`
`25A8353` | `26` | `622.1.22.*` | `WebKit-7622.1.22.*` | `train` |
+| `26.0.1` | `25A362`
`25A8364` | `26` | `622.1.22.*` | `WebKit-7622.1.22.*` | `train` |
+| `26.1` | `25B78` | `26.1` | `622.2.11.*` | `WebKit-7622.2.11.*` | `train` |
+| `26.2` | `25C2058`
`25C56` | `26.2` | `623.1.14.*` | `WebKit-7623.1.14.*` | `train` |
+| `26.3` | `25D125`
`25D2125` | `26.3` | `623.2.7.*` | `WebKit-7623.2.7.*` | `train` |
+| `26.3.1` | `25D2128` | `26.3` | `623.2.7.*` | `WebKit-7623.2.7.*` | `train` |
+| `26.3.2` | `25D2140`
`25D2150` | `26.3` | `623.2.7.*` | `WebKit-7623.2.7.*` | `train` |
+| `26.4` | `25E246` | `26.4` | `624.1.16.*` | `WebKit-7624.1.16.*` | `train` |
+| `26.4.1` | `25E253` | `26.4` | `624.1.16.*` | `WebKit-7624.1.16.*` | `train` |
+| `26.5` | `25F71` | `26.5` | `624.2.5.*` | `WebKit-7624.2.5.*` | `train` |
+| `26.5.1` | `25F80` | `26.5` | `624.2.5.*` | `WebKit-7624.2.5.*` | `train` |
+| `26.5.2` | `25F84` | `26.5` | `624.2.5.11.8` | `WebKit-7624.2.5.11.8 (candidate; tag not public)` | `exact/binary` |
+| `26.6` | `25G72` | `26.6` | `624.4.5.11.5` | `WebKit-7624.4.5.11.5 (candidate; tag not public)` | `exact/binary` |
+| `26.6.1` | `25G76` | `26.6` | `624.4.5.11.5` | `WebKit-7624.4.5.11.5 (candidate; tag not public)` | `exact/binary` |
+| `26.6.2` | `25G83` | `26.6` | `624.5.1.11.3` | `WebKit-7624.5.1.11.3` | `exact/binary` |
+| `26.7` | `25G229` | `26.6` | `624.5.1.*` | `WebKit-7624.5.1.*` | `train` |
+| `26.7.1` | `25G241` | `26.6` | `624.5.1.*` | `WebKit-7624.5.1.*` | `train` |
+
+### macOS 27
+
+| OS version | Apple build(s) | Safari | WebKit `FULL_VERSION` | Source release | Evidence |
+|---|---|---:|---:|---|---|
+| `27.0` | `26A425`
`26A428` | `27` | `625.1.29.*` | `WebKit-7625.1.29.*` | `train` |
+| `27.0.1` | `26A434` | `27` | `625.1.29.11.28` | `WebKit-7625.1.29.11.28 (candidate; tag not public)` | `exact/binary` |
+
+
+## Binary mappings verified in Ravel
+
+These rows are stronger than a release-name match because the OS build and Mach-O UUID are both known.
+
+### macOS
| macOS | Build | WebKit UUID | `CFBundleVersion` | `FULL_VERSION` |
|---|---|---|---:|---:|
-| 26.5.2 | `25F84` | `49B21D99-8716-31B8-8686-71B287325F1D` | `21624.2.5.11.8` | `624.2.5.11.8` |
-| 26.6 | `25G72` | `B090AABF-9A3B-3110-9DA9-F0F40FCEC972` | `21624.4.5.11.5` | `624.4.5.11.5` |
-| 26.6.1 | `25G76` | `B090AABF-9A3B-3110-9DA9-F0F40FCEC972` | `21624.4.5.11.5` | `624.4.5.11.5` |
-| 26.6.2 | `25G83` | `844AF253-CAF6-3623-9DAD-A055C5274E62` | `21624.5.1.11.3` | `624.5.1.11.3` |
-| 27.0.1 | `26A434` | `70BEE322-37EE-3B22-8012-4F76BA105C29` | `22625.1.29.11.28` | `625.1.29.11.28` |
-| 27.2 beta | `26B5086k` | `6F6AB57E-1492-3950-9962-85B6AFD430A3` | `22625.2.4.1` | `625.2.4.1` |
-| 27.2 beta 2 | `26B5091g` | `56B4AA44-CB66-3641-8B22-723C39B5BC6E` | `22625.2.5.11.1` | `625.2.5.11.1` |
-| 27.2 beta 3 | `26B5101f` | `B32D7081-AE42-3A2E-ACBB-CF4D4BE4F296` | `22625.2.7.1` | `625.2.7.1` |
+| `26.5.2` | `25F84` | `49B21D99-8716-31B8-8686-71B287325F1D` | `21624.2.5.11.8` | `624.2.5.11.8` |
+| `26.6` | `25G72` | `B090AABF-9A3B-3110-9DA9-F0F40FCEC972` | `21624.4.5.11.5` | `624.4.5.11.5` |
+| `26.6.1` | `25G76` | `B090AABF-9A3B-3110-9DA9-F0F40FCEC972` | `21624.4.5.11.5` | `624.4.5.11.5` |
+| `26.6.2` | `25G83` | `844AF253-CAF6-3623-9DAD-A055C5274E62` | `21624.5.1.11.3` | `624.5.1.11.3` |
+| `27.0.1` | `26A434` | `70BEE322-37EE-3B22-8012-4F76BA105C29` | `22625.1.29.11.28` | `625.1.29.11.28` |
-macOS 26.6 and 26.6.1 contain the same WebKit binary: both UUID and `CFBundleVersion` match.
+### iOS
-### iOS examples
-
-Ravel identifies iOS WebKit binaries and UUIDs, but its dyld-cache page does not expose the framework `Info.plist` value. Read `CFBundleVersion` at runtime or from an extracted IPSW before claiming an exact source release.
+Ravel exposes the binary UUID for these iOS dyld caches, but not the framework `Info.plist`. The `CFBundleVersion` must be captured at runtime before the source mapping can be called exact.
| iOS | Build | WebKit UUID |
|---|---|---|
-| 26.6 | `23G71` | `7627FDAB-129E-32BB-A2AC-F0DC02853D4E` |
-| 26.6.1 | `23G83` | `C39BD22C-3475-38AF-91BD-0B7574081011` |
-| 26.6.2 | `23G90` | `C39BD22C-3475-38AF-91BD-0B7574081011` |
-| 27.0.1 | `24A446` | `D12A79A6-98CB-323C-8F72-613AD0983BBC` |
-| 27.2 beta | `24B5084k` | `1FD67A57-D91B-3B26-9F4F-91AB8299B6E7` |
-| 27.2 beta 2 | `24B5089g` | `509D51AD-2CF9-3982-BFD5-81221D1B903D` |
-| 27.2 beta 3 | `24B5099f` | `0566BF55-2DC4-34F6-B211-96FFAA0A37A4` |
+| `26.6` | `23G71` | `7627FDAB-129E-32BB-A2AC-F0DC02853D4E` |
+| `26.6.1` | `23G83` | `C39BD22C-3475-38AF-91BD-0B7574081011` |
+| `26.6.2` | `23G90` | `C39BD22C-3475-38AF-91BD-0B7574081011` |
+| `27.0.1` | `24A446` | `D12A79A6-98CB-323C-8F72-613AD0983BBC` |
-iOS 26.6.1 and 26.6.2 contain the same WebKit binary UUID.
+## Current 27.2 beta builds
-## Exact mapping procedure
+| Platform | OS build | WebKit UUID | `FULL_VERSION` | Evidence |
+|---|---|---|---:|---|
+| macOS 27.2 beta | `26B5086k` | `6F6AB57E-1492-3950-9962-85B6AFD430A3` | `625.2.4.1` | Ravel binary |
+| macOS 27.2 beta 2 | `26B5091g` | `56B4AA44-CB66-3641-8B22-723C39B5BC6E` | `625.2.5.11.1` | Ravel binary |
+| macOS 27.2 beta 3 | `26B5101f` | `B32D7081-AE42-3A2E-ACBB-CF4D4BE4F296` | `625.2.7.1` | Ravel binary |
+| iOS 27.2 beta | `24B5084k` | `1FD67A57-D91B-3B26-9F4F-91AB8299B6E7` | unknown | UUID only |
+| iOS 27.2 beta 2 | `24B5089g` | `509D51AD-2CF9-3982-BFD5-81221D1B903D` | unknown | UUID only |
+| iOS 27.2 beta 3 | `24B5099f` | `0566BF55-2DC4-34F6-B211-96FFAA0A37A4` | unknown | UUID only |
-### 1. Read the OS build and WebKit UUID
+## Exact lookup procedure
-From an Apple crash report, record the OS version/build and the WebKit image UUID. Compare UUIDs without case or dashes, and match the architecture.
-
-```bash
-rg 'OS Version:|WebKit.*<' crash-report.crash
-```
-
-### 2. Find the binary in Ravel
-
-Use the OS build and the correct binary path:
-
-```text
-macOS: /System/Library/Frameworks/WebKit.framework/Versions/A/WebKit
-iOS: /System/Library/Frameworks/WebKit.framework/WebKit
-```
-
-Ravel URL pattern:
-
-```text
-https://ravel.dbg.re/binary?build=&domain=dyld_cache&path=
-```
-
-The Ravel UUID must equal the crash-report UUID. A matching version string without a matching UUID is weaker evidence.
-
-### 3. Read `CFBundleVersion`
-
-From app code on either platform:
+1. Read the OS build and WebKit image UUID from the crash report.
+2. Open that build in Ravel and verify the same UUID and architecture.
+3. Read `CFBundleVersion` from `Bundle(for: WKWebView.self)`.
+4. Remove the platform prefix to obtain `FULL_VERSION`.
+5. Resolve the source tag and inspect the released code.
```swift
import WebKit
@@ -152,148 +405,36 @@ let webKitBundleVersion = Bundle(for: WKWebView.self)
.object(forInfoDictionaryKey: "CFBundleVersion") as? String
```
-On macOS, it can also be read without app changes:
-
-```bash
-defaults read /System/Library/Frameworks/WebKit.framework/Resources/Info CFBundleVersion
-```
-
-For iOS, log the runtime value on a test device or include it in crash/pixel metadata. Do not infer an exact iOS value from the same-numbered macOS release.
-
-### 4. Remove `SYSTEM_VERSION_PREFIX`
-
-Apple production builds concatenate the prefix and the WebKit version:
+Ravel paths:
```text
-CFBundleVersion = SYSTEM_VERSION_PREFIX + FULL_VERSION
+macOS: /System/Library/Frameworks/WebKit.framework/Versions/A/WebKit
+iOS: /System/Library/Frameworks/WebKit.framework/WebKit
```
-| Platform | OS | Prefix |
-|---|---|---:|
-| iOS | All supported versions | `8` |
-| macOS | 12 | `17` |
-| macOS | 13 | `18` |
-| macOS | 14 | `19` |
-| macOS | 15 | `20` |
-| macOS | 26 | `21` |
-| macOS | 27 | `22` |
-
-Example:
-
-```text
-22625.1.29.11.28 - prefix 22 -> 625.1.29.11.28
-```
-
-### 5. Resolve the public source release
-
-For modern release trains, candidate tags use:
-
-```text
-WebKit-7
-```
-
-Example:
-
-```text
-625.1.29.11.28 -> WebKit-7625.1.29.11.28
-```
-
-The 612 train is an older naming exception:
-
-```text
-612.1.27.* -> Safari-612.1.27.*
-```
-
-Check exact public tags and release branches:
-
-```bash
-git ls-remote --tags https://github.com/WebKit/WebKit.git 'WebKit-7625.1.29*'
-git ls-remote --heads https://github.com/WebKit/WebKit.git 'safari-7625*'
-```
-
-An adjacent tag is only a bound, not an exact match. Apple may publish a binary before publishing the corresponding source tag.
-
-### 6. Verify the fix in released source
-
-Inspect the changed code in the candidate tag. This is stronger than checking one commit SHA because Apple may cherry-pick the change under a different SHA.
-
-For the certificate-info crash discussed below:
-
-```bash
-git show :Source/WebKit/UIProcess/WebFrameProxy.h \
- | rg 'commitCertificateInfo'
-```
-
-Old signature:
-
-```cpp
-void commitCertificateInfo(const URL&);
-```
-
-Fixed signature from `318982@main`:
-
-```cpp
-void commitCertificateInfo(const URL&, bool hasCertificateInfo);
-```
-
-### 7. When the exact source tag is unavailable
-
-Record the evidence level explicitly:
-
-1. UUID + `CFBundleVersion`: exact binary and release version are known.
-2. Symbols or disassembly: a specific ABI or behavior can be proven in the binary.
-3. Reproduction on the exact OS build: the bug can be proven present or absent.
-
-Safari Technology Preview is a separate build. Its version does not prove the version of system WebKit.
+Modern source tags use `WebKit-7`. The 612 and early 613 trains use `Safari-`.
## Current certificate-info crash
-The crash on macOS 27.0.1 maps as follows:
+| Field | Value |
+|---|---|
+| macOS | `27.0.1 (26A434)` |
+| Crash/Ravel UUID | `70BEE322-37EE-3B22-8012-4F76BA105C29` |
+| `CFBundleVersion` | `22625.1.29.11.28` |
+| `FULL_VERSION` | `625.1.29.11.28` |
+| Candidate source tag | `WebKit-7625.1.29.11.28` — not public as of 2026-10-06 |
+| Result | The shipped binary has the old one-argument `commitCertificateInfo` ABI; the fix is absent. |
-```text
-macOS: 27.0.1 (26A434)
-Crash UUID: 70BEE322-37EE-3B22-8012-4F76BA105C29
-Ravel UUID: 70BEE322-37EE-3B22-8012-4F76BA105C29
-CFBundleVersion: 22625.1.29.11.28
-Prefix: 22
-FULL_VERSION: 625.1.29.11.28
-Candidate tag: WebKit-7625.1.29.11.28
-```
+The fix landed in `318982@main`. macOS 27.2 is a candidate for the first fixed system release, but public `WebKit-7625.2.*` source tags are not available yet.
-The exact `.11.28` source tag is not public as of 2026-10-06; `.11.27` is public. The crash symbol and the `WebKit-7625.1.29` source family both show the old one-argument signature. Therefore the fix is absent from macOS 27.0.1.
+## Data sources and maintenance
-Ravel identifies macOS 27.2 beta binaries as `625.2.4.1`, `625.2.5.11.1`, and `625.2.7.1`. Public `WebKit-7625.2.*` tags are not available as of 2026-10-06. The fix landed in `318982@main` and Safari Technology Preview 251, so macOS 27.2 is a candidate for the first fixed system release, but source inclusion is not yet proven.
-
-## DuckDuckGo telemetry gap
-
-Current pixels do not include the exact system WebKit `CFBundleVersion`. The HTTP User-Agent cannot fill this gap because Apple returns the frozen `AppleWebKit/605.1.15` compatibility token.
-
-Add one field to relevant crash and WebKit failure telemetry:
-
-```text
-webkit_build=22625.1.29.11.28
-```
-
-Populate it from `Bundle(for: WKWebView.self).CFBundleVersion`. This makes OS-build-to-WebKit correlation deterministic on both macOS and iOS.
-
-## Sources
-
-- [WebKit source repository](https://github.com/WebKit/WebKit)
-- [Current WebKit version configuration](https://github.com/WebKit/WebKit/blob/main/Configurations/Version.xcconfig)
-- [Safari 15 / WebKit 612 version configuration](https://chromium.googlesource.com/external/github.com/WebKit/webkit/+/refs/tags/Safari-612.1.27/Source/WebKit/Configurations/Version.xcconfig)
-- [Safari 16 / WebKit 614 version configuration](https://chromium.googlesource.com/external/github.com/WebKit/webkit/+/refs/tags/WebKit-7614.1.25/Source/WebKit/Configurations/Version.xcconfig)
-- [Safari 17 / WebKit 616 version configuration](https://github.com/WebKit/WebKit/blob/WebKit-7616.1.27/Configurations/Version.xcconfig)
-- [Safari 27 / WebKit 625 version configuration](https://github.com/WebKit/WebKit/blob/WebKit-7625.1.29/Configurations/Version.xcconfig)
+- [AppleDB OS/build catalogue](https://api.appledb.dev/ios/main.json)
+- [WebKit source and public tags](https://github.com/WebKit/WebKit)
+- [WebKit `Version.xcconfig`](https://github.com/WebKit/WebKit/blob/main/Configurations/Version.xcconfig)
+- [MDN Safari/WebKit release metadata](https://github.com/mdn/browser-compat-data/blob/main/browsers/safari.json)
- [Ravel binary catalogue](https://ravel.dbg.re/browse)
-- [MDN Safari release metadata](https://github.com/mdn/browser-compat-data/blob/main/browsers/safari.json)
-- [Safari release notes](https://developer.apple.com/documentation/safari-release-notes)
- [WebKit commit 318982@main](https://commits.webkit.org/318982@main)
-- [Safari Technology Preview 251](https://webkit.org/blog/18194/release-notes-for-safari-technology-preview-251/)
+- DuckDuckGo Apple browsers deployment targets: `macOS/Configuration/Common.xcconfig` and `iOS/DuckDuckGo-iOS.xcodeproj/project.pbxproj`
-## Limits
-
-- One OS major contains multiple WebKit updates; use the exact OS build for conclusions.
-- Ravel is in beta and does not index every historical Apple build.
-- Intel and Apple Silicon binaries may have different UUIDs.
-- An exact public tag may appear after Apple ships the binary.
-- Verify released code, not only commit ancestry, because fixes can be cherry-picked.
+To update this document, add new stable OS rows first. Use an OS-specific `releases/Apple/Safari-…` tag when available; otherwise record only the release train and keep the `.*` marker.