4697bbddd881c72cccb85b9ff0aacd769396b9d0 braney Thu Sep 10 07:34:35 2026 -0700 docent: record what evidence each regression test has, and count it A regression test written after the fix asserts the right answer, but nobody has watched it fail for the reason it exists, and a loose assertion in that state is indistinguishable from no test at all. Four of the 37 scripts here have actually been watched to flip. That was recorded only as prose in each script's header, so answering "how many of these are real regression tests" meant a grep and a read, and the number could not be quoted. Every script now carries a top-level `proof:` key, one quoted line per piece of evidence, `<level> <YYYY-MM-DD> -- <what was seen>`. docent.js reads only the keys it names off the parsed document, so this costs a run nothing. tests/proof.js reads them and tallies, wired up as `make proof` in the shared docentTest.mk. It exits 1 on a malformed line, an unknown level, or a line left unquoted -- that last one because nearly every note names a ticket and a bare # in an unquoted YAML scalar silently truncates the sentence at the ticket number, which is how the first pass of this change lost half its text. The levels, weakest first: assertion-only, xfail, sandbox-ab, server-flip, caught-regression. Today that reads 31 / 2 / 0 / 3 / 1. nightly.sh now records the flips it finds. An xfail that PASSES is the best evidence this suite produces -- the same server, the same fixtures, the same script, one real build apart -- and until now it arrived as a red mail and was thrown away with the log 60 days later. It is appended to /hive/users/braney/docentNightly/flips.log, one line per script ever, outside the checkout because --update resets the tree. The mail says what to do with it. The three flips that already happened (rm38272 2026-09-06, rm36212 2026-09-09, rm38310 2026-09-10) were recovered from the old logs and seeded there by hand. Full suite run after the change: 37 scripts, all ok. refs #38252 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> diff --git src/hg/utils/docent/tests/regress/rm38185.docent.yaml src/hg/utils/docent/tests/regress/rm38185.docent.yaml index 772e3c20b82..147279d949f 100644 --- src/hg/utils/docent/tests/regress/rm38185.docent.yaml +++ src/hg/utils/docent/tests/regress/rm38185.docent.yaml @@ -19,30 +19,33 @@ # Both checks were WATCHED TO FAIL, which almost nothing else in this suite can say. The # fix is on master for v504, so hgwbeta was still running the broken parser on 2026-09-06 # and both URLs were driven there: # # middle hgwbeta lands on chr7:155,799,529-155,812,871, hg38's default position -- # the position the URL asked for was simply gone # trailing hgwbeta returns "Mangled CGI input string &" # # That is why the first assertion is the POSITION ITSELF rather than the absence of an # error: losing the variable produced no error to look for. The string comes from the # #positionDisplay span, which is real page text, not the title, so expect: text can see it. # # The two steps deliberately ask for DIFFERENT positions. After the first step the cart # holds chr1:1-1,000, so a second step asking for the same place would be satisfied by the # cart whether or not the URL was parsed. +proof: + - "assertion-only 2026-09-06 -- written from the ticket after the fix had shipped" + target: genome-test db: hg38 reset: true fast: true steps: # Empty pair in the MIDDLE: position= used to be swallowed. - goto: "/cgi-bin/hgTracks?db=hg38&&position=chr1:1-1000&pix=1100" - expect: {rows: [ruler], text: "chr1:1-1,000"} # The same empty pair at the END, which used to abort before any of it was read. - goto: "/cgi-bin/hgTracks?db=hg38&position=chr3:1-1000&pix=1100&&" - expect: rows: [ruler] text: "chr3:1-1,000" noText: "Mangled CGI input string"