966c49bdf93dada183133e06522bfb0152de6168
braney
  Wed Sep 23 13:38:34 2026 -0700
docent: the nightly writes a status page, refs #38252

nightlyStatus.py reads the nightly logs, flips.log and each committed script's proof:
lines, and writes one page with a row per script, anchored by its name so a ticket can
link to one row. Each row has the current state and the date it has held since, the last
14 days, the strongest proof: level in plain words, and links to the script, the ticket
and any before/after picture.

Each row also has a link to try it on genome-test and on hgwbeta: the script's steps as
far as one URL can rebuild them, with track: steps resolved by DOCENT_DERIVE. Every link
is fetched with a fresh cart first, and the page calls it verified only when the fetch
draws what the expect: step names.

A night is a log written by an --update run, which is what cron does, not a log named
_0410: the 09-14 and 09-15 runs started late and a name match dropped them.

nightly.sh runs it after the log is complete and adds one line to the mail, the page URL
or the error. It changes nothing else about the night's verdict or exit status.

diff --git src/hg/utils/docent/tests/regress/README.txt src/hg/utils/docent/tests/regress/README.txt
index fb95210727e..2fdd7eaaaa9 100644
--- src/hg/utils/docent/tests/regress/README.txt
+++ src/hg/utils/docent/tests/regress/README.txt
@@ -148,30 +148,51 @@
 existed. Two attempts to force it through a wholesale file restore did not even compile,
 both times in code unrelated to the ticket. Take the conflict as the answer and use a
 release instead.
 
 server-flip is the one this directory gets for free, and it is better evidence, because
 nothing about the server changed except the build. Commit a script for an unshipped fix
 as an .xfail. `make test` fails when an xfail PASSES, so the morning the fix reaches
 genome-test the nightly goes red and says so. nightly.sh appends that to
 
     /hive/users/braney/docentNightly/flips.log
 
 one line per script ever, outside the checkout because --update resets the tree. Then
 drop the .xfail from the name and add the server-flip line to the script's proof: key.
 rm38272, rm36212 and rm38310 all arrived that way.
 
+The status page
+---------------
+
+After each run nightly.sh calls nightlyStatus.py, which rewrites
+
+    https://hgwdev.gi.ucsc.edu/~braney/docentStatus/
+
+from the logs, flips.log and the proof: lines. One row per committed script, anchored by
+its name, so a ticket can link to docentStatus/#rm38236: the state and the date it has
+held since, the last 14 days, the strongest proof: level in plain words, and a link to
+try it on genome-test and on hgwbeta. The mail says whether the page was written; a
+failure there changes nothing else.
+
+The try-it link is the script's steps as far as one URL can rebuild them, with track:
+steps resolved by DOCENT_DERIVE. It stops at the first step that needs the page itself
+(convert:, click:, login: and the like), so for most quickLift scripts it reaches the
+view before the convert and not the bug. Every link is fetched with a fresh cart before
+it is offered, and the page says "Verified" only when that fetch draws the rows the
+expect: step names. A reader's own cart is not fresh, so leftover settings can change
+what they see; a toggle such as hgt.toggleRevCmplDisp flips again on every load.
+
 rm36212 is still the one to read before writing another
 --------------------------------------------------------
 
 It is the worked example of both routes: sandbox-ab on 2026-09-09 against parked #36212
 on port 48099, then server-flip the same morning when cbb406cd96e reached genome-test.
 
 It is also the first script to assert a COLOR, using `expect: {color: ...}`, because it
 is the first bug here that leaves the page identical -- same rows, same height, same item
 names, same tooltips. When rows:, height:, text: and has: are all blind to a bug, the
 pixels are what is left. See tests/colorchecks.docent.yaml for the check itself.
 
 rm38310 is the second color check, and the second script watched both ways
 ---------------------------------------------------------------------------
 
 Same recipe as rm36212, and worth reading for the reason it needs pixels, which is