Exposure Notifications APIに関するメモ

# 概要

- Exposure Notifications APIのTransmission Risk Valueについて、AppleとGoogle間の相違点をドキュメントベースに確認したメモ

# 資料

- Apple
	- ExposureNotification Version 1に関する概要
		- [Exposure Risk Value Calculation in ExposureNotification Version 1 | Apple Developer Documentation](https://developer.apple.com/documentation/exposurenotification/enexposureconfiguration/exposure_risk_value_calculation_in_exposurenotification_version_1)
	- transmissionRiskLevelに関する説明
		- [transmissionRiskLevelValues | Apple Developer Documentation](https://developer.apple.com/documentation/exposurenotification/enexposureconfiguration/3586323-transmissionrisklevelvalues)
- Google
	- Exposure Notifications API仕様（transmissionRiskLevelに関する説明含む）
		- [Exposure Notifications API  |  Google API for Exposure Notifications](https://developers.google.com/android/exposure-notifications/exposure-notifications-api)
	- ソースコード
		- [exposure-notifications-internals/RiskScoreCalculator.java at 7dadb83aa5c4b02ed4ae98cd8cf13f89b96962d2 · google/exposure-notifications-internals](https://github.com/google/exposure-notifications-internals/blob/7dadb83aa5c4b02ed4ae98cd8cf13f89b96962d2/exposurenotification/src/main/java/com/google/samples/exposurenotification/matching/RiskScoreCalculator.java#L69-L72)
- Cocoa
	- [cocoa/src/Covid19Radar.Api at master · cocoa-mhlw/cocoa](https://github.com/cocoa-mhlw/cocoa/tree/master/src/Covid19Radar.Api)
	- [Issues · cocoa-mhlw/cocoa](https://github.com/cocoa-mhlw/cocoa/issues)
    - [openCACAO/cocoa-issues: 接触確認アプリ COCOA に関するIssues用レポジトリです](https://github.com/openCACAO/cocoa-issues)
- その他
	- [COCOA騒動メモ](https://zenn.dev/zipperpull/articles/20210210-cocoa-bug)

# 用語

|用語|説明|
|---|---|
|Transmission Risk|感染リスク<br><br>感染リスクは、感染したユーザーの感染状況や感染リスクへの影響を反映させることを目的としている。値は、感染したユーザーの症状、症状が最初に現れた時期、診断の確認レベル、またはアプリや保健所からのその他の判断に基づいている。[^1]|
|transmissionRiskLevel|感染リスクレベル。<br><br>分類であり、計算に直接使用する数値ではない。<br><br>地域間で一貫性のある感染リスクレベルは巡回を容易にするため、感染リスクレベルには報告書の種類を記載することが推奨される。サポートされている報告書の種類は、各地域の公衆衛生当局によって決定される。アプリはレポートを送信する前に、報告書の種類を公衆衛生当局に確認する必要がある。<br>このリスクレベルに許される範囲はApple、Google間で異なる（`Unused/custom`の定義箇所が異なる）。[^2][^3]|
|transmissionRiskScores (transmissionRiskLevelValues)|各感染リスクレベルに割り当てられる数値の配列。<br><br>係数であり、計算に直接使用する数値となる。<br><br>各アプリは、リスクレベルのそれぞれについて独自に定義する。各リスクレベルに割り当てられる値は、0～8の範囲内。|

[^1]: https://developer.apple.com/documentation/exposurenotification/enexposureconfiguration/exposure_risk_value_calculation_in_exposurenotification_version_1
[^2]: https://developer.apple.com/documentation/exposurenotification/enexposureconfiguration/3586323-transmissionrisklevelvalues
[^3]: https://developers.google.com/android/exposure-notifications/exposure-notifications-api

# 調査

## transmissionRiskLevel、transmissionRiskScoresの相違点

- **太字**はAppleとGoogle間の相違点
- transmissionRiskLevelは、[Appleのドキュメント](https://developer.apple.com/documentation/exposurenotification/enexposureconfiguration/3586323-transmissionrisklevelvalues)、[Googleのドキュメント](https://developers.google.com/android/exposure-notifications/exposure-notifications-api)を確認し推奨される説明を転記
- transmissionRiskScoresはアプリケーションの設定で定義する0-8の数値（係数）が格納された「配列」。Apple、Googleの内部実装で設定の何番目の数値が使用されるかということを示している
- transmissionRiskLevelに対するtransmissionRiskScores配列は、Appleは[ドキュメント](https://developer.apple.com/documentation/exposurenotification/enexposureconfiguration/3586323-transmissionrisklevelvalues)、Googleはソースコード[1](https://github.com/google/exposure-notifications-internals/blob/main/exposurenotification/src/main/java/com/google/samples/exposurenotification/matching/RiskScoreCalculator.java#L69-L72),[2](https://github.com/google/exposure-notifications-internals/blob/main/exposurenotification/src/main/java/com/google/samples/exposurenotification/nearby/RiskLevel.java#L38-L49)を参考に記載（ドキュメントでは記載を確認できず）

|transmission<br>RiskLevel<br>の値|Apple|Google|transmission<br>RiskScores<br>Apple|transmission<br>RiskScores<br>Google|
|---|---|---|---|---|
|0|Unused **/Custom**|Unused[^4]|**transmission<br>RiskScores[0]**|**数値の`1`を埋め込み（リテラル値）**|
|1|Confirmed test **:** Low transmission risk level|Confirmed test **-** Low transmission risk level|transmission<br>RiskScores[**1**]|transmission<br>RiskScores[**0**]|
|2|Confirmed test **:** Standard transmission risk level|Confirmed test **-** Standard transmission risk level|transmission<br>RiskScores[**2**]|transmission<br>RiskScores[**1**]|
|3|Confirmed test **:** High transmission risk level|Confirmed test **-** High transmission risk level|transmission<br>RiskScores[**3**]|transmission<br>RiskScores[**2**]|
|4|Confirmed clinical diagnosis|Confirmed clinical diagnosis|transmission<br>RiskScores[**4**]|transmission<br>RiskScores[**3**]|
|5|Self report|Self report|transmission<br>RiskScores[**5**]|transmission<br>RiskScores[**4**]|
|6|Negative case|Negative case|transmission<br>RiskScores[**6**]|transmission<br>RiskScores[**5**]|
|7|Recursive case|Recursive case|transmission<br>RiskScores[**7**]|transmission<br>RiskScores[**6**]|
|8|**-**| **Unused/custom** |**-**|**transmission<br>RiskScores[7]**|

[^4]: `Enum of risk levels starts at 1, with 0 reserved for RISK_LEVEL_INVALID.`と[記載](https://github.com/google/exposure-notifications-internals/blob/main/exposurenotification/src/main/java/com/google/samples/exposurenotification/matching/RiskScoreCalculator.java#L89) 

---

# その他

transmissionRiskLevelの推奨される説明（reporttype）には各reporttypeの説明はない。

GoogleのExposure Notifications APIの**v1.5以上**で有効なTemporaryExposureKey(TEK)のreportTypeにはある程度説明が記載されていたので**reporttypeの意味を理解するため**に引用してメモ。

引用元：[Googleのドキュメント](https://developers.google.com/android/exposure-notifications/exposure-notifications-api)

> reportType
> (v1.5 and higher only)
> Type of diagnosis that this key was uploaded with. We recommend that the app set this value before uploading each key to the server. The values range from 0 to 5 and have the following definitions. The app must handle all of these values without crashing if received from the server.
> 0: UNKNOWN. Report type metadata is missing from the diagnosis key. In v1.7 and higher, keys with report type set to UNKNOWN do not contribute to the risk value.
> 1: CONFIRMED_TEST. A medical provider has confirmed the user had a positive diagnostic test for COVID-19.
> 2: CONFIRMED_CLINICAL_DIAGNOSIS. A medical provider has confirmed the user had symptoms consistent with a COVID-19 diagnosis.
> 3: SELF_REPORT. The user has self-reported symptoms consistent with COVID-19 without confirmation from a medical provider.
> 4: RECURSIVE. This value is reserved for future use.
> 5: REVOKED. In v1.5, REVOKED is not used. In v1.6 and higher, REVOKED eliminates exposures associated with that key from the detected exposures.

https://www.DeepL.com/Translator で翻訳:

> reportType
> (v1.5以上のみ)
> このキーがアップロードされた診断の種類。各キーをサーバーにアップロードする前に、アプリでこの値を設定することをお勧めします。値の範囲は0～5で、以下の定義があります。アプリは、サーバーから受信した場合、これらの値をすべてクラッシュせずに処理する必要があります。
> 0：UNKNOWN。診断キーからレポートタイプのメタデータが欠落しています。v1.7以降では、レポートタイプがUNKNOWNに設定されているキーはリスク値に寄与しません。
> 1：CONFIRMED_TEST。医療提供者がユーザーのCOVID-19に対する診断テストが陽性であることを確認しました。
> 2：CONFIRMED_CLINICAL_DIAGNOSIS。医療提供者はユーザーがCOVID-19診断と一致する症状を持っていることを確認した。
> 3：SELF_REPORT。医療提供者からの確認なしに、ユーザーがCOVID-19と一致する症状を自己申告した。
> 4：RECURSIVE。この値は将来の使用のために予約されている。
> 5: REVOKED。v1.5では、REVOKEDは使用されません。v1.6以降では、REVOKEDにより、検出されたエクスポージャーからそのキーに関連付けられたエクスポージャーが削除されます。