You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
bug(workflow): a valid definition is refused as edge/misaligned when one fact is spelled with a space on the node and without one on its edge #2425
validateWorkflow refuses a valid workflow as edge/misaligned when one fact is spelled with a space on a node and without one on an edge — although every other rule in the engine keys that fact by its parsed spec, so the definition is runnable.
[{ "code": "edge/misaligned",
"message": "the edge \"draft.text:draft -> publish.text:draft\" does not line up: \"draft\" does not hand out \"text:draft\" or \"publish\" does not take it in" }]
Expected: ok: true, no problem — canonicalSpec already makes text: draft and text:draft one fact (#1291 debt, #1298), and the same definition runs: dependencyEdges gives draft → publish, enterNode('publish', …) is ok: true once the text:draft artifact is present and current. Flipping which side carries the space (from: 'draft.text: draft', consumer text:draft) is refused the same way.
Where
core/src/shared/workflow.js:637 — the alignment check compares the edge's canonical artifact (splitEndpoint returns formatArtifactSpec) against the node's raw inputs / outputs arrays with Array.prototype.includes. Every other consumer/producer rule in the file (producersOf, consumersOf, dependencyEdges, input/without-producer, output/without-consumer) reads those lists through canonicalSpec, so this one check disagrees with the rest of the engine. The edge/crossed-artifacts branch below it is fine (both sides are canonical there).
User impact
The Workflows page saves through workflow-store.js (core/src/host/workflow-store.js:135), which returns workflow/invalid with problems[0].message, and the client renders that message (core/src/client/workflows.js:31). So a user who writes one fact with a space on a node and without one on its edge cannot save a definition the engine can run, and the refusal it shows is false.
Red first
core/test/workflow-edge-spec.test.js (2 tests) on the base above: # tests 2 / # pass 1 / # fail 1 — the mixed-spelling test fails with the edge/misaligned problem quoted above; the genuinely-crossed control test passes. With the source change both pass: # tests 2 / # pass 2 / # fail 0.
Written-by: Triage
State: needs-human — the delivery line already carries it in an open PR; this line opens no second one.
#2425 is carried by the open PR #2427 (HugoXK:delivery1/workflow-edge-canonical-spec → delivery/ai-centric-development-service, Fixes #2425). One issue, one PR (AGENTS.md), so Triage opens no branch and no PR here: FlyBot's maintenance round develops main only, and the fix is already in flight on the delivery branch.
Blocked on: line ownership, not on the report — the site (core/src/shared/workflow.js:637) and the reproduction in the body are specific, and nothing in them needs a rewrite. Missing: a person's decision that the delivery line keeps it. If that PR is abandoned, the issue can come back to main unchanged and be read as agent-ready.
Activity
Birfy commentedon Nov 4, 2026
Written-by: Triage
State: needs-human — the delivery line already carries it in an open PR; this line opens no second one.
#2425 is carried by the open PR #2427 (
HugoXK:delivery1/workflow-edge-canonical-spec→delivery/ai-centric-development-service,Fixes #2425). One issue, one PR (AGENTS.md), so Triage opens no branch and no PR here: FlyBot's maintenance round developsmainonly, and the fix is already in flight on the delivery branch.Blocked on: line ownership, not on the report — the site (core/src/shared/workflow.js:637) and the reproduction in the body are specific, and nothing in them needs a rewrite. Missing: a person's decision that the delivery line keeps it. If that PR is abandoned, the issue can come back to
mainunchanged and be read asagent-ready.Written-by: Triage