Skip to content

Release 1.1.0: hypeR-native client, searchExternal(), LINCS script writer - #274

Merged
Cvicnaire merged 85 commits into
masterfrom
dev
Oct 14, 2026
Merged

Cvicnaire merged 85 commits into
masterfrom
dev

Conversation

@Cvicnaire

Copy link
Copy Markdown
Collaborator

Release 1.1.0: dev -> master. Checklist copied from #267 (state as of opening; it is kept current there). Pairs with montilab/SigRepo_Server release PR; both merge in the same window and production rebuilds once afterwards. #273 (DESCRIPTION 1.1.0) is still to merge into dev and will appear here when it does.


Release checklist for the next dev -> master pull request. One line per merged pull request, with what to exercise on staging and what a correct result looks like. Tick a box only after doing it. Paired with montilab/SigRepo_Server release issue montilab/SigRepo_Server#154 (the server one): the two release pull requests merge in the same window, and production rebuilds its image once, after both are in.

Why both repositories, and in which order

  • Client dev changes runHypeR() so organism and test are required and method, msigdb_species and split_by_direction are gone (hypeR-native annotation client, plotting and annotation tutorial #223). The production server's MCP run_enrichment tool still calls the old signature (mcp/lib/queries.R on server master). Releasing the client alone and rebuilding the production image would break that tool. Server dev withdrew the tool (SigRepo_Server#139), so the server release must land no later than the client release.
  • Server dev rebuilt the Shiny Annotate and Home tabs on the new client (SigRepo_Server#148, package touch ups #153). They call getHypeRGenesets(), hypeRToExcel(), plotHypeRDots(), plotHypeREnrichment(), hypeRDotData(), hypeREnrichmentData() and hypeRSignatureKey(), none of which exist on client master. Releasing the server alone would break staging's Annotate tab the moment production rebuilt. So the client release must land no later than the server release.
  • Everything else on client dev is client-only: it reaches users through install_github() and the server does not call it.

Net: merge both release pull requests, then rebuild montilab/sigrepo:latest once. The Dockerfile clones client master at build time, so the rebuild must come after the client merge.

Before anything can be tested on staging

Coupled with the server release (test on staging, which runs the dev image)

  • hypeR-native annotation client, plotting and annotation tutorial #223 hypeR-native annotation client. In the staging Shiny Annotate tab, run LLFS_Aging_Gene_2023 against MSigDB Hallmarks with hypergeometric, kstest and fgsea. Each produces a table and plots; the Excel export opens. From R against the staging database: runHypeR(conn_handler = conn, signature_name = "LLFS_Aging_Gene_2023", organism = "Homo sapiens", test = "fgsea", genesets = "msigdb") returns a hyp object with no error. Calling it without organism errors with a message that names the argument.
  • connect-sigrepo-mcp skill: stop listing run_enrichment among the MCP tools #251 connect-sigrepo-mcp skill no longer lists run_enrichment. Staging MCP tool list (mcp/) has no run_enrichment; the skill text matches.

Client-only (test from an R session with remotes::install_github("montilab/SigRepo@dev"))

Process and CI (no user-visible behaviour; confirm they still work after the release)

Release steps

  • Bump Version in DESCRIPTION to 1.1.0 (the runHypeR() interface change is breaking; decide whether that warrants 2.0.0 instead and note the decision here).
  • Rename the # SigRepo (development version) header in NEWS.md to # SigRepo 1.1.0 and check every merged PR since 1.0.0 has a bullet or a no-changelog label.
  • Open the release PR dev -> master with this checklist copied into the body. No Closes lines.
  • Merge the client release PR and the server release PR (SigRepo_Server#154) in the same window; the server one may go first or second but production must not rebuild between them.
  • Trigger the production image rebuild once both are merged (the :latest build clones client master and OmicSignature main; this is also what finally ships OmicSignature 1.4.1 to production).
  • Tag v1.1.0 on master.
  • Merge master back into dev the same day (CONTRIBUTING rule).
  • Close idea Connect to CORESH #82 with a pointer to Add searchExternal(): query Rummagene, RummaGEO and CORESH from a SigRepo signature #266 and this release.
  • Update https://montilab.github.io/SigRepo/ (pkgdown runs on master).

Out of this release

  • Nothing on dev is excluded. If a line above cannot be ticked, open a bug with what was run, what happened and the error, link it here, and label this issue blocked until it closes.

🤖 Generated with Claude Code

Cvicnaire and others added 30 commits September 14, 2026 14:14
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…species mapping

Removes the old runHypeR/prepareHypeRSignatures implementation ahead of the
hypeR-native rewrite.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…ymbol sources

Regenerated NAMESPACE/man via devtools::document() to export
prepareHypeRSignatures().

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…nance

hypeR's argument names and defaults, per-query "difexp" background, and
unusable signatures skipped with a warning instead of aborting the run.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…o-weight kstest guard

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…ckground

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Replaces the hardcoded connection credentials with placeholders and drops the
superseded review vignette.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…he query, and unrunnable queries no longer abort the batch

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…e, hypeRToExcel and fuller provenance

Fixes from the hypeR capability evaluation (W1-W3, W5-W8, W11, W13-W15):
- direction = up/down/both ranks by the negated score for the low end
- ks_source = "signature" runs kstest on signatures without difexp
- return a hyp only for a single signature that builds one query by
  construction; everything else is a multihyp
- query_names function and hypeRToExcel() with safe sheet names + index
- power = 0 uses hypeR's ranked branch (score and Signature Type match hypeR)
- nine more SigRepo keys in hyp$info (direction, background source, drops...)
- drop hypeR's empty placeholder plots when plotting = FALSE
- gene-vector backgrounds also reduce the hypergeometric query
- resolve each signature's symbols once per call
- tests for hyp_emap, hyp_hmap, hyp_to_graph, hyp_to_table, hyp_to_rmd, rctbl_build
- hypeR (>= 2.0.0) in Suggests

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…and hypeRToExcel

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…e backgrounds

- runHypeR()/prepareHypeRSignatures() take signature = a character vector,
  named numeric vector or named list, as hypeR::hypeR() does, instead of
  SigRepo signatures (W4)
- getHypeRDifexp() returns difexp tables with resolved_symbol for custom
  cutoffs (W4)
- background accepts a named list keyed by signature label or ID, each entry
  a number, gene vector or "difexp"; arms share their signature's entry

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…round lists

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…conventions in runHypeR

- categorical signatures: hypergeometric splits each category by score sign
  (<label> | <group> | up/down); kstest ranks each category's own difexp rows
- kstest skips rankings whose scores are constant or all one sign
- min_query_genes = 4: hypergeometric queries with fewer genes found in the
  genesets are skipped (BS831 hyperEnrichment min.drawsize)
- fdr_scope = "run" (default) adjusts FDR across every query in the call
  (hyperEnrichment mht = TRUE); "query" keeps hypeR's per-query FDR
- background = NULL (default): a complete difexp's genes for hypergeometric,
  23467 without a difexp or, with a warning, when the difexp looks filtered;
  kstest keeps 23467
- SigRepo FDR Scope provenance key

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…eR tutorial and NEWS

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…down hyps

Ports hypeR's fgsea vignette wrapper with hypeR's info keys, a hits column,
seeded runs that restore the caller's RNG, and gene-vector background reduction.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…kings

One ranking per signature (per category for categorical signatures) with the
requested direction in info; direction defaults to "both" for fgsea, is
allowed with native input, and native input must be named numeric.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
… fgsea_args

runHypeR() branches to the fgsea engine after backgrounds are resolved and
shares finishHypeRRun() with the other tests for FDR scope, cutoffs and the
return type. absolute = TRUE, bad seeds and reserved fgsea_args are errors;
fgsea warnings are re-emitted once with an "fgsea: " prefix.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…xygen

Final-review fixes for runHypeR(test = "fgsea") (F1-F5):
- fgseaHypeRTable() no longer errors when fgsea drops every pathway
  (e.g. minSize larger than every geneset, or a background sharing no
  genes with the genesets); it now returns a proper 0-row table.
- runFgseaQueries()/finishHypeRRun() pool run-scope FDR across the up
  and down sides of every ranking regardless of `direction`, instead
  of silently pooling only the requested side(s).
- checkHypeRFgseaArgs() rejects fgsea_args$scoreType (it would change
  the ES-sign split runHypeR() relies on).
- checkHypeRKstestArgs() error text now names fgsea too.
- roxygen for runHypeR()'s background/fdr_scope/quiet and
  prepareHypeRSignatures()'s split/ks_source/score_col now describes
  fgsea; man/*.Rd regenerated via devtools::document().

Rscript -e 'devtools::test(filter = "hypeR_|hypergem", reporter = "check")':
[ FAIL 0 | WARN 1 | SKIP 1 | PASS 495 ] (warning and skip both expected).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…results

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
… each test's own arithmetic and tie rule

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…multihyp

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…) and Venn diagrams (hypergeometric) on demand

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…urning NULL with a warning where hypeR would error

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…hypeR tutorial

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
…top-N ties, map guards, docs)

Addresses the final whole-branch review of the hypeR plotting work:

- I1: hypeREnrichmentData() now reorders fgsea stats the way
  fgsea::plotEnrichmentData() does before computing ticks and the leading
  edge, fixing wrong tick positions/leading-edge genes on unsorted native
  rankings.
- T2-a: documents that fgsea's curve holds fgsea's own step points
  (0..N+1), not one row per ranked gene.
- M1: hypeREnrichmentData() now errors for absolute = TRUE kstest results
  instead of silently reporting the wrong ES.
- M2: hypeRDotData() now gives a named error when size_by = "overlap"/
  "geneset" and that column is missing, instead of an opaque data.frame()
  error.
- M3: hypeRDotData()'s top-N tie-break now falls back to best pval, then
  label name, instead of alphabetical only.
- M4: plotHypeRMap() gets its own @PARAM val/@PARAM top text instead of
  the inherited (inaccurate) hypeRDotData() text.
- M5: the map guard now warns distinctly when fewer than 2 genesets pass
  the cutoffs and top, instead of the misleading "lower similarity_cutoff"
  warning.
- M6: plotHypeRMap() validates pval/fdr like hypeRDotData() does.
- M7: the "not in results after cutoffs" subtitle text (inaccurate for
  fgsea size-filtered genesets) is now "not in the result table".
- M9: emptyHypeRDotData() gets the @nord block used by other internal
  helpers.
- T2-c: adds a hand-derived exact-value test for the kstest running_score
  on the TIE fixture.

M8 (duplicated member-lookup logic) is intentionally left for a later pass.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
- Every plot (dots, enrichment, Venn, map) is titled with the test that was
  run ("Hypergeometric test", "KS test", "GSEA (fgsea)") unless `title` is
  given; the enrichment plot's geneset moves to the subtitle.
- plotHypeRDots() groups several signatures under short codes (S1, S2, ...)
  labelled by group or direction, with the full names in the caption; a
  single signature is named in the subtitle with horizontal group labels
  while they fit. `signature_key = FALSE` restores full query names (no
  wrapping, 45 degrees, left margin grown so labels are not clipped).
  Legends hang from the top so they are not cut off.
- hypeRDotData() adds signature_code and query_group; new export
  hypeRSignatureKey() returns the code-to-name table.
- plotHypeREnrichment()/hypeREnrichmentData() name the whole fgsea ranking
  instead of its up/down side and accept the signature name as `query`
  (the side holding the geneset is used); summary gains `ranking`. kstest
  down queries keep their side (negated ranking).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…ults

Cameron's Annotate feedback: the tutorial and the functions themselves should
say what is mandatory, what is optional, and what NULL means.

- runHypeR(), prepareHypeRSignatures() and getHypeRGenesets() get a 'Required
  and optional arguments' section.
- The hypeR tutorial says it before the conventions table.
- The error for a call with no signatures now names 'signature' too.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Cvicnaire and others added 15 commits October 7, 2026 13:22
Part of #265.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Submit, poll and fetch against the coresh-back JSON endpoints. Part of #265.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Closes #265. Serves #82.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Also keep the .superpowers plan workspace out of the package build. Part of #265.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
… the signature

A failed reference-table or biomaRt lookup used to vanish, so a network
outage surfaced as "0 mapped" with no hint why. The lookups now carry the
error, buildExternalQuery() prints it when verbose and appends it to the
"Could not map enough" error, and the query reports it as lookup_errors.
A direction with no features now says so rather than reporting zero
mappable features. Part of #265.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…() messages

The translation message said "sending the top 500" while the result had 25
rows, which read as a contradiction: 500 is the genes sent as the query,
25 is the hits returned. The translation line now says "the query is ...",
and each source reports "N of M matching hits returned (limit = L)", with
the CORESH results page when there is one. Part of #265.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…e-rummageo-coresh

Add searchExternal(): query Rummagene, RummaGEO and CORESH from a SigRepo signature
Add mergeDifexp() to merge signatures' difexp tables into one matrix
Brings master's rebuilt NEWS.md (the #258 bullet under 1.0.0) into dev.
One conflict in NEWS.md, resolved by keeping both 1.0.0 bullets in the
order NEWS.Rmd already has them.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…the-staging-instance

Ask SigRepo_Server to rebuild the staging image when this package changes
… the missing bullets

NEWS.Rmd is what the render-news-rmd workflow turns into NEWS.md on every
push to master that touches it, and it held only the 1.0.0 section: the
whole development section lived in NEWS.md by hand, so the release merge
would have rendered it away. The section now lives in NEWS.Rmd under
'SigRepo 1.1.0', and NEWS.md is rendered from it with rmarkdown exactly as
the workflow does, so the next render is a no-op.

New bullets: #233 under 1.0.0 (it is live on master), and a Process
section for #235, #237, #239 and #251.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…name-the-development-header-and-add-the-missing-bullets

NEWS for 1.1.0: carry the section in NEWS.Rmd, rename the header, add the missing bullets
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
docs/ is pkgdown's output directory, and build_site_github_pages() refuses
to clean a non-empty docs/ it did not build, which fails the pkgdown check
on the release PR. The spec and plan from #266 now live outside the
repository, with the other planning documents; the .gitignore exception
that let them in goes too.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…lanning-documents-from-docs-so-pkgdown-can-build

Remove the searchExternal planning documents from docs/ so pkgdown can build
@Cvicnaire

Copy link
Copy Markdown
Collaborator Author

Closing and reopening to make GitHub pick up dev's new head (3ae0ecd, the #276 docs fix); the PR did not synchronise on its own.

build_reference_index() fails on the release PR because neither topic is
listed. mergeDifexp joins compareSignatures; searchExternal joins
writeSignatureSearchScript under a section for searching beyond the
repository.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…missing-mergedifexp-and-searchexternal

pkgdown: add mergeDifexp() and searchExternal() to the reference index
@Cvicnaire
Cvicnaire merged commit 6c3b7d2 into master Oct 14, 2026
16 checks passed
@Cvicnaire Cvicnaire mentioned this pull request Oct 14, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant