Parser error "no subsection to hold Run in EntryArchive"

Hello all,

I’ve written a custom parser a long time ago that has worked flawlessly on our Oasis in the past. Last week I made some very small changes (which passed local testing) and now uploads to our Oasis fail with this message:

"root":{
"errors": string"parser failed with exception"
"event": string"process failed"
"proc": string"Entry"
"process": string"process_entry"
"process_worker_id": string"YO986CwbS16Ivr5XkZyg0A"
"parser": string"parsers/lightforge"
"error": string"There is no subsection to hold a nomad.datamodel.metainfo.simulation.run.Run:Section in nomad.datamodel.datamodel.EntryArchive:Section."
"step": string"parsers/lightforge"
"logger": string"nomad.processing"
"exception": string"Traceback (most recent call last): File "/usr/local/lib/python3.9/site-packages/nomad/processing/data.py", line 1499, in parsing parser.parse( File "/usr/local/lib/python3.9/site-packages/nomad/parsing/parser.py", line 463, in parse self.mainfile_parser.parse(mainfile, archive, logger) File "/app/plugins/lightforge_parser/parser.py", line 1007, in parse DetailedParser(mainfile, archive) File "/app/plugins/lightforge_parser/parser.py", line 44, in DetailedParser sec_run = archive.m_create(Run) File "/usr/local/lib/python3.9/site-packages/nomad/metainfo/metainfo.py", line 2054, in m_create raise TypeError( TypeError: There is no subsection to hold a nomad.datamodel.metainfo.simulation.run.Run:Section in nomad.datamodel.datamodel.EntryArchive:Section."
"timestamp": string"2024-07-10 14:48.44"
"level": string"ERROR"
}

Traceback (most recent call last):
  File "/usr/local/lib/python3.9/site-packages/nomad/processing/data.py", line 1499, in parsing
    parser.parse(
  File "/usr/local/lib/python3.9/site-packages/nomad/parsing/parser.py", line 463, in parse
    self.mainfile_parser.parse(mainfile, archive, logger)
  File "/app/plugins/lightforge_parser/parser.py", line 1007, in parse
    DetailedParser(mainfile, archive)
  File "/app/plugins/lightforge_parser/parser.py", line 44, in DetailedParser
    sec_run = archive.m_create(Run)
  File "/usr/local/lib/python3.9/site-packages/nomad/metainfo/metainfo.py", line 2054, in m_create
    raise TypeError(
TypeError: There is no subsection to hold a nomad.datamodel.metainfo.simulation.run.Run:Section in nomad.datamodel.datamodel.EntryArchive:Section.

My parser basically looks like this:

from nomad.datamodel import EntryArchive   # unused import
from nomad.datamodel.metainfo.simulation.run import Run, Program
from nomad.datamodel.metainfo.simulation.calculation import Calculation
class LightforgeParser():
      def parse(self, filepath, archive, logger):
            sec_run = archive.m_create(Run)
            sec_calc = sec_run.m_create(Calculation)
            etc....

I don’t see any mistakes with this, and the parser has been structured like this all the time and it worked in the past. Could someone explain the error? I can provide parser repo if needed.
Thanks in advance and best regards
Fabian

I don’t think this is your parser changes. To update your Oasis with the new parser, you probably build a new image?

It seems that for some reason there is no section run. We moved the respective schema from the main code-base into a plugin. It seems like this plugin is missing and this might be a problem in how the Oasis image is build. Can you share your Dockerfile?

To verify that this is this problem can you run this for the image that you use for your oasis and let us know about the result:

docker run --rm <yourimage:yourtag> python -c "from nomad.datamodel.datamodel import runschema; print(runschema)"

We use the default image (gitlab-registry.mpcdf.mpg.de/nomad-lab/nomad-fair:latest) but have our own plugin selection in nomad.yaml So I guess we need to include this new plugin explicitly?

output from your command:

>>> from nomad.datamodel.datamodel import runschema
WARNING  nomad.datamodel      2024-07-15T20:46:16 Schema is deprecated, use plugins.
  - nomad.commit:
  - nomad.deployment: oasis
  - nomad.service: unknown nomad service
  - nomad.version: 1.3.3
>>> print(runschema)
<nomad.datamodel.metainfo.SchemaInterface object at 0x7f7e1d942fd0>

No, you don’t need to explicitly include the plugin; it is included automatically. The output looks good, but now I don’t know what the problem might be. We need to have a closer look.

You mentioned a git repo? Maybe you also maintain your image in the registry of that repo? Please send a link and someone can have a closer look.

To understand the problem, we need to see the lightforge parser and how it is integrated into your oasis.

  • is is mounted python code? please send the docker-compose and the parser repo
  • is it a custom docker image? please send the Dockerfile and the parser repo

Thanks for the fast replies. Here’s the repo for the parser “Lightforge”:

Hi there!

I think @schaarj pointed out the solution: the problem might be that, when including plugins in the config file, the defaults get disconnected. Hence, you need to explicitly include runschema in the list of plugins if you want to use it. This is what we also faced when developing parsers internally and modifying NOMAD config file.

Now, what I am not sure is whether the runschema is with the new entry points structure that NOMAD has adopted. I am afraid that we would need @ladinesa to come back from vacations and answer this.

Nevertheless, the runschema is going to slowly stop being maintained in a near future. We are right now developing a new schema, called nomad-simulations. In this case, you can connect it with the new entry points structure by adding:

plugins:
  entry_points:
    include:
      # your other plugins here, e.g., the Lightforce parsers
      - ["nomad_simulations.schema_packages:nomad_simulations_plugin"]

This refactoring is due to the fact that runschema feels a bit complicated to understand and to use in parsers, so maybe you can give the new schema a try? Just a couple of minor remarks:

  1. It uses a very similar structure than the runschema, but it feels more natural to add certain sub-sections and extend the schema. Check this recent tutorial that we presented last week and prepared a documentation page for. Also especially for what is the NOMAD simulations schema.
  2. This is in a preliminary stage, a pre-alpha 0.0.2 version, but we aim to release an initial 0.1 version by this autumn. This is not for disencourage you, but actually to motivate into looking for it and give as many feedback as you want to improve in the current structure :slightly_smiling_face:

I hope this can help.

I actually recall that we modified the nomad.config to include parsers on top of the default ones which seems to be the case as indicated on the web gui:

About this distribution

version: 1.3.3
normalizers: normalizers/simulation/band_structure, normalizers/simulation/dos, normalizers/simulation/workflow, normalizers/simulation/soap, normalizers/simulation/spectra, normalizers/simulation/system,
parsers: parsers/abacus, parsers/abinit, parsers/aflow, parsers/amber, parsers/ams, parsers/apbs, parsers/asap, parsers/asr, parsers/atk, parsers/atomate, parsers/battery, parsers/bigdft, parsers/bopfox, parsers/castep, parsers/cg, parsers/charmm, parsers/chemotion/chemotion, parsers/cp2k, parsers/cpmd, parsers/crystal, parsers/dftbplus, parsers/dlpoly, parsers/dmol3, parsers/edmft, parsers/eelsdbparser, parsers/elabftw/elabftw, parsers/elastic, parsers/electrooptics, parsers/electrospinning, parsers/elk, parsers/exciting, parsers/fhi-aims, parsers/fhivibes, parsers/fleur, parsers/fplo, parsers/gamess, parsers/gaussian, parsers/gpaw, parsers/graphene, parsers/gromacs, parsers/gromos, parsers/gulp, parsers/h5md, parsers/lammps, parsers/libatoms, parsers/lightforge, parsers/lobster, parsers/magres, parsers/molcas, parsers/mopac, parsers/namd, parsers/nexus, parsers/nwchem, parsers/ocean, parsers/octopus, parsers/onetep, parsers/openkim, parsers/openmx, parsers/orca, parsers/phonopy, parsers/psi4, parsers/qball, parsers/qbox, parsers/quantumespresso, parsers/quantum_espresso_epw, parsers/quantum_espresso_phonon, parsers/quantum_espresso_xspectra, parsers/siesta, parsers/soliddmft, parsers/tbstudio, parsers/tinker, parsers/turbomole, parsers/vasp, parsers/w2dynamics, parsers/wannier90, parsers/wien2k, parsers/xDLVOCG, parsers/xDLVOCGhybr, parsers/xtb, parsers/yambo,
schema packages: schema/nomad-perovskite-solar-cells-database/perovskite_solar_cell_database, schema/simulation/run, schema/simulation/workflow,

Based on this schema packages seem to be identical to the ones on nomad-lab.eu. So I’m afraid there might be another issue

so we basically mount parsers/plugins into the respective containers as follows:

    volumes:
      - ./configs/nomad.yaml:/app/nomad.yaml
      - /data/nomad/.volumes/fs:/app/.volumes/fs
      - /var/run/docker.sock:/var/run/docker.sock
      - ./parsers:/app/parsers/
      - ./plugins:/app/plugins/

and include the parsers in nomad.yaml:

plugins:
   options:
     parsers/lightforge:
        python_package: lightforge_parser
     ...

Based on this schema packages seem to be identical to the ones on nomad-lab.eu. So I’m afraid there might be another issue

I see, in this case I think @mscheidgen can help better than me.

and include the parsers in nomad.yaml:

plugins:
   options:
     parsers/lightforge:
        python_package: lightforge_parser
     ...

I am a bit confused, as I thought you also need to add an include part at the same level of options, like:

plugins:
   include:
     - 'parsers/lightforge'
     - ...
   options:
     parsers/lightforge:
        python_package: lightforge_parser
     runschema:
        python_package: runschema
     ...

And by doing so, the default plugins got disconnected and hence I suggested the solution of adding runschema as well:

plugins:
   include:
     - 'parsers/lightforge'
     - 'runschema'
     - ...
   options:
     parsers/lightforge:
        python_package: lightforge_parser
     runschema:
        python_package: runschema
     ...

Maybe @laurih can help you more on this.

Hi @fabian_li!

I think your Oasis config is perfectly fine. The following config:

plugins:
   options:
     parsers/lightforge:
        python_package: lightforge_parser

Just adds the lightforge parser on top of all the defaults, which is what I think you want.

There is, however, a small issue with your plugin. As Jose mentioned we have started moving the simulation schema into a separate plugin. Your Oasis setup has imported this plugin, but is still using the old built-in simulation sections. You can fix this by modifying the imports in Lightforge/lightforge_parser/parser.py:

# Old imports
# from nomad.datamodel.metainfo.simulation.run import Run, Program
# from nomad.datamodel.metainfo.simulation.system import System
# from nomad.datamodel.metainfo.simulation.calculation import Calculation, Energy, EnergyEntry
# New imports
from runschema.run import Run, Program
from runschema.system import System
from runschema.calculation import Calculation, Energy, EnergyEntry

And modifying the metainfo sections used in Lightforge/lightforge_parser/metainfo/lightforge.py:

# Old import
# from nomad.datamodel.metainfo import simulation
# New import
import runschema.run  # pylint: disable=unused-import
import runschema.calculation  # pylint: disable=unused-import
...

class LightforgeCalculation(runschema.calculation.Calculation):
   ...

class Run(runschema.run.Run):
   ...

As a side note: I think the parser might be unintentionally creating two Run sections: Once here:

    def parse(self, filepath, archive, logger):
        sec_program = archive.m_setdefault('run.program')   # This creates Run and Program

And a second time here:

def DetailedParser(filepath, archive):
    sec_run = archive.m_create(Run)  # This will create a second Run

I think this could be fixed by just getting the Run section like this:

def DetailedParser(filepath, archive):
    sec_run = archive.run   # This will get the Run section that alread exists

Hope this helps!

1 Like

Thank you for your help. However, runschema can’t be found during local testing:

cannot import parser (exc_info=No module named 'runschema')
cannot instantiate parser. (exc_info=No module named 'runschema')
cannot import parser (exc_info=No module named 'runschema')
cannot instantiate parser. (exc_info=No module named 'runschema')
parsing was not successful (parser=parsers/lightforge, exc_info=No module named 'runschema')
Traceback (most recent call last):
  File "/home/fabi/Documents/Nomad/.jeneesh/lib/python3.10/site-packages/nomad/cli/cli.py", line 71, in run_cli
    return cli(obj=POPO())  # pylint: disable=E1120,E1123
  File "/home/fabi/Documents/Nomad/.jeneesh/lib/python3.10/site-packages/click/core.py", line 1157, in __call__
    return self.main(*args, **kwargs)
  File "/home/fabi/Documents/Nomad/.jeneesh/lib/python3.10/site-packages/click/core.py", line 1078, in main
    rv = self.invoke(ctx)
  File "/home/fabi/Documents/Nomad/.jeneesh/lib/python3.10/site-packages/click/core.py", line 1688, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
  File "/home/fabi/Documents/Nomad/.jeneesh/lib/python3.10/site-packages/click/core.py", line 1434, in invoke
    return ctx.invoke(self.callback, **ctx.params)
  File "/home/fabi/Documents/Nomad/.jeneesh/lib/python3.10/site-packages/click/core.py", line 783, in invoke
    return __callback(*args, **kwargs)
  File "/home/fabi/Documents/Nomad/.jeneesh/lib/python3.10/site-packages/nomad/cli/parse.py", line 51, in _parse
    entry_archives = parse(mainfile, **kwargs)
  File "/home/fabi/Documents/Nomad/.jeneesh/lib/python3.10/site-packages/nomad/client/processing.py", line 62, in parse
    entry_archives = parsers.run_parser(
  File "/home/fabi/Documents/Nomad/.jeneesh/lib/python3.10/site-packages/nomad/parsing/parsers.py", line 198, in run_parser
    raise e
  File "/home/fabi/Documents/Nomad/.jeneesh/lib/python3.10/site-packages/nomad/parsing/parsers.py", line 194, in run_parser
    parser.parse(mainfile_path, entry_archive, logger=logger, **kwargs)
  File "/home/fabi/Documents/Nomad/.jeneesh/lib/python3.10/site-packages/nomad/parsing/parser.py", line 398, in parse
    self.mainfile_parser.parse(mainfile, archive, logger)
  File "/home/fabi/Documents/Nomad/.jeneesh/lib/python3.10/site-packages/nomad/parsing/parser.py", line 391, in mainfile_parser
    raise e
  File "/home/fabi/Documents/Nomad/.jeneesh/lib/python3.10/site-packages/nomad/parsing/parser.py", line 386, in mainfile_parser
    Parser = self.import_parser_class()
  File "/home/fabi/Documents/Nomad/.jeneesh/lib/python3.10/site-packages/nomad/parsing/parser.py", line 401, in import_parser_class
    return import_class(self._parser_class_name, 'parser')
  File "/home/fabi/Documents/Nomad/.jeneesh/lib/python3.10/site-packages/nomad/parsing/parser.py", line 360, in import_class
    raise e
  File "/home/fabi/Documents/Nomad/.jeneesh/lib/python3.10/site-packages/nomad/parsing/parser.py", line 353, in import_class
    module = importlib.import_module(module_path)
  File "/usr/lib/python3.10/importlib/__init__.py", line 126, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1050, in _gcd_import
  File "<frozen importlib._bootstrap>", line 1027, in _find_and_load
  File "<frozen importlib._bootstrap>", line 1006, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 688, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 883, in exec_module
  File "<frozen importlib._bootstrap>", line 241, in _call_with_frames_removed
  File "/home/fabi/Documents/Nomad/parsers_from_gitlab/lightforge_parser/lightforge_parser/__init__.py", line 19, in <module>
    from .parser import LightforgeParser
  File "/home/fabi/Documents/Nomad/parsers_from_gitlab/lightforge_parser/lightforge_parser/parser.py", line 19, in <module>
    from runschema.run import Run, Program
ModuleNotFoundError: No module named 'runschema'


During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/fabi/Documents/Nomad/.jeneesh/bin/nomad", line 8, in <module>
    sys.exit(run_cli())
  File "/home/fabi/Documents/Nomad/.jeneesh/lib/python3.10/site-packages/nomad/cli/cli.py", line 75, in run_cli
    if next(arg for arg in sys.argv if arg == '-v') is not None:
StopIteration

I’ve already ran pip install nomad-lab to get latest version, but runschema still can’t be found. (And as a side note, I use export PYTHONPATH=. in the parser folder in my virtual environment).

You need to pip install the runschema, as of now it is a separated plugin of nomad-lab.

This should fix your issue (install in the local environment you are testing):

pip install nomad-schema-plugin-run@git+https://github.com/nomad-coe/nomad-schema-plugin-run.git@develop

Like said above, this schema is not released into its own package, so we have to pip install pointing to the repo (in this case, I am targetting the main branch, @develop).

Can you try and let us know?

After successfully installing runschema in my local env, parsing gives me an error about HDF5:

  File "/home/fabi/Documents/Nomad/.jeneesh/lib/python3.10/site-packages/runschema/calculation.py", line 38, in <module>
    from nomad.datamodel.hdf5 import HDF5Dataset
ModuleNotFoundError: No module named 'nomad.datamodel.hdf5'

I’ve tried pip install h5py to no avail.

What is the version of nomad-lab? The runschema in @develop seems to be using a functionality that might not be in your specific nomad-lab version.

What about doing:

pip install nomad-lab==1.3.3 --index-url https://gitlab.mpcdf.mpg.de/api/v4/projects/2187/packages/pypi/simple

I think that Jose already gave the solution, but I think that you might not need the explicit installation of runschema, because at least currently it is installed alongside nomad-lab.

You probably want to persist these requirements in pyproject.toml:

dependencies = [
    "nomad-lab==1.3.3",
    'numpy'
]

And when preparing an environment for running tests, you would do the installation with the added index url parameter as Jose mentioned:

pip install -e [tests] --index-url https://gitlab.mpcdf.mpg.de/api/v4/projects/2187/packages/pypi/simple

With this I was able to get the pytest tests running by running pytest tests in the repository root folder. For some reason the current tests in tests/test_parser.py refer to APBSParser, but I changed it to this to verify that at least something is happening:

import pytest
import logging

from nomad.datamodel import EntryArchive

from lightforge_parser import LightforgeParser


@pytest.fixture
def parser():
    return LightforgeParser()


def test_example(parser):
    archive = EntryArchive()
    parser.parse('tests/data/settings', archive, logging)

    assert archive.run[0].program.name == 'Lightforge'

After running that command I get a “validation error for plugins”:

Schema is deprecated, use plugins. ()
Traceback (most recent call last):
  File "/home/fabi/Documents/Nomad/.rly/bin/nomad", line 8, in <module>
    sys.exit(run_cli())
  File "/home/fabi/Documents/Nomad/.rly/lib/python3.10/site-packages/nomad/cli/cli.py", line 76, in run_cli
    return cli(obj=POPO())  # pylint: disable=E1120,E1123
  File "/home/fabi/Documents/Nomad/.rly/lib/python3.10/site-packages/click/core.py", line 1157, in __call__
    return self.main(*args, **kwargs)
  File "/home/fabi/Documents/Nomad/.rly/lib/python3.10/site-packages/click/core.py", line 1078, in main
    rv = self.invoke(ctx)
  File "/home/fabi/Documents/Nomad/.rly/lib/python3.10/site-packages/click/core.py", line 1688, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
  File "/home/fabi/Documents/Nomad/.rly/lib/python3.10/site-packages/click/core.py", line 1434, in invoke
    return ctx.invoke(self.callback, **ctx.params)
  File "/home/fabi/Documents/Nomad/.rly/lib/python3.10/site-packages/click/core.py", line 783, in invoke
    return __callback(*args, **kwargs)
  File "/home/fabi/Documents/Nomad/.rly/lib/python3.10/site-packages/nomad/cli/parse.py", line 73, in _parse
    from nomad.client import parse, normalize_all
  File "/home/fabi/Documents/Nomad/.rly/lib/python3.10/site-packages/nomad/client/__init__.py", line 19, in <module>
    from .archive import ArchiveQuery
  File "/home/fabi/Documents/Nomad/.rly/lib/python3.10/site-packages/nomad/client/archive.py", line 34, in <module>
    from nomad.datamodel import EntryArchive, ClientContext
  File "/home/fabi/Documents/Nomad/.rly/lib/python3.10/site-packages/nomad/datamodel/__init__.py", line 23, in <module>
    from .datamodel import (
  File "/home/fabi/Documents/Nomad/.rly/lib/python3.10/site-packages/nomad/datamodel/datamodel.py", line 29, in <module>
    from nomad.datamodel.metainfo.common import FastAccess
  File "/home/fabi/Documents/Nomad/.rly/lib/python3.10/site-packages/nomad/datamodel/metainfo/__init__.py", line 50, in <module>
    config.load_plugins()
  File "/home/fabi/Documents/Nomad/.rly/lib/python3.10/site-packages/nomad/config/models/config.py", line 1163, in load_plugins
    self.plugins = Plugins.parse_obj(_plugins)
  File "pydantic/main.py", line 526, in pydantic.main.BaseModel.parse_obj
  File "pydantic/main.py", line 341, in pydantic.main.BaseModel.__init__
pydantic.error_wrappers.ValidationError: 1 validation error for Plugins
entry_points -> include
  value is not a valid list (type=type_error.list)

I also tried setting up a clean new virtual env where I installed nomad-lab==1.3.3 without explicitly installing runschema since @laurih said it’s unnecessary, but I get same validation error. And setting dependencies to “nomad-lab==1.3.3” in pyproject.toml also makes no difference either.

Yes, this is related with the issue of using an older plugin structure.

So there are 2 possible solutions:

Solution 1 (faster) - Point to a different commit in runschema

I checked, and you can instead point to a different commit to runschema instead of @develop, to avoid the HDF5Dataset import problem. Can you try:

$ pip install nomad-schema-plugin-run@git+https://github.com/nomad-coe/nomad-schema-plugin-run.git@7217c8939191994eb1804400748885badd0c6815

Solution 2 (better on the long-term) - Update Lightforge plugin with the new entry_points structure

This will mean to change your current Github structure to the new one. I did this for another plugin and never had any issues with imports; this you can find here and you should:

  1. Change the pyproject.toml to adapt the new entry_points
  2. You can optionally follow the folder structure as you see in my example
  3. But more importantly, keep the __init__.py ase defined here
  4. Don’t forget to inherit from MatchingParser in your LightforgeParser class

The validation error probably originates actually from your repo: you have there a file Lightforge/nomad.yaml which has an incompatible plugins.include value. Try running the tests etc. after modifying it to this:

normalize:
  normalizers:
    include:
      - MetainfoNormalizer
plugins:
  # We only include our schema here. Without the explicit include, all plugins will be
  # loaded. Many build in plugins require more dependencies. Install nomad-lab[parsing]
  # to make all default plugins work.
  include:
    - 'parsers/lightforge'  # Note how this is now a list instead of a single string value
  options:
    parsers/lightforge:
      python_package: lightforge_parser

Hi @JosePizarro and @laurih
thanks for all your help so far. Sorry for such a late reply, I was away for a long time, but: I’m still having problems with my parser. Basically I want to use Jose’s Solution 2 with the new entry point structure. Because all the installations from the posts above created a mess, I created a new venv with python3.9.20, then installed nomad-lab==1.3.3 using

pip install nomad-lab==1.3.3 --index-url https://gitlab.mpcdf.mpg.de/api/v4/projects/2187/packages/pypi/simple

(because our Oasis has 1.3.3). I then followed the docs on how to develop a plugin locally using your plugin template Developing a NOMAD plugin - Documentation, until the 3 commands

git add -A
git commit -m "Generated plugin from cookiecutter template"
git push

I think I chose yes to installing the schema_package, normalizer, parser and app. I stopped following the docs here and changed src/lightforge_v2/parsers/init.py so that *.out files would be the mainfiles to be parsed. I then tested this parser using the empty default test file

nomad parse tests/data/example.out --show-archive

which worked. But I still cant create a run section: the old way of instantiating run fails, importing runschema also fails, just like importing nomad_simulations fails as well:

from nomad.datamodel.metainfo.simulation.run import Run    		     # no import error but "no-subsection-to-hold-Run-in-EntryArchive"-error at sec_run = archive.m_create(Run)
from runschema.run import Run, Program     				     # error: no module named 'runschema'
from nomad_simulations.schema_packages.general import Program, Simulation    # error: no module named 'nomad_simulations'

So basically, even though my parser now has the new entry points structure, I still have the original problem of this thread which is I cant use the run section.
How do I solve this? More precisely lets say I want to create a custom quantity called current_density under the custom subsection run.calculation.current_characteristics? In which file do I import which modules from where? Any help is greatly appreciated, and sry again for my delayed reply.

ps: my repo is at GitHub - fabianli789/LightForge_v2: lightforge parser with new entry point structure and I didnt install nomad-schema-plugin-run
Best
Fabian