Relationships
#1744 ExtensionWorkflowRepository scans manifest.yaml as a workflow, emitting 'Unknown key manifestVersion' warning
Opened by svendowideit · 8/20/2026· Shipped 8/22/2026
Summary
ExtensionWorkflowRepository walks the extension workflows directory recursively for *.yaml files and treats every one as a workflow definition. It has no skip for manifest.yaml / manifest.yml, so an extension that uses the paths.base: manifest layout (manifest co-located with its workflows) triggers a spurious warning on every swamp serve / swamp doctor workflows / workflow scan.
Reproduction
- Create an extension with
paths.base: manifestwhosemanifest.yamlsits in the same directory as its workflow YAML files, e.g.:
extensions/workflows/news/
manifest.yaml # has manifestVersion: 1, name, version, models, workflows, ...
news.yaml # workflow
news-fusion.yaml # workflow- Run
swamp serve(orswamp doctor workflows).
Expected
The manifest is recognized as an extension manifest and skipped by the workflow scanner. No warning.
Actual
warning extension-workflow-repo Skipping broken extension workflow
"/home/[REDACTED]/src/swamp-project/extensions/workflows/news/manifest.yaml":
"Unknown key 'manifestVersion' on workflow '@svendowideit/news'.
Valid workflow keys: id, name, description, trigger, tags, inputs, jobs,
version, concurrency, reports, target, labels, platform, queueTimeout"swamp doctor workflows reports OVERALL: FAIL because of this one file, even though all real workflows load fine.
Root cause
src/infrastructure/persistence/extension_workflow_repository.ts findAll():
for await (const entry of walk(dir, { exts: [".yaml"], includeDirs: false })) {
const content = await Deno.readTextFile(entry.path);
const data = parseYaml(content) as WorkflowData;
const workflow = Workflow.fromData(data); // rejects manifestVersion
...
}There is no filter to skip manifest.yaml / manifest.yml. Workflow.fromData → WorkflowSchema uses rejectUnknownKeys("workflow", ...), which throws on the manifest's manifestVersion key.
Why this matters
- The
paths.base: manifestlayout is the documented, rubric-rewarded layout (README/LICENSE at archive root, manifest co-located with source). Any extension using it with workflows will emit this warning. - It's cosmetic (the extension and its workflows still load correctly — the extension loader and workflow scanner are separate code paths), but it's noisy and makes
swamp doctor workflowsreport a false FAIL.
Suggested fix
Skip manifest files in the walk. The extension loader already recognizes manifest.yaml and manifest.yml (see src/domain/extensions/manifest_cross_kind_discovery.ts MANIFEST_FILENAMES). The workflow scanner should do the same — e.g. filter entry.name against manifest.yaml / manifest.yml (or add a skip regex to the walk options).
Environment
- swamp version: 20260818.022435.0-sha.4ed5cc7b
- Reproduced on latest tag v20260820.011410.0-sha.23de2d5a (scanner code unchanged since #500)
Shipped
Click a lifecycle step above to view its details.
svendowideit commented 8/20/2026, 6:41:08 AM
gosh, dsv4-pro is mean :)
stack72 commented 8/22/2026, 10:02:03 PM
Thanks @svendowideit for reporting this! The fix has been merged and a release is on its way. We appreciate your contribution to swamp.
svendowideit commented 10/2/2026, 4:15:41 AM
Still reproducing in 20261002.000056.0-sha.a1e4cae5 — but only partially. The fix here covered ExtensionWorkflowRepository, which now skips manifest.yaml/manifest.yml. However doctorWorkflows() in src/libswamp/workflows/doctor.ts does its own walk and has no manifest skip, so swamp doctor workflows still reports ten Unknown key 'manifestVersion' on workflow failures and exits 1 on this repo.
Filed #2940 for the remaining doctor path plus the broader case that neither path handles: a shipped, manifest-declared additionalFiles: YAML that is not a workflow at all (e.g. a test-factory.yaml whose root keys are networks:/tests:) is also fed to Workflow.fromData() and warned about on every extension push --dry-run.
Sign in to post a ripple.