Can stages define jobs to be executed?

According to both the CI documentation and the YAML linter the stages: section only accepts string labels. The jobs you can define arbitrarily in the YAML file are then supposed to define which stages they’re meant to run in.

The other way round, however, is not allowed: It’s not possible to define a list of jobs in a stages: subsection to define which jobs should execute in this specific stage. - I’m asking because we’ve identified that that way of defining things more closely resembles programming (think of the jobs as subroutines or functions).

image: some-docker-registry/some-docker-image

cache:
  paths:
    - node_modules/

before_script:
  - echo "Do something ..."

stages:
  pre-requisites:
    - npm_install

  checks:
    - phplint
    - php-cs-fixer
    - phpcs
    - phpcbf
    - jscs

  test:
    - phpunit
    - grunt

grunt:
  script:
    - grunt test

npm_install:
  script:
    - npm install

php-cs-fixer:
  script:
    - vendor/bin/php-cs-fixer fix -v --config-file=.php_cs

phpunit:
  script:
    - dev/bin/run_fastest --no-cache-clear

jscs:
  script:
    - node_modules/grunt-jscs/node_modules/jscs/bin/jscs -c .jscsrc --fix

...

Is this or a similar solution definitely impossible? Or is there an alternative way to get to the same result?

Is there a specific reason for this design decision?

I’ve added issue #29620 on GitLab to track this question.