Skip to content

Say who the summary is sent to, before the reader sends it - #280

Merged
adamjohnwright merged 3 commits into
mainfrom
feat/pre-click-ai-disclosure
Sep 21, 2026
Merged

adamjohnwright merged 3 commits into
mainfrom
feat/pre-click-ai-disclosure

Conversation

@adamjohnwright

Copy link
Copy Markdown
Contributor

The AI disclosure sat under the finished summary. By the time a reader could read "AI-generated", their analysis result had already left Reactome — so what was offered as a disclosure was a description of something that had already happened.

What the reader is actually deciding is whether their result may go to a third party. That decision is made at the button, so the note is now at the button.

It names the company

"AI-generated" describes a technology. The question a person asks before pressing a button that sends their data somewhere is who gets it.

React-to-Me runs on Reactome's own infrastructure but calls OpenAI to write the text, which makes OpenAI a third party to the request even though the reader never talks to it directly. (Verified from reactome_chatbot: langchain-openai, OPENAI_API_KEY in its compose file, default gpt-4o-mini.)

Tense

The same note now opens on either side of the click, so the copy is present tense throughout — "was given" is a lie to somebody who has not pressed the button yet. There is a test for that.

What it deliberately does not say

It claims nothing about retention or training. That is the provider's contract to state, not ours to summarise from memory, and a wrong reassurance is worse than silence. There is a test asserting that silence, because it is exactly the sentence somebody adds later to be helpful.

On the unmatched identifiers

The panel asks only for the aggregate tier and should keep doing so. The result tab already lists every unmatched identifier in a sortable table with a CSV download, so the disclosing tier would send a reader's uploaded data to a model to tell them something they can already read beside it.

Checks

448 unit tests green; lint 652 and dead-code 145 unchanged from baseline.

🤖 Generated with Claude Code

adamjohnwright and others added 3 commits September 21, 2026 15:44
The disclosure sat under the finished summary. By the time a reader could read
"AI-generated", their analysis result had already left Reactome -- so what was
offered as a disclosure was a description of something that had happened. What
the reader is deciding is whether their result may go to a third party, and
that decision is made at the button.

So the note moves above the click, and it names the company. "AI-generated"
describes a technology; the question a person asks before pressing a button
that sends their data somewhere is *who gets it*. React-to-Me runs on
Reactome's own infrastructure but calls OpenAI to write the text, which makes
OpenAI a third party to the request even though the reader never talks to it.

The same note now opens on either side of the click, which is why the copy is
in the present tense throughout -- "was given" is a lie to somebody who has not
pressed the button yet. It states what is sent (the result's pathways, not the
uploaded identifiers) and deliberately claims nothing about retention or
training: that is the provider's contract to state, not ours to summarise from
memory, and a wrong reassurance is worse than silence. There is a test for that
silence, because it is the kind of sentence somebody adds to be helpful.

On the unmatched identifiers: the panel asks only for the aggregate tier and
should keep doing so. The result tab already lists every unmatched identifier
in a sortable table with a CSV download, so the disclosing tier would send a
reader's uploaded data to a model to tell them something they can already read
beside it.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
`howOpen` outlives whatever opened it. A reader opens "what gets sent" beside
the button, clicks, and the request fails: the button block is gone because a
state is set, the summary block is gone because there is no prose, and the note
rendered anyway -- an explanation of what gets sent to OpenAI floating above an
error message, attached to nothing.

Found reviewing this branch as a merge candidate rather than while writing it,
which is the point of doing that separately.

The condition that decides whether the button is offered now has a name,
because two things need the same answer and a second copy of it is how the two
would drift apart.

Not covered by a test: it is template wiring, and this repo cannot render a
component with an external templateUrl under vitest -- vitest.config.ts says
why, and moving the predicate into panel-copy.ts would only test `a || b`.
Verified by reading the three states it can be in and by the build. Saying so
rather than implying the tests below cover it.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@adamjohnwright
adamjohnwright merged commit 48779ca into main Sep 21, 2026
6 checks passed
@adamjohnwright
adamjohnwright deleted the feat/pre-click-ai-disclosure branch September 21, 2026 18:37
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant