a47e3c796d32feca4b3747b6eeb37afb25d31ae1
braney
  Thu Aug 13 08:07:47 2026 -0700
hgConfCatalog: classify the two new hgBlat form flags and quickLiftClipToChains as gates, refs #37925

diff --git src/hg/utils/hgConfCatalog/hgConfCatalog.py src/hg/utils/hgConfCatalog/hgConfCatalog.py
index c223a10710a..915ca8299f6 100755
--- src/hg/utils/hgConfCatalog/hgConfCatalog.py
+++ src/hg/utils/hgConfCatalog/hgConfCatalog.py
@@ -382,30 +382,64 @@
                "release; it is the switch back to how the browser coloured "
                "BED items before v466, and unlike sleepOn429 the off position "
                "describes an old version of the browser rather than a "
                "property of the machine, which is what keeps it a gate.  The "
                "last test in bedItemRgb is the only thing it controls, so "
                "deleting it is a two-line change."),
         h("hgHubConnect.validateHub", "flag",
           "hg/hgHubConnect/hgHubConnect.c:1728", default="TRUE", role="gate",
           verified=True,
           note="The Hub Development tab on hgHubConnect, which is where a hub "
                "author runs hubCheck from the browser.  Two call sites, the "
                "tab itself and hgHubConnectDeveloperMode below it.  Public "
                "since v427.  Described here as \"run hubCheck when a hub is "
                "attached\" until the call site was read: it gates the tab, "
                "not attachment, so a hub is validated on attach either way."),
+        h("blatNewForm", "flag", "hg/hgBlat/hgBlat.c:3020", default="FALSE",
+          role="gate", verified=True, ticket="37893",
+          note="Replaces hgBlat's classic C-generated search form with the "
+               "JavaScript-built one in hg/js/hgBlat.js, which shares its "
+               "styling and page header with the new BLAT results page.  Off "
+               "while the new form is being tested.  Read through "
+               "cartUsualBoolean, so this is only the default: the form's "
+               "banner offers a per-user opt-out that sets blatNewForm=0 in "
+               "the cart.  It comes out once the new form replaces the old "
+               "one, which is what makes it a gate rather than a knob."),
+        h("blatNewFormBanner", "flag", "hg/hgBlat/hgBlat.c:825",
+          default="follows blatNewForm", role="gate", verified=True,
+          ticket="37893",
+          note="Whether the classic BLAT search form carries a banner offering "
+               "the new one.  Defaults to whatever blatNewForm is set to: "
+               "where the new form is enabled, a user who took its go-back "
+               "link needs a way to return, and where it is disabled there is "
+               "nothing to advertise.  Set explicitly to override either way.  "
+               "The default is that nested read rather than a literal, so the "
+               "sunset report cannot tell from the tree whether this one has "
+               "shipped; it ships and goes away with blatNewForm.  Sibling of "
+               "blatNewPageBanner, which does the same job for the results "
+               "page."),
+        h("quickLiftClipToChains", "flag", "hg/lib/quickLift.c:231",
+          default="TRUE", role="gate", verified=True, ticket="38042",
+          note="Whether an item too big for the chains quickLift loaded is "
+               "pulled in to what they cover rather than dropped.  Read once, "
+               "in quickLiftIntervalsToBedClip, which is the display path; "
+               "the details page calls quickLiftIntervalsToBed and always "
+               "sees the item's true extent.  Born TRUE, so it never gated a "
+               "release: like alwaysItemRgb, the off position is the way the "
+               "browser behaved before the change rather than anything about "
+               "the machine, so it is a gate and should go once nobody has "
+               "asked for the old behaviour."),
     ],
 }
 
 
 # ---------------------------------------------------------------------------
 # mirror knobs: boolean flags that are meant to live forever
 # ---------------------------------------------------------------------------
 
 MIRROR_KNOBS = {
     "what": "Settings that are legitimate, permanent deployment switches.  "
             "Nearly all are boolean flags, and those are listed explicitly so "
             "the sunset report does not nag about them; a few are strings that "
             "choose between behaviours rather than turning one off, and those "
             "carry no gate/knob role because only booleans have one.",
     "vars": [
@@ -573,49 +607,30 @@
           note="What happens to the custom tracks left behind by a user's "
                "earlier BLAT searches when a new search makes another one.  "
                "Three values: keep (the default) leaves every one of them "
                "alone, hide leaves them in the session but sets them to hide, "
                "delete drops them from the session and lets their trash files "
                "age out.  Only tracks tagged blatResult=on are touched, and "
                "the track the current search just made is always left alone.  "
                "A string rather than a flag, so it carries no gate/knob role, "
                "but it is a knob in spirit: which of the three a site wants "
                "depends on whether its users run many searches in a session "
                "and get confused about which results are current, and that "
                "does not stop being a question after a release.  When set to "
                "delete, the BLAT search form shows a Keep results checkbox so "
                "a user can opt out for one search (cart variable "
                "blatKeepResults, read back in hg/hgc/hgc.c)."),
-        h("blatNewForm", "gate", "hg/hgBlat/hgBlat.c:3020", default="off",
-          verified=True,
-          note="Replaces hgBlat's classic C-generated search form with the "
-               "JavaScript-built one in hg/js/hgBlat.js, which shares its "
-               "styling and page header with the new BLAT results page.  Off "
-               "while the new form is being tested.  Read through "
-               "cartUsualBoolean, so this is only the default: the form's "
-               "banner offers a per-user opt-out that sets blatNewForm=0 in "
-               "the cart.  A gate - it comes out once the new form replaces "
-               "the old one."),
-        h("blatNewFormBanner", "gate", "hg/hgBlat/hgBlat.c:825",
-          default="follows blatNewForm", verified=True,
-          note="Whether the classic BLAT search form carries a banner offering "
-               "the new one.  Defaults to whatever blatNewForm is set to: "
-               "where the new form is enabled, a user who took its go-back "
-               "link needs a way to return, and where it is disabled there is "
-               "nothing to advertise.  Set explicitly to override either way.  "
-               "Sibling of blatNewPageBanner, which does the same job for the "
-               "results page."),
     ],
 }
 
 
 # ---------------------------------------------------------------------------
 # database connections and profiles
 # ---------------------------------------------------------------------------
 
 DATABASE = {
     "what": "Where the CGIs find MySQL.  A profile is a prefix; see the "
             "profile suffix family for the settings legal under any of them.",
     "vars": [
         h("db.host", "profile", "hg/qaPushQ/qaPushQ.c:2435", public=True,
           verified=True, env="HGDB_HOST", family="db",
           note="The main assembly database server."),
@@ -1364,38 +1379,30 @@
     "what": "Settings the tree reads that --auto-register wrote down without "
             "a person's help, so no read goes unrecorded while it waits to be "
             "classified.  Everything in a row here is a fact copied off the "
             "call: name, call site, and the compiled-in default when it is a "
             "literal.  Nothing here is a judgement.  A row leaves this "
             "section by hand, once somebody reads the call site and can say "
             "what the setting is for, whether a boolean is a gate or a knob, "
             "and whether a mirror operator would want it; then it moves to "
             "the section it belongs in with verified=True.  Rows are not "
             "expected to stay here, and --reconcile counts every one of them "
             "as needing attention.",
     "vars": [
         # --auto-register inserts new rows directly below this line.  Leave the
         # marker in place; it is how the writer finds its way in.
         # AUTO-REGISTER INSERTION POINT
-        h("quickLiftClipToChains", "flag", "hg/lib/quickLift.c:231",
-          default="TRUE", ticket="38042",
-          note="Written down by --auto-register, not yet reviewed by a "
-               "person.  Read with cfgOptionBooleanDefault at "
-               "hg/lib/quickLift.c:231.  Came in at 7f65d3da8f2, quickLift: "
-               "clip an oversized item to the chains we loaded instead of "
-               "dropping it, refs #38042.  Needs a description and a gate or "
-               "knob call."),
     ],
 }
 
 
 # ---------------------------------------------------------------------------
 # assembly
 # ---------------------------------------------------------------------------
 
 SECTIONS = [
     ("Release gates", RELEASE_GATES),
     ("Mirror knobs", MIRROR_KNOBS),
     ("Database connections", DATABASE),
     ("hgcentral tables", CENTRAL_TABLES),
     ("Paths and caches", PATHS),
     ("Limits and load control", LIMITS),