Skip to content

fix(schema): suppress noisy tracebacks on schema validation errors#957

Merged
hneiva merged 2 commits into
mainfrom
hneiva/schema-exception-handling
May 21, 2026
Merged

fix(schema): suppress noisy tracebacks on schema validation errors#957
hneiva merged 2 commits into
mainfrom
hneiva/schema-exception-handling

Conversation

@hneiva
Copy link
Copy Markdown
Contributor

@hneiva hneiva commented May 20, 2026

Schema violations are user-input/project errors, not taskgraph bugs, so the deep generator-chain traceback add no value in printing the traceback.

Introduces SchemaValidationError and have the kind loader and top-level CLI handler log just the message instead of printing a huge useless stacktrace.

@hneiva hneiva requested a review from a team as a code owner May 20, 2026 18:34
@hneiva hneiva requested a review from jcristau May 20, 2026 18:34
@bhearsum
Copy link
Copy Markdown
Contributor

Can you provide a before and after example? It almost sounds like you're saying this will suppress the details of a schema validation failure (ie: which fields failed to validate and why), which would not be desirable IMO.

@codecov
Copy link
Copy Markdown

codecov Bot commented May 20, 2026

Codecov Report

❌ Patch coverage is 90.58824% with 8 lines in your changes missing coverage. Please review.
✅ Project coverage is 77.72%. Comparing base (cbf4c5c) to head (6130b57).

Files with missing lines Patch % Lines
src/taskgraph/generator.py 62.50% 3 Missing ⚠️
test/test_generator.py 91.66% 2 Missing ⚠️
test/test_main.py 90.90% 2 Missing ⚠️
test/test_util_schema.py 95.83% 1 Missing ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##             main     #957      +/-   ##
==========================================
+ Coverage   77.63%   77.72%   +0.09%     
==========================================
  Files         130      130              
  Lines       12063    12137      +74     
  Branches     1476     1477       +1     
==========================================
+ Hits         9365     9434      +69     
- Misses       2309     2315       +6     
+ Partials      389      388       -1     

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@hneiva
Copy link
Copy Markdown
Contributor Author

hneiva commented May 20, 2026

Before:

2026-05-20 11:43:30,899 - ERROR - Error loading tasks for kind check:
Traceback (most recent call last):
  File "/Users/hneiva/dev/taskgraph/src/taskgraph/util/schema.py", line 461, in validate
    msgspec.convert(data, cls)
msgspec.ValidationError: Object contains unknown field `foo`

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/Users/hneiva/dev/taskgraph/src/taskgraph/util/schema.py", line 47, in validate_schema
    schema.validate(obj)
  File "/Users/hneiva/dev/taskgraph/src/taskgraph/util/schema.py", line 463, in validate
    raise msgspec.ValidationError(str(e))
msgspec.ValidationError: Object contains unknown field `foo`

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/Users/hneiva/dev/taskgraph/src/taskgraph/generator.py", line 297, in _load_tasks_serial
    new_tasks = kind.load_tasks(
                ^^^^^^^^^^^^^^^^
  File "/Users/hneiva/dev/taskgraph/src/taskgraph/generator.py", line 108, in load_tasks
    for task_dict in transforms(trans_config, inputs)
                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/hneiva/dev/taskgraph/src/taskgraph/transforms/task.py", line 1163, in chain_of_trust
    for task in tasks:
                ^^^^^
  File "/Users/hneiva/dev/taskgraph/src/taskgraph/transforms/task.py", line 1156, in add_github_checks
    for task in tasks:
                ^^^^^
  File "/Users/hneiva/dev/taskgraph/src/taskgraph/transforms/task.py", line 979, in build_task
    for task in tasks:
                ^^^^^
  File "/Users/hneiva/dev/taskgraph/src/taskgraph/transforms/task.py", line 947, in add_index_routes
    for task in tasks:
                ^^^^^
  File "/Users/hneiva/dev/taskgraph/src/taskgraph/transforms/task.py", line 875, in process_treeherder_metadata
    for task in tasks:
                ^^^^^
  File "/Users/hneiva/dev/taskgraph/src/taskgraph/transforms/task.py", line 838, in validate
    validate_schema(
  File "/Users/hneiva/dev/taskgraph/src/taskgraph/util/schema.py", line 70, in validate_schema
    raise Exception(f"{msg_prefix}\n{str(exc)}\n{pprint.pformat(obj)}")
Exception: In task 'check-type':
Object contains unknown field `foo`
{'always-target': False,
 'attributes': {'code-review': True, 'retrigger': True},
 'dependencies': {},
 'description': 'Run type checking against src with Pyright',
 'extra': {},
 'foo': 'bar',
 'label': 'check-type',
 'needs-sccache': False,
 'optimization': None,
 'routes': [],
 'scopes': [],
 'soft-dependencies': [],
 'tags': {'os': 'linux', 'worker-implementation': 'docker-worker'},
 'task-from': 'kind.yml',
 'treeherder': {'kind': 'test',
                'platform': 'test/opt',
                'symbol': 'check(type)',
                'tier': 1},
 'worker': {'allow-ptrace': False,
            'caches': [{'mount-point': '/builds/worker/checkouts',
                        'name': 'checkouts',
                        'skip-untrusted': False,
                        'type': 'persistent'},
                       {'mount-point': '/builds/worker/.task-cache/uv',
                        'name': 'uv',
                        'skip-untrusted': False,
                        'type': 'persistent'}],
            'chain-of-trust': False,
            'command': ['/usr/local/bin/run-task',
                        '--ci-checkout=/builds/worker/checkouts/vcs/',
                        '--task-cwd',
                        '/builds/worker/checkouts/vcs',
                        '--',
                        'bash',
                        '-cx',
                        'uv run --all-extras pyright'],
            'docker-image': {'in-tree': 'python'},
            'env': {'CI_BASE_REPOSITORY': '[email protected]:taskcluster/taskgraph.git',
                    'CI_HEAD_REF': 'main',
                    'CI_HEAD_REPOSITORY': '[email protected]:taskcluster/taskgraph.git',
                    'CI_HEAD_REV': 'cbf4c5cba35181da3b81f06ad7d57e647f9cbf23',
                    'CI_REPOSITORY_TYPE': 'git',
                    'HGENCODING': 'utf-8',
                    'HG_STORE_PATH': '/builds/worker/checkouts/hg-store',
                    'LC_ALL': 'C',
                    'MOZ_SCM_LEVEL': '3',
                    'PYTHONCOERCECLOCALE': '0',
                    'PYTHONUTF8': '0',
                    'REPOSITORIES': '{"ci":"Taskgraph"}',
                    'UV_CACHE_DIR': '/builds/worker/.task-cache/uv',
                    'VCS_PATH': '/builds/worker/checkouts/vcs'},
            'implementation': 'docker-worker',
            'loopback-video': False,
            'max-run-time': 600,
            'os': 'linux',
            'taskcluster-proxy': True,
            'volumes': []},
 'worker-type': 't-linux'}
Traceback (most recent call last):
  File "/Users/hneiva/dev/taskgraph/src/taskgraph/util/schema.py", line 461, in validate
    msgspec.convert(data, cls)
msgspec.ValidationError: Object contains unknown field `foo`

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/Users/hneiva/dev/taskgraph/src/taskgraph/util/schema.py", line 47, in validate_schema
    schema.validate(obj)
  File "/Users/hneiva/dev/taskgraph/src/taskgraph/util/schema.py", line 463, in validate
    raise msgspec.ValidationError(str(e))
msgspec.ValidationError: Object contains unknown field `foo`

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/Users/hneiva/dev/taskgraph/src/taskgraph/main.py", line 1209, in main
    return args.command(vars(args))
           ^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/hneiva/dev/taskgraph/src/taskgraph/main.py", line 541, in show_taskgraph
    ret = generate_taskgraph(options, parameters, overrides, logdir)
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/hneiva/dev/taskgraph/src/taskgraph/main.py", line 218, in generate_taskgraph
    out = format_taskgraph(options, spec, overrides, logfile(spec))
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/hneiva/dev/taskgraph/src/taskgraph/main.py", line 174, in format_taskgraph
    tg = getattr(tgg, options["graph_attr"])
         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/hneiva/dev/taskgraph/src/taskgraph/generator.py", line 193, in full_task_graph
    return self._run_until("full_task_graph")
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/hneiva/dev/taskgraph/src/taskgraph/generator.py", line 584, in _run_until
    k, v = next(self._run)  # type: ignore
           ^^^^^^^^^^^^^^^
  File "/Users/hneiva/dev/taskgraph/src/taskgraph/generator.py", line 479, in _run
    all_tasks = load_tasks()
                ^^^^^^^^^^^^
  File "/Users/hneiva/dev/taskgraph/src/taskgraph/generator.py", line 472, in load_tasks
    return self._load_tasks_serial(kinds, kind_graph, parameters)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/hneiva/dev/taskgraph/src/taskgraph/generator.py", line 297, in _load_tasks_serial
    new_tasks = kind.load_tasks(
                ^^^^^^^^^^^^^^^^
  File "/Users/hneiva/dev/taskgraph/src/taskgraph/generator.py", line 108, in load_tasks
    for task_dict in transforms(trans_config, inputs)
                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/hneiva/dev/taskgraph/src/taskgraph/transforms/task.py", line 1163, in chain_of_trust
    for task in tasks:
                ^^^^^
  File "/Users/hneiva/dev/taskgraph/src/taskgraph/transforms/task.py", line 1156, in add_github_checks
    for task in tasks:
                ^^^^^
  File "/Users/hneiva/dev/taskgraph/src/taskgraph/transforms/task.py", line 979, in build_task
    for task in tasks:
                ^^^^^
  File "/Users/hneiva/dev/taskgraph/src/taskgraph/transforms/task.py", line 947, in add_index_routes
    for task in tasks:
                ^^^^^
  File "/Users/hneiva/dev/taskgraph/src/taskgraph/transforms/task.py", line 875, in process_treeherder_metadata
    for task in tasks:
                ^^^^^
  File "/Users/hneiva/dev/taskgraph/src/taskgraph/transforms/task.py", line 838, in validate
    validate_schema(
  File "/Users/hneiva/dev/taskgraph/src/taskgraph/util/schema.py", line 70, in validate_schema
    raise Exception(f"{msg_prefix}\n{str(exc)}\n{pprint.pformat(obj)}")
Exception: In task 'check-type':
Object contains unknown field `foo`

After:

2026-05-20 11:44:12,460 - ERROR - Error loading tasks for kind check:
In task 'check-type':
Object contains unknown field `foo`

The stacktrace adds no value and doesn't point to where the error is. The only part that is valuable there is the kind name and what the error was.
(in case any other error type happens, it will bubble up and a trace will be printed)

@bhearsum
Copy link
Copy Markdown
Contributor

I agree that the full stack trace doesn't have value. Is there a way we can preserve the printing of the full object that fails the validation while still avoiding printing the full stack? (Seeing the full object available can often help offer clues as to where or what is wrong.)

@hneiva
Copy link
Copy Markdown
Contributor Author

hneiva commented May 20, 2026

Also good to note that schema violations were printing the stacktrace twice.
Once by the generator, then again by main.
Neither knew the other had already printed it. This changes it, it keeps the first print only when there's something useful to see (real bugs), and skips both for SchemaValidationError since the message alone is the actionable part.

@hneiva
Copy link
Copy Markdown
Contributor Author

hneiva commented May 20, 2026

Sorry, I omitted the [last] object printing on both cases there.
As my last message stated, the stacktrace + object printing was happening twice.

It still prints on the new code, I just omitted for brevity.

@bhearsum
Copy link
Copy Markdown
Contributor

I wasn't able to verify your "after" situation. It looks like at least some types of schema validations are eaten with this patch :( :

~/repos/taskgraph @ca658506 !1 ❯ jj
@  tmwqwmkv [email protected] 2026-05-20 15:09:38 9a2b6053
│  (empty) (no description set)
○  zplqvqrr [email protected] 2026-05-20 15:08:53 ca658506
│  (no description set)
◆  ulwpukux [email protected] 2026-05-20 14:30:46 hneiva/schema-exception-handling@upstream 04d92506
│  fix(schema): suppress noisy tracebacks on schema validation errors
~
~/repos/taskgraph @ca658506 !1 ❯ jj show z
Commit ID: ca658506485322d252fc7d53a1c6ce741c8afe8f
Change ID: zplqvqrryqsttknxowllrmrkntkuyqyx
Author   : Ben Hearsum <[email protected]> (2026-05-20 15:08:10)
Committer: Ben Hearsum <[email protected]> (2026-05-20 15:08:53)

    (no description set)

diff --git a/taskcluster/self_taskgraph/transforms/push_image.py b/taskcluster/self_taskgraph/transforms/push_image.py
index cb8042a248..fb2713ae9f 100644
--- a/taskcluster/self_taskgraph/transforms/push_image.py
+++ b/taskcluster/self_taskgraph/transforms/push_image.py
@@ -26,4 +26,5 @@
                 "VCS_HEAD_REV": config.params["head_rev"],
             }
         )
+        task["foo"] = "bar"
         yield task
~/repos/taskgraph @ca658506 !1 ❯ uv run taskgraph tasks
2026-05-20 15:09:46,402 - INFO - Loading graph configuration.
2026-05-20 15:09:46,419 - INFO - Using Parameters(id=bb4f34d63537) (from defaults)
2026-05-20 15:09:46,419 - INFO - Loading kinds
2026-05-20 15:09:46,421 - INFO - Generating full task set
2026-05-20 15:09:46,443 - INFO - Generated 1 tasks for kind doc
2026-05-20 15:09:46,443 - INFO - Generated 1 tasks for kind check
2026-05-20 15:09:46,443 - INFO - Generated 1 tasks for kind fetch
2026-05-20 15:09:46,445 - INFO - Generated 6 tasks for kind docker-image
2026-05-20 15:09:46,455 - INFO - Generated 11 tasks for kind test

When applying the same local change to main, I get an exception:

~/repos/taskgraph @cbf4c5cb !1 ❯ uv run taskgraph tasks                                 
2026-05-20 15:08:27,589 - INFO - Loading graph configuration.
2026-05-20 15:08:27,605 - INFO - Using Parameters(id=f602286055d9) (from defaults)
2026-05-20 15:08:27,605 - INFO - Loading kinds
2026-05-20 15:08:27,607 - INFO - Generating full task set
2026-05-20 15:08:27,631 - INFO - Generated 1 tasks for kind fetch
2026-05-20 15:08:27,631 - INFO - Generated 1 tasks for kind check
2026-05-20 15:08:27,631 - INFO - Generated 1 tasks for kind doc
2026-05-20 15:08:27,636 - INFO - Generated 6 tasks for kind docker-image
concurrent.futures.process._RemoteTraceback: 
"""
Traceback (most recent call last):
  File "/home/bhearsum/repos/taskgraph/src/taskgraph/util/schema.py", line 461, in validate
    msgspec.convert(data, cls)
    ~~~~~~~~~~~~~~~^^^^^^^^^^^
msgspec.ValidationError: Object contains unknown field `foo`

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/bhearsum/repos/taskgraph/src/taskgraph/util/schema.py", line 47, in validate_schema
    schema.validate(obj)
    ~~~~~~~~~~~~~~~^^^^^
  File "/home/bhearsum/repos/taskgraph/src/taskgraph/util/schema.py", line 463, in validate
    raise msgspec.ValidationError(str(e))
msgspec.ValidationError: Object contains unknown field `foo`

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/lib/python3.13/concurrent/futures/process.py", line 254, in _process_worker
    r = call_item.fn(*call_item.args, **call_item.kwargs)
  File "/home/bhearsum/repos/taskgraph/src/taskgraph/generator.py", line 108, in load_tasks
    for task_dict in transforms(trans_config, inputs)
                     ~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^
  File "/home/bhearsum/repos/taskgraph/src/taskgraph/transforms/task.py", line 1163, in chain_of_trust
    for task in tasks:
                ^^^^^
  File "/home/bhearsum/repos/taskgraph/src/taskgraph/transforms/task.py", line 1156, in add_github_checks
    for task in tasks:
                ^^^^^
  File "/home/bhearsum/repos/taskgraph/src/taskgraph/transforms/task.py", line 979, in build_task
    for task in tasks:
                ^^^^^
  File "/home/bhearsum/repos/taskgraph/src/taskgraph/transforms/task.py", line 947, in add_index_routes
    for task in tasks:
                ^^^^^
  File "/home/bhearsum/repos/taskgraph/src/taskgraph/transforms/task.py", line 875, in process_treeherder_metadata
    for task in tasks:
                ^^^^^
  File "/home/bhearsum/repos/taskgraph/src/taskgraph/transforms/task.py", line 838, in validate
    validate_schema(
    ~~~~~~~~~~~~~~~^
        task_description_schema,
        ^^^^^^^^^^^^^^^^^^^^^^^^
        task,
        ^^^^^
        "In task {!r}:".format(task.get("label", "?no-label?")),
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    )
    ^
  File "/home/bhearsum/repos/taskgraph/src/taskgraph/util/schema.py", line 70, in validate_schema
    raise Exception(f"{msg_prefix}\n{str(exc)}\n{pprint.pformat(obj)}")
Exception: In task 'push-image-run-task':
Object contains unknown field `foo`
{'always-target': False,
 'attributes': {},
 'dependencies': {'image': 'docker-image-run-task'},
 'description': 'Upload {name} image to '
                'https://hub.docker.com/u/mozillareleases',
 'extra': {},
 'foo': 'bar',
 'label': 'push-image-run-task',
 'needs-sccache': False,
 'optimization': None,
 'routes': [],
 'run-on-tasks-for': ['github-release'],
 'scopes': ['secrets:get:project/taskgraph/level-3/dockerhub'],
 'soft-dependencies': [],
 'tags': {'os': 'linux', 'worker-implementation': 'docker-worker'},
 'task-from': 'kind.yml',
 'worker': {'allow-ptrace': False,
            'artifacts': [{'name': 'public/',
                           'path': '/builds/worker/artifacts/',
                           'type': 'directory'}],
            'chain-of-trust': True,
            'command': ['/usr/local/bin/run-task',
                        '--',
                        'bash',
                        '-cx',
                        'bash /usr/local/bin/push_image.sh'],
            'docker-image': {'in-tree': 'skopeo'},
            'env': {'DOCKER_REPO': 'mozillareleases/taskgraph',
                    'MOZ_FETCHES': {'task-reference': '[{"artifact":"public/image.tar.zst","extract":false,"task":"<image>"}]'},
                    'MOZ_FETCHES_DIR': 'fetches',
                    'MOZ_SCM_LEVEL': '3',
                    'NAME': 'run-task',
                    'VCS_HEAD_REPOSITORY': '[email protected]:bhearsum/taskgraph.git',
                    'VCS_HEAD_REV': 'cbf4c5cba35181da3b81f06ad7d57e647f9cbf23',
                    'VERSION': '23.0.0'},
            'implementation': 'docker-worker',
            'loopback-video': False,
            'max-run-time': 1800,
            'os': 'linux',
            'taskcluster-proxy': True,
            'volumes': []},
 'worker-type': 'images'}
"""

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/home/bhearsum/repos/taskgraph/src/taskgraph/main.py", line 1209, in main
    return args.command(vars(args))
           ~~~~~~~~~~~~^^^^^^^^^^^^
  File "/home/bhearsum/repos/taskgraph/src/taskgraph/main.py", line 541, in show_taskgraph
    ret = generate_taskgraph(options, parameters, overrides, logdir)
  File "/home/bhearsum/repos/taskgraph/src/taskgraph/main.py", line 218, in generate_taskgraph
    out = format_taskgraph(options, spec, overrides, logfile(spec))
  File "/home/bhearsum/repos/taskgraph/src/taskgraph/main.py", line 174, in format_taskgraph
    tg = getattr(tgg, options["graph_attr"])
  File "/home/bhearsum/repos/taskgraph/src/taskgraph/generator.py", line 183, in full_task_set
    return self._run_until("full_task_set")
           ~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^
  File "/home/bhearsum/repos/taskgraph/src/taskgraph/generator.py", line 584, in _run_until
    k, v = next(self._run)  # type: ignore
           ~~~~^^^^^^^^^^^
  File "/home/bhearsum/repos/taskgraph/src/taskgraph/generator.py", line 479, in _run
    all_tasks = load_tasks()
  File "/home/bhearsum/repos/taskgraph/src/taskgraph/generator.py", line 465, in load_tasks
    return self._load_tasks_parallel(
           ~~~~~~~~~~~~~~~~~~~~~~~~~^
        kinds, kind_graph, parameters, executor
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    )
    ^
  File "/home/bhearsum/repos/taskgraph/src/taskgraph/generator.py", line 361, in _load_tasks_parallel
    raise exc
Exception: In task 'push-image-run-task':
Object contains unknown field `foo`
{'always-target': False,
 'attributes': {},
 'dependencies': {'image': 'docker-image-run-task'},
 'description': 'Upload {name} image to '
                'https://hub.docker.com/u/mozillareleases',
 'extra': {},
 'foo': 'bar',
 'label': 'push-image-run-task',
 'needs-sccache': False,
 'optimization': None,
 'routes': [],
 'run-on-tasks-for': ['github-release'],
 'scopes': ['secrets:get:project/taskgraph/level-3/dockerhub'],
 'soft-dependencies': [],
 'tags': {'os': 'linux', 'worker-implementation': 'docker-worker'},
 'task-from': 'kind.yml',
 'worker': {'allow-ptrace': False,
            'artifacts': [{'name': 'public/',
                           'path': '/builds/worker/artifacts/',
                           'type': 'directory'}],
            'chain-of-trust': True,
            'command': ['/usr/local/bin/run-task',
                        '--',
                        'bash',
                        '-cx',
                        'bash /usr/local/bin/push_image.sh'],
            'docker-image': {'in-tree': 'skopeo'},
            'env': {'DOCKER_REPO': 'mozillareleases/taskgraph',
                    'MOZ_FETCHES': {'task-reference': '[{"artifact":"public/image.tar.zst","extract":false,"task":"<image>"}]'},
                    'MOZ_FETCHES_DIR': 'fetches',
                    'MOZ_SCM_LEVEL': '3',
                    'NAME': 'run-task',
                    'VCS_HEAD_REPOSITORY': '[email protected]:bhearsum/taskgraph.git',
                    'VCS_HEAD_REV': 'cbf4c5cba35181da3b81f06ad7d57e647f9cbf23',
                    'VERSION': '23.0.0'},
            'implementation': 'docker-worker',
            'loopback-video': False,
            'max-run-time': 1800,
            'os': 'linux',
            'taskcluster-proxy': True,
            'volumes': []},
 'worker-type': 'images'}
2026-05-20 15:08:27,650 - INFO - Generated 11 tasks for kind test

hneiva added 2 commits May 21, 2026 08:42
Schema violations are user-input/project errors, not taskgraph bugs,
so the deep generator-chain traceback add no value in printing the traceback
Introduce SchemaValidationError and have the kind loader and top-level CLI
handler log just the message instead of printing a huge useless stacktrace.
@hneiva hneiva force-pushed the hneiva/schema-exception-handling branch from 04d9250 to 6130b57 Compare May 21, 2026 15:44
@hneiva hneiva merged commit 320a2d5 into main May 21, 2026
22 checks passed
@hneiva hneiva deleted the hneiva/schema-exception-handling branch May 21, 2026 18:13
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants