Skip to content

chore: refresh the contract to 26.10.1-SNAPSHOT - #83

Merged
robfrank merged 2 commits into
mainfrom
chore/contract-refresh
Oct 5, 2026
Merged

robfrank merged 2 commits into
mainfrom
chore/contract-refresh

Conversation

@github-actions

@github-actions github-actions Bot commented Sep 30, 2026 •

Copy link
Copy Markdown
Contributor

Refreshes the committed contract to 26.10.1-SNAPSHOT, regenerates every client, and
retires the previous version's artifacts and references.

One or more clients FAIL against arcadedata/arcadedb:26.10.1-SNAPSHOT. See the run for which stage.

  • @arcadedb/driver (TypeScript): passing
  • arcadedb-driver (Python): failing
  • github.com/ArcadeData/arcadedb-drivers/go/arcadedb (Go): passing

Closes ##76
#76 (comment)
76

Opened automatically by .github/workflows/contract-watch.yml, force-pushed
in place each day the contract moves.

@github-actions
github-actions Bot force-pushed the chore/contract-refresh branch 4 times, most recently from ec89830 to 6d5a376 Compare October 4, 2026 11:09
Opened by the daily contract watch. Regenerated from arcadedata/arcadedb:26.10.1-SNAPSHOT, with the previous
version retired by scripts/adopt-contract-version.sh.

Refs ##76
#76 (comment)
76
@github-actions
github-actions Bot force-pushed the chore/contract-refresh branch from 6d5a376 to 3155e17 Compare October 5, 2026 12:20
26.10.1-SNAPSHOT makes NdJsonQueryEvent.error.status required (upstream
issue #8235), so the regenerated model raises KeyError on the old
{"message": "boom"} fixture before the facade can turn it into an
ArcadeDBError. The fixtures now match what the server sends.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@claude

claude Bot commented Oct 5, 2026

Copy link
Copy Markdown

Review

This is a mechanical contract-refresh PR (chore/contract-refresh, opened by contract-watch.yml). Scope-wise it's clean:

  • contracts/ still holds exactly one OpenAPI JSON and one .proto, both updated in place (same 26.10.1-SNAPSHOT name, so no adopt-contract-version.sh run was needed, and none of the version-stamped manifests/version.go files needed touching — consistent with the root CLAUDE.md's description of what a same-version refresh does).
  • Every other changed file sits under a _generated/generated/gen directory, i.e. nothing hand-edits generated output.
  • The one non-generated file touched, python/packages/driver/tests/test_stream.py, is a legitimate test fix (adding "status": 500 to two mocked in-band error payloads) rather than a hand-edit of generated code — needed because NdJsonQueryEventError.message/.status became required fields.

Finding worth a follow-up: the new status/exception/exception_args fields on NdJsonQueryEventError are generated but never read

The contract now declares NdJsonQueryEventError with message: str (previously optional) and three new fields: status: int ("the HTTP status the buffered encoding would have answered the same failure with ... 503 for a retryable conflict, 409 for a duplicated key, 403 ... 413 ... 500 ... Key on this rather than on 'message' to decide whether to retry"), exception, and exception_args. This is exactly the pattern batch_load_stream's error event already has, which the README calls out as "exact, not a fallback" (python/packages/driver/README.md, "Streaming: what the summary carries, and what it does not").

But facade/stream.py::_parse_event (shared by stream_query/stream_command and their async twins) still does:

message = event.error.message
detail = "the stream reported an error" if isinstance(message, Unset) else message
raise ArcadeDBError(200, {"error": detail})

— hardcoding 200 and dropping status, exception, and exception_args entirely, even though they're now always present on the wire. The module docstring's justification ("The raised error's status is 200: honest ... no different from what M4 already established") predates this contract change and is now stale: the contract does carry a real, documented status for this event, the same way it already does for batch_load_stream.

The regenerated test_stream.py is the tell: both updated tests now mock "status": 500 in the error payload, but the assertions right below them are unchanged —

assert caught.value.status == 200

— so the test was patched just enough to satisfy the generated model's new required field, without anyone revisiting whether the assertion it's sitting next to should still read 200. That's not a regression this PR introduces (Go's stream.go and the TypeScript stream.ts hardcode the same 200/"the stream reported an error" convention, and neither was touched here either — TS doesn't validate responses at runtime, which is presumably part of why "TypeScript: passing" while another client is listed as failing), but since all three clients now have a required field they throw away, it seems like a good candidate for a real follow-up: let query_stream/command_stream callers branch on the in-band status for retryability the way batch_load_stream callers already can, and update facade/stream.py's docstring plus the README's "query_stream/command_stream" section (which still says the raised error's status is unconditionally 200) alongside it.

Everything else

  • The additive schema changes (AI chat charts, SecuritySeedRequest's admittedPeerId/declaredHttpAddress, the new support/* endpoints, cluster_status additions) are loosely-typed (additionalProperties: true) generated surface with no hand-written facade wrapping them, so no README/CLAUDE.md prose needed updating for those — consistent with how this repo treats unwrapped generated endpoints.
  • The PR body is upfront that Python's e2e run fails against the live 26.10.1-SNAPSHOT server; it'd help to know which stage before merging. If it's unrelated to the NdJsonQueryEventError change above, no action needed here — but if it is related (e.g. a real in-band error now reaching the new required status/message fields in a shape the generated model doesn't expect), that's worth confirming first.

Nothing here blocks the mechanical refresh itself — the rules that matter for this kind of PR (generated code left untouched, exactly one contract per kind) all check out.

@robfrank
robfrank merged commit b7ffc36 into main Oct 5, 2026
8 checks passed
@robfrank
robfrank deleted the chore/contract-refresh branch October 5, 2026 13:30
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant