From f4a19e308d37660232fe90f27a69f8bee56d11e5 Mon Sep 17 00:00:00 2001 From: Elmehdi Aitbrahim Date: Wed, 19 Aug 2026 20:03:37 -0400 Subject: [PATCH] chore(release): 0.10.0 Minor, not patch. Three things since v0.9.3 change what an implementor or a deployment can rely on: * A NEW DISTRIBUTION. `keel-broker-alpaca` (#382, #384) plus the paper-equities profile that selects it (#386), so a deployment can now be US equities via the broker port rather than crypto only. * THE PORT CONTRACT MOVED TWICE. `market_clock`/`market_schedule` made venues session-aware (#385), and `place_order` gained `idempotency_key` (#419). Both carry defaults so no CALLER breaks, but a third-party adapter that does not accept them is no longer a `Broker` -- the conformance suite now says so. That is exactly the kind of change a patch bump must not hide. * THE OPERATOR CONSOLE. The TUI became keel's console across #399-#408, and `keel update` (#415/#417) makes a deployment self-updating. Every pinned sibling moves with it. The four production distributions are required `==` at this exact version (`RELEASING.md`, "Release assets"), so a bump that missed one would install a mixed set -- the `keel-trader 0.5.7` against `keel-core 0.5.5` failure `keel versions` exists to catch, and which `~/keel` actually ran across two releases. Also in this window, on the Robinhood adapter: the best_bid_ask fixture corrected against the live venue (#414), a credential guard that catches the error it only claimed to (#416), pre-flight sizing reported on the preview (#418), transport backoff (#420), and the fenced one-order probe (#421). Co-Authored-By: Claude Opus 5 (1M context) --- packages/keel-broker-alpaca/pyproject.toml | 4 ++-- packages/keel-broker-api/pyproject.toml | 4 ++-- packages/keel-broker-coinbase/pyproject.toml | 4 ++-- packages/keel-broker-fake/pyproject.toml | 4 ++-- packages/keel-broker-robinhood/pyproject.toml | 4 ++-- packages/keel-core/pyproject.toml | 2 +- pyproject.toml | 8 ++++---- 7 files changed, 15 insertions(+), 15 deletions(-) diff --git a/packages/keel-broker-alpaca/pyproject.toml b/packages/keel-broker-alpaca/pyproject.toml index f594a1ec..0bc3b578 100644 --- a/packages/keel-broker-alpaca/pyproject.toml +++ b/packages/keel-broker-alpaca/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "keel-broker-alpaca" -version = "0.9.3" +version = "0.10.0" description = "Alpaca Trading API adapter for keel (US equities, cash account)" license = "Apache-2.0" requires-python = ">=3.11" @@ -9,7 +9,7 @@ requires-python = ">=3.11" # deliberately NO `alpaca-py` SDK: Alpaca's Trading + Market Data APIs are plain # JSON-over-HTTPS with two header credentials, so the SDK would add a version-churning # dependency for nothing the port needs. -dependencies = ["keel-core==0.9.3", "keel-broker-api==0.9.3", "requests>=2.32.0"] +dependencies = ["keel-core==0.10.0", "keel-broker-api==0.10.0", "requests>=2.32.0"] [project.entry-points."keel.brokers"] alpaca = "keel_broker_alpaca:AlpacaAdapter" diff --git a/packages/keel-broker-api/pyproject.toml b/packages/keel-broker-api/pyproject.toml index fdbdc994..f56cf351 100644 --- a/packages/keel-broker-api/pyproject.toml +++ b/packages/keel-broker-api/pyproject.toml @@ -1,12 +1,12 @@ [project] name = "keel-broker-api" -version = "0.9.3" +version = "0.10.0" description = "Broker port, domain types, capability model, and conformance suite for keel" license = "Apache-2.0" requires-python = ">=3.11" # Pinned `==`: see the note in the root `pyproject.toml`. An unpinned sibling is satisfied by # whatever is already installed, which is how a deployment ends up running mixed versions. -dependencies = ["keel-core==0.9.3"] +dependencies = ["keel-core==0.10.0"] [project.optional-dependencies] conformance = ["pytest>=9.1.1"] diff --git a/packages/keel-broker-coinbase/pyproject.toml b/packages/keel-broker-coinbase/pyproject.toml index f1345517..ebb2e8cb 100644 --- a/packages/keel-broker-coinbase/pyproject.toml +++ b/packages/keel-broker-coinbase/pyproject.toml @@ -1,12 +1,12 @@ [project] name = "keel-broker-coinbase" -version = "0.9.3" +version = "0.10.0" description = "Coinbase Advanced Trade adapter for keel" license = "Apache-2.0" requires-python = ">=3.11" # Siblings pinned `==` (see the root `pyproject.toml`); the third-party SDK is not, because it # has its own release cycle and is not cut from this repo. -dependencies = ["keel-core==0.9.3", "keel-broker-api==0.9.3", "coinbase-advanced-py>=1.8.4"] +dependencies = ["keel-core==0.10.0", "keel-broker-api==0.10.0", "coinbase-advanced-py>=1.8.4"] [project.entry-points."keel.brokers"] coinbase = "keel_broker_coinbase:CoinbaseAdapter" diff --git a/packages/keel-broker-fake/pyproject.toml b/packages/keel-broker-fake/pyproject.toml index f3e8e492..652a6b5b 100644 --- a/packages/keel-broker-fake/pyproject.toml +++ b/packages/keel-broker-fake/pyproject.toml @@ -1,11 +1,11 @@ [project] name = "keel-broker-fake" -version = "0.9.3" +version = "0.10.0" description = "A deliberately divergent second broker adapter, to keep the port honest" license = "Apache-2.0" requires-python = ">=3.11" # Pinned `==`: see the note in the root `pyproject.toml`. -dependencies = ["keel-core==0.9.3", "keel-broker-api==0.9.3"] +dependencies = ["keel-core==0.10.0", "keel-broker-api==0.10.0"] [project.entry-points."keel.brokers"] fake = "keel_broker_fake:FakeAdapter" diff --git a/packages/keel-broker-robinhood/pyproject.toml b/packages/keel-broker-robinhood/pyproject.toml index 2688480c..c74d0616 100644 --- a/packages/keel-broker-robinhood/pyproject.toml +++ b/packages/keel-broker-robinhood/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "keel-broker-robinhood" -version = "0.9.3" +version = "0.10.0" description = "Robinhood Crypto Trading API v2 adapter for keel" license = "Apache-2.0" requires-python = ">=3.11" @@ -8,7 +8,7 @@ requires-python = ">=3.11" # Ed25519 key, which no other venue keel talks to requires. Keeping it a dependency of this # package alone means an engine that never installs this adapter never installs the crypto stack # either -- the whole point of adapters being separate distributions. -dependencies = ["keel-core==0.9.3", "keel-broker-api==0.9.3", "pynacl>=1.5.0", "requests>=2.32.0"] +dependencies = ["keel-core==0.10.0", "keel-broker-api==0.10.0", "pynacl>=1.5.0", "requests>=2.32.0"] [project.entry-points."keel.brokers"] robinhood = "keel_broker_robinhood:RobinhoodAdapter" diff --git a/packages/keel-core/pyproject.toml b/packages/keel-core/pyproject.toml index df60feba..14b87876 100644 --- a/packages/keel-core/pyproject.toml +++ b/packages/keel-core/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "keel-core" -version = "0.9.3" +version = "0.10.0" description = "Shared domain types, configuration, and logging for keel" license = "Apache-2.0" requires-python = ">=3.11" diff --git a/pyproject.toml b/pyproject.toml index 8740e128..de8e3651 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "keel-trader" -version = "0.9.3" +version = "0.10.0" description = "Offline-first, broker-agnostic, rule-based spot-trading agent (halal policy by default)" license = "Apache-2.0" readme = "README.md" @@ -23,11 +23,11 @@ dependencies = [ # in one build, so `==` states a fact rather than guessing at compatibility. The cost is that # a version bump must move these numbers too -- the bump already edits every package's # `version`, and `tests/test_packaging.py` fails the build if a pin is left behind. - "keel-core==0.9.3", - "keel-broker-api==0.9.3", + "keel-core==0.10.0", + "keel-broker-api==0.10.0", # keel/cli.py and keel/data/cb_client.py still import the Coinbase SDK directly; depending # on the adapter keeps it available transitively. Phase B deletes those imports and this. - "keel-broker-coinbase==0.9.3", + "keel-broker-coinbase==0.10.0", ] [project.scripts]