R12 · UI scenarios: what the new boards need from the specs¶
Round: R12 (2026-10-26). Method: about 50 new or upgraded UI boards were built to cover the nf-core catalogue. The pipelines are representative of the classes in checking-scenarios.md §1, and runs without gates are included.
-
Data: the boards use real data where it exists:
- nf-core megatest outputs (
dev-environment-and-testing.md§10.3); - real test images, read from public OME-Zarr and nf-core/test-datasets (§10.4).
- nf-core megatest outputs (
-
Recording: each board agent recorded every piece of data or behaviour the board needs that no spec or API defines.
- Status: these are findings, not changes. The specs are untouched; triage and
/apply-findingsdecide. - Where the boards are: the canvas and
design/ui-canvas/; the scenario map is ui-spec §10.
Format: README.md. Prefix UX (board agents and the UX review of this round).
Checks and source bindings¶
UX-101 · major · MultiQC bindings do not match real column names¶
- Where: checking-scenarios.md §7 (
multiqc:<module>.<column>). -
Evidence:
- Real general statistics name their columns
module-column. Examples arequalimap_rnaseq-5_3_bias,star-uniquely_mapped_percentandfastqc-1-percent_duplicates(tests/fixtures/megatests/rnaseq/…/multiqc_general_stats.txt, header line). - Plot tables such as
featurecounts_biotype_plotandstrand_check_summary_tableare not in the general statistics at all. - MultiQC ≥ 1.2x nests
report_general_stats_dataas{module: {sample: {metric}}}inmultiqc_data.json(smrnaseq 2.4.1 megatest).
- Real general statistics name their columns
-
Problem: a binding written from the spec finds nothing.
-
Proposal:
- Define
multiqc:<general-stats column>exactly as MultiQC writes it, andmultiqc-table:<table file>#<key>:<column>for the other tables. - Test bindings against
tests/fixtures/megatests/.
- Define
-
Found by: ReviewReport, ReviewSmallRNA, ReviewAmpliseq agents · Status: open
UX-102 · major · The binding vocabulary is too small for real checks¶
- Where: checking-scenarios.md §7.
-
Evidence: the boards had to fall back on
script:for each of these:- derived values: Mt_rRNA share, too-short %, DADA2 kept %, the ratio of two columns (ReviewReport, ReviewAmpliseq, ReviewRepertoire);
- pair-level tables keyed by
sample_a, sample_b(peddy relatedness, ReviewTrio); - long tables to pivot into sample × region (mosdepth amplicons, ReviewViral);
- JSON paths that contain the item key (miRTrace inside
multiqc_data.json); - a metadata TSV kept apart from the samplesheet (ampliseq
Metadata_full.tsv); - a value relative to another run (scrnaseq Cell Ranger against simpleaf);
- reductions of a matrix (mean PAE, proteinfold);
- image metrics (tissue fraction, focus, streaks, hot pixels, background drift: ReviewWells, ReviewSlides, ReviewROIs).
-
Proposal:
- Add
expr:over bound values,pair:,pivot:,metadata:andrelative:bindings. - Add an image-metric check provider.
- Keep
script:as the escape hatch.
- Add
-
Found by: 9 board agents · Status: open
UX-103 · minor · Check states beyond pass / warn / fail¶
- Where: checking-scenarios.md §4.
-
Evidence: the boards needed four more states:
n/a: a channel is missing, or the export is 8-bit (ReviewROIs);- "binding suspect":
fastp-pct_adapteris below 0.1 % while reads shrink from 76 to 25 nt (ReviewSmallRNA); - "computing n of m" (ReviewQueue);
- "muted by the overlay" (ReviewCells).
-
Proposal: define
n/a,suspect,computingandmuted, and how each one counts towards the gate. - Status: open
UX-104 · major · Item roles and the constraint kinds real samplesheets need¶
- Where: checking-scenarios.md §5 and §7 (
constraintshas onlypairandmin_per_group). -
Evidence:
- Roles: an input control (chipseq
controlcolumn); a negative control (taxprofiler blanks, the viralreconCONTROL_01); proband, mother and father derived frompaternal_id/maternal_id/phenotype(raredisease). -
Constraints:
- de novo calling needs both parents;
- clones are built per subject (airrflow
cloneby); - ampliseq keeps a metadata column only if every value occurs at least twice (
bin/metadata_pairwise.r).
-
Grouping: groups derived from a metric, such as read-length batches (smrnaseq).
- Roles: an input control (chipseq
-
Proposal:
items.roleswith role-scoped checks.- Constraint kinds
requires_role,group_completeandpipeline_rule. - A consequence text for each constraint, with its source.
group_byon a derived value.
-
Status: open
UX-105 · major · Sub-items and a sixth view: items × sub-regions¶
- Where: checking-scenarios.md §7 (
children) and §8 (five views). -
Evidence:
- Models under a sequence (proteinfold, 5 ranks each).
- Tiles under a slide.
- Amplicons × samples (viralrecon, 49 × 98), where a column-wise check ("one amplicon drops out in 8 samples → scheme, not samples") is the key finding.
-
Proposal:
- Allow
childrenwith their own checks. - Add a "matrix" view (items × sub-regions heatmap) and a column-scope check.
- Allow
-
Status: open
Decisions¶
UX-106 · major · The meaning of Flag, undecided items and reviewer-added flags¶
- Where: checking-scenarios.md §5, ui-spec.md §4.5.
-
Evidence:
- Flag keeps an item that is below a block threshold when excluding it would break a group (ReviewReport, K562_REP1).
- Some boards keep undecided items by default (ReviewSlides); others disable Apply until a block check is decided (ReviewWells, the G3 streak). The two behaviours were drawn on purpose, so that the spec picks one.
- A reviewer flags wells that no check flagged (ReviewWells: D8, E8, H12).
- Candidates get a three-way accept / reject / flag (ReviewFusions).
-
Proposal:
- Define Flag (who may use it below a block threshold, and that it is recorded).
- Define the default for undecided items under
blockchecks. - Define "added by a reviewer" as a decision source.
-
Status: open
UX-107 · minor · Missing verbs¶
-
Evidence: the boards needed verbs that do not exist yet:
- Resequence: exclude now, then replace the input later (ReviewViral);
- reassign a control (ReviewChip);
- protect a feature from a rule (ReviewContamination, E. coli);
- pin a run-wide parameter that the pipeline estimates from the items (airrflow
clonal_threshold, ReviewRepertoire).
-
Proposal: add the four verbs to §5, with how each reaches the engine (§6).
- Status: open
UX-108 · major · Decisions that the pipeline cannot read¶
- Where: checking-scenarios.md §6.3 and §6.4.
-
Evidence: the parameter lists in
nextflow_schema.json(read 2026-10-26) show no parameter that reads:- a model keep list (proteinfold 2.0.0);
- a cell keep list (scrnaseq 4.2.0);
- a taxa list (taxprofiler 2.0.1);
- a per-tile parameter (mcmicro 2.0.0).
Two further consequences:
- The filter artifact can only go to a linked downstream run, which §6.4 cannot target.
- Excluding an item can move the parameter estimated from the items (airrflow).
-
Proposal:
- §6.4 lets an artifact target a declared parameter of a linked run.
- The UI says "attached only" when nothing reads the artifact.
- Estimated parameters get "pin or reopen" semantics.
-
Status: open
UX-109 · major · Which stages a parameter change reruns, and at what cost¶
- Where: api-and-data-model.md (relaunch), ui-spec.md §4.5 / §4.6.
-
Evidence:
- methylseq
clip_r1reruns from stage 1 (about 15 h, taken from the real trace), whileignore_r1reruns only the extraction (about 1 h 25). - ampliseq gives a rerun cost.
- The spec only has "Apply and continue".
- methylseq
-
Proposal:
- Map each parameter to the processes it reaches, from the process inputs or the overlay.
- Add an "Apply and rerun from stage N" primary action.
- Base cost estimates on per-task history.
-
Status: open
Gates¶
UX-110 · major · Gates that wait for a signal¶
- Where: synthesis.md (gates), api-and-data-model.md (
POST /gates/{id}/signals), checking-scenarios.md §7. -
Evidence: ReviewSignal needs:
decide.systems, a checkkind: signaland asignal:source;- a signal schema: name, payload, validation, the target run or gate, and the service account it is bound to;
- a vocabulary for
timeout,remindandaction; - "approve without the signal" recorded as an override.
-
Status: open
UX-111 · minor · Where each gate comes from, and lab-wide figures¶
- Where: api-and-data-model.md (run and gate resources).
-
Evidence:
- The lists show, for every run, where its gate comes from (lab overlay,
spectio.yml, or none). - They also show where its stages come from (declared, detected, or task quarters).
- The queue shows the worst item, the checks still computing, and whether you may decide or only view.
- The Overview shows runs per item kind, split into gated and not gated (ReviewQueue, RunsTable, Overview).
- The lists show, for every run, where its gate comes from (lab overlay,
-
Proposal: add
gate_source,stage_source,worst_item,can_decideand an aggregates endpoint. - Status: open
UX-112 · minor · Adding a gate at launch¶
- Evidence: LaunchReview offers "+ gate here" between stages.
POST /runsaccepts onlygates: "from-manifest". - Proposal: allow per-run gates when the overlay permits them. Gates stay off by default.
- Status: open
Runs, relaunch, outputs¶
UX-113 · major · Relaunch with resource changes and a dry-run estimate¶
- Where: api-and-data-model.md (
POST /runs/{id}:relaunchtakes parameter overrides only). -
Evidence:
- RunFailed and RelaunchDialog suggest
mem_mb 8000 → 16000(--set-resources) and a Nextflow memory override generated from the failure. - They also show an estimate: reused, rerun, still to run.
- RunFailed and RelaunchDialog suggest
-
Proposal:
- Add
resource_overridesandconfig_overrides. - Give suggestions ids.
- Add
POST /runs/{id}:relaunch?dry_run=true, which runssnakemake -nor the Nextflow cache check through the runner. - Whether a memory change invalidates the Nextflow cache is [to be validated].
- Add
-
Status: open
UX-114 · minor · Comparing runs¶
-
Evidence: RunsCompare needs three things:
- a compare endpoint;
- versioned config overlays in
run_inputs; /runs/{id}/software, plus a link from each cached task to the attempt that computed it (to count "CPU-hours saved").
-
Status: open
UX-115 · minor · Outputs, retention and the depictio hand-off¶
-
Evidence: RunOutputs needs:
- a directory listing with folder sizes, where
GET /runs/{id}/artifactsis flat today; - a per-run retention date and "keep 30 more days";
- a manual depictio trigger and the hand-off status;
- written sandbox rules for HTML reports (CSP, no network).
- a directory listing with folder sizes, where
-
Status: open
UX-116 · minor · Runs launched from the terminal¶
-
Evidence: RunObserved needs:
- the launch host in the Tower payload [to be validated];
- task logs, which may not come through the Tower protocol alone [to be validated];
- an "is this run adoptable" check;
- the rule that groups processes into detected stages;
- the runner start command.
-
Status: open
Launch¶
UX-117 · major · Listing files through the runner¶
- Evidence: LaunchSamplesheet, WorkflowImport (path on a cluster) and RunOutputs all browse folders on the cluster: paging, a glob, and "permission denied" on a folder the user cannot read. Synthesis mentions a "browse a directory" order but gives no shape for it.
- Proposal: a runner order
list_dirwith paging, glob and typed errors, exposed asGET /environments/{id}/files. - Status: open
UX-118 · minor · Building a samplesheet from files¶
- Evidence: pairing R1 and R2, deriving names, and handling rows that share a sample (nf-core/rnaseq concatenates them [to be validated]).
- Status: open
UX-119 · minor · Workflows without a parameter schema, and Git refs¶
- Evidence: LaunchGitNoSchema guesses parameter types from
nextflow.configand needs a list of Git refs reached through a runner credential.GET /workflow-versions/{id}/schemais undefined for a workflow with no schema. - Status: open
UX-120 · major · Batch launches and Spectio's own queue¶
- Evidence: LaunchBatch starts one run per plate. It needs name templates, a concurrency limit and a "queued because of quota / slot" reason, and can hold runs for a storage quota. No batch resource and no reason field exist.
- Status: open
UX-121 · minor · Scheduled start, notifications, pre-flight¶
-
Evidence: LaunchReview needs:
start_at;- notifications per event, where only
notify.webhook_idsexists; - a pre-flight endpoint.
-
Status: open
UX-122 · major · Chaining runs¶
- Evidence: LaunchChain feeds the fetchngs
samplesheet/samplesheet.csvinto nf-core/rnaseq--input, mapping columns and starting on success. The spec has lineage (resume, rerun) but no chaining. - Proposal: a
chainresource on runs: source output, target workflow, column mapping, and a trigger (on success, or ask first). - Status: open
Workflows¶
UX-123 · minor · Overlays, versions and the catalogue¶
-
Evidence:
- Process names of a release that has never run (
nextflow run … -preview[to be validated]). - Module and subworkflow diffs between releases, including renames.
- Saved launch presets are undefined.
- For overlays: a version range, draft / saved states, history, and a dry evaluation against the last run.
- Check presets per assay need a source.
- Stage colours beyond four (ui-spec §3.2 allows 8).
- What happens to processes no stage matches while a gate is open.
- Discovered workflows: a dirty tree, no Git remote, recognising a genuine nf-core release, an Ignored state, and how many runs must agree on a captured default.
- The scope of a Git credential, and whether the server or a runner clones.
- Catalogue fields: lab default, update status, overlay compatibility per release.
- Process names of a release that has never run (
-
Status: open
Environments¶
UX-124 · minor · Connecting and checking a runner¶
- Evidence: EnvConnect shows a registration token valid for 15 min, a runner credential rotated every 24 h and a heartbeat every 30 s. None of these values is in a spec. It also needs a self-check report event and a way to load environment modules into the runner.
- Status: open
UX-125 · minor · Software inventory and pre-pulled images¶
- Evidence: EnvSoftware shows the Apptainer cache with "Clean" actions, and pre-pulls the images of a pipeline release. The list comes from the release's containers (
nextflow inspect[to be validated]). There is no API for either. - Status: open
UX-126 · major · Quotas, limits and who may launch where¶
-
Evidence: EnvAccess shows several things the API does not have:
- concurrent runs per project, and CPU-hour and GPU-hour quotas per month;
- partitions allowed per group;
- per-agent permission to launch on an environment (ui-spec §4.9 promises this);
- what happens when a quota is hit (the run is queued with a reason), and alerts at 80 % and 100 %;
- credential types (registry tokens, S3 keys, Git tokens) with rotation reminders.
Environment grants cover projects and groups only.
-
Status: open
UX-127 · minor · A single machine¶
- Evidence: the rule "memory limit = 80 % of MemAvailable" exists only in the spike note and the test runner. EnvLocal also needs a local queue length (with "queue full"), and a rule for a laptop that goes to sleep.
- Status: open
Imaging¶
UX-128 · major · Thumbnails, crops and the viewer contract¶
-
Evidence:
- Plate maps, tile mosaics and ROI tables show one thumbnail per item, at a chosen pyramid level, read from OME-Zarr or OME-TIFF through the runner (ReviewWells, ReviewSlides, ReviewROIs, ViewerOmeZarr).
- Densities need the pixel size, which idr0076 stores as a unitless 1.0.
- Reviews need per-channel colour and contrast, plus an RGB brightfield mode (idr0073).
- The api names "an OME-Zarr viewer" and nothing more.
-
Proposal: a viewer contract: multiscale metadata, a tile endpoint with range requests, a thumbnail endpoint (level, crop), labels, the omero channel windows as defaults, and v0.4 and v0.5 stores. Test it on the images of dev-environment-and-testing.md §10.4.
- Status: open
Clinical data¶
UX-129 · major · Gates on clinical data¶
-
Evidence: ReviewTrio (raredisease) shows:
- pseudonyms only;
- downloads off;
- every view logged, with an access log on the gate;
- AI agents off by project policy.
checking-scenarios.md §9 says only that "roles apply strictly".
-
Proposal: a "restricted data" project policy covering pseudonymisation, downloads, a per-view audit and agent access. Route it to the security review.
- Status: open
Facts found while building (to validate or already corrected)¶
- quantms: nf-core/quantms is not among the 106 released pipelines of the survey. The proteomics board uses nf-core/diaproteomics, which the survey lists with no MultiQC.
- spatialaxe: the Xenium pipeline is nf-core/spatialaxe, released 1.0.1 (nf-co.re/pipelines.json, read 2026-10-26).
- Stain: the idr0073 slide is brightfield IHC; its chromogen and counterstain are [to be validated].
- Partial megatest uploads: some uploads are partial. Examples are spatialaxe 1.0.1 (no objects) and the latest atacseq, chipseq and methylseq (no MultiQC data). That is why
tools/fixtures/megatests.pyfalls back to older releases. - A real metadata swap: the airrflow test samplesheet has its
tissueandtreatmentcolumns swapped (pipeline_info/samplesheet.valid.tsv). The board shows it as an info-level consistency check.