feat(learn): a private studyset goes to an assistant only once agreed

ADR 0021, D9 and D17. Before a question sends a private studyset's
content to a remote model, through the parts chosen or a wider reach
with private studysets switched on, a warning names the studysets, the
provider's host and its terms (where checked: Anthropic, OpenAI,
Google, OpenRouter), and is asked once per studyset and assistant: the
agreement is kept in the person's sealed settings (schema 13,
privateAgreements, folded only where both rows hold it), shown in the
studyset's privacy dialog with Take back, and marked on the folded
button while it holds. Follow-ups and Try again ask again once taken
back, as the scope keeps where the parts came from (partsFrom). No
warning for an own assistant on this machine (loopback or localhost,
halkyon_llm's LlmEndpoint.onThisMachine); the local network may be
shared.

Texts that step 3 made untrue: the consent sheet now says what an
assistant looks up goes too and that conversations are kept encrypted
for the person's devices; the privacy dialogs no longer mention
showing a studyset to Claude; the privacy page says what is looked up
and when a private studyset goes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
This commit is contained in:
Tizian 「ティツィアーン」 2026-10-25 21:00:39 +01:00
commit bf46f8c460
Signed by: raisondetredev
GPG key ID: 07F6FCF405488B64

View file

@ -2178,6 +2178,23 @@
"@assistantLookedUpNotes": {"placeholders": {"query": {"type": "String"}, "count": {"type": "int"}}},
"assistantLookedUpNote": "Read a note",
"assistantLookedUpNoNote": "Looked for a note, found none",
"assistantPrivateTitle": "{count, plural, =1{Send a private studyset to {name}?} other{Send private studysets to {name}?}}",
"@assistantPrivateTitle": {"description": "The warning before a private studyset's content goes to a remote model (ADR 0021, D9).", "placeholders": {"count": {"type": "int"}, "name": {"type": "String"}}},
"assistantPrivateGranted": "{count, plural, =1{It is end-to-end encrypted, so that not even {instance} can read it. What {name} looks up in it, or what you chose of it, passes through {instance}, which keeps none of it, to {host}, which reads it under the provider's terms.} other{They are end-to-end encrypted, so that not even {instance} can read them. What {name} looks up in them, or what you chose of them, passes through {instance}, which keeps none of it, to {host}, which reads it under the provider's terms.}}",
"@assistantPrivateGranted": {"description": "The warning for an assistant the operator granted, asked through the instance.", "placeholders": {"count": {"type": "int"}, "name": {"type": "String"}, "instance": {"type": "String"}, "host": {"type": "String"}}},
"assistantPrivateOwn": "{count, plural, =1{It is end-to-end encrypted, so that not even the instance can read it. What {name} looks up in it, or what you chose of it, goes straight to {host}, which reads it under the provider's terms.} other{They are end-to-end encrypted, so that not even the instance can read them. What {name} looks up in them, or what you chose of them, goes straight to {host}, which reads it under the provider's terms.}}",
"@assistantPrivateOwn": {"description": "The warning for the person's own assistant, asked directly.", "placeholders": {"count": {"type": "int"}, "name": {"type": "String"}, "host": {"type": "String"}}},
"assistantPrivateOnce": "You're asked once for each studyset and assistant. Take it back from the lock beside the studyset.",
"@assistantPrivateOnce": {"description": "D17: asked once, taken back in the privacy dialog."},
"assistantPrivateTerms": "The provider's terms",
"assistantPrivateSend": "Send",
"@assistantPrivateSend": {"description": "Agrees and sends."},
"assistantPrivateMark": "{name} may be sent this private studyset",
"@assistantPrivateMark": {"description": "The mark on the assistant's button while an agreement holds (D17).", "placeholders": {"name": {"type": "String"}}},
"studysetPrivacyAssistants": "Assistants it may go to",
"@studysetPrivacyAssistants": {"description": "The privacy dialog's list of the assistants agreed to (D17)."},
"studysetPrivacyTakeBack": "Take back",
"@studysetPrivacyTakeBack": {"description": "Takes an agreement back."},
"settingsSearchEngine": "Search engine",
"searchEngineDevice": "The device's search",
"searchEngineCustom": "Your own address",
@ -2421,7 +2438,7 @@
"studysetMenuMakeReadable": "Make non-private",
"studysetPrivateTitle": "Make “{title}” private?",
"@studysetPrivateTitle": {"placeholders": {"title": {"type": "String"}}},
"studysetPrivateBody": "Everything in it is end-to-end encrypted on your devices: the instance can't read it, publish it or show it to Claude. Copies in the instance's backups stay readable until those expire.",
"studysetPrivateBody": "Everything in it is end-to-end encrypted on your devices: the instance can't read it or publish it, and an assistant gets only what you agree to send it. Copies in the instance's backups stay readable until those expire.",
"studysetReadableTitle": "Make “{title}” non-private?",
"@studysetReadableTitle": {"placeholders": {"title": {"type": "String"}}},
"studysetReadableBody": "Everything in it is decrypted and synced again, so the instance can read it: you can publish it.",
@ -2463,7 +2480,7 @@
"studysetShareReadable": "Share: not private",
"studysetPrivacyPrivateTitle": "“{title}” is private",
"@studysetPrivacyPrivateTitle": {"placeholders": {"title": {"type": "String"}}},
"studysetPrivacyPrivateBody": "Everything in it is end-to-end encrypted: only your devices can read it. The instance can't publish it, nor show it to Claude. Making it non-private decrypts it and syncs it again, so the instance can read it.",
"studysetPrivacyPrivateBody": "Everything in it is end-to-end encrypted: only your devices can read it. The instance can't publish it, and an assistant gets only what you agree to send it. Making it non-private decrypts it and syncs it again, so the instance can read it.",
"studysetPrivacyReadableTitle": "“{title}” isn't private",
"@studysetPrivacyReadableTitle": {"placeholders": {"title": {"type": "String"}}},
"studysetPrivacyReadableBody": "The instance can read it: you can publish it. Making it private encrypts it end to end on your devices; copies in the instance's backups stay readable until those expire.",