The Agent Spec declares optional fields with default values inside a nested ObjectProperty. Both LangGraph and Wayflow serialize the defaults correctly, but neither runtime handles the omitted nested fields consistently during execution.
The test is:
conformance_test_suite/tests/sajal_tests/test_opn_sch_in_out.py
The input schema declares:
{
"title": "request",
"type": "object",
"properties": {
"customer_id": {
"type": "string"
},
"profile": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"age": {
"type": "integer"
}
},
"required": ["name", "age"]
},
"tags": {
"type": "array",
"items": {
"type": "string"
}
},
"priority": {
"type": "string",
"default": "normal"
},
"notifications": {
"type": "boolean",
"default": true
}
},
"required": ["customer_id", "profile", "tags"],
"additionalProperties": false
}
The test supplies a valid input containing all required fields but omits the optional defaulted fields:
{
"request": {
"customer_id": "C-1042",
"profile": {
"name": "Ada",
"age": 36
},
"tags": ["priority", "verified"]
}
}
The expected normalized request is:
{
"request": {
"customer_id": "C-1042",
"profile": {
"name": "Ada",
"age": 36
},
"tags": ["priority", "verified"],
"priority": "normal",
"notifications": True
}
}
Expected Behavior
When optional fields inside an ObjectProperty are omitted, the runtime should apply their declared defaults:
priority == "normal"
notifications is True
The tool should receive the normalized object, and the final output should conform to the declared output schema.
Actual Behavior
LangGraph
LangGraph accepts the nested input and invokes the tool, but passes None for both omitted defaulted fields:
{
"customer_id": "C-1042",
"profile": {
"name": "Ada",
"age": 36
},
"tags": ["priority", "verified"],
"priority": None,
"notifications": None
}
The resulting output contains:
{
"priority": None,
"notifications": None
}
This violates the declared output schema. The test fails when checking:
assert isinstance(result["priority"], str)
Wayflow
Wayflow rejects the same valid input during start() before the tool is invoked.
The failure occurs in:
conformance_test_suite/runtimes/wayflowruntime/src/wayflowruntime/runtime.py:67
The underlying conversion attempts to access omitted optional fields while casting the nested object and raises:
TypeError:
The input passed ... is not of the expected type ObjectProperty(...)
The error occurs even though the omitted fields have declared defaults.
Runtime Comparison
| Runtime |
Behavior |
| LangGraph |
Accepts input, but converts omitted nested defaults to None |
| Wayflow |
Rejects input during nested object casting |
| Expected |
Applies the declared defaults and continues execution |
Control Test
A separate test using a simple top-level string property with a default passes on both runtimes:
{
"title": "mode",
"type": "string",
"default": "standard"
}
Starting the flow with {} correctly produces:
This indicates that the issue is specific to default handling inside nested object properties rather than default handling in general.
Impact
The same Agent Spec produces different runtime behavior depending on whether defaulted properties are nested inside an object.
This can cause:
- Runtime incompatibility between LangGraph and Wayflow.
- Unexpected
None values in LangGraph.
- Premature input rejection in Wayflow.
- Outputs that violate the declared schema.
- Different execution behavior for the same valid Agent Spec input.
The Agent Spec declares optional fields with default values inside a nested
ObjectProperty. Both LangGraph and Wayflow serialize the defaults correctly, but neither runtime handles the omitted nested fields consistently during execution.The test is:
conformance_test_suite/tests/sajal_tests/test_opn_sch_in_out.pyThe input schema declares:
{ "title": "request", "type": "object", "properties": { "customer_id": { "type": "string" }, "profile": { "type": "object", "properties": { "name": { "type": "string" }, "age": { "type": "integer" } }, "required": ["name", "age"] }, "tags": { "type": "array", "items": { "type": "string" } }, "priority": { "type": "string", "default": "normal" }, "notifications": { "type": "boolean", "default": true } }, "required": ["customer_id", "profile", "tags"], "additionalProperties": false }The test supplies a valid input containing all required fields but omits the optional defaulted fields:
{ "request": { "customer_id": "C-1042", "profile": { "name": "Ada", "age": 36 }, "tags": ["priority", "verified"] } }The expected normalized request is:
{ "request": { "customer_id": "C-1042", "profile": { "name": "Ada", "age": 36 }, "tags": ["priority", "verified"], "priority": "normal", "notifications": True } }Expected Behavior
When optional fields inside an
ObjectPropertyare omitted, the runtime should apply their declared defaults:The tool should receive the normalized object, and the final output should conform to the declared output schema.
Actual Behavior
LangGraph
LangGraph accepts the nested input and invokes the tool, but passes
Nonefor both omitted defaulted fields:{ "customer_id": "C-1042", "profile": { "name": "Ada", "age": 36 }, "tags": ["priority", "verified"], "priority": None, "notifications": None }The resulting output contains:
{ "priority": None, "notifications": None }This violates the declared output schema. The test fails when checking:
Wayflow
Wayflow rejects the same valid input during
start()before the tool is invoked.The failure occurs in:
The underlying conversion attempts to access omitted optional fields while casting the nested object and raises:
The error occurs even though the omitted fields have declared defaults.
Runtime Comparison
NoneControl Test
A separate test using a simple top-level string property with a default passes on both runtimes:
{ "title": "mode", "type": "string", "default": "standard" }Starting the flow with
{}correctly produces:{"mode": "standard"}This indicates that the issue is specific to default handling inside nested object properties rather than default handling in general.
Impact
The same Agent Spec produces different runtime behavior depending on whether defaulted properties are nested inside an object.
This can cause:
Nonevalues in LangGraph.