<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://mw.eckford.ca:443/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Admin</id>
	<title>MediaWiki-1.39 - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://mw.eckford.ca:443/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Admin"/>
	<link rel="alternate" type="text/html" href="https://mw.eckford.ca:443/index.php/Special:Contributions/Admin"/>
	<updated>2026-07-17T11:58:59Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.39.17</generator>
	<entry>
		<id>https://mw.eckford.ca:443/index.php?title=Rs2&amp;diff=134</id>
		<title>Rs2</title>
		<link rel="alternate" type="text/html" href="https://mw.eckford.ca:443/index.php?title=Rs2&amp;diff=134"/>
		<updated>2026-01-23T18:37:38Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Image:https://docs.eckford.ca/a-74jpg|right|thumb|250px|This is the caption]]&lt;br /&gt;
&lt;br /&gt;
An online source of RADARSAT-2 operations data and documentation since launch.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h2&amp;gt;Navigation Methods&amp;lt;/h2&amp;gt;&lt;br /&gt;
{{Enhanced|From a desktop machine:}}&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[https://sh1rs2wikidu01.mda.ca/Main_Page &amp;lt;strong&amp;gt;R2 Wiki&amp;lt;/strong&amp;gt;] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[https://transferdepot.sh1rs2wikidu01.mda.ca &amp;lt;strong&amp;gt;TransferDepot &amp;lt;/strong&amp;gt;] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[https://sh1rs2wikidu01.mda.ca/Special:ApprovedManuals &amp;lt;strong&amp;gt;Operational Manual Procedures&amp;lt;/strong&amp;gt;]&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Safe|From the Control Room and legacy machines:}}&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[http://142.73.160.81/index.php/Main_Page?useskin=monobook &amp;lt;strong&amp;gt;R2 Wiki&amp;lt;/strong&amp;gt; ] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[http://142.73.160.62/ &amp;lt;strong&amp;gt;TransferDepot&amp;lt;/strong&amp;gt;] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[http://142.73.160.81/Special:ApprovedManuals?useskin=monobook &amp;lt;strong&amp;gt;Operational Manual Procedures&amp;lt;/strong&amp;gt;] &amp;lt;/strong&amp;gt; &amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== System Configuration ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;MDA R2-Wiki New stuff/should read:&#039;&#039;&#039;&amp;lt;BR&amp;gt;&lt;br /&gt;
[[Cortex|Cortex Explained:]] Mission Control &amp;amp; High level description&amp;lt;BR&amp;gt;&lt;br /&gt;
-----&lt;br /&gt;
[[MissionPriorities| Mission Priorities:]] Top Mission Priorities from SAF, Bugs and projects &amp;lt;BR&amp;gt;&lt;br /&gt;
[[Current Spacecraft Configuration| Current Spacecraft Configuration:]] Overview of current Spacecraft configuration, subsystem status and performance &amp;lt;BR&amp;gt;&lt;br /&gt;
[[System_Configuration|Ground System Configuration:]] Ground Segment SW&amp;lt;BR&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://mw.eckford.ca:443/index.php?title=Template:Info&amp;diff=133</id>
		<title>Template:Info</title>
		<link rel="alternate" type="text/html" href="https://mw.eckford.ca:443/index.php?title=Template:Info&amp;diff=133"/>
		<updated>2026-01-23T18:11:20Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;border-left: 4px solid #3498db; background: #eaf2f8; padding: 0.8em; margin: 1 em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;strong&amp;gt;Info:&amp;lt;/strong&amp;gt; {{{1}}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;noinclude&amp;gt;&lt;br /&gt;
[[Category:Templates]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://mw.eckford.ca:443/index.php?title=MediaWiki:Sidebar&amp;diff=132</id>
		<title>MediaWiki:Sidebar</title>
		<link rel="alternate" type="text/html" href="https://mw.eckford.ca:443/index.php?title=MediaWiki:Sidebar&amp;diff=132"/>
		<updated>2026-01-23T18:10:19Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
* navigation&lt;br /&gt;
** mainpage|mainpage-description&lt;br /&gt;
** Rs2|rs2&lt;br /&gt;
** recentchanges-url|recentchanges&lt;br /&gt;
** randompage-url|randompage&lt;br /&gt;
** helppage|help-mediawiki&lt;br /&gt;
** MediaWiki_Tips|MW for the Sh1re&lt;br /&gt;
** MediaWiki:Sidebar|MediaWiki Sidebar&lt;br /&gt;
** Special:AllPages/Template:|Templates&lt;br /&gt;
** purge-main|Purge Main Page&lt;br /&gt;
* SEARCH&lt;br /&gt;
* TOOLBOX&lt;br /&gt;
* LANGUAGES&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3&amp;gt; Now you can&amp;lt;/h3&amp;gt; &lt;br /&gt;
&amp;lt;p&amp;gt;This one was different&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;** MediaWiki:Sidebar|MediaWiki Sidebar&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Link to other MediaWiki: pages (like MediaWiki:Common.css, MediaWiki:Mainpage-description), just remember to include the full namespace like MediaWiki:Mainpage-description &amp;lt;/p&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://mw.eckford.ca:443/index.php?title=MediaWiki:Sidebar&amp;diff=131</id>
		<title>MediaWiki:Sidebar</title>
		<link rel="alternate" type="text/html" href="https://mw.eckford.ca:443/index.php?title=MediaWiki:Sidebar&amp;diff=131"/>
		<updated>2026-01-23T18:09:48Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
* navigation&lt;br /&gt;
** mainpage|mainpage-description&lt;br /&gt;
** MediaWiki:Rs2|rs2&lt;br /&gt;
** recentchanges-url|recentchanges&lt;br /&gt;
** randompage-url|randompage&lt;br /&gt;
** helppage|help-mediawiki&lt;br /&gt;
** MediaWiki_Tips|MW for the Sh1re&lt;br /&gt;
** MediaWiki:Sidebar|MediaWiki Sidebar&lt;br /&gt;
** Special:AllPages/Template:|Templates&lt;br /&gt;
** purge-main|Purge Main Page&lt;br /&gt;
* SEARCH&lt;br /&gt;
* TOOLBOX&lt;br /&gt;
* LANGUAGES&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3&amp;gt; Now you can&amp;lt;/h3&amp;gt; &lt;br /&gt;
&amp;lt;p&amp;gt;This one was different&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;** MediaWiki:Sidebar|MediaWiki Sidebar&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Link to other MediaWiki: pages (like MediaWiki:Common.css, MediaWiki:Mainpage-description), just remember to include the full namespace like MediaWiki:Mainpage-description &amp;lt;/p&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://mw.eckford.ca:443/index.php?title=Template:Notice&amp;diff=110</id>
		<title>Template:Notice</title>
		<link rel="alternate" type="text/html" href="https://mw.eckford.ca:443/index.php?title=Template:Notice&amp;diff=110"/>
		<updated>2026-01-22T20:35:47Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&amp;quot;mw-note&amp;quot; style=&amp;quot;margin: 1em 0; padding: 5px 10px; border-left: 5px solid #36c; background-color: #f8f9fa; border-radius: 2px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;strong&amp;gt;Upcoming Event:&amp;lt;/strong&amp;gt; {{{event_name|Annual Community Meetup}}} &amp;lt;br /&amp;gt;&lt;br /&gt;
    &amp;lt;small&amp;gt;Scheduled for: {{{date|TBA}}} at {{{location|Main Hall}}}&amp;lt;/small&amp;gt;&lt;br /&gt;
    &amp;lt;p style=&amp;quot;margin-top: 5px; font-size: 0.9em;&amp;quot;&amp;gt;{{{description|Join us for our yearly gathering to discuss upcoming wiki projects and milestones!}}}&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;noinclude&amp;gt;&lt;br /&gt;
[[Category:Templates]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://mw.eckford.ca:443/index.php?title=Main_Page&amp;diff=109</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://mw.eckford.ca:443/index.php?title=Main_Page&amp;diff=109"/>
		<updated>2026-01-22T20:25:46Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;strong&amp;gt;MediaWiki has been installed.&amp;lt;/strong&amp;gt;&lt;br /&gt;
{{Notice&lt;br /&gt;
| event_name  = Wiki launch&lt;br /&gt;
| date        = January 12th&lt;br /&gt;
| location    = Lisa&#039;s Desk &lt;br /&gt;
| description = Don&#039;t forget to cast your vote for the next wiki admin!&lt;br /&gt;
}}&lt;br /&gt;
== Import CustomQueryPage ==&lt;br /&gt;
This install is originally intended for the ROUTINE Manuals publication workflow. That&#039;s all it does now, but hey, it&#039;s a good place to keep notes too. Did you know for MediaWiki you create a page by writing the name in the address bar? How tricky is that?&lt;br /&gt;
&lt;br /&gt;
== Let&#039;s Get Started ==&lt;br /&gt;
&lt;br /&gt;
* [https://mw.eckford.ca/downloads/CustomQueryPage-mw1359.tar.gz CustomQueryPage for mw1359]&lt;br /&gt;
&lt;br /&gt;
=== Installing CustomQueryPage ===&lt;br /&gt;
* Download the bundle: &amp;lt;code&amp;gt;wget https://mw.eckford.ca/downloads/CustomQueryPage-mw1359.tar.gz&amp;lt;/code&amp;gt;&lt;br /&gt;
* Extract it into your extensions folder:&lt;br /&gt;
** &amp;lt;code&amp;gt;tar -xzf CustomQueryPage-mw1359.tar.gz -C /srv/mediawiki/extensions&amp;lt;/code&amp;gt;&lt;br /&gt;
* Edit &amp;lt;code&amp;gt;LocalSettings.php&amp;lt;/code&amp;gt; and add &amp;lt;code&amp;gt;wfLoadExtension( &#039;CustomQueryPage&#039; );&amp;lt;/code&amp;gt;&lt;br /&gt;
* Run &amp;lt;code&amp;gt;php maintenance/update.php --quick&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Visit &amp;lt;code&amp;gt;Special:CustomQuerySettings&amp;lt;/code&amp;gt;, set the ROUTINE tag (e.g., &amp;lt;code&amp;gt;ROUTINE_4.110&amp;lt;/code&amp;gt;), and confirm &amp;lt;code&amp;gt;Special:ApprovedManuals&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Quick Start: ROUTINE Management =&lt;br /&gt;
&lt;br /&gt;
=== 1. Seed the ROUTINE in the DB ===&lt;br /&gt;
Before Lisa touches the UI, make sure the database has ROUTINE data.&lt;br /&gt;
&lt;br /&gt;
* Use the import script or manual SQL method.&lt;br /&gt;
* Required tables:&lt;br /&gt;
** &amp;lt;code&amp;gt;mw_tags&amp;lt;/code&amp;gt; — one row per ROUTINE (e.g., &amp;lt;code&amp;gt;ROUTINE_4.111&amp;lt;/code&amp;gt;).&lt;br /&gt;
** &amp;lt;code&amp;gt;mw_tag_pages&amp;lt;/code&amp;gt; — one row per approved page.&lt;br /&gt;
* If needed, run: &amp;lt;code&amp;gt;php maintenance/update.php --quick&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Note|Only run &amp;lt;code&amp;gt;update.php&amp;lt;/code&amp;gt; if &amp;lt;code&amp;gt;mw_customquerypage_settings&amp;lt;/code&amp;gt; doesn&#039;t exist yet.}}&lt;br /&gt;
&lt;br /&gt;
=== 2. Use the Special Page to Switch or Clone ===&lt;br /&gt;
&lt;br /&gt;
* Go to: &amp;lt;code&amp;gt;Special:CustomQuerySettings&amp;lt;/code&amp;gt;&lt;br /&gt;
* Two options:&lt;br /&gt;
** &#039;&#039;&#039;Set Active Tag&#039;&#039;&#039; — type &amp;lt;code&amp;gt;ROUTINE_4.111&amp;lt;/code&amp;gt;, then Save.&lt;br /&gt;
** &#039;&#039;&#039;Clone ROUTINE → New ROUTINE&#039;&#039;&#039;:&lt;br /&gt;
*** From: &amp;lt;code&amp;gt;ROUTINE_4.110&amp;lt;/code&amp;gt;&lt;br /&gt;
*** To: &amp;lt;code&amp;gt;ROUTINE_4.111&amp;lt;/code&amp;gt;&lt;br /&gt;
*** Submit → this copies rows and updates the active tag.&lt;br /&gt;
&lt;br /&gt;
=== 3. Verify the Result ===&lt;br /&gt;
&lt;br /&gt;
* Visit: &amp;lt;code&amp;gt;Special:ApprovedManuals&amp;lt;/code&amp;gt;&lt;br /&gt;
* Confirm the listing shows &amp;lt;code&amp;gt;ROUTINE_4.111&amp;lt;/code&amp;gt;&lt;br /&gt;
* Lisa can now publish or review the approved manuals.&lt;br /&gt;
* No DB access required.&lt;br /&gt;
&lt;br /&gt;
= Optional: JSON/API Importer =&lt;br /&gt;
&lt;br /&gt;
If you&#039;re ready to skip the SQL import:&lt;br /&gt;
&lt;br /&gt;
* Define a JSON payload that includes:&lt;br /&gt;
** &amp;lt;code&amp;gt;page_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;rev_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;deploy_comment&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;wikitext&amp;lt;/code&amp;gt;, etc.&lt;br /&gt;
* Build a:&lt;br /&gt;
** REST endpoint, or&lt;br /&gt;
** Action API module, or&lt;br /&gt;
** Maintenance script that reads JSON&lt;br /&gt;
&lt;br /&gt;
Once defined, MediaWiki can import directly into &amp;lt;code&amp;gt;mw_tags&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;mw_tag_pages&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{Warning|Avoid touching the database manually if you want to adopt the JSON route. The importer will safely handle all insertions.}}&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://mw.eckford.ca:443/index.php?title=Main_Page&amp;diff=108</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://mw.eckford.ca:443/index.php?title=Main_Page&amp;diff=108"/>
		<updated>2026-01-22T20:25:36Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;strong&amp;gt;MediaWiki has been installed.&amp;lt;/strong&amp;gt;&lt;br /&gt;
{{Notice&lt;br /&gt;
| event_name  = Wiki launch&lt;br /&gt;
| date        = January 12th&lt;br /&gt;
| location    = Lisa&#039;s Desk &lt;br /&gt;
| description = Don&#039;t forget to cast your vote for the next wiki admin!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Import CustomQueryPage ==&lt;br /&gt;
This install is originally intended for the ROUTINE Manuals publication workflow. That&#039;s all it does now, but hey, it&#039;s a good place to keep notes too. Did you know for MediaWiki you create a page by writing the name in the address bar? How tricky is that?&lt;br /&gt;
&lt;br /&gt;
== Let&#039;s Get Started ==&lt;br /&gt;
&lt;br /&gt;
* [https://mw.eckford.ca/downloads/CustomQueryPage-mw1359.tar.gz CustomQueryPage for mw1359]&lt;br /&gt;
&lt;br /&gt;
=== Installing CustomQueryPage ===&lt;br /&gt;
* Download the bundle: &amp;lt;code&amp;gt;wget https://mw.eckford.ca/downloads/CustomQueryPage-mw1359.tar.gz&amp;lt;/code&amp;gt;&lt;br /&gt;
* Extract it into your extensions folder:&lt;br /&gt;
** &amp;lt;code&amp;gt;tar -xzf CustomQueryPage-mw1359.tar.gz -C /srv/mediawiki/extensions&amp;lt;/code&amp;gt;&lt;br /&gt;
* Edit &amp;lt;code&amp;gt;LocalSettings.php&amp;lt;/code&amp;gt; and add &amp;lt;code&amp;gt;wfLoadExtension( &#039;CustomQueryPage&#039; );&amp;lt;/code&amp;gt;&lt;br /&gt;
* Run &amp;lt;code&amp;gt;php maintenance/update.php --quick&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Visit &amp;lt;code&amp;gt;Special:CustomQuerySettings&amp;lt;/code&amp;gt;, set the ROUTINE tag (e.g., &amp;lt;code&amp;gt;ROUTINE_4.110&amp;lt;/code&amp;gt;), and confirm &amp;lt;code&amp;gt;Special:ApprovedManuals&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Quick Start: ROUTINE Management =&lt;br /&gt;
&lt;br /&gt;
=== 1. Seed the ROUTINE in the DB ===&lt;br /&gt;
Before Lisa touches the UI, make sure the database has ROUTINE data.&lt;br /&gt;
&lt;br /&gt;
* Use the import script or manual SQL method.&lt;br /&gt;
* Required tables:&lt;br /&gt;
** &amp;lt;code&amp;gt;mw_tags&amp;lt;/code&amp;gt; — one row per ROUTINE (e.g., &amp;lt;code&amp;gt;ROUTINE_4.111&amp;lt;/code&amp;gt;).&lt;br /&gt;
** &amp;lt;code&amp;gt;mw_tag_pages&amp;lt;/code&amp;gt; — one row per approved page.&lt;br /&gt;
* If needed, run: &amp;lt;code&amp;gt;php maintenance/update.php --quick&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Note|Only run &amp;lt;code&amp;gt;update.php&amp;lt;/code&amp;gt; if &amp;lt;code&amp;gt;mw_customquerypage_settings&amp;lt;/code&amp;gt; doesn&#039;t exist yet.}}&lt;br /&gt;
&lt;br /&gt;
=== 2. Use the Special Page to Switch or Clone ===&lt;br /&gt;
&lt;br /&gt;
* Go to: &amp;lt;code&amp;gt;Special:CustomQuerySettings&amp;lt;/code&amp;gt;&lt;br /&gt;
* Two options:&lt;br /&gt;
** &#039;&#039;&#039;Set Active Tag&#039;&#039;&#039; — type &amp;lt;code&amp;gt;ROUTINE_4.111&amp;lt;/code&amp;gt;, then Save.&lt;br /&gt;
** &#039;&#039;&#039;Clone ROUTINE → New ROUTINE&#039;&#039;&#039;:&lt;br /&gt;
*** From: &amp;lt;code&amp;gt;ROUTINE_4.110&amp;lt;/code&amp;gt;&lt;br /&gt;
*** To: &amp;lt;code&amp;gt;ROUTINE_4.111&amp;lt;/code&amp;gt;&lt;br /&gt;
*** Submit → this copies rows and updates the active tag.&lt;br /&gt;
&lt;br /&gt;
=== 3. Verify the Result ===&lt;br /&gt;
&lt;br /&gt;
* Visit: &amp;lt;code&amp;gt;Special:ApprovedManuals&amp;lt;/code&amp;gt;&lt;br /&gt;
* Confirm the listing shows &amp;lt;code&amp;gt;ROUTINE_4.111&amp;lt;/code&amp;gt;&lt;br /&gt;
* Lisa can now publish or review the approved manuals.&lt;br /&gt;
* No DB access required.&lt;br /&gt;
&lt;br /&gt;
= Optional: JSON/API Importer =&lt;br /&gt;
&lt;br /&gt;
If you&#039;re ready to skip the SQL import:&lt;br /&gt;
&lt;br /&gt;
* Define a JSON payload that includes:&lt;br /&gt;
** &amp;lt;code&amp;gt;page_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;rev_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;deploy_comment&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;wikitext&amp;lt;/code&amp;gt;, etc.&lt;br /&gt;
* Build a:&lt;br /&gt;
** REST endpoint, or&lt;br /&gt;
** Action API module, or&lt;br /&gt;
** Maintenance script that reads JSON&lt;br /&gt;
&lt;br /&gt;
Once defined, MediaWiki can import directly into &amp;lt;code&amp;gt;mw_tags&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;mw_tag_pages&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{Warning|Avoid touching the database manually if you want to adopt the JSON route. The importer will safely handle all insertions.}}&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://mw.eckford.ca:443/index.php?title=Template:Notice&amp;diff=107</id>
		<title>Template:Notice</title>
		<link rel="alternate" type="text/html" href="https://mw.eckford.ca:443/index.php?title=Template:Notice&amp;diff=107"/>
		<updated>2026-01-22T20:13:51Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&amp;quot;mw-note&amp;quot; style=&amp;quot;margin: 1em 0; padding: 10px 15px; border-left: 5px solid #36c; background-color: #f8f9fa; border-radius: 2px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;strong&amp;gt;Upcoming Event:&amp;lt;/strong&amp;gt; {{{event_name|Annual Community Meetup}}} &amp;lt;br /&amp;gt;&lt;br /&gt;
    &amp;lt;small&amp;gt;Scheduled for: {{{date|TBA}}} at {{{location|Main Hall}}}&amp;lt;/small&amp;gt;&lt;br /&gt;
    &amp;lt;p style=&amp;quot;margin-top: 5px; font-size: 0.9em;&amp;quot;&amp;gt;{{{description|Join us for our yearly gathering to discuss upcoming wiki projects and milestones!}}}&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;noinclude&amp;gt;&lt;br /&gt;
[[Category:Templates]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://mw.eckford.ca:443/index.php?title=Template:Note&amp;diff=106</id>
		<title>Template:Note</title>
		<link rel="alternate" type="text/html" href="https://mw.eckford.ca:443/index.php?title=Template:Note&amp;diff=106"/>
		<updated>2026-01-22T19:55:47Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&amp;quot;mw-note&amp;quot; style=&amp;quot;border-left: 5px solid #36c; background-color: #eef; padding: 0.8em; margin: 1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;strong&amp;gt;Note:&amp;lt;/strong&amp;gt; {{{1}}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;noinclude&amp;gt;&lt;br /&gt;
[[Category:Templates]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://mw.eckford.ca:443/index.php?title=Template:Documentation&amp;diff=105</id>
		<title>Template:Documentation</title>
		<link rel="alternate" type="text/html" href="https://mw.eckford.ca:443/index.php?title=Template:Documentation&amp;diff=105"/>
		<updated>2026-01-22T19:55:07Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 10px; background: #f0f0f0; border: 1px solid #aaa; margin-bottom: 1em;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;This is a documentation subpage.&#039;&#039;&#039; It contains usage information, categories, and other content that is not part of the original template page.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt; include the docs with /docs &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;noinclude&amp;gt;&lt;br /&gt;
[[Category:Templates]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://mw.eckford.ca:443/index.php?title=Template:Documentation&amp;diff=104</id>
		<title>Template:Documentation</title>
		<link rel="alternate" type="text/html" href="https://mw.eckford.ca:443/index.php?title=Template:Documentation&amp;diff=104"/>
		<updated>2026-01-22T19:54:19Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 10px; background: #f0f0f0; border: 1px solid #aaa; margin-bottom: 1em;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;This is a documentation subpage.&#039;&#039;&#039; It contains usage information, categories, and other content that is not part of the original template page.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;noinclude&amp;gt;&lt;br /&gt;
[[Category:Templates]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://mw.eckford.ca:443/index.php?title=Template:Documentation&amp;diff=103</id>
		<title>Template:Documentation</title>
		<link rel="alternate" type="text/html" href="https://mw.eckford.ca:443/index.php?title=Template:Documentation&amp;diff=103"/>
		<updated>2026-01-22T19:53:53Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;float: right;&amp;quot;&amp;gt;&lt;br /&gt;
[ {{fullurl:{{PAGENAME}}|action=edit}} Edit Doc ] | [ {{fullurl:{{BASEPAGENAME}}|action=edit}} Edit Code ]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 10px; background: #f0f0f0; border: 1px solid #aaa; margin-bottom: 1em;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;This is a documentation subpage.&#039;&#039;&#039; It contains usage information, categories, and other content that is not part of the original template page.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;noinclude&amp;gt;&lt;br /&gt;
[[Category:Templates]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://mw.eckford.ca:443/index.php?title=Template:Documentation&amp;diff=102</id>
		<title>Template:Documentation</title>
		<link rel="alternate" type="text/html" href="https://mw.eckford.ca:443/index.php?title=Template:Documentation&amp;diff=102"/>
		<updated>2026-01-22T19:52:05Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 10px; background: #f0f0f0; border: 1px solid #aaa; margin-bottom: 1em;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;This is a documentation subpage.&#039;&#039;&#039; It contains usage information, categories, and other content that is not part of the original template page.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;noinclude&amp;gt;&lt;br /&gt;
[[Category:Templates]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://mw.eckford.ca:443/index.php?title=Template:Tip&amp;diff=101</id>
		<title>Template:Tip</title>
		<link rel="alternate" type="text/html" href="https://mw.eckford.ca:443/index.php?title=Template:Tip&amp;diff=101"/>
		<updated>2026-01-22T19:35:43Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&amp;quot;mw-tpl-tip&amp;quot; style=&amp;quot;margin: 1em 0; border: 1px solid #a2a9b1; background-color: #f8f9fa; padding: 10px; border-left: 10px solid #36c; display: flex; align-items: center;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;margin-right: 15px; font-size: 24px;&amp;quot;&amp;gt;💡&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;flex-grow: 1;&amp;quot;&amp;gt;&lt;br /&gt;
    &#039;&#039;&#039;Tip:&#039;&#039;&#039; {{{1|Your tip text goes here.}}}&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;noinclude&amp;gt;{{documentation}}&amp;lt;/noinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;noinclude&amp;gt;&lt;br /&gt;
[[Category:Templates]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://mw.eckford.ca:443/index.php?title=Template:Warning&amp;diff=100</id>
		<title>Template:Warning</title>
		<link rel="alternate" type="text/html" href="https://mw.eckford.ca:443/index.php?title=Template:Warning&amp;diff=100"/>
		<updated>2026-01-22T19:31:45Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;border-left: 4px solid #c00; background: #fee; padding: 10px; border-left: 10px solid #36c; display: flex; align-items: center;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;margin-right: 15px; font-size: 24px;&amp;quot;&amp;gt;⚠️&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;flex-grow: 1;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;strong&amp;gt;Warning:&amp;lt;/strong&amp;gt; {{{1}}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;noinclude&amp;gt;&lt;br /&gt;
[[Category:Templates]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://mw.eckford.ca:443/index.php?title=Template:Tip&amp;diff=99</id>
		<title>Template:Tip</title>
		<link rel="alternate" type="text/html" href="https://mw.eckford.ca:443/index.php?title=Template:Tip&amp;diff=99"/>
		<updated>2026-01-22T19:29:01Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&amp;quot;mw-tpl-tip&amp;quot; style=&amp;quot;margin: 1em 0; border: 1px solid #a2a9b1; background-color: #f8f9fa; padding: 10px; border-left: 10px solid #36c; display: flex; align-items: center;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;margin-right: 15px; font-size: 24px;&amp;quot;&amp;gt;💡&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;flex-grow: 1;&amp;quot;&amp;gt;&lt;br /&gt;
    &#039;&#039;&#039;Tip:&#039;&#039;&#039; {{{1|Your tip text goes here.}}}&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;noinclude&amp;gt;&lt;br /&gt;
[[Category:Templates]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://mw.eckford.ca:443/index.php?title=Template:Info&amp;diff=98</id>
		<title>Template:Info</title>
		<link rel="alternate" type="text/html" href="https://mw.eckford.ca:443/index.php?title=Template:Info&amp;diff=98"/>
		<updated>2026-01-22T19:28:25Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;border-left: 4px solid #3498db; background: #eaf2f8; padding: 0.8em; margin: 1 em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;strong&amp;gt;Info:&amp;lt;/strong&amp;gt; {{{1}}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;noinclude&amp;gt;&lt;br /&gt;
[[Category:Templates]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://mw.eckford.ca:443/index.php?title=Template:Warning&amp;diff=97</id>
		<title>Template:Warning</title>
		<link rel="alternate" type="text/html" href="https://mw.eckford.ca:443/index.php?title=Template:Warning&amp;diff=97"/>
		<updated>2026-01-22T19:26:55Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;border-left: 4px solid #c00; background: #fee; padding: 0.8em; margin: 1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;strong&amp;gt;Warning:&amp;lt;/strong&amp;gt; {{{1}}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;noinclude&amp;gt;&lt;br /&gt;
[[Category:Templates]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://mw.eckford.ca:443/index.php?title=Template:Warning&amp;diff=96</id>
		<title>Template:Warning</title>
		<link rel="alternate" type="text/html" href="https://mw.eckford.ca:443/index.php?title=Template:Warning&amp;diff=96"/>
		<updated>2026-01-22T19:26:29Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;border-left: 4px solid #c00; background: #fee; padding: 0.8em; margin: 1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;strong&amp;gt;Warning:&amp;lt;/strong&amp;gt; {{{1}}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;noinclude&amp;gt;&lt;br /&gt;
[[Category:Templates]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://mw.eckford.ca:443/index.php?title=Template:Tip&amp;diff=95</id>
		<title>Template:Tip</title>
		<link rel="alternate" type="text/html" href="https://mw.eckford.ca:443/index.php?title=Template:Tip&amp;diff=95"/>
		<updated>2026-01-22T19:24:04Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&amp;quot;mw-tpl-tip&amp;quot; style=&amp;quot;margin: 1em 0; border: 1px solid #a2a9b1; background-color: #f8f9fa; padding: 10px; border-left: 10px solid #36c; display: flex; align-items: center;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;margin-right: 15px; font-size: 24px;&amp;quot;&amp;gt;💡&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;flex-grow: 1;&amp;quot;&amp;gt;&lt;br /&gt;
    &#039;&#039;&#039;Tip:&#039;&#039;&#039; {{{1|Your tip text goes here.}}}&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;noinclude&amp;gt;&lt;br /&gt;
[[Category:Templates]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://mw.eckford.ca:443/index.php?title=Template:Notice&amp;diff=94</id>
		<title>Template:Notice</title>
		<link rel="alternate" type="text/html" href="https://mw.eckford.ca:443/index.php?title=Template:Notice&amp;diff=94"/>
		<updated>2026-01-22T19:22:46Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-note&amp;quot; style=&amp;quot;border-left: 5px solid #36c; background-color: #eef; padding: 0.8em; margin: 1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;strong&amp;gt;Notice:&amp;lt;/strong&amp;gt; {{{1}}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;noinclude&amp;gt;&lt;br /&gt;
&amp;lt;h3&amp;gt;Usage:&amp;lt;/h3&amp;gt;&lt;br /&gt;
To display the text as above just add the call from your page in this format. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{{Notice|This is helpful context.}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;noinclude&amp;gt;&lt;br /&gt;
[[Category:Templates]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://mw.eckford.ca:443/index.php?title=Template:Documentation&amp;diff=93</id>
		<title>Template:Documentation</title>
		<link rel="alternate" type="text/html" href="https://mw.eckford.ca:443/index.php?title=Template:Documentation&amp;diff=93"/>
		<updated>2026-01-22T19:22:16Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!--T:4--&amp;gt;&lt;br /&gt;
The simplest use of templates is as follows: Create a page called &amp;lt;tvar name=1&amp;gt;&amp;lt;code&amp;gt;Template:Welcome&amp;lt;/code&amp;gt;&amp;lt;/tvar&amp;gt; with the content below:&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;translate&amp;gt;&amp;lt;!--T:5--&amp;gt; Hello! Welcome to the wiki.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
&amp;lt;!--T:6--&amp;gt;&lt;br /&gt;
You have created your first template! Now, insert the code below in a new page:&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;noinclude&amp;gt;&lt;br /&gt;
[[Category:Templates]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://mw.eckford.ca:443/index.php?title=Template:Hatnote&amp;diff=92</id>
		<title>Template:Hatnote</title>
		<link rel="alternate" type="text/html" href="https://mw.eckford.ca:443/index.php?title=Template:Hatnote&amp;diff=92"/>
		<updated>2026-01-22T19:22:02Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div role=&amp;quot;note&amp;quot; class=&amp;quot;hatnote&amp;quot; style=&amp;quot;font-style: italic; margin-bottom: 0.5em; padding-left: 1.6em;&amp;quot;&amp;gt;&lt;br /&gt;
{{{1}}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;noinclude&amp;gt;&lt;br /&gt;
[[Category:Templates]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://mw.eckford.ca:443/index.php?title=Template:Hatnote&amp;diff=91</id>
		<title>Template:Hatnote</title>
		<link rel="alternate" type="text/html" href="https://mw.eckford.ca:443/index.php?title=Template:Hatnote&amp;diff=91"/>
		<updated>2026-01-22T19:17:38Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div role=&amp;quot;note&amp;quot; class=&amp;quot;hatnote&amp;quot; style=&amp;quot;font-style: italic; margin-bottom: 0.5em; padding-left: 1.6em;&amp;quot;&amp;gt;&lt;br /&gt;
{{{1}}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:Category:Templates]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://mw.eckford.ca:443/index.php?title=Template:Info&amp;diff=85</id>
		<title>Template:Info</title>
		<link rel="alternate" type="text/html" href="https://mw.eckford.ca:443/index.php?title=Template:Info&amp;diff=85"/>
		<updated>2026-01-22T18:51:35Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;border-left: 4px solid #3498db; background: #eaf2f8; padding: 0.8em; margin: 1 em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;strong&amp;gt;Info:&amp;lt;/strong&amp;gt; {{{1}}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:Category:Templates]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://mw.eckford.ca:443/index.php?title=Purge_Main_Page&amp;diff=56</id>
		<title>Purge Main Page</title>
		<link rel="alternate" type="text/html" href="https://mw.eckford.ca:443/index.php?title=Purge_Main_Page&amp;diff=56"/>
		<updated>2026-01-22T01:51:33Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{fullurl:Main Page|action=purge}}&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://mw.eckford.ca:443/index.php?title=MediaWiki:Purge-main-url&amp;diff=55</id>
		<title>MediaWiki:Purge-main-url</title>
		<link rel="alternate" type="text/html" href="https://mw.eckford.ca:443/index.php?title=MediaWiki:Purge-main-url&amp;diff=55"/>
		<updated>2026-01-22T01:51:00Z</updated>

		<summary type="html">&lt;p&gt;Admin: Created page with &amp;quot;{{fullurl:Main Page|action=purge}}&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{fullurl:Main Page|action=purge}}&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://mw.eckford.ca:443/index.php?title=Purge_Main_Page&amp;diff=54</id>
		<title>Purge Main Page</title>
		<link rel="alternate" type="text/html" href="https://mw.eckford.ca:443/index.php?title=Purge_Main_Page&amp;diff=54"/>
		<updated>2026-01-22T01:48:04Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/index.php?title=Main_Page&amp;amp;action=purge&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://mw.eckford.ca:443/index.php?title=Purge_Main_Page&amp;diff=53</id>
		<title>Purge Main Page</title>
		<link rel="alternate" type="text/html" href="https://mw.eckford.ca:443/index.php?title=Purge_Main_Page&amp;diff=53"/>
		<updated>2026-01-22T01:46:14Z</updated>

		<summary type="html">&lt;p&gt;Admin: Created page with &amp;quot;Purge Main Page&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Purge Main Page&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://mw.eckford.ca:443/index.php?title=MediaWiki:Purge-main&amp;diff=52</id>
		<title>MediaWiki:Purge-main</title>
		<link rel="alternate" type="text/html" href="https://mw.eckford.ca:443/index.php?title=MediaWiki:Purge-main&amp;diff=52"/>
		<updated>2026-01-22T01:45:12Z</updated>

		<summary type="html">&lt;p&gt;Admin: Created page with &amp;quot;Purge Main Page&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Purge Main Page&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://mw.eckford.ca:443/index.php?title=MediaWiki:Sidebar&amp;diff=51</id>
		<title>MediaWiki:Sidebar</title>
		<link rel="alternate" type="text/html" href="https://mw.eckford.ca:443/index.php?title=MediaWiki:Sidebar&amp;diff=51"/>
		<updated>2026-01-22T01:44:41Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
* navigation&lt;br /&gt;
** mainpage|mainpage-description&lt;br /&gt;
** recentchanges-url|recentchanges&lt;br /&gt;
** randompage-url|randompage&lt;br /&gt;
** helppage|help-mediawiki&lt;br /&gt;
** MediaWiki_Tips|MW for the Sh1re&lt;br /&gt;
** purge-main|Purge Main Page&lt;br /&gt;
* SEARCH&lt;br /&gt;
* TOOLBOX&lt;br /&gt;
* LANGUAGES&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://mw.eckford.ca:443/index.php?title=Main_Page&amp;diff=50</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://mw.eckford.ca:443/index.php?title=Main_Page&amp;diff=50"/>
		<updated>2026-01-22T00:58:06Z</updated>

		<summary type="html">&lt;p&gt;Admin: /* Import CustomQueryPage */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;strong&amp;gt;MediaWiki has been installed.&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Import CustomQueryPage ==&lt;br /&gt;
This install is originally intended for the ROUTINE Manuals publication workflow. That&#039;s all it does now, but hey, it&#039;s a good place to keep notes too. Did you know for MediaWiki you create a page by writing the name in the address bar? How tricky is that?&lt;br /&gt;
&lt;br /&gt;
== Let&#039;s Get Started ==&lt;br /&gt;
&lt;br /&gt;
* [https://mw.eckford.ca/downloads/CustomQueryPage-mw1359.tar.gz CustomQueryPage for mw1359]&lt;br /&gt;
&lt;br /&gt;
=== Installing CustomQueryPage ===&lt;br /&gt;
* Download the bundle: &amp;lt;code&amp;gt;wget https://mw.eckford.ca/downloads/CustomQueryPage-mw1359.tar.gz&amp;lt;/code&amp;gt;&lt;br /&gt;
* Extract it into your extensions folder:&lt;br /&gt;
** &amp;lt;code&amp;gt;tar -xzf CustomQueryPage-mw1359.tar.gz -C /srv/mediawiki/extensions&amp;lt;/code&amp;gt;&lt;br /&gt;
* Edit &amp;lt;code&amp;gt;LocalSettings.php&amp;lt;/code&amp;gt; and add &amp;lt;code&amp;gt;wfLoadExtension( &#039;CustomQueryPage&#039; );&amp;lt;/code&amp;gt;&lt;br /&gt;
* Run &amp;lt;code&amp;gt;php maintenance/update.php --quick&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Visit &amp;lt;code&amp;gt;Special:CustomQuerySettings&amp;lt;/code&amp;gt;, set the ROUTINE tag (e.g., &amp;lt;code&amp;gt;ROUTINE_4.110&amp;lt;/code&amp;gt;), and confirm &amp;lt;code&amp;gt;Special:ApprovedManuals&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Quick Start: ROUTINE Management =&lt;br /&gt;
&lt;br /&gt;
=== 1. Seed the ROUTINE in the DB ===&lt;br /&gt;
Before Lisa touches the UI, make sure the database has ROUTINE data.&lt;br /&gt;
&lt;br /&gt;
* Use the import script or manual SQL method.&lt;br /&gt;
* Required tables:&lt;br /&gt;
** &amp;lt;code&amp;gt;mw_tags&amp;lt;/code&amp;gt; — one row per ROUTINE (e.g., &amp;lt;code&amp;gt;ROUTINE_4.111&amp;lt;/code&amp;gt;).&lt;br /&gt;
** &amp;lt;code&amp;gt;mw_tag_pages&amp;lt;/code&amp;gt; — one row per approved page.&lt;br /&gt;
* If needed, run: &amp;lt;code&amp;gt;php maintenance/update.php --quick&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Note|Only run &amp;lt;code&amp;gt;update.php&amp;lt;/code&amp;gt; if &amp;lt;code&amp;gt;mw_customquerypage_settings&amp;lt;/code&amp;gt; doesn&#039;t exist yet.}}&lt;br /&gt;
&lt;br /&gt;
=== 2. Use the Special Page to Switch or Clone ===&lt;br /&gt;
&lt;br /&gt;
* Go to: &amp;lt;code&amp;gt;Special:CustomQuerySettings&amp;lt;/code&amp;gt;&lt;br /&gt;
* Two options:&lt;br /&gt;
** &#039;&#039;&#039;Set Active Tag&#039;&#039;&#039; — type &amp;lt;code&amp;gt;ROUTINE_4.111&amp;lt;/code&amp;gt;, then Save.&lt;br /&gt;
** &#039;&#039;&#039;Clone ROUTINE → New ROUTINE&#039;&#039;&#039;:&lt;br /&gt;
*** From: &amp;lt;code&amp;gt;ROUTINE_4.110&amp;lt;/code&amp;gt;&lt;br /&gt;
*** To: &amp;lt;code&amp;gt;ROUTINE_4.111&amp;lt;/code&amp;gt;&lt;br /&gt;
*** Submit → this copies rows and updates the active tag.&lt;br /&gt;
&lt;br /&gt;
=== 3. Verify the Result ===&lt;br /&gt;
&lt;br /&gt;
* Visit: &amp;lt;code&amp;gt;Special:ApprovedManuals&amp;lt;/code&amp;gt;&lt;br /&gt;
* Confirm the listing shows &amp;lt;code&amp;gt;ROUTINE_4.111&amp;lt;/code&amp;gt;&lt;br /&gt;
* Lisa can now publish or review the approved manuals.&lt;br /&gt;
* No DB access required.&lt;br /&gt;
&lt;br /&gt;
= Optional: JSON/API Importer =&lt;br /&gt;
&lt;br /&gt;
If you&#039;re ready to skip the SQL import:&lt;br /&gt;
&lt;br /&gt;
* Define a JSON payload that includes:&lt;br /&gt;
** &amp;lt;code&amp;gt;page_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;rev_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;deploy_comment&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;wikitext&amp;lt;/code&amp;gt;, etc.&lt;br /&gt;
* Build a:&lt;br /&gt;
** REST endpoint, or&lt;br /&gt;
** Action API module, or&lt;br /&gt;
** Maintenance script that reads JSON&lt;br /&gt;
&lt;br /&gt;
Once defined, MediaWiki can import directly into &amp;lt;code&amp;gt;mw_tags&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;mw_tag_pages&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{Warning|Avoid touching the database manually if you want to adopt the JSON route. The importer will safely handle all insertions.}}&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://mw.eckford.ca:443/index.php?title=Main_Page&amp;diff=49</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://mw.eckford.ca:443/index.php?title=Main_Page&amp;diff=49"/>
		<updated>2026-01-22T00:57:29Z</updated>

		<summary type="html">&lt;p&gt;Admin: This install is originally intended for the ROUTINE Manuals publication workflow.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;strong&amp;gt;MediaWiki has been installed.&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Import CustomQueryPage ==&lt;br /&gt;
This install is originally intended for the ROUTINE Manuals publication workflow. That&#039;s all it does now, but hey, it&#039;s a good place to keep notes too. Did you know for MediaWiki you create a page by writing the name in the address bar? How tricky is that?&lt;br /&gt;
&lt;br /&gt;
* [https://mw.eckford.ca/downloads/CustomQueryPage-mw1359.tar.gz CustomQueryPage for mw1359]&lt;br /&gt;
&lt;br /&gt;
=== Installing CustomQueryPage ===&lt;br /&gt;
* Download the bundle: &amp;lt;code&amp;gt;wget https://mw.eckford.ca/downloads/CustomQueryPage-mw1359.tar.gz&amp;lt;/code&amp;gt;&lt;br /&gt;
* Extract it into your extensions folder:&lt;br /&gt;
** &amp;lt;code&amp;gt;tar -xzf CustomQueryPage-mw1359.tar.gz -C /srv/mediawiki/extensions&amp;lt;/code&amp;gt;&lt;br /&gt;
* Edit &amp;lt;code&amp;gt;LocalSettings.php&amp;lt;/code&amp;gt; and add &amp;lt;code&amp;gt;wfLoadExtension( &#039;CustomQueryPage&#039; );&amp;lt;/code&amp;gt;&lt;br /&gt;
* Run &amp;lt;code&amp;gt;php maintenance/update.php --quick&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Visit &amp;lt;code&amp;gt;Special:CustomQuerySettings&amp;lt;/code&amp;gt;, set the ROUTINE tag (e.g., &amp;lt;code&amp;gt;ROUTINE_4.110&amp;lt;/code&amp;gt;), and confirm &amp;lt;code&amp;gt;Special:ApprovedManuals&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Quick Start: ROUTINE Management =&lt;br /&gt;
&lt;br /&gt;
=== 1. Seed the ROUTINE in the DB ===&lt;br /&gt;
Before Lisa touches the UI, make sure the database has ROUTINE data.&lt;br /&gt;
&lt;br /&gt;
* Use the import script or manual SQL method.&lt;br /&gt;
* Required tables:&lt;br /&gt;
** &amp;lt;code&amp;gt;mw_tags&amp;lt;/code&amp;gt; — one row per ROUTINE (e.g., &amp;lt;code&amp;gt;ROUTINE_4.111&amp;lt;/code&amp;gt;).&lt;br /&gt;
** &amp;lt;code&amp;gt;mw_tag_pages&amp;lt;/code&amp;gt; — one row per approved page.&lt;br /&gt;
* If needed, run: &amp;lt;code&amp;gt;php maintenance/update.php --quick&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Note|Only run &amp;lt;code&amp;gt;update.php&amp;lt;/code&amp;gt; if &amp;lt;code&amp;gt;mw_customquerypage_settings&amp;lt;/code&amp;gt; doesn&#039;t exist yet.}}&lt;br /&gt;
&lt;br /&gt;
=== 2. Use the Special Page to Switch or Clone ===&lt;br /&gt;
&lt;br /&gt;
* Go to: &amp;lt;code&amp;gt;Special:CustomQuerySettings&amp;lt;/code&amp;gt;&lt;br /&gt;
* Two options:&lt;br /&gt;
** &#039;&#039;&#039;Set Active Tag&#039;&#039;&#039; — type &amp;lt;code&amp;gt;ROUTINE_4.111&amp;lt;/code&amp;gt;, then Save.&lt;br /&gt;
** &#039;&#039;&#039;Clone ROUTINE → New ROUTINE&#039;&#039;&#039;:&lt;br /&gt;
*** From: &amp;lt;code&amp;gt;ROUTINE_4.110&amp;lt;/code&amp;gt;&lt;br /&gt;
*** To: &amp;lt;code&amp;gt;ROUTINE_4.111&amp;lt;/code&amp;gt;&lt;br /&gt;
*** Submit → this copies rows and updates the active tag.&lt;br /&gt;
&lt;br /&gt;
=== 3. Verify the Result ===&lt;br /&gt;
&lt;br /&gt;
* Visit: &amp;lt;code&amp;gt;Special:ApprovedManuals&amp;lt;/code&amp;gt;&lt;br /&gt;
* Confirm the listing shows &amp;lt;code&amp;gt;ROUTINE_4.111&amp;lt;/code&amp;gt;&lt;br /&gt;
* Lisa can now publish or review the approved manuals.&lt;br /&gt;
* No DB access required.&lt;br /&gt;
&lt;br /&gt;
= Optional: JSON/API Importer =&lt;br /&gt;
&lt;br /&gt;
If you&#039;re ready to skip the SQL import:&lt;br /&gt;
&lt;br /&gt;
* Define a JSON payload that includes:&lt;br /&gt;
** &amp;lt;code&amp;gt;page_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;rev_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;deploy_comment&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;wikitext&amp;lt;/code&amp;gt;, etc.&lt;br /&gt;
* Build a:&lt;br /&gt;
** REST endpoint, or&lt;br /&gt;
** Action API module, or&lt;br /&gt;
** Maintenance script that reads JSON&lt;br /&gt;
&lt;br /&gt;
Once defined, MediaWiki can import directly into &amp;lt;code&amp;gt;mw_tags&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;mw_tag_pages&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{Warning|Avoid touching the database manually if you want to adopt the JSON route. The importer will safely handle all insertions.}}&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://mw.eckford.ca:443/index.php?title=MediaWiki_Tips&amp;diff=48</id>
		<title>MediaWiki Tips</title>
		<link rel="alternate" type="text/html" href="https://mw.eckford.ca:443/index.php?title=MediaWiki_Tips&amp;diff=48"/>
		<updated>2026-01-22T00:52:40Z</updated>

		<summary type="html">&lt;p&gt;Admin: /* See also */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
= MediaWiki Tips =&lt;br /&gt;
&lt;br /&gt;
This page collects useful formatting techniques, admin tricks, and style conventions used across the Sh1re Commons and related wikis (e.g. Eckfordc). Contributions welcome.&lt;br /&gt;
&lt;br /&gt;
== Naming, Linking, and Underscores ==&lt;br /&gt;
&lt;br /&gt;
MediaWiki converts spaces to underscores (`MediaWiki_Tips` → `MediaWiki Tips`).&lt;br /&gt;
&lt;br /&gt;
You can also use internal links like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[[MediaWiki Tips]]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the page doesn’t exist, it shows up as a red link — clicking it lets you create the page directly.&lt;br /&gt;
&lt;br /&gt;
== Template Styling ==&lt;br /&gt;
&lt;br /&gt;
=== {{Note}} ===&lt;br /&gt;
&lt;br /&gt;
{{Note|Use this template to show helpful callouts like this one.}}&lt;br /&gt;
&lt;br /&gt;
Create or edit the template here: [[Template:Note]]&lt;br /&gt;
&lt;br /&gt;
Paste this code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 4px solid #36c; background: #eef; padding: 0.8em; margin: 1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;strong&amp;gt;Note:&amp;lt;/strong&amp;gt; {{{1}}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== {{Warning}} ===&lt;br /&gt;
&lt;br /&gt;
{{Warning|Use this template to flag risky actions, like editing core DB tables.}}&lt;br /&gt;
&lt;br /&gt;
Create/edit [[Template:Warning]] with this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 4px solid #c00; background: #fee; padding: 0.8em; margin: 1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;strong&amp;gt;Warning:&amp;lt;/strong&amp;gt; {{{1}}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Zero-JS Enhancements ==&lt;br /&gt;
&lt;br /&gt;
This wiki stack is hardened for legacy environments — no JavaScript required. Where others use JS libraries, we prefer:&lt;br /&gt;
&lt;br /&gt;
* **Pure HTML/CSS** navigation boxes and style blocks&lt;br /&gt;
* **Table of contents** via headings (e.g. `== Section ==`)&lt;br /&gt;
* **No collapsibles or toggles** (unless emulated with `&amp;lt;details&amp;gt;` in supported browsers)&lt;br /&gt;
* Minimal inline CSS for color blocks, tooltips, and alerts&lt;br /&gt;
&lt;br /&gt;
== Recommended Conventions ==&lt;br /&gt;
&lt;br /&gt;
* Use `&amp;lt;code&amp;gt;` for inline paths and scripts: &amp;lt;code&amp;gt;php maintenance/update.php&amp;lt;/code&amp;gt;&lt;br /&gt;
* Use `&amp;lt;pre&amp;gt;` or `&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;` for CLI blocks&lt;br /&gt;
* All admin helper pages should be tagged like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[[Category:Documentation]]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[Special:CustomQuerySettings]] — ROUTINE tag management&lt;br /&gt;
* [[Special:ApprovedManuals]] — View approved manuals by tag&lt;br /&gt;
* [[Template:Note]] / [[Template:Warning]] — for styling callouts&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Documentation]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://mw.eckford.ca:443/index.php?title=MediaWiki:Sidebar&amp;diff=47</id>
		<title>MediaWiki:Sidebar</title>
		<link rel="alternate" type="text/html" href="https://mw.eckford.ca:443/index.php?title=MediaWiki:Sidebar&amp;diff=47"/>
		<updated>2026-01-22T00:52:01Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
* navigation&lt;br /&gt;
** mainpage|mainpage-description&lt;br /&gt;
** recentchanges-url|recentchanges&lt;br /&gt;
** randompage-url|randompage&lt;br /&gt;
** helppage|help-mediawiki&lt;br /&gt;
** MediaWiki_Tips|MW for the Sh1re&lt;br /&gt;
* SEARCH&lt;br /&gt;
* TOOLBOX&lt;br /&gt;
* LANGUAGES&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://mw.eckford.ca:443/index.php?title=MediaWiki:Sidebar&amp;diff=46</id>
		<title>MediaWiki:Sidebar</title>
		<link rel="alternate" type="text/html" href="https://mw.eckford.ca:443/index.php?title=MediaWiki:Sidebar&amp;diff=46"/>
		<updated>2026-01-22T00:50:33Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
* navigation&lt;br /&gt;
** mainpage|mainpage-description&lt;br /&gt;
** recentchanges-url|recentchanges&lt;br /&gt;
** randompage-url|randompage&lt;br /&gt;
** helppage|help-mediawiki&lt;br /&gt;
** MediaWiki_Tips|MW-Tips&lt;br /&gt;
* SEARCH&lt;br /&gt;
* TOOLBOX&lt;br /&gt;
* LANGUAGES&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://mw.eckford.ca:443/index.php?title=MediaWiki:Sidebar&amp;diff=45</id>
		<title>MediaWiki:Sidebar</title>
		<link rel="alternate" type="text/html" href="https://mw.eckford.ca:443/index.php?title=MediaWiki:Sidebar&amp;diff=45"/>
		<updated>2026-01-22T00:49:48Z</updated>

		<summary type="html">&lt;p&gt;Admin: Created page with &amp;quot; * navigation ** mainpage|mainpage-description ** recentchanges-url|recentchanges ** randompage-url|randompage ** helppage|help-mediawiki ** MediaWiki_Tips|Documentation * SEARCH * TOOLBOX * LANGUAGES&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
* navigation&lt;br /&gt;
** mainpage|mainpage-description&lt;br /&gt;
** recentchanges-url|recentchanges&lt;br /&gt;
** randompage-url|randompage&lt;br /&gt;
** helppage|help-mediawiki&lt;br /&gt;
** MediaWiki_Tips|Documentation&lt;br /&gt;
* SEARCH&lt;br /&gt;
* TOOLBOX&lt;br /&gt;
* LANGUAGES&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://mw.eckford.ca:443/index.php?title=MediaWiki_Tips&amp;diff=44</id>
		<title>MediaWiki Tips</title>
		<link rel="alternate" type="text/html" href="https://mw.eckford.ca:443/index.php?title=MediaWiki_Tips&amp;diff=44"/>
		<updated>2026-01-22T00:46:40Z</updated>

		<summary type="html">&lt;p&gt;Admin: /* See also */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
= MediaWiki Tips =&lt;br /&gt;
&lt;br /&gt;
This page collects useful formatting techniques, admin tricks, and style conventions used across the Sh1re Commons and related wikis (e.g. Eckfordc). Contributions welcome.&lt;br /&gt;
&lt;br /&gt;
== Naming, Linking, and Underscores ==&lt;br /&gt;
&lt;br /&gt;
MediaWiki converts spaces to underscores (`MediaWiki_Tips` → `MediaWiki Tips`).&lt;br /&gt;
&lt;br /&gt;
You can also use internal links like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[[MediaWiki Tips]]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the page doesn’t exist, it shows up as a red link — clicking it lets you create the page directly.&lt;br /&gt;
&lt;br /&gt;
== Template Styling ==&lt;br /&gt;
&lt;br /&gt;
=== {{Note}} ===&lt;br /&gt;
&lt;br /&gt;
{{Note|Use this template to show helpful callouts like this one.}}&lt;br /&gt;
&lt;br /&gt;
Create or edit the template here: [[Template:Note]]&lt;br /&gt;
&lt;br /&gt;
Paste this code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 4px solid #36c; background: #eef; padding: 0.8em; margin: 1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;strong&amp;gt;Note:&amp;lt;/strong&amp;gt; {{{1}}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== {{Warning}} ===&lt;br /&gt;
&lt;br /&gt;
{{Warning|Use this template to flag risky actions, like editing core DB tables.}}&lt;br /&gt;
&lt;br /&gt;
Create/edit [[Template:Warning]] with this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 4px solid #c00; background: #fee; padding: 0.8em; margin: 1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;strong&amp;gt;Warning:&amp;lt;/strong&amp;gt; {{{1}}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Zero-JS Enhancements ==&lt;br /&gt;
&lt;br /&gt;
This wiki stack is hardened for legacy environments — no JavaScript required. Where others use JS libraries, we prefer:&lt;br /&gt;
&lt;br /&gt;
* **Pure HTML/CSS** navigation boxes and style blocks&lt;br /&gt;
* **Table of contents** via headings (e.g. `== Section ==`)&lt;br /&gt;
* **No collapsibles or toggles** (unless emulated with `&amp;lt;details&amp;gt;` in supported browsers)&lt;br /&gt;
* Minimal inline CSS for color blocks, tooltips, and alerts&lt;br /&gt;
&lt;br /&gt;
== Recommended Conventions ==&lt;br /&gt;
&lt;br /&gt;
* Use `&amp;lt;code&amp;gt;` for inline paths and scripts: &amp;lt;code&amp;gt;php maintenance/update.php&amp;lt;/code&amp;gt;&lt;br /&gt;
* Use `&amp;lt;pre&amp;gt;` or `&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;` for CLI blocks&lt;br /&gt;
* All admin helper pages should be tagged like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[[Category:Documentation]]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[Special:CustomQuerySettings]] — ROUTINE tag management&lt;br /&gt;
* [[Special:ApprovedManuals]] — View approved manuals by tag&lt;br /&gt;
* [[Special:ApprovedManuals]] - &lt;br /&gt;
* [[Template:Note]] / [[Template:Warning]] — for styling callouts&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Documentation]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://mw.eckford.ca:443/index.php?title=MediaWiki_Tips&amp;diff=43</id>
		<title>MediaWiki Tips</title>
		<link rel="alternate" type="text/html" href="https://mw.eckford.ca:443/index.php?title=MediaWiki_Tips&amp;diff=43"/>
		<updated>2026-01-22T00:45:01Z</updated>

		<summary type="html">&lt;p&gt;Admin: Created page with &amp;quot; = MediaWiki Tips =  This page collects useful formatting techniques, admin tricks, and style conventions used across the Sh1re Commons and related wikis (e.g. Eckfordc). Contributions welcome.  == Naming, Linking, and Underscores ==  MediaWiki converts spaces to underscores (`MediaWiki_Tips` → `MediaWiki Tips`).  You can also use internal links like this:  &amp;lt;pre&amp;gt; MediaWiki Tips &amp;lt;/pre&amp;gt;  If the page doesn’t exist, it shows up as a red link — clicking it lets you...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
= MediaWiki Tips =&lt;br /&gt;
&lt;br /&gt;
This page collects useful formatting techniques, admin tricks, and style conventions used across the Sh1re Commons and related wikis (e.g. Eckfordc). Contributions welcome.&lt;br /&gt;
&lt;br /&gt;
== Naming, Linking, and Underscores ==&lt;br /&gt;
&lt;br /&gt;
MediaWiki converts spaces to underscores (`MediaWiki_Tips` → `MediaWiki Tips`).&lt;br /&gt;
&lt;br /&gt;
You can also use internal links like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[[MediaWiki Tips]]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the page doesn’t exist, it shows up as a red link — clicking it lets you create the page directly.&lt;br /&gt;
&lt;br /&gt;
== Template Styling ==&lt;br /&gt;
&lt;br /&gt;
=== {{Note}} ===&lt;br /&gt;
&lt;br /&gt;
{{Note|Use this template to show helpful callouts like this one.}}&lt;br /&gt;
&lt;br /&gt;
Create or edit the template here: [[Template:Note]]&lt;br /&gt;
&lt;br /&gt;
Paste this code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 4px solid #36c; background: #eef; padding: 0.8em; margin: 1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;strong&amp;gt;Note:&amp;lt;/strong&amp;gt; {{{1}}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== {{Warning}} ===&lt;br /&gt;
&lt;br /&gt;
{{Warning|Use this template to flag risky actions, like editing core DB tables.}}&lt;br /&gt;
&lt;br /&gt;
Create/edit [[Template:Warning]] with this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 4px solid #c00; background: #fee; padding: 0.8em; margin: 1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;strong&amp;gt;Warning:&amp;lt;/strong&amp;gt; {{{1}}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Zero-JS Enhancements ==&lt;br /&gt;
&lt;br /&gt;
This wiki stack is hardened for legacy environments — no JavaScript required. Where others use JS libraries, we prefer:&lt;br /&gt;
&lt;br /&gt;
* **Pure HTML/CSS** navigation boxes and style blocks&lt;br /&gt;
* **Table of contents** via headings (e.g. `== Section ==`)&lt;br /&gt;
* **No collapsibles or toggles** (unless emulated with `&amp;lt;details&amp;gt;` in supported browsers)&lt;br /&gt;
* Minimal inline CSS for color blocks, tooltips, and alerts&lt;br /&gt;
&lt;br /&gt;
== Recommended Conventions ==&lt;br /&gt;
&lt;br /&gt;
* Use `&amp;lt;code&amp;gt;` for inline paths and scripts: &amp;lt;code&amp;gt;php maintenance/update.php&amp;lt;/code&amp;gt;&lt;br /&gt;
* Use `&amp;lt;pre&amp;gt;` or `&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;` for CLI blocks&lt;br /&gt;
* All admin helper pages should be tagged like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[[Category:Documentation]]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[Special:CustomQuerySettings]] — ROUTINE tag management&lt;br /&gt;
* [[Special:ApprovedManuals]] — View approved manuals by tag&lt;br /&gt;
* [[Template:Note]] / [[Template:Warning]] — for styling callouts&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Documentation]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://mw.eckford.ca:443/index.php?title=Template:Warning&amp;diff=42</id>
		<title>Template:Warning</title>
		<link rel="alternate" type="text/html" href="https://mw.eckford.ca:443/index.php?title=Template:Warning&amp;diff=42"/>
		<updated>2026-01-22T00:15:09Z</updated>

		<summary type="html">&lt;p&gt;Admin: Created page with &amp;quot;&amp;lt;div style=&amp;quot;border-left: 4px solid #c00; background: #fee; padding: 0.8em; margin: 1em 0;&amp;quot;&amp;gt; &amp;lt;strong&amp;gt;Warning:&amp;lt;/strong&amp;gt; {{{1}}} &amp;lt;/div&amp;gt;&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;border-left: 4px solid #c00; background: #fee; padding: 0.8em; margin: 1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;strong&amp;gt;Warning:&amp;lt;/strong&amp;gt; {{{1}}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://mw.eckford.ca:443/index.php?title=Main_Page&amp;diff=41</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://mw.eckford.ca:443/index.php?title=Main_Page&amp;diff=41"/>
		<updated>2026-01-22T00:12:50Z</updated>

		<summary type="html">&lt;p&gt;Admin: add templates&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;strong&amp;gt;MediaWiki has been installed.&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Consult the [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents User&#039;s Guide] for information on using the wiki software.&lt;br /&gt;
&lt;br /&gt;
== Getting started ==&lt;br /&gt;
* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Configuration settings list]&lt;br /&gt;
* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki FAQ]&lt;br /&gt;
* [https://lists.wikimedia.org/postorius/lists/mediawiki-announce.lists.wikimedia.org/ MediaWiki release mailing list]&lt;br /&gt;
* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localise MediaWiki for your language]&lt;br /&gt;
* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Learn how to combat spam on your wiki]&lt;br /&gt;
&lt;br /&gt;
== Import CustomQueryPage ==&lt;br /&gt;
* [https://mw.eckford.ca/downloads/CustomQueryPage-mw1359.tar.gz CustomQueryPage for mw1359]&lt;br /&gt;
&lt;br /&gt;
=== Installing CustomQueryPage ===&lt;br /&gt;
* Download the bundle: &amp;lt;code&amp;gt;wget https://mw.eckford.ca/downloads/CustomQueryPage-mw1359.tar.gz&amp;lt;/code&amp;gt;&lt;br /&gt;
* Extract it into your extensions folder:&lt;br /&gt;
** &amp;lt;code&amp;gt;tar -xzf CustomQueryPage-mw1359.tar.gz -C /srv/mediawiki/extensions&amp;lt;/code&amp;gt;&lt;br /&gt;
* Edit &amp;lt;code&amp;gt;LocalSettings.php&amp;lt;/code&amp;gt; and add &amp;lt;code&amp;gt;wfLoadExtension( &#039;CustomQueryPage&#039; );&amp;lt;/code&amp;gt;&lt;br /&gt;
* Run &amp;lt;code&amp;gt;php maintenance/update.php --quick&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Visit &amp;lt;code&amp;gt;Special:CustomQuerySettings&amp;lt;/code&amp;gt;, set the ROUTINE tag (e.g., &amp;lt;code&amp;gt;ROUTINE_4.110&amp;lt;/code&amp;gt;), and confirm &amp;lt;code&amp;gt;Special:ApprovedManuals&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Quick Start: ROUTINE Management =&lt;br /&gt;
&lt;br /&gt;
=== 1. Seed the ROUTINE in the DB ===&lt;br /&gt;
Before Lisa touches the UI, make sure the database has ROUTINE data.&lt;br /&gt;
&lt;br /&gt;
* Use the import script or manual SQL method.&lt;br /&gt;
* Required tables:&lt;br /&gt;
** &amp;lt;code&amp;gt;mw_tags&amp;lt;/code&amp;gt; — one row per ROUTINE (e.g., &amp;lt;code&amp;gt;ROUTINE_4.111&amp;lt;/code&amp;gt;).&lt;br /&gt;
** &amp;lt;code&amp;gt;mw_tag_pages&amp;lt;/code&amp;gt; — one row per approved page.&lt;br /&gt;
* If needed, run: &amp;lt;code&amp;gt;php maintenance/update.php --quick&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Note|Only run &amp;lt;code&amp;gt;update.php&amp;lt;/code&amp;gt; if &amp;lt;code&amp;gt;mw_customquerypage_settings&amp;lt;/code&amp;gt; doesn&#039;t exist yet.}}&lt;br /&gt;
&lt;br /&gt;
=== 2. Use the Special Page to Switch or Clone ===&lt;br /&gt;
&lt;br /&gt;
* Go to: &amp;lt;code&amp;gt;Special:CustomQuerySettings&amp;lt;/code&amp;gt;&lt;br /&gt;
* Two options:&lt;br /&gt;
** &#039;&#039;&#039;Set Active Tag&#039;&#039;&#039; — type &amp;lt;code&amp;gt;ROUTINE_4.111&amp;lt;/code&amp;gt;, then Save.&lt;br /&gt;
** &#039;&#039;&#039;Clone ROUTINE → New ROUTINE&#039;&#039;&#039;:&lt;br /&gt;
*** From: &amp;lt;code&amp;gt;ROUTINE_4.110&amp;lt;/code&amp;gt;&lt;br /&gt;
*** To: &amp;lt;code&amp;gt;ROUTINE_4.111&amp;lt;/code&amp;gt;&lt;br /&gt;
*** Submit → this copies rows and updates the active tag.&lt;br /&gt;
&lt;br /&gt;
=== 3. Verify the Result ===&lt;br /&gt;
&lt;br /&gt;
* Visit: &amp;lt;code&amp;gt;Special:ApprovedManuals&amp;lt;/code&amp;gt;&lt;br /&gt;
* Confirm the listing shows &amp;lt;code&amp;gt;ROUTINE_4.111&amp;lt;/code&amp;gt;&lt;br /&gt;
* Lisa can now publish or review the approved manuals.&lt;br /&gt;
* No DB access required.&lt;br /&gt;
&lt;br /&gt;
= Optional: JSON/API Importer =&lt;br /&gt;
&lt;br /&gt;
If you&#039;re ready to skip the SQL import:&lt;br /&gt;
&lt;br /&gt;
* Define a JSON payload that includes:&lt;br /&gt;
** &amp;lt;code&amp;gt;page_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;rev_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;deploy_comment&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;wikitext&amp;lt;/code&amp;gt;, etc.&lt;br /&gt;
* Build a:&lt;br /&gt;
** REST endpoint, or&lt;br /&gt;
** Action API module, or&lt;br /&gt;
** Maintenance script that reads JSON&lt;br /&gt;
&lt;br /&gt;
Once defined, MediaWiki can import directly into &amp;lt;code&amp;gt;mw_tags&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;mw_tag_pages&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{Warning|Avoid touching the database manually if you want to adopt the JSON route. The importer will safely handle all insertions.}}&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://mw.eckford.ca:443/index.php?title=Template:Note&amp;diff=40</id>
		<title>Template:Note</title>
		<link rel="alternate" type="text/html" href="https://mw.eckford.ca:443/index.php?title=Template:Note&amp;diff=40"/>
		<updated>2026-01-21T23:58:40Z</updated>

		<summary type="html">&lt;p&gt;Admin: Created page with &amp;quot;&amp;lt;div class=&amp;quot;mw-note&amp;quot; style=&amp;quot;border-left: 5px solid #36c; background-color: #eef; padding: 0.8em; margin: 1em 0;&amp;quot;&amp;gt; &amp;lt;strong&amp;gt;Note:&amp;lt;/strong&amp;gt; {{{1}}} &amp;lt;/div&amp;gt; &amp;lt;noinclude&amp;gt; This is the &amp;lt;code&amp;gt;{{Note}}&amp;lt;/code&amp;gt; template. Use it to highlight general tips or context.  Usage: &amp;lt;pre&amp;gt; {{Note|This is helpful context.}} &amp;lt;/pre&amp;gt; &amp;lt;/noinclude&amp;gt;&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&amp;quot;mw-note&amp;quot; style=&amp;quot;border-left: 5px solid #36c; background-color: #eef; padding: 0.8em; margin: 1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;strong&amp;gt;Note:&amp;lt;/strong&amp;gt; {{{1}}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;noinclude&amp;gt;&lt;br /&gt;
This is the &amp;lt;code&amp;gt;{{Note}}&amp;lt;/code&amp;gt; template. Use it to highlight general tips or context.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{{Note|This is helpful context.}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://mw.eckford.ca:443/index.php?title=Main_Page&amp;diff=39</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://mw.eckford.ca:443/index.php?title=Main_Page&amp;diff=39"/>
		<updated>2026-01-21T23:56:48Z</updated>

		<summary type="html">&lt;p&gt;Admin: Formatting courtesy of ChatGPT 4o&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;strong&amp;gt;MediaWiki has been installed.&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Consult the [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents User&#039;s Guide] for information on using the wiki software.&lt;br /&gt;
&lt;br /&gt;
== Getting started ==&lt;br /&gt;
* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Configuration settings list]&lt;br /&gt;
* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki FAQ]&lt;br /&gt;
* [https://lists.wikimedia.org/postorius/lists/mediawiki-announce.lists.wikimedia.org/ MediaWiki release mailing list]&lt;br /&gt;
* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localise MediaWiki for your language]&lt;br /&gt;
* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Learn how to combat spam on your wiki]&lt;br /&gt;
&lt;br /&gt;
== Import CustomQueryPage ==&lt;br /&gt;
* [https://mw.eckford.ca/downloads/CustomQueryPage-mw1359.tar.gz CustomQueryPage for mw1359]&lt;br /&gt;
&lt;br /&gt;
=== Installing CustomQueryPage ===&lt;br /&gt;
* Download the bundle: &amp;lt;code&amp;gt;wget https://mw.eckford.ca/downloads/CustomQueryPage-mw1359.tar.gz&amp;lt;/code&amp;gt;&lt;br /&gt;
* Extract it into your extensions folder:&lt;br /&gt;
** &amp;lt;code&amp;gt;tar -xzf CustomQueryPage-mw1359.tar.gz -C /srv/mediawiki/extensions&amp;lt;/code&amp;gt;&lt;br /&gt;
* Edit &amp;lt;code&amp;gt;LocalSettings.php&amp;lt;/code&amp;gt; and add &amp;lt;code&amp;gt;wfLoadExtension( &#039;CustomQueryPage&#039; );&amp;lt;/code&amp;gt;&lt;br /&gt;
* Run &amp;lt;code&amp;gt;php maintenance/update.php --quick&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Visit &amp;lt;code&amp;gt;Special:CustomQuerySettings&amp;lt;/code&amp;gt;, set the ROUTINE tag (e.g., &amp;lt;code&amp;gt;ROUTINE_4.110&amp;lt;/code&amp;gt;), and confirm &amp;lt;code&amp;gt;Special:ApprovedManuals&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Where We Stand =&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;CustomQueryPage&#039;&#039;&#039; now ships with a simplified clone path:&lt;br /&gt;
** &#039;&#039;Special:CustomQuerySettings&#039;&#039; copies the &#039;&#039;mw_tag_pages&#039;&#039; rows from &#039;&#039;ROUTINE_4.110&#039;&#039; to &#039;&#039;ROUTINE_4.111&#039;&#039;,&lt;br /&gt;
** clones the &#039;&#039;mw_tags&#039;&#039; row,&lt;br /&gt;
** and immediately points the listing at the new tag.&lt;br /&gt;
** Success banner fixed; README documents the exact steps (see the new &#039;&#039;&amp;quot;Quick clone workflow&amp;quot;&#039;&#039;).&lt;br /&gt;
* On sh1re/sh0re we never finished the MediaWiki core patch that deletes &#039;&#039;mw_logging.log_user*&#039;&#039;.&lt;br /&gt;
** We seeded &#039;&#039;mw_customquerypage_settings&#039;&#039; manually instead so Lisa could keep using the UI.&lt;br /&gt;
&lt;br /&gt;
== Why mw_tags felt “bypassed” during export ==&lt;br /&gt;
&lt;br /&gt;
* On dev we inserted the active tag row directly into &#039;&#039;mw_customquerypage_settings&#039;&#039;; the clone form still expects&lt;br /&gt;
  the regular &#039;&#039;mw_tags&#039;&#039; / &#039;&#039;mw_tag_pages&#039;&#039; tables.&lt;br /&gt;
** If those tables contain the &#039;&#039;4.110&#039;&#039; data (they should after your MySQL import), the UI will re-use them.&lt;br /&gt;
** If the environment you tested lacked &#039;&#039;mw_tags&#039;&#039;, we need to confirm the table exists and is populated before cloning.&lt;br /&gt;
* There’s nothing special to reference in &#039;&#039;LocalSettings.php&#039;&#039;; MediaWiki core creates &#039;&#039;mw_tags&#039;&#039; / &#039;&#039;mw_tag_pages&#039;&#039;&lt;br /&gt;
  automatically.&lt;br /&gt;
** Our extension simply reads/writes them via the load balancer.&lt;br /&gt;
&lt;br /&gt;
== Next steps if you want to exercise it on mw.eckford.ca ==&lt;br /&gt;
&lt;br /&gt;
# Copy &#039;&#039;extensions-mw1359/CustomQueryPage&#039;&#039; to the MW 1.39 box.&lt;br /&gt;
# Ensure &#039;&#039;mw_tags&#039;&#039; / &#039;&#039;mw_tag_pages&#039;&#039; have at least one ROUTINE (e.g., import &#039;&#039;ROUTINE_4.110&#039;&#039;).&lt;br /&gt;
# Visit &#039;&#039;Special:CustomQuerySettings&#039;&#039;, confirm the clone form works end-to-end:&lt;br /&gt;
#* new &#039;&#039;mw_tags&#039;&#039; row&lt;br /&gt;
#* ApprovedManuals listing updated&lt;br /&gt;
# Once Lisa confirms the UI covers her release work (set tag + clone), we can document the progressive-release workflow on her admin page.&lt;br /&gt;
&lt;br /&gt;
If that 1.39 run reveals that &#039;&#039;mw_tags&#039;&#039; truly doesn’t exist in that environment, we’ll know we must create it&lt;br /&gt;
(or point the extension at your custom release table).&lt;br /&gt;
&lt;br /&gt;
Otherwise, the existing code already ties directly into &#039;&#039;mw_tags&#039;&#039;, so maintaining progressive releases is just a matter of Lisa cloning each ROUTINE and then toggling the Approved Manuals view as you outlined.&lt;br /&gt;
&lt;br /&gt;
= Recap (Last Week → Now) =&lt;br /&gt;
&lt;br /&gt;
* Finished the MW 1.35.9 &#039;&#039;CustomQueryPage&#039;&#039; build with the simplified clone workflow so Lisa can re-tag approved releases inside MediaWiki.&lt;br /&gt;
** &#039;&#039;Special:CustomQuerySettings&#039;&#039; now handles both:&lt;br /&gt;
*** &#039;&#039;Set active tag&#039;&#039;&lt;br /&gt;
*** &#039;&#039;Clone ROUTINE_x.xxx → ROUTINE_y.yyy&#039;&#039;&lt;br /&gt;
* Deployed the same bits to &#039;&#039;eckfordc&#039;&#039; (MW 1.39) and &#039;&#039;sh1re/sh0re&#039;&#039;.&lt;br /&gt;
** The tables you saw (&#039;&#039;mw_tags&#039;&#039; / &#039;&#039;mw_tag_pages&#039;&#039; plus &#039;&#039;mw_customquerypage_settings&#039;&#039;) match what the extension uses.&lt;br /&gt;
* &#039;&#039;update.php&#039;&#039; keeps screaming about dropping legacy logging indexes.&lt;br /&gt;
** On dev we skipped the patch and seeded the settings table manually.&lt;br /&gt;
** Production installs just need to run update once so &#039;&#039;mw_customquerypage_settings&#039;&#039; exists.&lt;br /&gt;
&lt;br /&gt;
== Where we landed ==&lt;br /&gt;
&lt;br /&gt;
* DB access for humans stays off the table:&lt;br /&gt;
** whoever preps the ROUTINE export runs the existing script/import&lt;br /&gt;
** Lisa only touches the Special pages&lt;br /&gt;
* The ROUTINE clone form is working end-to-end:&lt;br /&gt;
** confirmed by the success banner&lt;br /&gt;
** ApprovedManuals shows &#039;&#039;ROUTINE_4.111&#039;&#039;&lt;br /&gt;
** the README now documents the exact steps&lt;br /&gt;
* No special mention of &#039;&#039;mw_tags&#039;&#039; in &#039;&#039;LocalSettings.php&#039;&#039; is required.&lt;br /&gt;
** It’s core schema, and the extension already hits it directly.&lt;br /&gt;
&lt;br /&gt;
== Next step: JSON/API practice ==&lt;br /&gt;
&lt;br /&gt;
* Since new ROUTINEs are usually just re-tagging existing pages (rarely brand-new content), the current clone form covers the common path.&lt;br /&gt;
* If you want to practice building a JSON/API importer for the rare cases when a ROUTINE bundle comes from outside:&lt;br /&gt;
** define the payload first&lt;br /&gt;
** describe the data coming out of your export process:&lt;br /&gt;
*** page_id&lt;br /&gt;
*** rev_id&lt;br /&gt;
*** deploy_comment&lt;br /&gt;
*** wikitext&lt;br /&gt;
*** etc.&lt;br /&gt;
** decide whether you want:&lt;br /&gt;
*** a REST endpoint&lt;br /&gt;
*** an Action API module&lt;br /&gt;
*** a CLI maintenance script that reads JSON&lt;br /&gt;
** once we agree on the schema, I can wire the MediaWiki-side code so Lisa (or a bot) can feed in the new release without touching MySQL&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
Next we can also convert the “ROUTINE_x.xxx → ROUTINE_y.yyy” bits into `&amp;lt;code&amp;gt;` style and wrap the “update.php” warning into a warning box format (using templates like `{{Note}}` / `{{Warning}}` if our wiki has them).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Quick Start: ROUTINE Management =&lt;br /&gt;
&lt;br /&gt;
=== 1. Seed the ROUTINE in the DB ===&lt;br /&gt;
Before Lisa touches the UI, make sure the database has ROUTINE data.&lt;br /&gt;
&lt;br /&gt;
* Use the import script or manual SQL method.&lt;br /&gt;
* Required tables:&lt;br /&gt;
** &amp;lt;code&amp;gt;mw_tags&amp;lt;/code&amp;gt; — one row per ROUTINE (e.g., &amp;lt;code&amp;gt;ROUTINE_4.111&amp;lt;/code&amp;gt;).&lt;br /&gt;
** &amp;lt;code&amp;gt;mw_tag_pages&amp;lt;/code&amp;gt; — one row per approved page.&lt;br /&gt;
* If needed, run: &amp;lt;code&amp;gt;php maintenance/update.php --quick&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Note|Only run &amp;lt;code&amp;gt;update.php&amp;lt;/code&amp;gt; if &amp;lt;code&amp;gt;mw_customquerypage_settings&amp;lt;/code&amp;gt; doesn&#039;t exist yet.}}&lt;br /&gt;
&lt;br /&gt;
=== 2. Use the Special Page to Switch or Clone ===&lt;br /&gt;
&lt;br /&gt;
* Go to: &amp;lt;code&amp;gt;Special:CustomQuerySettings&amp;lt;/code&amp;gt;&lt;br /&gt;
* Two options:&lt;br /&gt;
** **Set Active Tag** — type &amp;lt;code&amp;gt;ROUTINE_4.111&amp;lt;/code&amp;gt;, then Save.&lt;br /&gt;
** **Clone ROUTINE → New ROUTINE**:&lt;br /&gt;
*** From: &amp;lt;code&amp;gt;ROUTINE_4.110&amp;lt;/code&amp;gt;&lt;br /&gt;
*** To: &amp;lt;code&amp;gt;ROUTINE_4.111&amp;lt;/code&amp;gt;&lt;br /&gt;
*** Submit → this copies rows and updates the active tag.&lt;br /&gt;
&lt;br /&gt;
=== 3. Verify the Result ===&lt;br /&gt;
&lt;br /&gt;
* Visit: &amp;lt;code&amp;gt;Special:ApprovedManuals&amp;lt;/code&amp;gt;&lt;br /&gt;
* Confirm the listing shows &amp;lt;code&amp;gt;ROUTINE_4.111&amp;lt;/code&amp;gt;&lt;br /&gt;
* Lisa can now publish or review the approved manuals.&lt;br /&gt;
* No DB access required.&lt;br /&gt;
&lt;br /&gt;
= Optional: JSON/API Importer =&lt;br /&gt;
&lt;br /&gt;
If you&#039;re ready to skip the SQL import:&lt;br /&gt;
&lt;br /&gt;
* Define a JSON payload that includes:&lt;br /&gt;
** &amp;lt;code&amp;gt;page_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;rev_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;deploy_comment&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;wikitext&amp;lt;/code&amp;gt;, etc.&lt;br /&gt;
* Build a:&lt;br /&gt;
** REST endpoint, or&lt;br /&gt;
** Action API module, or&lt;br /&gt;
** Maintenance script that reads JSON&lt;br /&gt;
&lt;br /&gt;
Once defined, we’ll wire MediaWiki to import it directly into &amp;lt;code&amp;gt;mw_tags&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;mw_tag_pages&amp;lt;/code&amp;gt;.  &lt;br /&gt;
Lisa keeps working via Special pages — nothing changes for her.&lt;br /&gt;
&lt;br /&gt;
{{Warning|Avoid touching the DB manually if you want to adopt the JSON route. The importer will handle safe insertion.}}&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://mw.eckford.ca:443/index.php?title=Main_Page&amp;diff=38</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://mw.eckford.ca:443/index.php?title=Main_Page&amp;diff=38"/>
		<updated>2026-01-21T23:47:39Z</updated>

		<summary type="html">&lt;p&gt;Admin: That’s the entire page, stitched together and formatted for the client. No guessing, no duplicates—just one   cohesive document you can hand over today.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;  &amp;lt;strong&amp;gt;MediaWiki has been installed.&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  Consult the [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents User’s Guide] for information on&lt;br /&gt;
  using the wiki software.&lt;br /&gt;
&lt;br /&gt;
  == Getting started ==&lt;br /&gt;
  * [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Configuration settings list]&lt;br /&gt;
  * [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki FAQ]&lt;br /&gt;
  * [https://lists.wikimedia.org/postorius/lists/mediawiki-announce.lists.wikimedia.org/ MediaWiki release mailing&lt;br /&gt;
  list]&lt;br /&gt;
  * [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localise MediaWiki for&lt;br /&gt;
  your language]&lt;br /&gt;
  * [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Learn how to combat spam on your&lt;br /&gt;
  wiki]&lt;br /&gt;
&lt;br /&gt;
  == Import CustomQueryPage ==&lt;br /&gt;
  * [https://mw.eckford.ca/downloads/CustomQueryPage-mw1359.tar.gz CustomQueryPage for mw1359]&lt;br /&gt;
&lt;br /&gt;
  === Installing CustomQueryPage ===&lt;br /&gt;
  # Download the bundle: &amp;lt;code&amp;gt;wget https://mw.eckford.ca/downloads/CustomQueryPage-mw1359.tar.gz&amp;lt;/code&amp;gt;&lt;br /&gt;
  # Extract into your extensions folder: &amp;lt;code&amp;gt;tar -xzf CustomQueryPage-mw1359.tar.gz -C /srv/mediawiki/&lt;br /&gt;
  extensions&amp;lt;/code&amp;gt;&lt;br /&gt;
  # Edit &amp;lt;code&amp;gt;LocalSettings.php&amp;lt;/code&amp;gt; and add &amp;lt;code&amp;gt;wfLoadExtension( &#039;CustomQueryPage&#039; );&amp;lt;/code&amp;gt;&lt;br /&gt;
  # Run &amp;lt;code&amp;gt;php maintenance/update.php --quick&amp;lt;/code&amp;gt;&lt;br /&gt;
  # Visit &amp;lt;code&amp;gt;Special:CustomQuerySettings&amp;lt;/code&amp;gt;, set the ROUTINE tag (e.g. &amp;lt;code&amp;gt;ROUTINE_4.110&amp;lt;/code&amp;gt;), and&lt;br /&gt;
  confirm &amp;lt;code&amp;gt;Special:ApprovedManuals&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
  = Where We Stand =&lt;br /&gt;
  * &#039;&#039;&#039;CustomQueryPage&#039;&#039;&#039; now includes the simplified clone path:&lt;br /&gt;
  ** &#039;&#039;Special:CustomQuerySettings&#039;&#039; copies the &#039;&#039;mw_tag_pages&#039;&#039; rows from &amp;lt;code&amp;gt;ROUTINE_4.110&amp;lt;/code&amp;gt; to&lt;br /&gt;
  &amp;lt;code&amp;gt;ROUTINE_4.111&amp;lt;/code&amp;gt;, clones the &#039;&#039;mw_tags&#039;&#039; row, and immediately points the listing at the new tag. The&lt;br /&gt;
  success banner is fixed and README documents the “Quick clone workflow.”&lt;br /&gt;
  * On sh1re/sh0re we still need to finish the MediaWiki patch that drops &amp;lt;code&amp;gt;mw_logging.log_user*&amp;lt;/code&amp;gt;, so we&lt;br /&gt;
  seeded &amp;lt;code&amp;gt;mw_customquerypage_settings&amp;lt;/code&amp;gt; manually to keep the UI working.&lt;br /&gt;
&lt;br /&gt;
  == Why mw_tags felt “bypassed” ==&lt;br /&gt;
  * On dev we inserted the active tag row directly into &amp;lt;code&amp;gt;mw_customquerypage_settings&amp;lt;/code&amp;gt;; the clone form&lt;br /&gt;
  still expects the standard &amp;lt;code&amp;gt;mw_tags&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;mw_tag_pages&amp;lt;/code&amp;gt; tables.&lt;br /&gt;
  * If those tables contain the 4.110 data (they should after your import), the UI reuses them immediately.&lt;br /&gt;
  * Nothing special is required in &amp;lt;code&amp;gt;LocalSettings.php&amp;lt;/code&amp;gt;; our extension simply uses the core tables via&lt;br /&gt;
  the MediaWiki load balancer.&lt;br /&gt;
&lt;br /&gt;
  == Next steps on mw.eckfordc (MW 1.39) ==&lt;br /&gt;
  # Copy &amp;lt;code&amp;gt;extensions-mw1359/CustomQueryPage&amp;lt;/code&amp;gt; onto the host.&lt;br /&gt;
  # Ensure &amp;lt;code&amp;gt;mw_tags&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;mw_tag_pages&amp;lt;/code&amp;gt; include at least one ROUTINE (for example, import&lt;br /&gt;
  &amp;lt;code&amp;gt;ROUTINE_4.110&amp;lt;/code&amp;gt;).&lt;br /&gt;
  # Visit &amp;lt;code&amp;gt;Special:CustomQuerySettings&amp;lt;/code&amp;gt;, run the clone form end to end, and confirm the changed&lt;br /&gt;
  listing.&lt;br /&gt;
  # Once Lisa confirms the UI workflow, document the promotion steps on her admin page.&lt;br /&gt;
&lt;br /&gt;
  = Recap (Last Week → Now) =&lt;br /&gt;
  * Finished the MW 1.35.9 build with the simplified clone workflow (Set active tag + Clone ROUTINE_x.xxx →&lt;br /&gt;
  ROUTINE_y.yyy).&lt;br /&gt;
  * Deployed the same code to eckfordc (1.39) and sh1re/sh0re (1.35.9); all installs now have &#039;&#039;mw_tags&#039;&#039;,&lt;br /&gt;
  &#039;&#039;mw_tag_pages&#039;&#039;, and &amp;lt;code&amp;gt;mw_customquerypage_settings&amp;lt;/code&amp;gt;.&lt;br /&gt;
  * On sh1re/sh0re, &amp;lt;code&amp;gt;update.php&amp;lt;/code&amp;gt; still balks at dropping &amp;lt;code&amp;gt;mw_logging.log_user*&amp;lt;/code&amp;gt;; we seeded&lt;br /&gt;
  the settings row manually until the patch runs cleanly.&lt;br /&gt;
&lt;br /&gt;
  == Where we landed ==&lt;br /&gt;
  * No human DB access – the release script populates ``mw_tags``/``mw_tag_pages``, and Lisa works entirely&lt;br /&gt;
  through the Special pages.&lt;br /&gt;
  * &#039;&#039;Special:CustomQuerySettings&#039;&#039; + &#039;&#039;Special:ApprovedManuals&#039;&#039; both confirmed for &amp;lt;code&amp;gt;ROUTINE_4.111&amp;lt;/code&amp;gt;;&lt;br /&gt;
  README documents the “Quick clone workflow.”&lt;br /&gt;
  * Nothing extra is required in &amp;lt;code&amp;gt;LocalSettings.php&amp;lt;/code&amp;gt;; the extension uses the standard tables via&lt;br /&gt;
  MediaWiki services.&lt;br /&gt;
&lt;br /&gt;
  == Next step: JSON/API practice ==&lt;br /&gt;
  * Since most releases are re-tags, the clone form covers the common path.&lt;br /&gt;
  * For the rare “new” ROUTINE payload, define a JSON schema (page_id, rev_id, deployment comment, wikitext, etc.)&lt;br /&gt;
  and decide whether you want a REST endpoint, an Action API module, or a CLI importer so everything stays inside&lt;br /&gt;
  MediaWiki.&lt;br /&gt;
&lt;br /&gt;
  = Routine Workflow (ship today) =&lt;br /&gt;
&lt;br /&gt;
  == 1. Seed the ROUTINE data ==&lt;br /&gt;
  * Import the raw rows (&#039;&#039;mw_tags&#039;&#039; + &#039;&#039;mw_tag_pages&#039;&#039;) via the export/import script.&lt;br /&gt;
  * After import, run &amp;lt;code&amp;gt;php maintenance/update.php --quick&amp;lt;/code&amp;gt; if &amp;lt;code&amp;gt;mw_customquerypage_settings&amp;lt;/code&amp;gt;&lt;br /&gt;
  does not exist yet.&lt;br /&gt;
&lt;br /&gt;
  == 2. Use the Special page ==&lt;br /&gt;
  * Log in as a sysop and open [[Special:CustomQuerySettings]].&lt;br /&gt;
  * Top form (Set active tag): type the ROUTINE you want live (for example, &amp;lt;code&amp;gt;ROUTINE_4.111&amp;lt;/code&amp;gt;) and click&lt;br /&gt;
  &#039;&#039;&#039;Save tag&#039;&#039;&#039; if the rows already exist.&lt;br /&gt;
  * Clone form: source &amp;lt;code&amp;gt;ROUTINE_4.110&amp;lt;/code&amp;gt;, target &amp;lt;code&amp;gt;ROUTINE_4.111&amp;lt;/code&amp;gt;, optional note. Submit once&lt;br /&gt;
  to duplicate the tag entirely inside MediaWiki (no DB work).&lt;br /&gt;
&lt;br /&gt;
  == 3. Verify ==&lt;br /&gt;
  * Visit [[Special:ApprovedManuals]]; it now lists the pages tagged with &amp;lt;code&amp;gt;ROUTINE_4.111&amp;lt;/code&amp;gt;.&lt;br /&gt;
  * Lisa reviews/publishes directly from there—no database access required.&lt;br /&gt;
&lt;br /&gt;
  (Once the data is in place, you either run the import script or use the clone form. When a JSON/API importer is&lt;br /&gt;
  ready, it replaces step 1; steps 2 and 3 stay the same.)&lt;br /&gt;
&lt;br /&gt;
  == Maintenance helper (eckfordc, MW 1.39) ==&lt;br /&gt;
  # Flush Opcache once so PHP rereads the helper:&lt;br /&gt;
  #::&amp;lt;pre&amp;gt;if ( function_exists( &#039;opcache_reset&#039; ) ) {&lt;br /&gt;
      opcache_reset();&lt;br /&gt;
  }&amp;lt;/pre&amp;gt;&lt;br /&gt;
  # Run the clone from the server:&lt;br /&gt;
  #::&amp;lt;pre&amp;gt;php extensions/CustomQueryPage/maintenance/testClone.php \&lt;br /&gt;
      --wiki=eckfordc_mw19424 \&lt;br /&gt;
      --source=ROUTINE_4.110 \&lt;br /&gt;
      --target=ROUTINE_4.111 \&lt;br /&gt;
      --user=Admin&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&lt;br /&gt;
  # Check [[Special:ApprovedManuals]]; if the script prints an error, copy the message verbatim so we can patch&lt;br /&gt;
  it.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://mw.eckford.ca:443/index.php?title=Main_Page&amp;diff=37</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://mw.eckford.ca:443/index.php?title=Main_Page&amp;diff=37"/>
		<updated>2026-01-21T23:45:27Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;strong&amp;gt;MediaWiki has been installed.&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Consult the [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents User&#039;s Guide] for information on using the wiki software.&lt;br /&gt;
&lt;br /&gt;
== Getting started ==&lt;br /&gt;
* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Configuration settings list]&lt;br /&gt;
* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki FAQ]&lt;br /&gt;
* [https://lists.wikimedia.org/postorius/lists/mediawiki-announce.lists.wikimedia.org/ MediaWiki release mailing list]&lt;br /&gt;
* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localise MediaWiki for your language]&lt;br /&gt;
* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Learn how to combat spam on your wiki]&lt;br /&gt;
&lt;br /&gt;
== Import CustomQueryPage ==&lt;br /&gt;
* [https://mw.eckford.ca/downloads/CustomQueryPage-mw1359.tar.gz CustomQueryPage for mw1359]&lt;br /&gt;
&lt;br /&gt;
=== Installing CustomQueryPage ===&lt;br /&gt;
* Download the bundle: &amp;lt;code&amp;gt;wget https://mw.eckford.ca/downloads/CustomQueryPage-mw1359.tar.gz&amp;lt;/code&amp;gt;&lt;br /&gt;
* Extract it into your extensions folder:&lt;br /&gt;
** &amp;lt;code&amp;gt;tar -xzf CustomQueryPage-mw1359.tar.gz -C /srv/mediawiki/extensions&amp;lt;/code&amp;gt;&lt;br /&gt;
* Edit &amp;lt;code&amp;gt;LocalSettings.php&amp;lt;/code&amp;gt; and add &amp;lt;code&amp;gt;wfLoadExtension( &#039;CustomQueryPage&#039; );&amp;lt;/code&amp;gt;&lt;br /&gt;
* Run &amp;lt;code&amp;gt;php maintenance/update.php --quick&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Visit &amp;lt;code&amp;gt;Special:CustomQuerySettings&amp;lt;/code&amp;gt;, set the ROUTINE tag (e.g., &amp;lt;code&amp;gt;ROUTINE_4.110&amp;lt;/code&amp;gt;), and confirm &amp;lt;code&amp;gt;Special:ApprovedManuals&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Where We Stand =&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;CustomQueryPage&#039;&#039;&#039; now ships with a simplified clone path:&lt;br /&gt;
** &#039;&#039;Special:CustomQuerySettings&#039;&#039; copies the &#039;&#039;mw_tag_pages&#039;&#039; rows from &#039;&#039;ROUTINE_4.110&#039;&#039; to &#039;&#039;ROUTINE_4.111&#039;&#039;,&lt;br /&gt;
** clones the &#039;&#039;mw_tags&#039;&#039; row,&lt;br /&gt;
** and immediately points the listing at the new tag.&lt;br /&gt;
** Success banner fixed; README documents the exact steps (see the new &#039;&#039;&amp;quot;Quick clone workflow&amp;quot;&#039;&#039;).&lt;br /&gt;
* On sh1re/sh0re we never finished the MediaWiki core patch that deletes &#039;&#039;mw_logging.log_user*&#039;&#039;.&lt;br /&gt;
** We seeded &#039;&#039;mw_customquerypage_settings&#039;&#039; manually instead so Lisa could keep using the UI.&lt;br /&gt;
&lt;br /&gt;
== Why mw_tags felt “bypassed” during export ==&lt;br /&gt;
&lt;br /&gt;
* On dev we inserted the active tag row directly into &#039;&#039;mw_customquerypage_settings&#039;&#039;; the clone form still expects&lt;br /&gt;
  the regular &#039;&#039;mw_tags&#039;&#039; / &#039;&#039;mw_tag_pages&#039;&#039; tables.&lt;br /&gt;
** If those tables contain the &#039;&#039;4.110&#039;&#039; data (they should after your MySQL import), the UI will re-use them.&lt;br /&gt;
** If the environment you tested lacked &#039;&#039;mw_tags&#039;&#039;, we need to confirm the table exists and is populated before cloning.&lt;br /&gt;
* There’s nothing special to reference in &#039;&#039;LocalSettings.php&#039;&#039;; MediaWiki core creates &#039;&#039;mw_tags&#039;&#039; / &#039;&#039;mw_tag_pages&#039;&#039;&lt;br /&gt;
  automatically.&lt;br /&gt;
** Our extension simply reads/writes them via the load balancer.&lt;br /&gt;
&lt;br /&gt;
== Next steps if you want to exercise it on mw.eckford.ca ==&lt;br /&gt;
&lt;br /&gt;
# Copy &#039;&#039;extensions-mw1359/CustomQueryPage&#039;&#039; to the MW 1.39 box.&lt;br /&gt;
# Ensure &#039;&#039;mw_tags&#039;&#039; / &#039;&#039;mw_tag_pages&#039;&#039; have at least one ROUTINE (e.g., import &#039;&#039;ROUTINE_4.110&#039;&#039;).&lt;br /&gt;
# Visit &#039;&#039;Special:CustomQuerySettings&#039;&#039;, confirm the clone form works end-to-end:&lt;br /&gt;
#* new &#039;&#039;mw_tags&#039;&#039; row&lt;br /&gt;
#* ApprovedManuals listing updated&lt;br /&gt;
# Once Lisa confirms the UI covers her release work (set tag + clone), we can document the progressive-release workflow on her admin page.&lt;br /&gt;
&lt;br /&gt;
If that 1.39 run reveals that &#039;&#039;mw_tags&#039;&#039; truly doesn’t exist in that environment, we’ll know we must create it&lt;br /&gt;
(or point the extension at your custom release table).&lt;br /&gt;
&lt;br /&gt;
Otherwise, the existing code already ties directly into &#039;&#039;mw_tags&#039;&#039;, so maintaining progressive releases is just a matter of Lisa cloning each ROUTINE and then toggling the Approved Manuals view as you outlined.&lt;br /&gt;
&lt;br /&gt;
Yep — here’s that whole block “mw-ified” into clean MediaWiki wikitext (copy/paste ready):&lt;br /&gt;
&lt;br /&gt;
```wiki&lt;br /&gt;
= Recap (Last Week → Now) =&lt;br /&gt;
&lt;br /&gt;
* Finished the MW 1.35.9 &#039;&#039;CustomQueryPage&#039;&#039; build with the simplified clone workflow so Lisa can re-tag approved releases inside MediaWiki.&lt;br /&gt;
** &#039;&#039;Special:CustomQuerySettings&#039;&#039; now handles both:&lt;br /&gt;
*** &#039;&#039;Set active tag&#039;&#039;&lt;br /&gt;
*** &#039;&#039;Clone ROUTINE_x.xxx → ROUTINE_y.yyy&#039;&#039;&lt;br /&gt;
* Deployed the same bits to &#039;&#039;eckfordc&#039;&#039; (MW 1.39) and &#039;&#039;sh1re/sh0re&#039;&#039;.&lt;br /&gt;
** The tables you saw (&#039;&#039;mw_tags&#039;&#039; / &#039;&#039;mw_tag_pages&#039;&#039; plus &#039;&#039;mw_customquerypage_settings&#039;&#039;) match what the extension uses.&lt;br /&gt;
* &#039;&#039;update.php&#039;&#039; keeps screaming about dropping legacy logging indexes.&lt;br /&gt;
** On dev we skipped the patch and seeded the settings table manually.&lt;br /&gt;
** Production installs just need to run update once so &#039;&#039;mw_customquerypage_settings&#039;&#039; exists.&lt;br /&gt;
&lt;br /&gt;
== Where we landed ==&lt;br /&gt;
&lt;br /&gt;
* DB access for humans stays off the table:&lt;br /&gt;
** whoever preps the ROUTINE export runs the existing script/import&lt;br /&gt;
** Lisa only touches the Special pages&lt;br /&gt;
* The ROUTINE clone form is working end-to-end:&lt;br /&gt;
** confirmed by the success banner&lt;br /&gt;
** ApprovedManuals shows &#039;&#039;ROUTINE_4.111&#039;&#039;&lt;br /&gt;
** the README now documents the exact steps&lt;br /&gt;
* No special mention of &#039;&#039;mw_tags&#039;&#039; in &#039;&#039;LocalSettings.php&#039;&#039; is required.&lt;br /&gt;
** It’s core schema, and the extension already hits it directly.&lt;br /&gt;
&lt;br /&gt;
== Next step: JSON/API practice ==&lt;br /&gt;
&lt;br /&gt;
* Since new ROUTINEs are usually just re-tagging existing pages (rarely brand-new content), the current clone form covers the common path.&lt;br /&gt;
* If you want to practice building a JSON/API importer for the rare cases when a ROUTINE bundle comes from outside:&lt;br /&gt;
** define the payload first&lt;br /&gt;
** describe the data coming out of your export process:&lt;br /&gt;
*** page_id&lt;br /&gt;
*** rev_id&lt;br /&gt;
*** deploy_comment&lt;br /&gt;
*** wikitext&lt;br /&gt;
*** etc.&lt;br /&gt;
** decide whether you want:&lt;br /&gt;
*** a REST endpoint&lt;br /&gt;
*** an Action API module&lt;br /&gt;
*** a CLI maintenance script that reads JSON&lt;br /&gt;
** once we agree on the schema, I can wire the MediaWiki-side code so Lisa (or a bot) can feed in the new release without touching MySQL&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
Next we can also convert the “ROUTINE_x.xxx → ROUTINE_y.yyy” bits into `&amp;lt;code&amp;gt;` style and wrap the “update.php” warning into a warning box format (using templates like `{{Note}}` / `{{Warning}}` if our wiki has them).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/*------------------------------------------------&lt;br /&gt;
|                                                | &lt;br /&gt;
|   GARBAGE BELOW                                |&lt;br /&gt;
|                                                |&lt;br /&gt;
|    not happy                                   |&lt;br /&gt;
|                                                |&lt;br /&gt;
|----------------------------------------------*/ &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;gt; Here’s the end-to-end process using what we already shipped, so you can rehearse it before touching the JSON/&lt;br /&gt;
  API work:&lt;br /&gt;
&lt;br /&gt;
  1. Seed the ROUTINE in the DB (once per release)&lt;br /&gt;
&lt;br /&gt;
  - You still need the raw data (page/revision/tag rows) staged somewhere. Today that comes from the export/import&lt;br /&gt;
  script—either the manual SQL process or whatever automation you have.&lt;br /&gt;
  - Import creates/updates:&lt;br /&gt;
      - mw_tags: one row per ROUTINE (tag_id = &#039;ROUTINE_4.111&#039;, comment/deploy note, etc.).&lt;br /&gt;
      - mw_tag_pages: one row per approved page (tag_id, tag_page, tag_rev).&lt;br /&gt;
  - After import, run php maintenance/update.php --quick if the customquerypage_settings table doesn’t exist yet&lt;br /&gt;
  (once per wiki).&lt;br /&gt;
&lt;br /&gt;
  2. Use the Special page to switch or clone&lt;br /&gt;
&lt;br /&gt;
  - Log in as a sysop on the wiki.&lt;br /&gt;
  - Go to Special:CustomQuerySettings.&lt;br /&gt;
      - The top form shows the currently active ROUTINE (pulled from mw_customquerypage_settings). Type&lt;br /&gt;
  ROUTINE_4.111 and Save if you just want to point the listing at an existing tag.&lt;br /&gt;
      - The Clone form lets Lisa duplicate one ROUTINE to another inside MediaWiki itself (no new import).&lt;br /&gt;
  Set “Source ROUTINE” to the tag you already have (e.g., ROUTINE_4.110) and “New ROUTINE” to the next one&lt;br /&gt;
  (ROUTINE_4.111). Submit; the extension copies the mw_tags and mw_tag_pages rows and switches the active tag&lt;br /&gt;
  automatically.&lt;br /&gt;
&lt;br /&gt;
  3. Verify&lt;br /&gt;
&lt;br /&gt;
  - Visit Special:ApprovedManuals. It now lists the pages tagged with ROUTINE_4.111.&lt;br /&gt;
  - Lisa reviews or publishes from there; no DB access required.&lt;br /&gt;
&lt;br /&gt;
  So to “create” ROUTINE_4.111 today you either (a) run the existing import script to load a fresh ROUTINE, or (b)&lt;br /&gt;
  use the clone form to copy an older tag to the new name. Once the data is in place, Special:ApprovedManuals /&lt;br /&gt;
  Special:CustomQuerySettings handle everything else.&lt;br /&gt;
&lt;br /&gt;
  When you’re ready to build the JSON/API importer, we’ll replace step 1 (manual DB import) with a MediaWiki&lt;br /&gt;
  maintenance/API module that reads your JSON bundle and inserts the mw_tags/mw_tag_pages rows. But the rest of&lt;br /&gt;
  the process stays the same, and Lisa keeps working entirely through the Special pages.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://mw.eckford.ca:443/index.php?title=Main_Page&amp;diff=36</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://mw.eckford.ca:443/index.php?title=Main_Page&amp;diff=36"/>
		<updated>2026-01-21T23:44:37Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;strong&amp;gt;MediaWiki has been installed.&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Consult the [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents User&#039;s Guide] for information on using the wiki software.&lt;br /&gt;
&lt;br /&gt;
== Getting started ==&lt;br /&gt;
* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Configuration settings list]&lt;br /&gt;
* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki FAQ]&lt;br /&gt;
* [https://lists.wikimedia.org/postorius/lists/mediawiki-announce.lists.wikimedia.org/ MediaWiki release mailing list]&lt;br /&gt;
* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localise MediaWiki for your language]&lt;br /&gt;
* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Learn how to combat spam on your wiki]&lt;br /&gt;
&lt;br /&gt;
== Import CustomQueryPage ==&lt;br /&gt;
* [https://mw.eckford.ca/downloads/CustomQueryPage-mw1359.tar.gz CustomQueryPage for mw1359]&lt;br /&gt;
&lt;br /&gt;
=== Installing CustomQueryPage ===&lt;br /&gt;
* Download the bundle: &amp;lt;code&amp;gt;wget https://mw.eckford.ca/downloads/CustomQueryPage-mw1359.tar.gz&amp;lt;/code&amp;gt;&lt;br /&gt;
* Extract it into your extensions folder:&lt;br /&gt;
** &amp;lt;code&amp;gt;tar -xzf CustomQueryPage-mw1359.tar.gz -C /srv/mediawiki/extensions&amp;lt;/code&amp;gt;&lt;br /&gt;
* Edit &amp;lt;code&amp;gt;LocalSettings.php&amp;lt;/code&amp;gt; and add &amp;lt;code&amp;gt;wfLoadExtension( &#039;CustomQueryPage&#039; );&amp;lt;/code&amp;gt;&lt;br /&gt;
* Run &amp;lt;code&amp;gt;php maintenance/update.php --quick&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Visit &amp;lt;code&amp;gt;Special:CustomQuerySettings&amp;lt;/code&amp;gt;, set the ROUTINE tag (e.g., &amp;lt;code&amp;gt;ROUTINE_4.110&amp;lt;/code&amp;gt;), and confirm &amp;lt;code&amp;gt;Special:ApprovedManuals&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Where We Stand =&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;CustomQueryPage&#039;&#039;&#039; now ships with a simplified clone path:&lt;br /&gt;
** &#039;&#039;Special:CustomQuerySettings&#039;&#039; copies the &#039;&#039;mw_tag_pages&#039;&#039; rows from &#039;&#039;ROUTINE_4.110&#039;&#039; to &#039;&#039;ROUTINE_4.111&#039;&#039;,&lt;br /&gt;
** clones the &#039;&#039;mw_tags&#039;&#039; row,&lt;br /&gt;
** and immediately points the listing at the new tag.&lt;br /&gt;
** Success banner fixed; README documents the exact steps (see the new &#039;&#039;&amp;quot;Quick clone workflow&amp;quot;&#039;&#039;).&lt;br /&gt;
* On sh1re/sh0re we never finished the MediaWiki core patch that deletes &#039;&#039;mw_logging.log_user*&#039;&#039;.&lt;br /&gt;
** We seeded &#039;&#039;mw_customquerypage_settings&#039;&#039; manually instead so Lisa could keep using the UI.&lt;br /&gt;
&lt;br /&gt;
== Why mw_tags felt “bypassed” during export ==&lt;br /&gt;
&lt;br /&gt;
* On dev we inserted the active tag row directly into &#039;&#039;mw_customquerypage_settings&#039;&#039;; the clone form still expects&lt;br /&gt;
  the regular &#039;&#039;mw_tags&#039;&#039; / &#039;&#039;mw_tag_pages&#039;&#039; tables.&lt;br /&gt;
** If those tables contain the &#039;&#039;4.110&#039;&#039; data (they should after your MySQL import), the UI will re-use them.&lt;br /&gt;
** If the environment you tested lacked &#039;&#039;mw_tags&#039;&#039;, we need to confirm the table exists and is populated before cloning.&lt;br /&gt;
* There’s nothing special to reference in &#039;&#039;LocalSettings.php&#039;&#039;; MediaWiki core creates &#039;&#039;mw_tags&#039;&#039; / &#039;&#039;mw_tag_pages&#039;&#039;&lt;br /&gt;
  automatically.&lt;br /&gt;
** Our extension simply reads/writes them via the load balancer.&lt;br /&gt;
&lt;br /&gt;
== Next steps if you want to exercise it on mw.eckford.ca ==&lt;br /&gt;
&lt;br /&gt;
# Copy &#039;&#039;extensions-mw1359/CustomQueryPage&#039;&#039; to the MW 1.39 box.&lt;br /&gt;
# Ensure &#039;&#039;mw_tags&#039;&#039; / &#039;&#039;mw_tag_pages&#039;&#039; have at least one ROUTINE (e.g., import &#039;&#039;ROUTINE_4.110&#039;&#039;).&lt;br /&gt;
# Visit &#039;&#039;Special:CustomQuerySettings&#039;&#039;, confirm the clone form works end-to-end:&lt;br /&gt;
#* new &#039;&#039;mw_tags&#039;&#039; row&lt;br /&gt;
#* ApprovedManuals listing updated&lt;br /&gt;
# Once Lisa confirms the UI covers her release work (set tag + clone), we can document the progressive-release workflow on her admin page.&lt;br /&gt;
&lt;br /&gt;
If that 1.39 run reveals that &#039;&#039;mw_tags&#039;&#039; truly doesn’t exist in that environment, we’ll know we must create it&lt;br /&gt;
(or point the extension at your custom release table).&lt;br /&gt;
&lt;br /&gt;
Otherwise, the existing code already ties directly into &#039;&#039;mw_tags&#039;&#039;, so maintaining progressive releases is just a matter of Lisa cloning each ROUTINE and then toggling the Approved Manuals view as you outlined.&lt;br /&gt;
&lt;br /&gt;
Yep — here’s that whole block “mw-ified” into clean MediaWiki wikitext (copy/paste ready):&lt;br /&gt;
&lt;br /&gt;
```wiki&lt;br /&gt;
= Recap (Last Week → Now) =&lt;br /&gt;
&lt;br /&gt;
* Finished the MW 1.35.9 &#039;&#039;CustomQueryPage&#039;&#039; build with the simplified clone workflow so Lisa can re-tag approved releases inside MediaWiki.&lt;br /&gt;
** &#039;&#039;Special:CustomQuerySettings&#039;&#039; now handles both:&lt;br /&gt;
*** &#039;&#039;Set active tag&#039;&#039;&lt;br /&gt;
*** &#039;&#039;Clone ROUTINE_x.xxx → ROUTINE_y.yyy&#039;&#039;&lt;br /&gt;
* Deployed the same bits to &#039;&#039;eckfordc&#039;&#039; (MW 1.39) and &#039;&#039;sh1re/sh0re&#039;&#039;.&lt;br /&gt;
** The tables you saw (&#039;&#039;mw_tags&#039;&#039; / &#039;&#039;mw_tag_pages&#039;&#039; plus &#039;&#039;mw_customquerypage_settings&#039;&#039;) match what the extension uses.&lt;br /&gt;
* &#039;&#039;update.php&#039;&#039; keeps screaming about dropping legacy logging indexes.&lt;br /&gt;
** On dev we skipped the patch and seeded the settings table manually.&lt;br /&gt;
** Production installs just need to run update once so &#039;&#039;mw_customquerypage_settings&#039;&#039; exists.&lt;br /&gt;
&lt;br /&gt;
== Where we landed ==&lt;br /&gt;
&lt;br /&gt;
* DB access for humans stays off the table:&lt;br /&gt;
** whoever preps the ROUTINE export runs the existing script/import&lt;br /&gt;
** Lisa only touches the Special pages&lt;br /&gt;
* The ROUTINE clone form is working end-to-end:&lt;br /&gt;
** confirmed by the success banner&lt;br /&gt;
** ApprovedManuals shows &#039;&#039;ROUTINE_4.111&#039;&#039;&lt;br /&gt;
** the README now documents the exact steps&lt;br /&gt;
* No special mention of &#039;&#039;mw_tags&#039;&#039; in &#039;&#039;LocalSettings.php&#039;&#039; is required.&lt;br /&gt;
** It’s core schema, and the extension already hits it directly.&lt;br /&gt;
&lt;br /&gt;
== Next step: JSON/API practice ==&lt;br /&gt;
&lt;br /&gt;
* Since new ROUTINEs are usually just re-tagging existing pages (rarely brand-new content), the current clone form covers the common path.&lt;br /&gt;
* If you want to practice building a JSON/API importer for the rare cases when a ROUTINE bundle comes from outside:&lt;br /&gt;
** define the payload first&lt;br /&gt;
** describe the data coming out of your export process:&lt;br /&gt;
*** page_id&lt;br /&gt;
*** rev_id&lt;br /&gt;
*** deploy_comment&lt;br /&gt;
*** wikitext&lt;br /&gt;
*** etc.&lt;br /&gt;
** decide whether you want:&lt;br /&gt;
*** a REST endpoint&lt;br /&gt;
*** an Action API module&lt;br /&gt;
*** a CLI maintenance script that reads JSON&lt;br /&gt;
** once we agree on the schema, I can wire the MediaWiki-side code so Lisa (or a bot) can feed in the new release without touching MySQL&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
Next we can also convert the “ROUTINE_x.xxx → ROUTINE_y.yyy” bits into `&amp;lt;code&amp;gt;` style and wrap the “update.php” warning into a warning box format (using templates like `{{Note}}` / `{{Warning}}` if our wiki has them).&lt;br /&gt;
&lt;br /&gt;
/*------------------------------------------------&lt;br /&gt;
|                                                | &lt;br /&gt;
|   GARBAGE BELOW                                |&lt;br /&gt;
|                                                |&lt;br /&gt;
|    not happy                                   |&lt;br /&gt;
|                                                |&lt;br /&gt;
|----------------------------------------------*/ &lt;br /&gt;
&amp;gt; Here’s the end-to-end process using what we already shipped, so you can rehearse it before touching the JSON/&lt;br /&gt;
  API work:&lt;br /&gt;
&lt;br /&gt;
  1. Seed the ROUTINE in the DB (once per release)&lt;br /&gt;
&lt;br /&gt;
  - You still need the raw data (page/revision/tag rows) staged somewhere. Today that comes from the export/import&lt;br /&gt;
  script—either the manual SQL process or whatever automation you have.&lt;br /&gt;
  - Import creates/updates:&lt;br /&gt;
      - mw_tags: one row per ROUTINE (tag_id = &#039;ROUTINE_4.111&#039;, comment/deploy note, etc.).&lt;br /&gt;
      - mw_tag_pages: one row per approved page (tag_id, tag_page, tag_rev).&lt;br /&gt;
  - After import, run php maintenance/update.php --quick if the customquerypage_settings table doesn’t exist yet&lt;br /&gt;
  (once per wiki).&lt;br /&gt;
&lt;br /&gt;
  2. Use the Special page to switch or clone&lt;br /&gt;
&lt;br /&gt;
  - Log in as a sysop on the wiki.&lt;br /&gt;
  - Go to Special:CustomQuerySettings.&lt;br /&gt;
      - The top form shows the currently active ROUTINE (pulled from mw_customquerypage_settings). Type&lt;br /&gt;
  ROUTINE_4.111 and Save if you just want to point the listing at an existing tag.&lt;br /&gt;
      - The Clone form lets Lisa duplicate one ROUTINE to another inside MediaWiki itself (no new import).&lt;br /&gt;
  Set “Source ROUTINE” to the tag you already have (e.g., ROUTINE_4.110) and “New ROUTINE” to the next one&lt;br /&gt;
  (ROUTINE_4.111). Submit; the extension copies the mw_tags and mw_tag_pages rows and switches the active tag&lt;br /&gt;
  automatically.&lt;br /&gt;
&lt;br /&gt;
  3. Verify&lt;br /&gt;
&lt;br /&gt;
  - Visit Special:ApprovedManuals. It now lists the pages tagged with ROUTINE_4.111.&lt;br /&gt;
  - Lisa reviews or publishes from there; no DB access required.&lt;br /&gt;
&lt;br /&gt;
  So to “create” ROUTINE_4.111 today you either (a) run the existing import script to load a fresh ROUTINE, or (b)&lt;br /&gt;
  use the clone form to copy an older tag to the new name. Once the data is in place, Special:ApprovedManuals /&lt;br /&gt;
  Special:CustomQuerySettings handle everything else.&lt;br /&gt;
&lt;br /&gt;
  When you’re ready to build the JSON/API importer, we’ll replace step 1 (manual DB import) with a MediaWiki&lt;br /&gt;
  maintenance/API module that reads your JSON bundle and inserts the mw_tags/mw_tag_pages rows. But the rest of&lt;br /&gt;
  the process stays the same, and Lisa keeps working entirely through the Special pages.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://mw.eckford.ca:443/index.php?title=Main_Page&amp;diff=35</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://mw.eckford.ca:443/index.php?title=Main_Page&amp;diff=35"/>
		<updated>2026-01-21T23:08:32Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;  &amp;lt;strong&amp;gt;MediaWiki has been installed.&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  Consult the [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents User&#039;s Guide] for information on&lt;br /&gt;
  using the wiki software.&lt;br /&gt;
&lt;br /&gt;
  == Getting started ==&lt;br /&gt;
  * [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Configuration settings list]&lt;br /&gt;
  * [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki FAQ]&lt;br /&gt;
  * [https://lists.wikimedia.org/postorius/lists/mediawiki-announce.lists.wikimedia.org/ MediaWiki release mailing&lt;br /&gt;
  list]&lt;br /&gt;
  * [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localise MediaWiki for&lt;br /&gt;
  your language]&lt;br /&gt;
  * [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Learn how to combat spam on your&lt;br /&gt;
  wiki]&lt;br /&gt;
&lt;br /&gt;
  == Import CustomQueryPage ==&lt;br /&gt;
  * [https://mw.eckford.ca/downloads/CustomQueryPage-mw1359.tar.gz CustomQueryPage for mw1359]&lt;br /&gt;
&lt;br /&gt;
  === Installing CustomQueryPage ===&lt;br /&gt;
  # Download the bundle: &amp;lt;code&amp;gt;wget https://mw.eckford.ca/downloads/CustomQueryPage-mw1359.tar.gz&amp;lt;/code&amp;gt;&lt;br /&gt;
  # Extract it into your extensions folder: &amp;lt;code&amp;gt;tar -xzf CustomQueryPage-mw1359.tar.gz -C /srv/mediawiki/&lt;br /&gt;
  extensions&amp;lt;/code&amp;gt;&lt;br /&gt;
  # Edit &amp;lt;code&amp;gt;LocalSettings.php&amp;lt;/code&amp;gt; and add &amp;lt;code&amp;gt;wfLoadExtension( &#039;CustomQueryPage&#039; );&amp;lt;/code&amp;gt;&lt;br /&gt;
  # Run &amp;lt;code&amp;gt;php maintenance/update.php --quick&amp;lt;/code&amp;gt;&lt;br /&gt;
  # Visit &amp;lt;code&amp;gt;Special:CustomQuerySettings&amp;lt;/code&amp;gt;, set the ROUTINE tag (for example, &amp;lt;code&amp;gt;ROUTINE_4.110&amp;lt;/code&amp;gt;),&lt;br /&gt;
  and confirm &amp;lt;code&amp;gt;Special:ApprovedManuals&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
  = Where We Stand =&lt;br /&gt;
  * &#039;&#039;&#039;CustomQueryPage&#039;&#039;&#039; now ships with a simplified clone path: &#039;&#039;Special:CustomQuerySettings&#039;&#039; copies the&lt;br /&gt;
  &#039;&#039;mw_tag_pages&#039;&#039; rows from &#039;&#039;ROUTINE_4.110&#039;&#039; to &#039;&#039;ROUTINE_4.111&#039;&#039;, clones the &#039;&#039;mw_tags&#039;&#039; row, and immediately&lt;br /&gt;
  points the listing at the new tag. Success banner fixed; README documents the “Quick clone workflow.”&lt;br /&gt;
  * On sh1re/sh0re we never finished the MediaWiki core patch that deletes &amp;lt;code&amp;gt;mw_logging.log_user*&amp;lt;/code&amp;gt;, so&lt;br /&gt;
  we seeded &amp;lt;code&amp;gt;mw_customquerypage_settings&amp;lt;/code&amp;gt; manually to keep the UI working.&lt;br /&gt;
&lt;br /&gt;
  == Why mw_tags felt “bypassed” ==&lt;br /&gt;
  * On dev we inserted the active tag row directly into &amp;lt;code&amp;gt;mw_customquerypage_settings&amp;lt;/code&amp;gt;; the clone form&lt;br /&gt;
  still expects the normal &amp;lt;code&amp;gt;mw_tags&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;mw_tag_pages&amp;lt;/code&amp;gt; tables.&lt;br /&gt;
  * If those tables contain the 4.110 data (they should after your MySQL import), the UI reuses them immediately.&lt;br /&gt;
  * There’s nothing special in &amp;lt;code&amp;gt;LocalSettings.php&amp;lt;/code&amp;gt;; MediaWiki core creates those tables. Our extension&lt;br /&gt;
  simply uses the load balancer to read/write them.&lt;br /&gt;
&lt;br /&gt;
  == Next steps if you want to exercise it on mw.eckfordc ==&lt;br /&gt;
  # Copy &amp;lt;code&amp;gt;extensions-mw1359/CustomQueryPage&amp;lt;/code&amp;gt; to the MW 1.39 box.&lt;br /&gt;
  # Ensure &amp;lt;code&amp;gt;mw_tags&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;mw_tag_pages&amp;lt;/code&amp;gt; have at least one ROUTINE (for example, import&lt;br /&gt;
  &amp;lt;code&amp;gt;ROUTINE_4.110&amp;lt;/code&amp;gt;).&lt;br /&gt;
  # Visit &amp;lt;code&amp;gt;Special:CustomQuerySettings&amp;lt;/code&amp;gt; and confirm the clone form works end-to-end (new&lt;br /&gt;
  &amp;lt;code&amp;gt;mw_tags&amp;lt;/code&amp;gt; row, ApprovedManuals listing updated).&lt;br /&gt;
  # Once Lisa confirms the UI covers her release workflow (set tag + clone), document the progressive-release&lt;br /&gt;
  steps on her admin page.&lt;br /&gt;
&lt;br /&gt;
  = Recap (Last Week → Now) =&lt;br /&gt;
  * Finished the MW 1.35.9 build with the simplified clone workflow so Lisa can re‑tag releases (Set active tag +&lt;br /&gt;
  Clone ROUTINE_x.xxx → ROUTINE_y.yyy).&lt;br /&gt;
  * Deployed the same code to eckfordc (1.39) and sh1re/sh0re (1.35.9); all installs now have the expected tables&lt;br /&gt;
  (&#039;&#039;mw_tags&#039;&#039;, &#039;&#039;mw_tag_pages&#039;&#039;, &amp;lt;code&amp;gt;mw_customquerypage_settings&amp;lt;/code&amp;gt;).&lt;br /&gt;
  * On sh1re/sh0re, &amp;lt;code&amp;gt;update.php&amp;lt;/code&amp;gt; still complains about dropping &amp;lt;code&amp;gt;mw_logging.log_user*&amp;lt;/code&amp;gt;; for&lt;br /&gt;
  now we seeded the settings row manually.&lt;br /&gt;
&lt;br /&gt;
  == Where we landed ==&lt;br /&gt;
  * No human DB access: the release script populates &amp;lt;code&amp;gt;mw_tags&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;mw_tag_pages&amp;lt;/code&amp;gt;, and Lisa&lt;br /&gt;
  stays within the Special pages.&lt;br /&gt;
  * &#039;&#039;Special:CustomQuerySettings&#039;&#039; and &#039;&#039;Special:ApprovedManuals&#039;&#039; both confirmed for &amp;lt;code&amp;gt;ROUTINE_4.111&amp;lt;/code&amp;gt;;&lt;br /&gt;
  README documents the “Quick clone workflow.”&lt;br /&gt;
  * Nothing special required in &amp;lt;code&amp;gt;LocalSettings.php&amp;lt;/code&amp;gt;; the extension uses the standard tables via&lt;br /&gt;
  MediaWiki services.&lt;br /&gt;
&lt;br /&gt;
  == Next step: JSON/API practice ==&lt;br /&gt;
  * Since most releases are re‑tags, the clone form covers the common path.&lt;br /&gt;
  * For the rare “new” ROUTINE payload, define a JSON schema (page_id, rev_id, comment, wikitext, etc.) and build&lt;br /&gt;
  either a REST endpoint, an Action API module, or a CLI importer to ingest it inside MediaWiki.&lt;br /&gt;
&lt;br /&gt;
  = Routine Clone (eckfordc) =&lt;br /&gt;
  # One-time: flush Opcache so PHP reloads the helper script:&lt;br /&gt;
  #::&amp;lt;pre&amp;gt;if ( function_exists( &#039;opcache_reset&#039; ) ) {&lt;br /&gt;
      opcache_reset();&lt;br /&gt;
  }&amp;lt;/pre&amp;gt;&lt;br /&gt;
  # Run the maintenance helper:&lt;br /&gt;
  #::&amp;lt;pre&amp;gt;php extensions/CustomQueryPage/maintenance/testClone.php \&lt;br /&gt;
      --wiki=eckfordc_mw19424 \&lt;br /&gt;
      --source=ROUTINE_4.110 \&lt;br /&gt;
      --target=ROUTINE_4.111 \&lt;br /&gt;
      --user=Admin&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&lt;br /&gt;
  # Visit [[Special:ApprovedManuals]]; it should now show &amp;lt;code&amp;gt;ROUTINE_4.111&amp;lt;/code&amp;gt;.&lt;br /&gt;
  # If the clone fails, rerun step 2 and capture the error text so we can patch it.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://mw.eckford.ca:443/index.php?title=Main_Page&amp;diff=34</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://mw.eckford.ca:443/index.php?title=Main_Page&amp;diff=34"/>
		<updated>2026-01-21T23:00:14Z</updated>

		<summary type="html">&lt;p&gt;Admin: formatting frenzie!&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;strong&amp;gt;MediaWiki has been installed.&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Consult the [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents User&#039;s Guide] for information on using the wiki software.&lt;br /&gt;
&lt;br /&gt;
== Getting started ==&lt;br /&gt;
* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Configuration settings list]&lt;br /&gt;
* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki FAQ]&lt;br /&gt;
* [https://lists.wikimedia.org/postorius/lists/mediawiki-announce.lists.wikimedia.org/ MediaWiki release mailing list]&lt;br /&gt;
* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localise MediaWiki for your language]&lt;br /&gt;
* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Learn how to combat spam on your wiki]&lt;br /&gt;
&lt;br /&gt;
== Import CustomQueryPage ==&lt;br /&gt;
* [https://mw.eckford.ca/downloads/CustomQueryPage-mw1359.tar.gz CustomQueryPage for mw1359]&lt;br /&gt;
&lt;br /&gt;
=== Installing CustomQueryPage ===&lt;br /&gt;
* Download the bundle: &amp;lt;code&amp;gt;wget https://mw.eckford.ca/downloads/CustomQueryPage-mw1359.tar.gz&amp;lt;/code&amp;gt;&lt;br /&gt;
* Extract it into your extensions folder:&lt;br /&gt;
** &amp;lt;code&amp;gt;tar -xzf CustomQueryPage-mw1359.tar.gz -C /srv/mediawiki/extensions&amp;lt;/code&amp;gt;&lt;br /&gt;
* Edit &amp;lt;code&amp;gt;LocalSettings.php&amp;lt;/code&amp;gt; and add &amp;lt;code&amp;gt;wfLoadExtension( &#039;CustomQueryPage&#039; );&amp;lt;/code&amp;gt;&lt;br /&gt;
* Run &amp;lt;code&amp;gt;php maintenance/update.php --quick&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Visit &amp;lt;code&amp;gt;Special:CustomQuerySettings&amp;lt;/code&amp;gt;, set the ROUTINE tag (e.g., &amp;lt;code&amp;gt;ROUTINE_4.110&amp;lt;/code&amp;gt;), and confirm &amp;lt;code&amp;gt;Special:ApprovedManuals&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Where We Stand =&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;CustomQueryPage&#039;&#039;&#039; now ships with a simplified clone path:&lt;br /&gt;
** &#039;&#039;Special:CustomQuerySettings&#039;&#039; copies the &#039;&#039;mw_tag_pages&#039;&#039; rows from &#039;&#039;ROUTINE_4.110&#039;&#039; to &#039;&#039;ROUTINE_4.111&#039;&#039;,&lt;br /&gt;
** clones the &#039;&#039;mw_tags&#039;&#039; row,&lt;br /&gt;
** and immediately points the listing at the new tag.&lt;br /&gt;
** Success banner fixed; README documents the exact steps (see the new &#039;&#039;&amp;quot;Quick clone workflow&amp;quot;&#039;&#039;).&lt;br /&gt;
* On sh1re/sh0re we never finished the MediaWiki core patch that deletes &#039;&#039;mw_logging.log_user*&#039;&#039;.&lt;br /&gt;
** We seeded &#039;&#039;mw_customquerypage_settings&#039;&#039; manually instead so Lisa could keep using the UI.&lt;br /&gt;
&lt;br /&gt;
== Why mw_tags felt “bypassed” during export ==&lt;br /&gt;
&lt;br /&gt;
* On dev we inserted the active tag row directly into &#039;&#039;mw_customquerypage_settings&#039;&#039;; the clone form still expects&lt;br /&gt;
  the regular &#039;&#039;mw_tags&#039;&#039; / &#039;&#039;mw_tag_pages&#039;&#039; tables.&lt;br /&gt;
** If those tables contain the &#039;&#039;4.110&#039;&#039; data (they should after your MySQL import), the UI will re-use them.&lt;br /&gt;
** If the environment you tested lacked &#039;&#039;mw_tags&#039;&#039;, we need to confirm the table exists and is populated before cloning.&lt;br /&gt;
* There’s nothing special to reference in &#039;&#039;LocalSettings.php&#039;&#039;; MediaWiki core creates &#039;&#039;mw_tags&#039;&#039; / &#039;&#039;mw_tag_pages&#039;&#039;&lt;br /&gt;
  automatically.&lt;br /&gt;
** Our extension simply reads/writes them via the load balancer.&lt;br /&gt;
&lt;br /&gt;
== Next steps if you want to exercise it on mw.eckford.ca ==&lt;br /&gt;
&lt;br /&gt;
# Copy &#039;&#039;extensions-mw1359/CustomQueryPage&#039;&#039; to the MW 1.39 box.&lt;br /&gt;
# Ensure &#039;&#039;mw_tags&#039;&#039; / &#039;&#039;mw_tag_pages&#039;&#039; have at least one ROUTINE (e.g., import &#039;&#039;ROUTINE_4.110&#039;&#039;).&lt;br /&gt;
# Visit &#039;&#039;Special:CustomQuerySettings&#039;&#039;, confirm the clone form works end-to-end:&lt;br /&gt;
#* new &#039;&#039;mw_tags&#039;&#039; row&lt;br /&gt;
#* ApprovedManuals listing updated&lt;br /&gt;
# Once Lisa confirms the UI covers her release work (set tag + clone), we can document the progressive-release workflow on her admin page.&lt;br /&gt;
&lt;br /&gt;
If that 1.39 run reveals that &#039;&#039;mw_tags&#039;&#039; truly doesn’t exist in that environment, we’ll know we must create it&lt;br /&gt;
(or point the extension at your custom release table).&lt;br /&gt;
&lt;br /&gt;
Otherwise, the existing code already ties directly into &#039;&#039;mw_tags&#039;&#039;, so maintaining progressive releases is just a matter of Lisa cloning each ROUTINE and then toggling the Approved Manuals view as you outlined.&lt;br /&gt;
&lt;br /&gt;
Yep — here’s that whole block “mw-ified” into clean MediaWiki wikitext (copy/paste ready):&lt;br /&gt;
&lt;br /&gt;
```wiki&lt;br /&gt;
= Recap (Last Week → Now) =&lt;br /&gt;
&lt;br /&gt;
* Finished the MW 1.35.9 &#039;&#039;CustomQueryPage&#039;&#039; build with the simplified clone workflow so Lisa can re-tag approved releases inside MediaWiki.&lt;br /&gt;
** &#039;&#039;Special:CustomQuerySettings&#039;&#039; now handles both:&lt;br /&gt;
*** &#039;&#039;Set active tag&#039;&#039;&lt;br /&gt;
*** &#039;&#039;Clone ROUTINE_x.xxx → ROUTINE_y.yyy&#039;&#039;&lt;br /&gt;
* Deployed the same bits to &#039;&#039;eckfordc&#039;&#039; (MW 1.39) and &#039;&#039;sh1re/sh0re&#039;&#039;.&lt;br /&gt;
** The tables you saw (&#039;&#039;mw_tags&#039;&#039; / &#039;&#039;mw_tag_pages&#039;&#039; plus &#039;&#039;mw_customquerypage_settings&#039;&#039;) match what the extension uses.&lt;br /&gt;
* &#039;&#039;update.php&#039;&#039; keeps screaming about dropping legacy logging indexes.&lt;br /&gt;
** On dev we skipped the patch and seeded the settings table manually.&lt;br /&gt;
** Production installs just need to run update once so &#039;&#039;mw_customquerypage_settings&#039;&#039; exists.&lt;br /&gt;
&lt;br /&gt;
== Where we landed ==&lt;br /&gt;
&lt;br /&gt;
* DB access for humans stays off the table:&lt;br /&gt;
** whoever preps the ROUTINE export runs the existing script/import&lt;br /&gt;
** Lisa only touches the Special pages&lt;br /&gt;
* The ROUTINE clone form is working end-to-end:&lt;br /&gt;
** confirmed by the success banner&lt;br /&gt;
** ApprovedManuals shows &#039;&#039;ROUTINE_4.111&#039;&#039;&lt;br /&gt;
** the README now documents the exact steps&lt;br /&gt;
* No special mention of &#039;&#039;mw_tags&#039;&#039; in &#039;&#039;LocalSettings.php&#039;&#039; is required.&lt;br /&gt;
** It’s core schema, and the extension already hits it directly.&lt;br /&gt;
&lt;br /&gt;
== Next step: JSON/API practice ==&lt;br /&gt;
&lt;br /&gt;
* Since new ROUTINEs are usually just re-tagging existing pages (rarely brand-new content), the current clone form covers the common path.&lt;br /&gt;
* If you want to practice building a JSON/API importer for the rare cases when a ROUTINE bundle comes from outside:&lt;br /&gt;
** define the payload first&lt;br /&gt;
** describe the data coming out of your export process:&lt;br /&gt;
*** page_id&lt;br /&gt;
*** rev_id&lt;br /&gt;
*** deploy_comment&lt;br /&gt;
*** wikitext&lt;br /&gt;
*** etc.&lt;br /&gt;
** decide whether you want:&lt;br /&gt;
*** a REST endpoint&lt;br /&gt;
*** an Action API module&lt;br /&gt;
*** a CLI maintenance script that reads JSON&lt;br /&gt;
** once we agree on the schema, I can wire the MediaWiki-side code so Lisa (or a bot) can feed in the new release without touching MySQL&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  == Routine Clone (eckfordc) ==&lt;br /&gt;
  # (One time) Clear Opcache: temporarily add&lt;br /&gt;
    &amp;lt;code&amp;gt;if ( function_exists( &#039;opcache_reset&#039; ) ) { opcache_reset(); }&amp;lt;/code&amp;gt;&lt;br /&gt;
    to &amp;lt;code&amp;gt;LocalSettings.php&amp;lt;/code&amp;gt;, load any page, then remove the snippet.&lt;br /&gt;
  # Run the maintenance helper:&lt;br /&gt;
    &amp;lt;pre&amp;gt;&lt;br /&gt;
    php extensions/CustomQueryPage/maintenance/testClone.php \&lt;br /&gt;
        --wiki=eckfordc_mw19424 \&lt;br /&gt;
        --source=ROUTINE_4.110 \&lt;br /&gt;
        --target=ROUTINE_4.111 \&lt;br /&gt;
        --user=Admin&lt;br /&gt;
    &amp;lt;/pre&amp;gt;&lt;br /&gt;
    This clones the tag and prints “Cloned X pages (Y revisions)” or the exact SQL error.&lt;br /&gt;
  # Visit [[Special:ApprovedManuals]]; it should now show &amp;lt;code&amp;gt;ROUTINE_4.111&amp;lt;/code&amp;gt;.&lt;br /&gt;
  # If the clone fails, rerun step 2 and copy the error output so we can patch it.&lt;br /&gt;
&lt;br /&gt;
-----------------&lt;br /&gt;
&lt;br /&gt;
  = Recap (Last Week → Now) =&lt;br /&gt;
&lt;br /&gt;
  * Finished the MW 1.35.9 &#039;&#039;&#039;CustomQueryPage&#039;&#039;&#039; build with the simplified clone workflow so Lisa can re-tag&lt;br /&gt;
  approved releases inside MediaWiki.&lt;br /&gt;
  ** &#039;&#039;Special:CustomQuerySettings&#039;&#039; now handles both “Set active tag” and “Clone ROUTINE_x.xxx → ROUTINE_y.yyy”.&lt;br /&gt;
  * Deployed the same bits to eckfordc (MW 1.39) and sh1re/sh0re.&lt;br /&gt;
  ** All installations have the expected tables (&#039;&#039;mw_tags&#039;&#039;, &#039;&#039;mw_tag_pages&#039;&#039;, &#039;&#039;mw_customquerypage_settings&#039;&#039;).&lt;br /&gt;
  * &#039;&#039;update.php&#039;&#039; still balks at dropping ``mw_logging.log_user*`` on sh1re/sh0re, so we seeded the settings&lt;br /&gt;
  table manually until the patch runs cleanly.&lt;br /&gt;
&lt;br /&gt;
  == Where we landed ==&lt;br /&gt;
  * No human DB access: the release export populates ``mw_tags``/``mw_tag_pages``, and Lisa stays within the&lt;br /&gt;
  Special pages.&lt;br /&gt;
  * &#039;&#039;Special:CustomQuerySettings&#039;&#039; + &#039;&#039;Special:ApprovedManuals&#039;&#039; confirmed for &amp;lt;code&amp;gt;ROUTINE_4.111&amp;lt;/code&amp;gt;; README&lt;br /&gt;
  documents the “Quick clone workflow”.&lt;br /&gt;
  * Nothing special needed in &amp;lt;code&amp;gt;LocalSettings.php&amp;lt;/code&amp;gt;; the extension uses the standard tables via MediaWiki&lt;br /&gt;
  services.&lt;br /&gt;
&lt;br /&gt;
  == Next step: JSON/API practice ==&lt;br /&gt;
  * Since most releases are just re-tagging existing pages, the clone form covers the common path.&lt;br /&gt;
  * For the rare “new” ROUTINE payload, we can define a JSON schema (page_id, rev_id, comment, wikitext, etc.) and&lt;br /&gt;
  build either&lt;br /&gt;
  ** a REST endpoint,&lt;br /&gt;
  ** an Action API module, or&lt;br /&gt;
  ** a CLI maintenance script&lt;br /&gt;
  that ingests the data without direct SQL access.&lt;br /&gt;
&lt;br /&gt;
  = Routine Clone (eckfordc) =&lt;br /&gt;
&lt;br /&gt;
  # One-time: flush Opcache so PHP reloads the helper script:&lt;br /&gt;
  #::Add this to &amp;lt;code&amp;gt;LocalSettings.php&amp;lt;/code&amp;gt;, load any page, then remove it:&lt;br /&gt;
  #::&amp;lt;pre&amp;gt;if ( function_exists( &#039;opcache_reset&#039; ) ) {&lt;br /&gt;
      opcache_reset();&lt;br /&gt;
  }&amp;lt;/pre&amp;gt;&lt;br /&gt;
  # Run the maintenance helper:&lt;br /&gt;
  #::&amp;lt;pre&amp;gt;php extensions/CustomQueryPage/maintenance/testClone.php \&lt;br /&gt;
      --wiki=eckfordc_mw19424 \&lt;br /&gt;
      --source=ROUTINE_4.110 \&lt;br /&gt;
      --target=ROUTINE_4.111 \&lt;br /&gt;
      --user=Admin&lt;br /&gt;
  &amp;lt;/pre&amp;gt;&lt;br /&gt;
  # Visit [[Special:ApprovedManuals]]; it should now show &amp;lt;code&amp;gt;ROUTINE_4.111&amp;lt;/code&amp;gt;.&lt;br /&gt;
  # If the clone fails, rerun step 2 and capture the error text so we can patch it.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://mw.eckford.ca:443/index.php?title=Main_Page&amp;diff=33</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://mw.eckford.ca:443/index.php?title=Main_Page&amp;diff=33"/>
		<updated>2026-01-21T22:44:49Z</updated>

		<summary type="html">&lt;p&gt;Admin: Routine Clone (eckfordc)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;strong&amp;gt;MediaWiki has been installed.&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Consult the [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents User&#039;s Guide] for information on using the wiki software.&lt;br /&gt;
&lt;br /&gt;
== Getting started ==&lt;br /&gt;
* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Configuration settings list]&lt;br /&gt;
* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki FAQ]&lt;br /&gt;
* [https://lists.wikimedia.org/postorius/lists/mediawiki-announce.lists.wikimedia.org/ MediaWiki release mailing list]&lt;br /&gt;
* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localise MediaWiki for your language]&lt;br /&gt;
* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Learn how to combat spam on your wiki]&lt;br /&gt;
&lt;br /&gt;
== Import CustomQueryPage ==&lt;br /&gt;
* [https://mw.eckford.ca/downloads/CustomQueryPage-mw1359.tar.gz CustomQueryPage for mw1359]&lt;br /&gt;
&lt;br /&gt;
=== Installing CustomQueryPage ===&lt;br /&gt;
* Download the bundle: &amp;lt;code&amp;gt;wget https://mw.eckford.ca/downloads/CustomQueryPage-mw1359.tar.gz&amp;lt;/code&amp;gt;&lt;br /&gt;
* Extract it into your extensions folder:&lt;br /&gt;
** &amp;lt;code&amp;gt;tar -xzf CustomQueryPage-mw1359.tar.gz -C /srv/mediawiki/extensions&amp;lt;/code&amp;gt;&lt;br /&gt;
* Edit &amp;lt;code&amp;gt;LocalSettings.php&amp;lt;/code&amp;gt; and add &amp;lt;code&amp;gt;wfLoadExtension( &#039;CustomQueryPage&#039; );&amp;lt;/code&amp;gt;&lt;br /&gt;
* Run &amp;lt;code&amp;gt;php maintenance/update.php --quick&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Visit &amp;lt;code&amp;gt;Special:CustomQuerySettings&amp;lt;/code&amp;gt;, set the ROUTINE tag (e.g., &amp;lt;code&amp;gt;ROUTINE_4.110&amp;lt;/code&amp;gt;), and confirm &amp;lt;code&amp;gt;Special:ApprovedManuals&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Where We Stand =&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;CustomQueryPage&#039;&#039;&#039; now ships with a simplified clone path:&lt;br /&gt;
** &#039;&#039;Special:CustomQuerySettings&#039;&#039; copies the &#039;&#039;mw_tag_pages&#039;&#039; rows from &#039;&#039;ROUTINE_4.110&#039;&#039; to &#039;&#039;ROUTINE_4.111&#039;&#039;,&lt;br /&gt;
** clones the &#039;&#039;mw_tags&#039;&#039; row,&lt;br /&gt;
** and immediately points the listing at the new tag.&lt;br /&gt;
** Success banner fixed; README documents the exact steps (see the new &#039;&#039;&amp;quot;Quick clone workflow&amp;quot;&#039;&#039;).&lt;br /&gt;
* On sh1re/sh0re we never finished the MediaWiki core patch that deletes &#039;&#039;mw_logging.log_user*&#039;&#039;.&lt;br /&gt;
** We seeded &#039;&#039;mw_customquerypage_settings&#039;&#039; manually instead so Lisa could keep using the UI.&lt;br /&gt;
&lt;br /&gt;
== Why mw_tags felt “bypassed” during export ==&lt;br /&gt;
&lt;br /&gt;
* On dev we inserted the active tag row directly into &#039;&#039;mw_customquerypage_settings&#039;&#039;; the clone form still expects&lt;br /&gt;
  the regular &#039;&#039;mw_tags&#039;&#039; / &#039;&#039;mw_tag_pages&#039;&#039; tables.&lt;br /&gt;
** If those tables contain the &#039;&#039;4.110&#039;&#039; data (they should after your MySQL import), the UI will re-use them.&lt;br /&gt;
** If the environment you tested lacked &#039;&#039;mw_tags&#039;&#039;, we need to confirm the table exists and is populated before cloning.&lt;br /&gt;
* There’s nothing special to reference in &#039;&#039;LocalSettings.php&#039;&#039;; MediaWiki core creates &#039;&#039;mw_tags&#039;&#039; / &#039;&#039;mw_tag_pages&#039;&#039;&lt;br /&gt;
  automatically.&lt;br /&gt;
** Our extension simply reads/writes them via the load balancer.&lt;br /&gt;
&lt;br /&gt;
== Next steps if you want to exercise it on mw.eckford.ca ==&lt;br /&gt;
&lt;br /&gt;
# Copy &#039;&#039;extensions-mw1359/CustomQueryPage&#039;&#039; to the MW 1.39 box.&lt;br /&gt;
# Ensure &#039;&#039;mw_tags&#039;&#039; / &#039;&#039;mw_tag_pages&#039;&#039; have at least one ROUTINE (e.g., import &#039;&#039;ROUTINE_4.110&#039;&#039;).&lt;br /&gt;
# Visit &#039;&#039;Special:CustomQuerySettings&#039;&#039;, confirm the clone form works end-to-end:&lt;br /&gt;
#* new &#039;&#039;mw_tags&#039;&#039; row&lt;br /&gt;
#* ApprovedManuals listing updated&lt;br /&gt;
# Once Lisa confirms the UI covers her release work (set tag + clone), we can document the progressive-release workflow on her admin page.&lt;br /&gt;
&lt;br /&gt;
If that 1.39 run reveals that &#039;&#039;mw_tags&#039;&#039; truly doesn’t exist in that environment, we’ll know we must create it&lt;br /&gt;
(or point the extension at your custom release table).&lt;br /&gt;
&lt;br /&gt;
Otherwise, the existing code already ties directly into &#039;&#039;mw_tags&#039;&#039;, so maintaining progressive releases is just a matter of Lisa cloning each ROUTINE and then toggling the Approved Manuals view as you outlined.&lt;br /&gt;
&lt;br /&gt;
Yep — here’s that whole block “mw-ified” into clean MediaWiki wikitext (copy/paste ready):&lt;br /&gt;
&lt;br /&gt;
```wiki&lt;br /&gt;
= Recap (Last Week → Now) =&lt;br /&gt;
&lt;br /&gt;
* Finished the MW 1.35.9 &#039;&#039;CustomQueryPage&#039;&#039; build with the simplified clone workflow so Lisa can re-tag approved releases inside MediaWiki.&lt;br /&gt;
** &#039;&#039;Special:CustomQuerySettings&#039;&#039; now handles both:&lt;br /&gt;
*** &#039;&#039;Set active tag&#039;&#039;&lt;br /&gt;
*** &#039;&#039;Clone ROUTINE_x.xxx → ROUTINE_y.yyy&#039;&#039;&lt;br /&gt;
* Deployed the same bits to &#039;&#039;eckfordc&#039;&#039; (MW 1.39) and &#039;&#039;sh1re/sh0re&#039;&#039;.&lt;br /&gt;
** The tables you saw (&#039;&#039;mw_tags&#039;&#039; / &#039;&#039;mw_tag_pages&#039;&#039; plus &#039;&#039;mw_customquerypage_settings&#039;&#039;) match what the extension uses.&lt;br /&gt;
* &#039;&#039;update.php&#039;&#039; keeps screaming about dropping legacy logging indexes.&lt;br /&gt;
** On dev we skipped the patch and seeded the settings table manually.&lt;br /&gt;
** Production installs just need to run update once so &#039;&#039;mw_customquerypage_settings&#039;&#039; exists.&lt;br /&gt;
&lt;br /&gt;
== Where we landed ==&lt;br /&gt;
&lt;br /&gt;
* DB access for humans stays off the table:&lt;br /&gt;
** whoever preps the ROUTINE export runs the existing script/import&lt;br /&gt;
** Lisa only touches the Special pages&lt;br /&gt;
* The ROUTINE clone form is working end-to-end:&lt;br /&gt;
** confirmed by the success banner&lt;br /&gt;
** ApprovedManuals shows &#039;&#039;ROUTINE_4.111&#039;&#039;&lt;br /&gt;
** the README now documents the exact steps&lt;br /&gt;
* No special mention of &#039;&#039;mw_tags&#039;&#039; in &#039;&#039;LocalSettings.php&#039;&#039; is required.&lt;br /&gt;
** It’s core schema, and the extension already hits it directly.&lt;br /&gt;
&lt;br /&gt;
== Next step: JSON/API practice ==&lt;br /&gt;
&lt;br /&gt;
* Since new ROUTINEs are usually just re-tagging existing pages (rarely brand-new content), the current clone form covers the common path.&lt;br /&gt;
* If you want to practice building a JSON/API importer for the rare cases when a ROUTINE bundle comes from outside:&lt;br /&gt;
** define the payload first&lt;br /&gt;
** describe the data coming out of your export process:&lt;br /&gt;
*** page_id&lt;br /&gt;
*** rev_id&lt;br /&gt;
*** deploy_comment&lt;br /&gt;
*** wikitext&lt;br /&gt;
*** etc.&lt;br /&gt;
** decide whether you want:&lt;br /&gt;
*** a REST endpoint&lt;br /&gt;
*** an Action API module&lt;br /&gt;
*** a CLI maintenance script that reads JSON&lt;br /&gt;
** once we agree on the schema, I can wire the MediaWiki-side code so Lisa (or a bot) can feed in the new release without touching MySQL&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  == Routine Clone (eckfordc) ==&lt;br /&gt;
  # (One time) Clear Opcache: temporarily add&lt;br /&gt;
    &amp;lt;code&amp;gt;if ( function_exists( &#039;opcache_reset&#039; ) ) { opcache_reset(); }&amp;lt;/code&amp;gt;&lt;br /&gt;
    to &amp;lt;code&amp;gt;LocalSettings.php&amp;lt;/code&amp;gt;, load any page, then remove the snippet.&lt;br /&gt;
  # Run the maintenance helper:&lt;br /&gt;
    &amp;lt;pre&amp;gt;&lt;br /&gt;
    php extensions/CustomQueryPage/maintenance/testClone.php \&lt;br /&gt;
        --wiki=eckfordc_mw19424 \&lt;br /&gt;
        --source=ROUTINE_4.110 \&lt;br /&gt;
        --target=ROUTINE_4.111 \&lt;br /&gt;
        --user=Admin&lt;br /&gt;
    &amp;lt;/pre&amp;gt;&lt;br /&gt;
    This clones the tag and prints “Cloned X pages (Y revisions)” or the exact SQL error.&lt;br /&gt;
  # Visit [[Special:ApprovedManuals]]; it should now show &amp;lt;code&amp;gt;ROUTINE_4.111&amp;lt;/code&amp;gt;.&lt;br /&gt;
  # If the clone fails, rerun step 2 and copy the error output so we can patch it.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://mw.eckford.ca:443/index.php?title=Main_Page&amp;diff=32</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://mw.eckford.ca:443/index.php?title=Main_Page&amp;diff=32"/>
		<updated>2026-01-21T22:30:08Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;strong&amp;gt;MediaWiki has been installed.&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Consult the [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents User&#039;s Guide] for information on using the wiki software.&lt;br /&gt;
&lt;br /&gt;
== Getting started ==&lt;br /&gt;
* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Configuration settings list]&lt;br /&gt;
* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki FAQ]&lt;br /&gt;
* [https://lists.wikimedia.org/postorius/lists/mediawiki-announce.lists.wikimedia.org/ MediaWiki release mailing list]&lt;br /&gt;
* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localise MediaWiki for your language]&lt;br /&gt;
* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Learn how to combat spam on your wiki]&lt;br /&gt;
&lt;br /&gt;
== Import CustomQueryPage ==&lt;br /&gt;
* [https://mw.eckford.ca/downloads/CustomQueryPage-mw1359.tar.gz CustomQueryPage for mw1359]&lt;br /&gt;
&lt;br /&gt;
=== Installing CustomQueryPage ===&lt;br /&gt;
* Download the bundle: &amp;lt;code&amp;gt;wget https://mw.eckford.ca/downloads/CustomQueryPage-mw1359.tar.gz&amp;lt;/code&amp;gt;&lt;br /&gt;
* Extract it into your extensions folder:&lt;br /&gt;
** &amp;lt;code&amp;gt;tar -xzf CustomQueryPage-mw1359.tar.gz -C /srv/mediawiki/extensions&amp;lt;/code&amp;gt;&lt;br /&gt;
* Edit &amp;lt;code&amp;gt;LocalSettings.php&amp;lt;/code&amp;gt; and add &amp;lt;code&amp;gt;wfLoadExtension( &#039;CustomQueryPage&#039; );&amp;lt;/code&amp;gt;&lt;br /&gt;
* Run &amp;lt;code&amp;gt;php maintenance/update.php --quick&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Visit &amp;lt;code&amp;gt;Special:CustomQuerySettings&amp;lt;/code&amp;gt;, set the ROUTINE tag (e.g., &amp;lt;code&amp;gt;ROUTINE_4.110&amp;lt;/code&amp;gt;), and confirm &amp;lt;code&amp;gt;Special:ApprovedManuals&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Where We Stand =&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;CustomQueryPage&#039;&#039;&#039; now ships with a simplified clone path:&lt;br /&gt;
** &#039;&#039;Special:CustomQuerySettings&#039;&#039; copies the &#039;&#039;mw_tag_pages&#039;&#039; rows from &#039;&#039;ROUTINE_4.110&#039;&#039; to &#039;&#039;ROUTINE_4.111&#039;&#039;,&lt;br /&gt;
** clones the &#039;&#039;mw_tags&#039;&#039; row,&lt;br /&gt;
** and immediately points the listing at the new tag.&lt;br /&gt;
** Success banner fixed; README documents the exact steps (see the new &#039;&#039;&amp;quot;Quick clone workflow&amp;quot;&#039;&#039;).&lt;br /&gt;
* On sh1re/sh0re we never finished the MediaWiki core patch that deletes &#039;&#039;mw_logging.log_user*&#039;&#039;.&lt;br /&gt;
** We seeded &#039;&#039;mw_customquerypage_settings&#039;&#039; manually instead so Lisa could keep using the UI.&lt;br /&gt;
&lt;br /&gt;
== Why mw_tags felt “bypassed” during export ==&lt;br /&gt;
&lt;br /&gt;
* On dev we inserted the active tag row directly into &#039;&#039;mw_customquerypage_settings&#039;&#039;; the clone form still expects&lt;br /&gt;
  the regular &#039;&#039;mw_tags&#039;&#039; / &#039;&#039;mw_tag_pages&#039;&#039; tables.&lt;br /&gt;
** If those tables contain the &#039;&#039;4.110&#039;&#039; data (they should after your MySQL import), the UI will re-use them.&lt;br /&gt;
** If the environment you tested lacked &#039;&#039;mw_tags&#039;&#039;, we need to confirm the table exists and is populated before cloning.&lt;br /&gt;
* There’s nothing special to reference in &#039;&#039;LocalSettings.php&#039;&#039;; MediaWiki core creates &#039;&#039;mw_tags&#039;&#039; / &#039;&#039;mw_tag_pages&#039;&#039;&lt;br /&gt;
  automatically.&lt;br /&gt;
** Our extension simply reads/writes them via the load balancer.&lt;br /&gt;
&lt;br /&gt;
== Next steps if you want to exercise it on mw.eckford.ca ==&lt;br /&gt;
&lt;br /&gt;
# Copy &#039;&#039;extensions-mw1359/CustomQueryPage&#039;&#039; to the MW 1.39 box.&lt;br /&gt;
# Ensure &#039;&#039;mw_tags&#039;&#039; / &#039;&#039;mw_tag_pages&#039;&#039; have at least one ROUTINE (e.g., import &#039;&#039;ROUTINE_4.110&#039;&#039;).&lt;br /&gt;
# Visit &#039;&#039;Special:CustomQuerySettings&#039;&#039;, confirm the clone form works end-to-end:&lt;br /&gt;
#* new &#039;&#039;mw_tags&#039;&#039; row&lt;br /&gt;
#* ApprovedManuals listing updated&lt;br /&gt;
# Once Lisa confirms the UI covers her release work (set tag + clone), we can document the progressive-release workflow on her admin page.&lt;br /&gt;
&lt;br /&gt;
If that 1.39 run reveals that &#039;&#039;mw_tags&#039;&#039; truly doesn’t exist in that environment, we’ll know we must create it&lt;br /&gt;
(or point the extension at your custom release table).&lt;br /&gt;
&lt;br /&gt;
Otherwise, the existing code already ties directly into &#039;&#039;mw_tags&#039;&#039;, so maintaining progressive releases is just a matter of Lisa cloning each ROUTINE and then toggling the Approved Manuals view as you outlined.&lt;br /&gt;
&lt;br /&gt;
Yep — here’s that whole block “mw-ified” into clean MediaWiki wikitext (copy/paste ready):&lt;br /&gt;
&lt;br /&gt;
```wiki&lt;br /&gt;
= Recap (Last Week → Now) =&lt;br /&gt;
&lt;br /&gt;
* Finished the MW 1.35.9 &#039;&#039;CustomQueryPage&#039;&#039; build with the simplified clone workflow so Lisa can re-tag approved releases inside MediaWiki.&lt;br /&gt;
** &#039;&#039;Special:CustomQuerySettings&#039;&#039; now handles both:&lt;br /&gt;
*** &#039;&#039;Set active tag&#039;&#039;&lt;br /&gt;
*** &#039;&#039;Clone ROUTINE_x.xxx → ROUTINE_y.yyy&#039;&#039;&lt;br /&gt;
* Deployed the same bits to &#039;&#039;eckfordc&#039;&#039; (MW 1.39) and &#039;&#039;sh1re/sh0re&#039;&#039;.&lt;br /&gt;
** The tables you saw (&#039;&#039;mw_tags&#039;&#039; / &#039;&#039;mw_tag_pages&#039;&#039; plus &#039;&#039;mw_customquerypage_settings&#039;&#039;) match what the extension uses.&lt;br /&gt;
* &#039;&#039;update.php&#039;&#039; keeps screaming about dropping legacy logging indexes.&lt;br /&gt;
** On dev we skipped the patch and seeded the settings table manually.&lt;br /&gt;
** Production installs just need to run update once so &#039;&#039;mw_customquerypage_settings&#039;&#039; exists.&lt;br /&gt;
&lt;br /&gt;
== Where we landed ==&lt;br /&gt;
&lt;br /&gt;
* DB access for humans stays off the table:&lt;br /&gt;
** whoever preps the ROUTINE export runs the existing script/import&lt;br /&gt;
** Lisa only touches the Special pages&lt;br /&gt;
* The ROUTINE clone form is working end-to-end:&lt;br /&gt;
** confirmed by the success banner&lt;br /&gt;
** ApprovedManuals shows &#039;&#039;ROUTINE_4.111&#039;&#039;&lt;br /&gt;
** the README now documents the exact steps&lt;br /&gt;
* No special mention of &#039;&#039;mw_tags&#039;&#039; in &#039;&#039;LocalSettings.php&#039;&#039; is required.&lt;br /&gt;
** It’s core schema, and the extension already hits it directly.&lt;br /&gt;
&lt;br /&gt;
== Next step: JSON/API practice ==&lt;br /&gt;
&lt;br /&gt;
* Since new ROUTINEs are usually just re-tagging existing pages (rarely brand-new content), the current clone form covers the common path.&lt;br /&gt;
* If you want to practice building a JSON/API importer for the rare cases when a ROUTINE bundle comes from outside:&lt;br /&gt;
** define the payload first&lt;br /&gt;
** describe the data coming out of your export process:&lt;br /&gt;
*** page_id&lt;br /&gt;
*** rev_id&lt;br /&gt;
*** deploy_comment&lt;br /&gt;
*** wikitext&lt;br /&gt;
*** etc.&lt;br /&gt;
** decide whether you want:&lt;br /&gt;
*** a REST endpoint&lt;br /&gt;
*** an Action API module&lt;br /&gt;
*** a CLI maintenance script that reads JSON&lt;br /&gt;
** once we agree on the schema, I can wire the MediaWiki-side code so Lisa (or a bot) can feed in the new release without touching MySQL&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
Next we can also convert the “ROUTINE_x.xxx → ROUTINE_y.yyy” bits into `&amp;lt;code&amp;gt;` style and wrap the “update.php” warning into a warning box format (using templates like `{{Note}}` / `{{Warning}}` if our wiki has them).&lt;br /&gt;
&lt;br /&gt;
&amp;gt; Here’s the end-to-end process using what we already shipped, so you can rehearse it before touching the JSON/&lt;br /&gt;
  API work:&lt;br /&gt;
&lt;br /&gt;
  1. Seed the ROUTINE in the DB (once per release)&lt;br /&gt;
&lt;br /&gt;
  - You still need the raw data (page/revision/tag rows) staged somewhere. Today that comes from the export/import&lt;br /&gt;
  script—either the manual SQL process or whatever automation you have.&lt;br /&gt;
  - Import creates/updates:&lt;br /&gt;
      - mw_tags: one row per ROUTINE (tag_id = &#039;ROUTINE_4.111&#039;, comment/deploy note, etc.).&lt;br /&gt;
      - mw_tag_pages: one row per approved page (tag_id, tag_page, tag_rev).&lt;br /&gt;
  - After import, run php maintenance/update.php --quick if the customquerypage_settings table doesn’t exist yet&lt;br /&gt;
  (once per wiki).&lt;br /&gt;
&lt;br /&gt;
  2. Use the Special page to switch or clone&lt;br /&gt;
&lt;br /&gt;
  - Log in as a sysop on the wiki.&lt;br /&gt;
  - Go to Special:CustomQuerySettings.&lt;br /&gt;
      - The top form shows the currently active ROUTINE (pulled from mw_customquerypage_settings). Type&lt;br /&gt;
  ROUTINE_4.111 and Save if you just want to point the listing at an existing tag.&lt;br /&gt;
      - The Clone form lets Lisa duplicate one ROUTINE to another inside MediaWiki itself (no new import).&lt;br /&gt;
  Set “Source ROUTINE” to the tag you already have (e.g., ROUTINE_4.110) and “New ROUTINE” to the next one&lt;br /&gt;
  (ROUTINE_4.111). Submit; the extension copies the mw_tags and mw_tag_pages rows and switches the active tag&lt;br /&gt;
  automatically.&lt;br /&gt;
&lt;br /&gt;
  3. Verify&lt;br /&gt;
&lt;br /&gt;
  - Visit Special:ApprovedManuals. It now lists the pages tagged with ROUTINE_4.111.&lt;br /&gt;
  - Lisa reviews or publishes from there; no DB access required.&lt;br /&gt;
&lt;br /&gt;
  So to “create” ROUTINE_4.111 today you either (a) run the existing import script to load a fresh ROUTINE, or (b)&lt;br /&gt;
  use the clone form to copy an older tag to the new name. Once the data is in place, Special:ApprovedManuals /&lt;br /&gt;
  Special:CustomQuerySettings handle everything else.&lt;br /&gt;
&lt;br /&gt;
  When you’re ready to build the JSON/API importer, we’ll replace step 1 (manual DB import) with a MediaWiki&lt;br /&gt;
  maintenance/API module that reads your JSON bundle and inserts the mw_tags/mw_tag_pages rows. But the rest of&lt;br /&gt;
  the process stays the same, and Lisa keeps working entirely through the Special pages.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sure — here’s that block converted into clean **MediaWiki wikitext** (with headings, bullets, and a syntax-highlighted code block):&lt;br /&gt;
&lt;br /&gt;
```wiki&lt;br /&gt;
== Quick Snapshot ==&lt;br /&gt;
&lt;br /&gt;
* The eckfordc server has the updated CustomQueryPage files (clone UI + schema detection).&lt;br /&gt;
* The maintenance script &amp;lt;code&amp;gt;testClone.php&amp;lt;/code&amp;gt; is in place but still running the old cached code because PHP hasn’t picked up the new file yet.&lt;br /&gt;
&lt;br /&gt;
== What To Do Now ==&lt;br /&gt;
&lt;br /&gt;
# Flush Opcache once so PHP reads the new script:&lt;br /&gt;
#* Temporarily add this at the bottom of &amp;lt;code&amp;gt;LocalSettings.php&amp;lt;/code&amp;gt;:&lt;br /&gt;
#* &amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
if ( function_exists( &#039;opcache_reset&#039; ) ) {&lt;br /&gt;
    opcache_reset();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
#* Load any wiki page once (you’ll see the site normally).&lt;br /&gt;
#* Remove the snippet.&lt;br /&gt;
# Run the maintenance clone again:&lt;br /&gt;
#* &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
php extensions/CustomQueryPage/maintenance/testClone.php \&lt;br /&gt;
    --wiki=eckfordc_mw19424 \&lt;br /&gt;
    --source=ROUTINE_4.110 \&lt;br /&gt;
    --target=ROUTINE_4.111 \&lt;br /&gt;
    --user=Admin&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
#* Now that the script is reloaded, this will either produce a friendly “Cloned X pages” message or the actual SQL error we need to fix.&lt;br /&gt;
# If the clone succeeds, hit [[Special:ApprovedManuals]]; it should instantly show &amp;lt;code&amp;gt;ROUTINE_4.111&amp;lt;/code&amp;gt;. If it errors, grab the output and I’ll help patch whatever’s left.&lt;br /&gt;
```&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
</feed>