[issue] platform not defined

Hi,

I’m new to Cylc 8.

Cylc 8.6.2 and rose 2.6.2 were installed to a centralized loation with command “pip3 install --user”

I played examples extracted from the cylc.flow package with installed Cylc/rose environement, they worked fine.

However, my suite keeps throwing a ‘platform not defined’ error. It isn’t even generating the ‘job’ script in the log/job directory — only the job-activity.log is available.

I tried to tune the “platform“ setting in the suite and global.cylc, nothing worked for me. Neither the log/scheduler/log gave a hint.

Wondering what went wrong with my suite or the Cylc config.

Here is the suite

[scheduler]
    UTC mode = True

[scheduling]
    [[graph]]
        R1 = """
              {% for expt in EXPERIMENTS %}
                  fcm_make =>\
                  jules_{{expt}} =>\
                  housekeep
              {% endfor %}
        """

[runtime]
    [[root]]
        script = rose task-run --verbose
        [[[events]]]
            mail events = submission failed, submission timeout, failed, execution timeout
  
[[SPICE]]
        pre-script = """
            module purge
            module load PrgEnv-gnu
            module load python/3.12.1-gcc11
            module load ccrs_common ccrs_fcm
            module load cylc8/8.6.2
            module load cray-netcdf cray-hdf5
            module list 2>&1
            """
       #platform = asp2a-login

    [[fcm_make]]
        inherit = None, SPICE
        execution time limit = PT20M
       #platform = {{ ROSE_ORIG_HOST }}
        [[[environment]]]
            JULES_PATH       = {{ JULES_PATH }}
            JULES_REVISION   = {{ JULES_REVISION }}
            JULES_PATH_META  = {{ JULES_PATH }}/rose-meta/
            ROSE_TASK_N_JOBS = 1

Here are the job-activity.log

[jobs-submit cmd] (platform not defined)
[jobs-submit ret_code] 1
[jobs-submit err] No matching platform "asp2a-login-nea01.head.cm.asp2a.nscc.sg" found
[(('event-mail', 'submission failed'), '1') ret_code] 0

Here are appropriate Env. vars.

CYLC_HOME=/home/project/17001770/app/cylc
CYLC_VERSION=8.6.2
CYLC_HOME_ROOT=/home/project/17001770/app/cylc/8.6.2
CYLC_SITE_CONF_PATH=/home/project/17001770/app/cylc/8.6.2/etc
CYLC_PYTHONPATH=/home/project/17001770/app/cylc/8.6.2/lib/python3.12/site-packages

ROSE_HOME=/home/project/17001770/app/cylc/8.6.2/lib/python3.12/site-packages/metomi/rose

Here is the output of cylc config

[platforms]
    [[asp2a-login]]
        hosts = localhost
        install target = ~/scratch/cylc-run
    [[_local_background_indep_tcp]]
        hosts = localhost
        install target = localhost
    [[_remote_background_indep_tcp]]
        hosts = _remote_background_indep_tcp
    [[_remote_at_indep_tcp]]
        job runner = at
        hosts = _remote_background_indep_tcp
    [[_remote_background_indep_poll]]
        hosts = _remote_background_indep_poll
        communication method = poll
        execution polling intervals = PT1S, PT1S, PT1S, PT1S, PT1S, PT5S
        submission polling intervals = PT3S
    [[_remote_at_indep_poll]]
        job runner = at
        hosts = _remote_background_indep_poll
        communication method = poll
        execution polling intervals = PT1S, PT1S, PT1S, PT1S, PT1S, PT5S
        submission polling intervals = PT3S

Here are outputs of log/scheduler/log

2026-01-30T10:17:21+08:00 DEBUG - Starting
2026-01-30T10:17:21+08:00 DEBUG - Configure curve: *[/home/users/gov/nea/jliu/cylc-run/u-bv305/.service/client_public_keys]
2026-01-30T10:17:21+08:00 INFO - Workflow: u-bv305
2026-01-30T10:17:21+08:00 INFO - LOADING saved workflow parameters
2026-01-30T10:17:21+08:00 INFO - + workflow UUID = 777f81cc-2368-4998-b23a-d2b208a26eb3
2026-01-30T10:17:21+08:00 INFO - + UTC mode = True
2026-01-30T10:17:21+08:00 INFO - + initial point = 1
2026-01-30T10:17:21+08:00 INFO - + cycle point time zone = Z
2026-01-30T10:17:21+08:00 INFO - + run mode = live
2026-01-30T10:17:21+08:00 DEBUG - Reading file /home/users/gov/nea/jliu/cylc-run/u-bv305/flow.cylc
2026-01-30T10:17:22+08:00 DEBUG - Loading site/user config files
2026-01-30T10:17:22+08:00 DEBUG - Reading file /home/project/17001770/app/cylc/8.6.2/etc/flow/global.cylc
2026-01-30T10:17:22+08:00 DEBUG - ran rose in 0.19357s
2026-01-30T10:17:22+08:00 DEBUG - Processing with Jinja2
2026-01-30T10:17:22+08:00 DEBUG - Setting Jinja2 template variables:
    + CYLC_TEMPLATE_VARS={'ROSE_VERSION': '2.6.3', 'ROSE_ORIG_HOST': 'asp2a-login-nscc02.head.cm.asp2a.nscc.sg', 'WALLTIME': 'PT3H', 'OMP_NUM_THREADS': 2, 'MPI_NUM_TASKS': 1, 'JULES_REVISIO
    + CYLC_VERSION=8.6.2
    + CYLC_WORKFLOW_SRC_DIR=/scratch/users/gov/nea/jliu/work/u-bv305
    + DESKTOP_MODE=True
    + EXPERIMENTS=['cntl']
    + JULES_OUT_DIR=/home/users/gov/nea/jliu/scratch/work/jules_out
    + JULES_PATH=/home/users/gov/nea/jliu/scratch/work/jules_vn7.8
    + JULES_REVISION=@vn7.8
    + MPI_NUM_TASKS=1
    + OMP_NUM_THREADS=2
    + ROSE_ORIG_HOST=asp2a-login-nscc02.head.cm.asp2a.nscc.sg
    + ROSE_SUITE_VARIABLES={'ROSE_VERSION': '2.6.3', 'ROSE_ORIG_HOST': 'asp2a-login-nscc02.head.cm.asp2a.nscc.sg', 'WALLTIME': 'PT3H', 'OMP_NUM_THREADS': 2, 'MPI_NUM_TASKS': 1, 'JULES_REVIS
    + ROSE_VERSION=2.6.3
    + WALLTIME=PT3H
2026-01-30T10:17:22+08:00 DEBUG - Processed configuration dumped: /home/users/gov/nea/jliu/cylc-run/u-bv305/log/config/flow-processed.cylc
2026-01-30T10:17:22+08:00 DEBUG - Expanding [runtime] namespace lists and parameters
2026-01-30T10:17:22+08:00 DEBUG - First parent(s) demoted to secondary:
     + SPICE as parent of 'fcm_make'
     + SPICE as parent of 'jules_cntl'
     + SPICE as parent of 'housekeep'
2026-01-30T10:17:22+08:00 DEBUG - Parsing the runtime namespace hierarchy
2026-01-30T02:17:22Z DEBUG - Parsing [special tasks]
2026-01-30T02:17:22Z DEBUG - Parsing the dependency graph
2026-01-30T02:17:22Z DEBUG - Required outputs inferred from the graph:
     • fcm_make:succeeded
     • jules_cntl:succeeded
2026-01-30T02:17:22Z INFO - Scheduler: url=tcp://asp2a-login-nscc02.head.cm.asp2a.nscc.sg:43089 pid=1917817
2026-01-30T02:17:22Z INFO - Workflow publisher: url=tcp://asp2a-login-nscc02.head.cm.asp2a.nscc.sg:43074
2026-01-30T02:17:22Z INFO - Run: (re)start number=7, log rollover=1
2026-01-30T02:17:22Z INFO - Cylc version: 8.6.2
2026-01-30T02:17:22Z INFO - Run mode: live
2026-01-30T02:17:22Z INFO - Initial point: 1
2026-01-30T02:17:22Z INFO - Final point: 1
2026-01-30T02:17:22Z INFO - LOADING task proxies
2026-01-30T02:17:22Z INFO - + 1/fcm_make submit-failed
2026-01-30T02:17:22Z DEBUG - [1/fcm_make/01:submit-failed(runahead)] added to the n=0 window
2026-01-30T02:17:22Z DEBUG - Runahead: base point 1
2026-01-30T02:17:22Z DEBUG - Runahead limit: 1
2026-01-30T02:17:22Z INFO - [1/fcm_make/01:submit-failed(runahead)] => submit-failed
2026-01-30T02:17:22Z INFO - LOADING job data
2026-01-30T02:17:22Z INFO - Flows:
    flow: 1 (original flow from 1) 2026-01-29T06:11:19+00:00
2026-01-30T02:17:22Z DEBUG - Loaded main loop plugin "reset bad hosts":
    * reset_bad_hosts
2026-01-30T02:17:22Z DEBUG - Loaded main loop plugin "health check":
    * health_check
2026-01-30T02:17:22Z DEBUG - jobs-poll for localhost on localhost
2026-01-30T02:17:22Z DEBUG - ['cylc', 'jobs-poll', '--debug', '--', '$HOME/cylc-run/u-bv305/log/job', '1/fcm_make/01']
2026-01-30T02:17:22Z ERROR - Incomplete tasks:
    * 1/fcm_make did not complete the required outputs:
      ⨯ ┆  succeeded
2026-01-30T02:17:22Z CRITICAL - Workflow stalled

Thansk for your time

Jerry

Hi @Jerry

A couple of quick comments to start with:

Your global config shows (_remote_background_indep_tcp etc.) you’ve been trying to run the Cylc functional tests, which only Cylc developers should need to do.

Your flow.cylc file seems to have all of its platform items commented out. Was that the case when you got the reported error - i.e. it’s complaining “platform not found” even though you did not assign to a platform (which should default to a background job on localhost, in that case). And where is all that verbiage in the long messy-looking hostname coming from?

Your custom platform definition (asp2a-login) looks wrong - install target should be a host name, not a disk path (for a multi-host platform, it tells Cylc which host to use for file installation).

I’d suggest getting your job platforms config and job submission working first with a small hello-world workflow, to avoid all the messiness that can be associated with real task environments etc.

Hi @hilary.j.oliver ,

Thanks for the quick response.

Follow with your sugestions, played this simple flow.cylc, it worked fine

[meta]
title = Hello World
description = “”"
A simple workflow which runs a single task (hello_world) once.
“”"

[scheduling]
[[graph]]
R1 = hello_world

[runtime]

[[hello_world]]

platform = asp2a-login
script = echo “Hello World!”

Here is the log/job/1/hello_world/job.out

Workflow : hello_world
Job : 1/hello_world/01 (try 1)
User@Host: jliu@asp2a-login-nscc02

Hello World!
2026-01-30T13:22:24+08:00 INFO - started
2026-01-30T13:22:26+08:00 INFO - succeeded

Here is the global.cylc

[platforms]
    [[asp2a-login]]
        hosts = localhost
        install target = localhost

By comparing with the simple hello_world workflow, noticed the ‘platform not defined’ might be triggered by the “opt/rose-suite-cylc-install.conf.

# This file records CLI Options.
# Installed with:
#     * Cylc Rose: 1.7.0
#     * Rose     : 2.6.3
#     * Cylc     : 8.6.2

!opts=

[env]
# ROSE_ORIG_HOST set by cylc install.
ROSE_ORIG_HOST=asp2a-login-nscc02.head.cm.asp2a.nscc.sg

[template variables]
# ROSE_ORIG_HOST set by cylc install.
ROSE_ORIG_HOST=asp2a-login-nscc02.head.cm.asp2a.nscc.sg

Once removed the opt directory, the ‘platform not defined’ was gone, and the log/job/1/fcm_make/NN/job script also got generated as well.

But it came with another issue “No such command: rose task-run”.

I could make sure the bin directory of rose is avaiable in the $PATH. But the rose --help showed only two commands “rose mpi-launch” and “rose tutorial” are avaiable.

Wondering

  1. if something wrong with rose configuration, as I used the legacy rose.conf with rose 2.6.2.
  2. If it still needs to use legacy rose 2019.x with Cylc 8, as the “rose task-run“ is not avaiable with rose 2.6.2

Here is rose.conf

# Common site configuration.
meta-path=/home/project/17001770/UMDIR/rose-meta
rose-doc=http://metomi.github.io/rose/doc/

# Configuration of external commands.e
[external]
editor=vi

## LDAP settings are only relevant if "[rosa-svn]user-tool=ldap".
[rosa-ldap]

# Configuration for "rosa svn-pre-commit" and "rosa svn-post-commit".
[rosa-svn]

# Configuration related to the built-in "rose_ana" application.
[rose-ana]

# Configuration for Rose Bush server. (Examples are default values.)
[rose-bush]

# Configuration specific to "rose config-edit".
[rose-config-edit]
accel-find-next=F3

# Calling "rose" on a remote host.
[rose-home-at]

# Configuration related to "rose host-select".
[rose-host-select]
group{athena}=10.103.72.110 10.103.72.111 10.117.5.104 172.23.129.5 172.23.129.10
group{helios}=10.103.72.110 10.103.72.111 10.117.5.104 172.23.129.5 172.23.129.10
group{hpc}=10.103.72.110 10.103.72.111  10.117.5.104 172.23.129.5  172.23.129.10
#default=linux
group{linux}=10.103.72.110 10.103.72.111 10.117.5.104 172.23.129.5 172.23.129.10

# Configuration related to "rose mpi-launch".
[rose-mpi-launch]
launcher-list=aprun

# Configuration related to "rose stem".
[rose-stem]
automatic-options=SITE=mss

# Configuration related to "rose suite-hook"
[rose-suite-hook]

# Configuration related to "rose suite-log"
#
## Mapping $HOME/cylc-run/SUITE to a http:// URL.
## E.g. If $HOME/public_html/cylc-run is a symlink of $HOME/cylc-run
##      and $HOME/public_html/ is served as http://host/~$USER/:
#  home-public-html=http://host/~$USER public_html
## URL to the site's Rose Bush web service.
#  rose-bush=http://host/rose-bush/
[rose-suite-log]

# Configuration related to "rose suite-run".
[rose-suite-run]
#default=helios
root-dir=*=$DATADIR

# Configuration related to "rose task-run".
[rose-task-run]

# Configuration related to the database of the Rosie web service server
[rosie-db]
db.mss=sqlite:///home/project/17001770/rosie_repos/mss-db.sqlite
repos.mss=/scratch/singadm/rosie_repos

# Configuration related to "rosie go" GUI
[rosie-go]

# Configuration related to Rosie client commands
[rosie-id]
prefix-default=mss
prefix-location.mss=file:///home/project/17001770//rosie_repos
prefix-web.mss=http://127.0.0.1/trac/mss/intertrac/source:
prefix-ws.mss=http://127.0.0.1:8080/mss
prefixes-ws-default=mss

# Configuration related to the Rosie version control client
[rosie-vc]

# Configuration related to the adhoc Rosie web service server
[rosie-ws]
log-dir=/home/project/17001770/rosie_repos/log
port=8080

# Configuration related to Rosie web service clients
[rosie-ws-client-requests]

# Test Battery Configuration
[t]

Thanks for your time

Hi Jerry,

There’s quite a lot to unpick here…

Platform setting commented:

In your original workflow you had

       #platform = {{ ROSE_ORIG_HOST }}

But I’m going to assume that it was in fact uncommented, else platform is assumed to be localhost - the host on which the workflow is running, and you should not have had a platform error.

Platform name

You’ve demonstrated that platform = asp2a-login works with your mini workflow. However the real workflow uses platform = {{ ROSE_ORIG_HOST }}. The rose-suite-cylc-install.conf records what options were used on the command line cylc install or cylc vip. Do not delete or modify this file - it’s a way of recording what cylc install has done.

In this case the only thing recorded in rose-suite-cylc-install.conf is the standard variable ROSE_ORIG_HOST, the hostname of your machine. But it doesn’t match the platform spec. The answer here is to change the platform spec to:

[platforms]
    [[asp2a-login.*]]
        hosts = localhost
        install target = localhost

Platforms names in the global config are regular expressions and Cylc will attempt to match them starting from the bottom of the list.

No rose task-run

The response to your questions is no. You should use Rose 2.6.x. You should not use Cylc 8 with Rose 2019. I don’t think your config should be a problem.

“No such command: rose task-run”

Something isn’t right with your installation of rose. You should be using rose 2.6.2. I don’t think that there is a problem with your config.

Did you install rose, or is this a site installation?

I’m guessing from you writing your own config files that you are likely installing Cylc and Rose for yourself. In which case are you using Pip or Conda?

Hi wxtim,

Thanks for your inputs.

I tryied these two ways

  1. From source code
1) Download rose-2.6.2.tar.gz from https://github.com/metomi/rose/archive/refs/tags/2.6.2.tar.gz

2) export PYTHONUSERBASE=/home/project/17001770/app/cylc/8.6.2

3) tar -zxvf rose-2.6.2.tar.gz ; cd rose-2.6.2

4) pip3 install --user .
  1. with pip
pip3 install --user metomi-rose==2.6.2

rose was installed in $PYTHONUSEBASE/bin

metomi /{rose,rosie,isodatetime} were installed in $PYTHONUSEBASE/lib/python3.12/site-packages

pip3 list showed metomi-rose & metomi-isodatetime version info.

rose --help showed only “rose mpi-launch” and “rose tutorial” avaiable.

and it’s not able to run “rose check-software”, threw out “No such command: rose check-software”

After diving into the rose installation directory, noticed these codes in rose/rose.py

BASH_SUB_CMDS = {
    # bash sub commands - hardcoded
    # NOTE: script must exist in the bin/ directory as `{ns}-{sub_cmd}`.
    # (ns, sub_cmd)
    ('rosa', 'db-create'),
    ('rosa', 'svn-post-commit'),
    ('rosa', 'svn-pre-commit'),
    ('rosa', 'ws'),
    ('rose', 'mpi-launch'),
    ('rose', 'tutorial'),
}

PYTHON_SUB_CMDS = {
    # python sub commands - extracted from entry points
    # (ns, sub_cmd): entry_point
    **{
        ('rose', entry_point.name): entry_point
        for entry_point in iter_entry_points('rose.commands')
    },
    **{
        ('rosie', entry_point.name): entry_point
        for entry_point in iter_entry_points('rosie.commands')
    }
}

task_run.py & check_software.py are avaiable in metomi/rose.

However, PYTHON_SUB_CMDS returned an empty string.

It appeared that ‘rose task-run’ was picked up from neither BASH_SUB_CMDS nor PYTHON_SUB_CMDS.

And grep showed task_run.py was not called any where.

And also notice all sub cmds in the ‘t’ directory were not installed. Tried copy the sub cmds direcotory ‘t’ to lib/python3.12/site-packages/metomi/rose and $PYTHONUSERBASE, neither worked, still not able to pick up the sub cmd task-run.

I am wondering what went wrong with my installation and if there is a manual fix available."

Thanks for your time.

Regards

That means Rose wasn’t installed correctly.

I’m not sure what python and pip3 are in your environment or how --user installs are working but it will be something between these three which is causing the issues.

I would suggest starting by uninstalling Cylc and Rose including any --user installations which may have been created in ~/.local/lib/python*/site-packages. You may find you need to uninstall Cylc/Rose multiple times as you may have duplicate installations in different locations (--user installs can do this). Note you can run cylc version --long and rose version --long to locate the installation. Once this is done, you might want to try running pip check to make sure the user environment is functional.

Then try installing them again from pypi (or conda-forge), ideally without the --user if possible (note user installs can be flaky and may conflict with other tools or environments), virtual environments are easier/safer.

We recommend installing via Conda (which provides its own virtual environments) or if that’s not an option, using Python virtual environments. We provide a Cylc wrapper script which takes care of activating the environment for you and allows multiple parallel installations of Cylc at different versions (makes upgrading easier) - Installation — Cylc 8.6.2 documentation

Hi all,

Thanks for your inputs.

Managed to figure out what went wrong.

For customized (non-Conda) installations, it must set the ROSE_PYTHONPATH environment variable to the ROSE installation directory. This is because rose.py clears existing PYTHONPATH items from sys.path to prevent environment contamination; ROSE_PYTHONPATH is then used to safely re-add the necessary ROSE directories.

All issues I had previously were due to missing of ROSE_PYTHONPATH.

If I’m not wrong, info. about ROSE_PYTHONPATH is missing from the user guid.

ROSE_PYTHONPATH exists to allow you to add things to PYTHONPATH inside Rose. But you enviornment should be set up such that adding Rose itself to ROSE_PYTHONPATH is unecessary. Oliver’s advice is still worth following through.

Hi,

Yes, we clear the PYTHONPATH argument as this often causes conflicts between the Cylc/Rose environment and the job environment (context).

If you need to add a module into the Cylc/Rose environment’s Python path (and not the job environment’s Python path), use the CYLC_PYTHONPATH and ROSE_PYTHONPATH variables.

However, this isn’t necessary for normal installations, it’s only required if things have been installed into non-standard locations so PYTHONPATH is needed to locate them.