Gap 3 — Synchronous execution has no parameter-binding contract
The /result request body schema includes process_graph_with_metadata, which allows declaring parameters alongside process_graph. The Defining Processes section specifies the resolution rule:
In case a parameter value is not available, the most unspecific default value from the process graph parameter definitions are used.
In practice:
- At least one backend (Copernicus Data Space) rejects graphs that contain unresolved
{"from_parameter": "<name>"} references at POST /result, even when the parameter has a default declared in the same request body.
- The openEO Python client's
Connection.download() / Connection.execute() do not forward the parameters array at all — see _build_request_with_process_graph() in the client source. So even if a backend tried to honour default-based resolution, the client strips the declaration first.
The net effect is that a graph that is valid as a UDP cannot be executed synchronously for a preview — the same graph has to be materialised into a parameter-free copy before POST /result. We shipped a client-side walker that substitutes {"from_parameter": name} with the declared default before download ([link to our implementation omitted]). That's a workable workaround but it duplicates logic the spec already describes for UDP resolution.
Suggested direction. Clarify in the /result section of the spec:
- Whether backends MUST resolve
{"from_parameter": ...} nodes using declared defaults when no value is provided (the current language can be read either way).
- Whether backends MAY accept a runtime-value-binding mechanism at
/result (e.g. a "parameter_values": {"bounding_box": {...}} sibling of "process_graph") to let the same graph run with different inputs without re-uploading it. This would close the gap with /services and UDP invocation.
If either behaviour is already intended, a one-line clarification plus a conformance test would be enough. If it's deliberately out of scope for synchronous execution, saying so explicitly would save the next person from building what we just built.
Gap 3 — Synchronous execution has no parameter-binding contract
The
/resultrequest body schema includesprocess_graph_with_metadata, which allows declaringparametersalongsideprocess_graph. The Defining Processes section specifies the resolution rule:In practice:
{"from_parameter": "<name>"}references atPOST /result, even when the parameter has a default declared in the same request body.Connection.download()/Connection.execute()do not forward theparametersarray at all — see_build_request_with_process_graph()in the client source. So even if a backend tried to honour default-based resolution, the client strips the declaration first.The net effect is that a graph that is valid as a UDP cannot be executed synchronously for a preview — the same graph has to be materialised into a parameter-free copy before
POST /result. We shipped a client-side walker that substitutes{"from_parameter": name}with the declared default before download ([link to our implementation omitted]). That's a workable workaround but it duplicates logic the spec already describes for UDP resolution.Suggested direction. Clarify in the
/resultsection of the spec:{"from_parameter": ...}nodes using declared defaults when no value is provided (the current language can be read either way)./result(e.g. a"parameter_values": {"bounding_box": {...}}sibling of"process_graph") to let the same graph run with different inputs without re-uploading it. This would close the gap with/servicesand UDP invocation.If either behaviour is already intended, a one-line clarification plus a conformance test would be enough. If it's deliberately out of scope for synchronous execution, saying so explicitly would save the next person from building what we just built.