All File Changes
v502_preview2 to v502_base (2026-08-04 to 2026-08-10) v502
Show details
- build/kent-core/makefile
- lines changed 1, context: html, text, full: html, text
24ea8d9178f71bca95f19c145b1f378cfd75a6f0 Thu Aug 6 01:49:48 2026 -0700
kent-core testing into current dir, no redmine
- confs/asia.hg.conf
- lines changed 8, context: html, text, full: html, text
5edb6320068c0facd5c038296c99d6faf83e5210 Sun Aug 9 01:11:19 2026 -0700
Installing updated hg.conf files from UCSC servers
- confs/euro.hg.conf
- lines changed 8, context: html, text, full: html, text
5edb6320068c0facd5c038296c99d6faf83e5210 Sun Aug 9 01:11:19 2026 -0700
Installing updated hg.conf files from UCSC servers
- confs/hgwdev.hg.conf
- lines changed 20, context: html, text, full: html, text
5edb6320068c0facd5c038296c99d6faf83e5210 Sun Aug 9 01:11:19 2026 -0700
Installing updated hg.conf files from UCSC servers
- src/hg/cirm/gateway/htdocs/sspsygeneTimeline.html
- lines changed 5, context: html, text, full: html, text
f292ed55fe777115c177c91b63ca09f958145e48 Fri Aug 7 12:02:37 2026 -0700
Display changes to allow WUSTL and SING to align with original 4 ADGCs timelines
- src/hg/hgBlat/hgBlat.c
- lines changed 4, context: html, text, full: html, text
c7fcdde6db52ba01fbabfa695b49205bf7261a33 Tue Aug 4 07:40:32 2026 -0700
hgBlat/hgc: QA fixes for the new BLAT table view and alignment page
Address Gerardo's QA findings on the new BLAT UI:
- Table view: label each hit with its own query (new Query column +
"Queries" count in the summary) when the search has multiple queries,
reading cfg.multiQuery / hit.qName from the payload.
- Table view: strip the "hub_NNN_" prefix from the Assembly field so hub
assemblies no longer show a doubled prefix.
- Alignment page: strip the same prefix from the organism in the page title
for non-GenArk assembly hubs (blatAsmLabel fallback path).
- Table view: do not pre-select hit #1; show a prompt until the user clicks
a row, since top hits are often tied.
- Table view: add a divider between the Browser / New tab / Alignment links.
- Alignment page: sidebar link now reads "Side by Side Alignment" to match
the section heading.
- Alignment page: comma-format coordinates and base counts in the summary,
matching the table view and the rest of the browser.
refs #37893
- lines changed 163, context: html, text, full: html, text
81d7cff6cb6665feb772b1339b6298273a3c49be Thu Aug 6 08:24:38 2026 -0700
hgBlat new results page: table redesign, rename modal, share link, and an XSS fix
Iterates on the new hgBlat "table" results page (rendered by hg/js/hgBlat.js from
JSON emitted by hgBlat.c) per feedback on #37893:
- Columns: "Open in Genome Browser" (position link + new-tab icon), "Show"
(base alignment), Query coverage moved before Locus, score-scaled bar in the
Score column, Identity as plain %, comma-formatted Span. Locus is plain text,
clipped with a CSS ellipsis (full value in title).
- Tooltips on every action link and every column header (via the existing
convertTitleTagsToMouseovers mechanism).
- "Rename BLAT Track": a real modal dialog (replaces the old inline toggle form),
reusing the existing hgc buildBigPsl call via a new window.blatRenameCt() helper;
it no longer depends on a generic page-global. New cfg fields canRename /
trackName / trackDescription drive it.
- "Share a link": trash-backed stable URL toggle, with a share-nodes icon.
- Security: cgiEncode the query name in the htcUserAli detailsUrl (its sibling
already did), and htmlEncode every URL before it goes into an href in hgBlat.js,
so a crafted query/sequence name can't break out of the attribute (XSS).
- Shared htmlEncode() moved into hg/js/utils.js for reuse instead of a per-file
escaper.
- hg.conf: blatNewPageBanner (invite banner, default off), blatOldTracks
(keep/hide/delete previous BLAT tracks at creation) documented in ex.hg.conf;
hgc.c tags BLAT tracks with blatResult=on and clears prior ones per blatOldTracks.
refs #37893
- lines changed 20, context: html, text, full: html, text
b5a4ddd8543a87f46988a60069148b0f2e1a8031 Mon Aug 10 08:37:29 2026 -0700
hgBlat/hgPcr: show the chrUn info note (fix swapped startsWith args), refs #37893
The chrUn branch of the sequence-type note used startsWith(name, "chrUn"),
but startsWith(start, string) tests whether string begins with start, so it
asked whether "chrUn" begins with the sequence name and never matched. As a
result chrUn (unplaced) sequences got no info icon on the new BLAT results
page, and no note on the classic results page or in hgPcr, while _alt/_fix/
_random (which use endsWith) worked. Fix the argument order in all three.
Also, on the new results page, check the sequence's aliases and not just its
single display name, so a hit whose displayed label is an accession but which
has a chrUn/alt/fix alias (e.g. a GenArk hub) still gets the note.
- src/hg/hgHubConnect/hooks/hooklib.c
- lines changed 4, context: html, text, full: html, text
c3788110e8d865774fff8197cf5b47350472ba64 Tue Aug 4 11:26:55 2026 -0700
Fix hubSpace hook error handling and nested hub path handling, refs #37964
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
- lines changed 15, context: html, text, full: html, text
373b5c4187422a9584814dcfa324028fd2e50f14 Tue Aug 4 15:00:30 2026 -0700
Have the pre-finish hook return the rows it wrote, and fix the table display bugs that the real row data now lets us resolve, refs #37999
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
- src/hg/hgHubConnect/hooks/hooklib.h
- lines changed 7, context: html, text, full: html, text
c3788110e8d865774fff8197cf5b47350472ba64 Tue Aug 4 11:26:55 2026 -0700
Fix hubSpace hook error handling and nested hub path handling, refs #37964
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
- lines changed 4, context: html, text, full: html, text
373b5c4187422a9584814dcfa324028fd2e50f14 Tue Aug 4 15:00:30 2026 -0700
Have the pre-finish hook return the rows it wrote, and fix the table display bugs that the real row data now lets us resolve, refs #37999
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
- src/hg/hgHubConnect/hooks/pre-create.c
- lines changed 7, context: html, text, full: html, text
c3788110e8d865774fff8197cf5b47350472ba64 Tue Aug 4 11:26:55 2026 -0700
Fix hubSpace hook error handling and nested hub path handling, refs #37964
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
- src/hg/hgHubConnect/hooks/pre-finish.c
- lines changed 41, context: html, text, full: html, text
c3788110e8d865774fff8197cf5b47350472ba64 Tue Aug 4 11:26:55 2026 -0700
Fix hubSpace hook error handling and nested hub path handling, refs #37964
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
- lines changed 24, context: html, text, full: html, text
373b5c4187422a9584814dcfa324028fd2e50f14 Tue Aug 4 15:00:30 2026 -0700
Have the pre-finish hook return the rows it wrote, and fix the table display bugs that the real row data now lets us resolve, refs #37999
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
- src/hg/hgHubConnect/trackHubWizard.c
- lines changed 18, context: html, text, full: html, text
373b5c4187422a9584814dcfa324028fd2e50f14 Tue Aug 4 15:00:30 2026 -0700
Have the pre-finish hook return the rows it wrote, and fix the table display bugs that the real row data now lets us resolve, refs #37999
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
- src/hg/hgLogin/hgLogin.c
- lines changed 19, context: html, text, full: html, text
c465f5ce00f640497ff3f0b607552d7701bfa758 Tue Aug 4 06:44:15 2026 -0700
hgLogin: show provider OAuth errors on the login page instead of falling through to the signup page; trim whitespace in oauth config values and log OIDC discovery failures; document CILogon/LS-AAI issuer URLs in mirrorManual. refs #37984
- lines changed 10, context: html, text, full: html, text
690cc018255362c9d1af6ed5f4fa15ae7a0fc81d Wed Aug 5 11:26:22 2026 -0700
changes after automated code review
hgLogin: sign the pending social identity with hmacMd5() instead of a hand-built
cookieSalt-prefix + MD5. The salt now keys the HMAC rather than being prepended to
the hashed message. This is the signature that closes the account-takeover hole in
the OAuth account chooser, so it should use a real MAC. It also now fails closed:
with login.cookieSalt unset the old code hashed an empty salt, so anyone could
compute a valid signature and the protection was silently absent - hgLogin refuses
to run a social login without the salt. Ordinary login pages never reach this check.
Pending identities in flight across the upgrade no longer validate; those users are
asked to sign in again.
lib/hmac.c: hmacSha1() and hmacMd5() sized their hex buffers at exactly 40 and 32
chars, so the last sprintf wrote its terminating zero one byte past the array and
the following strlen read out of bounds. Grow both by one and use cloneString().
Output is unchanged, verified against openssl dgst -hmac.
userAccounts.css: drop the #helpBox rule, unused since the last id="helpBox" was
removed from hgLogin.c.
mirrorManual, ex.hg.conf: the login section claimed "three" extra ways to sign in
when there are two (external provider, one-time email link). Also document that
login.cookieSalt is required for social sign-in, now that the check fails closed.
Edited mirrorManual.txt and regenerated the html with mirrorDocs/make, since the
html is pandoc output and hand edits there do not survive.
refs #37984
- lines changed 243, context: html, text, full: html, text
e81efb1074d9786436ed8cdb626fc3bdeb6ac14c Thu Aug 6 09:20:30 2026 -0700
hgLogin: fix the social-login/email-link code review issues from #38008
#Preview2 week - bugs introduced now will need a build patch to fix
Brian, thanks for the thorough review - every one of these was real. Here is what
I changed for the six items that stayed on the ticket (the pre-existing XSS and the
site-wide httpsCertCheck default went to #38011 and #38012).
1. Reflected XSS in the account chooser and the other new pages. Every address and
username now goes through htmlEncode() before it lands in the HTML or an attribute
(chooseAccountPage, completeAccountPage, emailLinkPage, changeEmailPage and the
confirmation pages). I also gated the email-link side of the chooser on
emailLinkEnabled(), so your chooseAccount + emailLogin_email=<img ...> URL now
renders the tag as text and does nothing at all where the feature is off.
2. Registering someone else's address to steal their social login. The two OAuth
email-match queries (resolveIdentity and chooseAccount) now require
accountActivated='Y', so an unactivated row someone planted with a victim's address
can no longer be matched or linked. completeAccount only marks the new account
activated when the provider actually verified the address and the user kept it;
otherwise it creates the account inactive and sends the usual confirmation mail, so
an unverified address can never be planted as a trusted one.
3. OAuth requests not enforcing the server certificate. Rather than poke the env var,
I added a small library knob, httpsSetCertCheck() in lib/https.c, that pins the
cert-check mode for the rest of the process and is not overwritten by openSslInit()
or hg.conf. hgLogin's httpRequest() calls it with "abort", so those requests refuse
a bad certificate no matter how the site is configured, and it no longer depends on
being the first HTTPS connection.
4. The pending-identity signature. It now also covers the hguid (which survives the
provider redirect, unlike the hgsid) and the time it was minted, with a 15-minute
expiry, and it is cleared on the failure paths too. A signature that leaks into a
saved or shared session is now useless to another browser and dies quickly anyway.
5. changeEmail. It now asks for the current password where the account has one, and it
no longer changes the address on the spot - it emails a one-time signed confirmation
link to the new address and only applies the change when that link is opened. When the
change lands it also mails the OLD address to say the account's email was changed and
who to contact if that wasn't them, so a hijack gets noticed. One honest caveat: an
account with no password (social-only) still can't be re-checked before the change, so
a stolen cookie could still start it - but the old-address alert now gives the owner a
way to catch it. Expiring login cookies is the deeper fix and feels like its own ticket.
6. isalnum() on a signed char in suggestUsername - now cast to unsigned char.
Build is clean, no new warnings. Set back to you for another look.
refs #38008
- lines changed 10, context: html, text, full: html, text
4f7feb0c81142e6ff34ba5a23bee77d2e04a945d Thu Aug 6 13:25:41 2026 -0700
reposition the hide/show icon outside the password box and show mouse over information about the function refs #37921
- lines changed 15, context: html, text, full: html, text
bb3f3f9c420a366835a93d0073a5db3668282349 Mon Aug 10 09:50:47 2026 -0700
hgLogin: close the two remaining social-login account gaps, refs #38037
Fold the email-verified flag into the signed pending-identity string so it
can no longer be flipped by adding &oauth_pending_email_verified=1 to the
completeAccount request, which decided whether a new account was written
activated (trusted for future auto-linking).
Require accountActivated='Y' in the four passwordless email-link queries
(sendEmailLink, emailLogin, and the two email-mode chooser queries), so the
login link no longer signs anyone into an unactivated account that a stranger
created with their address. Password login and the OAuth queries already did
this.
- src/hg/hgLogin/oauthLogin.c
- lines changed 24, context: html, text, full: html, text
c465f5ce00f640497ff3f0b607552d7701bfa758 Tue Aug 4 06:44:15 2026 -0700
hgLogin: show provider OAuth errors on the login page instead of falling through to the signup page; trim whitespace in oauth config values and log OIDC discovery failures; document CILogon/LS-AAI issuer URLs in mirrorManual. refs #37984
- lines changed 9, context: html, text, full: html, text
e81efb1074d9786436ed8cdb626fc3bdeb6ac14c Thu Aug 6 09:20:30 2026 -0700
hgLogin: fix the social-login/email-link code review issues from #38008
#Preview2 week - bugs introduced now will need a build patch to fix
Brian, thanks for the thorough review - every one of these was real. Here is what
I changed for the six items that stayed on the ticket (the pre-existing XSS and the
site-wide httpsCertCheck default went to #38011 and #38012).
1. Reflected XSS in the account chooser and the other new pages. Every address and
username now goes through htmlEncode() before it lands in the HTML or an attribute
(chooseAccountPage, completeAccountPage, emailLinkPage, changeEmailPage and the
confirmation pages). I also gated the email-link side of the chooser on
emailLinkEnabled(), so your chooseAccount + emailLogin_email=<img ...> URL now
renders the tag as text and does nothing at all where the feature is off.
2. Registering someone else's address to steal their social login. The two OAuth
email-match queries (resolveIdentity and chooseAccount) now require
accountActivated='Y', so an unactivated row someone planted with a victim's address
can no longer be matched or linked. completeAccount only marks the new account
activated when the provider actually verified the address and the user kept it;
otherwise it creates the account inactive and sends the usual confirmation mail, so
an unverified address can never be planted as a trusted one.
3. OAuth requests not enforcing the server certificate. Rather than poke the env var,
I added a small library knob, httpsSetCertCheck() in lib/https.c, that pins the
cert-check mode for the rest of the process and is not overwritten by openSslInit()
or hg.conf. hgLogin's httpRequest() calls it with "abort", so those requests refuse
a bad certificate no matter how the site is configured, and it no longer depends on
being the first HTTPS connection.
4. The pending-identity signature. It now also covers the hguid (which survives the
provider redirect, unlike the hgsid) and the time it was minted, with a 15-minute
expiry, and it is cleared on the failure paths too. A signature that leaks into a
saved or shared session is now useless to another browser and dies quickly anyway.
5. changeEmail. It now asks for the current password where the account has one, and it
no longer changes the address on the spot - it emails a one-time signed confirmation
link to the new address and only applies the change when that link is opened. When the
change lands it also mails the OLD address to say the account's email was changed and
who to contact if that wasn't them, so a hijack gets noticed. One honest caveat: an
account with no password (social-only) still can't be re-checked before the change, so
a stolen cookie could still start it - but the old-address alert now gives the owner a
way to catch it. Expiring login cookies is the deeper fix and feels like its own ticket.
6. isalnum() on a signed char in suggestUsername - now cast to unsigned char.
Build is clean, no new warnings. Set back to you for another look.
refs #38008
- src/hg/hgPcr/hgPcr.c
- lines changed 1, context: html, text, full: html, text
b5a4ddd8543a87f46988a60069148b0f2e1a8031 Mon Aug 10 08:37:29 2026 -0700
hgBlat/hgPcr: show the chrUn info note (fix swapped startsWith args), refs #37893
The chrUn branch of the sequence-type note used startsWith(name, "chrUn"),
but startsWith(start, string) tests whether string begins with start, so it
asked whether "chrUn" begins with the sequence name and never matched. As a
result chrUn (unplaced) sequences got no info icon on the new BLAT results
page, and no note on the classic results page or in hgPcr, while _alt/_fix/
_random (which use endsWith) worked. Fix the argument order in all three.
Also, on the new results page, check the sequence's aliases and not just its
single display name, so a hit whose displayed label is an accession but which
has a chrUn/alt/fix alias (e.g. a GenArk hub) still gets the note.
- src/hg/hgc/hgc.c
- lines changed 15, context: html, text, full: html, text
c7fcdde6db52ba01fbabfa695b49205bf7261a33 Tue Aug 4 07:40:32 2026 -0700
hgBlat/hgc: QA fixes for the new BLAT table view and alignment page
Address Gerardo's QA findings on the new BLAT UI:
- Table view: label each hit with its own query (new Query column +
"Queries" count in the summary) when the search has multiple queries,
reading cfg.multiQuery / hit.qName from the payload.
- Table view: strip the "hub_NNN_" prefix from the Assembly field so hub
assemblies no longer show a doubled prefix.
- Alignment page: strip the same prefix from the organism in the page title
for non-GenArk assembly hubs (blatAsmLabel fallback path).
- Table view: do not pre-select hit #1; show a prompt until the user clicks
a row, since top hits are often tied.
- Table view: add a divider between the Browser / New tab / Alignment links.
- Alignment page: sidebar link now reads "Side by Side Alignment" to match
the section heading.
- Alignment page: comma-format coordinates and base counts in the summary,
matching the table view and the rest of the browser.
refs #37893
- lines changed 55, context: html, text, full: html, text
81d7cff6cb6665feb772b1339b6298273a3c49be Thu Aug 6 08:24:38 2026 -0700
hgBlat new results page: table redesign, rename modal, share link, and an XSS fix
Iterates on the new hgBlat "table" results page (rendered by hg/js/hgBlat.js from
JSON emitted by hgBlat.c) per feedback on #37893:
- Columns: "Open in Genome Browser" (position link + new-tab icon), "Show"
(base alignment), Query coverage moved before Locus, score-scaled bar in the
Score column, Identity as plain %, comma-formatted Span. Locus is plain text,
clipped with a CSS ellipsis (full value in title).
- Tooltips on every action link and every column header (via the existing
convertTitleTagsToMouseovers mechanism).
- "Rename BLAT Track": a real modal dialog (replaces the old inline toggle form),
reusing the existing hgc buildBigPsl call via a new window.blatRenameCt() helper;
it no longer depends on a generic page-global. New cfg fields canRename /
trackName / trackDescription drive it.
- "Share a link": trash-backed stable URL toggle, with a share-nodes icon.
- Security: cgiEncode the query name in the htcUserAli detailsUrl (its sibling
already did), and htmlEncode every URL before it goes into an href in hgBlat.js,
so a crafted query/sequence name can't break out of the attribute (XSS).
- Shared htmlEncode() moved into hg/js/utils.js for reuse instead of a per-file
escaper.
- hg.conf: blatNewPageBanner (invite banner, default off), blatOldTracks
(keep/hide/delete previous BLAT tracks at creation) documented in ex.hg.conf;
hgc.c tags BLAT tracks with blatResult=on and clears prior ones per blatOldTracks.
refs #37893
- lines changed 41, context: html, text, full: html, text
bc236ffceb9ddc8632c872168c92c229206989af Mon Aug 10 08:25:30 2026 -0700
hgc BLAT alignment viewer: consistent headings, section reorder, friendlier expired-link message, refs #37893
- Sidebar links and section headings are now all sentence case, and each
sidebar link matches its heading (the Side-by-side heading is relabeled too).
- Reorder the modern single-page view to Query, Side-by-side, Genome so the
per-block jump links sit under Only genome sequence, where their anchors
actually are, rather than under Side-by-side; tighten the block-link spacing.
The reorder is done server-side (capture the shared library output via
open_memstream, emit the sections in the new order) so the page does not
reflow after it loads.
- htcUserAli now shows a friendly 'no longer available, run a new BLAT search'
message when the search's trash files have aged out, instead of a raw
file-open error.
- Free the open_memstream buffer with libc free(), not kent freeMem().
- lines changed 67, context: html, text, full: html, text
0043d5ee22db1de1ec305eadb8442bd5a59fe5d7 Mon Aug 10 08:55:00 2026 -0700
hgc: route non-BLAT alignment clicks to the modern single-page view, refs #37893
Behind a new modernAlignPage hg.conf gate (default off), ordinary alignment
details -- mRNA/EST (htcCdnaAli), PSL/bigPsl, protein, cross-species and the
other showSomeAlignment callers -- now render in the modern single-page
alignment instead of the classic two-frame <frameset>, matching hgBlat's new
results page.
- Generalize showSomeAlignmentModern with a blatContext flag: TRUE keeps the
hgBlat chrome (title 'BLAT Base Alignment', 'Back to results', 'Share a
link'); FALSE is a plain track click, which has no BLAT results to return to
or share, so the title is just 'Base Alignment' and those buttons are omitted.
- alnModernStart() starts modern chrome and arms a flag when modernAlignPage is
set; showSomeAlignment() then renders the modern body, else the classic
frameset. htmlFramesetStart() is left untouched (it is shared with transMap,
retro and pubs click pages), so only the converted callers change.
- The window-restricted (showSomePartialDnaAlignment) and Lowe-Lab
(showSomeAlignment2) renderers are left classic for now.
- Register modernAlignPage in hgConfCatalog.
- lines changed 4, context: html, text, full: html, text
44027478d0f745cc34c843717bee4a6a397b6022 Mon Aug 10 09:05:32 2026 -0700
hgc: route transMap, retrogene and literature alignments to the modern view too, refs #37893
These three click pages live in their own files (transMapClick.c, retroClick.c,
pubs.c) and called htmlFramesetStart directly, so they were missed when the other
alignment handlers moved to the modern single-page view. They all render through
showSomeAlignment, so exporting alnModernStart (was static) and swapping their
htmlFramesetStart call for it is enough: with modernAlignPage set they now show
the modern page (neutral, non-BLAT chrome), and the classic frameset otherwise.
- lines changed 7, context: html, text, full: html, text
d3d46ec513c57c6f94c97faa8f5cfcbdd644da22 Mon Aug 10 09:30:56 2026 -0700
hgc: add a 'Back to Genome Browser' button to the non-BLAT alignment pages, refs #37893
The modern alignment page in its neutral (non-BLAT) form had an empty title bar
on the right and no obvious way back to the browser. Add a 'Back to Genome
Browser >' button that returns to hgTracks at this alignment's own location
(db + chrom:start-end + hgsid) - the plain-track-click counterpart of the
hgBlat context's 'Back to results'.
- src/hg/hgc/hgc.h
- lines changed 4, context: html, text, full: html, text
44027478d0f745cc34c843717bee4a6a397b6022 Mon Aug 10 09:05:32 2026 -0700
hgc: route transMap, retrogene and literature alignments to the modern view too, refs #37893
These three click pages live in their own files (transMapClick.c, retroClick.c,
pubs.c) and called htmlFramesetStart directly, so they were missed when the other
alignment handlers moved to the modern single-page view. They all render through
showSomeAlignment, so exporting alnModernStart (was static) and swapping their
htmlFramesetStart call for it is enough: with modernAlignPage set they now show
the modern page (neutral, non-BLAT chrome), and the classic frameset otherwise.
- src/hg/hgc/pubs.c
- lines changed 1, context: html, text, full: html, text
44027478d0f745cc34c843717bee4a6a397b6022 Mon Aug 10 09:05:32 2026 -0700
hgc: route transMap, retrogene and literature alignments to the modern view too, refs #37893
These three click pages live in their own files (transMapClick.c, retroClick.c,
pubs.c) and called htmlFramesetStart directly, so they were missed when the other
alignment handlers moved to the modern single-page view. They all render through
showSomeAlignment, so exporting alnModernStart (was static) and swapping their
htmlFramesetStart call for it is enough: with modernAlignPage set they now show
the modern page (neutral, non-BLAT chrome), and the classic frameset otherwise.
- src/hg/hgc/retroClick.c
- lines changed 1, context: html, text, full: html, text
44027478d0f745cc34c843717bee4a6a397b6022 Mon Aug 10 09:05:32 2026 -0700
hgc: route transMap, retrogene and literature alignments to the modern view too, refs #37893
These three click pages live in their own files (transMapClick.c, retroClick.c,
pubs.c) and called htmlFramesetStart directly, so they were missed when the other
alignment handlers moved to the modern single-page view. They all render through
showSomeAlignment, so exporting alnModernStart (was static) and swapping their
htmlFramesetStart call for it is enough: with modernAlignPage set they now show
the modern page (neutral, non-BLAT chrome), and the classic frameset otherwise.
- src/hg/hgc/transMapClick.c
- lines changed 1, context: html, text, full: html, text
44027478d0f745cc34c843717bee4a6a397b6022 Mon Aug 10 09:05:32 2026 -0700
hgc: route transMap, retrogene and literature alignments to the modern view too, refs #37893
These three click pages live in their own files (transMapClick.c, retroClick.c,
pubs.c) and called htmlFramesetStart directly, so they were missed when the other
alignment handlers moved to the modern single-page view. They all render through
showSomeAlignment, so exporting alnModernStart (was static) and swapping their
htmlFramesetStart call for it is enough: with modernAlignPage set they now show
the modern page (neutral, non-BLAT chrome), and the classic frameset otherwise.
- src/hg/htdocs/goldenPath/help/mirrorManual.html
- lines changed 10, context: html, text, full: html, text
c465f5ce00f640497ff3f0b607552d7701bfa758 Tue Aug 4 06:44:15 2026 -0700
hgLogin: show provider OAuth errors on the login page instead of falling through to the signup page; trim whitespace in oauth config values and log OIDC discovery failures; document CILogon/LS-AAI issuer URLs in mirrorManual. refs #37984
- lines changed 8, context: html, text, full: html, text
690cc018255362c9d1af6ed5f4fa15ae7a0fc81d Wed Aug 5 11:26:22 2026 -0700
changes after automated code review
hgLogin: sign the pending social identity with hmacMd5() instead of a hand-built
cookieSalt-prefix + MD5. The salt now keys the HMAC rather than being prepended to
the hashed message. This is the signature that closes the account-takeover hole in
the OAuth account chooser, so it should use a real MAC. It also now fails closed:
with login.cookieSalt unset the old code hashed an empty salt, so anyone could
compute a valid signature and the protection was silently absent - hgLogin refuses
to run a social login without the salt. Ordinary login pages never reach this check.
Pending identities in flight across the upgrade no longer validate; those users are
asked to sign in again.
lib/hmac.c: hmacSha1() and hmacMd5() sized their hex buffers at exactly 40 and 32
chars, so the last sprintf wrote its terminating zero one byte past the array and
the following strlen read out of bounds. Grow both by one and use cloneString().
Output is unchanged, verified against openssl dgst -hmac.
userAccounts.css: drop the #helpBox rule, unused since the last id="helpBox" was
removed from hgLogin.c.
mirrorManual, ex.hg.conf: the login section claimed "three" extra ways to sign in
when there are two (external provider, one-time email link). Also document that
login.cookieSalt is required for social sign-in, now that the check fails closed.
Edited mirrorManual.txt and regenerated the html with mirrorDocs/make, since the
html is pandoc output and hand edits there do not survive.
refs #37984
- lines changed 14, context: html, text, full: html, text
dc2ff84f13d687001a9ac35324bff11f3f5835e7 Thu Aug 6 08:32:55 2026 -0700
updating mirror docs, no redmine
- src/hg/htdocs/images/newsArchImages/ClinPred.png
- lines changed 0, context: html, text, full: html, text
c1a2fd0a5413510099dc28beb813e58f63362d9e Wed Aug 5 16:56:47 2026 -0700
Adding image for the ClinPred announcement, refs #37510
- src/hg/htdocs/style/userAccounts.css
- lines changed 6, context: html, text, full: html, text
690cc018255362c9d1af6ed5f4fa15ae7a0fc81d Wed Aug 5 11:26:22 2026 -0700
changes after automated code review
hgLogin: sign the pending social identity with hmacMd5() instead of a hand-built
cookieSalt-prefix + MD5. The salt now keys the HMAC rather than being prepended to
the hashed message. This is the signature that closes the account-takeover hole in
the OAuth account chooser, so it should use a real MAC. It also now fails closed:
with login.cookieSalt unset the old code hashed an empty salt, so anyone could
compute a valid signature and the protection was silently absent - hgLogin refuses
to run a social login without the salt. Ordinary login pages never reach this check.
Pending identities in flight across the upgrade no longer validate; those users are
asked to sign in again.
lib/hmac.c: hmacSha1() and hmacMd5() sized their hex buffers at exactly 40 and 32
chars, so the last sprintf wrote its terminating zero one byte past the array and
the following strlen read out of bounds. Grow both by one and use cloneString().
Output is unchanged, verified against openssl dgst -hmac.
userAccounts.css: drop the #helpBox rule, unused since the last id="helpBox" was
removed from hgLogin.c.
mirrorManual, ex.hg.conf: the login section claimed "three" extra ways to sign in
when there are two (external provider, one-time email link). Also document that
login.cookieSalt is required for social sign-in, now that the check fails closed.
Edited mirrorManual.txt and regenerated the html with mirrorDocs/make, since the
html is pandoc output and hand edits there do not survive.
refs #37984
- src/hg/hubApi/findGenome.c
- lines changed 31, context: html, text, full: html, text
0cfb3c37fdb1de8873336f9d6f95b3422a465964 Sun Aug 9 10:45:26 2026 -0700
in the case of an equivalent available browser for a user browser build request, alert the user to the existence of the equivalent refs #31811
- src/hg/inc/userdata.h
- lines changed 14, context: html, text, full: html, text
c3788110e8d865774fff8197cf5b47350472ba64 Tue Aug 4 11:26:55 2026 -0700
Fix hubSpace hook error handling and nested hub path handling, refs #37964
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
- lines changed 8, context: html, text, full: html, text
373b5c4187422a9584814dcfa324028fd2e50f14 Tue Aug 4 15:00:30 2026 -0700
Have the pre-finish hook return the rows it wrote, and fix the table display bugs that the real row data now lets us resolve, refs #37999
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
- src/hg/js/hgBlat.js
- lines changed 32, context: html, text, full: html, text
c7fcdde6db52ba01fbabfa695b49205bf7261a33 Tue Aug 4 07:40:32 2026 -0700
hgBlat/hgc: QA fixes for the new BLAT table view and alignment page
Address Gerardo's QA findings on the new BLAT UI:
- Table view: label each hit with its own query (new Query column +
"Queries" count in the summary) when the search has multiple queries,
reading cfg.multiQuery / hit.qName from the payload.
- Table view: strip the "hub_NNN_" prefix from the Assembly field so hub
assemblies no longer show a doubled prefix.
- Alignment page: strip the same prefix from the organism in the page title
for non-GenArk assembly hubs (blatAsmLabel fallback path).
- Table view: do not pre-select hit #1; show a prompt until the user clicks
a row, since top hits are often tied.
- Table view: add a divider between the Browser / New tab / Alignment links.
- Alignment page: sidebar link now reads "Side by Side Alignment" to match
the section heading.
- Alignment page: comma-format coordinates and base counts in the summary,
matching the table view and the rest of the browser.
refs #37893
- lines changed 9, context: html, text, full: html, text
4ea2a83211550c3d706b60ad6a37fb896771e81d Tue Aug 4 07:49:33 2026 -0700
hgBlat table view: tighten colors and font sizes to the house style
Follow the UCSC browser UI style guide for CGI output more closely:
- drop the decorative green/orange coloring of the Matches/Mismatch values
in the detail panel; only the identity percentage keeps a meaningful color
(the semantic identity scale).
- make the selected-hit location plain ink instead of navy.
- shrink the oversized detail tile values (17px) and location (15px) to the
14px body size, so the panel reads as a data table, not a KPI dashboard.
- darken the washed-out faint-grey stat/tile labels to the palette's muted grey.
- use the palette header tint for the identity/coverage bar tracks instead of
an off-palette shade.
refs #37893
- lines changed 4, context: html, text, full: html, text
832428cffce91e64b62eb16c0ca2edff8de29501 Tue Aug 4 07:58:47 2026 -0700
hgBlat table view: give the header the house-style tan/wheat title band
The results header was steel-blue, which left the whole page a single blue
family (navy nav, blue-grey table, navy buttons/links) - it read as a generic
blue dashboard. Per the UCSC UI style guide the results bar is a title band
(page title + right-aligned primary action), so make it the signature wheat
#e9cf9a band with navy bold title, matching hgGateway/hgCollection. Steel-blue
stays for the section headers on the alignment page.
refs #37893
- lines changed 403, context: html, text, full: html, text
81d7cff6cb6665feb772b1339b6298273a3c49be Thu Aug 6 08:24:38 2026 -0700
hgBlat new results page: table redesign, rename modal, share link, and an XSS fix
Iterates on the new hgBlat "table" results page (rendered by hg/js/hgBlat.js from
JSON emitted by hgBlat.c) per feedback on #37893:
- Columns: "Open in Genome Browser" (position link + new-tab icon), "Show"
(base alignment), Query coverage moved before Locus, score-scaled bar in the
Score column, Identity as plain %, comma-formatted Span. Locus is plain text,
clipped with a CSS ellipsis (full value in title).
- Tooltips on every action link and every column header (via the existing
convertTitleTagsToMouseovers mechanism).
- "Rename BLAT Track": a real modal dialog (replaces the old inline toggle form),
reusing the existing hgc buildBigPsl call via a new window.blatRenameCt() helper;
it no longer depends on a generic page-global. New cfg fields canRename /
trackName / trackDescription drive it.
- "Share a link": trash-backed stable URL toggle, with a share-nodes icon.
- Security: cgiEncode the query name in the htcUserAli detailsUrl (its sibling
already did), and htmlEncode every URL before it goes into an href in hgBlat.js,
so a crafted query/sequence name can't break out of the attribute (XSS).
- Shared htmlEncode() moved into hg/js/utils.js for reuse instead of a per-file
escaper.
- hg.conf: blatNewPageBanner (invite banner, default off), blatOldTracks
(keep/hide/delete previous BLAT tracks at creation) documented in ex.hg.conf;
hgc.c tags BLAT tracks with blatResult=on and clears prior ones per blatOldTracks.
refs #37893
- src/hg/js/hgMyData.js
- lines changed 34, context: html, text, full: html, text
c3788110e8d865774fff8197cf5b47350472ba64 Tue Aug 4 11:26:55 2026 -0700
Fix hubSpace hook error handling and nested hub path handling, refs #37964
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
- lines changed 196, context: html, text, full: html, text
373b5c4187422a9584814dcfa324028fd2e50f14 Tue Aug 4 15:00:30 2026 -0700
Have the pre-finish hook return the rows it wrote, and fix the table display bugs that the real row data now lets us resolve, refs #37999
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
- lines changed 166, context: html, text, full: html, text
25a03671f5c95936def6417c86b830e214d51d76 Wed Aug 5 11:38:27 2026 -0700
Name the hub from the 2bit or hub.txt, and keep the batch inputs in step with the files, refs #37972
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
- lines changed 103, context: html, text, full: html, text
616c17576bf1e99f9452a8b64fc62121b3fd19db Wed Aug 5 12:39:46 2026 -0700
Refuse a batch that would put more than one genome in a hub we build, refs #37998
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
- lines changed 89, context: html, text, full: html, text
c8c6f609f1998f92db7e4bbb329e252b50f8edd9 Thu Aug 6 11:42:01 2026 -0700
hubspace: fixing bugs from nightly code review and what Gerardo noted in #37964-note 12
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
- src/hg/js/utils.js
- lines changed 7, context: html, text, full: html, text
81d7cff6cb6665feb772b1339b6298273a3c49be Thu Aug 6 08:24:38 2026 -0700
hgBlat new results page: table redesign, rename modal, share link, and an XSS fix
Iterates on the new hgBlat "table" results page (rendered by hg/js/hgBlat.js from
JSON emitted by hgBlat.c) per feedback on #37893:
- Columns: "Open in Genome Browser" (position link + new-tab icon), "Show"
(base alignment), Query coverage moved before Locus, score-scaled bar in the
Score column, Identity as plain %, comma-formatted Span. Locus is plain text,
clipped with a CSS ellipsis (full value in title).
- Tooltips on every action link and every column header (via the existing
convertTitleTagsToMouseovers mechanism).
- "Rename BLAT Track": a real modal dialog (replaces the old inline toggle form),
reusing the existing hgc buildBigPsl call via a new window.blatRenameCt() helper;
it no longer depends on a generic page-global. New cfg fields canRename /
trackName / trackDescription drive it.
- "Share a link": trash-backed stable URL toggle, with a share-nodes icon.
- Security: cgiEncode the query name in the htcUserAli detailsUrl (its sibling
already did), and htmlEncode every URL before it goes into an href in hgBlat.js,
so a crafted query/sequence name can't break out of the attribute (XSS).
- Shared htmlEncode() moved into hg/js/utils.js for reuse instead of a per-file
escaper.
- hg.conf: blatNewPageBanner (invite banner, default off), blatOldTracks
(keep/hide/delete previous BLAT tracks at creation) documented in ex.hg.conf;
hgc.c tags BLAT tracks with blatResult=on and clears prior ones per blatOldTracks.
refs #37893
- src/hg/lib/hui.c
- lines changed 40, context: html, text, full: html, text
c9655cda984d9a119d0c4ee37505392fa853a224 Thu Aug 6 05:47:02 2026 -0700
Move the orphaned range-filter warning from hgTrackUi to hubCheck, refs #37927
Per Brian's review comment: a new warning on the track config page makes hubs
that used to work look broken to whoever opens them, and the browser is the
wrong place to nag about it. Revert the hui.c warning and do the check in
hubCheck instead, where the hub author is the one reading the output.
The check now looks only at settings declared on the stanza itself, so an
orphaned filterByRange on a composite parent is reported once rather than
repeated for every subtrack. The filter.<field> lookup still walks up the
parent chain, so a subtrack that inherits its default range stays quiet.
- src/hg/lib/userdata.c
- lines changed 172, context: html, text, full: html, text
c3788110e8d865774fff8197cf5b47350472ba64 Tue Aug 4 11:26:55 2026 -0700
Fix hubSpace hook error handling and nested hub path handling, refs #37964
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
- lines changed 67, context: html, text, full: html, text
373b5c4187422a9584814dcfa324028fd2e50f14 Tue Aug 4 15:00:30 2026 -0700
Have the pre-finish hook return the rows it wrote, and fix the table display bugs that the real row data now lets us resolve, refs #37999
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
- src/hg/makeDb/doc/fishAsmHub/fish.orderList.tsv
- lines changed 5, context: html, text, full: html, text
8f5fc6644c7654da1afc394e55d4ccdbd6836070 Fri Aug 7 22:51:47 2026 -0700
add a few per user requests and testing the otto build system refs #29545
- src/hg/makeDb/doc/hg38/cactus447.txt
- lines changed 66, context: html, text, full: html, text
6a96b29dc052f9edc8af110b5751dae667620938 Thu Aug 6 09:10:47 2026 -0700
hg38 cactus447way makeDoc: document the fix2 length-bug rebuild
#Preview2 week - bugs introduced now will need a build patch to fix
Record the fix2 rebuild of cactus447way (corrected published Zoonomia MAF,
per-chrom slice + mafAddIRows + bigMaf, -cat stitch, and the summary bb built
with the fixed hgLoadMafSummary): commands, verification (old chrY 94 bad
blocks -> 0; summary 446 clean species names), and the reversible genome-test
staging that still awaits the public push.
refs #37841
- src/hg/makeDb/doc/hg38/popEve.txt
- lines changed 3, context: html, text, full: html, text
1de43b26fd18d5be3585829158d9b65944979094 Wed Aug 5 17:19:10 2026 -0700
Harden popEVE build drivers per code review. refs #37950 refs #37791
- Add "set -o pipefail" to both build scripts so a bedToBigBed failure piped to tail is not
masked (runBuildDense.sh reported the previous file's size on failure).
- runBuild.sh (sparse) now writes popEve_sparse.bb instead of popEve.bb, so re-running it
cannot silently clobber the dense popEve.bb produced by runBuildDense.sh. Makedoc updated.
- src/hg/makeDb/doc/mammalsAsmHub/mammals.orderList.tsv
- lines changed 9, context: html, text, full: html, text
8f5fc6644c7654da1afc394e55d4ccdbd6836070 Fri Aug 7 22:51:47 2026 -0700
add a few per user requests and testing the otto build system refs #29545
- src/hg/makeDb/doc/mm10.txt
- lines changed 52, context: html, text, full: html, text
bc527b6264234c33824854e5b596fb6f790983d4 Tue Aug 4 14:22:28 2026 -0700
Fix release blockers and data errors found during QA of the mouseDevTimecourse tracks. refs #37001
Add maxWindowToDraw 10000000 to the six bigBarChart subtracks. Without it a
whole-chromosome view asked the track to draw 3445 items x 156 bars and took 71
seconds on mm10 and 69 on mm39. The superTrack is on by default, so any mouse
user zooming out could hit it. Now 254 ms and 86 ms.
Correct a 1-bp off-by-one in the bigBarChart chromStart. The hub builder wrote
1-based GTF gene starts into the 0-based BED chromStart field, so every gene sat
one base right of its true start while chromEnd was correct. Measured against
GENCODE on mm10 before the fix, 42081/42093 genes (VM21) and 35323/35333 (VM4)
were start+1 with none exact. Added fixBarChartStarts.sh, which rebuilds the
files and refuses to run on one that has already been corrected. Originals kept
as *.bb.preStartFix. Reported upstream to the hub author.
Correct the replicate numbers on the bigWig signal composite. The biosample TSV
has no replicate column, so generateBigwigTrackDb.py had been deriving one by
sorting biosample accessions alphabetically, which mislabeled 124 of the 312
subtracks and flipped the default-on state of 62 of them. Added
fetchReplicateNumbers.py to read the real biological_replicate_number from the
ENCODE portal.
Rewrite the signal shortLabels. They had been hard-truncated at 20 characters,
which left 20 subtracks with duplicate labels. The generator now emits a
one-letter view code and errors out if two labels match within the 17 characters
hgTracks draws in the left label area, rather than silently truncating.
Make generateBigwigTrackDb.py reproduce the committed .ra. It now emits the
two-digit tissue prefixes that give the author-requested biological order, and
the html setting, instead of depending on a one-off patch applied afterwards.
Add barChartMerge, barChartMetric, labelFields and defaultLabelFields, and Title
Case all shortLabels.
Update the nine description pages: replicate wording to match barChartMerge,
GitHub source links to the makedoc, build scripts and trackDb in Methods, an
mm39 liftOver accounting note, and remove a duplicated sentence from the shared
Display include.
Add curl -f to downloadBigwigs.sh so an HTTP error body is never saved as a
bigWig and then skipped forever by the restart check.
- src/hg/makeDb/doc/mm39/mouseDevTimecourse.txt
- lines changed 22, context: html, text, full: html, text
bc527b6264234c33824854e5b596fb6f790983d4 Tue Aug 4 14:22:28 2026 -0700
Fix release blockers and data errors found during QA of the mouseDevTimecourse tracks. refs #37001
Add maxWindowToDraw 10000000 to the six bigBarChart subtracks. Without it a
whole-chromosome view asked the track to draw 3445 items x 156 bars and took 71
seconds on mm10 and 69 on mm39. The superTrack is on by default, so any mouse
user zooming out could hit it. Now 254 ms and 86 ms.
Correct a 1-bp off-by-one in the bigBarChart chromStart. The hub builder wrote
1-based GTF gene starts into the 0-based BED chromStart field, so every gene sat
one base right of its true start while chromEnd was correct. Measured against
GENCODE on mm10 before the fix, 42081/42093 genes (VM21) and 35323/35333 (VM4)
were start+1 with none exact. Added fixBarChartStarts.sh, which rebuilds the
files and refuses to run on one that has already been corrected. Originals kept
as *.bb.preStartFix. Reported upstream to the hub author.
Correct the replicate numbers on the bigWig signal composite. The biosample TSV
has no replicate column, so generateBigwigTrackDb.py had been deriving one by
sorting biosample accessions alphabetically, which mislabeled 124 of the 312
subtracks and flipped the default-on state of 62 of them. Added
fetchReplicateNumbers.py to read the real biological_replicate_number from the
ENCODE portal.
Rewrite the signal shortLabels. They had been hard-truncated at 20 characters,
which left 20 subtracks with duplicate labels. The generator now emits a
one-letter view code and errors out if two labels match within the 17 characters
hgTracks draws in the left label area, rather than silently truncating.
Make generateBigwigTrackDb.py reproduce the committed .ra. It now emits the
two-digit tissue prefixes that give the author-requested biological order, and
the html setting, instead of depending on a one-off patch applied afterwards.
Add barChartMerge, barChartMetric, labelFields and defaultLabelFields, and Title
Case all shortLabels.
Update the nine description pages: replicate wording to match barChartMerge,
GitHub source links to the makedoc, build scripts and trackDb in Methods, an
mm39 liftOver accounting note, and remove a duplicated sentence from the shared
Display include.
Add curl -f to downloadBigwigs.sh so an HTTP error body is never saved as a
bigWig and then skipped forever by the restart check.
- src/hg/makeDb/doc/plantsAsmHub/plants.orderList.tsv
- lines changed 1, context: html, text, full: html, text
301997e3ba801940aa1f0b67ba1ed2daacbf126a Fri Aug 7 22:59:09 2026 -0700
moved GCA_000002595.3 to legacy refs #29545
- src/hg/makeDb/hgLoadMaf/hgLoadMafSummary.c
- lines changed 67, context: html, text, full: html, text
2070aedea88da26aee0af3e2fd867b67140b09b5 Wed Aug 5 16:59:19 2026 -0700
Move the maf sequence-name splitter into jkweb so both summary tools share one copy. refs #37928
mafSplitSrcGetChrom existed as two independent copies, in hgLoadMafSummary.c and
mafToBigMafSummary.c, and they had diverged: only the first had the GenArk accession
rule added by 2db6bab8db0. It now lives in src/lib/maf.c, with the rules documented
in maf.h.
mafToBigMafSummary therefore picks up the GenArk rule it was missing, so a dotted
GenArk name like GCA_009914755.4.CM034974.1 now keeps its accession version instead of
dropping it, which matches what hprc90waySummary already holds.
Also removes mafCompGetSrcDb and mafCompGetSrcName from maf.c and maf.h. Both were
first-dot splitters with no callers anywhere in the tree.
- lines changed 4, context: html, text, full: html, text
a8b15f82bbcff0d7953bae0da7df49363939f85a Wed Aug 5 16:59:54 2026 -0700
Add tests for every maf sequence-name form, and describe the splitting in the usage messages. refs #37928
The existing testDot and testPipe inputs are identical copies of each other and both use
pipe-form query names, so the dot path was never exercised in either tool. That is how
the break in ae63ce5 shipped even though a test suite existed, and why the suite could
not have caught the mafToBigMafSummary divergence either.
New inputs in both tests directories cover an ordinary db.chrom, a species name with a
dotted chrom, both GenArk accession forms, a GenArk accession with no chrom after the
version, a pipe with a dotted chrom, a name with no separator, a reference assembly
whose own name contains a dot, and a name where the reference db is a strict prefix of
another assembly. Every rule in the splitter is now load-bearing: breaking any one of
them fails a target.
Also adds mafToBigMafSummary to TEST_DIRS in hg/utils, since nothing above the directory
was running its suite, and adds a short note to both usage messages describing how a
sequence name is split into assembly and sequence.
- src/hg/makeDb/hgLoadMaf/tests/expected/testDottedRef.tab
- lines changed 2, context: html, text, full: html, text
a8b15f82bbcff0d7953bae0da7df49363939f85a Wed Aug 5 16:59:54 2026 -0700
Add tests for every maf sequence-name form, and describe the splitting in the usage messages. refs #37928
The existing testDot and testPipe inputs are identical copies of each other and both use
pipe-form query names, so the dot path was never exercised in either tool. That is how
the break in ae63ce5 shipped even though a test suite existed, and why the suite could
not have caught the mafToBigMafSummary divergence either.
New inputs in both tests directories cover an ordinary db.chrom, a species name with a
dotted chrom, both GenArk accession forms, a GenArk accession with no chrom after the
version, a pipe with a dotted chrom, a name with no separator, a reference assembly
whose own name contains a dot, and a name where the reference db is a strict prefix of
another assembly. Every rule in the splitter is now load-bearing: breaking any one of
them fails a target.
Also adds mafToBigMafSummary to TEST_DIRS in hg/utils, since nothing above the directory
was running its suite, and adds a short note to both usage messages describing how a
sequence name is split into assembly and sequence.
- src/hg/makeDb/hgLoadMaf/tests/expected/testGenArkRef.tab
- lines changed 3, context: html, text, full: html, text
a8b15f82bbcff0d7953bae0da7df49363939f85a Wed Aug 5 16:59:54 2026 -0700
Add tests for every maf sequence-name form, and describe the splitting in the usage messages. refs #37928
The existing testDot and testPipe inputs are identical copies of each other and both use
pipe-form query names, so the dot path was never exercised in either tool. That is how
the break in ae63ce5 shipped even though a test suite existed, and why the suite could
not have caught the mafToBigMafSummary divergence either.
New inputs in both tests directories cover an ordinary db.chrom, a species name with a
dotted chrom, both GenArk accession forms, a GenArk accession with no chrom after the
version, a pipe with a dotted chrom, a name with no separator, a reference assembly
whose own name contains a dot, and a name where the reference db is a strict prefix of
another assembly. Every rule in the splitter is now load-bearing: breaking any one of
them fails a target.
Also adds mafToBigMafSummary to TEST_DIRS in hg/utils, since nothing above the directory
was running its suite, and adds a short note to both usage messages describing how a
sequence name is split into assembly and sequence.
- src/hg/makeDb/hgLoadMaf/tests/expected/testNameForms.tab
- lines changed 8, context: html, text, full: html, text
a8b15f82bbcff0d7953bae0da7df49363939f85a Wed Aug 5 16:59:54 2026 -0700
Add tests for every maf sequence-name form, and describe the splitting in the usage messages. refs #37928
The existing testDot and testPipe inputs are identical copies of each other and both use
pipe-form query names, so the dot path was never exercised in either tool. That is how
the break in ae63ce5 shipped even though a test suite existed, and why the suite could
not have caught the mafToBigMafSummary divergence either.
New inputs in both tests directories cover an ordinary db.chrom, a species name with a
dotted chrom, both GenArk accession forms, a GenArk accession with no chrom after the
version, a pipe with a dotted chrom, a name with no separator, a reference assembly
whose own name contains a dot, and a name where the reference db is a strict prefix of
another assembly. Every rule in the splitter is now load-bearing: breaking any one of
them fails a target.
Also adds mafToBigMafSummary to TEST_DIRS in hg/utils, since nothing above the directory
was running its suite, and adds a short note to both usage messages describing how a
sequence name is split into assembly and sequence.
- src/hg/makeDb/hgLoadMaf/tests/input/testDottedRef.maf
- lines changed 6, context: html, text, full: html, text
a8b15f82bbcff0d7953bae0da7df49363939f85a Wed Aug 5 16:59:54 2026 -0700
Add tests for every maf sequence-name form, and describe the splitting in the usage messages. refs #37928
The existing testDot and testPipe inputs are identical copies of each other and both use
pipe-form query names, so the dot path was never exercised in either tool. That is how
the break in ae63ce5 shipped even though a test suite existed, and why the suite could
not have caught the mafToBigMafSummary divergence either.
New inputs in both tests directories cover an ordinary db.chrom, a species name with a
dotted chrom, both GenArk accession forms, a GenArk accession with no chrom after the
version, a pipe with a dotted chrom, a name with no separator, a reference assembly
whose own name contains a dot, and a name where the reference db is a strict prefix of
another assembly. Every rule in the splitter is now load-bearing: breaking any one of
them fails a target.
Also adds mafToBigMafSummary to TEST_DIRS in hg/utils, since nothing above the directory
was running its suite, and adds a short note to both usage messages describing how a
sequence name is split into assembly and sequence.
- src/hg/makeDb/hgLoadMaf/tests/input/testGenArkRef.maf
- lines changed 7, context: html, text, full: html, text
a8b15f82bbcff0d7953bae0da7df49363939f85a Wed Aug 5 16:59:54 2026 -0700
Add tests for every maf sequence-name form, and describe the splitting in the usage messages. refs #37928
The existing testDot and testPipe inputs are identical copies of each other and both use
pipe-form query names, so the dot path was never exercised in either tool. That is how
the break in ae63ce5 shipped even though a test suite existed, and why the suite could
not have caught the mafToBigMafSummary divergence either.
New inputs in both tests directories cover an ordinary db.chrom, a species name with a
dotted chrom, both GenArk accession forms, a GenArk accession with no chrom after the
version, a pipe with a dotted chrom, a name with no separator, a reference assembly
whose own name contains a dot, and a name where the reference db is a strict prefix of
another assembly. Every rule in the splitter is now load-bearing: breaking any one of
them fails a target.
Also adds mafToBigMafSummary to TEST_DIRS in hg/utils, since nothing above the directory
was running its suite, and adds a short note to both usage messages describing how a
sequence name is split into assembly and sequence.
- src/hg/makeDb/hgLoadMaf/tests/input/testNameForms.maf
- lines changed 12, context: html, text, full: html, text
a8b15f82bbcff0d7953bae0da7df49363939f85a Wed Aug 5 16:59:54 2026 -0700
Add tests for every maf sequence-name form, and describe the splitting in the usage messages. refs #37928
The existing testDot and testPipe inputs are identical copies of each other and both use
pipe-form query names, so the dot path was never exercised in either tool. That is how
the break in ae63ce5 shipped even though a test suite existed, and why the suite could
not have caught the mafToBigMafSummary divergence either.
New inputs in both tests directories cover an ordinary db.chrom, a species name with a
dotted chrom, both GenArk accession forms, a GenArk accession with no chrom after the
version, a pipe with a dotted chrom, a name with no separator, a reference assembly
whose own name contains a dot, and a name where the reference db is a strict prefix of
another assembly. Every rule in the splitter is now load-bearing: breaking any one of
them fails a target.
Also adds mafToBigMafSummary to TEST_DIRS in hg/utils, since nothing above the directory
was running its suite, and adds a short note to both usage messages describing how a
sequence name is split into assembly and sequence.
- src/hg/makeDb/hgLoadMaf/tests/makefile
- lines changed 18, context: html, text, full: html, text
a8b15f82bbcff0d7953bae0da7df49363939f85a Wed Aug 5 16:59:54 2026 -0700
Add tests for every maf sequence-name form, and describe the splitting in the usage messages. refs #37928
The existing testDot and testPipe inputs are identical copies of each other and both use
pipe-form query names, so the dot path was never exercised in either tool. That is how
the break in ae63ce5 shipped even though a test suite existed, and why the suite could
not have caught the mafToBigMafSummary divergence either.
New inputs in both tests directories cover an ordinary db.chrom, a species name with a
dotted chrom, both GenArk accession forms, a GenArk accession with no chrom after the
version, a pipe with a dotted chrom, a name with no separator, a reference assembly
whose own name contains a dot, and a name where the reference db is a strict prefix of
another assembly. Every rule in the splitter is now load-bearing: breaking any one of
them fails a target.
Also adds mafToBigMafSummary to TEST_DIRS in hg/utils, since nothing above the directory
was running its suite, and adds a short note to both usage messages describing how a
sequence name is split into assembly and sequence.
- src/hg/makeDb/scripts/mouseDevTimecourse/downloadBigwigs.sh
- lines changed 3, context: html, text, full: html, text
bc527b6264234c33824854e5b596fb6f790983d4 Tue Aug 4 14:22:28 2026 -0700
Fix release blockers and data errors found during QA of the mouseDevTimecourse tracks. refs #37001
Add maxWindowToDraw 10000000 to the six bigBarChart subtracks. Without it a
whole-chromosome view asked the track to draw 3445 items x 156 bars and took 71
seconds on mm10 and 69 on mm39. The superTrack is on by default, so any mouse
user zooming out could hit it. Now 254 ms and 86 ms.
Correct a 1-bp off-by-one in the bigBarChart chromStart. The hub builder wrote
1-based GTF gene starts into the 0-based BED chromStart field, so every gene sat
one base right of its true start while chromEnd was correct. Measured against
GENCODE on mm10 before the fix, 42081/42093 genes (VM21) and 35323/35333 (VM4)
were start+1 with none exact. Added fixBarChartStarts.sh, which rebuilds the
files and refuses to run on one that has already been corrected. Originals kept
as *.bb.preStartFix. Reported upstream to the hub author.
Correct the replicate numbers on the bigWig signal composite. The biosample TSV
has no replicate column, so generateBigwigTrackDb.py had been deriving one by
sorting biosample accessions alphabetically, which mislabeled 124 of the 312
subtracks and flipped the default-on state of 62 of them. Added
fetchReplicateNumbers.py to read the real biological_replicate_number from the
ENCODE portal.
Rewrite the signal shortLabels. They had been hard-truncated at 20 characters,
which left 20 subtracks with duplicate labels. The generator now emits a
one-letter view code and errors out if two labels match within the 17 characters
hgTracks draws in the left label area, rather than silently truncating.
Make generateBigwigTrackDb.py reproduce the committed .ra. It now emits the
two-digit tissue prefixes that give the author-requested biological order, and
the html setting, instead of depending on a one-off patch applied afterwards.
Add barChartMerge, barChartMetric, labelFields and defaultLabelFields, and Title
Case all shortLabels.
Update the nine description pages: replicate wording to match barChartMerge,
GitHub source links to the makedoc, build scripts and trackDb in Methods, an
mm39 liftOver accounting note, and remove a duplicated sentence from the shared
Display include.
Add curl -f to downloadBigwigs.sh so an HTTP error body is never saved as a
bigWig and then skipped forever by the restart check.
- src/hg/makeDb/scripts/mouseDevTimecourse/fetchReplicateNumbers.py
- lines changed 90, context: html, text, full: html, text
bc527b6264234c33824854e5b596fb6f790983d4 Tue Aug 4 14:22:28 2026 -0700
Fix release blockers and data errors found during QA of the mouseDevTimecourse tracks. refs #37001
Add maxWindowToDraw 10000000 to the six bigBarChart subtracks. Without it a
whole-chromosome view asked the track to draw 3445 items x 156 bars and took 71
seconds on mm10 and 69 on mm39. The superTrack is on by default, so any mouse
user zooming out could hit it. Now 254 ms and 86 ms.
Correct a 1-bp off-by-one in the bigBarChart chromStart. The hub builder wrote
1-based GTF gene starts into the 0-based BED chromStart field, so every gene sat
one base right of its true start while chromEnd was correct. Measured against
GENCODE on mm10 before the fix, 42081/42093 genes (VM21) and 35323/35333 (VM4)
were start+1 with none exact. Added fixBarChartStarts.sh, which rebuilds the
files and refuses to run on one that has already been corrected. Originals kept
as *.bb.preStartFix. Reported upstream to the hub author.
Correct the replicate numbers on the bigWig signal composite. The biosample TSV
has no replicate column, so generateBigwigTrackDb.py had been deriving one by
sorting biosample accessions alphabetically, which mislabeled 124 of the 312
subtracks and flipped the default-on state of 62 of them. Added
fetchReplicateNumbers.py to read the real biological_replicate_number from the
ENCODE portal.
Rewrite the signal shortLabels. They had been hard-truncated at 20 characters,
which left 20 subtracks with duplicate labels. The generator now emits a
one-letter view code and errors out if two labels match within the 17 characters
hgTracks draws in the left label area, rather than silently truncating.
Make generateBigwigTrackDb.py reproduce the committed .ra. It now emits the
two-digit tissue prefixes that give the author-requested biological order, and
the html setting, instead of depending on a one-off patch applied afterwards.
Add barChartMerge, barChartMetric, labelFields and defaultLabelFields, and Title
Case all shortLabels.
Update the nine description pages: replicate wording to match barChartMerge,
GitHub source links to the makedoc, build scripts and trackDb in Methods, an
mm39 liftOver accounting note, and remove a duplicated sentence from the shared
Display include.
Add curl -f to downloadBigwigs.sh so an HTTP error body is never saved as a
bigWig and then skipped forever by the restart check.
- src/hg/makeDb/scripts/mouseDevTimecourse/fixBarChartStarts.sh
- lines changed 73, context: html, text, full: html, text
bc527b6264234c33824854e5b596fb6f790983d4 Tue Aug 4 14:22:28 2026 -0700
Fix release blockers and data errors found during QA of the mouseDevTimecourse tracks. refs #37001
Add maxWindowToDraw 10000000 to the six bigBarChart subtracks. Without it a
whole-chromosome view asked the track to draw 3445 items x 156 bars and took 71
seconds on mm10 and 69 on mm39. The superTrack is on by default, so any mouse
user zooming out could hit it. Now 254 ms and 86 ms.
Correct a 1-bp off-by-one in the bigBarChart chromStart. The hub builder wrote
1-based GTF gene starts into the 0-based BED chromStart field, so every gene sat
one base right of its true start while chromEnd was correct. Measured against
GENCODE on mm10 before the fix, 42081/42093 genes (VM21) and 35323/35333 (VM4)
were start+1 with none exact. Added fixBarChartStarts.sh, which rebuilds the
files and refuses to run on one that has already been corrected. Originals kept
as *.bb.preStartFix. Reported upstream to the hub author.
Correct the replicate numbers on the bigWig signal composite. The biosample TSV
has no replicate column, so generateBigwigTrackDb.py had been deriving one by
sorting biosample accessions alphabetically, which mislabeled 124 of the 312
subtracks and flipped the default-on state of 62 of them. Added
fetchReplicateNumbers.py to read the real biological_replicate_number from the
ENCODE portal.
Rewrite the signal shortLabels. They had been hard-truncated at 20 characters,
which left 20 subtracks with duplicate labels. The generator now emits a
one-letter view code and errors out if two labels match within the 17 characters
hgTracks draws in the left label area, rather than silently truncating.
Make generateBigwigTrackDb.py reproduce the committed .ra. It now emits the
two-digit tissue prefixes that give the author-requested biological order, and
the html setting, instead of depending on a one-off patch applied afterwards.
Add barChartMerge, barChartMetric, labelFields and defaultLabelFields, and Title
Case all shortLabels.
Update the nine description pages: replicate wording to match barChartMerge,
GitHub source links to the makedoc, build scripts and trackDb in Methods, an
mm39 liftOver accounting note, and remove a duplicated sentence from the shared
Display include.
Add curl -f to downloadBigwigs.sh so an HTTP error body is never saved as a
bigWig and then skipped forever by the restart check.
- src/hg/makeDb/scripts/mouseDevTimecourse/generateBigwigTrackDb.py
- lines changed 121, context: html, text, full: html, text
bc527b6264234c33824854e5b596fb6f790983d4 Tue Aug 4 14:22:28 2026 -0700
Fix release blockers and data errors found during QA of the mouseDevTimecourse tracks. refs #37001
Add maxWindowToDraw 10000000 to the six bigBarChart subtracks. Without it a
whole-chromosome view asked the track to draw 3445 items x 156 bars and took 71
seconds on mm10 and 69 on mm39. The superTrack is on by default, so any mouse
user zooming out could hit it. Now 254 ms and 86 ms.
Correct a 1-bp off-by-one in the bigBarChart chromStart. The hub builder wrote
1-based GTF gene starts into the 0-based BED chromStart field, so every gene sat
one base right of its true start while chromEnd was correct. Measured against
GENCODE on mm10 before the fix, 42081/42093 genes (VM21) and 35323/35333 (VM4)
were start+1 with none exact. Added fixBarChartStarts.sh, which rebuilds the
files and refuses to run on one that has already been corrected. Originals kept
as *.bb.preStartFix. Reported upstream to the hub author.
Correct the replicate numbers on the bigWig signal composite. The biosample TSV
has no replicate column, so generateBigwigTrackDb.py had been deriving one by
sorting biosample accessions alphabetically, which mislabeled 124 of the 312
subtracks and flipped the default-on state of 62 of them. Added
fetchReplicateNumbers.py to read the real biological_replicate_number from the
ENCODE portal.
Rewrite the signal shortLabels. They had been hard-truncated at 20 characters,
which left 20 subtracks with duplicate labels. The generator now emits a
one-letter view code and errors out if two labels match within the 17 characters
hgTracks draws in the left label area, rather than silently truncating.
Make generateBigwigTrackDb.py reproduce the committed .ra. It now emits the
two-digit tissue prefixes that give the author-requested biological order, and
the html setting, instead of depending on a one-off patch applied afterwards.
Add barChartMerge, barChartMetric, labelFields and defaultLabelFields, and Title
Case all shortLabels.
Update the nine description pages: replicate wording to match barChartMerge,
GitHub source links to the makedoc, build scripts and trackDb in Methods, an
mm39 liftOver accounting note, and remove a duplicated sentence from the shared
Display include.
Add curl -f to downloadBigwigs.sh so an HTTP error body is never saved as a
bigWig and then skipped forever by the restart check.
- src/hg/makeDb/scripts/popEve/runBuild.sh
- lines changed 5, context: html, text, full: html, text
1de43b26fd18d5be3585829158d9b65944979094 Wed Aug 5 17:19:10 2026 -0700
Harden popEVE build drivers per code review. refs #37950 refs #37791
- Add "set -o pipefail" to both build scripts so a bedToBigBed failure piped to tail is not
masked (runBuildDense.sh reported the previous file's size on failure).
- runBuild.sh (sparse) now writes popEve_sparse.bb instead of popEve.bb, so re-running it
cannot silently clobber the dense popEve.bb produced by runBuildDense.sh. Makedoc updated.
- src/hg/makeDb/scripts/popEve/runBuildDense.sh
- lines changed 1, context: html, text, full: html, text
1de43b26fd18d5be3585829158d9b65944979094 Wed Aug 5 17:19:10 2026 -0700
Harden popEVE build drivers per code review. refs #37950 refs #37791
- Add "set -o pipefail" to both build scripts so a bedToBigBed failure piped to tail is not
masked (runBuildDense.sh reported the previous file's size on failure).
- runBuild.sh (sparse) now writes popEve_sparse.bb instead of popEve.bb, so re-running it
cannot silently clobber the dense popEve.bb produced by runBuildDense.sh. Makedoc updated.
- src/hg/makeDb/scripts/singleCellSignalsPeaks/celltype-crosswalks/celltype-class.tsv
- lines changed 119, context: html, text, full: html, text
83b5ed84ca3b56a4b82c8ab52978a590d4862953 Thu Aug 6 14:24:38 2026 -0700
singleCellSignalsPeaks: classify every cell type, correct four glia/muscle classes
Working through the cell types that had no broad class took the hub from 361
unclassified types across 474 tracks down to zero, and the same crosswalk feeds the
native tracks. Most of it was reachable without new curation: the class-map key was not
dropping a trailing "cell(s)" the way the cell types themselves do, so entries like
"Stromal cell" and "Olfactory ensheathing cell" sat in the table fully classed but
unmatched; a " cCREs" suffix and a leading histone mark were being carried into the cell
type and splitting the lookup; and the atlases qualify a common type with the tissue it
came from ("Fibroblast gastrointestinal", "Smooth muscle colon", "Endothelial cell
myocardial"), which the lookup now resolves by falling back to shorter prefixes rather
than needing a row per tissue. Those changes live in the hub builder outside this tree.
Added here are the 92 rows the above could not reach: Drosophila optic-lobe and
mushroom-body neuron types, fly glia, immortalised lines, and PV/PV WT/PV KO/PV TG
parvalbumin interneurons. Aggregates and bare cluster identifiers get the explicit
Unknown class, so a track reads as "not resolved" rather than being unknown by omission.
Also corrected four assignments that were wrong rather than missing. Schwann cells were
grouped with astroglia by an earlier decision, but they are peripheral glia, and the
table already put olfactory ensheathing cells under Other, so the two disagreed. Enteric
glia had the same problem. "Satellite" was read as satellite glia when the data says
muscle: its one resolved tissue is muscle, and "Muscle satellite cell" was already
classed as Muscle. Bergmann and Muller glia stay under Astrocyte, both being genuine CNS
macroglia. A name-versus-class scan over the whole table turned up nothing else. The
hg38 .ra changes are the twelve resulting colours plus the priority reshuffle that
follows from ranking by class; mm10 has none of these cell types.
The description pages gain the reworded Astrocyte and Other legend entries, and the
legend now separates each class from its definition with a colon instead of an em dash.
refs #37914
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
- src/hg/makeDb/scripts/singleCellSignalsPeaks/celltype-crosswalks/paper-decodes/hg38_ct_class.tsv
- lines changed 4, context: html, text, full: html, text
83b5ed84ca3b56a4b82c8ab52978a590d4862953 Thu Aug 6 14:24:38 2026 -0700
singleCellSignalsPeaks: classify every cell type, correct four glia/muscle classes
Working through the cell types that had no broad class took the hub from 361
unclassified types across 474 tracks down to zero, and the same crosswalk feeds the
native tracks. Most of it was reachable without new curation: the class-map key was not
dropping a trailing "cell(s)" the way the cell types themselves do, so entries like
"Stromal cell" and "Olfactory ensheathing cell" sat in the table fully classed but
unmatched; a " cCREs" suffix and a leading histone mark were being carried into the cell
type and splitting the lookup; and the atlases qualify a common type with the tissue it
came from ("Fibroblast gastrointestinal", "Smooth muscle colon", "Endothelial cell
myocardial"), which the lookup now resolves by falling back to shorter prefixes rather
than needing a row per tissue. Those changes live in the hub builder outside this tree.
Added here are the 92 rows the above could not reach: Drosophila optic-lobe and
mushroom-body neuron types, fly glia, immortalised lines, and PV/PV WT/PV KO/PV TG
parvalbumin interneurons. Aggregates and bare cluster identifiers get the explicit
Unknown class, so a track reads as "not resolved" rather than being unknown by omission.
Also corrected four assignments that were wrong rather than missing. Schwann cells were
grouped with astroglia by an earlier decision, but they are peripheral glia, and the
table already put olfactory ensheathing cells under Other, so the two disagreed. Enteric
glia had the same problem. "Satellite" was read as satellite glia when the data says
muscle: its one resolved tissue is muscle, and "Muscle satellite cell" was already
classed as Muscle. Bergmann and Muller glia stay under Astrocyte, both being genuine CNS
macroglia. A name-versus-class scan over the whole table turned up nothing else. The
hg38 .ra changes are the twelve resulting colours plus the priority reshuffle that
follows from ranking by class; mm10 has none of these cell types.
The description pages gain the reworded Astrocyte and Other legend entries, and the
legend now separates each class from its definition with a colon instead of an em dash.
refs #37914
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
- src/hg/makeDb/scripts/singleCellSignalsPeaks/makeSingleCellSignalsPeaksRa.py
- lines changed 36, context: html, text, full: html, text
54766047e2e79d545162f894d20d631553175d3d Tue Aug 4 15:05:35 2026 -0700
singleCellSignalsPeaks: cite the SEA-AD resource paper, fail loudly on a hub-format change
The Hawrylycz 2024 reference was listed but never cited. It is the SEA-AD resource paper
and the source for the two brain regions the SEA-AD tracks cover, so it now appears on
that dataset's bullet alongside Gabitto. BrainVar and the Allen basal-ganglia set have no
paper to cite, so those bullets stay as they are.
makeSingleCellSignalsPeaksRa.py matched the parent line by exact string, so if the hub
ever emitted "parent <composite> off" or changed its spacing, every stanza would be
skipped and the script would write a header-only .ra and exit 0 -- the next trackDb load
would then quietly drop all 925/587 subtracks. It now matches on the parent's first token
and refuses to write when nothing matched, or when the subtrack count disagrees with the
facet metadata that build_stanzas emits alongside it. Verified: a renamed composite and a
truncated stanza file both exit non-zero without writing a file, a "parent <composite>
off" line still yields the full 587, and the regenerated .ra files are byte-identical to
the previous commit.
refs #37914
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
- lines changed 41, context: html, text, full: html, text
8fc41cc92ad76bdd8fd35671329b47be0b8d29a5 Fri Aug 7 13:27:42 2026 -0700
singleCellSignalsPeaks: indent the generated .ra, guard the subtrack rename
Indenting the hub stanzas broke the "track " match here, so subtracks kept their
cellBrowser<Asm>_ names and no longer matched the facet metadata. The counts still
passed, so nothing caught it. Now dedents on read, and refuses to write if a subtrack
lands outside the track's namespace or a source name is not cellBrowser<Asm>_* (the
rename slices at a fixed offset, so an odd name came out mangled but well-formed).
Also indents subtracks one step under the composite, matching chainNet/encode3. That
produced the whitespace-only .ra change committed separately; this reproduces it exactly.
refs #37914
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
- src/hg/makeDb/trackDb/betaGenArk.txt
- lines changed 1, context: html, text, full: html, text
0eb31efa784bb2ca354d34243f1ab5e36eff6df6 Tue Aug 4 12:44:45 2026 -0700
adding hprc2annot for qa
- src/hg/makeDb/trackDb/human/geneHancer.html
- lines changed 9, context: html, text, full: html, text
c6e05906db198eaba0c07fedd21f7d58353d1e2c Thu Aug 6 18:33:22 2026 -0700
Fixing the contact information for GeneHancer, refs #38019
- src/hg/makeDb/trackDb/human/hg38/singleCellSignalsPeaks.html
- lines changed 1, context: html, text, full: html, text
54766047e2e79d545162f894d20d631553175d3d Tue Aug 4 15:05:35 2026 -0700
singleCellSignalsPeaks: cite the SEA-AD resource paper, fail loudly on a hub-format change
The Hawrylycz 2024 reference was listed but never cited. It is the SEA-AD resource paper
and the source for the two brain regions the SEA-AD tracks cover, so it now appears on
that dataset's bullet alongside Gabitto. BrainVar and the Allen basal-ganglia set have no
paper to cite, so those bullets stay as they are.
makeSingleCellSignalsPeaksRa.py matched the parent line by exact string, so if the hub
ever emitted "parent <composite> off" or changed its spacing, every stanza would be
skipped and the script would write a header-only .ra and exit 0 -- the next trackDb load
would then quietly drop all 925/587 subtracks. It now matches on the parent's first token
and refuses to write when nothing matched, or when the subtrack count disagrees with the
facet metadata that build_stanzas emits alongside it. Verified: a renamed composite and a
truncated stanza file both exit non-zero without writing a file, a "parent <composite>
off" line still yields the full 587, and the regenerated .ra files are byte-identical to
the previous commit.
refs #37914
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
- lines changed 23, context: html, text, full: html, text
83b5ed84ca3b56a4b82c8ab52978a590d4862953 Thu Aug 6 14:24:38 2026 -0700
singleCellSignalsPeaks: classify every cell type, correct four glia/muscle classes
Working through the cell types that had no broad class took the hub from 361
unclassified types across 474 tracks down to zero, and the same crosswalk feeds the
native tracks. Most of it was reachable without new curation: the class-map key was not
dropping a trailing "cell(s)" the way the cell types themselves do, so entries like
"Stromal cell" and "Olfactory ensheathing cell" sat in the table fully classed but
unmatched; a " cCREs" suffix and a leading histone mark were being carried into the cell
type and splitting the lookup; and the atlases qualify a common type with the tissue it
came from ("Fibroblast gastrointestinal", "Smooth muscle colon", "Endothelial cell
myocardial"), which the lookup now resolves by falling back to shorter prefixes rather
than needing a row per tissue. Those changes live in the hub builder outside this tree.
Added here are the 92 rows the above could not reach: Drosophila optic-lobe and
mushroom-body neuron types, fly glia, immortalised lines, and PV/PV WT/PV KO/PV TG
parvalbumin interneurons. Aggregates and bare cluster identifiers get the explicit
Unknown class, so a track reads as "not resolved" rather than being unknown by omission.
Also corrected four assignments that were wrong rather than missing. Schwann cells were
grouped with astroglia by an earlier decision, but they are peripheral glia, and the
table already put olfactory ensheathing cells under Other, so the two disagreed. Enteric
glia had the same problem. "Satellite" was read as satellite glia when the data says
muscle: its one resolved tissue is muscle, and "Muscle satellite cell" was already
classed as Muscle. Bergmann and Muller glia stay under Astrocyte, both being genuine CNS
macroglia. A name-versus-class scan over the whole table turned up nothing else. The
hg38 .ra changes are the twelve resulting colours plus the priority reshuffle that
follows from ranking by class; mm10 has none of these cell types.
The description pages gain the reworded Astrocyte and Other legend entries, and the
legend now separates each class from its definition with a colon instead of an em dash.
refs #37914
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
- src/hg/makeDb/trackDb/human/hg38/singleCellSignalsPeaks.ra
- lines changed 68, context: html, text, full: html, text
83b5ed84ca3b56a4b82c8ab52978a590d4862953 Thu Aug 6 14:24:38 2026 -0700
singleCellSignalsPeaks: classify every cell type, correct four glia/muscle classes
Working through the cell types that had no broad class took the hub from 361
unclassified types across 474 tracks down to zero, and the same crosswalk feeds the
native tracks. Most of it was reachable without new curation: the class-map key was not
dropping a trailing "cell(s)" the way the cell types themselves do, so entries like
"Stromal cell" and "Olfactory ensheathing cell" sat in the table fully classed but
unmatched; a " cCREs" suffix and a leading histone mark were being carried into the cell
type and splitting the lookup; and the atlases qualify a common type with the tissue it
came from ("Fibroblast gastrointestinal", "Smooth muscle colon", "Endothelial cell
myocardial"), which the lookup now resolves by falling back to shorter prefixes rather
than needing a row per tissue. Those changes live in the hub builder outside this tree.
Added here are the 92 rows the above could not reach: Drosophila optic-lobe and
mushroom-body neuron types, fly glia, immortalised lines, and PV/PV WT/PV KO/PV TG
parvalbumin interneurons. Aggregates and bare cluster identifiers get the explicit
Unknown class, so a track reads as "not resolved" rather than being unknown by omission.
Also corrected four assignments that were wrong rather than missing. Schwann cells were
grouped with astroglia by an earlier decision, but they are peripheral glia, and the
table already put olfactory ensheathing cells under Other, so the two disagreed. Enteric
glia had the same problem. "Satellite" was read as satellite glia when the data says
muscle: its one resolved tissue is muscle, and "Muscle satellite cell" was already
classed as Muscle. Bergmann and Muller glia stay under Astrocyte, both being genuine CNS
macroglia. A name-versus-class scan over the whole table turned up nothing else. The
hg38 .ra changes are the twelve resulting colours plus the priority reshuffle that
follows from ranking by class; mm10 has none of these cell types.
The description pages gain the reworded Astrocyte and Other legend entries, and the
legend now separates each class from its definition with a colon instead of an em dash.
refs #37914
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
- lines changed 0, context: html, text, full: html, text
f90843f04563bb0ab82346f719f2105d5f95a714 Fri Aug 7 13:19:06 2026 -0700
Changing indentation to match our norms. WHITESPACE-ONLY CHANGE, refs #37914
- src/hg/makeDb/trackDb/human/hs1/hs1PrimateChainNet.html
- lines changed 1, context: html, text, full: html, text
69a4cfc0966bc8230504a735ca7f897d5846ed92 Tue Aug 4 14:40:14 2026 -0700
Tweaks based on automataed CR, no refs
- src/hg/makeDb/trackDb/human/hs1/html/clinVar20220313.html
- lines changed 1, context: html, text, full: html, text
69a4cfc0966bc8230504a735ca7f897d5846ed92 Tue Aug 4 14:40:14 2026 -0700
Tweaks based on automataed CR, no refs
- src/hg/makeDb/trackDb/human/hs1/html/dbSNP155.html
- lines changed 1, context: html, text, full: html, text
69a4cfc0966bc8230504a735ca7f897d5846ed92 Tue Aug 4 14:40:14 2026 -0700
Tweaks based on automataed CR, no refs
- src/hg/makeDb/trackDb/human/hs1/html/gwasSNPs2022-03-08.html
- lines changed 1, context: html, text, full: html, text
69a4cfc0966bc8230504a735ca7f897d5846ed92 Tue Aug 4 14:40:14 2026 -0700
Tweaks based on automataed CR, no refs
- src/hg/makeDb/trackDb/human/trackDb.ra
- lines changed 1, context: html, text, full: html, text
58ca30639d0180e1cab1ea11c8863896e7596c5b Fri Aug 7 18:11:18 2026 -0700
Capitalizing "release 3" to "Release 3" in the Varaico pennantIcon note on the varsInPubs superTrack, per Bob's feedback. refs #37981
- src/hg/makeDb/trackDb/mouse/mm10/developmentTimecourseM21mm10FPKM.html
- lines changed 17, context: html, text, full: html, text
bc527b6264234c33824854e5b596fb6f790983d4 Tue Aug 4 14:22:28 2026 -0700
Fix release blockers and data errors found during QA of the mouseDevTimecourse tracks. refs #37001
Add maxWindowToDraw 10000000 to the six bigBarChart subtracks. Without it a
whole-chromosome view asked the track to draw 3445 items x 156 bars and took 71
seconds on mm10 and 69 on mm39. The superTrack is on by default, so any mouse
user zooming out could hit it. Now 254 ms and 86 ms.
Correct a 1-bp off-by-one in the bigBarChart chromStart. The hub builder wrote
1-based GTF gene starts into the 0-based BED chromStart field, so every gene sat
one base right of its true start while chromEnd was correct. Measured against
GENCODE on mm10 before the fix, 42081/42093 genes (VM21) and 35323/35333 (VM4)
were start+1 with none exact. Added fixBarChartStarts.sh, which rebuilds the
files and refuses to run on one that has already been corrected. Originals kept
as *.bb.preStartFix. Reported upstream to the hub author.
Correct the replicate numbers on the bigWig signal composite. The biosample TSV
has no replicate column, so generateBigwigTrackDb.py had been deriving one by
sorting biosample accessions alphabetically, which mislabeled 124 of the 312
subtracks and flipped the default-on state of 62 of them. Added
fetchReplicateNumbers.py to read the real biological_replicate_number from the
ENCODE portal.
Rewrite the signal shortLabels. They had been hard-truncated at 20 characters,
which left 20 subtracks with duplicate labels. The generator now emits a
one-letter view code and errors out if two labels match within the 17 characters
hgTracks draws in the left label area, rather than silently truncating.
Make generateBigwigTrackDb.py reproduce the committed .ra. It now emits the
two-digit tissue prefixes that give the author-requested biological order, and
the html setting, instead of depending on a one-off patch applied afterwards.
Add barChartMerge, barChartMetric, labelFields and defaultLabelFields, and Title
Case all shortLabels.
Update the nine description pages: replicate wording to match barChartMerge,
GitHub source links to the makedoc, build scripts and trackDb in Methods, an
mm39 liftOver accounting note, and remove a duplicated sentence from the shared
Display include.
Add curl -f to downloadBigwigs.sh so an HTTP error body is never saved as a
bigWig and then skipped forever by the restart check.
- lines changed 7, context: html, text, full: html, text
b5ec4fbbfb04f97ebe23fbf6fbdf091dc120944e Tue Aug 4 14:47:26 2026 -0700
Remove barChartMerge from the mouseDevTimecourse tracks, it washes out the bar colors. refs #37001
barChartMerge fades a merged group's color toward white when the group has fewer
than 100 members. scaleColorPart() in facetedTable.c blends with maxVal 240 by
(threshold - count)/threshold, with threshold 100. That is built for the
Cell Browser single-cell tracks, where the facet count is a cell count in the
hundreds or thousands.
This track is bulk RNA-seq and its .facets count is 1 per sample, so merging by
tissue and time point gives a group count of 2. The blend is then 0.02*color +
0.98*240, which lands every channel at roughly 235-240: thymus #C8B400 rendered
as #EFEFEB. Measured on a rendered image at chr12:56694976-56714605, the track
went from 40 saturated colors to 0.
Reverting the setting restores the colors on both assemblies, verified against
the .facets palette. Also reverts the description page wording back to one bar
per replicate, and drops "grouped and" from the shared Display include since
grouping was only available through this setting.
The rest of the QA changes are unaffected: maxWindowToDraw, barChartMetric,
labelFields and defaultLabelFields are still in place, whole-chromosome renders
are still 245 ms, and the details page reports 156 of 156 bars again.
- lines changed 7, context: html, text, full: html, text
949e1f995b79d032d57a35e8dc9387066d72aa2c Wed Aug 5 17:02:58 2026 -0700
Shortening the scripts and makedoc link text on all 9 mouseDevTimecourse description pages, refs #37001
- src/hg/makeDb/trackDb/mouse/mm10/developmentTimecourseM21mm10TPM.html
- lines changed 17, context: html, text, full: html, text
bc527b6264234c33824854e5b596fb6f790983d4 Tue Aug 4 14:22:28 2026 -0700
Fix release blockers and data errors found during QA of the mouseDevTimecourse tracks. refs #37001
Add maxWindowToDraw 10000000 to the six bigBarChart subtracks. Without it a
whole-chromosome view asked the track to draw 3445 items x 156 bars and took 71
seconds on mm10 and 69 on mm39. The superTrack is on by default, so any mouse
user zooming out could hit it. Now 254 ms and 86 ms.
Correct a 1-bp off-by-one in the bigBarChart chromStart. The hub builder wrote
1-based GTF gene starts into the 0-based BED chromStart field, so every gene sat
one base right of its true start while chromEnd was correct. Measured against
GENCODE on mm10 before the fix, 42081/42093 genes (VM21) and 35323/35333 (VM4)
were start+1 with none exact. Added fixBarChartStarts.sh, which rebuilds the
files and refuses to run on one that has already been corrected. Originals kept
as *.bb.preStartFix. Reported upstream to the hub author.
Correct the replicate numbers on the bigWig signal composite. The biosample TSV
has no replicate column, so generateBigwigTrackDb.py had been deriving one by
sorting biosample accessions alphabetically, which mislabeled 124 of the 312
subtracks and flipped the default-on state of 62 of them. Added
fetchReplicateNumbers.py to read the real biological_replicate_number from the
ENCODE portal.
Rewrite the signal shortLabels. They had been hard-truncated at 20 characters,
which left 20 subtracks with duplicate labels. The generator now emits a
one-letter view code and errors out if two labels match within the 17 characters
hgTracks draws in the left label area, rather than silently truncating.
Make generateBigwigTrackDb.py reproduce the committed .ra. It now emits the
two-digit tissue prefixes that give the author-requested biological order, and
the html setting, instead of depending on a one-off patch applied afterwards.
Add barChartMerge, barChartMetric, labelFields and defaultLabelFields, and Title
Case all shortLabels.
Update the nine description pages: replicate wording to match barChartMerge,
GitHub source links to the makedoc, build scripts and trackDb in Methods, an
mm39 liftOver accounting note, and remove a duplicated sentence from the shared
Display include.
Add curl -f to downloadBigwigs.sh so an HTTP error body is never saved as a
bigWig and then skipped forever by the restart check.
- lines changed 8, context: html, text, full: html, text
b5ec4fbbfb04f97ebe23fbf6fbdf091dc120944e Tue Aug 4 14:47:26 2026 -0700
Remove barChartMerge from the mouseDevTimecourse tracks, it washes out the bar colors. refs #37001
barChartMerge fades a merged group's color toward white when the group has fewer
than 100 members. scaleColorPart() in facetedTable.c blends with maxVal 240 by
(threshold - count)/threshold, with threshold 100. That is built for the
Cell Browser single-cell tracks, where the facet count is a cell count in the
hundreds or thousands.
This track is bulk RNA-seq and its .facets count is 1 per sample, so merging by
tissue and time point gives a group count of 2. The blend is then 0.02*color +
0.98*240, which lands every channel at roughly 235-240: thymus #C8B400 rendered
as #EFEFEB. Measured on a rendered image at chr12:56694976-56714605, the track
went from 40 saturated colors to 0.
Reverting the setting restores the colors on both assemblies, verified against
the .facets palette. Also reverts the description page wording back to one bar
per replicate, and drops "grouped and" from the shared Display include since
grouping was only available through this setting.
The rest of the QA changes are unaffected: maxWindowToDraw, barChartMetric,
labelFields and defaultLabelFields are still in place, whole-chromosome renders
are still 245 ms, and the details page reports 156 of 156 bars again.
- lines changed 7, context: html, text, full: html, text
949e1f995b79d032d57a35e8dc9387066d72aa2c Wed Aug 5 17:02:58 2026 -0700
Shortening the scripts and makedoc link text on all 9 mouseDevTimecourse description pages, refs #37001
- src/hg/makeDb/trackDb/mouse/mm10/developmentTimecourseM4mm10FPKM.html
- lines changed 17, context: html, text, full: html, text
bc527b6264234c33824854e5b596fb6f790983d4 Tue Aug 4 14:22:28 2026 -0700
Fix release blockers and data errors found during QA of the mouseDevTimecourse tracks. refs #37001
Add maxWindowToDraw 10000000 to the six bigBarChart subtracks. Without it a
whole-chromosome view asked the track to draw 3445 items x 156 bars and took 71
seconds on mm10 and 69 on mm39. The superTrack is on by default, so any mouse
user zooming out could hit it. Now 254 ms and 86 ms.
Correct a 1-bp off-by-one in the bigBarChart chromStart. The hub builder wrote
1-based GTF gene starts into the 0-based BED chromStart field, so every gene sat
one base right of its true start while chromEnd was correct. Measured against
GENCODE on mm10 before the fix, 42081/42093 genes (VM21) and 35323/35333 (VM4)
were start+1 with none exact. Added fixBarChartStarts.sh, which rebuilds the
files and refuses to run on one that has already been corrected. Originals kept
as *.bb.preStartFix. Reported upstream to the hub author.
Correct the replicate numbers on the bigWig signal composite. The biosample TSV
has no replicate column, so generateBigwigTrackDb.py had been deriving one by
sorting biosample accessions alphabetically, which mislabeled 124 of the 312
subtracks and flipped the default-on state of 62 of them. Added
fetchReplicateNumbers.py to read the real biological_replicate_number from the
ENCODE portal.
Rewrite the signal shortLabels. They had been hard-truncated at 20 characters,
which left 20 subtracks with duplicate labels. The generator now emits a
one-letter view code and errors out if two labels match within the 17 characters
hgTracks draws in the left label area, rather than silently truncating.
Make generateBigwigTrackDb.py reproduce the committed .ra. It now emits the
two-digit tissue prefixes that give the author-requested biological order, and
the html setting, instead of depending on a one-off patch applied afterwards.
Add barChartMerge, barChartMetric, labelFields and defaultLabelFields, and Title
Case all shortLabels.
Update the nine description pages: replicate wording to match barChartMerge,
GitHub source links to the makedoc, build scripts and trackDb in Methods, an
mm39 liftOver accounting note, and remove a duplicated sentence from the shared
Display include.
Add curl -f to downloadBigwigs.sh so an HTTP error body is never saved as a
bigWig and then skipped forever by the restart check.
- lines changed 7, context: html, text, full: html, text
b5ec4fbbfb04f97ebe23fbf6fbdf091dc120944e Tue Aug 4 14:47:26 2026 -0700
Remove barChartMerge from the mouseDevTimecourse tracks, it washes out the bar colors. refs #37001
barChartMerge fades a merged group's color toward white when the group has fewer
than 100 members. scaleColorPart() in facetedTable.c blends with maxVal 240 by
(threshold - count)/threshold, with threshold 100. That is built for the
Cell Browser single-cell tracks, where the facet count is a cell count in the
hundreds or thousands.
This track is bulk RNA-seq and its .facets count is 1 per sample, so merging by
tissue and time point gives a group count of 2. The blend is then 0.02*color +
0.98*240, which lands every channel at roughly 235-240: thymus #C8B400 rendered
as #EFEFEB. Measured on a rendered image at chr12:56694976-56714605, the track
went from 40 saturated colors to 0.
Reverting the setting restores the colors on both assemblies, verified against
the .facets palette. Also reverts the description page wording back to one bar
per replicate, and drops "grouped and" from the shared Display include since
grouping was only available through this setting.
The rest of the QA changes are unaffected: maxWindowToDraw, barChartMetric,
labelFields and defaultLabelFields are still in place, whole-chromosome renders
are still 245 ms, and the details page reports 156 of 156 bars again.
- lines changed 7, context: html, text, full: html, text
949e1f995b79d032d57a35e8dc9387066d72aa2c Wed Aug 5 17:02:58 2026 -0700
Shortening the scripts and makedoc link text on all 9 mouseDevTimecourse description pages, refs #37001
- src/hg/makeDb/trackDb/mouse/mm10/developmentTimecourseM4mm10TPM.html
- lines changed 17, context: html, text, full: html, text
bc527b6264234c33824854e5b596fb6f790983d4 Tue Aug 4 14:22:28 2026 -0700
Fix release blockers and data errors found during QA of the mouseDevTimecourse tracks. refs #37001
Add maxWindowToDraw 10000000 to the six bigBarChart subtracks. Without it a
whole-chromosome view asked the track to draw 3445 items x 156 bars and took 71
seconds on mm10 and 69 on mm39. The superTrack is on by default, so any mouse
user zooming out could hit it. Now 254 ms and 86 ms.
Correct a 1-bp off-by-one in the bigBarChart chromStart. The hub builder wrote
1-based GTF gene starts into the 0-based BED chromStart field, so every gene sat
one base right of its true start while chromEnd was correct. Measured against
GENCODE on mm10 before the fix, 42081/42093 genes (VM21) and 35323/35333 (VM4)
were start+1 with none exact. Added fixBarChartStarts.sh, which rebuilds the
files and refuses to run on one that has already been corrected. Originals kept
as *.bb.preStartFix. Reported upstream to the hub author.
Correct the replicate numbers on the bigWig signal composite. The biosample TSV
has no replicate column, so generateBigwigTrackDb.py had been deriving one by
sorting biosample accessions alphabetically, which mislabeled 124 of the 312
subtracks and flipped the default-on state of 62 of them. Added
fetchReplicateNumbers.py to read the real biological_replicate_number from the
ENCODE portal.
Rewrite the signal shortLabels. They had been hard-truncated at 20 characters,
which left 20 subtracks with duplicate labels. The generator now emits a
one-letter view code and errors out if two labels match within the 17 characters
hgTracks draws in the left label area, rather than silently truncating.
Make generateBigwigTrackDb.py reproduce the committed .ra. It now emits the
two-digit tissue prefixes that give the author-requested biological order, and
the html setting, instead of depending on a one-off patch applied afterwards.
Add barChartMerge, barChartMetric, labelFields and defaultLabelFields, and Title
Case all shortLabels.
Update the nine description pages: replicate wording to match barChartMerge,
GitHub source links to the makedoc, build scripts and trackDb in Methods, an
mm39 liftOver accounting note, and remove a duplicated sentence from the shared
Display include.
Add curl -f to downloadBigwigs.sh so an HTTP error body is never saved as a
bigWig and then skipped forever by the restart check.
- lines changed 8, context: html, text, full: html, text
b5ec4fbbfb04f97ebe23fbf6fbdf091dc120944e Tue Aug 4 14:47:26 2026 -0700
Remove barChartMerge from the mouseDevTimecourse tracks, it washes out the bar colors. refs #37001
barChartMerge fades a merged group's color toward white when the group has fewer
than 100 members. scaleColorPart() in facetedTable.c blends with maxVal 240 by
(threshold - count)/threshold, with threshold 100. That is built for the
Cell Browser single-cell tracks, where the facet count is a cell count in the
hundreds or thousands.
This track is bulk RNA-seq and its .facets count is 1 per sample, so merging by
tissue and time point gives a group count of 2. The blend is then 0.02*color +
0.98*240, which lands every channel at roughly 235-240: thymus #C8B400 rendered
as #EFEFEB. Measured on a rendered image at chr12:56694976-56714605, the track
went from 40 saturated colors to 0.
Reverting the setting restores the colors on both assemblies, verified against
the .facets palette. Also reverts the description page wording back to one bar
per replicate, and drops "grouped and" from the shared Display include since
grouping was only available through this setting.
The rest of the QA changes are unaffected: maxWindowToDraw, barChartMetric,
labelFields and defaultLabelFields are still in place, whole-chromosome renders
are still 245 ms, and the details page reports 156 of 156 bars again.
- lines changed 7, context: html, text, full: html, text
949e1f995b79d032d57a35e8dc9387066d72aa2c Wed Aug 5 17:02:58 2026 -0700
Shortening the scripts and makedoc link text on all 9 mouseDevTimecourse description pages, refs #37001
- src/hg/makeDb/trackDb/mouse/mm10/developmentTimecourseSignalMm10.html
- lines changed 10, context: html, text, full: html, text
bc527b6264234c33824854e5b596fb6f790983d4 Tue Aug 4 14:22:28 2026 -0700
Fix release blockers and data errors found during QA of the mouseDevTimecourse tracks. refs #37001
Add maxWindowToDraw 10000000 to the six bigBarChart subtracks. Without it a
whole-chromosome view asked the track to draw 3445 items x 156 bars and took 71
seconds on mm10 and 69 on mm39. The superTrack is on by default, so any mouse
user zooming out could hit it. Now 254 ms and 86 ms.
Correct a 1-bp off-by-one in the bigBarChart chromStart. The hub builder wrote
1-based GTF gene starts into the 0-based BED chromStart field, so every gene sat
one base right of its true start while chromEnd was correct. Measured against
GENCODE on mm10 before the fix, 42081/42093 genes (VM21) and 35323/35333 (VM4)
were start+1 with none exact. Added fixBarChartStarts.sh, which rebuilds the
files and refuses to run on one that has already been corrected. Originals kept
as *.bb.preStartFix. Reported upstream to the hub author.
Correct the replicate numbers on the bigWig signal composite. The biosample TSV
has no replicate column, so generateBigwigTrackDb.py had been deriving one by
sorting biosample accessions alphabetically, which mislabeled 124 of the 312
subtracks and flipped the default-on state of 62 of them. Added
fetchReplicateNumbers.py to read the real biological_replicate_number from the
ENCODE portal.
Rewrite the signal shortLabels. They had been hard-truncated at 20 characters,
which left 20 subtracks with duplicate labels. The generator now emits a
one-letter view code and errors out if two labels match within the 17 characters
hgTracks draws in the left label area, rather than silently truncating.
Make generateBigwigTrackDb.py reproduce the committed .ra. It now emits the
two-digit tissue prefixes that give the author-requested biological order, and
the html setting, instead of depending on a one-off patch applied afterwards.
Add barChartMerge, barChartMetric, labelFields and defaultLabelFields, and Title
Case all shortLabels.
Update the nine description pages: replicate wording to match barChartMerge,
GitHub source links to the makedoc, build scripts and trackDb in Methods, an
mm39 liftOver accounting note, and remove a duplicated sentence from the shared
Display include.
Add curl -f to downloadBigwigs.sh so an HTTP error body is never saved as a
bigWig and then skipped forever by the restart check.
- lines changed 7, context: html, text, full: html, text
949e1f995b79d032d57a35e8dc9387066d72aa2c Wed Aug 5 17:02:58 2026 -0700
Shortening the scripts and makedoc link text on all 9 mouseDevTimecourse description pages, refs #37001
- src/hg/makeDb/trackDb/mouse/mm10/developmentTimecourseSignalMm10.ra
- lines changed 623, context: html, text, full: html, text
bc527b6264234c33824854e5b596fb6f790983d4 Tue Aug 4 14:22:28 2026 -0700
Fix release blockers and data errors found during QA of the mouseDevTimecourse tracks. refs #37001
Add maxWindowToDraw 10000000 to the six bigBarChart subtracks. Without it a
whole-chromosome view asked the track to draw 3445 items x 156 bars and took 71
seconds on mm10 and 69 on mm39. The superTrack is on by default, so any mouse
user zooming out could hit it. Now 254 ms and 86 ms.
Correct a 1-bp off-by-one in the bigBarChart chromStart. The hub builder wrote
1-based GTF gene starts into the 0-based BED chromStart field, so every gene sat
one base right of its true start while chromEnd was correct. Measured against
GENCODE on mm10 before the fix, 42081/42093 genes (VM21) and 35323/35333 (VM4)
were start+1 with none exact. Added fixBarChartStarts.sh, which rebuilds the
files and refuses to run on one that has already been corrected. Originals kept
as *.bb.preStartFix. Reported upstream to the hub author.
Correct the replicate numbers on the bigWig signal composite. The biosample TSV
has no replicate column, so generateBigwigTrackDb.py had been deriving one by
sorting biosample accessions alphabetically, which mislabeled 124 of the 312
subtracks and flipped the default-on state of 62 of them. Added
fetchReplicateNumbers.py to read the real biological_replicate_number from the
ENCODE portal.
Rewrite the signal shortLabels. They had been hard-truncated at 20 characters,
which left 20 subtracks with duplicate labels. The generator now emits a
one-letter view code and errors out if two labels match within the 17 characters
hgTracks draws in the left label area, rather than silently truncating.
Make generateBigwigTrackDb.py reproduce the committed .ra. It now emits the
two-digit tissue prefixes that give the author-requested biological order, and
the html setting, instead of depending on a one-off patch applied afterwards.
Add barChartMerge, barChartMetric, labelFields and defaultLabelFields, and Title
Case all shortLabels.
Update the nine description pages: replicate wording to match barChartMerge,
GitHub source links to the makedoc, build scripts and trackDb in Methods, an
mm39 liftOver accounting note, and remove a duplicated sentence from the shared
Display include.
Add curl -f to downloadBigwigs.sh so an HTTP error body is never saved as a
bigWig and then skipped forever by the restart check.
- src/hg/makeDb/trackDb/mouse/mm10/mouseDevTimecourse.html
- lines changed 20, context: html, text, full: html, text
bc527b6264234c33824854e5b596fb6f790983d4 Tue Aug 4 14:22:28 2026 -0700
Fix release blockers and data errors found during QA of the mouseDevTimecourse tracks. refs #37001
Add maxWindowToDraw 10000000 to the six bigBarChart subtracks. Without it a
whole-chromosome view asked the track to draw 3445 items x 156 bars and took 71
seconds on mm10 and 69 on mm39. The superTrack is on by default, so any mouse
user zooming out could hit it. Now 254 ms and 86 ms.
Correct a 1-bp off-by-one in the bigBarChart chromStart. The hub builder wrote
1-based GTF gene starts into the 0-based BED chromStart field, so every gene sat
one base right of its true start while chromEnd was correct. Measured against
GENCODE on mm10 before the fix, 42081/42093 genes (VM21) and 35323/35333 (VM4)
were start+1 with none exact. Added fixBarChartStarts.sh, which rebuilds the
files and refuses to run on one that has already been corrected. Originals kept
as *.bb.preStartFix. Reported upstream to the hub author.
Correct the replicate numbers on the bigWig signal composite. The biosample TSV
has no replicate column, so generateBigwigTrackDb.py had been deriving one by
sorting biosample accessions alphabetically, which mislabeled 124 of the 312
subtracks and flipped the default-on state of 62 of them. Added
fetchReplicateNumbers.py to read the real biological_replicate_number from the
ENCODE portal.
Rewrite the signal shortLabels. They had been hard-truncated at 20 characters,
which left 20 subtracks with duplicate labels. The generator now emits a
one-letter view code and errors out if two labels match within the 17 characters
hgTracks draws in the left label area, rather than silently truncating.
Make generateBigwigTrackDb.py reproduce the committed .ra. It now emits the
two-digit tissue prefixes that give the author-requested biological order, and
the html setting, instead of depending on a one-off patch applied afterwards.
Add barChartMerge, barChartMetric, labelFields and defaultLabelFields, and Title
Case all shortLabels.
Update the nine description pages: replicate wording to match barChartMerge,
GitHub source links to the makedoc, build scripts and trackDb in Methods, an
mm39 liftOver accounting note, and remove a duplicated sentence from the shared
Display include.
Add curl -f to downloadBigwigs.sh so an HTTP error body is never saved as a
bigWig and then skipped forever by the restart check.
- lines changed 5, context: html, text, full: html, text
b5ec4fbbfb04f97ebe23fbf6fbdf091dc120944e Tue Aug 4 14:47:26 2026 -0700
Remove barChartMerge from the mouseDevTimecourse tracks, it washes out the bar colors. refs #37001
barChartMerge fades a merged group's color toward white when the group has fewer
than 100 members. scaleColorPart() in facetedTable.c blends with maxVal 240 by
(threshold - count)/threshold, with threshold 100. That is built for the
Cell Browser single-cell tracks, where the facet count is a cell count in the
hundreds or thousands.
This track is bulk RNA-seq and its .facets count is 1 per sample, so merging by
tissue and time point gives a group count of 2. The blend is then 0.02*color +
0.98*240, which lands every channel at roughly 235-240: thymus #C8B400 rendered
as #EFEFEB. Measured on a rendered image at chr12:56694976-56714605, the track
went from 40 saturated colors to 0.
Reverting the setting restores the colors on both assemblies, verified against
the .facets palette. Also reverts the description page wording back to one bar
per replicate, and drops "grouped and" from the shared Display include since
grouping was only available through this setting.
The rest of the QA changes are unaffected: maxWindowToDraw, barChartMetric,
labelFields and defaultLabelFields are still in place, whole-chromosome renders
are still 245 ms, and the details page reports 156 of 156 bars again.
- lines changed 7, context: html, text, full: html, text
949e1f995b79d032d57a35e8dc9387066d72aa2c Wed Aug 5 17:02:58 2026 -0700
Shortening the scripts and makedoc link text on all 9 mouseDevTimecourse description pages, refs #37001
- src/hg/makeDb/trackDb/mouse/mm10/mouseDevTimecourse.ra
- lines changed 24, context: html, text, full: html, text
bc527b6264234c33824854e5b596fb6f790983d4 Tue Aug 4 14:22:28 2026 -0700
Fix release blockers and data errors found during QA of the mouseDevTimecourse tracks. refs #37001
Add maxWindowToDraw 10000000 to the six bigBarChart subtracks. Without it a
whole-chromosome view asked the track to draw 3445 items x 156 bars and took 71
seconds on mm10 and 69 on mm39. The superTrack is on by default, so any mouse
user zooming out could hit it. Now 254 ms and 86 ms.
Correct a 1-bp off-by-one in the bigBarChart chromStart. The hub builder wrote
1-based GTF gene starts into the 0-based BED chromStart field, so every gene sat
one base right of its true start while chromEnd was correct. Measured against
GENCODE on mm10 before the fix, 42081/42093 genes (VM21) and 35323/35333 (VM4)
were start+1 with none exact. Added fixBarChartStarts.sh, which rebuilds the
files and refuses to run on one that has already been corrected. Originals kept
as *.bb.preStartFix. Reported upstream to the hub author.
Correct the replicate numbers on the bigWig signal composite. The biosample TSV
has no replicate column, so generateBigwigTrackDb.py had been deriving one by
sorting biosample accessions alphabetically, which mislabeled 124 of the 312
subtracks and flipped the default-on state of 62 of them. Added
fetchReplicateNumbers.py to read the real biological_replicate_number from the
ENCODE portal.
Rewrite the signal shortLabels. They had been hard-truncated at 20 characters,
which left 20 subtracks with duplicate labels. The generator now emits a
one-letter view code and errors out if two labels match within the 17 characters
hgTracks draws in the left label area, rather than silently truncating.
Make generateBigwigTrackDb.py reproduce the committed .ra. It now emits the
two-digit tissue prefixes that give the author-requested biological order, and
the html setting, instead of depending on a one-off patch applied afterwards.
Add barChartMerge, barChartMetric, labelFields and defaultLabelFields, and Title
Case all shortLabels.
Update the nine description pages: replicate wording to match barChartMerge,
GitHub source links to the makedoc, build scripts and trackDb in Methods, an
mm39 liftOver accounting note, and remove a duplicated sentence from the shared
Display include.
Add curl -f to downloadBigwigs.sh so an HTTP error body is never saved as a
bigWig and then skipped forever by the restart check.
- lines changed 4, context: html, text, full: html, text
b5ec4fbbfb04f97ebe23fbf6fbdf091dc120944e Tue Aug 4 14:47:26 2026 -0700
Remove barChartMerge from the mouseDevTimecourse tracks, it washes out the bar colors. refs #37001
barChartMerge fades a merged group's color toward white when the group has fewer
than 100 members. scaleColorPart() in facetedTable.c blends with maxVal 240 by
(threshold - count)/threshold, with threshold 100. That is built for the
Cell Browser single-cell tracks, where the facet count is a cell count in the
hundreds or thousands.
This track is bulk RNA-seq and its .facets count is 1 per sample, so merging by
tissue and time point gives a group count of 2. The blend is then 0.02*color +
0.98*240, which lands every channel at roughly 235-240: thymus #C8B400 rendered
as #EFEFEB. Measured on a rendered image at chr12:56694976-56714605, the track
went from 40 saturated colors to 0.
Reverting the setting restores the colors on both assemblies, verified against
the .facets palette. Also reverts the description page wording back to one bar
per replicate, and drops "grouped and" from the shared Display include since
grouping was only available through this setting.
The rest of the QA changes are unaffected: maxWindowToDraw, barChartMetric,
labelFields and defaultLabelFields are still in place, whole-chromosome renders
are still 245 ms, and the details page reports 156 of 156 bars again.
- src/hg/makeDb/trackDb/mouse/mm10/singleCellSignalsPeaks.html
- lines changed 25, context: html, text, full: html, text
83b5ed84ca3b56a4b82c8ab52978a590d4862953 Thu Aug 6 14:24:38 2026 -0700
singleCellSignalsPeaks: classify every cell type, correct four glia/muscle classes
Working through the cell types that had no broad class took the hub from 361
unclassified types across 474 tracks down to zero, and the same crosswalk feeds the
native tracks. Most of it was reachable without new curation: the class-map key was not
dropping a trailing "cell(s)" the way the cell types themselves do, so entries like
"Stromal cell" and "Olfactory ensheathing cell" sat in the table fully classed but
unmatched; a " cCREs" suffix and a leading histone mark were being carried into the cell
type and splitting the lookup; and the atlases qualify a common type with the tissue it
came from ("Fibroblast gastrointestinal", "Smooth muscle colon", "Endothelial cell
myocardial"), which the lookup now resolves by falling back to shorter prefixes rather
than needing a row per tissue. Those changes live in the hub builder outside this tree.
Added here are the 92 rows the above could not reach: Drosophila optic-lobe and
mushroom-body neuron types, fly glia, immortalised lines, and PV/PV WT/PV KO/PV TG
parvalbumin interneurons. Aggregates and bare cluster identifiers get the explicit
Unknown class, so a track reads as "not resolved" rather than being unknown by omission.
Also corrected four assignments that were wrong rather than missing. Schwann cells were
grouped with astroglia by an earlier decision, but they are peripheral glia, and the
table already put olfactory ensheathing cells under Other, so the two disagreed. Enteric
glia had the same problem. "Satellite" was read as satellite glia when the data says
muscle: its one resolved tissue is muscle, and "Muscle satellite cell" was already
classed as Muscle. Bergmann and Muller glia stay under Astrocyte, both being genuine CNS
macroglia. A name-versus-class scan over the whole table turned up nothing else. The
hg38 .ra changes are the twelve resulting colours plus the priority reshuffle that
follows from ranking by class; mm10 has none of these cell types.
The description pages gain the reworded Astrocyte and Other legend entries, and the
legend now separates each class from its definition with a colon instead of an em dash.
refs #37914
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
- src/hg/makeDb/trackDb/mouse/mm10/singleCellSignalsPeaks.ra
- lines changed 0, context: html, text, full: html, text
f90843f04563bb0ab82346f719f2105d5f95a714 Fri Aug 7 13:19:06 2026 -0700
Changing indentation to match our norms. WHITESPACE-ONLY CHANGE, refs #37914
- src/hg/makeDb/trackDb/mouse/mm39/developmentTimecourseM21mm39FPKM.html
- lines changed 26, context: html, text, full: html, text
bc527b6264234c33824854e5b596fb6f790983d4 Tue Aug 4 14:22:28 2026 -0700
Fix release blockers and data errors found during QA of the mouseDevTimecourse tracks. refs #37001
Add maxWindowToDraw 10000000 to the six bigBarChart subtracks. Without it a
whole-chromosome view asked the track to draw 3445 items x 156 bars and took 71
seconds on mm10 and 69 on mm39. The superTrack is on by default, so any mouse
user zooming out could hit it. Now 254 ms and 86 ms.
Correct a 1-bp off-by-one in the bigBarChart chromStart. The hub builder wrote
1-based GTF gene starts into the 0-based BED chromStart field, so every gene sat
one base right of its true start while chromEnd was correct. Measured against
GENCODE on mm10 before the fix, 42081/42093 genes (VM21) and 35323/35333 (VM4)
were start+1 with none exact. Added fixBarChartStarts.sh, which rebuilds the
files and refuses to run on one that has already been corrected. Originals kept
as *.bb.preStartFix. Reported upstream to the hub author.
Correct the replicate numbers on the bigWig signal composite. The biosample TSV
has no replicate column, so generateBigwigTrackDb.py had been deriving one by
sorting biosample accessions alphabetically, which mislabeled 124 of the 312
subtracks and flipped the default-on state of 62 of them. Added
fetchReplicateNumbers.py to read the real biological_replicate_number from the
ENCODE portal.
Rewrite the signal shortLabels. They had been hard-truncated at 20 characters,
which left 20 subtracks with duplicate labels. The generator now emits a
one-letter view code and errors out if two labels match within the 17 characters
hgTracks draws in the left label area, rather than silently truncating.
Make generateBigwigTrackDb.py reproduce the committed .ra. It now emits the
two-digit tissue prefixes that give the author-requested biological order, and
the html setting, instead of depending on a one-off patch applied afterwards.
Add barChartMerge, barChartMetric, labelFields and defaultLabelFields, and Title
Case all shortLabels.
Update the nine description pages: replicate wording to match barChartMerge,
GitHub source links to the makedoc, build scripts and trackDb in Methods, an
mm39 liftOver accounting note, and remove a duplicated sentence from the shared
Display include.
Add curl -f to downloadBigwigs.sh so an HTTP error body is never saved as a
bigWig and then skipped forever by the restart check.
- lines changed 8, context: html, text, full: html, text
b5ec4fbbfb04f97ebe23fbf6fbdf091dc120944e Tue Aug 4 14:47:26 2026 -0700
Remove barChartMerge from the mouseDevTimecourse tracks, it washes out the bar colors. refs #37001
barChartMerge fades a merged group's color toward white when the group has fewer
than 100 members. scaleColorPart() in facetedTable.c blends with maxVal 240 by
(threshold - count)/threshold, with threshold 100. That is built for the
Cell Browser single-cell tracks, where the facet count is a cell count in the
hundreds or thousands.
This track is bulk RNA-seq and its .facets count is 1 per sample, so merging by
tissue and time point gives a group count of 2. The blend is then 0.02*color +
0.98*240, which lands every channel at roughly 235-240: thymus #C8B400 rendered
as #EFEFEB. Measured on a rendered image at chr12:56694976-56714605, the track
went from 40 saturated colors to 0.
Reverting the setting restores the colors on both assemblies, verified against
the .facets palette. Also reverts the description page wording back to one bar
per replicate, and drops "grouped and" from the shared Display include since
grouping was only available through this setting.
The rest of the QA changes are unaffected: maxWindowToDraw, barChartMetric,
labelFields and defaultLabelFields are still in place, whole-chromosome renders
are still 245 ms, and the details page reports 156 of 156 bars again.
- lines changed 7, context: html, text, full: html, text
949e1f995b79d032d57a35e8dc9387066d72aa2c Wed Aug 5 17:02:58 2026 -0700
Shortening the scripts and makedoc link text on all 9 mouseDevTimecourse description pages, refs #37001
- src/hg/makeDb/trackDb/mouse/mm39/developmentTimecourseM21mm39TPM.html
- lines changed 25, context: html, text, full: html, text
bc527b6264234c33824854e5b596fb6f790983d4 Tue Aug 4 14:22:28 2026 -0700
Fix release blockers and data errors found during QA of the mouseDevTimecourse tracks. refs #37001
Add maxWindowToDraw 10000000 to the six bigBarChart subtracks. Without it a
whole-chromosome view asked the track to draw 3445 items x 156 bars and took 71
seconds on mm10 and 69 on mm39. The superTrack is on by default, so any mouse
user zooming out could hit it. Now 254 ms and 86 ms.
Correct a 1-bp off-by-one in the bigBarChart chromStart. The hub builder wrote
1-based GTF gene starts into the 0-based BED chromStart field, so every gene sat
one base right of its true start while chromEnd was correct. Measured against
GENCODE on mm10 before the fix, 42081/42093 genes (VM21) and 35323/35333 (VM4)
were start+1 with none exact. Added fixBarChartStarts.sh, which rebuilds the
files and refuses to run on one that has already been corrected. Originals kept
as *.bb.preStartFix. Reported upstream to the hub author.
Correct the replicate numbers on the bigWig signal composite. The biosample TSV
has no replicate column, so generateBigwigTrackDb.py had been deriving one by
sorting biosample accessions alphabetically, which mislabeled 124 of the 312
subtracks and flipped the default-on state of 62 of them. Added
fetchReplicateNumbers.py to read the real biological_replicate_number from the
ENCODE portal.
Rewrite the signal shortLabels. They had been hard-truncated at 20 characters,
which left 20 subtracks with duplicate labels. The generator now emits a
one-letter view code and errors out if two labels match within the 17 characters
hgTracks draws in the left label area, rather than silently truncating.
Make generateBigwigTrackDb.py reproduce the committed .ra. It now emits the
two-digit tissue prefixes that give the author-requested biological order, and
the html setting, instead of depending on a one-off patch applied afterwards.
Add barChartMerge, barChartMetric, labelFields and defaultLabelFields, and Title
Case all shortLabels.
Update the nine description pages: replicate wording to match barChartMerge,
GitHub source links to the makedoc, build scripts and trackDb in Methods, an
mm39 liftOver accounting note, and remove a duplicated sentence from the shared
Display include.
Add curl -f to downloadBigwigs.sh so an HTTP error body is never saved as a
bigWig and then skipped forever by the restart check.
- lines changed 7, context: html, text, full: html, text
b5ec4fbbfb04f97ebe23fbf6fbdf091dc120944e Tue Aug 4 14:47:26 2026 -0700
Remove barChartMerge from the mouseDevTimecourse tracks, it washes out the bar colors. refs #37001
barChartMerge fades a merged group's color toward white when the group has fewer
than 100 members. scaleColorPart() in facetedTable.c blends with maxVal 240 by
(threshold - count)/threshold, with threshold 100. That is built for the
Cell Browser single-cell tracks, where the facet count is a cell count in the
hundreds or thousands.
This track is bulk RNA-seq and its .facets count is 1 per sample, so merging by
tissue and time point gives a group count of 2. The blend is then 0.02*color +
0.98*240, which lands every channel at roughly 235-240: thymus #C8B400 rendered
as #EFEFEB. Measured on a rendered image at chr12:56694976-56714605, the track
went from 40 saturated colors to 0.
Reverting the setting restores the colors on both assemblies, verified against
the .facets palette. Also reverts the description page wording back to one bar
per replicate, and drops "grouped and" from the shared Display include since
grouping was only available through this setting.
The rest of the QA changes are unaffected: maxWindowToDraw, barChartMetric,
labelFields and defaultLabelFields are still in place, whole-chromosome renders
are still 245 ms, and the details page reports 156 of 156 bars again.
- lines changed 7, context: html, text, full: html, text
949e1f995b79d032d57a35e8dc9387066d72aa2c Wed Aug 5 17:02:58 2026 -0700
Shortening the scripts and makedoc link text on all 9 mouseDevTimecourse description pages, refs #37001
- src/hg/makeDb/trackDb/mouse/mm39/mouseDevTimecourse.html
- lines changed 25, context: html, text, full: html, text
bc527b6264234c33824854e5b596fb6f790983d4 Tue Aug 4 14:22:28 2026 -0700
Fix release blockers and data errors found during QA of the mouseDevTimecourse tracks. refs #37001
Add maxWindowToDraw 10000000 to the six bigBarChart subtracks. Without it a
whole-chromosome view asked the track to draw 3445 items x 156 bars and took 71
seconds on mm10 and 69 on mm39. The superTrack is on by default, so any mouse
user zooming out could hit it. Now 254 ms and 86 ms.
Correct a 1-bp off-by-one in the bigBarChart chromStart. The hub builder wrote
1-based GTF gene starts into the 0-based BED chromStart field, so every gene sat
one base right of its true start while chromEnd was correct. Measured against
GENCODE on mm10 before the fix, 42081/42093 genes (VM21) and 35323/35333 (VM4)
were start+1 with none exact. Added fixBarChartStarts.sh, which rebuilds the
files and refuses to run on one that has already been corrected. Originals kept
as *.bb.preStartFix. Reported upstream to the hub author.
Correct the replicate numbers on the bigWig signal composite. The biosample TSV
has no replicate column, so generateBigwigTrackDb.py had been deriving one by
sorting biosample accessions alphabetically, which mislabeled 124 of the 312
subtracks and flipped the default-on state of 62 of them. Added
fetchReplicateNumbers.py to read the real biological_replicate_number from the
ENCODE portal.
Rewrite the signal shortLabels. They had been hard-truncated at 20 characters,
which left 20 subtracks with duplicate labels. The generator now emits a
one-letter view code and errors out if two labels match within the 17 characters
hgTracks draws in the left label area, rather than silently truncating.
Make generateBigwigTrackDb.py reproduce the committed .ra. It now emits the
two-digit tissue prefixes that give the author-requested biological order, and
the html setting, instead of depending on a one-off patch applied afterwards.
Add barChartMerge, barChartMetric, labelFields and defaultLabelFields, and Title
Case all shortLabels.
Update the nine description pages: replicate wording to match barChartMerge,
GitHub source links to the makedoc, build scripts and trackDb in Methods, an
mm39 liftOver accounting note, and remove a duplicated sentence from the shared
Display include.
Add curl -f to downloadBigwigs.sh so an HTTP error body is never saved as a
bigWig and then skipped forever by the restart check.
- lines changed 5, context: html, text, full: html, text
b5ec4fbbfb04f97ebe23fbf6fbdf091dc120944e Tue Aug 4 14:47:26 2026 -0700
Remove barChartMerge from the mouseDevTimecourse tracks, it washes out the bar colors. refs #37001
barChartMerge fades a merged group's color toward white when the group has fewer
than 100 members. scaleColorPart() in facetedTable.c blends with maxVal 240 by
(threshold - count)/threshold, with threshold 100. That is built for the
Cell Browser single-cell tracks, where the facet count is a cell count in the
hundreds or thousands.
This track is bulk RNA-seq and its .facets count is 1 per sample, so merging by
tissue and time point gives a group count of 2. The blend is then 0.02*color +
0.98*240, which lands every channel at roughly 235-240: thymus #C8B400 rendered
as #EFEFEB. Measured on a rendered image at chr12:56694976-56714605, the track
went from 40 saturated colors to 0.
Reverting the setting restores the colors on both assemblies, verified against
the .facets palette. Also reverts the description page wording back to one bar
per replicate, and drops "grouped and" from the shared Display include since
grouping was only available through this setting.
The rest of the QA changes are unaffected: maxWindowToDraw, barChartMetric,
labelFields and defaultLabelFields are still in place, whole-chromosome renders
are still 245 ms, and the details page reports 156 of 156 bars again.
- lines changed 7, context: html, text, full: html, text
949e1f995b79d032d57a35e8dc9387066d72aa2c Wed Aug 5 17:02:58 2026 -0700
Shortening the scripts and makedoc link text on all 9 mouseDevTimecourse description pages, refs #37001
- src/hg/makeDb/trackDb/mouse/mm39/mouseDevTimecourse.ra
- lines changed 12, context: html, text, full: html, text
bc527b6264234c33824854e5b596fb6f790983d4 Tue Aug 4 14:22:28 2026 -0700
Fix release blockers and data errors found during QA of the mouseDevTimecourse tracks. refs #37001
Add maxWindowToDraw 10000000 to the six bigBarChart subtracks. Without it a
whole-chromosome view asked the track to draw 3445 items x 156 bars and took 71
seconds on mm10 and 69 on mm39. The superTrack is on by default, so any mouse
user zooming out could hit it. Now 254 ms and 86 ms.
Correct a 1-bp off-by-one in the bigBarChart chromStart. The hub builder wrote
1-based GTF gene starts into the 0-based BED chromStart field, so every gene sat
one base right of its true start while chromEnd was correct. Measured against
GENCODE on mm10 before the fix, 42081/42093 genes (VM21) and 35323/35333 (VM4)
were start+1 with none exact. Added fixBarChartStarts.sh, which rebuilds the
files and refuses to run on one that has already been corrected. Originals kept
as *.bb.preStartFix. Reported upstream to the hub author.
Correct the replicate numbers on the bigWig signal composite. The biosample TSV
has no replicate column, so generateBigwigTrackDb.py had been deriving one by
sorting biosample accessions alphabetically, which mislabeled 124 of the 312
subtracks and flipped the default-on state of 62 of them. Added
fetchReplicateNumbers.py to read the real biological_replicate_number from the
ENCODE portal.
Rewrite the signal shortLabels. They had been hard-truncated at 20 characters,
which left 20 subtracks with duplicate labels. The generator now emits a
one-letter view code and errors out if two labels match within the 17 characters
hgTracks draws in the left label area, rather than silently truncating.
Make generateBigwigTrackDb.py reproduce the committed .ra. It now emits the
two-digit tissue prefixes that give the author-requested biological order, and
the html setting, instead of depending on a one-off patch applied afterwards.
Add barChartMerge, barChartMetric, labelFields and defaultLabelFields, and Title
Case all shortLabels.
Update the nine description pages: replicate wording to match barChartMerge,
GitHub source links to the makedoc, build scripts and trackDb in Methods, an
mm39 liftOver accounting note, and remove a duplicated sentence from the shared
Display include.
Add curl -f to downloadBigwigs.sh so an HTTP error body is never saved as a
bigWig and then skipped forever by the restart check.
- lines changed 2, context: html, text, full: html, text
b5ec4fbbfb04f97ebe23fbf6fbdf091dc120944e Tue Aug 4 14:47:26 2026 -0700
Remove barChartMerge from the mouseDevTimecourse tracks, it washes out the bar colors. refs #37001
barChartMerge fades a merged group's color toward white when the group has fewer
than 100 members. scaleColorPart() in facetedTable.c blends with maxVal 240 by
(threshold - count)/threshold, with threshold 100. That is built for the
Cell Browser single-cell tracks, where the facet count is a cell count in the
hundreds or thousands.
This track is bulk RNA-seq and its .facets count is 1 per sample, so merging by
tissue and time point gives a group count of 2. The blend is then 0.02*color +
0.98*240, which lands every channel at roughly 235-240: thymus #C8B400 rendered
as #EFEFEB. Measured on a rendered image at chr12:56694976-56714605, the track
went from 40 saturated colors to 0.
Reverting the setting restores the colors on both assemblies, verified against
the .facets palette. Also reverts the description page wording back to one bar
per replicate, and drops "grouped and" from the shared Display include since
grouping was only available through this setting.
The rest of the QA changes are unaffected: maxWindowToDraw, barChartMetric,
labelFields and defaultLabelFields are still in place, whole-chromosome renders
are still 245 ms, and the details page reports 156 of 156 bars again.
- src/hg/makeDb/trackDb/mouseDevTimecourseDisplay.shared.html
- lines changed 7, context: html, text, full: html, text
bc527b6264234c33824854e5b596fb6f790983d4 Tue Aug 4 14:22:28 2026 -0700
Fix release blockers and data errors found during QA of the mouseDevTimecourse tracks. refs #37001
Add maxWindowToDraw 10000000 to the six bigBarChart subtracks. Without it a
whole-chromosome view asked the track to draw 3445 items x 156 bars and took 71
seconds on mm10 and 69 on mm39. The superTrack is on by default, so any mouse
user zooming out could hit it. Now 254 ms and 86 ms.
Correct a 1-bp off-by-one in the bigBarChart chromStart. The hub builder wrote
1-based GTF gene starts into the 0-based BED chromStart field, so every gene sat
one base right of its true start while chromEnd was correct. Measured against
GENCODE on mm10 before the fix, 42081/42093 genes (VM21) and 35323/35333 (VM4)
were start+1 with none exact. Added fixBarChartStarts.sh, which rebuilds the
files and refuses to run on one that has already been corrected. Originals kept
as *.bb.preStartFix. Reported upstream to the hub author.
Correct the replicate numbers on the bigWig signal composite. The biosample TSV
has no replicate column, so generateBigwigTrackDb.py had been deriving one by
sorting biosample accessions alphabetically, which mislabeled 124 of the 312
subtracks and flipped the default-on state of 62 of them. Added
fetchReplicateNumbers.py to read the real biological_replicate_number from the
ENCODE portal.
Rewrite the signal shortLabels. They had been hard-truncated at 20 characters,
which left 20 subtracks with duplicate labels. The generator now emits a
one-letter view code and errors out if two labels match within the 17 characters
hgTracks draws in the left label area, rather than silently truncating.
Make generateBigwigTrackDb.py reproduce the committed .ra. It now emits the
two-digit tissue prefixes that give the author-requested biological order, and
the html setting, instead of depending on a one-off patch applied afterwards.
Add barChartMerge, barChartMetric, labelFields and defaultLabelFields, and Title
Case all shortLabels.
Update the nine description pages: replicate wording to match barChartMerge,
GitHub source links to the makedoc, build scripts and trackDb in Methods, an
mm39 liftOver accounting note, and remove a duplicated sentence from the shared
Display include.
Add curl -f to downloadBigwigs.sh so an HTTP error body is never saved as a
bigWig and then skipped forever by the restart check.
- lines changed 1, context: html, text, full: html, text
b5ec4fbbfb04f97ebe23fbf6fbdf091dc120944e Tue Aug 4 14:47:26 2026 -0700
Remove barChartMerge from the mouseDevTimecourse tracks, it washes out the bar colors. refs #37001
barChartMerge fades a merged group's color toward white when the group has fewer
than 100 members. scaleColorPart() in facetedTable.c blends with maxVal 240 by
(threshold - count)/threshold, with threshold 100. That is built for the
Cell Browser single-cell tracks, where the facet count is a cell count in the
hundreds or thousands.
This track is bulk RNA-seq and its .facets count is 1 per sample, so merging by
tissue and time point gives a group count of 2. The blend is then 0.02*color +
0.98*240, which lands every channel at roughly 235-240: thymus #C8B400 rendered
as #EFEFEB. Measured on a rendered image at chr12:56694976-56714605, the track
went from 40 saturated colors to 0.
Reverting the setting restores the colors on both assemblies, verified against
the .facets palette. Also reverts the description page wording back to one bar
per replicate, and drops "grouped and" from the shared Display include since
grouping was only available through this setting.
The rest of the QA changes are unaffected: maxWindowToDraw, barChartMetric,
labelFields and defaultLabelFields are still in place, whole-chromosome renders
are still 245 ms, and the details page reports 156 of 156 bars again.
- src/hg/makeDb/trackDb/relatedTracks.ra
- lines changed 101, context: html, text, full: html, text
383a5877276ee70beeac9ff6602737f59614ee6c Tue Aug 4 14:26:10 2026 -0700
Fix broken relatedTracks entries and apply the new one-way/bidirectional markers. refs #37390
Fixed three relationships that pointed at tracks that do not exist and so
rendered nothing: 'gnomad' is 'gnomadVariants' on hg38 and 'gnomadSuper' on
hg19, and 'liftHg38' is 'liftHg19' on hg38. Also corrected the REVEL lift
reason (chains are from hg19, not hg38) and the hg19 GRC Incident reason
(alignments are between hg19 and hg38, not hg38 and hg38).
printRelatedTracks renders the reason after the linked track's short label,
so 52 of 146 entries were stuttering, e.g. "CADD 1.6: CADD, a similar
deleteriousness score" and "NMD Escape: NMD Escape: predicted regions...".
Dropped the redundant leading track name from every reason and documented
the rendering in the file header so it does not creep back in.
Converted to one-way '>' entries: avada to varaico on hg38 and hg19, nmd to
mane and ncbiRefSeq on hg38, revel to liftHg19 on hg38, and pseudoYale60 to
refSeqComposite on hg19. In each case the reverse link only added clutter to
a heavily used track page or pointed users back at a retired track.
Converted to bidirectional '~' entries where both directions carry the same
reason: primateAi/alphaMissense and wgEncodeReg4/cCREs on hg38, and
encode4Reg/cCREs plus both mouseDevTimecourse pairs on mm10.
Standardized the description of the strVar container, which was described
two different ways in the two entries linking to it, and neither matched
its actual contents.
- src/hg/utils/automation/gwEditPage
- lines changed 189, context: html, text, full: html, text
3ea2ef2ddf64b7e366af1e8c0e500ea1fe88a4e6 Wed Aug 5 10:55:25 2026 -0700
gwEditPage: read and write genomewiki page text from the command line
gwUploadFile next door handles images, but it needs python2 and mwclient,
neither of which is installed for python3 on hgwdev, and nothing in the tree
could edit page text at all. This talks to the MediaWiki API with the standard
library alone.
The trap it exists to document: two wikis run behind genomewiki.ucsc.edu, the
public one at / and the internal Genecats one at /genecats, and they keep
separate user databases. An account that works on one may not exist on the
other, so the failure reads like a mistyped password when it is really the wrong
wiki. Credentials keep gwUploadFile's ~/.gwLogin convention, one line and mode
600, with ~/.gwLogin.genecats for the internal wiki so the first line of
~/.gwLogin stays exactly what gwUploadFile expects to find. A bot password from
Special:BotPasswords works in place of an account password and is preferable:
scoped to the grants chosen, and revocable on its own.
get prints wikitext and put replaces it, requiring a summary and refusing to
write an empty page. --dry-run shows the diff and writes nothing, which is
worth the habit: it caught two wiki-markup mistakes on its first real use, a
blank line between list items ending the list, and text appended past the
Category tags landing outside the section it belonged to. Reading needs no
account on either wiki, so it does not ask for one.
- src/hg/utils/docent/README.md
- lines changed 46, context: html, text, full: html, text
74dc80fd3bd2a70371fa75218347ddc45a556dde Wed Aug 5 07:28:59 2026 -0700
Docent: render a tour at print resolution, and make zoom wait for its redraw
refs #37892
scale: k (DOCENT_SCALE=k, make hires [SCALE=3]) renders the same tour with k
times the pixels, for figures that have to print -- a screen still is about
120 dpi across a journal column. Nothing is upscaled; each layer that draws is
asked for more:
* deviceScaleFactor: k with the viewport left at its 1x CSS size, so the page
lays out exactly as at 1x -- same line breaks, same jQuery-dialog width, same
tooltip placement -- and rasterizes with k times the pixels,
* pix x k so the server draws a wider browser image, with textSize stepped up
its ladder to match (3x lands on 24) so hgTracks makes the same layout
decisions in it: same tick spacing, same room for labels, same packing of
features into rows,
* zoom: 1/k on the image table, handing that wider image the 1x amount of
layout space, so one image pixel falls on one device pixel.
A scaled run is stills-only (no mp4), and DOCENT_STILLS names a different parent
so a print render lands beside the screen stills instead of over them.
Everything hgTracks reports about the image -- map-box coords, mouseOver spans,
insideX, a px: drag endpoint -- is in the pixels the SERVER drew, which is not
the displayed size once the image is scaled. Those now go through the image's
natural-to-displayed ratio (1 at 1x). Without it a named mouseover: lands k
times off and pins a different feature.
zoom: in|out waited only for #imgTbl, which the buttons never remove (they
redraw in place via ajax), so the following step could read the previous
window's map boxes and report an item "not found" that was simply not in view
yet. It now waits for the window itself to change. Pre-existing, hidden by the
dwell that FAST removes -- and every hires run is FAST. An item-not-found error
also names the current window and the items that ARE in that row, which is what
told the two cases apart.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
- lines changed 14, context: html, text, full: html, text
140e29ae6894cc8d55bb231e73e7a16f7e51a146 Wed Aug 5 14:20:32 2026 -0700
Docent: keep a print render's tooltips and track heights in proportion
Two things stayed 1x in a 3x still. hgTracks takes the tooltip's font-size from
the browser text size, which a scaled run has already multiplied by k for the
image, and then the device pixel ratio scales that same text a second time -- so
the popups came out k times too big, swamping the figure, and the last tooltip
pinned fell off the crop. Pin the tooltip font-size back to the 1x value.
The other is height. Neither pix nor textSize reaches a track whose height is a
fixed pixel count, so a 128px bigLolly row that was 15% of an 850px image was 5%
of a 2550px one -- ClinVar's lollipop row came out a sliver with unreadable
y-axis labels next to a bed track that had grown with the font. After each view
change, ask for k times the height of every row the page actually drew. Going
by the drawn names is what reaches a lifted view, whose tracks are hub tracks
under names trackDb never saw. Each track's own maxHeightPixels still clamps
the request, so a track that should stay short does.
refs #37892
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
- lines changed 2, context: html, text, full: html, text
ffccd9cceb44efbd4d07dab8eda90e95ccd72d77 Thu Aug 6 13:45:12 2026 -0700
Docent: pinned-mouseover cursors, and a montage verb for multi-panel figures, refs #37892
A pinShot puts several tooltips on one still, but nothing in the picture says
which feature each was raised from -- the reader infers it from an 8px anchor
offset, and on a dense row that is a guess. recordTip now keeps the hover
point alongside the tooltip's own offset and pinShot draws a static pointer
there. The glyph and its box move out of CURSOR_INIT into constants the two
share: a pinned pointer that did not match the animated one would read as a
different cursor rather than as the same tour paused, and that is the kind of
drift nobody notices until the figure is in a proof. pinShot takes a map
form, {name: x, cursors: false}, for a figure that does not want them, and the
pointers join the crop's bounding box so one on the bottom row cannot fall off.
The other half is composition. A journal wants parts (A), (B) as a single
file, so the panels had to be assembled by hand after the run. That puts the
figure's layout outside the script: rename a shot and the montage quietly
drops a panel instead of failing, which is the sort of thing found at
submission. montage: {name: x, shots: [a, b]} does it in the tour, so the
composite is a product of the same run as its parts. Panels stack in order
and letter themselves; labels:, direction:, gap: and labelSize: override.
Composition happens in a browser page at deviceScaleFactor 1 with every panel
at its natural pixel size, so the result is pixel-for-pixel its inputs -- a
make hires montage is print resolution because the panels were, not because
anything was upscaled. Panels narrower than the widest are left-aligned and
padded rather than stretched, and a named shot that was never taken warns and
is skipped.
- lines changed 1, context: html, text, full: html, text
25ff975568a24a89dc2dcd4836875a448beaec9f Thu Aug 6 15:23:11 2026 -0700
Docent: hide a composite as a unit under hideKids, and warn on an over-long nav, refs #37892
`{cCREs: hideKids}` on hg38 sent 1701 cart variables in a 42,020-character
GET. The walk behind hideKids went to true leaves, straight through the
ENCODE4 Core Collection composite, and enumerated all 850 of its ENCFF
subtracks. Apache's LimitRequestLine is 8190, so the server answered 414 and
the next shot: photographed "Request-URI Too Long" -- and nothing failed: the
page loaded, the still got written, the build exited 0. Only looking at the
figure caught it.
Hiding a composite already reaches its subtracks, so the expansion now stops
at the first container that propagates its own visibility and keeps descending
only through superTracks, which do not. hubApi never lists a superTrack
container, so the flag tdbParse already sets when it synthesizes one answers
the question without new data. That step is two variables now.
This is a separate walk rather than a change to tdbLeaves, whose other caller
resolves a container to a row on the page and does need true leaves -- a
composite has no img_data_ of its own.
nav() also warns when a URL passes 7800 characters. A 414 is not an
exception, it is a page, so the run continues and the damage is a wrong
figure; the one thing that helps is saying so at the time.
- lines changed 126, context: html, text, full: html, text
5d76e853fa84baa6c4a05880d3f3b985a5e51878 Sat Aug 8 13:22:15 2026 -0700
docent: add session, loadSession and expect verbs, refs #37892
session: writes the whole cart at that step to sessions/<base>/<name>.txt, in
the format hgSession's save-to-a-local-file button produces. No login is
involved. With sessionUrlBase: set, the run also prints the load URL, so a tour
hands back the state it built instead of only a picture of it. A file rather
than a live hgsid link, because the hgsid cart keeps changing as the tour runs.
loadSession: is the other direction: a settings file by URL, a share link, a
named session, or a local file written by an earlier session:. The load always
goes to the server named in target:, since named sessions are per-server and
every later step navigates to target: by absolute URL.
expect: is the only verb that can fail a run. It checks the rows drawn, the
image height, the tooltip now up, and the page text, then throws, so make stops
at that step rather than writing a wrong figure over a right one.
A session taken on a lifted view is short-lived: it names the quickLift hub by
its trash path, and re-pointing it at a durable copy does not work today. See
#38046. The README says so rather than working around it.
- lines changed 13, context: html, text, full: html, text
f963b73576b5c69915366893da7dfa6afe633456 Sat Aug 8 14:04:23 2026 -0700
docent: add a tests directory and a browser-free derive mode, refs #37892
tests/ holds Docent scripts that assert with expect:, run by hand with `make
test` rather than by the tree's test target, since each one drives a real
server. Nine of them: the two-request composite split (#37953), hideKids on a
view and on a superTrack, the cCREs expansion that once overran the request
line, addCustomTrack, a 3x run, and the session/loadSession round trip. A
script named *.xfail.docent.yaml is expected to fail, which is how the
hideKids-aimed-at-the-composite trap is pinned rather than only written down,
and how expect: itself is checked.
DOCENT_DERIVE=1 prints what each track: step turns into and stops, with no
browser and no navigation. That derivation is where most of Docent's own
decisions are, and it was previously visible only in the log of a full run.
`make derive` diffs it against baselines in tests/expected/ for the scripts
whose derived set is small enough to be stable.
The track: verb now calls trackRounds() for that derivation instead of doing
it inline. No behaviour change intended; the tests above pass before and after.
Two things the tests turned up, both recorded in tests/README.txt: turning on
anything under a superTrack sends <superTrack>=show and undoes an earlier
hide: all for its other members, and hideKids on a view has to enumerate
leaves, so one such step sends 188 variables in a 6,986-character request.
- src/hg/utils/docent/docent.js
- lines changed 143, context: html, text, full: html, text
74dc80fd3bd2a70371fa75218347ddc45a556dde Wed Aug 5 07:28:59 2026 -0700
Docent: render a tour at print resolution, and make zoom wait for its redraw
refs #37892
scale: k (DOCENT_SCALE=k, make hires [SCALE=3]) renders the same tour with k
times the pixels, for figures that have to print -- a screen still is about
120 dpi across a journal column. Nothing is upscaled; each layer that draws is
asked for more:
* deviceScaleFactor: k with the viewport left at its 1x CSS size, so the page
lays out exactly as at 1x -- same line breaks, same jQuery-dialog width, same
tooltip placement -- and rasterizes with k times the pixels,
* pix x k so the server draws a wider browser image, with textSize stepped up
its ladder to match (3x lands on 24) so hgTracks makes the same layout
decisions in it: same tick spacing, same room for labels, same packing of
features into rows,
* zoom: 1/k on the image table, handing that wider image the 1x amount of
layout space, so one image pixel falls on one device pixel.
A scaled run is stills-only (no mp4), and DOCENT_STILLS names a different parent
so a print render lands beside the screen stills instead of over them.
Everything hgTracks reports about the image -- map-box coords, mouseOver spans,
insideX, a px: drag endpoint -- is in the pixels the SERVER drew, which is not
the displayed size once the image is scaled. Those now go through the image's
natural-to-displayed ratio (1 at 1x). Without it a named mouseover: lands k
times off and pins a different feature.
zoom: in|out waited only for #imgTbl, which the buttons never remove (they
redraw in place via ajax), so the following step could read the previous
window's map boxes and report an item "not found" that was simply not in view
yet. It now waits for the window itself to change. Pre-existing, hidden by the
dwell that FAST removes -- and every hires run is FAST. An item-not-found error
also names the current window and the items that ARE in that row, which is what
told the two cases apart.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
- lines changed 52, context: html, text, full: html, text
140e29ae6894cc8d55bb231e73e7a16f7e51a146 Wed Aug 5 14:20:32 2026 -0700
Docent: keep a print render's tooltips and track heights in proportion
Two things stayed 1x in a 3x still. hgTracks takes the tooltip's font-size from
the browser text size, which a scaled run has already multiplied by k for the
image, and then the device pixel ratio scales that same text a second time -- so
the popups came out k times too big, swamping the figure, and the last tooltip
pinned fell off the crop. Pin the tooltip font-size back to the 1x value.
The other is height. Neither pix nor textSize reaches a track whose height is a
fixed pixel count, so a 128px bigLolly row that was 15% of an 850px image was 5%
of a 2550px one -- ClinVar's lollipop row came out a sliver with unreadable
y-axis labels next to a bed track that had grown with the font. After each view
change, ask for k times the height of every row the page actually drew. Going
by the drawn names is what reaches a lifted view, whose tracks are hub tracks
under names trackDb never saw. Each track's own maxHeightPixels still clamps
the request, so a track that should stay short does.
refs #37892
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
- lines changed 6, context: html, text, full: html, text
babf25e13ff2e01e1f2a3c295f7b84420d3de421 Thu Aug 6 10:07:35 2026 -0700
Docent: say which height the print scaling actually scales, refs #37892
The k*128 a scaled run asks for is the default heightPer times k, not each
track's own height times k, so a row deliberately configured at 50px or 300px
comes back the same size as everything else instead of in proportion. Every
track a tour has used took the default, so this has not bitten, and fixing it
properly means reading each row's heightPer out of the cart before asking for k
times it. Write down the assumption and what the symptom looks like -- a row
that is the wrong size at k and the right size at 1x -- so the next person to
hit it knows where to look rather than rediscovering the constant.
- lines changed 103, context: html, text, full: html, text
ffccd9cceb44efbd4d07dab8eda90e95ccd72d77 Thu Aug 6 13:45:12 2026 -0700
Docent: pinned-mouseover cursors, and a montage verb for multi-panel figures, refs #37892
A pinShot puts several tooltips on one still, but nothing in the picture says
which feature each was raised from -- the reader infers it from an 8px anchor
offset, and on a dense row that is a guess. recordTip now keeps the hover
point alongside the tooltip's own offset and pinShot draws a static pointer
there. The glyph and its box move out of CURSOR_INIT into constants the two
share: a pinned pointer that did not match the animated one would read as a
different cursor rather than as the same tour paused, and that is the kind of
drift nobody notices until the figure is in a proof. pinShot takes a map
form, {name: x, cursors: false}, for a figure that does not want them, and the
pointers join the crop's bounding box so one on the bottom row cannot fall off.
The other half is composition. A journal wants parts (A), (B) as a single
file, so the panels had to be assembled by hand after the run. That puts the
figure's layout outside the script: rename a shot and the montage quietly
drops a panel instead of failing, which is the sort of thing found at
submission. montage: {name: x, shots: [a, b]} does it in the tour, so the
composite is a product of the same run as its parts. Panels stack in order
and letter themselves; labels:, direction:, gap: and labelSize: override.
Composition happens in a browser page at deviceScaleFactor 1 with every panel
at its natural pixel size, so the result is pixel-for-pixel its inputs -- a
make hires montage is print resolution because the panels were, not because
anything was upscaled. Panels narrower than the widest are left-aligned and
padded rather than stretched, and a named shot that was never taken warns and
is skipped.
- lines changed 43, context: html, text, full: html, text
25ff975568a24a89dc2dcd4836875a448beaec9f Thu Aug 6 15:23:11 2026 -0700
Docent: hide a composite as a unit under hideKids, and warn on an over-long nav, refs #37892
`{cCREs: hideKids}` on hg38 sent 1701 cart variables in a 42,020-character
GET. The walk behind hideKids went to true leaves, straight through the
ENCODE4 Core Collection composite, and enumerated all 850 of its ENCFF
subtracks. Apache's LimitRequestLine is 8190, so the server answered 414 and
the next shot: photographed "Request-URI Too Long" -- and nothing failed: the
page loaded, the still got written, the build exited 0. Only looking at the
figure caught it.
Hiding a composite already reaches its subtracks, so the expansion now stops
at the first container that propagates its own visibility and keeps descending
only through superTracks, which do not. hubApi never lists a superTrack
container, so the flag tdbParse already sets when it synthesizes one answers
the question without new data. That step is two variables now.
This is a separate walk rather than a change to tdbLeaves, whose other caller
resolves a container to a row on the page and does need true leaves -- a
composite has no img_data_ of its own.
nav() also warns when a URL passes 7800 characters. A 414 is not an
exception, it is a page, so the run continues and the damage is a wrong
figure; the one thing that helps is saying so at the time.
- lines changed 197, context: html, text, full: html, text
5d76e853fa84baa6c4a05880d3f3b985a5e51878 Sat Aug 8 13:22:15 2026 -0700
docent: add session, loadSession and expect verbs, refs #37892
session: writes the whole cart at that step to sessions/<base>/<name>.txt, in
the format hgSession's save-to-a-local-file button produces. No login is
involved. With sessionUrlBase: set, the run also prints the load URL, so a tour
hands back the state it built instead of only a picture of it. A file rather
than a live hgsid link, because the hgsid cart keeps changing as the tour runs.
loadSession: is the other direction: a settings file by URL, a share link, a
named session, or a local file written by an earlier session:. The load always
goes to the server named in target:, since named sessions are per-server and
every later step navigates to target: by absolute URL.
expect: is the only verb that can fail a run. It checks the rows drawn, the
image height, the tooltip now up, and the page text, then throws, so make stops
at that step rather than writing a wrong figure over a right one.
A session taken on a lifted view is short-lived: it names the quickLift hub by
its trash path, and re-pointing it at a durable copy does not work today. See
#38046. The README says so rather than working around it.
- lines changed 148, context: html, text, full: html, text
f963b73576b5c69915366893da7dfa6afe633456 Sat Aug 8 14:04:23 2026 -0700
docent: add a tests directory and a browser-free derive mode, refs #37892
tests/ holds Docent scripts that assert with expect:, run by hand with `make
test` rather than by the tree's test target, since each one drives a real
server. Nine of them: the two-request composite split (#37953), hideKids on a
view and on a superTrack, the cCREs expansion that once overran the request
line, addCustomTrack, a 3x run, and the session/loadSession round trip. A
script named *.xfail.docent.yaml is expected to fail, which is how the
hideKids-aimed-at-the-composite trap is pinned rather than only written down,
and how expect: itself is checked.
DOCENT_DERIVE=1 prints what each track: step turns into and stops, with no
browser and no navigation. That derivation is where most of Docent's own
decisions are, and it was previously visible only in the log of a full run.
`make derive` diffs it against baselines in tests/expected/ for the scripts
whose derived set is small enough to be stable.
The track: verb now calls trackRounds() for that derivation instead of doing
it inline. No behaviour change intended; the tests above pass before and after.
Two things the tests turned up, both recorded in tests/README.txt: turning on
anything under a superTrack sends <superTrack>=show and undoes an earlier
hide: all for its other members, and hideKids on a view has to enumerate
leaves, so one such step sends 188 variables in a 6,986-character request.
- src/hg/utils/docent/docent.mk
- lines changed 20, context: html, text, full: html, text
74dc80fd3bd2a70371fa75218347ddc45a556dde Wed Aug 5 07:28:59 2026 -0700
Docent: render a tour at print resolution, and make zoom wait for its redraw
refs #37892
scale: k (DOCENT_SCALE=k, make hires [SCALE=3]) renders the same tour with k
times the pixels, for figures that have to print -- a screen still is about
120 dpi across a journal column. Nothing is upscaled; each layer that draws is
asked for more:
* deviceScaleFactor: k with the viewport left at its 1x CSS size, so the page
lays out exactly as at 1x -- same line breaks, same jQuery-dialog width, same
tooltip placement -- and rasterizes with k times the pixels,
* pix x k so the server draws a wider browser image, with textSize stepped up
its ladder to match (3x lands on 24) so hgTracks makes the same layout
decisions in it: same tick spacing, same room for labels, same packing of
features into rows,
* zoom: 1/k on the image table, handing that wider image the 1x amount of
layout space, so one image pixel falls on one device pixel.
A scaled run is stills-only (no mp4), and DOCENT_STILLS names a different parent
so a print render lands beside the screen stills instead of over them.
Everything hgTracks reports about the image -- map-box coords, mouseOver spans,
insideX, a px: drag endpoint -- is in the pixels the SERVER drew, which is not
the displayed size once the image is scaled. Those now go through the image's
natural-to-displayed ratio (1 at 1x). Without it a named mouseover: lands k
times off and pins a different feature.
zoom: in|out waited only for #imgTbl, which the buttons never remove (they
redraw in place via ajax), so the following step could read the previous
window's map boxes and report an item "not found" that was simply not in view
yet. It now waits for the window itself to change. Pre-existing, hidden by the
dwell that FAST removes -- and every hires run is FAST. An item-not-found error
also names the current window and the items that ARE in that row, which is what
told the two cases apart.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
- lines changed 7, context: html, text, full: html, text
5d76e853fa84baa6c4a05880d3f3b985a5e51878 Sat Aug 8 13:22:15 2026 -0700
docent: add session, loadSession and expect verbs, refs #37892
session: writes the whole cart at that step to sessions/<base>/<name>.txt, in
the format hgSession's save-to-a-local-file button produces. No login is
involved. With sessionUrlBase: set, the run also prints the load URL, so a tour
hands back the state it built instead of only a picture of it. A file rather
than a live hgsid link, because the hgsid cart keeps changing as the tour runs.
loadSession: is the other direction: a settings file by URL, a share link, a
named session, or a local file written by an earlier session:. The load always
goes to the server named in target:, since named sessions are per-server and
every later step navigates to target: by absolute URL.
expect: is the only verb that can fail a run. It checks the rows drawn, the
image height, the tooltip now up, and the page text, then throws, so make stops
at that step rather than writing a wrong figure over a right one.
A session taken on a lifted view is short-lived: it names the quickLift hub by
its trash path, and re-pointing it at a durable copy does not work today. See
#38046. The README says so rather than working around it.
- src/hg/utils/docent/tests/README.txt
- lines changed 86, context: html, text, full: html, text
f963b73576b5c69915366893da7dfa6afe633456 Sat Aug 8 14:04:23 2026 -0700
docent: add a tests directory and a browser-free derive mode, refs #37892
tests/ holds Docent scripts that assert with expect:, run by hand with `make
test` rather than by the tree's test target, since each one drives a real
server. Nine of them: the two-request composite split (#37953), hideKids on a
view and on a superTrack, the cCREs expansion that once overran the request
line, addCustomTrack, a 3x run, and the session/loadSession round trip. A
script named *.xfail.docent.yaml is expected to fail, which is how the
hideKids-aimed-at-the-composite trap is pinned rather than only written down,
and how expect: itself is checked.
DOCENT_DERIVE=1 prints what each track: step turns into and stops, with no
browser and no navigation. That derivation is where most of Docent's own
decisions are, and it was previously visible only in the log of a full run.
`make derive` diffs it against baselines in tests/expected/ for the scripts
whose derived set is small enough to be stable.
The track: verb now calls trackRounds() for that derivation instead of doing
it inline. No behaviour change intended; the tests above pass before and after.
Two things the tests turned up, both recorded in tests/README.txt: turning on
anything under a superTrack sends <superTrack>=show and undoes an earlier
hide: all for its other members, and hideKids on a view has to enumerate
leaves, so one such step sends 188 variables in a 6,986-character request.
- src/hg/utils/docent/tests/composite.docent.yaml
- lines changed 25, context: html, text, full: html, text
f963b73576b5c69915366893da7dfa6afe633456 Sat Aug 8 14:04:23 2026 -0700
docent: add a tests directory and a browser-free derive mode, refs #37892
tests/ holds Docent scripts that assert with expect:, run by hand with `make
test` rather than by the tree's test target, since each one drives a real
server. Nine of them: the two-request composite split (#37953), hideKids on a
view and on a superTrack, the cCREs expansion that once overran the request
line, addCustomTrack, a 3x run, and the session/loadSession round trip. A
script named *.xfail.docent.yaml is expected to fail, which is how the
hideKids-aimed-at-the-composite trap is pinned rather than only written down,
and how expect: itself is checked.
DOCENT_DERIVE=1 prints what each track: step turns into and stops, with no
browser and no navigation. That derivation is where most of Docent's own
decisions are, and it was previously visible only in the log of a full run.
`make derive` diffs it against baselines in tests/expected/ for the scripts
whose derived set is small enough to be stable.
The track: verb now calls trackRounds() for that derivation instead of doing
it inline. No behaviour change intended; the tests above pass before and after.
Two things the tests turned up, both recorded in tests/README.txt: turning on
anything under a superTrack sends <superTrack>=show and undoes an earlier
hide: all for its other members, and hideKids on a view has to enumerate
leaves, so one such step sends 188 variables in a 6,986-character request.
- src/hg/utils/docent/tests/customtrack.docent.yaml
- lines changed 22, context: html, text, full: html, text
f963b73576b5c69915366893da7dfa6afe633456 Sat Aug 8 14:04:23 2026 -0700
docent: add a tests directory and a browser-free derive mode, refs #37892
tests/ holds Docent scripts that assert with expect:, run by hand with `make
test` rather than by the tree's test target, since each one drives a real
server. Nine of them: the two-request composite split (#37953), hideKids on a
view and on a superTrack, the cCREs expansion that once overran the request
line, addCustomTrack, a 3x run, and the session/loadSession round trip. A
script named *.xfail.docent.yaml is expected to fail, which is how the
hideKids-aimed-at-the-composite trap is pinned rather than only written down,
and how expect: itself is checked.
DOCENT_DERIVE=1 prints what each track: step turns into and stops, with no
browser and no navigation. That derivation is where most of Docent's own
decisions are, and it was previously visible only in the log of a full run.
`make derive` diffs it against baselines in tests/expected/ for the scripts
whose derived set is small enough to be stable.
The track: verb now calls trackRounds() for that derivation instead of doing
it inline. No behaviour change intended; the tests above pass before and after.
Two things the tests turned up, both recorded in tests/README.txt: turning on
anything under a superTrack sends <superTrack>=show and undoes an earlier
hide: all for its other members, and hideKids on a view has to enumerate
leaves, so one such step sends 188 variables in a 6,986-character request.
- src/hg/utils/docent/tests/expected/composite.derive
- lines changed 6, context: html, text, full: html, text
f963b73576b5c69915366893da7dfa6afe633456 Sat Aug 8 14:04:23 2026 -0700
docent: add a tests directory and a browser-free derive mode, refs #37892
tests/ holds Docent scripts that assert with expect:, run by hand with `make
test` rather than by the tree's test target, since each one drives a real
server. Nine of them: the two-request composite split (#37953), hideKids on a
view and on a superTrack, the cCREs expansion that once overran the request
line, addCustomTrack, a 3x run, and the session/loadSession round trip. A
script named *.xfail.docent.yaml is expected to fail, which is how the
hideKids-aimed-at-the-composite trap is pinned rather than only written down,
and how expect: itself is checked.
DOCENT_DERIVE=1 prints what each track: step turns into and stops, with no
browser and no navigation. That derivation is where most of Docent's own
decisions are, and it was previously visible only in the log of a full run.
`make derive` diffs it against baselines in tests/expected/ for the scripts
whose derived set is small enough to be stable.
The track: verb now calls trackRounds() for that derivation instead of doing
it inline. No behaviour change intended; the tests above pass before and after.
Two things the tests turned up, both recorded in tests/README.txt: turning on
anything under a superTrack sends <superTrack>=show and undoes an earlier
hide: all for its other members, and hideKids on a view has to enumerate
leaves, so one such step sends 188 variables in a 6,986-character request.
- src/hg/utils/docent/tests/expected/supertrack.derive
- lines changed 4, context: html, text, full: html, text
f963b73576b5c69915366893da7dfa6afe633456 Sat Aug 8 14:04:23 2026 -0700
docent: add a tests directory and a browser-free derive mode, refs #37892
tests/ holds Docent scripts that assert with expect:, run by hand with `make
test` rather than by the tree's test target, since each one drives a real
server. Nine of them: the two-request composite split (#37953), hideKids on a
view and on a superTrack, the cCREs expansion that once overran the request
line, addCustomTrack, a 3x run, and the session/loadSession round trip. A
script named *.xfail.docent.yaml is expected to fail, which is how the
hideKids-aimed-at-the-composite trap is pinned rather than only written down,
and how expect: itself is checked.
DOCENT_DERIVE=1 prints what each track: step turns into and stops, with no
browser and no navigation. That derivation is where most of Docent's own
decisions are, and it was previously visible only in the log of a full run.
`make derive` diffs it against baselines in tests/expected/ for the scripts
whose derived set is small enough to be stable.
The track: verb now calls trackRounds() for that derivation instead of doing
it inline. No behaviour change intended; the tests above pass before and after.
Two things the tests turned up, both recorded in tests/README.txt: turning on
anything under a superTrack sends <superTrack>=show and undoes an earlier
hide: all for its other members, and hideKids on a view has to enumerate
leaves, so one such step sends 188 variables in a 6,986-character request.
- src/hg/utils/docent/tests/expected/urllen.derive
- lines changed 3, context: html, text, full: html, text
f963b73576b5c69915366893da7dfa6afe633456 Sat Aug 8 14:04:23 2026 -0700
docent: add a tests directory and a browser-free derive mode, refs #37892
tests/ holds Docent scripts that assert with expect:, run by hand with `make
test` rather than by the tree's test target, since each one drives a real
server. Nine of them: the two-request composite split (#37953), hideKids on a
view and on a superTrack, the cCREs expansion that once overran the request
line, addCustomTrack, a 3x run, and the session/loadSession round trip. A
script named *.xfail.docent.yaml is expected to fail, which is how the
hideKids-aimed-at-the-composite trap is pinned rather than only written down,
and how expect: itself is checked.
DOCENT_DERIVE=1 prints what each track: step turns into and stops, with no
browser and no navigation. That derivation is where most of Docent's own
decisions are, and it was previously visible only in the log of a full run.
`make derive` diffs it against baselines in tests/expected/ for the scripts
whose derived set is small enough to be stable.
The track: verb now calls trackRounds() for that derivation instead of doing
it inline. No behaviour change intended; the tests above pass before and after.
Two things the tests turned up, both recorded in tests/README.txt: turning on
anything under a superTrack sends <superTrack>=show and undoes an earlier
hide: all for its other members, and hideKids on a view has to enumerate
leaves, so one such step sends 188 variables in a 6,986-character request.
- src/hg/utils/docent/tests/expectfail.xfail.docent.yaml
- lines changed 17, context: html, text, full: html, text
f963b73576b5c69915366893da7dfa6afe633456 Sat Aug 8 14:04:23 2026 -0700
docent: add a tests directory and a browser-free derive mode, refs #37892
tests/ holds Docent scripts that assert with expect:, run by hand with `make
test` rather than by the tree's test target, since each one drives a real
server. Nine of them: the two-request composite split (#37953), hideKids on a
view and on a superTrack, the cCREs expansion that once overran the request
line, addCustomTrack, a 3x run, and the session/loadSession round trip. A
script named *.xfail.docent.yaml is expected to fail, which is how the
hideKids-aimed-at-the-composite trap is pinned rather than only written down,
and how expect: itself is checked.
DOCENT_DERIVE=1 prints what each track: step turns into and stops, with no
browser and no navigation. That derivation is where most of Docent's own
decisions are, and it was previously visible only in the log of a full run.
`make derive` diffs it against baselines in tests/expected/ for the scripts
whose derived set is small enough to be stable.
The track: verb now calls trackRounds() for that derivation instead of doing
it inline. No behaviour change intended; the tests above pass before and after.
Two things the tests turned up, both recorded in tests/README.txt: turning on
anything under a superTrack sends <superTrack>=show and undoes an earlier
hide: all for its other members, and hideKids on a view has to enumerate
leaves, so one such step sends 188 variables in a 6,986-character request.
- src/hg/utils/docent/tests/makefile
- lines changed 102, context: html, text, full: html, text
f963b73576b5c69915366893da7dfa6afe633456 Sat Aug 8 14:04:23 2026 -0700
docent: add a tests directory and a browser-free derive mode, refs #37892
tests/ holds Docent scripts that assert with expect:, run by hand with `make
test` rather than by the tree's test target, since each one drives a real
server. Nine of them: the two-request composite split (#37953), hideKids on a
view and on a superTrack, the cCREs expansion that once overran the request
line, addCustomTrack, a 3x run, and the session/loadSession round trip. A
script named *.xfail.docent.yaml is expected to fail, which is how the
hideKids-aimed-at-the-composite trap is pinned rather than only written down,
and how expect: itself is checked.
DOCENT_DERIVE=1 prints what each track: step turns into and stops, with no
browser and no navigation. That derivation is where most of Docent's own
decisions are, and it was previously visible only in the log of a full run.
`make derive` diffs it against baselines in tests/expected/ for the scripts
whose derived set is small enough to be stable.
The track: verb now calls trackRounds() for that derivation instead of doing
it inline. No behaviour change intended; the tests above pass before and after.
Two things the tests turned up, both recorded in tests/README.txt: turning on
anything under a superTrack sends <superTrack>=show and undoes an earlier
hide: all for its other members, and hideKids on a view has to enumerate
leaves, so one such step sends 188 variables in a 6,986-character request.
- src/hg/utils/docent/tests/scale.docent.yaml
- lines changed 22, context: html, text, full: html, text
f963b73576b5c69915366893da7dfa6afe633456 Sat Aug 8 14:04:23 2026 -0700
docent: add a tests directory and a browser-free derive mode, refs #37892
tests/ holds Docent scripts that assert with expect:, run by hand with `make
test` rather than by the tree's test target, since each one drives a real
server. Nine of them: the two-request composite split (#37953), hideKids on a
view and on a superTrack, the cCREs expansion that once overran the request
line, addCustomTrack, a 3x run, and the session/loadSession round trip. A
script named *.xfail.docent.yaml is expected to fail, which is how the
hideKids-aimed-at-the-composite trap is pinned rather than only written down,
and how expect: itself is checked.
DOCENT_DERIVE=1 prints what each track: step turns into and stops, with no
browser and no navigation. That derivation is where most of Docent's own
decisions are, and it was previously visible only in the log of a full run.
`make derive` diffs it against baselines in tests/expected/ for the scripts
whose derived set is small enough to be stable.
The track: verb now calls trackRounds() for that derivation instead of doing
it inline. No behaviour change intended; the tests above pass before and after.
Two things the tests turned up, both recorded in tests/README.txt: turning on
anything under a superTrack sends <superTrack>=show and undoes an earlier
hide: all for its other members, and hideKids on a view has to enumerate
leaves, so one such step sends 188 variables in a 6,986-character request.
- src/hg/utils/docent/tests/selftest.docent.yaml
- lines changed 30, context: html, text, full: html, text
f963b73576b5c69915366893da7dfa6afe633456 Sat Aug 8 14:04:23 2026 -0700
docent: add a tests directory and a browser-free derive mode, refs #37892
tests/ holds Docent scripts that assert with expect:, run by hand with `make
test` rather than by the tree's test target, since each one drives a real
server. Nine of them: the two-request composite split (#37953), hideKids on a
view and on a superTrack, the cCREs expansion that once overran the request
line, addCustomTrack, a 3x run, and the session/loadSession round trip. A
script named *.xfail.docent.yaml is expected to fail, which is how the
hideKids-aimed-at-the-composite trap is pinned rather than only written down,
and how expect: itself is checked.
DOCENT_DERIVE=1 prints what each track: step turns into and stops, with no
browser and no navigation. That derivation is where most of Docent's own
decisions are, and it was previously visible only in the log of a full run.
`make derive` diffs it against baselines in tests/expected/ for the scripts
whose derived set is small enough to be stable.
The track: verb now calls trackRounds() for that derivation instead of doing
it inline. No behaviour change intended; the tests above pass before and after.
Two things the tests turned up, both recorded in tests/README.txt: turning on
anything under a superTrack sends <superTrack>=show and undoes an earlier
hide: all for its other members, and hideKids on a view has to enumerate
leaves, so one such step sends 188 variables in a 6,986-character request.
- src/hg/utils/docent/tests/supertrack.docent.yaml
- lines changed 19, context: html, text, full: html, text
f963b73576b5c69915366893da7dfa6afe633456 Sat Aug 8 14:04:23 2026 -0700
docent: add a tests directory and a browser-free derive mode, refs #37892
tests/ holds Docent scripts that assert with expect:, run by hand with `make
test` rather than by the tree's test target, since each one drives a real
server. Nine of them: the two-request composite split (#37953), hideKids on a
view and on a superTrack, the cCREs expansion that once overran the request
line, addCustomTrack, a 3x run, and the session/loadSession round trip. A
script named *.xfail.docent.yaml is expected to fail, which is how the
hideKids-aimed-at-the-composite trap is pinned rather than only written down,
and how expect: itself is checked.
DOCENT_DERIVE=1 prints what each track: step turns into and stops, with no
browser and no navigation. That derivation is where most of Docent's own
decisions are, and it was previously visible only in the log of a full run.
`make derive` diffs it against baselines in tests/expected/ for the scripts
whose derived set is small enough to be stable.
The track: verb now calls trackRounds() for that derivation instead of doing
it inline. No behaviour change intended; the tests above pass before and after.
Two things the tests turned up, both recorded in tests/README.txt: turning on
anything under a superTrack sends <superTrack>=show and undoes an earlier
hide: all for its other members, and hideKids on a view has to enumerate
leaves, so one such step sends 188 variables in a 6,986-character request.
- src/hg/utils/docent/tests/urllen.docent.yaml
- lines changed 20, context: html, text, full: html, text
f963b73576b5c69915366893da7dfa6afe633456 Sat Aug 8 14:04:23 2026 -0700
docent: add a tests directory and a browser-free derive mode, refs #37892
tests/ holds Docent scripts that assert with expect:, run by hand with `make
test` rather than by the tree's test target, since each one drives a real
server. Nine of them: the two-request composite split (#37953), hideKids on a
view and on a superTrack, the cCREs expansion that once overran the request
line, addCustomTrack, a 3x run, and the session/loadSession round trip. A
script named *.xfail.docent.yaml is expected to fail, which is how the
hideKids-aimed-at-the-composite trap is pinned rather than only written down,
and how expect: itself is checked.
DOCENT_DERIVE=1 prints what each track: step turns into and stops, with no
browser and no navigation. That derivation is where most of Docent's own
decisions are, and it was previously visible only in the log of a full run.
`make derive` diffs it against baselines in tests/expected/ for the scripts
whose derived set is small enough to be stable.
The track: verb now calls trackRounds() for that derivation instead of doing
it inline. No behaviour change intended; the tests above pass before and after.
Two things the tests turned up, both recorded in tests/README.txt: turning on
anything under a superTrack sends <superTrack>=show and undoes an earlier
hide: all for its other members, and hideKids on a view has to enumerate
leaves, so one such step sends 188 variables in a 6,986-character request.
- src/hg/utils/docent/tests/views.docent.yaml
- lines changed 39, context: html, text, full: html, text
f963b73576b5c69915366893da7dfa6afe633456 Sat Aug 8 14:04:23 2026 -0700
docent: add a tests directory and a browser-free derive mode, refs #37892
tests/ holds Docent scripts that assert with expect:, run by hand with `make
test` rather than by the tree's test target, since each one drives a real
server. Nine of them: the two-request composite split (#37953), hideKids on a
view and on a superTrack, the cCREs expansion that once overran the request
line, addCustomTrack, a 3x run, and the session/loadSession round trip. A
script named *.xfail.docent.yaml is expected to fail, which is how the
hideKids-aimed-at-the-composite trap is pinned rather than only written down,
and how expect: itself is checked.
DOCENT_DERIVE=1 prints what each track: step turns into and stops, with no
browser and no navigation. That derivation is where most of Docent's own
decisions are, and it was previously visible only in the log of a full run.
`make derive` diffs it against baselines in tests/expected/ for the scripts
whose derived set is small enough to be stable.
The track: verb now calls trackRounds() for that derivation instead of doing
it inline. No behaviour change intended; the tests above pass before and after.
Two things the tests turned up, both recorded in tests/README.txt: turning on
anything under a superTrack sends <superTrack>=show and undoes an earlier
hide: all for its other members, and hideKids on a view has to enumerate
leaves, so one such step sends 188 variables in a 6,986-character request.
- src/hg/utils/docent/tests/views.xfail.docent.yaml
- lines changed 21, context: html, text, full: html, text
f963b73576b5c69915366893da7dfa6afe633456 Sat Aug 8 14:04:23 2026 -0700
docent: add a tests directory and a browser-free derive mode, refs #37892
tests/ holds Docent scripts that assert with expect:, run by hand with `make
test` rather than by the tree's test target, since each one drives a real
server. Nine of them: the two-request composite split (#37953), hideKids on a
view and on a superTrack, the cCREs expansion that once overran the request
line, addCustomTrack, a 3x run, and the session/loadSession round trip. A
script named *.xfail.docent.yaml is expected to fail, which is how the
hideKids-aimed-at-the-composite trap is pinned rather than only written down,
and how expect: itself is checked.
DOCENT_DERIVE=1 prints what each track: step turns into and stops, with no
browser and no navigation. That derivation is where most of Docent's own
decisions are, and it was previously visible only in the log of a full run.
`make derive` diffs it against baselines in tests/expected/ for the scripts
whose derived set is small enough to be stable.
The track: verb now calls trackRounds() for that derivation instead of doing
it inline. No behaviour change intended; the tests above pass before and after.
Two things the tests turned up, both recorded in tests/README.txt: turning on
anything under a superTrack sends <superTrack>=show and undoes an earlier
hide: all for its other members, and hideKids on a view has to enumerate
leaves, so one such step sends 188 variables in a 6,986-character request.
- src/hg/utils/hgConfCatalog/harvestHgConf.py
- lines changed 36, context: html, text, full: html, text
98ac3822afa0712f1897d17e5b7934c4aa742f57 Tue Aug 4 17:11:00 2026 -0700
hgConfCatalog: report only the gates that changed this release, and settle the gate/knob calls, refs #37925
Groundwork for running the sunset report from the weekly build's wrap-up.
--sunset prints the whole standing list every run, which reads as a worklist
the first week and as wallpaper by the third. New --sunset-new reports only
the gates that went overdue or stalled since hgConfGateBacklog.txt was last
accepted, plus the ones that were cleaned up, and exits 1 when there is
something new, the same contract --reconcile already has. --update-baseline
accepts the current state, so the file's diff becomes the release-to-release
history of the backlog. Gates already in the backlog are marked in --sunset
too, so an unmarked row there is one this release created.
Settled all eleven gate-or-knob calls that were filed debatable, each by
reading the call site. forceTwoBit, freeType, sleepOn429 and trustTrackDb
become knobs: what their off position describes is where a machine keeps its
sequence, whether it has the URW fonts, whether it wants to hold a process
after a 429, and whether its trackDb can be trusted. Three of those were on
the overdue list, so the report was telling somebody to delete flags that
should stay. autoBlatBigPsl becomes a gate: its default is the file-scope
autoBigPsl, initialised FALSE under the comment "DEFAULT VALUE change to TRUE
in future", and a flag whose own source says to flip it later is not a
permanent switch. alwaysItemRgb and blatNewPageBanner stay gates, and
hgHubConnect.validateHub stays a gate with its note corrected: it gates the
Hub Development tab, not validation on attach. Overdue is 18 down to 15.
Added a fourth reconcile question: does each flag's hand-written default still
match the tree's. That field is the one part of a gate's lifecycle not read
out of git, and gate_lifecycle decides a gate has shipped from it alone, so a
flag flipped TRUE in code without the row updated sat in the stalled list
under a heading telling somebody to turn on a flag that was already on. Zero
mismatches today. A flag read with both TRUE and FALSE as its compiled-in
default is reported under --verbose rather than counted as a problem, since
the fix belongs to whoever owns the code: multiRegionButtonTop is read TRUE at
hgTracks.c:9126 and FALSE at config.c:990, so on a default install the button
is in the top bar while the checkbox the same flag guards is hidden.
The age cache is overridable with --cache or HGCONF_AGE_CACHE, and
hgConfCatalog.py takes --refresh, so an automated run can rebuild it without
writing into a git checkout. Refreshed the committed cache, which dates
blatNewPageBanner and showLiftRequest: both were added after it was last
built, which is why they read as undatable. Documented forceTwoBit and
freeType in ex.hg.conf, since calling them mirror knobs and leaving them
undiscoverable is the same mistake in the other direction.
- src/hg/utils/hgConfCatalog/hgConfAges.json
- lines changed 57, context: html, text, full: html, text
98ac3822afa0712f1897d17e5b7934c4aa742f57 Tue Aug 4 17:11:00 2026 -0700
hgConfCatalog: report only the gates that changed this release, and settle the gate/knob calls, refs #37925
Groundwork for running the sunset report from the weekly build's wrap-up.
--sunset prints the whole standing list every run, which reads as a worklist
the first week and as wallpaper by the third. New --sunset-new reports only
the gates that went overdue or stalled since hgConfGateBacklog.txt was last
accepted, plus the ones that were cleaned up, and exits 1 when there is
something new, the same contract --reconcile already has. --update-baseline
accepts the current state, so the file's diff becomes the release-to-release
history of the backlog. Gates already in the backlog are marked in --sunset
too, so an unmarked row there is one this release created.
Settled all eleven gate-or-knob calls that were filed debatable, each by
reading the call site. forceTwoBit, freeType, sleepOn429 and trustTrackDb
become knobs: what their off position describes is where a machine keeps its
sequence, whether it has the URW fonts, whether it wants to hold a process
after a 429, and whether its trackDb can be trusted. Three of those were on
the overdue list, so the report was telling somebody to delete flags that
should stay. autoBlatBigPsl becomes a gate: its default is the file-scope
autoBigPsl, initialised FALSE under the comment "DEFAULT VALUE change to TRUE
in future", and a flag whose own source says to flip it later is not a
permanent switch. alwaysItemRgb and blatNewPageBanner stay gates, and
hgHubConnect.validateHub stays a gate with its note corrected: it gates the
Hub Development tab, not validation on attach. Overdue is 18 down to 15.
Added a fourth reconcile question: does each flag's hand-written default still
match the tree's. That field is the one part of a gate's lifecycle not read
out of git, and gate_lifecycle decides a gate has shipped from it alone, so a
flag flipped TRUE in code without the row updated sat in the stalled list
under a heading telling somebody to turn on a flag that was already on. Zero
mismatches today. A flag read with both TRUE and FALSE as its compiled-in
default is reported under --verbose rather than counted as a problem, since
the fix belongs to whoever owns the code: multiRegionButtonTop is read TRUE at
hgTracks.c:9126 and FALSE at config.c:990, so on a default install the button
is in the top bar while the checkbox the same flag guards is hidden.
The age cache is overridable with --cache or HGCONF_AGE_CACHE, and
hgConfCatalog.py takes --refresh, so an automated run can rebuild it without
writing into a git checkout. Refreshed the committed cache, which dates
blatNewPageBanner and showLiftRequest: both were added after it was last
built, which is why they read as undatable. Documented forceTwoBit and
freeType in ex.hg.conf, since calling them mirror knobs and leaving them
undiscoverable is the same mistake in the other direction.
- src/hg/utils/hgConfCatalog/hgConfCatalog.py
- lines changed 447, context: html, text, full: html, text
98ac3822afa0712f1897d17e5b7934c4aa742f57 Tue Aug 4 17:11:00 2026 -0700
hgConfCatalog: report only the gates that changed this release, and settle the gate/knob calls, refs #37925
Groundwork for running the sunset report from the weekly build's wrap-up.
--sunset prints the whole standing list every run, which reads as a worklist
the first week and as wallpaper by the third. New --sunset-new reports only
the gates that went overdue or stalled since hgConfGateBacklog.txt was last
accepted, plus the ones that were cleaned up, and exits 1 when there is
something new, the same contract --reconcile already has. --update-baseline
accepts the current state, so the file's diff becomes the release-to-release
history of the backlog. Gates already in the backlog are marked in --sunset
too, so an unmarked row there is one this release created.
Settled all eleven gate-or-knob calls that were filed debatable, each by
reading the call site. forceTwoBit, freeType, sleepOn429 and trustTrackDb
become knobs: what their off position describes is where a machine keeps its
sequence, whether it has the URW fonts, whether it wants to hold a process
after a 429, and whether its trackDb can be trusted. Three of those were on
the overdue list, so the report was telling somebody to delete flags that
should stay. autoBlatBigPsl becomes a gate: its default is the file-scope
autoBigPsl, initialised FALSE under the comment "DEFAULT VALUE change to TRUE
in future", and a flag whose own source says to flip it later is not a
permanent switch. alwaysItemRgb and blatNewPageBanner stay gates, and
hgHubConnect.validateHub stays a gate with its note corrected: it gates the
Hub Development tab, not validation on attach. Overdue is 18 down to 15.
Added a fourth reconcile question: does each flag's hand-written default still
match the tree's. That field is the one part of a gate's lifecycle not read
out of git, and gate_lifecycle decides a gate has shipped from it alone, so a
flag flipped TRUE in code without the row updated sat in the stalled list
under a heading telling somebody to turn on a flag that was already on. Zero
mismatches today. A flag read with both TRUE and FALSE as its compiled-in
default is reported under --verbose rather than counted as a problem, since
the fix belongs to whoever owns the code: multiRegionButtonTop is read TRUE at
hgTracks.c:9126 and FALSE at config.c:990, so on a default install the button
is in the top bar while the checkbox the same flag guards is hidden.
The age cache is overridable with --cache or HGCONF_AGE_CACHE, and
hgConfCatalog.py takes --refresh, so an automated run can rebuild it without
writing into a git checkout. Refreshed the committed cache, which dates
blatNewPageBanner and showLiftRequest: both were added after it was last
built, which is why they read as undatable. Documented forceTwoBit and
freeType in ex.hg.conf, since calling them mirror knobs and leaving them
undiscoverable is the same mistake in the other direction.
- lines changed 452, context: html, text, full: html, text
1ffe5f2fad53035d54f7b37c4da55b1767ec4d62 Wed Aug 5 10:15:26 2026 -0700
hgConfCatalog: keep the file:line citations true and register new settings without asking a developer, refs #37925
Code review caught autoBlatBigPsl's row citing hgBlat.c:2629, an unrelated
function, while the note in that same row already named the real read at 2972.
Sweeping every citation, with the CFG_ and #define indirection resolved so a
macro-spelled read is not a false positive, found 66 of the 269 line-cited rows
pointing at the wrong line. They cluster by file (+343 across hgBlat.c, +11
across hgTracks.c, +2 across hdb.c), so this was the tree moving under the
catalog rather than anybody mistyping. All 66 now match a site the harvester
finds on its own. Rows whose citation opens a multi-line cfgOptionEnvDefault
call were already correct and are untouched, as are the four whose only literal
lives in a #define.
reconcile() grows a fifth check so this cannot drift again, and --fix-citations
repairs what it finds: line drift prints a count and the command, while a read
that has left its cited file lists the rows, because choosing among call sites
needs a person.
--auto-register writes a row for any setting the tree reads that the catalog
lacks. The developer who adds an hg.conf read should not have to know this
catalog exists, and asking them to had not worked: hubSpaceLockTimeout arrived
as one supporting line inside an unrelated bugfix and nothing noticed until
--reconcile was run by hand a day later. It copies only what the call itself
states, plus the introducing commit and ticket read out of git, and refuses
every judgement. role= in particular is left unset on purpose: calling a
release gate a knob would hide it from the sunset report for good, and calling
a knob a gate would feed fiction into the overdue arithmetic. Rows land in a
new "Awaiting review" section, which --reconcile counts as needing attention
until somebody classifies them, so the silence is bought for the developer and
not for us.
nightlyRegister.sh runs both passes nightly and commits. It works in the
weekly build's own tree, so it acts only on master (cherryPickCommits.csh and
tagBeta.csh both check out release branches in there), never leaves the tree
dirty for ensure_clean_git() to abort on, stands aside while
/tmp/autoBuild.lock is held, and throws its own commit away rather than leave
one unpushed if the push is rejected.
hubSpaceLockTimeout is classified here as well: a limit, 300 seconds by
default, bounding the flock poll in lockHubDir.
- lines changed 21, context: html, text, full: html, text
f066bc4cf3adb12de8d6c65f41b47c2e463ed27e Thu Aug 6 10:07:24 2026 -0700
hgConfCatalog: escape what the auto-writer splices, and count the right rows, refs #37925
Two things a code review caught in the nightly job, neither of which had gone
wrong yet and both of which would have gone wrong quietly.
--auto-register writes Python into this file and the file is imported again the
next time anything runs, so free-form text in a generated row has to survive
being a string literal. Most of it does; the git commit subject does not. A
subject that quotes a setting name, which is an ordinary thing to write, would
put a bare " in the row and break every import of the catalog tree-wide, and it
would land on master unreviewed because running unattended is the whole point.
Escape the backslashes and quotes and drop the control characters on the way in.
The note is wrapped before it is escaped so the added backslashes, which nobody
reads, do not push a line over.
The heartbeat's "awaiting classification" number came from reconcile's aggregate
problems: total, which also counts wrong hand-written defaults and citations
whose call site left the file. Right now the tree has seven drifted citations
and an empty holding pen, so tonight's line would have claimed seven settings
were waiting on somebody when none were. Read the count off the "written down
but not classified" line instead. A heartbeat exists to be believed later by
somebody skimming the history file, and a wrong number there is worse than none.
- lines changed 7, context: html, text, full: html, text
3b13914cf3079b1c2211f14d5295558c5e4d3cc7 Thu Aug 6 10:08:04 2026 -0700
hgConfCatalog: refresh the file:line citations, refs #37925
Seven rows in hg/hgLogin/hgLogin.c drifted when the OIDC provider and
login.emailLink work inserted lines above them: six by one line, pwdEyeIcon by
five. Nothing about the settings changed, and hgLogin.c:81 just landed on a
bare brace instead of the cfgOption call the row names. Written by
hgConfCatalog.py --fix-citations, which only moves a line number onto the read
the row already cites. The nightly job would have done this on its own; doing
it here gets the count out of reconcile's problem total.
- lines changed 34, context: html, text, full: html, text
6a22efd821c976be180e03c187be89d1155ad41a Sat Aug 8 09:04:15 2026 -0700
hgConfCatalog: correct the blatNewPageBanner default and classify blatOldTracks, refs #37925
blatNewPageBanner was born TRUE at c683ecb63d7 and put back to FALSE at
81d7cff6cb6 while the new BLAT page is still being tested. The catalog kept
saying TRUE, and gate_lifecycle reads that field alone to decide a gate has
shipped, so the row would have put a gating flag in the shipped list.
blatOldTracks came in from --auto-register and needed a person. It is a
three-value string, not a flag, so no gate/knob role applies: it chooses what
happens to the custom tracks left by a user's earlier BLAT searches. Filed
under mirror knobs, whose description now admits the occasional non-boolean.
- lines changed 6, context: html, text, full: html, text
0043d5ee22db1de1ec305eadb8442bd5a59fe5d7 Mon Aug 10 08:55:00 2026 -0700
hgc: route non-BLAT alignment clicks to the modern single-page view, refs #37893
Behind a new modernAlignPage hg.conf gate (default off), ordinary alignment
details -- mRNA/EST (htcCdnaAli), PSL/bigPsl, protein, cross-species and the
other showSomeAlignment callers -- now render in the modern single-page
alignment instead of the classic two-frame <frameset>, matching hgBlat's new
results page.
- Generalize showSomeAlignmentModern with a blatContext flag: TRUE keeps the
hgBlat chrome (title 'BLAT Base Alignment', 'Back to results', 'Share a
link'); FALSE is a plain track click, which has no BLAT results to return to
or share, so the title is just 'Base Alignment' and those buttons are omitted.
- alnModernStart() starts modern chrome and arms a flag when modernAlignPage is
set; showSomeAlignment() then renders the modern body, else the classic
frameset. htmlFramesetStart() is left untouched (it is shared with transMap,
retro and pubs click pages), so only the converted callers change.
- The window-restricted (showSomePartialDnaAlignment) and Lowe-Lab
(showSomeAlignment2) renderers are left classic for now.
- Register modernAlignPage in hgConfCatalog.
- src/hg/utils/hgConfCatalog/hgConfGateBacklog.txt
- lines changed 41, context: html, text, full: html, text
98ac3822afa0712f1897d17e5b7934c4aa742f57 Tue Aug 4 17:11:00 2026 -0700
hgConfCatalog: report only the gates that changed this release, and settle the gate/knob calls, refs #37925
Groundwork for running the sunset report from the weekly build's wrap-up.
--sunset prints the whole standing list every run, which reads as a worklist
the first week and as wallpaper by the third. New --sunset-new reports only
the gates that went overdue or stalled since hgConfGateBacklog.txt was last
accepted, plus the ones that were cleaned up, and exits 1 when there is
something new, the same contract --reconcile already has. --update-baseline
accepts the current state, so the file's diff becomes the release-to-release
history of the backlog. Gates already in the backlog are marked in --sunset
too, so an unmarked row there is one this release created.
Settled all eleven gate-or-knob calls that were filed debatable, each by
reading the call site. forceTwoBit, freeType, sleepOn429 and trustTrackDb
become knobs: what their off position describes is where a machine keeps its
sequence, whether it has the URW fonts, whether it wants to hold a process
after a 429, and whether its trackDb can be trusted. Three of those were on
the overdue list, so the report was telling somebody to delete flags that
should stay. autoBlatBigPsl becomes a gate: its default is the file-scope
autoBigPsl, initialised FALSE under the comment "DEFAULT VALUE change to TRUE
in future", and a flag whose own source says to flip it later is not a
permanent switch. alwaysItemRgb and blatNewPageBanner stay gates, and
hgHubConnect.validateHub stays a gate with its note corrected: it gates the
Hub Development tab, not validation on attach. Overdue is 18 down to 15.
Added a fourth reconcile question: does each flag's hand-written default still
match the tree's. That field is the one part of a gate's lifecycle not read
out of git, and gate_lifecycle decides a gate has shipped from it alone, so a
flag flipped TRUE in code without the row updated sat in the stalled list
under a heading telling somebody to turn on a flag that was already on. Zero
mismatches today. A flag read with both TRUE and FALSE as its compiled-in
default is reported under --verbose rather than counted as a problem, since
the fix belongs to whoever owns the code: multiRegionButtonTop is read TRUE at
hgTracks.c:9126 and FALSE at config.c:990, so on a default install the button
is in the top bar while the checkbox the same flag guards is hidden.
The age cache is overridable with --cache or HGCONF_AGE_CACHE, and
hgConfCatalog.py takes --refresh, so an automated run can rebuild it without
writing into a git checkout. Refreshed the committed cache, which dates
blatNewPageBanner and showLiftRequest: both were added after it was last
built, which is why they read as undatable. Documented forceTwoBit and
freeType in ex.hg.conf, since calling them mirror knobs and leaving them
undiscoverable is the same mistake in the other direction.
- src/hg/utils/hgConfCatalog/nightlyRegister.sh
- lines changed 173, context: html, text, full: html, text
1ffe5f2fad53035d54f7b37c4da55b1767ec4d62 Wed Aug 5 10:15:26 2026 -0700
hgConfCatalog: keep the file:line citations true and register new settings without asking a developer, refs #37925
Code review caught autoBlatBigPsl's row citing hgBlat.c:2629, an unrelated
function, while the note in that same row already named the real read at 2972.
Sweeping every citation, with the CFG_ and #define indirection resolved so a
macro-spelled read is not a false positive, found 66 of the 269 line-cited rows
pointing at the wrong line. They cluster by file (+343 across hgBlat.c, +11
across hgTracks.c, +2 across hdb.c), so this was the tree moving under the
catalog rather than anybody mistyping. All 66 now match a site the harvester
finds on its own. Rows whose citation opens a multi-line cfgOptionEnvDefault
call were already correct and are untouched, as are the four whose only literal
lives in a #define.
reconcile() grows a fifth check so this cannot drift again, and --fix-citations
repairs what it finds: line drift prints a count and the command, while a read
that has left its cited file lists the rows, because choosing among call sites
needs a person.
--auto-register writes a row for any setting the tree reads that the catalog
lacks. The developer who adds an hg.conf read should not have to know this
catalog exists, and asking them to had not worked: hubSpaceLockTimeout arrived
as one supporting line inside an unrelated bugfix and nothing noticed until
--reconcile was run by hand a day later. It copies only what the call itself
states, plus the introducing commit and ticket read out of git, and refuses
every judgement. role= in particular is left unset on purpose: calling a
release gate a knob would hide it from the sunset report for good, and calling
a knob a gate would feed fiction into the overdue arithmetic. Rows land in a
new "Awaiting review" section, which --reconcile counts as needing attention
until somebody classifies them, so the silence is bought for the developer and
not for us.
nightlyRegister.sh runs both passes nightly and commits. It works in the
weekly build's own tree, so it acts only on master (cherryPickCommits.csh and
tagBeta.csh both check out release branches in there), never leaves the tree
dirty for ensure_clean_git() to abort on, stands aside while
/tmp/autoBuild.lock is held, and throws its own commit away rather than leave
one unpushed if the push is rejected.
hubSpaceLockTimeout is classified here as well: a limit, 300 seconds by
default, bounding the flock poll in lockHubDir.
- lines changed 51, context: html, text, full: html, text
9e183778db2595f86065c84518a68f4490c7b375 Wed Aug 5 11:03:35 2026 -0700
nightlyRegister.sh: say one line every night while this job is still new, refs #37925
A job that only speaks up when something is wrong is a job nobody notices has
died. This one was written to be quiet on a clean night, which is right for the
long run and wrong for its first weeks, when the failure nobody would catch is
the cron never running at all.
So it now emits one line per run, whatever happened, carrying enough state to be
worth reading rather than being a bare pulse:
2026-08-05 03:30 nothing to register, 0 awaiting classification, tree at a74f3a3
The same line is appended to $WEEKLYBLD/logs/hgConfRegister.history, the build's
own untracked log directory. The mail is what keeps the job in mind; the history
outlives the mail, so a gap in the dates shows when it stopped. Set
HGCONF_NIGHTLY_HEARTBEAT=no in the crontab once the mail is boring and the
history keeps going without it. A failure records its own line, so a run that
died is distinguishable from one that never happened.
The skip paths beat as well, which matters more than the ordinary nights: until
now "a build is running" and "the tree is on v501_branch" both exited in total
silence, which is indistinguishable from a dead cron during precisely the week
nobody wants to be wondering.
Counts come from the --reconcile that already runs after the writes, so the
awaiting-classification figure includes anything registered the same night
rather than lagging a day behind.
- lines changed 8, context: html, text, full: html, text
f066bc4cf3adb12de8d6c65f41b47c2e463ed27e Thu Aug 6 10:07:24 2026 -0700
hgConfCatalog: escape what the auto-writer splices, and count the right rows, refs #37925
Two things a code review caught in the nightly job, neither of which had gone
wrong yet and both of which would have gone wrong quietly.
--auto-register writes Python into this file and the file is imported again the
next time anything runs, so free-form text in a generated row has to survive
being a string literal. Most of it does; the git commit subject does not. A
subject that quotes a setting name, which is an ordinary thing to write, would
put a bare " in the row and break every import of the catalog tree-wide, and it
would land on master unreviewed because running unattended is the whole point.
Escape the backslashes and quotes and drop the control characters on the way in.
The note is wrapped before it is escaped so the added backslashes, which nobody
reads, do not push a line over.
The heartbeat's "awaiting classification" number came from reconcile's aggregate
problems: total, which also counts wrong hand-written defaults and citations
whose call site left the file. Right now the tree has seven drifted citations
and an empty holding pen, so tonight's line would have claimed seven settings
were waiting on somebody when none were. Read the count off the "written down
but not classified" line instead. A heartbeat exists to be believed later by
somebody skimming the history file, and a wrong number there is worse than none.
- src/hg/utils/hubCheck/hubCheck.c
- lines changed 40, context: html, text, full: html, text
c9655cda984d9a119d0c4ee37505392fa853a224 Thu Aug 6 05:47:02 2026 -0700
Move the orphaned range-filter warning from hgTrackUi to hubCheck, refs #37927
Per Brian's review comment: a new warning on the track config page makes hubs
that used to work look broken to whoever opens them, and the browser is the
wrong place to nag about it. Revert the hui.c warning and do the check in
hubCheck instead, where the hub author is the one reading the output.
The check now looks only at settings declared on the stanza itself, so an
orphaned filterByRange on a composite parent is reported once rather than
repeated for every subtrack. The filter.<field> lookup still walks up the
parent chain, so a subtrack that inherits its default range stays quiet.
- src/hg/utils/mafToBigMafSummary/mafToBigMafSummary.c
- lines changed 33, context: html, text, full: html, text
2070aedea88da26aee0af3e2fd867b67140b09b5 Wed Aug 5 16:59:19 2026 -0700
Move the maf sequence-name splitter into jkweb so both summary tools share one copy. refs #37928
mafSplitSrcGetChrom existed as two independent copies, in hgLoadMafSummary.c and
mafToBigMafSummary.c, and they had diverged: only the first had the GenArk accession
rule added by 2db6bab8db0. It now lives in src/lib/maf.c, with the rules documented
in maf.h.
mafToBigMafSummary therefore picks up the GenArk rule it was missing, so a dotted
GenArk name like GCA_009914755.4.CM034974.1 now keeps its accession version instead of
dropping it, which matches what hprc90waySummary already holds.
Also removes mafCompGetSrcDb and mafCompGetSrcName from maf.c and maf.h. Both were
first-dot splitters with no callers anywhere in the tree.
- lines changed 4, context: html, text, full: html, text
a8b15f82bbcff0d7953bae0da7df49363939f85a Wed Aug 5 16:59:54 2026 -0700
Add tests for every maf sequence-name form, and describe the splitting in the usage messages. refs #37928
The existing testDot and testPipe inputs are identical copies of each other and both use
pipe-form query names, so the dot path was never exercised in either tool. That is how
the break in ae63ce5 shipped even though a test suite existed, and why the suite could
not have caught the mafToBigMafSummary divergence either.
New inputs in both tests directories cover an ordinary db.chrom, a species name with a
dotted chrom, both GenArk accession forms, a GenArk accession with no chrom after the
version, a pipe with a dotted chrom, a name with no separator, a reference assembly
whose own name contains a dot, and a name where the reference db is a strict prefix of
another assembly. Every rule in the splitter is now load-bearing: breaking any one of
them fails a target.
Also adds mafToBigMafSummary to TEST_DIRS in hg/utils, since nothing above the directory
was running its suite, and adds a short note to both usage messages describing how a
sequence name is split into assembly and sequence.
- src/hg/utils/mafToBigMafSummary/tests/expected/testDottedRef.bed
- lines changed 2, context: html, text, full: html, text
a8b15f82bbcff0d7953bae0da7df49363939f85a Wed Aug 5 16:59:54 2026 -0700
Add tests for every maf sequence-name form, and describe the splitting in the usage messages. refs #37928
The existing testDot and testPipe inputs are identical copies of each other and both use
pipe-form query names, so the dot path was never exercised in either tool. That is how
the break in ae63ce5 shipped even though a test suite existed, and why the suite could
not have caught the mafToBigMafSummary divergence either.
New inputs in both tests directories cover an ordinary db.chrom, a species name with a
dotted chrom, both GenArk accession forms, a GenArk accession with no chrom after the
version, a pipe with a dotted chrom, a name with no separator, a reference assembly
whose own name contains a dot, and a name where the reference db is a strict prefix of
another assembly. Every rule in the splitter is now load-bearing: breaking any one of
them fails a target.
Also adds mafToBigMafSummary to TEST_DIRS in hg/utils, since nothing above the directory
was running its suite, and adds a short note to both usage messages describing how a
sequence name is split into assembly and sequence.
- src/hg/utils/mafToBigMafSummary/tests/expected/testGenArkRef.bed
- lines changed 3, context: html, text, full: html, text
a8b15f82bbcff0d7953bae0da7df49363939f85a Wed Aug 5 16:59:54 2026 -0700
Add tests for every maf sequence-name form, and describe the splitting in the usage messages. refs #37928
The existing testDot and testPipe inputs are identical copies of each other and both use
pipe-form query names, so the dot path was never exercised in either tool. That is how
the break in ae63ce5 shipped even though a test suite existed, and why the suite could
not have caught the mafToBigMafSummary divergence either.
New inputs in both tests directories cover an ordinary db.chrom, a species name with a
dotted chrom, both GenArk accession forms, a GenArk accession with no chrom after the
version, a pipe with a dotted chrom, a name with no separator, a reference assembly
whose own name contains a dot, and a name where the reference db is a strict prefix of
another assembly. Every rule in the splitter is now load-bearing: breaking any one of
them fails a target.
Also adds mafToBigMafSummary to TEST_DIRS in hg/utils, since nothing above the directory
was running its suite, and adds a short note to both usage messages describing how a
sequence name is split into assembly and sequence.
- src/hg/utils/mafToBigMafSummary/tests/expected/testNameForms.bed
- lines changed 8, context: html, text, full: html, text
a8b15f82bbcff0d7953bae0da7df49363939f85a Wed Aug 5 16:59:54 2026 -0700
Add tests for every maf sequence-name form, and describe the splitting in the usage messages. refs #37928
The existing testDot and testPipe inputs are identical copies of each other and both use
pipe-form query names, so the dot path was never exercised in either tool. That is how
the break in ae63ce5 shipped even though a test suite existed, and why the suite could
not have caught the mafToBigMafSummary divergence either.
New inputs in both tests directories cover an ordinary db.chrom, a species name with a
dotted chrom, both GenArk accession forms, a GenArk accession with no chrom after the
version, a pipe with a dotted chrom, a name with no separator, a reference assembly
whose own name contains a dot, and a name where the reference db is a strict prefix of
another assembly. Every rule in the splitter is now load-bearing: breaking any one of
them fails a target.
Also adds mafToBigMafSummary to TEST_DIRS in hg/utils, since nothing above the directory
was running its suite, and adds a short note to both usage messages describing how a
sequence name is split into assembly and sequence.
- src/hg/utils/mafToBigMafSummary/tests/input/testDottedRef.maf
- lines changed 6, context: html, text, full: html, text
a8b15f82bbcff0d7953bae0da7df49363939f85a Wed Aug 5 16:59:54 2026 -0700
Add tests for every maf sequence-name form, and describe the splitting in the usage messages. refs #37928
The existing testDot and testPipe inputs are identical copies of each other and both use
pipe-form query names, so the dot path was never exercised in either tool. That is how
the break in ae63ce5 shipped even though a test suite existed, and why the suite could
not have caught the mafToBigMafSummary divergence either.
New inputs in both tests directories cover an ordinary db.chrom, a species name with a
dotted chrom, both GenArk accession forms, a GenArk accession with no chrom after the
version, a pipe with a dotted chrom, a name with no separator, a reference assembly
whose own name contains a dot, and a name where the reference db is a strict prefix of
another assembly. Every rule in the splitter is now load-bearing: breaking any one of
them fails a target.
Also adds mafToBigMafSummary to TEST_DIRS in hg/utils, since nothing above the directory
was running its suite, and adds a short note to both usage messages describing how a
sequence name is split into assembly and sequence.
- src/hg/utils/mafToBigMafSummary/tests/input/testGenArkRef.maf
- lines changed 7, context: html, text, full: html, text
a8b15f82bbcff0d7953bae0da7df49363939f85a Wed Aug 5 16:59:54 2026 -0700
Add tests for every maf sequence-name form, and describe the splitting in the usage messages. refs #37928
The existing testDot and testPipe inputs are identical copies of each other and both use
pipe-form query names, so the dot path was never exercised in either tool. That is how
the break in ae63ce5 shipped even though a test suite existed, and why the suite could
not have caught the mafToBigMafSummary divergence either.
New inputs in both tests directories cover an ordinary db.chrom, a species name with a
dotted chrom, both GenArk accession forms, a GenArk accession with no chrom after the
version, a pipe with a dotted chrom, a name with no separator, a reference assembly
whose own name contains a dot, and a name where the reference db is a strict prefix of
another assembly. Every rule in the splitter is now load-bearing: breaking any one of
them fails a target.
Also adds mafToBigMafSummary to TEST_DIRS in hg/utils, since nothing above the directory
was running its suite, and adds a short note to both usage messages describing how a
sequence name is split into assembly and sequence.
- src/hg/utils/mafToBigMafSummary/tests/input/testNameForms.maf
- lines changed 12, context: html, text, full: html, text
a8b15f82bbcff0d7953bae0da7df49363939f85a Wed Aug 5 16:59:54 2026 -0700
Add tests for every maf sequence-name form, and describe the splitting in the usage messages. refs #37928
The existing testDot and testPipe inputs are identical copies of each other and both use
pipe-form query names, so the dot path was never exercised in either tool. That is how
the break in ae63ce5 shipped even though a test suite existed, and why the suite could
not have caught the mafToBigMafSummary divergence either.
New inputs in both tests directories cover an ordinary db.chrom, a species name with a
dotted chrom, both GenArk accession forms, a GenArk accession with no chrom after the
version, a pipe with a dotted chrom, a name with no separator, a reference assembly
whose own name contains a dot, and a name where the reference db is a strict prefix of
another assembly. Every rule in the splitter is now load-bearing: breaking any one of
them fails a target.
Also adds mafToBigMafSummary to TEST_DIRS in hg/utils, since nothing above the directory
was running its suite, and adds a short note to both usage messages describing how a
sequence name is split into assembly and sequence.
- src/hg/utils/mafToBigMafSummary/tests/makefile
- lines changed 18, context: html, text, full: html, text
a8b15f82bbcff0d7953bae0da7df49363939f85a Wed Aug 5 16:59:54 2026 -0700
Add tests for every maf sequence-name form, and describe the splitting in the usage messages. refs #37928
The existing testDot and testPipe inputs are identical copies of each other and both use
pipe-form query names, so the dot path was never exercised in either tool. That is how
the break in ae63ce5 shipped even though a test suite existed, and why the suite could
not have caught the mafToBigMafSummary divergence either.
New inputs in both tests directories cover an ordinary db.chrom, a species name with a
dotted chrom, both GenArk accession forms, a GenArk accession with no chrom after the
version, a pipe with a dotted chrom, a name with no separator, a reference assembly
whose own name contains a dot, and a name where the reference db is a strict prefix of
another assembly. Every rule in the splitter is now load-bearing: breaking any one of
them fails a target.
Also adds mafToBigMafSummary to TEST_DIRS in hg/utils, since nothing above the directory
was running its suite, and adds a short note to both usage messages describing how a
sequence name is split into assembly and sequence.
- src/hg/utils/makefile
- lines changed 1, context: html, text, full: html, text
a8b15f82bbcff0d7953bae0da7df49363939f85a Wed Aug 5 16:59:54 2026 -0700
Add tests for every maf sequence-name form, and describe the splitting in the usage messages. refs #37928
The existing testDot and testPipe inputs are identical copies of each other and both use
pipe-form query names, so the dot path was never exercised in either tool. That is how
the break in ae63ce5 shipped even though a test suite existed, and why the suite could
not have caught the mafToBigMafSummary divergence either.
New inputs in both tests directories cover an ordinary db.chrom, a species name with a
dotted chrom, both GenArk accession forms, a GenArk accession with no chrom after the
version, a pipe with a dotted chrom, a name with no separator, a reference assembly
whose own name contains a dot, and a name where the reference db is a strict prefix of
another assembly. Every rule in the splitter is now load-bearing: breaking any one of
them fails a target.
Also adds mafToBigMafSummary to TEST_DIRS in hg/utils, since nothing above the directory
was running its suite, and adds a short note to both usage messages describing how a
sequence name is split into assembly and sequence.
- src/hg/utils/otto/g2p/doG2p.py
- lines changed 42, context: html, text, full: html, text
aa3bab94fb50013ebdf152f761359925fc88b674 Tue Aug 4 14:53:24 2026 -0700
G2P otto: code-review fixes (logging, mixedCase names, itemRgb)
- Log a per-value count when a confidence value is unrecognized and colored black.
- Log a per-assembly count of G2P records with no HGNC coordinate match.
- Unify function names to mixedCase (confidenceToColor, loadG2p, loadCoordinates,
joinAndWrite).
- Rename itemRGB to itemRgb in g2p.as for consistency with the rest of the tree.
refs #36736
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- src/hg/utils/otto/g2p/g2p.as
- lines changed 1, context: html, text, full: html, text
aa3bab94fb50013ebdf152f761359925fc88b674 Tue Aug 4 14:53:24 2026 -0700
G2P otto: code-review fixes (logging, mixedCase names, itemRgb)
- Log a per-value count when a confidence value is unrecognized and colored black.
- Log a per-assembly count of G2P records with no HGNC coordinate match.
- Unify function names to mixedCase (confidenceToColor, loadG2p, loadCoordinates,
joinAndWrite).
- Rename itemRGB to itemRgb in g2p.as for consistency with the rest of the tree.
refs #36736
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- src/hg/utils/otto/userRequests/ottoRequest.py
- lines changed 50, context: html, text, full: html, text
0cfb3c37fdb1de8873336f9d6f95b3422a465964 Sun Aug 9 10:45:26 2026 -0700
in the case of an equivalent available browser for a user browser build request, alert the user to the existence of the equivalent refs #31811
- src/hg/utils/otto/vcepVersions/checkVcepVersions.py
- lines changed 15, context: html, text, full: html, text
c2087cb0ed189d946439a090d43d2dba5d71a9eb Wed Aug 5 17:28:22 2026 -0700
Fix error containment and a wasted retry sleep in the VCEP version notifier per CR feedback. refs #37795
ClinGen's version field is a free-form string, so an unparseable value raised
ValueError past the per-VCEP except RuntimeError in checkVcep. That aborted the
whole run, skipping the remaining VCEPs and mailing a traceback instead of the
report. normalizeVersion now reports the offending string as a RuntimeError, and
the version comparison moved inside the try so it is caught, keeping the damage
to a single failure line.
fetchUrl also slept 30 seconds after its final failed attempt, which could not
help. It now only sleeps between attempts.
- src/hg/utils/urlCommandCatalog/urlCommandCatalog.py
- lines changed 71, context: html, text, full: html, text
61d7da07a793fe0395aadfe566c0d0c3e70762f3 Sat Aug 8 09:04:24 2026 -0700
urlCommandCatalog: describe the hgLogin and BLAT share parameters, refs #37923
The social-login, email-link and BLAT share-link work added 24 names the
registry had not seen. Ten of them are read with cgiUsualString or
cgiOptionalString and so are genuine URL parameters: provider, code, state,
error and error_description on the provider's redirect back to hgLogin,
newEmail, exp and sig on a signed change-of-email link, and blatPslId and
blatFaId on a stable BLAT share link. Those get rows.
The other fourteen are read only from the cart: the oauth_pending_ family,
oauth_state, and the hgLogin form fields. They go in the baseline.
Four of the ten are leaks. blatPslId and blatFaId are not in hgBlat's
excludeVars, which still lists only the older u and s share parameters, and
error and error_description are not in hgLogin's. Marked as such; the fix
belongs with whoever owns the leak list.
- src/hg/utils/urlCommandCatalog/urlNamesNotCataloged.txt
- lines changed 14, context: html, text, full: html, text
61d7da07a793fe0395aadfe566c0d0c3e70762f3 Sat Aug 8 09:04:24 2026 -0700
urlCommandCatalog: describe the hgLogin and BLAT share parameters, refs #37923
The social-login, email-link and BLAT share-link work added 24 names the
registry had not seen. Ten of them are read with cgiUsualString or
cgiOptionalString and so are genuine URL parameters: provider, code, state,
error and error_description on the provider's redirect back to hgLogin,
newEmail, exp and sig on a signed change-of-email link, and blatPslId and
blatFaId on a stable BLAT share link. Those get rows.
The other fourteen are read only from the cart: the oauth_pending_ family,
oauth_state, and the hgLogin form fields. They go in the baseline.
Four of the ten are leaks. blatPslId and blatFaId are not in hgBlat's
excludeVars, which still lists only the older u and s share parameters, and
error and error_description are not in hgLogin's. Marked as such; the fix
belongs with whoever owns the leak list.
- src/inc/https.h
- lines changed 6, context: html, text, full: html, text
e81efb1074d9786436ed8cdb626fc3bdeb6ac14c Thu Aug 6 09:20:30 2026 -0700
hgLogin: fix the social-login/email-link code review issues from #38008
#Preview2 week - bugs introduced now will need a build patch to fix
Brian, thanks for the thorough review - every one of these was real. Here is what
I changed for the six items that stayed on the ticket (the pre-existing XSS and the
site-wide httpsCertCheck default went to #38011 and #38012).
1. Reflected XSS in the account chooser and the other new pages. Every address and
username now goes through htmlEncode() before it lands in the HTML or an attribute
(chooseAccountPage, completeAccountPage, emailLinkPage, changeEmailPage and the
confirmation pages). I also gated the email-link side of the chooser on
emailLinkEnabled(), so your chooseAccount + emailLogin_email=<img ...> URL now
renders the tag as text and does nothing at all where the feature is off.
2. Registering someone else's address to steal their social login. The two OAuth
email-match queries (resolveIdentity and chooseAccount) now require
accountActivated='Y', so an unactivated row someone planted with a victim's address
can no longer be matched or linked. completeAccount only marks the new account
activated when the provider actually verified the address and the user kept it;
otherwise it creates the account inactive and sends the usual confirmation mail, so
an unverified address can never be planted as a trusted one.
3. OAuth requests not enforcing the server certificate. Rather than poke the env var,
I added a small library knob, httpsSetCertCheck() in lib/https.c, that pins the
cert-check mode for the rest of the process and is not overwritten by openSslInit()
or hg.conf. hgLogin's httpRequest() calls it with "abort", so those requests refuse
a bad certificate no matter how the site is configured, and it no longer depends on
being the first HTTPS connection.
4. The pending-identity signature. It now also covers the hguid (which survives the
provider redirect, unlike the hgsid) and the time it was minted, with a 15-minute
expiry, and it is cleared on the failure paths too. A signature that leaks into a
saved or shared session is now useless to another browser and dies quickly anyway.
5. changeEmail. It now asks for the current password where the account has one, and it
no longer changes the address on the spot - it emails a one-time signed confirmation
link to the new address and only applies the change when that link is opened. When the
change lands it also mails the OLD address to say the account's email was changed and
who to contact if that wasn't them, so a hijack gets noticed. One honest caveat: an
account with no password (social-only) still can't be re-checked before the change, so
a stolen cookie could still start it - but the old-address alert now gives the owner a
way to catch it. Expiring login cookies is the deeper fix and feels like its own ticket.
6. isalnum() on a signed char in suggestUsername - now cast to unsigned char.
Build is clean, no new warnings. Set back to you for another look.
refs #38008
- src/inc/maf.h
- lines changed 29, context: html, text, full: html, text
2070aedea88da26aee0af3e2fd867b67140b09b5 Wed Aug 5 16:59:19 2026 -0700
Move the maf sequence-name splitter into jkweb so both summary tools share one copy. refs #37928
mafSplitSrcGetChrom existed as two independent copies, in hgLoadMafSummary.c and
mafToBigMafSummary.c, and they had diverged: only the first had the GenArk accession
rule added by 2db6bab8db0. It now lives in src/lib/maf.c, with the rules documented
in maf.h.
mafToBigMafSummary therefore picks up the GenArk rule it was missing, so a dotted
GenArk name like GCA_009914755.4.CM034974.1 now keeps its accession version instead of
dropping it, which matches what hprc90waySummary already holds.
Also removes mafCompGetSrcDb and mafCompGetSrcName from maf.c and maf.h. Both were
first-dot splitters with no callers anywhere in the tree.
- src/lib/hmac.c
- lines changed 4, context: html, text, full: html, text
690cc018255362c9d1af6ed5f4fa15ae7a0fc81d Wed Aug 5 11:26:22 2026 -0700
changes after automated code review
hgLogin: sign the pending social identity with hmacMd5() instead of a hand-built
cookieSalt-prefix + MD5. The salt now keys the HMAC rather than being prepended to
the hashed message. This is the signature that closes the account-takeover hole in
the OAuth account chooser, so it should use a real MAC. It also now fails closed:
with login.cookieSalt unset the old code hashed an empty salt, so anyone could
compute a valid signature and the protection was silently absent - hgLogin refuses
to run a social login without the salt. Ordinary login pages never reach this check.
Pending identities in flight across the upgrade no longer validate; those users are
asked to sign in again.
lib/hmac.c: hmacSha1() and hmacMd5() sized their hex buffers at exactly 40 and 32
chars, so the last sprintf wrote its terminating zero one byte past the array and
the following strlen read out of bounds. Grow both by one and use cloneString().
Output is unchanged, verified against openssl dgst -hmac.
userAccounts.css: drop the #helpBox rule, unused since the last id="helpBox" was
removed from hgLogin.c.
mirrorManual, ex.hg.conf: the login section claimed "three" extra ways to sign in
when there are two (external provider, one-time email link). Also document that
login.cookieSalt is required for social sign-in, now that the check fails closed.
Edited mirrorManual.txt and regenerated the html with mirrorDocs/make, since the
html is pandoc output and hand edits there do not survive.
refs #37984
- src/lib/https.c
- lines changed 16, context: html, text, full: html, text
e81efb1074d9786436ed8cdb626fc3bdeb6ac14c Thu Aug 6 09:20:30 2026 -0700
hgLogin: fix the social-login/email-link code review issues from #38008
#Preview2 week - bugs introduced now will need a build patch to fix
Brian, thanks for the thorough review - every one of these was real. Here is what
I changed for the six items that stayed on the ticket (the pre-existing XSS and the
site-wide httpsCertCheck default went to #38011 and #38012).
1. Reflected XSS in the account chooser and the other new pages. Every address and
username now goes through htmlEncode() before it lands in the HTML or an attribute
(chooseAccountPage, completeAccountPage, emailLinkPage, changeEmailPage and the
confirmation pages). I also gated the email-link side of the chooser on
emailLinkEnabled(), so your chooseAccount + emailLogin_email=<img ...> URL now
renders the tag as text and does nothing at all where the feature is off.
2. Registering someone else's address to steal their social login. The two OAuth
email-match queries (resolveIdentity and chooseAccount) now require
accountActivated='Y', so an unactivated row someone planted with a victim's address
can no longer be matched or linked. completeAccount only marks the new account
activated when the provider actually verified the address and the user kept it;
otherwise it creates the account inactive and sends the usual confirmation mail, so
an unverified address can never be planted as a trusted one.
3. OAuth requests not enforcing the server certificate. Rather than poke the env var,
I added a small library knob, httpsSetCertCheck() in lib/https.c, that pins the
cert-check mode for the rest of the process and is not overwritten by openSslInit()
or hg.conf. hgLogin's httpRequest() calls it with "abort", so those requests refuse
a bad certificate no matter how the site is configured, and it no longer depends on
being the first HTTPS connection.
4. The pending-identity signature. It now also covers the hguid (which survives the
provider redirect, unlike the hgsid) and the time it was minted, with a 15-minute
expiry, and it is cleared on the failure paths too. A signature that leaks into a
saved or shared session is now useless to another browser and dies quickly anyway.
5. changeEmail. It now asks for the current password where the account has one, and it
no longer changes the address on the spot - it emails a one-time signed confirmation
link to the new address and only applies the change when that link is opened. When the
change lands it also mails the OLD address to say the account's email was changed and
who to contact if that wasn't them, so a hijack gets noticed. One honest caveat: an
account with no password (social-only) still can't be re-checked before the change, so
a stolen cookie could still start it - but the old-address alert now gives the owner a
way to catch it. Expiring login cookies is the deeper fix and feels like its own ticket.
6. isalnum() on a signed char in suggestUsername - now cast to unsigned char.
Build is clean, no new warnings. Set back to you for another look.
refs #38008
- src/lib/maf.c
- lines changed 45, context: html, text, full: html, text
2070aedea88da26aee0af3e2fd867b67140b09b5 Wed Aug 5 16:59:19 2026 -0700
Move the maf sequence-name splitter into jkweb so both summary tools share one copy. refs #37928
mafSplitSrcGetChrom existed as two independent copies, in hgLoadMafSummary.c and
mafToBigMafSummary.c, and they had diverged: only the first had the GenArk accession
rule added by 2db6bab8db0. It now lives in src/lib/maf.c, with the rules documented
in maf.h.
mafToBigMafSummary therefore picks up the GenArk rule it was missing, so a dotted
GenArk name like GCA_009914755.4.CM034974.1 now keeps its accession version instead of
dropping it, which matches what hprc90waySummary already holds.
Also removes mafCompGetSrcDb and mafCompGetSrcName from maf.c and maf.h. Both were
first-dot splitters with no callers anywhere in the tree.
- src/lib/twoBit.c
- lines changed 1, context: html, text, full: html, text
b947e46494d0e52103ffff3b21e174d100f6ffa5 Sat Aug 8 06:56:19 2026 -0700
fix leak in twoBitFree() as found by claude no redmine
- src/product/ex.hg.conf
- lines changed 12, context: html, text, full: html, text
98ac3822afa0712f1897d17e5b7934c4aa742f57 Tue Aug 4 17:11:00 2026 -0700
hgConfCatalog: report only the gates that changed this release, and settle the gate/knob calls, refs #37925
Groundwork for running the sunset report from the weekly build's wrap-up.
--sunset prints the whole standing list every run, which reads as a worklist
the first week and as wallpaper by the third. New --sunset-new reports only
the gates that went overdue or stalled since hgConfGateBacklog.txt was last
accepted, plus the ones that were cleaned up, and exits 1 when there is
something new, the same contract --reconcile already has. --update-baseline
accepts the current state, so the file's diff becomes the release-to-release
history of the backlog. Gates already in the backlog are marked in --sunset
too, so an unmarked row there is one this release created.
Settled all eleven gate-or-knob calls that were filed debatable, each by
reading the call site. forceTwoBit, freeType, sleepOn429 and trustTrackDb
become knobs: what their off position describes is where a machine keeps its
sequence, whether it has the URW fonts, whether it wants to hold a process
after a 429, and whether its trackDb can be trusted. Three of those were on
the overdue list, so the report was telling somebody to delete flags that
should stay. autoBlatBigPsl becomes a gate: its default is the file-scope
autoBigPsl, initialised FALSE under the comment "DEFAULT VALUE change to TRUE
in future", and a flag whose own source says to flip it later is not a
permanent switch. alwaysItemRgb and blatNewPageBanner stay gates, and
hgHubConnect.validateHub stays a gate with its note corrected: it gates the
Hub Development tab, not validation on attach. Overdue is 18 down to 15.
Added a fourth reconcile question: does each flag's hand-written default still
match the tree's. That field is the one part of a gate's lifecycle not read
out of git, and gate_lifecycle decides a gate has shipped from it alone, so a
flag flipped TRUE in code without the row updated sat in the stalled list
under a heading telling somebody to turn on a flag that was already on. Zero
mismatches today. A flag read with both TRUE and FALSE as its compiled-in
default is reported under --verbose rather than counted as a problem, since
the fix belongs to whoever owns the code: multiRegionButtonTop is read TRUE at
hgTracks.c:9126 and FALSE at config.c:990, so on a default install the button
is in the top bar while the checkbox the same flag guards is hidden.
The age cache is overridable with --cache or HGCONF_AGE_CACHE, and
hgConfCatalog.py takes --refresh, so an automated run can rebuild it without
writing into a git checkout. Refreshed the committed cache, which dates
blatNewPageBanner and showLiftRequest: both were added after it was last
built, which is why they read as undatable. Documented forceTwoBit and
freeType in ex.hg.conf, since calling them mirror knobs and leaving them
undiscoverable is the same mistake in the other direction.
- lines changed 3, context: html, text, full: html, text
690cc018255362c9d1af6ed5f4fa15ae7a0fc81d Wed Aug 5 11:26:22 2026 -0700
changes after automated code review
hgLogin: sign the pending social identity with hmacMd5() instead of a hand-built
cookieSalt-prefix + MD5. The salt now keys the HMAC rather than being prepended to
the hashed message. This is the signature that closes the account-takeover hole in
the OAuth account chooser, so it should use a real MAC. It also now fails closed:
with login.cookieSalt unset the old code hashed an empty salt, so anyone could
compute a valid signature and the protection was silently absent - hgLogin refuses
to run a social login without the salt. Ordinary login pages never reach this check.
Pending identities in flight across the upgrade no longer validate; those users are
asked to sign in again.
lib/hmac.c: hmacSha1() and hmacMd5() sized their hex buffers at exactly 40 and 32
chars, so the last sprintf wrote its terminating zero one byte past the array and
the following strlen read out of bounds. Grow both by one and use cloneString().
Output is unchanged, verified against openssl dgst -hmac.
userAccounts.css: drop the #helpBox rule, unused since the last id="helpBox" was
removed from hgLogin.c.
mirrorManual, ex.hg.conf: the login section claimed "three" extra ways to sign in
when there are two (external provider, one-time email link). Also document that
login.cookieSalt is required for social sign-in, now that the check fails closed.
Edited mirrorManual.txt and regenerated the html with mirrorDocs/make, since the
html is pandoc output and hand edits there do not survive.
refs #37984
- lines changed 10, context: html, text, full: html, text
81d7cff6cb6665feb772b1339b6298273a3c49be Thu Aug 6 08:24:38 2026 -0700
hgBlat new results page: table redesign, rename modal, share link, and an XSS fix
Iterates on the new hgBlat "table" results page (rendered by hg/js/hgBlat.js from
JSON emitted by hgBlat.c) per feedback on #37893:
- Columns: "Open in Genome Browser" (position link + new-tab icon), "Show"
(base alignment), Query coverage moved before Locus, score-scaled bar in the
Score column, Identity as plain %, comma-formatted Span. Locus is plain text,
clipped with a CSS ellipsis (full value in title).
- Tooltips on every action link and every column header (via the existing
convertTitleTagsToMouseovers mechanism).
- "Rename BLAT Track": a real modal dialog (replaces the old inline toggle form),
reusing the existing hgc buildBigPsl call via a new window.blatRenameCt() helper;
it no longer depends on a generic page-global. New cfg fields canRename /
trackName / trackDescription drive it.
- "Share a link": trash-backed stable URL toggle, with a share-nodes icon.
- Security: cgiEncode the query name in the htcUserAli detailsUrl (its sibling
already did), and htmlEncode every URL before it goes into an href in hgBlat.js,
so a crafted query/sequence name can't break out of the attribute (XSS).
- Shared htmlEncode() moved into hg/js/utils.js for reuse instead of a per-file
escaper.
- hg.conf: blatNewPageBanner (invite banner, default off), blatOldTracks
(keep/hide/delete previous BLAT tracks at creation) documented in ex.hg.conf;
hgc.c tags BLAT tracks with blatResult=on and clears prior ones per blatOldTracks.
refs #37893
- src/product/mirrorManual.txt
- lines changed 8, context: html, text, full: html, text
c465f5ce00f640497ff3f0b607552d7701bfa758 Tue Aug 4 06:44:15 2026 -0700
hgLogin: show provider OAuth errors on the login page instead of falling through to the signup page; trim whitespace in oauth config values and log OIDC discovery failures; document CILogon/LS-AAI issuer URLs in mirrorManual. refs #37984
- lines changed 6, context: html, text, full: html, text
690cc018255362c9d1af6ed5f4fa15ae7a0fc81d Wed Aug 5 11:26:22 2026 -0700
changes after automated code review
hgLogin: sign the pending social identity with hmacMd5() instead of a hand-built
cookieSalt-prefix + MD5. The salt now keys the HMAC rather than being prepended to
the hashed message. This is the signature that closes the account-takeover hole in
the OAuth account chooser, so it should use a real MAC. It also now fails closed:
with login.cookieSalt unset the old code hashed an empty salt, so anyone could
compute a valid signature and the protection was silently absent - hgLogin refuses
to run a social login without the salt. Ordinary login pages never reach this check.
Pending identities in flight across the upgrade no longer validate; those users are
asked to sign in again.
lib/hmac.c: hmacSha1() and hmacMd5() sized their hex buffers at exactly 40 and 32
chars, so the last sprintf wrote its terminating zero one byte past the array and
the following strlen read out of bounds. Grow both by one and use cloneString().
Output is unchanged, verified against openssl dgst -hmac.
userAccounts.css: drop the #helpBox rule, unused since the last id="helpBox" was
removed from hgLogin.c.
mirrorManual, ex.hg.conf: the login section claimed "three" extra ways to sign in
when there are two (external provider, one-time email link). Also document that
login.cookieSalt is required for social sign-in, now that the check fails closed.
Edited mirrorManual.txt and regenerated the html with mirrorDocs/make, since the
html is pandoc output and hand edits there do not survive.
refs #37984
- lines changed 11, context: html, text, full: html, text
dc2ff84f13d687001a9ac35324bff11f3f5835e7 Thu Aug 6 08:32:55 2026 -0700
updating mirror docs, no redmine
- src/utils/codeReviewAi.py
- lines changed 973, context: html, text, full: html, text
1795df5f669cdeb63144810c141ac41128e93111 Wed Aug 5 10:16:41 2026 -0700
Split the daily code review per commit when a batch times out, and stop dropping FEEDBACK reviews. refs #38020
A batch that ran out of time was retried on the same budget, so it failed the same
way and the whole author's review was lost with no second window. Now the timeout
scales with the batch, a timeout gets one retry at a larger budget instead of a
repeat of the one that just failed, and a batch that still times out is reviewed
one commit at a time and stitched into a single email. Commits the split cannot
reach are named in the digest as unreviewed rather than going missing. The
per-ticket code review path, which was still on a flat 600s, gets the same scaling.
Separately, and the more serious of the two: the decision to email an author was an
exact case-sensitive match on the digest's status line, so a status written as
"Overall Status: FEEDBACK" or with markdown around it was recorded as approved,
never emailed and never flagged. That decision now reads every status line, sends if
any says FEEDBACK, sends when the status cannot be read, and keeps the old exact
match as a backstop, so it can only ever send more mail than before and never less.
Per-commit verdicts get the same treatment.
Diagnostics, because a failed review used to leave nothing to look at: every review
logs its duration alongside commits, files, lines and binary-file count so the real
cost predictor can be identified from data rather than guessed; discarded review text
is logged with a count and preview; and failed reviews keep their working files
instead of having them swept. Capturing the partial output of a timed-out run was
tried and does not work - the CLI buffers and emits nothing before it is killed - so
there is a note on the stream-json approach that would.
Also: the maintainer alert distinguishes broken, incomplete and never-started runs
instead of blaming an expired login for all three; an email that fails to send now
reaches the maintainer rather than the log; the run has an overall deadline so a bad
night cannot still be going when the next cron fires; and the prompts tell the model
not to read images, which is the likely cause of the one-commit timeout that started
this.
- src/utils/qa/mlqAutomate.py
- lines changed 17, context: html, text, full: html, text
dc609c19cedefea37e57795682d5ff34332fabc8 Wed Aug 5 11:27:25 2026 -0700
Fix mlqAutomate 403 insufficientPermissions by forcing a token refresh when the shared gmail token records fewer scopes than required. No RM.
- src/utils/qa/trackCountsParse
- lines changed 26, context: html, text, full: html, text
5c6366432eadc33cfdc7c48c1308bce156479905 Wed Aug 5 17:24:23 2026 -0700
Harden error handling in trackCountsParse per CR feedback. refs #37975
The report pipeline had no pipefail, so it reported awk's exit status rather than
makeUsageReport's. awk is happy with truncated input, so a report that died partway
through produced a non-empty partial count file with a success status, and the v2
cache then reused that partial file on every later run. The empty-file check only
caught a total failure. Adds pipefail, and removes the partial file when the command
fails so a failed run cannot leave something behind for the cache to pick up.
The mergeStderr=False path added in the last commit dropped stderr from the error
message, since CalledProcessError reports stdout in e.output. That is the one call
site using the flag, the bulk tdbQuery, so a failure there lost its reason entirely.
The RuntimeError now carries stderr too.
Also aborts when tdbQuery returns no trackDb entries at all. tdbQuery exits 0 and
prints nothing for a database it does not know, so a mistyped db name used to run to
completion treating every track as notInTrackDb before failing with a message that
blamed the usage logs. Pins the subshell to bash, which pipefail needs and which the
existing sort -t $'\t' already quietly relied on.
- src/utils/qa/weeklybld/autoBuild.sh
- lines changed 15, context: html, text, full: html, text
9ea569dd7b6b5f189bd5bec3cebc37ab95cb88fb Wed Aug 5 10:55:33 2026 -0700
autoBuild.sh: note that something else writes to the build tree now, refs #37925
nightlyRegister.sh runs from the build account's crontab and commits and pushes
hgConfCatalog.py out of $BUILDHOME/kent, so "hgConfCatalog: register ..."
commits appearing on master with nobody behind them are expected rather than a
stray edit somebody left in the tree.
The note sits at ensure_clean_git() rather than in the header because that is
the function whose failure would be puzzling: it aborts the whole build on any
uncommitted change in that tree. The writer is built not to trip it, acting
only when HEAD is master (cherryPickCommits.csh and tagBeta.csh both check out
release branches in there), restoring the file on any exit that did not commit,
and standing aside entirely while the lockfile is held. The note says what to
do in the one case where it does trip: the script died between writing and
committing, git checkout is the whole fix, and the next run redoes the work.
Also written up on the CGI_Build_Process wiki page, under "The build tree has a
second writer".
- lines changed: 8633
- files changed: 203