Page MenuHomePhabricator

Don't trash cache for front-end resources
Closed, ResolvedPublic

Description

This scope of this tracking task is somewhat specific to Wikimedia, however the sub tasks that resolve this use case will benefit all MediaWiki installs.

When upgrading a wiki from one wmf-branch to the next, we currently invalidate almost all static caches for front-end resources.

  • Server-side HTTP response cache (Varnish).
  • Client-side HTTP response cache (Web browsers, proxies).
  • Client-side module storage (e.g. HTML5 Storage, see ResourceLoader#Client storage).

Source of invalidation:

  • Bad input for file module definition hashes:
    • T104950: File module versions bump due to increase of timestamps (new git clone)
    • Stylesheet content changes due to use of timestamps in CSSMin.
    • Inclusion of localBasePath (absolute path on-disk that contains the MediaWiki branch version).
    • Inclusion of remoteBasePath (absolute url that contains the MediaWiki branch version).
  • T99096: /static-{branch} urls to mount static files. The branch changes each deployment. Ironically, these are currently cached too long (T99096). We need to find a way to cache them even longer, and bypass it when they change.
  • LocalisationUpdate: Invalidates message cache every time and bumps the timestamp. Invalidates all modules with one or more messages.
  • ..

Example: Graph showing impact of deploying a new MediaWiki branch to Wikipedias on ResourceLoader caching of each week over the past month.

Screen Shot 2015-07-10 at 00.56.55.png (1×2 px, 587 KB)

Screen Shot 2015-08-04 at 22.51.22.png (1×2 px, 332 KB)

Screen Shot 2015-08-04 at 22.51.59.png (1×2 px, 339 KB)

Screen Shot 2015-08-04 at 22.52.12.png (1×2 px, 360 KB)

Related Objects

StatusSubtypeAssignedTask
ResolvedLegoktm
Resolved GWicke
Resolved mmodell
OpenNone
Resolved demon
Declined mmodell
Declined mmodell
Resolveddduvall
DeclinedNone
ResolvedKrinkle
ResolvedKrinkle
Resolved mmodell
DuplicateKrinkle
ResolvedKrinkle
ResolvedKrinkle
ResolvedPRODUCTION ERRORMaxSem
ResolvedKrinkle
ResolvedKrinkle
ResolvedKrinkle
ResolvedKrinkle
ResolvedKrinkle

Event Timeline

There are a very large number of changes, so older changes are hidden. Show Older Changes

While T104950 was resolved (in that it no longer uses timestamps) file modules still appear to roll over en-mass during a branch cut. Looking at the graphs we can clearly see the problem wasn't fixed. Just today another branch update metrics such as 304 Satisfaction drop to the floor:

Screen Shot 2015-08-21 at 00.35.06.png (460×1 px, 59 KB)

Change 232863 had a related patch set uploaded (by Krinkle):
resourceloader: Remove remoteBasePath from FileModule version hash

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

Change 232864 had a related patch set uploaded (by Krinkle):
resourceloader: Remove remoteBasePath from FileModule version hash

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

Change 232863 merged by jenkins-bot:
resourceloader: Remove remoteBasePath from FileModule version hash

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

Change 232864 merged by jenkins-bot:
resourceloader: Remove remoteBasePath from FileModule version hash

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

@Krinkle mentioned this in rMW6a78b4811df2: resourceloader: Remove remoteBasePath from FileModule version hash

That still didn't nail it. Still trashing versions of most file modules.

capture.png (438×1 px, 63 KB)

Here's the full diff of the startup module (I temporarily moved testwiki on mw1017 back to 1.26wmf19 to compare)

1--- wmf19 2015-08-28 16:22:35.000000000 0200
2 wmf20 2015-08-28 16:22:43.000000000 0200
3@@ -48,7 48,7 @@
4 "skip": null
5 },
6 "user.defaults": {
7- "version": "vGK7h45z",
8 "version": "Ytr0gF6M",
9 "dependencies": [],
10 "group": null,
11 "source": "local",
12@@ -108,7 108,7 @@
13 "skip": null
14 },
15 "mediawiki.skinning.content.parsoid": {
16- "version": "eqAznAKY",
17 "version": "f1Ifa cB",
18 "dependencies": [],
19 "group": null,
20 "source": "local",
21@@ -187,7 187,7 @@
22 "skip": null
23 },
24 "jquery.byteLimit": {
25- "version": "HjjZQUO9",
26 "version": "4MjI06A9",
27 "dependencies": [
28 "jquery.byteLength"
29 ],
30@@ -908,7 908,7 @@
31 "skip": null
32 },
33 "mediawiki.api": {
34- "version": "eYgwkLot",
35 "version": "Q2pzTF1T",
36 "dependencies": [
37 "mediawiki.util",
38 "user.tokens"
39@@ -930,7 930,7 @@
40 "skip": null
41 },
42 "mediawiki.api.edit": {
43- "version": "RhKPJ8Mw",
44 "version": "qTzpvKo5",
45 "dependencies": [
46 "mediawiki.Title",
47 "mediawiki.api"
48@@ -971,7 971,7 @@
49 "skip": null
50 },
51 "mediawiki.api.upload": {
52- "version": "/y6MVxAa",
53 "version": "/a3Uap/A",
54 "dependencies": [
55 "dom-level2-shim",
56 "json",
57@@ -1059,29 1059,8 @@
58 "state": "registered",
59 "skip": null
60 },
61- "mediawiki.ForeignApi": {
62- "version": "zUrK1Lxf",
63- "dependencies": [
64- "ext.centralauth.ForeignApi"
65- ],
66- "group": null,
67- "source": "local",
68- "state": "registered",
69- "skip": null
70- },
71- "mediawiki.ForeignApi.core": {
72- "version": "nScaXRoe",
73- "dependencies": [
74- "mediawiki.api",
75- "oojs"
76- ],
77- "group": null,
78- "source": "local",
79- "state": "registered",
80- "skip": null
81- },
82 "mediawiki.helplink": {
83- "version": "0NujFwLB",
84 "version": "Tan14ww/",
85 "dependencies": [],
86 "group": null,
87 "source": "local",
88@@ -1120,7 1099,7 @@
89 "skip": null
90 },
91 "mediawiki.htmlform.ooui.styles": {
92- "version": "Cd8nnzyC",
93 "version": "K1ahhrK3",
94 "dependencies": [],
95 "group": null,
96 "source": "local",
97@@ -1128,7 1107,7 @@
98 "skip": null
99 },
100 "mediawiki.icon": {
101- "version": "s/oPGnVU",
102 "version": "DvtgjFw ",
103 "dependencies": [],
104 "group": null,
105 "source": "local",
106@@ -1196,7 1175,7 @@
107 "skip": null
108 },
109 "mediawiki.pager.tablePager": {
110- "version": "HiPEI9vP",
111 "version": "eFsVZKaV",
112 "dependencies": [],
113 "group": null,
114 "source": "local",
115@@ -1244,7 1223,7 @@
116 "skip": null
117 },
118 "mediawiki.Upload": {
119- "version": "1hjxih5b",
120 "version": "IPlMpncG",
121 "dependencies": [
122 "mediawiki.api.upload"
123 ],
124@@ -1254,7 1233,7 @@
125 "skip": null
126 },
127 "mediawiki.Upload.Dialog": {
128- "version": "VShWTZ1K",
129 "version": "FCx9TBfx",
130 "dependencies": [
131 "mediawiki.Upload",
132 "oojs-ui"
133@@ -1329,7 1308,7 @@
134 "skip": null
135 },
136 "mediawiki.toolbar": {
137- "version": "kPSS2ByC",
138 "version": "3J5wFPLp",
139 "dependencies": [],
140 "group": null,
141 "source": "local",
142@@ -1430,7 1409,7 @@
143 "skip": null
144 },
145 "mediawiki.action.view.categoryPage.styles": {
146- "version": "le7BRlxr",
147 "version": "Nv JzYmy",
148 "dependencies": [],
149 "group": null,
150 "source": "local",
151@@ -1548,7 1527,7 @@
152 "skip": null
153 },
154 "mediawiki.language.names": {
155- "version": "Ur/sL4fv",
156 "version": "WEXz/OmL",
157 "dependencies": [
158 "mediawiki.language.init"
159 ],
160@@ -1798,7 1777,7 @@
161 "skip": null
162 },
163 "mediawiki.special.upload": {
164- "version": "B82bcw18",
165 "version": "50h6/ePZ",
166 "dependencies": [
167 "jquery.spinner",
168 "mediawiki.Title",
169@@ -1913,7 1892,7 @@
170 "skip": null
171 },
172 "mediawiki.legacy.shared": {
173- "version": "nkIU1fX5",
174 "version": "kq/RV0yW",
175 "dependencies": [],
176 "group": null,
177 "source": "local",
178@@ -1939,7 1918,7 @@
179 "skip": null
180 },
181 "mediawiki.ui": {
182- "version": "Qy4SA2Bl",
183 "version": "ml73nOHR",
184 "dependencies": [],
185 "group": null,
186 "source": "local",
187@@ -1947,7 1926,7 @@
188 "skip": null
189 },
190 "mediawiki.ui.checkbox": {
191- "version": "ZLrGpPz4",
192 "version": "vFIX2Ma ",
193 "dependencies": [],
194 "group": null,
195 "source": "local",
196@@ -1955,7 1934,7 @@
197 "skip": null
198 },
199 "mediawiki.ui.radio": {
200- "version": "ljPhKmHi",
201 "version": "efr5neyC",
202 "dependencies": [],
203 "group": null,
204 "source": "local",
205@@ -1963,7 1942,7 @@
206 "skip": null
207 },
208 "mediawiki.ui.anchor": {
209- "version": "QCvHTlf0",
210 "version": "7i0kbki7",
211 "dependencies": [],
212 "group": null,
213 "source": "local",
214@@ -1971,7 1950,7 @@
215 "skip": null
216 },
217 "mediawiki.ui.button": {
218- "version": "4ImZqfdE",
219 "version": "Z 0EoVHD",
220 "dependencies": [],
221 "group": null,
222 "source": "local",
223@@ -1979,7 1958,7 @@
224 "skip": null
225 },
226 "mediawiki.ui.input": {
227- "version": "KzrEsS2H",
228 "version": "MZ5vjW6J",
229 "dependencies": [],
230 "group": null,
231 "source": "local",
232@@ -1987,7 1966,7 @@
233 "skip": null
234 },
235 "mediawiki.ui.icon": {
236- "version": "r3CDT5zw",
237 "version": "E2I7bQyF",
238 "dependencies": [],
239 "group": null,
240 "source": "local",
241@@ -1995,7 1974,7 @@
242 "skip": null
243 },
244 "mediawiki.ui.text": {
245- "version": "F3wgZdHs",
246 "version": "KKjdu2QV",
247 "dependencies": [],
248 "group": null,
249 "source": "local",
250@@ -2003,10 1982,9 @@
251 "skip": null
252 },
253 "mediawiki.widgets": {
254- "version": "R6thkI D",
255 "version": "s10IBlIk",
256 "dependencies": [
257 "jquery.autoEllipsis",
258- "jquery.byteLimit",
259 "mediawiki.Title",
260 "mediawiki.api",
261 "mediawiki.widgets.styles",
262@@ -2019,7 1997,7 @@
263 "skip": null
264 },
265 "mediawiki.widgets.styles": {
266- "version": "o5Djg6Wl",
267 "version": "oqrOlpHu",
268 "dependencies": [],
269 "group": null,
270 "source": "local",
271@@ -2054,7 2032,7 @@
272 "skip": null
273 },
274 "oojs-ui": {
275- "version": "DURYZDJ9",
276 "version": "LjDYG rP",
277 "dependencies": [
278 "oojs",
279 "oojs-ui.styles",
280@@ -2068,7 2046,7 @@
281 "skip": null
282 },
283 "oojs-ui.styles": {
284- "version": "ueasBEPi",
285 "version": "WBxW9Ob9",
286 "dependencies": [],
287 "group": null,
288 "source": "local",
289@@ -2076,7 2054,7 @@
290 "skip": null
291 },
292 "oojs-ui.styles.icons": {
293- "version": "KvjyaNS/",
294 "version": "oa8sxSxB",
295 "dependencies": [],
296 "group": null,
297 "source": "local",
298@@ -2084,7 2062,7 @@
299 "skip": null
300 },
301 "oojs-ui.styles.indicators": {
302- "version": "X5eCmMFo",
303 "version": "g2gMsr5I",
304 "dependencies": [],
305 "group": null,
306 "source": "local",
307@@ -2092,7 2070,7 @@
308 "skip": null
309 },
310 "oojs-ui.styles.textures": {
311- "version": "kN/50hih",
312 "version": "q4LKSS42",
313 "dependencies": [],
314 "group": null,
315 "source": "local",
316@@ -2100,7 2078,7 @@
317 "skip": null
318 },
319 "oojs-ui.styles.icons-accessibility": {
320- "version": "Zz9FH/3r",
321 "version": "K5uA8AAE",
322 "dependencies": [],
323 "group": null,
324 "source": "local",
325@@ -2108,7 2086,7 @@
326 "skip": null
327 },
328 "oojs-ui.styles.icons-alerts": {
329- "version": "SmPEGKes",
330 "version": "5McWTTf7",
331 "dependencies": [],
332 "group": null,
333 "source": "local",
334@@ -2116,7 2094,7 @@
335 "skip": null
336 },
337 "oojs-ui.styles.icons-content": {
338- "version": "7HETqxbE",
339 "version": "wCQcfZPV",
340 "dependencies": [],
341 "group": null,
342 "source": "local",
343@@ -2124,7 2102,7 @@
344 "skip": null
345 },
346 "oojs-ui.styles.icons-editing-advanced": {
347- "version": "tMMJm2M0",
348 "version": "U5bZs5a4",
349 "dependencies": [],
350 "group": null,
351 "source": "local",
352@@ -2132,7 2110,7 @@
353 "skip": null
354 },
355 "oojs-ui.styles.icons-editing-core": {
356- "version": "EgF55Ojq",
357 "version": "sWQxNFDF",
358 "dependencies": [],
359 "group": null,
360 "source": "local",
361@@ -2140,7 2118,7 @@
362 "skip": null
363 },
364 "oojs-ui.styles.icons-editing-list": {
365- "version": "Qdv8KktO",
366 "version": "wKkSSMxi",
367 "dependencies": [],
368 "group": null,
369 "source": "local",
370@@ -2148,7 2126,7 @@
371 "skip": null
372 },
373 "oojs-ui.styles.icons-editing-styling": {
374- "version": "hWxRFhL ",
375 "version": "aOb6q7hx",
376 "dependencies": [],
377 "group": null,
378 "source": "local",
379@@ -2156,7 2134,7 @@
380 "skip": null
381 },
382 "oojs-ui.styles.icons-interactions": {
383- "version": "ktL0dj5d",
384 "version": "WCxMJ6pS",
385 "dependencies": [],
386 "group": null,
387 "source": "local",
388@@ -2164,7 2142,7 @@
389 "skip": null
390 },
391 "oojs-ui.styles.icons-layout": {
392- "version": "RcyDmEyE",
393 "version": "oX1 aBoE",
394 "dependencies": [],
395 "group": null,
396 "source": "local",
397@@ -2172,7 2150,7 @@
398 "skip": null
399 },
400 "oojs-ui.styles.icons-location": {
401- "version": "WytJIXGC",
402 "version": "n0qqbhBG",
403 "dependencies": [],
404 "group": null,
405 "source": "local",
406@@ -2180,7 2158,7 @@
407 "skip": null
408 },
409 "oojs-ui.styles.icons-media": {
410- "version": "o8U0f41P",
411 "version": "IOCR/cJM",
412 "dependencies": [],
413 "group": null,
414 "source": "local",
415@@ -2188,7 2166,7 @@
416 "skip": null
417 },
418 "oojs-ui.styles.icons-moderation": {
419- "version": "/uIVz vK",
420 "version": "3 3Pyha2",
421 "dependencies": [],
422 "group": null,
423 "source": "local",
424@@ -2196,7 2174,7 @@
425 "skip": null
426 },
427 "oojs-ui.styles.icons-movement": {
428- "version": "FyiuTXdw",
429 "version": "libYDHhL",
430 "dependencies": [],
431 "group": null,
432 "source": "local",
433@@ -2204,7 2182,7 @@
434 "skip": null
435 },
436 "oojs-ui.styles.icons-user": {
437- "version": "Xrfy Qi/",
438 "version": "0WrV7g6Q",
439 "dependencies": [],
440 "group": null,
441 "source": "local",
442@@ -2212,7 2190,7 @@
443 "skip": null
444 },
445 "oojs-ui.styles.icons-wikimedia": {
446- "version": "3jw8eqit",
447 "version": "09WhNaWW",
448 "dependencies": [],
449 "group": null,
450 "source": "local",
451@@ -2375,7 2353,7 @@
452 "skip": null
453 },
454 "mw.MediaPlayer": {
455- "version": "lG St5Bm",
456 "version": "HsEI65Je",
457 "dependencies": [],
458 "group": null,
459 "source": "local",
460@@ -2383,7 2361,7 @@
461 "skip": null
462 },
463 "mw.MediaPlayers": {
464- "version": "Y4dXmpS3",
465 "version": "BZXi5ssP",
466 "dependencies": [
467 "mw.MediaPlayer"
468 ],
469@@ -2401,7 2379,7 @@
470 "skip": null
471 },
472 "mw.EmbedTypes": {
473- "version": "3US3P1r2",
474 "version": "8xHTR ji",
475 "dependencies": [
476 "mediawiki.Uri",
477 "mw.MediaPlayers"
478@@ -2412,7 2390,7 @@
479 "skip": null
480 },
481 "mw.EmbedPlayer": {
482- "version": "OHeTakOt",
483 "version": "nR3Hs2bX",
484 "dependencies": [
485 "fullScreenApi",
486 "jquery.cookie",
487@@ -2452,6 2430,14 @@
488 "state": "registered",
489 "skip": null
490 },
491 "mw.EmbedPlayerJava": {
492 "version": "R9yCHHIc",
493 "dependencies": [],
494 "group": null,
495 "source": "local",
496 "state": "registered",
497 "skip": null
498 },
499 "mw.EmbedPlayerNative": {
500 "version": "EiUWN945",
501 "dependencies": [],
502@@ -2559,7 2545,7 @@
503 "skip": null
504 },
505 "ext.uploadWizard": {
506- "version": "PnuS DqL",
507 "version": "AYVakU5s",
508 "dependencies": [
509 "ext.uploadWizard.apiUploadFormDataHandler",
510 "ext.uploadWizard.apiUploadHandler",
511@@ -2749,7 2735,7 @@
512 "skip": null
513 },
514 "uw.ui.Thanks": {
515- "version": "fe0YqcSw",
516 "version": "3d2ZdZvQ",
517 "dependencies": [
518 "uw.ui.Step"
519 ],
520@@ -2830,7 2816,7 @@
521 "skip": null
522 },
523 "ext.echo.base": {
524- "version": "Yia1OJha",
525 "version": "AXl0fib2",
526 "dependencies": [
527 "schema.EchoInteraction"
528 ],
529@@ -3602,7 3588,7 @@
530 "skip": null
531 },
532 "ext.popups": {
533- "version": "v9QJLqYb",
534 "version": "cRU/vcwl",
535 "dependencies": [
536 "jquery.jStorage",
537 "mediawiki.Title",
538@@ -3618,7 3604,7 @@
539 "skip": null
540 },
541 "ext.visualEditor.mwreference": {
542- "version": "mO54AN8c",
543 "version": "b3/ d/5c",
544 "dependencies": [
545 "ext.cite.style",
546 "ext.visualEditor.mediawiki",
547@@ -3631,7 3617,7 @@
548 "skip": null
549 },
550 "ext.graph.visualEditor": {
551- "version": "ixGkrBaN",
552 "version": "/WXGoemL",
553 "dependencies": [
554 "ext.graph",
555 "ext.visualEditor.mwcore"
556@@ -3669,7 3655,7 @@
557 "skip": null
558 },
559 "skins.monobook.styles": {
560- "version": "1UiKe1t8",
561 "version": "dCEmnc8z",
562 "dependencies": [],
563 "group": null,
564 "source": "local",
565@@ -3733,7 3719,7 @@
566 "skip": null
567 },
568 "ext.inputBox": {
569- "version": "5Iv3S Ey",
570 "version": "g9N MON7",
571 "dependencies": [
572 "jquery.throttle-debounce"
573 ],
574@@ -3743,7 3729,7 @@
575 "skip": null
576 },
577 "ext.pygments": {
578- "version": "Ll4WvzLi",
579 "version": "E5KDkooT",
580 "dependencies": [],
581 "group": null,
582 "source": "local",
583@@ -3798,7 3784,7 @@
584 "skip": null
585 },
586 "jquery.wikiEditor": {
587- "version": "LeuKRvbP",
588 "version": "a BP/AMc",
589 "dependencies": [
590 "jquery.textSelection",
591 "mediawiki.language"
592@@ -3809,7 3795,7 @@
593 "skip": null
863 },
595 "jquery.wikiEditor.dialogs": {
596- "version": "10uicCUn",
597 "version": "L8MvQHYM",
598 "dependencies": [
599 "jquery.tabIndex",
600 "jquery.ui.dialog",
601@@ -3821,7 3807,7 @@
602 "skip": null
603 },
604 "jquery.wikiEditor.dialogs.config": {
605- "version": "7t3sCSBj",
606 "version": "H6S5j7VM",
607 "dependencies": [
608 "jquery.suggestions",
609 "jquery.wikiEditor.dialogs",
610@@ -3857,7 3843,7 @@
611 "skip": null
612 },
613 "jquery.wikiEditor.toolbar": {
614- "version": "QNKnhqTY",
615 "version": "83xmS 3b",
616 "dependencies": [
617 "jquery.async",
618 "jquery.cookie",
619@@ -3889,7 3875,7 @@
620 "skip": null
621 },
622 "ext.wikiEditor": {
623- "version": "WxvX3TP1",
624 "version": "KVpMxUhw",
625 "dependencies": [
626 "jquery.wikiEditor",
627 "mediawiki.user"
628@@ -3944,7 3930,7 @@
629 "skip": null
630 },
631 "ext.wikiEditor.toolbar.styles": {
632- "version": " d4909RS",
633 "version": "2bBCnf8z",
634 "dependencies": [],
635 "group": "ext.wikiEditor",
636 "source": "local",
637@@ -4056,7 4042,7 @@
638 "skip": null
639 },
640 "ext.betaFeatures": {
641- "version": "5RNnL0iw",
642 "version": "Fd2oe3kJ",
643 "dependencies": [
644 "jquery.client"
645 ],
646@@ -4066,7 4052,7 @@
647 "skip": null
648 },
649 "ext.betaFeatures.styles": {
650- "version": "qBW7oXJe",
651 "version": "19Vp507D",
652 "dependencies": [],
653 "group": null,
654 "source": "local",
655@@ -4074,7 4060,7 @@
656 "skip": null
657 },
658 "ext.betaFeatures.popup": {
659- "version": "L8rCo/Kh",
660 "version": "vBfwA/Nn",
661 "dependencies": [
662 "jquery.tipsy"
663 ],
664@@ -4146,7 4132,7 @@
665 "skip": null
666 },
667 "ext.visualEditor.desktopArticleTarget.init": {
668- "version": "8wYW9J9x",
669 "version": "i/Y2RWOc",
670 "dependencies": [
671 "ext.visualEditor.track",
672 "mediawiki.Title",
673@@ -4168,7 4154,7 @@
674 "skip": null
675 },
676 "ext.visualEditor.targetLoader": {
677- "version": "GtmWxUH/",
678 "version": "ErPGdAXP",
679 "dependencies": [
680 "ext.visualEditor.track",
681 "mediawiki.api"
682@@ -4179,7 4165,7 @@
683 "skip": null
684 },
685 "ext.visualEditor.desktopArticleTarget": {
686- "version": "BxkHnUVN",
687 "version": "HJjGjDSC",
688 "dependencies": [
689 "ext.visualEditor.core.desktop",
690 "ext.visualEditor.mediawiki",
691@@ -4191,7 4177,7 @@
692 "skip": null
693 },
694 "ext.visualEditor.ve": {
695- "version": "yBY/nZGh",
696 "version": "5Fy21tDd",
697 "dependencies": [],
698 "group": null,
699 "source": "local",
700@@ -4209,7 4195,7 @@
701 "skip": null
702 },
703 "ext.visualEditor.base": {
704- "version": "bSxIb9Ri",
705 "version": "UZZLoEMT",
706 "dependencies": [
707 "ext.visualEditor.ve",
708 "oojs-ui",
709@@ -4221,7 4207,7 @@
710 "skip": null
711 },
712 "ext.visualEditor.mediawiki": {
713- "version": "6sGRAo0 ",
714 "version": "2Xx5I6sj",
715 "dependencies": [
716 "ext.visualEditor.base",
717 "ext.visualEditor.targetLoader",
718@@ -4238,7 4224,7 @@
719 "skip": null
720 },
721 "ext.visualEditor.standalone": {
722- "version": " RMVXeAH",
723 "version": "rawjr4ZX",
724 "dependencies": [
725 "ext.visualEditor.base",
726 "jquery.i18n",
727@@ -4250,7 4236,7 @@
728 "skip": null
729 },
730 "ext.visualEditor.data": {
731- "version": "t5/DZYC7",
732 "version": "tVt b6W/",
733 "dependencies": [
734 "ext.visualEditor.mediawiki"
735 ],
736@@ -4260,7 4246,7 @@
737 "skip": null
738 },
739 "ext.visualEditor.core": {
740- "version": "kBnWz/ /",
741 "version": "/PQlcIIo",
742 "dependencies": [
743 "ext.visualEditor.base",
744 "jquery.client",
745@@ -4273,7 4259,7 @@
746 "skip": null
747 },
748 "ext.visualEditor.core.desktop": {
749- "version": "/uqyreIW",
750 "version": "ZJOnyK2H",
751 "dependencies": [
752 "ext.visualEditor.core"
753 ],
754@@ -4283,9 4269,10 @@
755 "skip": null
756 },
757 "ext.visualEditor.mwcore": {
758- "version": "gts5pb94",
759 "version": "FVCVgvFe",
760 "dependencies": [
761 "ext.visualEditor.core",
762 "jquery.byteLimit",
763 "mediawiki.action.history.diff",
764 "mediawiki.jqueryMsg",
765 "mediawiki.language.specialCharacters",
766@@ -4299,7 4286,7 @@
767 "skip": null
768 },
769 "ext.visualEditor.mwformatting": {
770- "version": "1ztwn6ZV",
771 "version": "wucg2CFw",
772 "dependencies": [
773 "ext.visualEditor.mwcore"
774 ],
775@@ -4309,7 4296,7 @@
776 "skip": null
777 },
778 "ext.visualEditor.mwimage.core": {
779- "version": "p6N1Z2rR",
780 "version": "d396wACz",
781 "dependencies": [
782 "ext.visualEditor.mwcore"
783 ],
784@@ -4319,7 4306,7 @@
785 "skip": null
786 },
787 "ext.visualEditor.mwimage": {
788- "version": "6xxEsySI",
789 "version": "bRBiIMLX",
790 "dependencies": [
791 "ext.visualEditor.mwimage.core"
792 ],
793@@ -4329,7 4316,7 @@
794 "skip": null
795 },
796 "ext.visualEditor.mwlink": {
797- "version": "LBu4jdeD",
798 "version": "/VgQlUmG",
799 "dependencies": [
800 "ext.visualEditor.mwcore"
801 ],
802@@ -4339,7 4326,7 @@
803 "skip": null
804 },
805 "ext.visualEditor.mwmeta": {
806- "version": "S QyDks0",
807 "version": "x7w5QlxL",
808 "dependencies": [
809 "ext.visualEditor.mwlink",
810 "jquery.uls.data"
811@@ -4350,7 4337,7 @@
812 "skip": null
813 },
814 "ext.visualEditor.mwreference.core": {
815- "version": "16dQHWcT",
816 "version": "C2IJVd3E",
817 "dependencies": [
818 "ext.visualEditor.mwcore"
819 ],
820@@ -4360,7 4347,7 @@
821 "skip": null
822 },
823 "ext.visualEditor.mwtransclusion.core": {
824- "version": "YOoaQYtn",
825 "version": "K19gu2dW",
826 "dependencies": [
827 "ext.visualEditor.mwcore"
828 ],
829@@ -4370,7 4357,7 @@
830 "skip": null
831 },
832 "ext.visualEditor.mwtransclusion": {
833- "version": "QwIbM7PV",
834 "version": "RyWA07fx",
835 "dependencies": [
836 "ext.visualEditor.mwtransclusion.core"
837 ],
838@@ -4380,7 4367,7 @@
839 "skip": null
840 },
841 "ext.visualEditor.language": {
842- "version": "gtcaYw6U",
843 "version": "o1vs/qav",
844 "dependencies": [
845 "ext.visualEditor.core",
846 "mediawiki.language.names"
847@@ -4391,7 4378,7 @@
848 "skip": null
849 },
850 "ext.visualEditor.mwalienextension": {
851- "version": "JK4Xyv1a",
852 "version": "C8JwaSc5",
853 "dependencies": [
854 "ext.visualEditor.mwcore"
855 ],
856@@ -4401,7 4388,7 @@
857 "skip": null
858 },
859 "ext.visualEditor.mwgallery": {
860- "version": "xQtbglwi",
861 "version": "enyEAny8",
862 "dependencies": [
863 "ext.visualEditor.mwcore"
864 ],
865@@ -4456,7 4443,7 @@
866 "skip": null
867 },
868 "ext.citoid.visualEditor": {
869- "version": "0ZesPcki",
870 "version": "8UxcNCkl",
871 "dependencies": [
872 "ext.visualEditor.mwreference",
873 "mediawiki.api.options"
874@@ -4515,7 4502,7 @@
875 "skip": null
876 },
877 "ext.guidedTour.styles": {
878- "version": "1UZY/89d",
879 "version": "PBXBNi1I",
880 "dependencies": [
881 "mediawiki.libs.guiders",
882 "mediawiki.ui.button"
883@@ -4622,7 4609,7 @@
884 "skip": null
885 },
886 "ext.gather.menu.icon": {
887- "version": "qlMgyOvw",
888 "version": "iAmBIipM",
889 "dependencies": [],
890 "group": null,
891 "source": "local",
892@@ -4630,7 4617,7 @@
893 "skip": null
894 },
895 "ext.gather.icons": {
896- "version": "5i8zlxz0",
897 "version": "rokBR7x5",
898 "dependencies": [],
899 "group": null,
900 "source": "local",
901@@ -4646,7 4633,7 @@
902 "skip": null
903 },
904 "ext.gather.watchstar.icons": {
905- "version": "LKCk6cQ4",
906 "version": "IquVZPrl",
907 "dependencies": [],
908 "group": null,
909 "source": "local",
910@@ -4924,7 4911,7 @@
911 "skip": null
912 },
913 "ext.math.visualEditor": {
914- "version": "SmBOFuoH",
915 "version": "yvKqA2GU",
916 "dependencies": [
917 "ext.visualEditor.mwcore"
918 ],
919@@ -5020,7 5007,7 @@
920 "skip": null
921 },
922 "ext.uls.languagenames": {
923- "version": "Vg1 LvOM",
924 "version": "0prhPLzV",
925 "dependencies": [],
926 "group": null,
927 "source": "local",
928@@ -5028,7 5015,7 @@
929 "skip": null
930 },
931 "ext.uls.messages": {
932- "version": "wDtTsxTN",
933 "version": "4U5 Rec5",
934 "dependencies": [
935 "ext.uls.i18n"
936 ],
937@@ -5301,7 5288,7 @@
938 "skip": null
939 },
940 "ext.cx.contributions": {
941- "version": "zRiyiuLD",
942 "version": "EFki0t9W",
943 "dependencies": [
944 "mediawiki.ui.button",
945 "mediawiki.util"
946@@ -5330,7 5317,7 @@
947 "skip": null
948 },
949 "ext.cx.feedback": {
950- "version": "cUDpqVvz",
951 "version": "XVAurUu6",
952 "dependencies": [
953 "ext.cx.model"
954 ],
955@@ -5352,11 5339,10 @@
956 "skip": null
957 },
958 "ext.cx.dashboard": {
959- "version": "E/ttgy4O",
960 "version": "ANG9xbDQ",
961 "dependencies": [
962 "ext.cx.feedback",
963 "ext.cx.header",
964- "ext.cx.source.selector",
965 "ext.cx.translationlist"
966 ],
967 "group": null,
968@@ -5404,7 5390,7 @@
969 "skip": null
970 },
971 "ext.cx.header": {
972- "version": "BzDNBo7S",
973 "version": "GB44cU7k",
974 "dependencies": [
975 "mediawiki.Uri",
976 "mediawiki.jqueryMsg",
977@@ -5433,7 5419,7 @@
978 "skip": null
979 },
980 "ext.cx.source.selector": {
981- "version": "7kx3ysin",
982 "version": "Fv4adDma",
983 "dependencies": [
984 "ext.cx.pageselector",
985 "ext.cx.sitemapper",
986@@ -5450,7 5436,7 @@
987 "skip": null
988 },
989 "ext.cx.pageselector": {
990- "version": "L1kizZf7",
991 "version": "QhHqI 2k",
992 "dependencies": [
993 "mediawiki.api"
994 ],
995@@ -5648,7 5634,7 @@
996 "skip": null
997 },
998 "ext.cx.progressbar": {
999- "version": "Vq29eu/C",
1000 "version": "IwU Fj2i",
1001 "dependencies": [
1002 "mediawiki.jqueryMsg"
1003 ],
1004@@ -5670,7 5656,7 @@
1005 "skip": null
1006 },
1007 "ext.cx.publish": {
1008- "version": "oSjHuYzm",
1009 "version": "8DvEP XH",
1010 "dependencies": [
1011 "ext.cx.publish.dialog",
1012 "ext.cx.tours.publish.init",
1013@@ -5726,7 5712,7 @@
1014 "skip": null
1015 },
1016 "ext.cx.interlanguagelink": {
1017- "version": "UXPPDVOy",
1018 "version": "n33ZS1GR",
1019 "dependencies": [
1020 "ext.cx.util",
1021 "ext.uls.init",
1022@@ -5738,7 5724,7 @@
1023 "skip": null
1024 },
1025 "ext.cx.entrypoint": {
1026- "version": "p7FFrrHn",
1027 "version": "hc2eQaL0",
1028 "dependencies": [
1029 "ext.cx.sitemapper",
1030 "ext.cx.widgets.callout",
1031@@ -5761,12 5747,11 @@
1032 "skip": null
1033 },
1034 "ext.cx.translationlist": {
1035- "version": "woqMQmcu",
1036 "version": "v4E5jtSn",
1037 "dependencies": [
1038 "ext.cx.progressbar",
1039 "ext.cx.source.selector",
1040 "ext.cx.util",
1041- "ext.cx.widgets.overlay",
1042- "jquery.uls.data",
1043 "moment"
1044 ],
1045 "group": null,
1046@@ -5827,7 5812,7 @@
1047 "skip": null
1048 },
1049 "ext.cx.campaigns.newarticle": {
1050- "version": "arkemi5e",
1051 "version": "ssalg7kD",
1052 "dependencies": [
1053 "ext.cx.widgets.callout",
1054 "jquery.throttle-debounce",
1055@@ -5856,7 5841,7 @@
1056 "skip": null
1057 },
1058 "ext.cx.campaigns.contributionsmenu": {
1059- "version": "s7WUyzKE",
1060 "version": "mIhAp21U",
1061 "dependencies": [
1062 "ext.cx.widgets.callout",
1063 "mediawiki.Uri",
1064@@ -5868,7 5853,7 @@
1065 "skip": null
1066 },
1067 "ext.cx.widgets.overlay": {
1068- "version": "AbVBx4 t",
1069 "version": "hMsrMdLi",
1070 "dependencies": [
1071 "ext.cx.model"
1072 ],
1073@@ -6012,7 5997,7 @@
1074 "skip": null
1075 },
1076 "ext.centralauth.centralautologin": {
1077- "version": "tRuDyZe9",
1078 "version": "YbH7RThT",
1079 "dependencies": [
1080 "mediawiki.jqueryMsg"
1081 ],
1082@@ -6038,7 6023,7 @@
1083 "skip": null
1084 },
1085 "ext.centralauth.globaluserautocomplete": {
1086- "version": "y97cBgfN",
1087 "version": "arhdCCzY",
1088 "dependencies": [
1089 "jquery.suggestions",
1090 "mediawiki.api"
1091@@ -6074,16 6059,6 @@
1092 "state": "registered",
1093 "skip": null
1094 },
1095- "ext.centralauth.ForeignApi": {
1096- "version": "yotwZ1kQ",
1097- "dependencies": [
1098- "mediawiki.ForeignApi.core"
1099- ],
1100- "group": null,
1101- "source": "local",
1102- "state": "registered",
1103- "skip": null
1104- },
1105 "ext.apifeatureusage": {
1106 "version": "lUUBCvdw",
1107 "dependencies": [],
1108@@ -6389,7 6364,7 @@
1109 "skip": null
1110 },
1111 "mmv": {
1112- "version": "PJsPJh0G",
1113 "version": "l7dvNUDU",
1114 "dependencies": [
1115 "ext.eventLogging",
1116 "jquery.color",
1117@@ -6430,7 6405,7 @@
1118 "skip": null
1119 },
1120 "mmv.ui.reuse.shareembed": {
1121- "version": "bijaGAhy",
1122 "version": "eXcSAf/7",
1123 "dependencies": [
1124 "mmv.ui.ondemandshareddependencies"
1125 ],
1126@@ -6450,7 6425,7 @@
1127 "skip": null
1128 },
1129 "mmv.bootstrap": {
1130- "version": "zBOPr5TP",
1131 "version": "GEcjeJC4",
1132 "dependencies": [
1133 "mediawiki.Title",
1134 "mediawiki.ui.icon",
1135@@ -6527,7 6502,7 @@
1136 "skip": null
1137 },
1138 "ext.wikiLove.startup": {
1139- "version": "YAA 10jn",
1140 "version": "YswyIEMr",
1141 "dependencies": [
1142 "ext.wikiLove.defaultOptions",
1143 "jquery.localize",
1144@@ -6650,7 6625,7 @@
1145 "skip": null
1146 },
1147 "mobile.app.pagestyles.android": {
1148- "version": "VHI2iPCZ",
1149 "version": "u0M5iDmP",
1150 "dependencies": [],
1151 "group": null,
1152 "source": "local",
1153@@ -6658,7 6633,7 @@
1154 "skip": null
1155 },
1156 "mobile.app.pagestyles.android.night": {
1157- "version": "EqIu/Sqn",
1158 "version": "G KnOrh8",
1159 "dependencies": [],
1160 "group": null,
1161 "source": "local",
1162@@ -6674,7 6649,7 @@
1163 "skip": null
1164 },
1165 "mobile.app.preview": {
1166- "version": "rvthGQm8",
1167 "version": "VCIvF NG",
1168 "dependencies": [],
1169 "group": null,
1170 "source": "local",
1171@@ -6741,7 6716,7 @@
1172 "skip": null
1173 },
1174 "mobile.mainMenu": {
1175- "version": "XcAJ6/1W",
1176 "version": "NjSAtWsF",
1177 "dependencies": [
1178 "mobile.view",
1179 "mediawiki.template.hogan"
1180@@ -6752,7 6727,7 @@
1181 "skip": null
1182 },
1183 "mobile.messageBox": {
1184- "version": "4ogJlq9B",
1185 "version": "56Z4Rtrs",
1186 "dependencies": [
1187 "mobile.view",
1188 "mediawiki.template.hogan"
1189@@ -6848,7 6823,7 @@
1190 "skip": null
1191 },
1192 "mobile.ajax": {
1193- "version": "xCMUXGhW",
1194 "version": "J0iX17ss",
1195 "dependencies": [
1196 "skins.minerva.icons.images.legacy"
1197 ],
1198@@ -6869,7 6844,7 @@
1199 "skip": null
1200 },
1201 "mobile.startup": {
1202- "version": "Smmq4xy0",
1203 "version": "MP4JFHh6",
1204 "dependencies": [
1205 "jquery.throttle-debounce",
1206 "mobile.settings",
1207@@ -6936,7 6911,7 @@
1208 "skip": null
1209 },
1210 "mobile.editor.common": {
1211- "version": "J4kUqcIo",
1212 "version": "VhdBDUF1",
1213 "dependencies": [
1214 "mediawiki.confirmCloseWindow",
1215 "mobile.editor.api",
1216@@ -6951,11 6926,10 @@
1217 "skip": null
1218 },
1219 "mobile.editor.overlay": {
1220- "version": "hcT6fV4K",
1221 "version": "bTRLh AS",
1222 "dependencies": [
1223 "mobile.editor.common",
1224- "mobile.microAutoSize",
1225- "oojs-ui.styles.icons-editing-core"
1226 "mobile.microAutoSize"
1227 ],
1228 "group": null,
1229 "source": "local",
1230@@ -6976,7 6950,7 @@
1231 "skip": null
1232 },
1233 "mobile.editor.overlay.withtoolbar.images": {
1234- "version": "lJ9r47mE",
1235 "version": "798MZULh",
1236 "dependencies": [],
1237 "group": null,
1238 "source": "local",
1239@@ -6994,7 6968,7 @@
1240 "skip": null
1241 },
1242 "mobile.search": {
1243- "version": "hdHacUU4",
1244 "version": "xxXwqBTR",
1245 "dependencies": [
1246 "mediawiki.Title",
1247 "mobile.overlays",
1248@@ -7006,7 6980,7 @@
1249 "skip": null
1250 },
1251 "mobile.search.beta": {
1252- "version": "YAm6S138",
1253 "version": "2XSEWPBZ",
1254 "dependencies": [
1255 "mobile.search"
1256 ],
1257@@ -7050,7 7024,7 @@
1258 "skip": null
1259 },
1260 "mobile.swipe.images": {
1261- "version": "g5xOtgC4",
1262 "version": "guP2E1Yk",
1263 "dependencies": [],
1264 "group": null,
1265 "source": "local",
1266@@ -7080,7 7054,7 @@
1267 "skip": null
1268 },
1269 "mobile.overlays": {
1270- "version": "pojTsqiz",
1271 "version": "Zgb7OzZj",
1272 "dependencies": [
1273 "mobile.ajax",
1274 "mobile.startup",
1275@@ -7092,7 7066,7 @@
1276 "skip": null
1277 },
1278 "mobile.drawers": {
1279- "version": "/5hx6i0S",
1280 "version": "ETCul4s3",
1281 "dependencies": [
1282 "mobile.startup"
1283 ],
1284@@ -7102,7 7076,7 @@
1285 "skip": null
1286 },
1287 "mobile.toast": {
1288- "version": "L/wMSmKL",
1289 "version": "Sr2ux lE",
1290 "dependencies": [
1291 "mobile.drawers"
1292 ],
1293@@ -7133,7 7107,7 @@
1294 "skip": null
1295 },
1296 "mobile.toggling": {
1297- "version": "4J5EDNOx",
1298 "version": "F JAp Ty",
1299 "dependencies": [
1300 "mobile.startup"
1301 ],
1302@@ -7143,7 7117,7 @@
1303 "skip": null
1304 },
1305 "mobile.contentOverlays": {
1306- "version": "wkiWiSk/",
1307 "version": "KxdfsXgS",
1308 "dependencies": [
1309 "mobile.overlays"
1310 ],
1311@@ -7165,7 7139,7 @@
1312 "skip": null
1313 },
1314 "mobile.watchstar": {
1315- "version": "Mq7Vt36Q",
1316 "version": "y7/4J2bn",
1317 "dependencies": [
1318 "mobile.ajax",
1319 "mobile.loggingSchemas",
1320@@ -7196,8 7170,8 @@
1321 "state": "registered",
1322 "skip": null
1323 },
1324- "mobile.hovercards": {
1325- "version": "MCSBGozy",
1326 "mobile.quickLookup": {
1327 "version": "6ffHgice",
1328 "dependencies": [
1329 "mobile.swipe",
1330 "mobile.toast"
1331@@ -7326,7 7300,7 @@
1332 "skip": null
1333 },
1334 "mobile.special.nearby.styles": {
1335- "version": "JElT9fB2",
1336 "version": "v5TXH1Ws",
1337 "dependencies": [],
1338 "group": null,
1339 "source": "local",
1340@@ -7380,7 7354,7 @@
1341 "skip": null
1342 },
1343 "skins.minerva.chrome.styles": {
1344- "version": "cdbZ6 q ",
1345 "version": "z0ZFfVqx",
1346 "dependencies": [],
1347 "group": null,
1348 "source": "local",
1349@@ -7388,7 7362,7 @@
1350 "skip": null
1351 },
1352 "skins.minerva.base.styles": {
1353- "version": "ev4vVxFp",
1354 "version": "ahuOYQZT",
1355 "dependencies": [],
1356 "group": null,
1357 "source": "local",
1358@@ -7404,7 7378,7 @@
1359 "skip": null
1360 },
1361 "mobile.pagelist.styles": {
1362- "version": "y6d4i2//",
1363 "version": "cWywA/EX",
1364 "dependencies": [],
1365 "group": null,
1366 "source": "local",
1367@@ -7412,7 7386,7 @@
1368 "skip": null
1369 },
1370 "mobile.pagesummary.styles": {
1371- "version": "QZ4a9ol ",
1372 "version": "o4/sPfLY",
1373 "dependencies": [],
1374 "group": null,
1375 "source": "local",
1376@@ -7420,7 7394,7 @@
1377 "skip": null
1378 },
1379 "skins.minerva.tablet.styles": {
1380- "version": "9x aBPxn",
1381 "version": "DQ6jRihi",
1382 "dependencies": [],
1383 "group": null,
1384 "source": "local",
1385@@ -7428,7 7402,7 @@
1386 "skip": null
1387 },
1388 "skins.minerva.tablet.beta.styles": {
1389- "version": "1w82Y9YY",
1390 "version": "lU3h4wBo",
1391 "dependencies": [],
1392 "group": null,
1393 "source": "local",
1394@@ -7436,7 7410,7 @@
1395 "skip": null
1396 },
1397 "skins.minerva.icons.images": {
1398- "version": "yOlkg5QW",
1399 "version": "OPoCo9xp",
1400 "dependencies": [],
1401 "group": null,
1402 "source": "local",
1403@@ -7444,7 7418,7 @@
1404 "skip": null
1405 },
1406 "skins.minerva.icons.images.legacy": {
1407- "version": "lZ/1KEML",
1408 "version": "/JqmWkx8",
1409 "dependencies": [],
1410 "group": null,
1411 "source": "local",
1412@@ -7452,7 7426,7 @@
1413 "skip": null
1414 },
1415 "skins.minerva.icons.variants.js": {
1416- "version": "sAX0QSx0",
1417 "version": "GYW3PBgm",
1418 "dependencies": [],
1419 "group": null,
1420 "source": "local",
1421@@ -7460,7 7434,7 @@
1422 "skip": null
1423 },
1424 "skins.minerva.icons.images.js": {
1425- "version": "bsQRhCBM",
1426 "version": "M JCRwfk",
1427 "dependencies": [],
1428 "group": null,
1429 "source": "local",
1430@@ -7484,7 7458,7 @@
1431 "skip": null
1432 },
1433 "skins.minerva.beta.styles": {
1434- "version": "U6oLd4W7",
1435 "version": "fVRlB73O",
1436 "dependencies": [],
1437 "group": null,
1438 "source": "local",
1439@@ -7492,7 7466,7 @@
1440 "skip": null
1441 },
1442 "skins.minerva.beta.images": {
1443- "version": "qP/l8VDF",
1444 "version": "ivfzOonq",
1445 "dependencies": [],
1446 "group": null,
1447 "source": "local",
1448@@ -7541,9 7515,9 @@
1449 "skip": null
1450 },
1451 "skins.minerva.alpha.scripts": {
1452- "version": "TUMKVut1",
1453 "version": "WlSfBEsb",
1454 "dependencies": [
1455- "mobile.hovercards",
1456 "mobile.quickLookup",
1457 "skins.minerva.beta.scripts"
1458 ],
1459 "group": null,
1460@@ -7853,7 7827,7 @@
1461 "skip": null
1462 },
1463 "ext.translate.special.searchtranslations": {
1464- "version": "3fMgROj/",
1465 "version": "u8u9Ji9J",
1466 "dependencies": [
1467 "ext.translate.editor",
1468 "ext.translate.groupselector",
1469@@ -8158,7 8132,7 @@
1470 "skip": null
1471 },
1472 "ext.echo.overlay.init": {
1473- "version": "/gZ5ojrH",
1474 "version": "YWFDww7k",
1475 "dependencies": [
1476 "ext.echo.overlay"
1477 ],
1478@@ -8168,7 8142,7 @@
1479 "skip": null
1480 },
1481 "ext.echo.special": {
1482- "version": "MmBxIgLZ",
1483 "version": "PLMh7AbW",
1484 "dependencies": [
1485 "ext.echo.base",
1486 "mediawiki.api",
1487@@ -8180,7 8154,7 @@
1488 "skip": null
1489 },
1490 "ext.echo.alert": {
1491- "version": "hRePYm d",
1492 "version": "RliLrBTX",
1493 "dependencies": [],
1494 "group": null,
1495 "source": "local",
1496@@ -8188,7 8162,7 @@
1497 "skip": null
1498 },
1499 "ext.echo.badge": {
1500- "version": "c c1PjFE",
1501 "version": "C1UP5V3A",
1502 "dependencies": [],
1503 "group": null,
1504 "source": "local",
1505@@ -8247,7 8221,7 @@
1506 "skip": null
1507 },
1508 "ext.flow.contributions.styles": {
1509- "version": "u3PqWPVQ",
1510 "version": "fg2hibrG",
1511 "dependencies": [],
1512 "group": null,
1513 "source": "local",
1514@@ -8255,7 8229,7 @@
1515 "skip": null
1516 },
1517 "ext.flow.templating": {
1518- "version": "MzSGhJYL",
1519 "version": "fZddrcwQ",
1520 "dependencies": [
1521 "mediawiki.template.handlebars",
1522 "moment"
1523@@ -8266,7 8240,7 @@
1524 "skip": null
1525 },
1526 "ext.flow.mediawiki.ui.modal": {
1527- "version": "SIcxNhDD",
1528 "version": "pTQrywHy",
1529 "dependencies": [],
1530 "group": null,
1531 "source": "local",
1532@@ -8274,7 8248,7 @@
1533 "skip": null
1534 },
1535 "ext.flow.mediawiki.ui.text": {
1536- "version": "U8XahDS2",
1537 "version": "7gCm n0c",
1538 "dependencies": [],
1539 "group": null,
1540 "source": "local",
1541@@ -8282,7 8256,7 @@
1542 "skip": null
1543 },
1544 "ext.flow.mediawiki.ui.form": {
1545- "version": "Fbs6x0fb",
1546 "version": "BWVGtxXB",
1547 "dependencies": [],
1548 "group": null,
1549 "source": "local",
1550@@ -8290,7 8264,7 @@
1551 "skip": null
1552 },
1553 "ext.flow.mediawiki.ui.tooltips": {
1554- "version": "jCiVA Q4",
1555 "version": "iwjNyIib",
1556 "dependencies": [],
1557 "group": null,
1558 "source": "local",
1559@@ -8298,7 8272,7 @@
1560 "skip": null
1561 },
1562 "ext.flow.styles.base": {
1563- "version": "WYtmcRkJ",
1564 "version": "NqLe 2hk",
1565 "dependencies": [],
1566 "group": null,
1567 "source": "local",
1568@@ -8306,7 8280,7 @@
1569 "skip": null
1570 },
1571 "ext.flow.board.styles": {
1572- "version": "BQL 0aGZ",
1573 "version": "SN7ZuwII",
1574 "dependencies": [],
1575 "group": null,
1576 "source": "local",
1577@@ -8314,7 8288,7 @@
1578 "skip": null
1579 },
1580 "ext.flow.board.topic.styles": {
1581- "version": "7u8KKQy8",
1582 "version": "puwntZbh",
1583 "dependencies": [],
1584 "group": null,
1585 "source": "local",
1586@@ -8358,7 8332,7 @@
1587 "skip": null
1588 },
1589 "ext.flow.ui": {
1590- "version": "aMm01Icc",
1591 "version": "yPYKR5BA",
1592 "dependencies": [
1593 "ext.flow.dm",
1863 "oojs-ui"
1595@@ -8369,7 8343,7 @@
1596 "skip": null
1597 },
1598 "ext.flow": {
1599- "version": "bBqOc8Sq",
1600 "version": "4fPJ6O3C",
1601 "dependencies": [
1602 "ext.flow.components",
1603 "ext.flow.editor",
1604@@ -8425,7 8399,7 @@
1605 "skip": null
1606 },
1607 "ext.flow.visualEditor": {
1608- "version": "pIQ9lJEr",
1609 "version": "9Dsu2bRE",
1610 "dependencies": [
1611 "ext.flow.editors.none",
1612 "ext.visualEditor.core.desktop",
1613@@ -8632,7 8606,7 @@
1614 "skip": null
1615 },
1616 "ext.gettingstarted.return": {
1617- "version": "MnDwMsYX",
1618 "version": "pimtQd2c",
1619 "dependencies": [
1620 "ext.gettingstarted.api",
1621 "ext.gettingstarted.logging",
1622@@ -10002,34 9976,6 @@
1623 "state": "registered",
1624 "skip": null
1625 },
1626- "dataTypes.__namespace": {
1627- "version": "6xoJE905",
1628- "dependencies": [],
1629- "group": null,
1630- "source": "local",
1631- "state": "registered",
1632- "skip": null
1633- },
1634- "dataTypes.DataType": {
1635- "version": "M4cpjZwl",
1636- "dependencies": [
1637- "dataTypes.__namespace"
1638- ],
1639- "group": null,
1640- "source": "local",
1641- "state": "registered",
1642- "skip": null
1643- },
1644- "dataTypes.DataTypeStore": {
1645- "version": " LRcVVvu",
1646- "dependencies": [
1647- "dataTypes.DataType"
1648- ],
1649- "group": null,
1650- "source": "local",
1651- "state": "registered",
1652- "skip": null
1653- },
1654 "jquery.animateWithEvent": {
1655 "version": "t4obL0a3",
1656 "dependencies": [
1657@@ -10523,6 10469,34 @@
1658 "state": "registered",
1659 "skip": null
1660 },
1661 "dataTypes.__namespace": {
1662 "version": "6xoJE905",
1663 "dependencies": [],
1664 "group": null,
1665 "source": "local",
1666 "state": "registered",
1667 "skip": null
1668 },
1669 "dataTypes.DataType": {
1670 "version": "M4cpjZwl",
1671 "dependencies": [
1672 "dataTypes.__namespace"
1673 ],
1674 "group": null,
1675 "source": "local",
1676 "state": "registered",
1677 "skip": null
1678 },
1679 "dataTypes.DataTypeStore": {
1680 "version": " LRcVVvu",
1681 "dependencies": [
1682 "dataTypes.DataType"
1683 ],
1684 "group": null,
1685 "source": "local",
1686 "state": "registered",
1687 "skip": null
1688 },
1689 "mw.config.values.wbSiteDetails": {
1690 "version": "aT4EmrTa",
1691 "dependencies": [],
1692@@ -10714,7 10688,7 @@
1693 "skip": null
1694 },
1695 "ext.MWOAuth.AuthorizeForm": {
1696- "version": "mw8g3IFT",
1697 "version": "ykhcFHq ",
1698 "dependencies": [],
1699 "group": null,
1700 "source": "local",
1701@@ -10752,7 10726,7 @@
1702 "skip": null
1703 },
1704 "mw.PopUpMediaTransform": {
1705- "version": "WfmA4rcU",
1706 "version": "m8ZuzYXQ",
1707 "dependencies": [
1708 "mediawiki.Title",
1709 "mw.MwEmbedSupport"
1710@@ -10797,14 10771,6 @@
1711 "state": "registered",
1712 "skip": null
1713 },
1714- "ext.tmh.TimedTextSelector": {
1715- "version": "qy5WxpjW",
1716- "dependencies": [],
1717- "group": null,
1718- "source": "local",
1719- "state": "registered",
1720- "skip": null
1721- },
1722 "mw.MediaWikiPlayerSupport": {
1723 "version": "yJz558BY",
1724 "dependencies": [
1725@@ -10878,7 10844,7 @@
1726 "skip": null
1727 },
1728 "ext.wikimediaBadges": {
1729- "version": "RXecnUoy",
1730 "version": "IjZockXP",
1731 "dependencies": [],
1732 "group": null,
1733 "source": "local",
1734@@ -10926,11 10892,12 @@
1735 "skip": null
1736 }
1737 }
1738
1739 {
1740 "wgLoadScript": "https://test.wikipedia.org/w/load.php",
1741 "debug": false,
1742 "skin": "vector",
1743- "stylepath": "https://test.wikipedia.org/static/1.26wmf20/skins",
1744 "stylepath": "https://test.wikipedia.org/static/1.26wmf19/skins",
1745 "wgUrlProtocols": "bitcoin\\:|ftp\\:\\/\\/|ftps\\:\\/\\/|geo\\:|git\\:\\/\\/|gopher\\:\\/\\/|http\\:\\/\\/|https\\:\\/\\/|irc\\:\\/\\/|ircs\\:\\/\\/|magnet\\:|mailto\\:|mms\\:\\/\\/|news\\:|nntp\\:\\/\\/|redis\\:\\/\\/|sftp\\:\\/\\/|sip\\:|sips\\:|sms\\:|ssh\\:\\/\\/|svn\\:\\/\\/|tel\\:|telnet\\:\\/\\/|urn\\:|worldwind\\:\\/\\/|xmpp\\:|\\/\\/",
1746 "wgArticlePath": "/wiki/$1",
1747 "wgScriptPath": "/w",
1748@@ -10944,7 10911,7 @@
1749 "wgUserLanguage": "en",
1750 "wgContentLanguage": "en",
1751 "wgTranslateNumerals": true,
1752- "wgVersion": "1.26wmf20",
1753 "wgVersion": "1.26wmf19",
1754 "wgEnableAPI": true,
1755 "wgEnableWriteAPI": true,
1756 "wgMainPageTitle": "Main Page",
1757@@ -11063,17 11030,17 @@
1758 "fallback": "Fallback",
1759 "apioutput": "ApiOutput"
1760 },
1761- "wgExtensionAssetsPath": "https://test.wikipedia.org/static/1.26wmf20/extensions",
1762 "wgExtensionAssetsPath": "https://test.wikipedia.org/static/1.26wmf19/extensions",
1763 "wgCookiePrefix": "testwiki",
1764 "wgCookieDomain": "",
1765 "wgCookiePath": "/",
1766 "wgCookieExpiration": 2592000,
1767 "wgResourceLoaderMaxQueryLength": 2000,
1768 "wgCaseSensitiveNamespaces": [
1769- 460,
1770- 461,
1771 2302,
1772- 2303
1773 2303,
1774 460,
1775 461
1776 ],
1777 "wgLegalTitleChars": " %!\"$&'()*,\\-./0-9:;=?@A-Z\\\\\\^_`a-z~ \\u0080-\\uFFFF",
1778 "wgResourceLoaderStorageVersion": 1,
1779@@ -11083,10 11050,12 @@
1780 ],
1781 "EmbedPlayer.DirectFileLinkWarning": true,
1782 "EmbedPlayer.EnableOptionsMenu": true,
1783 "EmbedPlayer.DisableJava": true,
1784 "EmbedPlayer.DisableHTML5FlashFallback": true,
1785 "TimedText.ShowInterface": "always",
1786 "TimedText.ShowAddTextLink": true,
1787- "EmbedPlayer.WebPath": "https://test.wikipedia.org/static/1.26wmf20/extensions/TimedMediaHandler/MwEmbedModules/EmbedPlayer",
1788 "EmbedPlayer.WebPath": "https://test.wikipedia.org/static/1.26wmf19/extensions/TimedMediaHandler/MwEmbedModules/EmbedPlayer",
1789 "wgCortadoJarFile": false,
1790 "AjaxRequestTimeout": 30,
1791 "MediaWiki.DefaultProvider": "local",
1792 "MediaWiki.ApiProviders": {

Using a simple eval script (P1943) I tried to find the cause.

  • user.defaults: Genuine change (flow-topiclist-sortby changed from "updated" to "oldest" and searchNs2600 got added).
  • mediawiki.skinning.content.parsoid: This one has no reason to change.
@@ -1,5  1,5 @@
 > return $wgVersion;
-1.26wmf19
 1.26wmf20
 > return $m->getModuleContent( $c );
 array(3) {
   ["scripts"]=>
@@ -82,15  82,13 @@
       bool(false)
     }
     ["fileHashes"]=>
-    array(2) {
     array(1) {
       [0]=>
       string(40) "2c8553784d9e0e8b565d6c4cd525556ce87fbdd0"
-      [1]=>
-      string(40) "2c8553784d9e0e8b565d6c4cd525556ce87fbdd0"
     }
     ["msgBlobMtime"]=>
     int(1)
   }
 }
 > return $m->getVersionHash( $c );
-f1Ifa cB
 eqAznAKY

The funny thing is that when switching it's alternating inconsistently. It's not that the extra hash was added or removed in wmf20. It's some kind of oscillation bug. In the paste above for example, it changed from f1Ifa cB to eqAznAKY whereas originally (in the startup-diff paste) it changed from eqAznAKY to f1Ifa cB.

ori renamed this task from Don't trash cache for front-end resources after each deployment (tracking) to Don't trash cache for front-end resources.Sep 27 2015, 3:09 AM

Change 252138 had a related patch set uploaded (by Krinkle):
Enable new module versioning for VisualEditorDataModule

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

Change 252138 merged by jenkins-bot:
Enable new module versioning for VisualEditorDataModule

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

Change 272648 had a related patch set uploaded (by Krinkle):
Add version hash to wikihiero images

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

Change 272648 merged by jenkins-bot:
Add version hash to wikihiero images

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

Change 272970 had a related patch set uploaded (by Krinkle):
Add version hash to wikihiero images

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

Change 272971 had a related patch set uploaded (by Krinkle):
Add version hash to wikihiero images

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

Change 272971 merged by jenkins-bot:
Add version hash to wikihiero images

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

Change 272970 merged by jenkins-bot:
Add version hash to wikihiero images

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

Change 274752 had a related patch set uploaded (by Krinkle):
Add version hash to ImageMap desc image

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

Change 274754 had a related patch set uploaded (by Krinkle):
Add version hash to screenshot urls

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

A few samples of unversioned static urls (from varnishlog on cp1055)

Change 274754 merged by jenkins-bot:
Add version hash to screenshot urls

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

Change 274752 merged by jenkins-bot:
Add version hash to ImageMap desc image

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

Krinkle closed this task as Resolved.EditedJul 27 2016, 12:44 AM

The last blocking task is T113916: Switch ResourceLoader file dependency tracking to MultiDC-friendly backend. However closing this as the resolved since the original goals have been achieved without it.

  • Static files. T99096: We fixed our static url scheme to not change every week. Whilst also addressing the need for longer cache expires and more stable urls overall.
    • Previously, url urls varied by weekly branch name. This meant they were cached too long (if we want to change something mid-week), and too short (needlessly invalidates browser cache the same day every week for many files that haven't changed).
    • Solution:
      • Add a query string to the url with a content hash. This means cache will instantly roll-over when a change is deployed.
      • Unify the virtual /static* directory structure to be branch-agonistic. This was done by developing the /w/static.php proxy in wmf-config (source code), which, baed on the content hash, will find the file from a deployed branch. This means urls will not become 404 if they are cached in HTML content for longer than a week (fixes T99096). And it means we now make better use of web browser caching by not needlessly changing the url every week.
  • Module versions. We fixed all the different factors that caused the module hash to change when no actual change was made to the effective script content. (T98087, T104950, T94810, T94074)

Nonetheless, T113916 remains as separate technical debt.