58fa228f2f91ae8c6a5c62109e904f57e1f9a66d
braney
  Wed Sep 30 11:03:02 2026 -0700
docent regression scripts for nineteen v504 tickets, and their registry rows

Each script watches one v504 fix. Fourteen fail on v503 (ts park 38316) and
pass on genome-test (release-ab). rm38313 and rm38393 are sandbox-ab, because
no release predates their fix. rm37984, rm38233 and rm38384 are
assertion-only; each header says why.

The registry now names the script in the docent column for these tickets, and
has new rows for #38157 and #38393. #38275 stays unwatched in the table: the
script that watches it is rm37389, which is named for another ticket.

refs #20824, #27988, #36292, #37595, #37621, #37929, #37984, #38157, #38192,
#38197, #38233, #38254, #38264, #38273, #38313, #38323, #38372, #38384,
#38393, #38252, #38391

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

diff --git src/hg/utils/docent/tests/regress/rm38393.docent.yaml src/hg/utils/docent/tests/regress/rm38393.docent.yaml
new file mode 100644
index 00000000000..ce6f0b34272
--- /dev/null
+++ src/hg/utils/docent/tests/regress/rm38393.docent.yaml
@@ -0,0 +1,36 @@
+# #38393 -- the REST API's /search endpoint returned HTTP 500 on every query.
+#
+# The bug: 1db5c89d97f (2026-09-17, refs #38285) added a read of measureTiming out of the
+# cart at the top of hgPositionsJson() in src/hg/cgilib/cartJson.c.  hubApi builds no cart,
+# and src/hg/hubApi/search.c has always passed NULL to hgPositionsJson(), so every /search
+# died in cartUsualBoolean(cart=0x0) before it printed a header.  Apache answered 500 with
+# "End of script output before headers: hubApi" in its error log.
+#
+# The fix: 32fbe1660c6 (2026-09-21), cartJson.c, a NULL check around that read.
+#
+# No release carries the bug.  1db5c89d97f and 32fbe1660c6 both landed between v503 and
+# v504, so v503 has neither and v504 has both, and this script passes on both.  The builds
+# that do have it are the ones made from master between 2026-09-17 and 2026-09-21; two
+# ticket parks from those days are the before for the sandbox-ab line below.
+#
+# The page is the JSON itself, read as text.  A 500 is Apache's own error page, so the
+# checks are all positive: the JSON's own keys, and BRCA1's MANE position, which is what
+# the search has to find.  hubApi/tests `make search01` watches the same request with a
+# bracket count; this script is the nightly one, on genome-test, with a named answer.
+proof:
+  - "assertion-only 2026-09-30 -- written from #38393 after 32fbe1660c6 reached genome-test"
+  - "sandbox-ab 2026-09-30 -- fails on ts parks 38395 (branch narrowPeak38395, built 2026-09-21 09:04) and 38252 (branch revert22docent, built 2026-09-17), both of which hold 1db5c89d97f and not 32fbe1660c6: step 3 fails: the page is Apache's Internal Server Error and has no positionMatches. Passes on genome-test, hgwbeta (v504), park 38423 (v504_branch) and park 38316 (v503_branch, which predates the bug)"
+
+target: genome-test
+db: hg38
+reset: true
+fast: true
+steps:
+  - goto: "/cgi-bin/hubApi/search?search=brca1;genome=hg38"
+  # 'pre' is Chromium's JSON view; 'h1' is Apache's 500 page, so a broken build reaches the
+  # expect: below and fails there, naming the error, rather than timing out here.
+  - wait: 'pre, h1'
+  - expect:
+      text: ['"genome": "hg38"', '"positionMatches": [', '"trackName": "mane"',
+             '"position": "chr17:43044295-43125364"']
+      noText: ["Internal Server Error", "End of script output"]