Implement calls to action for experimental LLM-generated MoS suggestions
Closed, ResolvedPublic5 Estimated Story Points

Description

This task involves the work of implementing the calls to action that will accompany the LLM-generated MoS Suggestions that we present during the initial experienced volunteer evaluation phases (T428311 & T431376).

NOTE: the card copy will be implemented via the ML team in T430030.

Requirements

Each of the three types of LLM-generated MoS suggestions (revise tone, simplify language, and review place name) will be accompanied by the same CTA...

  • Prompt: Do you think this suggestion is valid?
    • CTA #1 (Yes, it's valid): hide suggestion; show "Success toast" (see below)
      • CTA #2 (No, it's not valid): hide suggestion; show "Keep survey" (see below)
  • Success toast:
    • Thank you for helping to ensure edit suggestions are reliable and useful.
  • Rejection survey:
    • Survey description: Please help developers understand why you think this suggestion is invalid.
    • Survey options:
      • There is an issue in the text, but the type of issue is mislabeled.
      • There is an issue in the text, but the suggestion is not helpful.
      • None of the above applies.
  • Suggestion footer
  • Logging/Instrumentation
    • Each time someone engages with either of the calls to action within the card, ensure that response is logged and associated with its corresponding UUID (T430720)
      • This includes which response people provide in the feedback survey.

Done

  • Before implementation begins, ask ML Team for feedback on the proposed technical approach to verify logging will provide info. they need
  • Requirements are implemented
  • Verify response data is being logged to schema as expected

I checked the related model-generated Suggestion Mode documentation and instrumentation work. One important scope distinction: T430030 owns the suggestion-card copy, while T432666 is specifically about the validation CTAs, feedback flow, footer, and logging. The experimental suggestions cover neutral/tone issues, simpler language, and geographic naming. ([MediaWiki][1])

Derived Requirements

  1. Ensure that each experimental LLM-generated Revise tone, Simplify language, and Review place name suggestion provides the prompt Do you think this suggestion is valid? with options for the user to indicate that the suggestion is valid or invalid.
  1. Ensure that when a user indicates an LLM-generated suggestion is valid, the suggestion is dismissed and a success toast displays Thank you for helping to ensure edit suggestions are reliable and useful.
  1. Ensure that when a user indicates an LLM-generated suggestion is invalid, the suggestion is dismissed and a rejection survey is displayed.
  1. Ensure that the rejection survey displays Please help developers understand why you think this suggestion is invalid. and provides the following feedback options:
    • There is an issue in the text, but the type of issue is mislabeled.
    • There is an issue in the text, but the suggestion is not helpful.
    • None of the above applies.
  1. Ensure that each experimental LLM-generated suggestion displays the footer Identified using an open-weight language model.
  1. Ensure that a user's valid or invalid response is recorded for the specific suggestion with which the user interacted.
  1. Ensure that feedback selected from the rejection survey is recorded for the specific suggestion being evaluated.

Test Steps

Preconditions

  1. Use an experienced-user test account eligible for experimental LLM-generated MoS suggestions.
  2. Enable experimental suggestions if required by the test environment.
  3. Open an article containing an experimental LLM-generated suggestion.
  4. Test with Revise tone, Simplify language, and Review place name suggestions when examples of each type are available.

Test Case 1: Ensure all LLM-generated suggestion types provide the validation CTA

  1. Open an article containing an experimental LLM-generated MoS suggestion.
  2. Enter VisualEditor.
  3. Navigate to the LLM-generated suggestion.
  4. Review the suggestion card.
  5. Repeat with Revise tone, Simplify language, and Review place name suggestions.
  6. ✅❓❌⬜ AC1: Each available LLM-generated suggestion type displays "Do you think this suggestion is valid?" with options to indicate that the suggestion is valid or invalid.

Test Case 2: Ensure accepting a valid suggestion displays the success confirmation

  1. Open an LLM-generated suggestion.
  2. Locate the Do you think this suggestion is valid? prompt.
  3. Select the option indicating the suggestion is valid.
  4. Observe the suggestion and resulting notification.
  5. ✅❓❌⬜ AC2: Indicating that the suggestion is valid dismisses the suggestion and displays "Thank you for helping to ensure edit suggestions are reliable and useful."

Test Case 3: Ensure rejecting an invalid suggestion displays the feedback survey

  1. Open an LLM-generated suggestion.
  2. Locate the Do you think this suggestion is valid? prompt.
  3. Select the option indicating the suggestion is invalid.
  4. Observe the suggestion and resulting feedback interface.
  5. ✅❓❌⬜ AC3: Indicating that the suggestion is invalid dismisses the suggestion and displays the rejection survey.

Test Case 4: Ensure the rejection survey contains the required feedback options

  1. Open an LLM-generated suggestion.
  2. Indicate that the suggestion is invalid.
  3. Review the rejection survey description.
  4. Review all available survey responses.
  5. ✅❓❌⬜ AC4: The rejection survey displays "Please help developers understand why you think this suggestion is invalid." with options for a mislabeled issue, an unhelpful suggestion, and "None of the above applies."

Test Case 5: Ensure LLM-generated suggestions identify their model source

  1. Open an article containing an experimental LLM-generated suggestion.
  2. Enter VisualEditor.
  3. Navigate to the suggestion.
  4. Review the bottom of the suggestion card.
  5. Repeat with each available LLM-generated suggestion type.
  6. ✅❓❌⬜ AC5: Each LLM-generated suggestion displays the footer "Identified using an open-weight language model".

Test Case 6: Ensure valid and invalid responses are logged for the correct suggestion

  1. Open an LLM-generated suggestion with a known UUID.
  2. Indicate that the suggestion is valid.
  3. Inspect the corresponding instrumentation event using the available QA logging method.
  4. Open a different LLM-generated suggestion with a different known UUID.
  5. Indicate that the second suggestion is invalid.
  6. Inspect its corresponding instrumentation event.
  7. ✅❓❌⬜ AC6: Each valid or invalid response is logged with the UUID corresponding to the LLM-generated suggestion on which the response was submitted.

QA Results - TestFlight

Event Timeline

ppelberg updated the task description. (Show Details)
ldelench_wmf set the point value for this task to 3.Jul 21 2026, 5:17 PM
ppelberg changed the point value for this task from 3 to 5.
ppelberg updated the task description. (Show Details)
ppelberg updated the task description. (Show Details)

Change #1320209 had a related patch set uploaded (by DLynch; author: DLynch):

[mediawiki/extensions/VisualEditor@master] LLMSuggestions: implement feedback actions

https://gerrit.wikimedia.org/r/1320209

CleanShot 2026-08-03 at 12.39.21@2x.png (650×636 px, 61 KB)
CleanShot 2026-08-03 at 12.39.36@2x.png (646×622 px, 69 KB)

A fake suggestion with the id SUGGESTIONID produced this example flow:

activity.editCheck-llmSuggestion-test {action: 'seen-id-SUGGESTIONID', feature: 'editCheck-llmSuggestion-test'}
activity.editCheck-llmSuggestion-test {action: 'suggestion-seen-midedit', feature: 'editCheck-llmSuggestion-test'}
activity.editCheck-llmSuggestion-test {action: 'invalid-id-SUGGESTIONID', feature: 'editCheck-llmSuggestion-test'}
activity.editCheck-llmSuggestion-test {action: 'suggestion-action-invalid', feature: 'editCheck-llmSuggestion-test'}
activity.editCheck-llmSuggestion-test {action: 'invalid-id-SUGGESTIONID-reason-unhelpful', feature: 'editCheck-llmSuggestion-test'}

Change #1320209 merged by jenkins-bot:

[mediawiki/extensions/VisualEditor@master] LLMSuggestions: implement feedback actions

https://gerrit.wikimedia.org/r/1320209

DLynch added a project: Editing QA.

The useful local testing trick is that after the line .then( ( response ) => response.json() ) you can put this:

.then( () => ( {
	suggestions: [
		{
			suggestion_id: "SUGGESTIONID",
			target: "I contain test data.",
			suggestion_type: "test",
			title: "Test data",
			static_description: "Pls change this, it is [[bad]]",
			description: "Nothing should ever contain test data",
		}
	]
} ) )

...and so long as your document includes "I contain test data." then it'll trigger the suggestion.

I think everything is implemented and deployed and what's left is QA.

@ppelberg @DLynch Can you please review AC1, AC4 & AC5? I also have a question for AC6. Thanks!

Test Result - Prod

Status: ✅ PASS
Environment: Prod
OS: macOS Tahoe 26.5.2
Browser: Chrome 150, Firefox
Device: MBA
Emulated Device: BrowserStack: Pixel 8 Pro & iPhone 14 Pro Max

Test Artifact(s):
https://en.wikipedia.org/w/index.php?title=Screenlife&veaction=edit&ecenable=experimental
https://en.wikipedia.org/w/index.php?title=Luka_Bo%C5%BEi%C4%87&veaction=edit&ecenable=experimental
https://en.wikipedia.org/w/index.php?title=Luka_Bo%C5%BEi%C4%87&ecenable=experimental
https://en.wikipedia.org/w/index.php?title=Iamblichus&veaction=edit&ecenable=experimental

Test Steps

Test Case 1: Ensure all LLM-generated suggestion types provide the validation CTA

  1. Open an article containing an experimental LLM-generated MoS suggestion.
  2. Enter VisualEditor.
  3. Navigate to the LLM-generated suggestion.
  4. Review the suggestion card.
  5. Repeat with Revise tone, Simplify language, and Review place name suggestions.
  6. AC1: Each available LLM-generated suggestion type displays "Do you think this suggestion is valid?" with options to indicate that the suggestion is valid or invalid.
Mac Chrome: Desktop Simplify language- Yes, it's validMac Chrome: Desktop Simplify language- No, It's not validPixel 8 Pro- Firefox- No, It's not validPhone 14 Pro Max Chrome- No, it's valid
2026-08-18_15-36-27.png (1,142×1,023 px, 400 KB)
2026-08-18_15-44-39.png (479×1,012 px, 423 KB)
2026-08-18_15-43-59.png (907×1,039 px, 171 KB)
Mac Chrome: Desktop Review place name- No, It's not validPixel 8 Pro- Firefox- Review place name- No, It's not validiPhone 14 Pro Max Chrome- Yes, it's valid
2026-08-18_15-27-52.png (520×1,020 px, 420 KB)

UPDATE: per T432666#12229190

❌Mac Chrome: Desktop Revise Tone❌ Pixel 8 Pro- Firefox- Revise Tone
2026-08-18_14-41-37.png (1,230×1,012 px, 391 KB)
2026-08-18_15-48-41.png (518×998 px, 480 KB)

Test Case 2: Ensure accepting a valid suggestion displays the success confirmation

  1. Open an LLM-generated suggestion.
  2. Locate the Do you think this suggestion is valid? prompt.
  3. Select the option indicating the suggestion is valid.
  4. Observe the suggestion and resulting notification.
  5. AC2: Indicating that the suggestion is valid dismisses the suggestion and displays "Thank you for helping to ensure edit suggestions are reliable and useful."
Mac Chrome: Desktop Simplify languageiPhone 14 Pro Max Chrome

Test Case 3: Ensure rejecting an invalid suggestion displays the feedback survey

  1. Open an LLM-generated suggestion.
  2. Locate the Do you think this suggestion is valid? prompt.
  3. Select the option indicating the suggestion is invalid.
  4. Observe the suggestion and resulting feedback interface.
  5. AC3: Indicating that the suggestion is invalid dismisses the suggestion and displays the rejection survey.

See AC1

Test Case 4: Ensure the rejection survey contains the required feedback options

  1. Open an LLM-generated suggestion.
  2. Indicate that the suggestion is invalid.
  3. Review the rejection survey description.
  4. Review all available survey responses.
  5. AC4: The rejection survey displays "Please help developers understand why you think this suggestion is invalid." with options for a mislabeled issue, an unhelpful suggestion, and "None of the above applies."

UPDATE: per T432666#12229190

✅Pixel 8 Pro- Firefox- Simplify Language- No, It's not valid✅Pixel 8 Pro- Firefox- Review place name- No, It's not valid❌Mac Chrome: Desktop Revise Tone
2026-08-18_15-44-39.png (479×1,012 px, 423 KB)
2026-08-18_15-27-52.png (520×1,020 px, 420 KB)
2026-08-18_16-05-57.png (1,177×1,040 px, 387 KB)

Test Case 5: Ensure LLM-generated suggestions identify their model source

  1. Open an article containing an experimental LLM-generated suggestion.
  2. Enter VisualEditor.
  3. Navigate to the suggestion.
  4. Review the bottom of the suggestion card.
  5. Repeat with each available LLM-generated suggestion type.
  6. AC5: Each LLM-generated suggestion displays the footer "Identified using an open-weight language model".

UPDATE: per T432666#12229190

Does not appear for Revise Tone

✅Review Place Name✅Simplify Language❌Revise Tone
2026-08-18_16-03-23.png (1,225×1,054 px, 481 KB)
2026-08-18_16-05-11.png (932×1,023 px, 180 KB)
2026-08-18_16-05-57.png (1,177×1,040 px, 387 KB)

Test Case 6: Ensure valid and invalid responses are logged for the correct suggestion

  1. Open an LLM-generated suggestion with a known UUID.
  2. Indicate that the suggestion is valid.
  3. Inspect the corresponding instrumentation event using the available QA logging method.
  4. Open a different LLM-generated suggestion with a different known UUID.
  5. Indicate that the second suggestion is invalid.
  6. Inspect its corresponding instrumentation event.
  7. ⬜  AC6: Each valid or invalid response is logged with the UUID corresponding to the LLM-generated suggestion on which the response was submitted.

UPDATE: per T432666#12229190

When I click on a response, where are they supposed to be logged?

For AC1/AC4/AC5: the Revise Tone you've screenshotted is a different check, and isn't covered by this ticket. (Yes, it is very confusing for testing purposes that this LLM suggestion dataset includes conceptual duplicates of an existing check.) In practice, not a huge deal, as T435253 just completely filtered those ones out, so you won't be able to find them to test regardless.

AC6: They're getting logged to the VisualEditorFeatureUse schema. You won't be able to easily look into the logged data, but you can check https://www.mediawiki.org/wiki/Extension:EventLogging/Programming#Debugging for instructions on how to turn on some logging to your browser console to look out for the relevant events there -- the snippet I pasted into T432666#12180260 was from that output (well, from something related to it -- I have mw.trackSubscribe('activity.', (topic, payload) => console.log(topic, payload)); in my common.js).

Thanks for the update regarding Revise Tone. Since that isn’t covered by this task, I’ll update the status of AC1, AC4, and AC5, since the issues I found were all related to Revise Tone.

AC6, which covers events, will be tested as part of the other task, T430720.

With those items accounted for, I’ll mark this task as PASS and close it out. Thanks for all your work on this!