Page MenuHomePhabricator

jQuery.Deferred exception: can't access dead object
Open, Needs TriagePublicBUG REPORT

Description

Steps to replicate the issue (include links if applicable):

  • Editing an existing page with VisualEditor, inserting text with templates and occasionally deleting some of those templates. At some point, a floating "qq" text appeared in the editor.

What happens?:

When I pressed save, I got the stack trace below:

 jQuery.Deferred exception: can't access dead object ve.init.mw.DesktopArticleTarget.prototype.restorePage@https://www.mediawiki.org/wiki/Growth/Team/Norms?action=edit line 10 > injectedScript:23:11
ve.init.mw.DesktopArticleTarget.prototype.teardown@https://www.mediawiki.org/wiki/Growth/Team/Norms?action=edit line 10 > injectedScript:12:78
ve.init.mw.ArticleTarget.prototype.tryTeardown@https://www.mediawiki.org/wiki/Growth/Team/Norms line 10 > injectedScript:325:708
ve.init.mw.DesktopArticleTarget.prototype.tryTeardown@https://www.mediawiki.org/wiki/Growth/Team/Norms?action=edit line 10 > injectedScript:11:325
ve.init.mw.ArticleTarget.prototype.saveComplete@https://www.mediawiki.org/wiki/Growth/Team/Norms line 10 > injectedScript:306:779
ve.init.mw.DesktopArticleTarget.prototype.saveComplete@https://www.mediawiki.org/wiki/Growth/Team/Norms?action=edit line 10 > injectedScript:16:710
fire@https://www.mediawiki.org/w/load.php?lang=en&modules=ext.discussionTools.init%7Cjquery%2Coojs-ui-core&skin=vector-2022&version=bqlwb:346:934
fireWith@https://www.mediawiki.org/w/load.php?lang=en&modules=ext.discussionTools.init%7Cjquery%2Coojs-ui-core&skin=vector-2022&version=bqlwb:348:135
mightThrow@https://www.mediawiki.org/w/load.php?lang=en&modules=ext.discussionTools.init%7Cjquery%2Coojs-ui-core&skin=vector-2022&version=bqlwb:350:487
Deferred/then/resolve/</process<@https://www.mediawiki.org/w/load.php?lang=en&modules=ext.discussionTools.init%7Cjquery%2Coojs-ui-core&skin=vector-2022&version=bqlwb:350:544
Deferred/then/resolve/<@https://www.mediawiki.org/w/load.php?lang=en&modules=ext.discussionTools.init%7Cjquery%2Coojs-ui-core&skin=vector-2022&version=bqlwb:350:768
mightThrow@https://www.mediawiki.org/w/load.php?lang=en&modules=ext.discussionTools.init%7Cjquery%2Coojs-ui-core&skin=vector-2022&version=bqlwb:349:881
Deferred/then/resolve/</process<@https://www.mediawiki.org/w/load.php?lang=en&modules=ext.discussionTools.init%7Cjquery%2Coojs-ui-core&skin=vector-2022&version=bqlwb:350:544

What should have happened instead?:

The article should have saved.

Software version (skip for WMF-hosted wikis like Wikipedia):

Other information (browser name/version, screenshots, etc.):

Firefox Nightly, 110

image.png (2×2 px, 922 KB)

The mystery qq artifact (IIRC I was trying to type qqq.json into a template for inline code):

image.png (2×2 px, 869 KB)

The HTML:

<div class="printfooter" data-nosnippet="">Retrieved from "<a dir="ltr" href="https://www.mediawiki.org/w/index.php?title=Growth/Team/Norms&amp;oldid=4454286">https://www.mediawiki.org/w/index.php?title=Growth/Team/Norms&amp;oldid=4454286</a>"</div></div><div class="mw-body-content oo-ui-widget ve-ui-surface ve-ui-surface-visual ve-ui-mwSurface ve-init-mw-target-surface ve-ui-surface-dir-ltr"><div class="ve-ce-surface notranslate ve-ce-surface-enabled" translate="no"><div class="ve-ce-branchNode ve-ce-documentNode ve-ce-attachedRootNode ve-ce-rootNode mw-content-ltr mw-parser-output mw-show-empty-elt" spellcheck="true" tabindex="0" data-gramm="false" role="textbox" dir="ltr" lang="en" contenteditable="true"><p id="mwAg" class="ve-ce-branchNode ve-ce-contentBranchNode ve-ce-paragraphNode">This page is intended to document the Growth Team's <img src="data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs=" class="ve-ce-nail ve-ce-nail-pre-open"><a rel="mw:WikiLink/Interwiki" href="https://en.wikipedia.org/wiki/Social_norm" title="https://en.wikipedia.org/wiki/Social_norm" class="extiw ve-ce-annotation ve-ce-nailedAnnotation ve-ce-linkAnnotation" id="mwAw"><img src="data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs=" class="ve-ce-nail ve-ce-nail-post-open">norms<img src="data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs=" class="ve-ce-nail ve-ce-nail-pre-close"></a><img src="data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs=" class="ve-ce-nail ve-ce-nail-post-close"> and ceremonies. Team ceremonies for Growth is defined as a series of acts and processes performed regularly with the intention of creating an environment that promotes iterative improvement, innovation and productivity.</p><p id="mwBA" class="ve-ce-branchNode ve-ce-contentBranchNode ve-ce-paragraphNode">On this team, process is not intended to become performative, rather it is intended to provide the needed structure to:</p><ul id="mwBQ" class="ve-ce-branchNode"><li id="mwBg" class="ve-ce-branchNode"><p class="ve-ce-branchNode ve-ce-contentBranchNode ve-ce-paragraphNode ve-ce-generated-wrapper">Improve Iteratively; Learn and Adjust &nbsp;</p><ul id="mwBw" class="ve-ce-branchNode"><li id="mwCA" class="ve-ce-branchNode"><p class="ve-ce-branchNode ve-ce-contentBranchNode ve-ce-paragraphNode ve-ce-generated-wrapper">Experiment</p></li><li id="mwCQ" class="ve-ce-branchNode"><p class="ve-ce-branchNode ve-ce-contentBranchNode ve-ce-paragraphNode ve-ce-generated-wrapper">Fail Fast</p></li><li id="mwCg" class="ve-ce-branchNode"><p class="ve-ce-branchNode ve-ce-contentBranchNode ve-ce-paragraphNode ve-ce-generated-wrapper">Reflect</p></li></ul></li><li id="mwCw" class="ve-ce-branchNode"><p class="ve-ce-branchNode ve-ce-contentBranchNode ve-ce-paragraphNode ve-ce-generated-wrapper">Collaborate</p></li><li id="mwDA" class="ve-ce-branchNode"><p class="ve-ce-branchNode ve-ce-contentBranchNode ve-ce-paragraphNode ve-ce-generated-wrapper">Share Knowledge, Wins &amp; Lessons</p><ul id="mwDQ" class="ve-ce-branchNode"><li id="mwDg" class="ve-ce-branchNode"><p class="ve-ce-branchNode ve-ce-contentBranchNode ve-ce-paragraphNode ve-ce-generated-wrapper">With Each Other</p></li><li id="mwDw" class="ve-ce-branchNode"><p class="ve-ce-branchNode ve-ce-contentBranchNode ve-ce-paragraphNode ve-ce-generated-wrapper">Our Communities</p></li><li id="mwEA" class="ve-ce-branchNode"><p class="ve-ce-branchNode ve-ce-contentBranchNode ve-ce-paragraphNode ve-ce-generated-wrapper">The Foundation</p></li></ul></li><li id="mwEQ" class="ve-ce-branchNode"><p class="ve-ce-branchNode ve-ce-contentBranchNode ve-ce-paragraphNode ve-ce-generated-wrapper">Set and Meet Goals</p><ul id="mwEg" class="ve-ce-branchNode"><li id="mwEw" class="ve-ce-branchNode"><p class="ve-ce-branchNode ve-ce-contentBranchNode ve-ce-paragraphNode ve-ce-generated-wrapper">Adding Value/Priorities &gt; Scope &nbsp;</p></li><li id="mwFA" class="ve-ce-branchNode"><p class="ve-ce-branchNode ve-ce-contentBranchNode ve-ce-paragraphNode ve-ce-generated-wrapper">Wikimedia Foundation Annual Plan</p></li><li id="mwFQ" class="ve-ce-branchNode"><p class="ve-ce-branchNode ve-ce-contentBranchNode ve-ce-paragraphNode ve-ce-generated-wrapper">Short and Long Term</p></li></ul></li></ul><p id="mwFg" class="ve-ce-branchNode ve-ce-contentBranchNode ve-ce-paragraphNode">Team ceremonies <b id="mwFw" class="ve-ce-annotation ve-ce-textStyleAnnotation ve-ce-boldAnnotation">can be altered</b> if it is collectively determined after trial they are not effective as is. Plans and goals are set as a baseline and something to strive towards. Plans and goals if not met should not result in condemnation or negative tones. Not meeting plans and goals should be viewed as an opportunity to learn what needs to be adjusted, rather it is process, priorities, scope or expectations.</p><h2 id="Standup_&amp;_Team_Discussions" class="ve-ce-branchNode ve-ce-contentBranchNode ve-ce-headingNode">Standup &amp; Team Discussions</h2><p id="mwGQ" class="ve-ce-branchNode ve-ce-contentBranchNode ve-ce-paragraphNode">Traditionally, Scrum-style standups are at the start of the workday, and are meant to</p><ol id="mwGg" class="ve-ce-branchNode"><li id="mwGw" class="ve-ce-branchNode"><p class="ve-ce-branchNode ve-ce-contentBranchNode ve-ce-paragraphNode ve-ce-generated-wrapper">Serve as the first line of defense against wasting time. Specifically, this is the tightest feedback loop a team has as a group.</p></li><li id="mwHA" class="ve-ce-branchNode"><p class="ve-ce-branchNode ve-ce-contentBranchNode ve-ce-paragraphNode ve-ce-generated-wrapper">Motivate the team through shared commitment.</p></li></ol><p id="mwHQ" class="ve-ce-branchNode ve-ce-contentBranchNode ve-ce-paragraphNode">This is generally accomplished through 3 classic questions:</p><ul id="mwHg" class="ve-ce-branchNode"><li id="mwHw" class="ve-ce-branchNode"><p class="ve-ce-branchNode ve-ce-contentBranchNode ve-ce-paragraphNode ve-ce-generated-wrapper">What did you work on yesterday?</p></li><li id="mwIA" class="ve-ce-branchNode"><p class="ve-ce-branchNode ve-ce-contentBranchNode ve-ce-paragraphNode ve-ce-generated-wrapper">What will you work on today?</p></li><li id="mwIQ" class="ve-ce-branchNode"><p class="ve-ce-branchNode ve-ce-contentBranchNode ve-ce-paragraphNode ve-ce-generated-wrapper">What is blocking you?</p></li></ul><p id="mwIg" class="ve-ce-branchNode ve-ce-contentBranchNode ve-ce-paragraphNode">The Growth team, like many teams at WMF, uses a modified version of this approach, due mostly to the fact that the team is widely distributed across the world (and thus each person is on a different schedule). Synchronous time has a different meaning (e.g. the start of one day may be the end of another, even if there is overlap), and is precious (i.e. should only be used when necessary). The team modifies their standup as follows:</p><ul id="mwIw" class="ve-ce-branchNode"><li id="mwJA" class="ve-ce-branchNode"><p class="ve-ce-branchNode ve-ce-contentBranchNode ve-ce-paragraphNode ve-ce-generated-wrapper"><b id="mwJQ" class="ve-ce-annotation ve-ce-textStyleAnnotation ve-ce-boldAnnotation">Synchronous (video) standups</b> occur every Monday and Wednesday, and every other Tuesday. The team may also standup attached to another meeting.</p><ul id="mwJg" class="ve-ce-branchNode"><li id="mwJw" class="ve-ce-branchNode"><p class="ve-ce-branchNode ve-ce-contentBranchNode ve-ce-paragraphNode ve-ce-generated-wrapper">Typically, sync standups are 15 minutes and cover blockers.</p></li><li id="mwKA" class="ve-ce-branchNode"><p class="ve-ce-branchNode ve-ce-contentBranchNode ve-ce-paragraphNode ve-ce-generated-wrapper">Standups are generally an opportunity to share progress on work, raise tasks that could potentially impact others, or to escalate blockers that impede team productivity.</p></li><li id="mwKQ" class="ve-ce-branchNode"><p class="ve-ce-branchNode ve-ce-contentBranchNode ve-ce-paragraphNode ve-ce-generated-wrapper">Topics that need to be explored in depth are held until discussion times on Tuesdays or Wednesdays, or ad-hoc, as needed.</p></li></ul></li></ul><ul id="mwKg" class="ve-ce-branchNode"><li id="mwKw" class="ve-ce-branchNode"><p class="ve-ce-branchNode ve-ce-contentBranchNode ve-ce-paragraphNode ve-ce-generated-wrapper"><b id="mwLA" class="ve-ce-annotation ve-ce-textStyleAnnotation ve-ce-boldAnnotation">Asynchronous (email/chat) standups</b> occur every weekday.</p><ul id="mwLQ" class="ve-ce-branchNode"><li id="mwLg" class="ve-ce-branchNode"><p class="ve-ce-branchNode ve-ce-contentBranchNode ve-ce-paragraphNode ve-ce-generated-wrapper">GrowthStandupBot 9000 is a program run by Google Apps Script to automate daily emails to the team list.</p></li><li id="mwLw" class="ve-ce-branchNode"><p class="ve-ce-branchNode ve-ce-contentBranchNode ve-ce-paragraphNode ve-ce-generated-wrapper">The bot asks focuses on the current day, and is flexible depending on whom is responding. It asks for either what is planned for that day, or what was planned and how that went. Blockers are also appropriate to share.</p></li><li id="mwMA" class="ve-ce-branchNode"><p class="ve-ce-branchNode ve-ce-contentBranchNode ve-ce-paragraphNode ve-ce-generated-wrapper">The purpose of the thread is to</p><ul id="mwMQ" class="ve-ce-branchNode"><li id="mwMg" class="ve-ce-branchNode"><p class="ve-ce-branchNode ve-ce-contentBranchNode ve-ce-paragraphNode ve-ce-generated-wrapper">Notify other team members of your participation, so that they will be prompted to do so, too (vs adding to a document or etherpad and checking throughout the day).</p></li><li id="mwMw" class="ve-ce-branchNode"><p class="ve-ce-branchNode ve-ce-contentBranchNode ve-ce-paragraphNode ve-ce-generated-wrapper">Centralize the team's daily check-in on work, to help adjust priorities, and help one another, as needed.</p></li><li id="mwNA" class="ve-ce-branchNode"><p class="ve-ce-branchNode ve-ce-contentBranchNode ve-ce-paragraphNode ve-ce-generated-wrapper">Hold one another accountable for commitments.</p><ul id="mwNQ" class="ve-ce-branchNode"><li id="mwNg" class="ve-ce-branchNode"><p class="ve-ce-branchNode ve-ce-contentBranchNode ve-ce-paragraphNode ve-ce-generated-wrapper">This can also include sharing non-Growth-team work. For instance, to let the team know why you might not (or have not) engaged as much as expected.</p></li></ul></li></ul></li></ul></li></ul><p id="mwNw" class="ve-ce-branchNode ve-ce-contentBranchNode ve-ce-paragraphNode">Often, the team will cope with wide geographical distribution by assigning "homework," to mitigate the need for synchronous meetings. This will often take the form of a pre-recorded video or slide deck, which members of the team will watch ahead of a meeting to discuss it. The team agreed (at their retro on 2020-12-14) that the minimum time to get homework ahead of such a meeting is 2 days, not including the day the video was sent and the day the video will be discussed. The team refers to this as the "2-day Sandwich Norm."</p><h2 id="Board_Triage_Meetings" class="ve-ce-branchNode ve-ce-contentBranchNode ve-ce-headingNode">Board Triage Meetings</h2><p id="mwOQ" class="ve-ce-branchNode ve-ce-contentBranchNode ve-ce-paragraphNode">Official Board Triage Meetings are bi-weekly meetings where the team goes through the Needs Discussion/Analysis column of our <img src="data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs=" class="ve-ce-nail ve-ce-nail-pre-open"><a rel="mw:WikiLink/Interwiki" href="https://phabricator.wikimedia.org/project/view/1114/" title="https://phabricator.wikimedia.org/project/view/1114/" class="extiw ve-ce-annotation ve-ce-nailedAnnotation ve-ce-linkAnnotation" id="mwOg"><img src="data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs=" class="ve-ce-nail ve-ce-nail-post-open">Phabricator Board<img src="data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs=" class="ve-ce-nail ve-ce-nail-pre-close"></a><img src="data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs=" class="ve-ce-nail ve-ce-nail-post-close">  to determine:</p><ul id="mwOw" class="ve-ce-branchNode"><li id="mwPA" class="ve-ce-branchNode"><p class="ve-ce-branchNode ve-ce-contentBranchNode ve-ce-paragraphNode ve-ce-generated-wrapper">If a task should be prioritized</p></li><li id="mwPQ" class="ve-ce-branchNode"><p class="ve-ce-branchNode ve-ce-contentBranchNode ve-ce-paragraphNode ve-ce-generated-wrapper">The urgency in which a task should be prioritize</p></li><li id="mwPg" class="ve-ce-branchNode"><p class="ve-ce-branchNode ve-ce-contentBranchNode ve-ce-paragraphNode ve-ce-generated-wrapper">If the task is within scope for our team</p></li></ul><p id="mwPw" class="ve-ce-branchNode ve-ce-contentBranchNode ve-ce-paragraphNode">Based on the team's decision of prioritization and scope, we will leave a comment with our decision and move it into the proper column.</p><p id="mwQA" class="ve-ce-branchNode ve-ce-contentBranchNode ve-ce-paragraphNode">Tickets arrive to the Needs Discussion/Analysis column from the Inbox. Anyone on the team can pull tickets into the Needs Discussion column or Triage but Future column on a rolling basis. The team's TPgM also schedules ad-hoc triage meetings with QA and at least one Engineer.</p><h2 id="Sprints:" class="ve-ce-branchNode ve-ce-contentBranchNode ve-ce-headingNode">Sprints:</h2><p id="mwQg" class="ve-ce-branchNode ve-ce-contentBranchNode ve-ce-paragraphNode">Our team sprints are two working weeks and begin with Planning Meetings and end with Retrospectives. Once a sprint starts it is not advised that a Product Manager requests changes to what is being produced. It is the job of the Technical Program Manager to work with the team to adjust and re-prioritize tasks as necessary within the sprint to meet the criteria set during planning. At the end of each sprint, the entire team should discuss what was accomplished as it compares to the criteria agreed upon with the Product Manager and make necessary process adjustments.</p><h2 id="Planning_Meetings:" class="ve-ce-branchNode ve-ce-contentBranchNode ve-ce-headingNode">Planning Meetings:</h2><p id="mwRA" class="ve-ce-branchNode ve-ce-contentBranchNode ve-ce-paragraphNode">Planning Meetings are bi-weekly meetings attended by the team at the start of a sprint. During the planning meeting, the team identifies and prioritizes tasks that are to be completed for the two-week sprint. Tasks that will be worked on in the current sprint are to be represented on the Current Sprint board.</p><h2 id="Grooming_Meetings:" class="ve-ce-branchNode ve-ce-contentBranchNode ve-ce-headingNode">Grooming Meetings:</h2><p id="mwRg" class="ve-ce-branchNode ve-ce-contentBranchNode ve-ce-paragraphNode">Grooming Meetings are bi-weekly meetings attended by the team at the halfway point of each sprint. During grooming, the team reevaluates the work they have committed to and determines if more or less work should be taken on or if tasks should be reprioritized. If there is additional time in the meeting, the team will look at the Backlog Board and pull tickets into Upcoming as indicators it should be pulled into the next Sprint.</p><h2 id="Retrospective_Meetings:" class="ve-ce-branchNode ve-ce-contentBranchNode ve-ce-headingNode">Retrospective Meetings:</h2><p id="mwSA" class="ve-ce-branchNode ve-ce-contentBranchNode ve-ce-paragraphNode">Retrospective Meetings (retros) are bi-weekly meetings attended by the team at the end of each sprint. During Retrospectives, the team revisits action items from the last retrospective and reflects on the two-week sprint by collectively answering the following:</p><ul id="mwSQ" class="ve-ce-branchNode"><li id="mwSg" class="ve-ce-branchNode"><p class="ve-ce-branchNode ve-ce-contentBranchNode ve-ce-paragraphNode ve-ce-generated-wrapper">Did we meet our acceptance criteria?</p></li><li id="mwSw" class="ve-ce-branchNode"><p class="ve-ce-branchNode ve-ce-contentBranchNode ve-ce-paragraphNode ve-ce-generated-wrapper">What have we accomplished?</p></li><li id="mwTA" class="ve-ce-branchNode"><p class="ve-ce-branchNode ve-ce-contentBranchNode ve-ce-paragraphNode ve-ce-generated-wrapper">What worked?</p></li><li id="mwTQ" class="ve-ce-branchNode"><p class="ve-ce-branchNode ve-ce-contentBranchNode ve-ce-paragraphNode ve-ce-generated-wrapper">What could we improve next time?</p></li><li id="mwTg" class="ve-ce-branchNode"><p class="ve-ce-branchNode ve-ce-contentBranchNode ve-ce-paragraphNode ve-ce-generated-wrapper">What was confusing?</p></li></ul><p id="mwTw" class="ve-ce-branchNode ve-ce-contentBranchNode ve-ce-paragraphNode">Action items will be captured during the meeting and due dates and action owners will be assigned.</p><h2 id="Google_Calendar:" class="ve-ce-branchNode ve-ce-contentBranchNode ve-ce-headingNode">Google Calendar:</h2><p id="mwUQ" class="ve-ce-branchNode ve-ce-contentBranchNode ve-ce-paragraphNode">New members of the team will be added to the Growth team calendar. If a team member will be out of the office for four or more hours during a working day, they are to share it on the team calendar at the earliest indicator that they may be out. This practice will help the team manage expectations when estimating what work can get accomplished during planning. Team ceremonies will also be represented on the Google Calendar.</p><h2 id="Google_Hangout:" class="ve-ce-branchNode ve-ce-contentBranchNode ve-ce-headingNode">Google Hangout:</h2><p id="mwUw" class="ve-ce-branchNode ve-ce-contentBranchNode ve-ce-paragraphNode">The team has three google hangouts:</p><ul id="mwVA" class="ve-ce-branchNode"><li id="mwVQ" class="ve-ce-branchNode"><p class="ve-ce-branchNode ve-ce-contentBranchNode ve-ce-paragraphNode ve-ce-generated-wrapper">Growth (Social): Instant message members of the Growth team with non-work related items</p></li><li id="mwVg" class="ve-ce-branchNode"><p class="ve-ce-branchNode ve-ce-contentBranchNode ve-ce-paragraphNode ve-ce-generated-wrapper">Growth: Instant Message members of the Growth team about work related items</p></li><li id="mwVw" class="ve-ce-branchNode"><p class="ve-ce-branchNode ve-ce-contentBranchNode ve-ce-paragraphNode ve-ce-generated-wrapper">Humans of the Web: Instant message members of the Growth, Editing and Readers Web team</p></li></ul><h2 id="Gerrit:" class="ve-ce-branchNode ve-ce-contentBranchNode ve-ce-headingNode">Gerrit:</h2><p id="mwWQ" class="ve-ce-branchNode ve-ce-contentBranchNode ve-ce-paragraphNode">The Growth team uses Gerrit, a code collaboration tool, for peer code review. &nbsp;</p><h2 id="Phabricator:" class="ve-ce-branchNode ve-ce-contentBranchNode ve-ce-headingNode">Phabricator:</h2><p id="mwWw" class="ve-ce-branchNode ve-ce-contentBranchNode ve-ce-paragraphNode">Phabricator is the organization’s task/issue tracking tool that houses the <img src="data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs=" class="ve-ce-nail ve-ce-nail-pre-open"><a rel="mw:WikiLink/Interwiki" href="https://phabricator.wikimedia.org/project/view/1114/" title="https://phabricator.wikimedia.org/project/view/1114/" class="extiw ve-ce-annotation ve-ce-nailedAnnotation ve-ce-linkAnnotation" id="mwXA"><img src="data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs=" class="ve-ce-nail ve-ce-nail-post-open">Growth team’s<img src="data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs=" class="ve-ce-nail ve-ce-nail-pre-close"></a><img src="data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs=" class="ve-ce-nail ve-ce-nail-post-close"> user stories, tasks, progress and prioritization of work. Tickets at the top of the Ready for Development column in the <img src="data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs=" class="ve-ce-nail ve-ce-nail-pre-open"><a rel="mw:WikiLink/Interwiki" href="https://phabricator.wikimedia.org/project/view/3450/" title="https://phabricator.wikimedia.org/project/view/3450/" class="extiw ve-ce-annotation ve-ce-nailedAnnotation ve-ce-linkAnnotation" id="mwXQ"><img src="data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs=" class="ve-ce-nail ve-ce-nail-post-open">Current Sprint Milestone<img src="data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs=" class="ve-ce-nail ve-ce-nail-pre-close"></a><img src="data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs=" class="ve-ce-nail ve-ce-nail-post-close"> are considered the highest priority and next up in the queue to work on.↵<br id="mwXg" class="ve-ce-leafNode ve-ce-breakNode"><span class="ve-ce-branchNode-slug ve-ce-branchNode-inlineSlug"><img role="none" alt="" class="ve-ce-chimera ve-ce-chimera-gecko" src="data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs="></span></p><h2 class="ve-ce-branchNode ve-ce-contentBranchNode ve-ce-headingNode">Translations</h2><p class="ve-ce-branchNode ve-ce-contentBranchNode ve-ce-paragraphNode">Our software contains hundreds of text strings. We rely on volunteers and <img src="data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs=" class="ve-ce-nail ve-ce-nail-pre-open"><a class="ve-ce-annotation ve-ce-nailedAnnotation ve-ce-linkAnnotation ve-ce-mwInternalLinkAnnotation" title="Product Ambassadors" href="https://www.mediawiki.org/wiki/Product_Ambassadors"><img src="data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs=" class="ve-ce-nail ve-ce-nail-post-open">Product Ambassadors<img src="data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs=" class="ve-ce-nail ve-ce-nail-pre-close"></a><img src="data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs=" class="ve-ce-nail ve-ce-nail-post-close"> to translate these texts into various languages, and want to reduce the burden of translation as much as possible when adding new texts. In order to do so, we will:</p><ol class="ve-ce-branchNode"><li class="ve-ce-branchNode"><p class="ve-ce-branchNode ve-ce-contentBranchNode ve-ce-paragraphNode ve-ce-generated-wrapper"><b class="ve-ce-annotation ve-ce-textStyleAnnotation ve-ce-boldAnnotation">Use a prefix for draft message texts</b>. For example, if the text is not finalized by product/design, engineers should use <code id="mwAg" class="mw-highlight mw-highlight-lang-php mw-content-ltr ve-ce-leafNode ve-ce-focusableNode ve-ce-mwTransclusionNode" style="" dir="ltr" typeof="mw:Extension/syntaxhighlight mw:Transclusion" about="#mwt1" data-mw="{&quot;parts&quot;:[{&quot;template&quot;:{&quot;target&quot;:{&quot;wt&quot;:&quot;Inline-code&quot;,&quot;href&quot;:&quot;./Template:Inline-code&quot;},&quot;params&quot;:{&quot;1&quot;:{&quot;wt&quot;:&quot;DRAFT: Message goes here.&quot;}},&quot;i&quot;:0}}]}" contenteditable="false"><span class="nx" id="mwAw">DRAFT</span><span class="o" id="mwBA">:</span> <span class="nx" id="mwBQ">Message</span> <span class="nx" id="mwBg">goes</span> <span class="nx" id="mwBw">here</span><span class="o" id="mwCA">.</span></code><span class="ve-ce-branchNode-slug ve-ce-branchNode-inlineSlug"><img role="none" alt="" class="ve-ce-chimera ve-ce-chimera-gecko" src="data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs="> This has two benefits:</span></p><ol class="ve-ce-branchNode"><li class="ve-ce-branchNode"><p class="ve-ce-branchNode ve-ce-contentBranchNode ve-ce-paragraphNode ve-ce-generated-wrapper">Visual reminder to product, design and engineering that we need to finalize the message. <span class="ve-ce-branchNode-slug ve-ce-branchNode-inlineSlug"><img role="none" alt="" class="ve-ce-chimera ve-ce-chimera-gecko" src="data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs="></span></p></li><li class="ve-ce-branchNode"><p class="ve-ce-branchNode ve-ce-contentBranchNode ve-ce-paragraphNode ve-ce-generated-wrapper">Longer message text, to allow us to better design for languages that are more verbose than English.<span class="ve-ce-branchNode-slug ve-ce-branchNode-inlineSlug"><img role="none" alt="" class="ve-ce-chimera ve-ce-chimera-gecko" src="data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs="></span></p></li></ol></li><li class="ve-ce-branchNode"><p class="ve-ce-branchNode ve-ce-contentBranchNode ve-ce-paragraphNode ve-ce-generated-wrapper"><b class="ve-ce-annotation ve-ce-textStyleAnnotation ve-ce-boldAnnotation">Use a no-translate template in QQQ.json. </b>Draft messages (those prefixed with "DRAFT:") should have the "notranslate"</p><p class="ve-ce-branchNode ve-ce-contentBranchNode ve-ce-paragraphNode"> template at the end of the qqq.json message.</p>qq</li><li class="ve-ce-branchNode"><p class="ve-ce-branchNode ve-ce-contentBranchNode ve-ce-paragraphNode"><b class="ve-ce-annotation ve-ce-textStyleAnnotation ve-ce-boldAnnotation">Create a "finalize messages and qqq.json" task for an epic. </b>For a given epic of work, there should be a task to finalize messages. In this task, we will make a patch to finalize the copy for en.json (removing the "DRAFT:" prefix) and the qqq.json (removing the "notranslate" template).</p></li><li class="ve-ce-branchNode"><p class="ve-ce-branchNode ve-ce-contentBranchNode ve-ce-paragraphNode"><b class="ve-ce-annotation ve-ce-textStyleAnnotation ve-ce-boldAnnotation">Allow 7 days for translation. </b>Once the text strings are finalized in step 3, we should allow for at least 7 days before enabling the feature for wide use. That allows ambassadors and volunteers time to translate the text. Examples:</p><ol class="ve-ce-branchNode"><li class="ve-ce-branchNode"><p class="ve-ce-branchNode ve-ce-contentBranchNode ve-ce-paragraphNode">If the messages are finalized on Tuesday, after the branch cut, then the feature using these messages should not be enabled for broad use until the following Thursday, at the earliest.<span class="ve-ce-branchNode-slug ve-ce-branchNode-inlineSlug"><img role="none" alt="" class="ve-ce-chimera ve-ce-chimera-gecko" src="data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs="></span></p></li><li class="ve-ce-branchNode"><p class="ve-ce-branchNode ve-ce-contentBranchNode ve-ce-paragraphNode">If the messages are finalized on a Friday, the messages should not be enabled for broad use until 13 days later, on Thursday (group2 deployment) at the earliest. That's because the translators would only have Saturday/Sunday/Monday to get translations done in time for the next week's train. </p><p class="ve-ce-branchNode ve-ce-contentBranchNode ve-ce-paragraphNode"><span class="ve-ce-branchNode-slug ve-ce-branchNode-inlineSlug"><img role="none" alt="" class="ve-ce-chimera ve-ce-chimera-gecko" src="data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs="></span></p></li></ol></li></ol></div><div class="ve-ce-surface-paste noime" aria-hidden="true" tabindex="-1" contenteditable="true">Markup

Event Timeline

Oh, the edit did go through, it's just that the success message didn't appear due to the JS error. And the mystery qq fragment doesn't appear in the final text: https://www.mediawiki.org/w/index.php?title=Growth%2FTeam%2FNorms&diff=5720312&oldid=4454286&diffmode=source

Hmm. The other reference to this error in phabricator is T282580: TypeError: can't access dead object but that seems quite different. Anyway, perhaps we just mark this as invalid for now, mostly wanted it here for your team's awareness. I don't see anything in our client logs related to VisualEditor + this error, though, maybe I'm filtering incorrectly as I'd expect to see the error from mediawiki.org that I posted here.