Skip to content

chore(release): 0.14.0 — the honest cockpit, and a book that can prove it was not edited - #750

Merged
eaitbrahim merged 1 commit into
mainfrom
chore-v0.14.0-bump
Sep 7, 2026
Merged

chore(release): 0.14.0 — the honest cockpit, and a book that can prove it was not edited#750
eaitbrahim merged 1 commit into
mainfrom
chore-v0.14.0-bump

Conversation

@eaitbrahim

@eaitbrahim eaitbrahim commented Sep 7, 2026

Copy link
Copy Markdown
Contributor

Version bump only. Thirty-seven PRs since 0.13.3.

⚠️ This release carries four schema migrations

v0.13.3 shipped SCHEMA_VERSION = 16. This release is 20, so an upgraded deployment applies four steps, not one:

adds
v17 candle_series_feed (#696)
v18 venue_cash_postures (#666)
v19 equity_points (#698)
v20 orders.quote_provenance, orders.client_order_id, attest_due_ts on both attestation tables, cycle_balances, audit_events (#721)

keel serve migrates for you, once, at bind time (server.ensure_schema) — a missing database is left alone as a first run. What it deliberately does not do is migrate per request: the pages auto-reload every 15 seconds, and a view calling itself read-only must not take a schema write lock on a database the agent may be mid-cycle on, four times a minute.

keel mcp does not migrate at all (keel/mcp/tools.py), and against a database still at v16–v17 its doctor tool raises sqlite3.OperationalError: no such table: venue_cash_postures rather than reporting the gap. Only the audit chain carries a table_present guard; the cash-posture and equity readers do not. Tracked in #751run keel migrate before pointing an MCP client at an upgraded deployment.

The honest cockpit (#700#708)

Positions, Balances, Activity, Orders, the Research Hub's four views, session identity on every page, and an inverted Plans page.

The pattern underneath all of it: a view was built against a record the engine didn't keep, and the fix was always in the engine. #703's audit export said NOT RECORDED in every hash cell until #721 chained the book. #708's Evidence Matrix couldn't exist until #726 stopped throwing away what trials pbo computed.

What the engine now writes down

Two new operator surfaces

keel journal — the discretionary journal, wired at last after sitting in the schema unused since the beginning. CLI-only by constitution: no web form, and add takes no value options, so an entry can't be scripted past the terminal gate.

keel orders cancel — the cancel asymmetry. Cancelling an entry refuses risk and asks once; cancelling an exit or protective bracket removes protection and takes a typed phrase naming the order. The console classifies and hands over the command; it never cancels, because keel serve holds no venue credential and this release doesn't change that.

One behaviour change to know about

A deployment that has never attested a cash posture now sends a webhook event, if notifications are on. attest.cash_posture was registered for delivery and nothing produced it (#732) — so rail 22 could veto every entry while the operator heard nothing.

Checks

pyproject.toml and all seven workspace packages moved together, uv.lock refreshed (#424). 6,305 passed / 3 skipped; ruff clean apart from a pre-existing E501 in docs/experiments/.

After merge: Actions → Release → Run workflow, entering 0.14.0.

🤖 Generated with Claude Code

https://claude.ai/code/session_01KZZxmspQXe5qJ9FAsG13s6

…e it was not edited

Forty-eight PRs since 0.13.3. Nine console views, five engine records they were
waiting on, and one thing an operator has to do before upgrading.

⚠️ THIS RELEASE CARRIES A SCHEMA MIGRATION. v20 landed after 0.13.3 was cut:
`orders.quote_provenance`, `orders.client_order_id`, `attest_due_ts` on both
attestation tables, plus the `cycle_balances` and `audit_events` tables. Every
CLI command migrates on the way in, but `keel serve` and `keel mcp` deliberately
do NOT -- a view must not take a schema write lock on a database the agent may be
mid-cycle on -- so run `keel migrate` per deployment database before serving.
Readers tolerate a pre-v20 database and say so rather than crashing; they simply
report the new fields as unrecorded until the migration runs.

THE HONEST COCKPIT (#700-#708)

Positions, Balances, Activity, Orders, the Research Hub's four views, session
identity on every page, and an inverted Plans page. The pattern underneath all of
it: a view was built against a record the engine did not keep, and the fix was
always in the engine.

#703's audit export said NOT RECORDED in every hash cell until #721 chained the
book. #708's Evidence Matrix could not exist until #726 stopped throwing away
what `trials pbo` computed. Both surfaced as "the UI cannot show this" and
neither was a UI problem.

WHAT THE ENGINE NOW WRITES DOWN

An append-only, hash-chained record of every write to `orders`, `transactions`
and the attestation tables (#721) -- so the activity export carries real hashes
and a per-row verdict on whether the chain vouches for them. The quote provenance
and client order id behind each placement (#715). When an attestation's window
closes (#718). The per-currency balance pair a cycle observed (#719). The full
CSCV, DSR and Monte Carlo artifacts a gauntlet run produces (#726), instead of
printing them and exiting.

TWO NEW OPERATOR SURFACES

`keel journal` -- the discretionary journal, wired at last after sitting in the
schema unused since the beginning. CLI-only by constitution: there is no web
form, and `add` takes no value options, so the entry cannot be scripted past the
terminal gate.

`keel orders cancel` -- the cancel asymmetry. Cancelling an entry refuses risk
and asks once; cancelling an exit or a protective bracket removes protection and
takes a typed phrase that names the order. The console classifies and hands over
the command; it never cancels, because `keel serve` holds no venue credential and
this release does not change that.

ONE BEHAVIOUR CHANGE TO KNOW ABOUT

A deployment that has never attested a cash posture now sends a webhook event, if
notifications are on. `attest.cash_posture` was registered for delivery and
nothing produced it (#732), so rail 22 could veto every entry while the operator
heard nothing -- an agent that looks healthy and never trades again.

VERSION BUMP ONLY

Every workspace package and the lockfile move together (#424). The release
workflow is a human action in Actions; nothing here tags anything.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KZZxmspQXe5qJ9FAsG13s6
@eaitbrahim
eaitbrahim merged commit 669cc76 into main Sep 7, 2026
4 checks passed
@eaitbrahim
eaitbrahim deleted the chore-v0.14.0-bump branch September 7, 2026 13:09
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