cocoa-mhlw / cocoa

Mozilla Public License 2.0
990 stars 113 forks source link

COCOA1向け設定 TransmissionRiskScores の調整 #792

Closed keiji closed 2 years ago

keiji commented 2 years ago

COCOAにとって因縁のあるTransmissionRiskScoresの変更に関することなので、経緯を記録する意味でもIssueにします。

Update

https://github.com/cocoa-mhlw/cocoa/issues/792#issuecomment-1018313189 の指摘を受けて、診断キーのTransmissionRiskLevel1に、TransmissionRiskScoresを次の通りとしました。

    "TransmissionRiskScores": [
        0,
        0,
        7,
        7,
        7,
        7,
        7,
        7
    ],

変更内容

COCOA1向けの設定ファイルの TransmissionRiskScores を次のように変更します。

    "TransmissionRiskScores": [
        1,
        7,
        7,
        7,
        7,
        7,
        7,
        7
    ],

変更目的

TransmissionRiskLevelに0を設定した診断キーファイルについて、iOS版のCOCOA1で接触を発生させないため。

背景

ExposureWindow mode(ENv2)導入に伴い、端末内のTEKをすべて送信する仕様に変更しています(COCOA1は、設定した発症日または診断日3日前からに限定)。

COCOA1系では、これまで遭遇しなかった時期の(本来は接触とされないはずの日の)診断キーについて接触確認をすることになります。そのため、ENv2用の陽性登録APIではCOCOA1向けに、設定した発症日または診断日3日前より過去の診断キーについてはTransmissionRiskLevel0を設定して生成するようにしています。

https://github.com/cocoa-mhlw/cocoa/blob/d6ff39a6c640aa6f90b68818362e4d03b413d985/src/Covid19Radar.Api/V3DiagnosisApi.cs#L79-L88

TransmissionRiskLevel = 0は、過去に不具合の原因になった値です。

TransmissionRiskLevel 0は、Appleでは、ExposureConfiguraionTransmissionRiskLevelValuesの何番目の要素の値(各要素の値は0−8)を採用するかを示します。 一方、GoogleではRISK_LEVEL_INVALIDとして定義されています。

14 にもあるとおり、AndroidではriskScoreを計算するためのtransmissionRiskScoreExposureConfigurationの設定値に従って設定されるのはTransmissionRiskLevel1-8の場合で、0だった場合はtransmissionRiskScore1として計算されます。

        int transmissionRiskScore =
                diagnosisKey.getTransmissionRiskLevel() == RiskLevel.RISK_LEVEL_INVALID
                        ? 1
                        : configuration.getTransmissionRiskScores()[bucketRiskLevel(diagnosisKey)];

https://github.com/google/exposure-notifications-internals/blob/aaada6ce5cad0ea1493930591557f8053ef4f113/exposurenotification/src/main/java/com/google/samples/exposurenotification/matching/RiskScoreCalculator.java#L69-L72

transmissionRiskScore = 1 では、当時設定していた(現在設定している)minimumRiskScore 以上になることがなく、これより「Android版で接触確認が機能しない問題」が発生しました。

現在はTransmissionRiskLevel4を設定した診断キーを配信することで、問題そのものは解決したと認識しています。

変更について

さて、今回のケースは、COCOA2によって提出され、COCOA1では接触確認をしたくない時期の診断キーについてtransmissionRisk0を設定して配信することで、接触とならないようにします。

Android版ではこの施策で足りるのですが、iOSのExposureNotificaiton APIは、Androidと仕様が異なり、TransmissionRiskLevel = 0の場合はTransmissionRiskScores(TransmissionRiskLevelValues)の0番目の値が使われます。

現在配信している設定では0番目の値に7が設定されているので、TransmissionRiskLevel0を設定していても、TransmissionRiskLevel = 4として配信した場合と同様の接触基準となります。

https://github.com/cocoa-mhlw/cocoa/blob/d6ff39a6c640aa6f90b68818362e4d03b413d985/documents/static/exposure_configuration/Xamarin.ExposureNotification/Configration.json#L7-L16

この課題を解決するため、COCOA1向けの設定ファイルの TransmissionRiskScores の0番目の要素に1を設定するものとします。

値を0ではなく1としているのは、Android版の挙動に合わせるためで、0が設定する値として不適切であるという事実はありません。

Each app defines its own meaning for each of the risk levels (0-7). The values assigned to each risk level should be in the range of 0-8.

設定変更の影響範囲

    "TransmissionRiskScores": [
        1,  <- iOS(TransmissionRiskLevel = 0)
        7,
        7,
        7,  <- Android(TransmissionRiskLevel = 4)
        7,  <- iOS(TransmissionRiskLevel = 4)
        7,
        7,
        7
    ],

TransmissionRiskLevel = 4の場合

COCOA1(Android)

TransmissionRiskLevel = 4の場合、COCOA1(Android)はTransmissionRiskScoresの3番目の要素(7)を採用します。 0番目の要素を1に変更することで、COCOA1(Android)に影響することはないと考えています。

COCOA1(iOS)

TransmissionRiskLevel = 4の場合、COCOA1(iOS)はTransmissionRiskScoresの4番目の要素(7)を採用します。 0番目の要素を1に変更することで、COCOA1(iOS)に影響することはないと考えています。

TransmissionRiskLevel = 0の場合

COCOA1(Android)

TransmissionRiskLevel = 0の場合、COCOA1(Android)はTransmissionRiskScoresを参照せず、1を採用します。 この場合、現在設定しているminimumRiskScoreを超えず、接触は発生しません(意図した挙動)。

COCOA1(iOS)

TransmissionRiskLevel = 0の場合、COCOA1(iOS)はTransmissionRiskScoresの0番目の要素(1)を採用します。 この場合、現在設定しているminimumRiskScoreを超えず、接触は発生しません(意図した挙動)。

COCOA2への影響

COCOA2はExposureWindow mode(ENv2)に移行しており、配信する設定値も別ファイルに分離されています。

COCOA1の設定変更がCOCOA2に影響することはないと考えています。

kvaluation commented 2 years ago

@keiji 丁寧な経緯をありがとうございます。

TransmissionRiskLevel = 0の場合、COCOA1(Android)は1を採用する、という挙動は、お示しいただいたGoogle側のinternalの処理なので、信頼性・安定性がどの程度なのか(日本に告知なく変更されたりしないのか)、若干不安を感じました。

もうひとつずらして全面的にCOCOA側で管理できないものかなと思いつつ、とりあえず感じた不安をお伝えします。

keiji commented 2 years ago

@kvaluation ありがとうございます。ご指摘の通りだと思います。 kvaluationさん提案のパラメーターは次の通りになると理解しています(認識に誤りがあれば教えてください)。

    "TransmissionRiskScores": [
        0,  <- Android(TransmissionRiskLevel = 1)
        0,  <- iOS(TransmissionRiskLevel = 1)
        7,
        7,  <- Android(TransmissionRiskLevel = 4)
        7,  <- iOS(TransmissionRiskLevel = 4)
        7,
        7,
        7
    ],

Androidでは0番目の要素の値を、iOSでは1番目の要素の値を見ることになります。どちらも0(1から0に変えました)となり、接触は発生しない扱いにできると考えています。

この内容で変更を提案します。 その上で、たとえ最小であっても(接触として取り扱わない目的であっても)、感染リスクが存在するレベルを設定することについて調整が不明瞭な部分があることを、あらかじめお伝えしておきます。

ひとまずPull Requestを作ります。状況についてはまたご報告しますね。

kvaluation commented 2 years ago

ありがとうございます。認識に相違ありません。

旧: 設定した発症日または診断日3日前より過去の診断キーについてはTransmissionRiskLevelに0を設定 新: 1に設定

b-wind commented 2 years ago

情報共有として。

google/exposure-notifications-internals リポジトリはすでに一年以上更新されておらず、実装とはすでに乖離があると言う認識です。 更新を反映しないという意図の Google の中の人のコメントも有ったはずですが、こちらは探し切れていません。

本 Issue で取り扱っている部分に差異があるかまでは分かりません。

keiji commented 2 years ago

ひとまずPull Requestは出しました。

daisuke-nogami commented 2 years ago

設定の意味合いはともかく、より確実に期待される挙動を維持できるという点でご提案を取り込むべきと判断しました。

個人的には、v2.0リリース後、挙動が確認できた時点で、なる早でv2.0.0未満のサポートを終了して強制アップデートを促したい、その時までの繋ぎの設定の数値の意味合いにこだわりすぎないでよいとは思っていますが、言葉の意味合いの論点があることは認識しておきます。

keiji commented 2 years ago

サーバー側の挙動について一通りテストした結果をコメントしておきました。 記録として残します。

https://github.com/cocoa-mhlw/cocoa/pull/795#issuecomment-1018616726

keiji commented 2 years ago

こちら完了しているのでCloseします。