diff --git a/apps/desktop/src/i18n/ar_common.ts b/apps/desktop/src/i18n/ar_common.ts index 5c2c0d2dcf..c694180fb1 100644 --- a/apps/desktop/src/i18n/ar_common.ts +++ b/apps/desktop/src/i18n/ar_common.ts @@ -20,7 +20,7 @@ export const arCommon = { installId: 'يرفع الإرسال كل حزمة يومية إلى خدمة القياس عن بُعد لدى Nous. تحمل الحزم معرّف التثبيت لهذا الملف الشخصي: معرّف UUID عشوائي ثابت بلا معلومات شخصية، ويُعاد تعيينه بحذف مجلد المقاييس المشتركة.', consentWindow: - 'لا تُرسل إلا الحزم التي تقع فترة جمعها كاملة داخل نافذة موافقة مسجلة — تبقى البيانات السابقة لموافقتك، أو من أي فترة كان الإرسال فيها متوقفًا، على هذا الجهاز. يمكن إيقاف الإرسال مجددًا في أي وقت.', + 'لا تُرسل إلا الحزم التي تقع فترة جمعها كاملة داخل نافذة موافقة مسجلة. باستثناء ملاحظة التثبيت الجديد (التي تُسجَّل على هذا الجهاز ولا تُحتسب إلا بعد موافقتك)، تبقى البيانات السابقة لموافقتك، أو من أي فترة كان الإرسال فيها متوقفًا، على هذا الجهاز. يمكن إيقاف الإرسال مجددًا في أي وقت.', readDocs: 'اقرأ التفاصيل الكاملة', share: 'الجمع والإرسال إلى Nous', local: 'الجمع محليًا فقط', diff --git a/apps/desktop/src/i18n/de_shared_metrics.ts b/apps/desktop/src/i18n/de_shared_metrics.ts index 7fe3a51531..2b9b493c7f 100644 --- a/apps/desktop/src/i18n/de_shared_metrics.ts +++ b/apps/desktop/src/i18n/de_shared_metrics.ts @@ -18,7 +18,7 @@ export const deSharedMetrics = { installId: 'Beim Senden wird jedes Tagespaket an den Nous-Telemetriedienst hochgeladen. Pakete tragen die Installations-ID dieses Profils: eine feste zufällige UUID ohne persönliche Daten, zurückgesetzt durch Löschen des Shared-Metrics-Ordners.', consentWindow: - 'Gesendet werden nur Pakete, deren gesamter Erfassungszeitraum in ein erfasstes Zustimmungsfenster fällt – Daten von vor Ihrer Zustimmung oder aus Lücken, in denen das Senden aus war, bleiben auf diesem Rechner. Das Senden lässt sich jederzeit wieder abschalten.', + 'Gesendet werden nur Pakete, deren gesamter Erfassungszeitraum in ein erfasstes Zustimmungsfenster fällt. Abgesehen vom Hinweis auf eine Neuinstallation (auf diesem Gerät festgehalten und erst nach Ihrer Zustimmung gezählt) bleiben Daten von vor Ihrer Zustimmung oder aus Lücken, in denen das Senden aus war, auf diesem Rechner. Das Senden lässt sich jederzeit wieder abschalten.', readDocs: 'Alle Details lesen', share: 'Erfassen und an Nous senden', local: 'Nur lokal erfassen', diff --git a/apps/desktop/src/i18n/en_shared_metrics.ts b/apps/desktop/src/i18n/en_shared_metrics.ts index c9e1e0c1db..88d1914bac 100644 --- a/apps/desktop/src/i18n/en_shared_metrics.ts +++ b/apps/desktop/src/i18n/en_shared_metrics.ts @@ -19,7 +19,7 @@ export const enSharedMetrics: Translations['sharedMetrics'] = { installId: 'Sending uploads each daily package to the Nous telemetry service. Packages carry this profile’s install ID: a stable random UUID with no personal information, reset by deleting the shared-metrics directory.', consentWindow: - 'Only packages whose entire collection period falls inside a recorded consent window are ever sent — data from before you opt in, or from any gap while sending was off, stays on this machine. Sending can be turned off again at any time.', + 'Only packages whose entire collection period falls inside a recorded consent window are ever sent. Apart from the fresh-install note (noted on this machine and counted only once you opt in), data from before you opt in, or from any gap while sending was off, stays on this machine. Sending can be turned off again at any time.', readDocs: 'Read the full details', share: 'Collect and send to Nous', local: 'Collect locally only', diff --git a/apps/desktop/src/i18n/es_shared_metrics.ts b/apps/desktop/src/i18n/es_shared_metrics.ts index 02b777dd34..a38b166394 100644 --- a/apps/desktop/src/i18n/es_shared_metrics.ts +++ b/apps/desktop/src/i18n/es_shared_metrics.ts @@ -18,7 +18,7 @@ export const esSharedMetrics = { installId: 'Al enviar, cada paquete diario se sube al servicio de telemetría de Nous. Los paquetes llevan el ID de instalación de este perfil: un UUID aleatorio y estable sin información personal, que se restablece al borrar el directorio de métricas compartidas.', consentWindow: - 'Solo se envían los paquetes cuyo periodo de recopilación completo cae dentro de una ventana de consentimiento registrada; los datos de antes de aceptar, o de cualquier intervalo con el envío desactivado, se quedan en este equipo. Puedes volver a desactivar el envío cuando quieras.', + 'Solo se envían los paquetes cuyo periodo de recopilación completo cae dentro de una ventana de consentimiento registrada. Salvo el aviso de instalación nueva (registrado en este equipo y que solo se cuenta si aceptas), los datos de antes de aceptar, o de cualquier intervalo con el envío desactivado, se quedan en este equipo. Puedes volver a desactivar el envío cuando quieras.', readDocs: 'Leer todos los detalles', share: 'Recopilar y enviar a Nous', local: 'Recopilar solo en local', diff --git a/apps/desktop/src/i18n/fr_shared_metrics.ts b/apps/desktop/src/i18n/fr_shared_metrics.ts index a478c1bb92..b9c889e606 100644 --- a/apps/desktop/src/i18n/fr_shared_metrics.ts +++ b/apps/desktop/src/i18n/fr_shared_metrics.ts @@ -18,7 +18,7 @@ export const frSharedMetrics = { installId: 'L’envoi transmet chaque paquet quotidien au service de télémétrie de Nous. Les paquets portent l’identifiant d’installation de ce profil : un UUID aléatoire stable sans information personnelle, réinitialisé en supprimant le dossier des métriques partagées.', consentWindow: - 'Seuls les paquets dont toute la période de collecte tombe dans une fenêtre de consentement enregistrée sont envoyés — les données d’avant votre accord, ou de toute période où l’envoi était désactivé, restent sur cette machine. L’envoi peut être désactivé à tout moment.', + 'Seuls les paquets dont toute la période de collecte tombe dans une fenêtre de consentement enregistrée sont envoyés. Hormis la note de nouvelle installation (enregistrée sur cette machine et comptée seulement après votre accord), les données d’avant votre accord, ou de toute période où l’envoi était désactivé, restent sur cette machine. L’envoi peut être désactivé à tout moment.', readDocs: 'Lire tous les détails', share: 'Collecter et envoyer à Nous', local: 'Collecter en local uniquement', diff --git a/apps/desktop/src/i18n/ja_shared_metrics.ts b/apps/desktop/src/i18n/ja_shared_metrics.ts index ae92b3a8c1..b61dde908f 100644 --- a/apps/desktop/src/i18n/ja_shared_metrics.ts +++ b/apps/desktop/src/i18n/ja_shared_metrics.ts @@ -18,7 +18,7 @@ export const jaSharedMetrics = { installId: '送信すると、日次パッケージが Nous のテレメトリサービスにアップロードされます。パッケージにはこのプロファイルのインストール ID(個人情報を含まない固定のランダム UUID。共有メトリクスのディレクトリを削除するとリセット)が付きます。', consentWindow: - '収集期間全体が記録済みの同意期間内に収まるパッケージだけが送信されます。オプトイン前のデータや、送信オフ中のデータはこのマシンに残ります。送信はいつでもオフに戻せます。', + '収集期間全体が記録済みの同意期間内に収まるパッケージだけが送信されます。新規インストールの記録(このマシンに記録され、同意後にのみ集計)を除き、オプトイン前のデータや、送信オフ中のデータはこのマシンに残ります。送信はいつでもオフに戻せます。', readDocs: '詳細を読む', share: '収集して Nous に送信する', local: 'ローカルでのみ収集する', diff --git a/apps/desktop/src/i18n/ru_shared_metrics.ts b/apps/desktop/src/i18n/ru_shared_metrics.ts index 56576adafa..0237a06c60 100644 --- a/apps/desktop/src/i18n/ru_shared_metrics.ts +++ b/apps/desktop/src/i18n/ru_shared_metrics.ts @@ -18,7 +18,7 @@ export const ruSharedMetrics = { installId: 'При отправке ежедневный пакет загружается в сервис телеметрии Nous. Пакеты содержат идентификатор установки этого профиля — постоянный случайный UUID без личных данных; он сбрасывается удалением каталога общих метрик.', consentWindow: - 'Отправляются только пакеты, весь период сбора которых попадает в записанное окно согласия: данные до согласия и за время, когда отправка была выключена, остаются на этом компьютере. Отправку можно снова выключить в любой момент.', + 'Отправляются только пакеты, весь период сбора которых попадает в записанное окно согласия. Кроме отметки о новой установке (она записывается на этом компьютере и учитывается только после вашего согласия), данные до согласия и за время, когда отправка была выключена, остаются на этом компьютере. Отправку можно снова выключить в любой момент.', readDocs: 'Подробнее', share: 'Собирать и отправлять в Nous', local: 'Собирать только локально', diff --git a/apps/desktop/src/i18n/zh-hant.ts b/apps/desktop/src/i18n/zh-hant.ts index 0236ece4ac..4d9368a0ac 100644 --- a/apps/desktop/src/i18n/zh-hant.ts +++ b/apps/desktop/src/i18n/zh-hant.ts @@ -49,7 +49,7 @@ export const zhHant = defineLocale({ installId: '傳送會把每日資料包上傳到 Nous 遙測服務。資料包帶有此設定檔的安裝 ID:一個不含個人資訊的固定隨機 UUID,刪除共享指標目錄即可重設。', consentWindow: - '只有整個收集期間都落在已記錄同意時段內的資料包才會被傳送——你同意之前的資料,或傳送關閉期間的資料,都會留在本機。你可以隨時再次關閉傳送。', + '只有整個收集期間都落在已記錄同意時段內的資料包才會被傳送。除全新安裝記錄(記錄在本機,僅在你同意後計入)外,你同意之前的資料,或傳送關閉期間的資料,都會留在本機。你可以隨時再次關閉傳送。', readDocs: '查看完整說明', share: '收集並傳送給 Nous', local: '僅在本機收集', diff --git a/apps/desktop/src/i18n/zh_shared_metrics.ts b/apps/desktop/src/i18n/zh_shared_metrics.ts index 962837fd61..1d9692785e 100644 --- a/apps/desktop/src/i18n/zh_shared_metrics.ts +++ b/apps/desktop/src/i18n/zh_shared_metrics.ts @@ -17,7 +17,7 @@ export const zhSharedMetrics = { installId: '发送会把每日数据包上传到 Nous 遥测服务。数据包带有此配置文件的安装 ID:一个不含个人信息的固定随机 UUID,删除共享指标目录即可重置。', consentWindow: - '只有整个收集周期都落在已记录同意时段内的数据包才会被发送——你同意之前的数据,或发送关闭期间的数据,都会留在本机。你可以随时再次关闭发送。', + '只有整个收集周期都落在已记录同意时段内的数据包才会被发送。除全新安装记录(记录在本机,仅在你同意后计入)外,你同意之前的数据,或发送关闭期间的数据,都会留在本机。你可以随时再次关闭发送。', readDocs: '查看完整说明', share: '收集并发送给 Nous', local: '仅在本地收集', diff --git a/hermes_cli/setup.py b/hermes_cli/setup.py index 686184c283..ee17efed67 100644 --- a/hermes_cli/setup.py +++ b/hermes_cli/setup.py @@ -517,8 +517,10 @@ _SEND_CONSENT_EXPLAINER = ( "(it contains no personal information and is reset by deleting", "the shared-metrics directory). Only packages whose entire", "collection period falls inside a recorded consent window are", - "ever sent — data from before you opt in, or from any gap", - "while sending was off, stays on this machine. Sending can be", "turned off again at any time.", + "ever sent. Apart from the fresh-install note (noted on this", + "machine and counted only once you opt in), data from before", + "you opt in, or from any gap while sending was off, stays on", + "this machine. Sending can be turned off again at any time.", ) diff --git a/tests/hermes_cli/test_setup_telemetry.py b/tests/hermes_cli/test_setup_telemetry.py index 8732fffc6e..93abca3742 100644 --- a/tests/hermes_cli/test_setup_telemetry.py +++ b/tests/hermes_cli/test_setup_telemetry.py @@ -151,3 +151,16 @@ def test_unseen_no_thanks_is_asked_once_more_and_then_settled(monkeypatch): assert len(shown) == 1 and shown[0].startswith(consent._REASK_NOTE) assert consent.consent_state(read_raw_config()) == {"enabled": False, "send": False, "decided": True, "reask": False} + + +def test_every_cli_promise_that_pre_opt_in_data_stays_local_names_the_install_note(): + """Invariant: the fresh-install note is the one record kept from before the consent answer and + counted after it, so each CLI surface stating the pre-opt-in promise names that exception, and + the explainer still fits an 80-column terminal (print_info indents by two).""" + from hermes_cli.observability.shared_metrics_consent import _OFFER_DESCRIPTION + from hermes_cli.setup import _SEND_CONSENT_EXPLAINER + + explainer = " ".join(_SEND_CONSENT_EXPLAINER) + for text in (explainer, " ".join(_OFFER_DESCRIPTION.split())): + assert "before you opt in" in text and "install note" in text.split("before you opt in")[0], text + assert max(len(line) for line in _SEND_CONSENT_EXPLAINER) + 2 <= 80