R10 · Synthesis and go / no-go¶
Draft · 2026-10-28 · waiting for Thomas (GO gate after P1)

Step page: Progress · R10.
What, among the open review findings, stands between today and the narrowed 0.0.1 (dev-env §15.1, §15.3, mvp-0.0.1, log 2026-10-28). Short answer: little, and most of it is decided. This page edits no spec.
1. Scope and method¶
- Read: the twelve round files (R1–R9, R8b, R11, R12), spikes.md, inbox.md, and the log entries APPLY1–APPLY3, "Inbox answers #5 to #37" and the three 0.0.1 entries. Not counted:
code/(per-step code reviews, closed in their PRs) and R2's verification table. - Counted on 2026-10-28 by a script over each
### ID · severity · titleheading and its Status line: 450 findings. "Open" = statusinboxoraccepted(not applied). Owning spec = the Where line's "owner", else its first spec (board-only UX → ui-spec); the per-spec split is approximate, the totals exact. - Status lines vs APPLY entries. The 286 IDs that APPLY1 and APPLY2 list match their status lines (0 mismatches); APPLY3 wrote its result into spikes.md. Staleness comes from later decisions instead: 52 open findings sit on inbox entries Thomas decided on 2026-10-27, whose spec text waits for the inbox-answers apply pass after W3 (log, "Applied later"); they stay counted as open. Four open findings already have their 0.0.1 part in the specs: SEC-102, SR-031, SR-091 (dev-env §15.3) and SR-067 (architecture §7.3).
| Status | Blocker | Major | Minor | Total |
|---|---|---|---|---|
| Applied | 0 | 32 | 82 | 114 |
| Partly applied (doc done; a board, tool or blocked part remains) | 10 | 119 | 71 | 200 |
| Open: inbox | 8 | 65 | 20 | 93 |
| Open: accepted, not applied | 0 | 9 | 21 | 30 |
| Rejected | 0 | 1 | 11 | 12 |
| Closed without edit (FC-021, already fixed by CH-001 and CH-006) | 0 | 0 | 1 | 1 |
| Total | 18 | 226 | 206 | 450 |
Where the 123 open findings wait:
- 52 on decided inbox entries (spec text pending);
- 14 on deferred entries (#17, #18);
- 35 on entries still open or only assumed;
- 22 need no decision: board-only fixes (R7), docs-site fixes (R11), and the R12 findings that no apply step covered yet.
2. Open findings by severity and spec¶
| Owning spec | Blocker | Major | Minor | Partly applied (residue) |
|---|---|---|---|---|
| api-and-data-model | 3 | 20 | 3 | 43 |
| checking-scenarios | 2 | 8 | 1 | 4 |
| architecture-plugins-and-packaging | 1 | 8 | 1 | 16 |
| synthesis | 1 | 6 | 1 | 17 |
| authentication-and-access | 1 | 5 | 3 | 2 |
| ui-spec and boards | 0 | 15 | 17 | 55 |
| schedulers-and-monitoring | 0 | 7 | 1 | 9 |
| admin-and-operations | 0 | 3 | 0 | 11 |
| documentation-system | 0 | 1 | 8 | 12 |
| dev-environment-and-testing | 0 | 1 | 4 | 19 |
| depictio-ecosystem-reuse | 0 | 0 | 2 | 4 |
| cli, playbooks / CI, other | 0 | 0 | 0 | 8 |
| Total | 8 | 74 | 41 | 200 |
All 18 blockers are applied (fully or in their 0.0.1 part) or deferred with a reason. "0.0.1" means P1 acts on it (§3a).
| Blocker | Round | Status (counted) | Disposition |
|---|---|---|---|
| SR-001 ingest contract | R1 | inbox (#11, #36 decided) | 0.0.1: driven-run part (spool format, caps) decided (#36 a), api §14 not written; observed-run part deferred |
| SR-054 ingest contract for 0.0.1 | R3 | inbox (#36 decided) | 0.0.1: same as SR-001 |
| SEC-102 tokenless loopback on a login node | R5 | inbox (#15 open) | 0.0.1 part applied in dev-env §15.3 (token link); rest deferred (#15) |
| SR-055 no local environment / runner record | R3 | partly (APPLY2) | 0.0.1: one environment record at spectio init (api §6 residue) |
| CH-041 head fate on server stop | R3 | partly (APPLY2) | 0.0.1: heads adopted by name (schedulers §3.1); residue a board |
| CH-042 run state machine | R3 | partly (APPLY2) | 0.0.1: api §7.1 applied; pause and stop residue deferred (#16) |
| CH-001 head job and compute-node egress | R4 | partly (APPLY1) | 0.0.1: solved by the spool; residue api §14 and egress (§4 Q7) |
DEP-T-002 release-please with GITHUB_TOKEN |
R8b | partly (APPLY1) | 0.0.1 tag, not P1: needs the GitHub App (#8) |
| SR-002 runner ↔ server protocol | R1 | inbox (#12 open) | Deferred: no remote runner in 0.0.1 |
| SEC-101 runner account vs principals | R5 | inbox (#14 open) | Deferred: one user on their own Unix account (§15.3) |
| SR-057 rnaseq stage and gate | R3 | inbox (#34) | Deferred: no gates (#34 answer) |
| SR-058 MultiQC bindings at gate time | R3 | inbox (#34) | Deferred: no gates |
DL-101 runner-side depictio-cli ingest |
R8 | inbox (#22 decided) | Deferred: no depictio hand-off |
| SR-003 where check providers run | R1 | partly (APPLY1) | Residue deferred with checks |
SR-004 spectio.yml schema |
R1 | partly (APPLY1) | Residue (gate policy, overlays) deferred with gates |
SR-005 tasks vs background_tasks |
R1 | partly (APPLY1) | Applied; residue (boards, reuse §1.1) deferred |
| SR-062 relaunch from a failed gate | R3 | partly (APPLY2) | Deferred: gates and relaunch are out (#61) |
| DEP-T-001 path-filtered required checks | R8b | partly (APPLY1) | Tooling: ci-ok exists; protection waits for #8 |
Blockers that touch 0.0.1: 8 (3 with an open status: SR-001, SR-054, SEC-102; 5 partly applied: SR-055, CH-041, CH-042, CH-001, DEP-T-002). Deferred by the cut: 10.
3. The 0.0.1 cut checked against the open findings¶
The cut: one user, spectio serve on a SLURM login node behind an SSH tunnel and a token link, SQLite on node-local disk, heads through sbatch, events through the spool (nf-spectio, Snakemake logger plugin); three screens, text and tables only; no gates, Kubernetes, visualisation or relaunch (#61, assumed).
3a. What P1 must handle (as tasks or tests)¶
Of the 82 open blockers and majors, 12 touch the cut (3 blockers, 9 majors); partly-applied findings whose residue lands in it are listed with them.
| # | Topic | IDs | Owning spec | P1 action |
|---|---|---|---|---|
| 1 | Spool event contract: format, caps, cursor and replay, planned-task count | SR-054, SR-001 (driven part), SR-080; residue of CH-001, CH-044, CH-005, CH-011, SR-084, UX-272 | api §14 (to write, #36 a); dev-env §15.3 req. 6; architecture §13.1 | Write the driven-run part of api §14 first; test it by replaying the T2 fixtures |
| 2 | Token link and the seven §15.3 security requirements | SEC-102, SR-031, SR-091 (0.0.1 parts applied; status lines stale) | dev-env §15.3 | One task and one test per requirement; spike sec-single-mode for the three browser behaviours marked [to be validated] |
| 3 | How a workflow reaches the launch form | SR-056 (#34, open); UX-119 (minor) | api §5; ui-spec §4.6, §8 | Needs Thomas (§5, D2) |
| 4 | What engine events may carry into SQLite on a shared login node | SPK-T2-11, SPK-T2-23 (#55, reserved) | architecture §13.5; admin §3.4 | Needs Thomas (§5, D3) |
| 5 | Engine install and plugin delivery | SR-067 (#35 decided, applied in architecture §7.3; status stale); residue of FC-039, FC-040, CH-006, CH-009 | architecture §7.3, §13.3, §13.4 | spectio doctor; jar from the wheel (read-only NXF_PLUGINS_DIR [to be validated]); Snakemake range test; logger added, not replacing; bridge failure never fails the run |
| 6 | Server restart while heads run | CH-041 | schedulers §3.1 | Restart test on slurm-mini: head adopted by name, spool read from its cursor |
| 7 | Run and task states | CH-042; SPK-T2-09 (aborted, #56 assumed) |
api §7.1, §7.2 | Implement the subset without pause and resume |
| 8 | The one environment and the runs root at spectio init |
SR-055 | api §6; architecture §7.2 | Init task and test |
| 9 | Read API for the three screens: stages, counts, timestamps, logs, failure cause, Snakemake launch body | residue of SR-082, SR-088, SR-089, UX-273, CH-047, UX-277 | api §5, §5.2, §7 | OpenAPI for the 0.0.1 routes only |
| 10 | Files the server reads (spool, logs) stay inside the run root | residue of SEC-105 | checking-scenarios §11.1 (rule); architecture §13.7 (log sources) | Path and symlink confinement test |
| 11 | SQLite discipline, and SQLite on node-local disk | residue of CH-013, CH-015 | architecture §7.2, §7.3 | WAL and lock settings as specified; §4 Q4 |
| 12 | Keeping spectio serve up on a login node |
CH-028 (accepted; blocked by #14 and #25) | schedulers §6 | Manual start plus adoption on restart; §4 Q1 |
| 13 | Empty and first-run state of the runs list | UX-211 | ui-spec §4.3 | One UI state |
The P1 prompt already covers rows 1, 2, 6 and 8; P1 should add 5, 7, 9–13. Rows 3 and 4 need Thomas.
A gap that no finding names: dev-env §15.3 req. 7 cites :cancel, but §15.1 has no cancel row (D4 in §5; if yes, the drain rule of schedulers §2, row L1, and FC-001 apply).
3b. What the narrowed cut defers¶
The other 70 open blockers and majors, by the feature that left the cut:
- QC checks and gates (16): SR-057, SR-058, SR-023, SR-033, UX-101, UX-102, UX-104, UX-105, UX-106, UX-108, UX-110, UX-129, FC-002, SEC-111, SEC-114, DL-104.
- Relaunch, parameter history, pause (3): UX-109, UX-113, SR-018.
- Users, sign-in, roles, tokens, sharing, observed runs (17): SR-020, SR-024, SR-025, SR-029, SEC-104, SEC-108, SEC-113, SEC-117, SEC-121, SEC-122, UX-126, UX-201, UX-202, UX-204, UX-206, UX-217, CH-030.
- Shared server, remote runners, runner identity, plugins (11): SR-002, SEC-101, SR-014, SR-021, SR-035, SEC-106, SEC-115, SEC-116, SEC-118, SEC-124, UX-117.
- Kubernetes and slurmrestd (6): SPK-T4-01, SPK-T4-03, SPK-T4-12, SPK-T4-14, SPK-T3-15, DEP-T-015.
- depictio hand-off and co-hosting (6): DL-101, DL-102, FC-003, SEC-109, SEC-120, DEP-T-013.
- Later features: WES, batches, chaining, image viewer (4): SR-010, UX-120, UX-122, UX-128.
- Operations, packaging, scale, process (7): SR-030, SEC-119 (backup); CH-004 (scale model); DEP-T-003 (images); DEP-T-008 (auto-merge paths); SR-007 (old phase tables, which §15 already marks as historical); UX-222 (boards).
The 41 open minors (board, docs-site and later-feature items) are not listed; none is a precondition. UX-119 joins row 3; UX-227 matters only if boards serve as the 0.0.1 UI reference.
4. Open questions for EMBL IT¶
schedulers §12 owns the site questions (its Q1–Q7). This list orders them for 0.0.1 and adds those §15.3 raised ("new": to add to §12 at the next apply step). Nothing is sent without Thomas (#27).
Login node and SLURM (blocks testing 0.0.1 at EMBL):
- May a user keep a long-running
spectio serveon a login node, kept up bysystemd --userwith lingering, cron, or neither? Does a session or CPU / memory cap kill it? Depends: dev-env §15.3 "Site prerequisites", schedulers §6; §12 Q2; CH-028. - Does the login alias round-robin? The tunnel must reach the server's node (new). Depends: dev-env §15.3 "Access", architecture §7.3.
- Is SSH local port forwarding (
ssh -L) to login nodes allowed, and through which jump host (new)? Depends: dev-env §15.3 "Access". - Does the login node have persistent node-local disk that is not purged, and how much (new)? Depends: dev-env §15.3 "Where data lives", architecture §7.2.
- May an engine head run as a long SLURM job submitted from the login node: walltime, partition or QOS for heads, per-user job limits? Depends: schedulers §3.1, §3.2; CH-026.
- Are
squeueandsacctrate-limited? 0.0.1 polls the head job only. Depends: schedulers §3.2; §12 Q3. - Do compute nodes have outbound HTTPS for pipelines, containers and plugins (events do not need it)? Depends: dev-env §15.3 "Launch"; §12 Q6; CH-001.
Storage:
- Which shared file system holds the runs root, and with what quota, purge policy and quota command? Depends: architecture §7.2; §12 Q4.
- Is a line appended on a compute node promptly visible on the login node, and are file locks reliable (new)? Depends: architecture §13.1 (spool cursor).
- Can a user create 0700 directories under that root, or do group ACLs override the mode (new)? Depends: dev-env §15.3 req. 5.
Auth (later only; 0.0.1 needs only Unix accounts and SSH):
- Which identity provider would a shared Spectio use (OIDC or SAML), and may a service node submit jobs on users' behalf? Depends: authentication-and-access §0; #14, #20.
- Is slurmrestd offered to users, and with which tokens? Is
PrivateData=jobsset? Depends: schedulers §3.3; §12 Q1, Q7; #59.
Kubernetes (later only):
- Is Kueue installed on EMBL's Kubernetes? Can a project get its own namespace with PodSecurity
restricted? Depends: schedulers §4; §12 Q5; #53, #54.
5. Go / no-go¶
Recommendation: GO for P1 now; GO for code after P1, under the conditions below. The backlog is large (123 open, 200 partly applied), but 70 of the 82 open blockers and majors belong to features that left 0.0.1, and 7 of the remaining 12 are decided or applied in their 0.0.1 part. This also answers #52: what stands before code is short.
Conditions before the first line of product code (the GO gate after P1):
- C1. Thomas answers #52. This synthesis supports (b): code first, full review circuit for product code and security boundaries only.
- C2. The driven-run part of api §14 (row 1) is P1's first task; it is decided (#36 a).
- C3. Decisions D1–D4 below are answered, or P1 records the recommended option as assumed.
- C4. P1 turns rows 1–13 of §3a into tasks with tests, one test per §15.3 security requirement.
Conditions before the 0.0.1 tag (not before coding):
- C5. EMBL IT answers Q1–Q4 and Q7–Q10, or another first site does; sind
slurm-minicovers development (dev-env §4). - C6. Spike sec-single-mode confirms the three browser behaviours of §15.3 (SSE cookie,
SameSite=Strictafter a cross-site link,Originon writes). - C7. The Snakemake head job is checked on failure scenarios and long runs (T3 covered
happyonly); otherwise the §15.1 fallback (head on the login node) applies. - C8. The GitHub App exists for release-please (#8), and the first release commit carries
Release-As: 0.0.1(dev-env §15.2).
No-go trigger. If login nodes forbid long-running user processes or SSH forwarding (Q1, Q3), §15.3 does not hold at that site; the cut goes back to Thomas (a service node, or a remote runner, both bringing back #12–#14).
What Thomas decides (the inbox entries that matter for 0.0.1):
| Question | Entry | Recommendation | |
|---|---|---|---|
| D0 | Code first, and a lighter process for tooling | #52 (open, critical) | (b) |
| D1 | Relaunch and parameter history out of 0.0.1 | #61 (assumed) | confirm (a) |
| D2 | How a workflow reaches the launch form | #34, SR-056 part (open) | the smallest contract: a pipeline location the user's account can read (a path or a Git URL and revision), with its parameter schema read from it; no catalogue and no POST /workflows in 0.0.1 |
| D3 | What engine events may carry | #55 (reserved) | (a): nf-spectio sends no script or env; homeDir, commandLine, configText and env are never stored |
| D4 | Can 0.0.1 cancel a run? | #62 (assumed; a gap in §3a) | yes: one Cancel action, with the drain rule of schedulers §2 |
| — | Attempt state aborted |
#56 (assumed) | confirm (a); it is visible in the 0.0.1 run detail |
| — | GitHub App for releases | #8 (open) | needed before the tag only |
Not needed for 0.0.1, so they can wait: #12, #14, #15 (remainder), #16 (later versions), #17, #32, #53, #54, #57–#60.