Page MenuHomePhabricator

Clean up UcfirstOverrides.php following PHP 7.4 -> 8.1 transition
Closed, ResolvedPublic

Description

Background

In T372603, we updated UcfirstOverrides.php [0] to maintain title-case consistency between PHP 7.4 (Unicode 11) and 8.1 (Unicode 14).

Once there exist no more PHP 7.4 workloads, we need to clean these up, while being sure to leave the permanent override for Eszett intact.

There will be no more PHP 7.4 workloads when:

  • We are no longer building and testing (in mw-debug) 7.4 images during deployments (T391057) (note: this is happening very soon).
  • We have completed the mw-cron migration (T341555) and mwscript can no longer be used on 7.4 (mwmaint) hosts (T341553).

See also T292552 for the last cleanup of this type, which combined both the 7.2 - 7.4 consistency cleanup and the transition to title-case.

[0] https://gerrit.wikimedia.org/r/plugins/gitiles/operations/mediawiki-config/+/refs/heads/master/wmf-config/UcfirstOverrides.php

Schedule

The renames were completed on Tuesday, 1st of July.

Process

This outlines the specific process used during this cleanup. See T292552 for the previous one.

  1. Prepare the character mapping.

Generate a title-case character mapping from the current state (i.e., consistent with older Unicode version) to the desired state (i.e., consistent with newer Unicode version).

This is the same process as used to generate UcfirstOverrides.php with generateUcfirstOverrides.php (and indeed uses the same title-casing character tables), but with the --override and --with options reversed - i.e., in our case, override 7.4 with 8.1 (not vice versa). An example character mapping from this task can be found in P76371. Compare, e.g., with the then-current state of UcfirstOverrides.php at the time that was enforcing 7.4 - 8.1 consistency.

  1. Collect users, pages, images, etc. to be renamed.

This can be done by running uppercaseTitlesForUnicodeTransition.php over all wikis in its (default) dry-run mode. Renamed pages, images, etc. will be logged by the script (look for "Would ..." in dry-run mode).

As of this writing, mwscript-k8s does not support persistent output files, which complicates collection of the renamed user list (--userlist). There are a couple of ways around this, but two simple options include:

  • Use mwscript via foreachwiki to run the script locally on the active deployment host (similar to T292552).
  • Use mwscript-k8s with, e.g., --userlist 'php://stdout' to instead emit the renamed user list to stdout, which can then be processed out of the container logs.

Here, we went with the second option, though some care is needed to strip the foreachwiki-like wiki name prefix added to log lines from the tab-separated (wiki, user ID, new name) tuples.

mwscript-k8s --follow --dblist=all --file=override-74-to-81.php -- uppercaseTitlesForUnicodeTransition.php --charmap override-74-to-81.php --suffix ' (technical rename)' --userlist 'php://stdout'

Review the resulting renames with subject-matter experts.

  1. Communicate the planned renames and notify affected users.

For non-user renames, we opened a subtask providing context and the list of renames (T396903), and then announced the plan via Tech News with anticipated timing. Given the small number of users affected (1), we notified them directly via Special:EmailUser on metawiki.

  1. Prepare a patch reverting UcfirstOverrides.php to the desired state.

This should clear the title-case overrides introduced for the migration, leaving only the permanent override for Eszett (e.g., https://gerrit.wikimedia.org/r/1152295). You will not deploy the patch until step #6.

  1. Perform renames.

Re-run #2 (again in dry-run mode) to collect a fresh set of renames, particularly the renamed user list.

Since the renameInvalidUsernames.php script performs a global rename, the user list only needs to contain a single (wiki, user ID, new name) tuple per global user to be renamed. To avoid unnecessary duplicate global renames, you can deduplicate the user list to just one per global user.

mwscript-k8s --follow --file=deduplicated.userlist.txt -- extensions/WikimediaMaintenance/renameInvalidUsernames.php --wiki metawiki --list deduplicated.userlist.txt --reason 'Technical rename for Unicode transition'

Wait for these to complete asynchronously after the script completes, which can take some time (tens of minutes) depending on the number of renames and state of the job queue (you can also check LocalRenameUserJob in the JobQueue Job dashboard to see representative backlog times; remember to select the current primary DC). If there are a very small number of renames, you can check on their progress individually via https://meta.wikimedia.org/wiki/Special:GlobalRenameProgress.

Once the user renames are complete, continue with the page, etc. renames. If there are a large number of affected wikis, your best option may be to again use mwscript-k8s --dblist=all for this, similar to step #2. If there are a small number of affected wikis (as was the case here), it will be much faster to run mwscript-k8s for each affected wiki one-at-a-time (see T394556#10925709).

In either case, the only difference in invocation vs. step #2 is adding the --run option to take the script out of dry-run.

One issue we ran into at this stage was a failed rename due to an AbuseFilter rule (T394556#10964880). The rule was temporarily disabled as a workaround. See also T398384.

  1. Merge UcfirstOverrides.php cleanup.
NOTE: This should happen as quickly as possible after your renames complete.

Before starting, take note of the last-deployed mediawiki-multiversion-cli image. The simplest way to find this is to consult /etc/helmfile-defaults/mediawiki/release/mw-script-main.yaml on the deployment host.

Merge and deploy your change with scap backport.

Once that's complete, you can verify that nothing sneaked through between the rename script running and the backport deployment (which prevents creation of entities following the older title-casing behavior) by running step #2 yet again, but now with the mwscript-k8s --mediawiki_image flag set to the previous CLI image version you collected above.

If anything did sneak through, you can again use this same technique to re-run the script with --run under the previous image.

Related Objects

StatusSubtypeAssignedTask
ResolvedNone
ResolvedReedy
StalledNone
OpenNone
OpenNone
ResolvedReedy
OpenNone
OpenKrinkle
ResolvedJdforrester-WMF
ResolvedJdforrester-WMF
ResolvedJdforrester-WMF
ResolvedLucas_Werkmeister_WMDE
ResolvedNone
ResolvedJdforrester-WMF
ResolvedDaimona
ResolvedJdforrester-WMF
OpenNone
ResolvedScott_French
ResolvedScott_French
ResolvedScott_French
Opencscott
ResolvedScott_French
DuplicatePRODUCTION ERRORNone
ResolvedPRODUCTION ERRORMichael
OpenPRODUCTION ERRORNone
OpenMichael
DuplicatePRODUCTION ERRORNone
ResolvedTgr
ResolvedNone
ResolvedDAlangi_WMF
ResolvedTgr
ResolvedDAlangi_WMF
ResolvedTgr
ResolvedTgr
ResolvedAtieno
OpenNone
Resolvedbrouberol
ResolvedScott_French
ResolvedScott_French
ResolvedScott_French
ResolvedScott_French
ResolvedScott_French
ResolvedScott_French
ResolvedKrinkle
ResolvedKrinkle
ResolvedScott_French
ResolvedKrinkle
ResolvedTgr
ResolvedScott_French
Resolved jnuche
ResolvedJdforrester-WMF
ResolvedBUG REPORT bd808
ResolvedReedy
ResolvedReedy
Resolvedseanleong-WMDE
StalledNone
OpenNone
ResolvedLucas_Werkmeister_WMDE
ResolvedDaimona
ResolvedDaimona
ResolvedDaimona
OpenNone
ResolvedUmherirrender
OpenNone
ResolvedUmherirrender
ResolvedUmherirrender
Resolved mszabo
Resolvedtstarling
ResolvedUmherirrender
ResolvedDreamy_Jazz
ResolvedDreamy_Jazz
ResolvedPhysikerwelt
ResolvedTgr
ResolvedUmherirrender
ResolvedUmherirrender
ResolvedNone
ResolvedUmherirrender
ResolvedNone
ResolvedNone
ResolvedkarapayneWMDE
ResolvedAudreyPenven_WMDE
ResolvedAudreyPenven_WMDE
ResolvedLucas_Werkmeister_WMDE
ResolvedLucas_Werkmeister_WMDE
ResolvedUmherirrender
Resolvedthiemowmde
ResolvedLucas_Werkmeister_WMDE
ResolvedUmherirrender
ResolvedUmherirrender
ResolvedUmherirrender
ResolvedUmherirrender
ResolvedUmherirrender
ResolvedUmherirrender
Resolved mszabo
ResolvedxSavitar
ResolvedUmherirrender
ResolvedUmherirrender
ResolvedUmherirrender
OpenNone
OpenNone
OpenNone
OpenDannyS712
ResolvedUmherirrender
Resolved larissagaulia
ResolvedUmherirrender
ResolvedJdforrester-WMF
ResolvedJdforrester-WMF
ResolvedJdforrester-WMF
ResolvedKrinkle
ResolvedScott_French
ResolvedScott_French

Event Timeline

Going by the git history on UcfirstOverrides.php, T292552: Rename articles and users to update our case mapping to PHP 7.4 and Unicode 11 appears to contain the most recent prior art on this process.

Notably, that wasn't just cleaning up after the 7.2 -> 7.4 transition: it was also the point at which we switched from mb_strtoupper to mb_convert_case with MB_CASE_TITLE - i.e., the renames took care of both transitions at once.

After spending some time reading through T292552 and the code in uppercaseTitlesForUnicodeTransition.php [0], I think I better understand the process here.

One important point, which I need to confirm, is that the --charmap option passed to the script "reverses" what we computed to preserve 7.4 - 8.1 title-case consistency in T372603 - i.e., what we want is a mapping from current 7.4-flavored state to desired 8.1-flavored state.

This is equivalent to re-computing the mapping with generateUcfirstOverrides.php, but with the --override and --with options reversed (i.e., override 7.4 with 8.1, not vice versa), producing something like P76371.

@tstarling - Since you did this most recently as part of T292552, could you confirm that I've got that right?

If that sounds correct, I can begin the prep work of identifying page titles and users that will need renamed.

[0] https://gerrit.wikimedia.org/r/plugins/gitiles/mediawiki/core/+/refs/heads/master/maintenance/uppercaseTitlesForUnicodeTransition.php

After spending some time reading through T292552 and the code in uppercaseTitlesForUnicodeTransition.php [0], I think I better understand the process here.

One important point, which I need to confirm, is that the --charmap option passed to the script "reverses" what we computed to preserve 7.4 - 8.1 title-case consistency in T372603 - i.e., what we want is a mapping from current 7.4-flavored state to desired 8.1-flavored state.

This is equivalent to re-computing the mapping with generateUcfirstOverrides.php, but with the --override and --with options reversed (i.e., override 7.4 with 8.1, not vice versa), producing something like P76371.

@tstarling - Since you did this most recently as part of T292552, could you confirm that I've got that right?

Yes, all correct.

One surprise I had last time was that a user started reverting the work of the script, recreating the invalid titles. I did the next step, deploying the new UcfirstOverrides.php, within 3 hours or so, but that was long enough for some pages to be recreated. The override list is shorter this time so hopefully it won't be a problem. There will be fewer affected pages. And that user hopefully knows not to do that this time. Let's just say that it's important that the UcfirstOverrides.php deployment be done promptly.

Thank you very much for confirming, Tim, and for noting the fact that the transitional overrides need removed promptly once we're done. I'll report back here once I have stats on the numbers of affected pages and users.

Change #1152295 had a related patch set uploaded (by Scott French; author: Scott French):

[operations/mediawiki-config@master] Remove title-case overrides for PHP 8.1 migration

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

Alright, I was able to run uppercaseTitlesForUnicodeTransition.php across all wikis in the default dry-run mode today.

In summary, there would be 72 renames (45 with deletion of then-superseded redirects) in the page or image tables and 68 updates to the logging or archive tables, across 16 wikis (listed below). No users would be renamed. Full results, minus foreachwiki chatter and progress logging emitted by the script, appear in P76967.

@tstarling - Going by T292552, it looks like the next step is to publish the proposed page renames on meta for feedback (e.g., https://meta.wikimedia.org/wiki/Unicode_11_case_map_migration). Is that correct, or is there an additional triage step first?

Affected wikis
bnwiki
commonswiki
cswiki
dewiki
enwiki
eswiki
frwiki
huwiki
jawiki
kowiki
plwiki
ruwiki
thwiki
ukwiki
zh_min_nanwiki
zhwiki

Alright, I was able to run uppercaseTitlesForUnicodeTransition.php across all wikis in the default dry-run mode today.

In summary, there would be 72 renames (45 with deletion of then-superseded redirects) in the page or image tables and 68 updates to the logging or archive tables, across 16 wikis (listed below). No users would be renamed. Full results, minus foreachwiki chatter and progress logging emitted by the script, appear in P76967.

Looks good to me. I tested the script locally with an image move to confirm that it still works.

@tstarling - Going by T292552, it looks like the next step is to publish the proposed page renames on meta for feedback (e.g., https://meta.wikimedia.org/wiki/Unicode_11_case_map_migration). Is that correct, or is there an additional triage step first?

I'm not going to prescribe the exact way to do communications. Whatever works. Last time, I posted to Wikimedia Forum on meta and the separate page was linked from that post. But only @Pppery replied, and if you just want to talk to that one user, maybe it's easier to ping them on Phabricator. There's also Tech News if you don't mind waiting for the weekly cycle.

I don't think we need community feedback on the actual case map, this time around. Users just need to clean up any remaining "technical rename" pages after the script runs.

Scanning the paste:

commonswiki Would rename Category:ʂ → Category:Ʂ (technical rename)

can just be deleted - both are soft redirects to the same place.

There were two instances on enwiki of a page that would have survived at a technical rename case, which in both cases I fixed by editing the lowercase to be in compliance with the uppercase (one was outright vandalism from 2024 that wasn't detected, the other the uppercase target seemed uncontroversially better). So it seems safe to proceed here.

@tstarling - Thanks for reviewing the proposed renames and for confirming the mutating mode of the script still works as expected. I realize it has been a few years since it was last used, so that was definitely a concern.

Also thanks for the tips around comms. It sounds like there's not a "standard" process for this. Given the limited number of renames and the review that you and @Pppery have already provided here, I'll probably opt for a light approach mainly focused on awareness of the upcoming renames, where:

  • An authoritative list of table and image rename actions is posted directly in a phabricator task (likely this task, but possibly a child that's specifically focused in the renames).
  • A reference to it is included in either a Tech News or Wikimedia Forum post (venue TBD).

In any case, I'll finalize this early next week.

@Pppery - Thanks for reviewing as well and for proactively cleaning up those two instances on enwiki. Also, duly noted about the duplicate soft redirects to Category:Ʂ/ʂ_(letter) - thanks for catching that.

A couple of updates:

Comms: Discussion is ongoing with MoveComms about including a "heads-up" for the coming renames in the next Tech News issue (referencing T396903).

Deployment: After discussion with @tstarling yesterday around the anticipated behavior between when renames occur and when https://gerrit.wikimedia.org/r/1152295 is deployed, I wanted to follow up on options for narrowing that window.

My understanding is that, during that window, no page will exist at the old-title-case name (and no MediaWiki redirect to the new-title-case page left in its place), but a request for that page will not yet be canonicalized and redirected to the new-title-case name (since the overrides have not yet been removed). As a result, existing links to the old-title-case name may appear temporarily broken, and there's a risk that users may attempt to re-create them.

Looking at the timings for uppercaseTitlesForUnicodeTransition.php in dry-run mode over all wikis:

  • A full sequential (foreachwiki) run takes a bit more than 40 minutes.
  • Of that, a sizable majority is spent processing the hundreds of wikis in s3, of which only two (bnwiki, zh_min_nanwiki) contain pages to rename.
  • Processing a single wiki (even a large one) only takes a couple of seconds, although these will become a bit slower if actually performing writes.

Given that, we may want to consider something like the following:

  1. Run uppercaseTitlesForUnicodeTransition.php in dry-run mode one last time to confirm the final list of wikis requiring renames.
  2. Immediately after, run the script over all ~ 15 wikis where this is relevant.
  3. Deploy the cleanup https://gerrit.wikimedia.org/r/1152295.

This would narrow the awkward window from nearly an hour to a couple of minutes. The downside is that it does slightly increase the window where a new page requiring a rename might be introduced in a previously "clean" wiki and thus missed, but not significantly.

Edit: In a follow-on discussion yesterday, Tim made the neat observation that one could invert the order (i.e., deploy then run script), so that there's no problematic window where the old-title-case names could be recreated. If I understand correctly, the tradeoff there is that there exists a window where names now canonicalize to new-title-case before the pages move there (i.e., temporarily point to nothing)

This is achievable if one is able to run the script in an environment where https://gerrit.wikimedia.org/r/1152295 has not yet been applied, even though it has been deployed to MediaWiki in general. Tim pointed out that this could be done by creating a mwscript-k8s session before the deployment, and using that container to execute the script.

More generally, mwscript-k8s supports a --mediawiki_image flag to use a specific image rather than the latest deployed one. This offers us an escape hatch to run script in a pre-deployment state - for either inverting deployment order or stepping backward to clean up a rename that somehow sneaks through in the normal deployment order (e.g., old-title-case name that was created after the script run).

I was doing the final prep for actually running the renames this morning, and it seems there was a user created on idwiktionary 3 days ago would now be renamed. I need to sort out how / whether to communicate with this user before proceeding.

Pending renames:

idwiktionary       44617   Ʂąkurątąmiʂimąʂɛ
loginwiki     91071460        Ʂąkurątąmiʂimąʂɛ
metawiki       43988951        Ʂąkurątąmiʂimąʂɛ

If you happen to have recommendations @tstarling, that would be greatly appreciated. In particular:

  • In T292552, it looks like you notified users via their talk page a week ahead of time. However, I am not sure (1) on which wiki or (2) whether it actually makes sense to give significant advance notice here for a brand-new account (i.e., pushing the renames out even more, at risk of accumulating yet more things to rename).
  • I see the issues you ran into with renameInvalidUsernames.php attempting (duplicate) global renames for each local rename. If I understand correctly, it sounds like I should be able to collapse this down to just the idwiktionary rename as input to the script, which will in turn trigger global renames that take care of everything. Is that correct?

I would like to point out, that we added the file table to the script in https://gerrit.wikimedia.org/r/c/mediawiki/core/+/1164665.

Ah, thanks for highlighting that, @Zabe! It looks like that was merged yesterday, so if it's critical, we'll need to make sure it gets picked up before we re-run the script. Given the current status of the schema migration, do you know whether we expect content to exist in that table that requires renames?

Ah, thanks for highlighting that, @Zabe! It looks like that was merged yesterday, so if it's critical, we'll need to make sure it gets picked up before we re-run the script. Given the current status of the schema migration, do you know whether we expect content to exist in that table that requires renames?

@Ladsgroup is running the migration script (T385167), but according to that task the table is already populated with the respective content. So I think the patch should be picked up before your re-run.

The data has been migrated and I even ran a check between old and new schema too, the main reason we haven't closed that ticket is that it seems we actually migrated too much. There are around 100 rows in the file table that shouldn't be there 🤦

I was doing the final prep for actually running the renames this morning, and it seems there was a user created on idwiktionary 3 days ago would now be renamed. I need to sort out how / whether to communicate with this user before proceeding.

Pending renames:

idwiktionary       44617   Ʂąkurątąmiʂimąʂɛ
loginwiki     91071460        Ʂąkurątąmiʂimąʂɛ
metawiki       43988951        Ʂąkurątąmiʂimąʂɛ

If you happen to have recommendations @tstarling, that would be greatly appreciated. In particular:

  • In T292552, it looks like you notified users via their talk page a week ahead of time. However, I am not sure (1) on which wiki or (2) whether it actually makes sense to give significant advance notice here for a brand-new account (i.e., pushing the renames out even more, at risk of accumulating yet more things to rename).

You can email them using this link, before or after you do the rename. A lot of users don't have email addresses, which makes notifications awkward, but this user does have a confirmed email address.

  • I see the issues you ran into with renameInvalidUsernames.php attempting (duplicate) global renames for each local rename. If I understand correctly, it sounds like I should be able to collapse this down to just the idwiktionary rename as input to the script, which will in turn trigger global renames that take care of everything. Is that correct?

Yes, renameInvalidUsernames.php does a global rename, so you only need to give it the one name/wiki combination. Alternatively I (or a steward or anyone with staff rights) can just do the rename with the UI.

@Ladsgroup and @Zabe - Thank you both. It sounds like I do indeed need to pick up the change to support file renames. While I can do an initial test run with a local copy of the uppercaseTitlesForUnicodeTransition.php, I can't use that strategy with mwscript-k8s more generally, so I may need to backport https://gerrit.wikimedia.org/r/1164665 depending on timing.

@Ladsgroup - Just to confirm, if I proceed with the renames early this week, does that complicate your cleanup effort for the incorrectly migrated rows?

@tstarling - Perfect, thank you very much for the pointer to the email feature (done) and for confirming how the user renames should work.

Follow-ups:

comms: I've reached out to the user via Special:EmailUser with a heads-up about the upcoming rename.

file table: Thanks to @tstarling, r/1164665 was backported to 1.45.0-wmf.7 and I was able to run the script over all wikis once more in dry-run mode. The results are what I might naively expect: they exactly match the three pending renames in the image table:

tablewikinotesaction
imagecommonswikiWould rename File:ʂħaːnta.ogg → File:Ʂħaːnta.ogg
imagecommonswikiWould rename File:ʂħaːnʁʷətʂa.ogg → File:Ʂħaːnʁʷətʂa.ogg
imagecommonswikiWould rename File:ʂʅ in Bernhard Karlgren, Études sur la phonologie chinoise, 1915-1926, page 863.png → File:Ʂʅ in Bernhard Karlgren, Études sur la phonologie chinoise, 1915-1926, page 863.png
filecommonswikiWould rename File:ʂħaːnta.ogg → File:Ʂħaːnta.ogg
filecommonswikiWould rename File:ʂħaːnʁʷətʂa.ogg → File:Ʂħaːnʁʷətʂa.ogg
filecommonswikiWould rename File:ʂʅ in Bernhard Karlgren, Études sur la phonologie chinoise, 1915-1926, page 863.png → File:Ʂʅ in Bernhard Karlgren, Études sur la phonologie chinoise, 1915-1926, page 863.png

@Ladsgroup - If you could confirm that these renames will not complicate your cleanup of incorrectly migrated rows, that would be greatly appreciated.

Hi, that looks correct to me. Thanks!

Change #1152295 merged by jenkins-bot:

[operations/mediawiki-config@master] Remove title-case overrides for PHP 8.1 migration

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

Mentioned in SAL (#wikimedia-operations) [2025-07-01T16:04:04Z] <swfrench@deploy1003> Started scap sync-world: Backport for [[gerrit:1152295|Remove title-case overrides for PHP 8.1 migration (T394556)]]

Mentioned in SAL (#wikimedia-operations) [2025-07-01T16:06:12Z] <swfrench@deploy1003> swfrench: Backport for [[gerrit:1152295|Remove title-case overrides for PHP 8.1 migration (T394556)]] synced to the testservers (see https://wikitech.wikimedia.org/wiki/Mwdebug). Changes can now be verified there.

Mentioned in SAL (#wikimedia-operations) [2025-07-01T16:13:25Z] <swfrench@deploy1003> Finished scap sync-world: Backport for [[gerrit:1152295|Remove title-case overrides for PHP 8.1 migration (T394556)]] (duration: 09m 21s)

Alright, all renames should be complete and the title-case mappings have been reverted to just the static override for Eszett. During the deployment, I spot-checked a number of previously overridden characters now canonicalize to their proper title-case equivalents.

I am running the uppercaseTitlesForUnicodeTransition.php script one more time in dry-run mode with the mediawiki image just prior to my deployment, to confirm nothing sneaked through.

Alright, one straggler I missed before on thwiki:

Processing table `page`...
Move ʂ → Ʂ failed:
Error: This action has been automatically identified as harmful, and therefore disallowed.
If you believe your action was constructive, please inform an administrator of what you were trying to do.
A brief description of the abuse rule which your action matched is: ผู้ใช้ที่มีการแก้ไขน้อยไม่ควรย้ายหน้า
Renamed ʂ → Ʂ
... page: 1 renames, 0 errors at {"page_namespace":"0","page_title":"ʂ","page_id":"1433811"}

The message translates to roughly "Users with low edits should not move pages". I am surprised that this AbuseFilter rule would have applied to the maintenance script user.

What I missed here is that while the script output suggested it had actually completed successfully (e.g., reporting zero errors), it did not. Naively, there seems to be a missing return false; in the error handling branch for the $movePage->move call.

In any case, we will need assistance from someone to actually perform the rename here. What I'm not sure is whether that will be possible from the UI without also temporarily reverting to the ʂ -> ʂ override (which we could temporarily do on mw-experimental or similar).

@tstarling - It would be great to get your thoughts on how to proceed here.

Edit: I've confirmed that temporarily reintroducing the 'ʂ' => 'ʂ' override in mw-experimental allows access to the ʂ page again, which may(?) prove useful if we need to resort to Special:MovePage to work around this. Further, it seems ʂ on thwiki is actually a hard redirect to this page, rather than containing novel content.

Thank you very much, @tstarling. That final rename is now complete.

Change #1165621 had a related patch set uploaded (by Tim Starling; author: Tim Starling):

[mediawiki/core@master] uppercaseTitlesForUnicodeTransition: Add missing return

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

I re-enabled rule 155 but with a group check that allows bots.

I filed T398384 for the fact that AbuseFilter runs when MovePage::move() is called despite it being documented as ignoring permissions.

Change #1165624 had a related patch set uploaded (by Reedy; author: Tim Starling):

[mediawiki/core@REL1_43] uppercaseTitlesForUnicodeTransition: Add missing return

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

Change #1165626 had a related patch set uploaded (by Reedy; author: Tim Starling):

[mediawiki/core@REL1_44] uppercaseTitlesForUnicodeTransition: Add missing return

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

Change #1165621 merged by jenkins-bot:

[mediawiki/core@master] uppercaseTitlesForUnicodeTransition: Add missing return

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

Change #1165624 merged by jenkins-bot:

[mediawiki/core@REL1_43] uppercaseTitlesForUnicodeTransition: Add missing return

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

Change #1165626 merged by jenkins-bot:

[mediawiki/core@REL1_44] uppercaseTitlesForUnicodeTransition: Add missing return

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

My sincere thanks for all of your help here @tstarling.

With the error handling fix for uppercaseTitlesForUnicodeTransition.php merged and the process we used now retroactively documented in the task description, I believe that's everything explicitly tracked here.

Scott_French triaged this task as Medium priority.