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
While reviewing release PR #2302 (rel-1.12.0), the API breakage bot posted a "Result: Failed" comment for the Griffe checks, but the workflow run still concluded success, so the PR did not show a failing check.
Update (2026-03-04): Root cause identified: both workflows read PIPESTATUS after echo, so the breakage step always exits 0. Verified on test PR #2307 (now closed); fix proposed in PR #2309.
What happened in CI (from the logs)
Griffe (SDK public API)
The job log shows exit_code=1 with multiple breakages:
SDK:LLM.top_p default changed from 1.0 to None (reported as ATTRIBUTE_CHANGED_VALUE).
Issue #2252 documents earlier breakage check failures for the server_image default change: #2252
Questions / Decisions Needed
Should rel- PRs fail the check when Griffe returns non-zero?*
The workflow comment says yes, but this run still succeeds.
If it should fail, where is the behavior diverging (e.g., github.head_ref being empty, or continue-on-error not applied as expected)? Root cause found: step reads PIPESTATUS after echo, masking failures. Fix proposed in PR Fix API breakage workflow exit codes #2309.
Should default value changes (e.g., LLM.top_p Field default) require a deprecation path?
Today they only trigger the SemVer bump requirement, not deprecation.
Is that the intended policy for attribute/default changes?
Should oasdiff exit codes like 102 (warnings/no JSON) be treated as failures or still pass?
If we can align on the desired behavior, I can follow up with changes to either the workflows or the scripts.
Context
While reviewing release PR #2302 (
rel-1.12.0), the API breakage bot posted a "Result: Failed" comment for the Griffe checks, but the workflow run still concluded success, so the PR did not show a failing check.Update (2026-03-04): Root cause identified: both workflows read
PIPESTATUSafterecho, so the breakage step always exits 0. Verified on test PR #2307 (now closed); fix proposed in PR #2309.What happened in CI (from the logs)
Griffe (SDK public API)
The job log shows exit_code=1 with multiple breakages:
LLM.top_pdefault changed from1.0toNone(reported asATTRIBUTE_CHANGED_VALUE).DockerDevWorkspace.server_imagedefault changed toNone(same as issue CI: API breakage checks failing on all PRs due to DockerDevWorkspace.server_image change #2252).BrowserToolSet,get_agent_factory, andregister_agentremoved fromopenhands.tools.__all__without prior deprecation.Despite the non-zero exit code, the GitHub Actions run still concludes success and does not fail the PR.
Log snippet: https://github.com/OpenHands/software-agent-sdk/actions/runs/22687837023/job/65775442806
OpenAPI / oasdiff (agent-server REST API)
oasdiffreturned exit code 102 but produced no breaking changes JSON. The script treats this as warnings-only and returns 0 (success).Log snippet: https://github.com/OpenHands/software-agent-sdk/actions/runs/22687836999/job/65775442461
Documented expectations in repo
continue-on-erroraccordingly..github/workflows/api-breakage.ymllines 24–33: https://github.com/OpenHands/software-agent-sdk/blob/main/.github/workflows/api-breakage.yml#L24-L33.github/workflows/agent-server-rest-api-breakage.ymllines 26–41: https://github.com/OpenHands/software-agent-sdk/blob/main/.github/workflows/agent-server-rest-api-breakage.yml#L26-L41__all__.check_sdk_api_breakage.pydocstring: https://github.com/OpenHands/software-agent-sdk/blob/main/.github/scripts/check_sdk_api_breakage.py#L2-L26check_agent_server_rest_api_breakage.pydocstring: https://github.com/OpenHands/software-agent-sdk/blob/main/.github/scripts/check_agent_server_rest_api_breakage.py#L2-L18Related
Issue #2252 documents earlier breakage check failures for the
server_imagedefault change:#2252
Questions / Decisions Needed
If it should fail, where is the behavior diverging (e.g.,Root cause found: step readsgithub.head_refbeing empty, orcontinue-on-errornot applied as expected)?PIPESTATUSafterecho, masking failures. Fix proposed in PR Fix API breakage workflow exit codes #2309.LLM.top_pField default) require a deprecation path?oasdiffexit codes like102(warnings/no JSON) be treated as failures or still pass?If we can align on the desired behavior, I can follow up with changes to either the workflows or the scripts.