diff --git a/CHANGELOG.md b/CHANGELOG.md index d12b325..5298a19 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -100,5 +100,7 @@ First public alpha. HTTP + SSE client for OpenCode REST API. ### Compatibility - Ruby ≥ 3.2 -- OpenCode server ≥ 1.15 (tested against the message bus schema in `packages/opencode/src/session/message-v2.ts`) +- OpenCode targeted the then-current 1.15 message-bus shape. This historical + target was not a blanket SemVer compatibility guarantee; use the README's + current compatibility evidence for deployment decisions. - Runtime dependency: `activesupport (>= 6.1)` for `blank?`/`present?`/`presence`/`truncate`/`duplicable?`/`megabytes`. ActiveSupport is *not* Rails — it's a standalone helpers gem. diff --git a/README.md b/README.md index ce4038c..99bfc01 100644 --- a/README.md +++ b/README.md @@ -67,7 +67,9 @@ child = client.create_session( Model strings use OpenCode's `provider/model` form; a preformatted model hash with `providerID` and `id` keys is also accepted. These configured-session -fields require OpenCode 1.16.1 or newer. +fields first appeared in OpenCode 1.16.1. That is an API-introduction note, +not evidence that every later server is compatible; use the +[certified compatibility evidence](#compatibility) for deployment choices. ### Streaming (the headline) @@ -106,8 +108,9 @@ client.update_session(session_id, permissions: permission_rules) OpenCode appends PATCHed permission rules and evaluates the last matching rule. Hosts should send a complete ordered policy and fingerprint it so the -same policy is not appended on every turn. This endpoint requires OpenCode -1.16.1 or newer; the rest of the client remains compatible with 1.15. +same policy is not appended on every turn. This endpoint first appeared in +OpenCode 1.16.1; that version floor describes endpoint availability, not +compatibility with every later server. ### Lower-level event firehose @@ -199,9 +202,29 @@ Want every OpenCode endpoint auto-generated from the OpenAPI spec? Use [`opencod ## Compatibility - Ruby ≥ 3.2 -- OpenCode server ≥ 1.15 - Runtime dependency: `activesupport (>= 6.1)` — *not* Rails. ActiveSupport is a standalone helpers gem (`blank?`, `present?`, `presence`, `truncate`, etc.). +OpenCode server compatibility is evidence-based, not an open-ended SemVer +promise. OpenCode's HTTP, SSE, and runtime behavior can change independently +of a numeric version floor, so this gem does not infer compatibility from a +constraint such as `>= 1.15`. + +Use the [OpenCode compatibility corpus](https://github.com/ajaynomics/opencode-compat) +as the source of current evidence. Its +[image matrix](https://github.com/ajaynomics/opencode-compat/blob/main/manifests/image-matrix.json) +records the exact gem commit and immutable OpenCode OCI digest exercised by +the `ruby-rest-sse` profile. Its +[runtime tuples](https://github.com/ajaynomics/opencode-compat/blob/main/manifests/runtime-tuples.json) +add the exact consumer commit and canary evidence needed for promotion and +rollback. A version label or image tag is provenance only, never the execution +coordinate. + +A combination absent from passing evidence is **unverified**, not necessarily +incompatible. Run the corpus against the exact gem, image digest, and consumer +commit before adopting or promoting it. See the +[certification policy](https://github.com/ajaynomics/opencode-compat/blob/main/docs/certification.md) +for the full process. + ## Development ```sh @@ -213,10 +236,13 @@ The smoke suite covers Client end-to-end against WebMock-stubbed OpenCode endpoints, including subscription-before-prompt ordering and reconnect-without-repost. -Releases use RubyGems trusted publishing. After the repository's -`release.yml` workflow is registered as a trusted publisher with the `release` -environment, pushing a `v*` tag builds, attests, and publishes the gem without -a long-lived RubyGems API key. +The repository contains a tag-triggered `release.yml` workflow intended for +RubyGems trusted publishing, but its RubyGems trusted-publisher registration is +not configured as of `0.0.1.alpha7`; that release was published manually. A +`v*` tag push therefore does not currently guarantee publication. Before a +future release, verify the RubyGems registry result explicitly. Once the +workflow is registered as a trusted publisher for the `release` environment, +it can build, attest, and publish without a long-lived RubyGems API key. ## License diff --git a/test/readme_contract_test.rb b/test/readme_contract_test.rb new file mode 100644 index 0000000..f112525 --- /dev/null +++ b/test/readme_contract_test.rb @@ -0,0 +1,19 @@ +# frozen_string_literal: true + +require "test_helper" + +class ReadmeContractTest < Minitest::Test + README = File.read(File.expand_path("../README.md", __dir__)) + + def test_server_compatibility_points_to_exact_certification_evidence + assert_includes README, "https://github.com/ajaynomics/opencode-compat" + assert_includes README, "manifests/image-matrix.json" + assert_includes README, "manifests/runtime-tuples.json" + refute_match(/OpenCode server\s*(?:>=|≥)\s*\d/, README) + end + + def test_release_guidance_does_not_claim_trusted_publishing_is_configured + assert_includes README, "not configured as of `0.0.1.alpha7`" + assert_includes README, "does not currently guarantee publication" + end +end