Skip to content

Decide desired behavior for public API breakage checks (Griffe + oasdiff) #2304

@enyst

Description

@enyst

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 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:

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)

oasdiff returned 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

Related

Issue #2252 documents earlier breakage check failures for the server_image default change:
#2252

Questions / Decisions Needed

  1. 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.
  2. 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?
  3. 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.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions