Skip to content

item 9: release 0.2.0 - #16

Merged
arpanghoshal merged 1 commit into
mainfrom
item-9-release
Sep 3, 2026
Merged

arpanghoshal merged 1 commit into
mainfrom
item-9-release

Conversation

@arpanghoshal

Copy link
Copy Markdown
Member

The release pass. Version 0.2.0. Not tagged, not published.

README

A second quick start — an existing MCP server behind one gateway, no agent changes — carrying the gateway's real startup output, the one that names every action with no effect: template. A write with no effect key is exactly the configuration this exists to prevent, and it belongs on the line that starts the process rather than in a receipt three weeks later.

Plus one sentence each on reconcile= and the OTel extra, and links to SPEC-v0.2.md and ACS.md. Nothing about ACS beyond that the doc exists — no conformance language anywhere.

docs/CLAIMS.md

Regenerated for v0.2.0: eleven new rows, every sentence the README gained mapped to code and to the test that proves it. It also gains a short section naming the two claims the README deliberately does not make — ACS conformance, and exactly-once execution — because a claims file that only lists what you do say is half a document.

CHANGELOG

A 0.2.0 entry with a Compatibility section, which is the part worth reading before merging:

  • A v0.1 ctrlrun.yaml loads unchanged. ctrlrun.policy/v2 is opt-in and additive; a v1 document using a v2 key is a load-time PolicyError naming the key and the schema it needs — because a v0.1 reader would ignore the template and execute with no duplicate protection at all.
  • The receipt schema is unchanged. ctrlrun.receipt/v1 still describes every receipt v0.2 writes.
  • A v0.1 database is read without migration — the one new table (continuations) is created on open.

Two API changes are called out under Changed: StateStore.append_event now returns the stored event (sinks need the assigned event_id), and SQLiteStateStore no longer writes JSONL — Control does, and from_file() installs the sink so the files land exactly where v0.1 put them.

ROADMAP, reconciled against what shipped

Not against what it planned. Three things arrived early and one was never listed:

  • the OWASP ACS adapter was a v0.3 standards line;
  • Suspended / Control.resume were on no milestone at all, and are public API now;
  • policy schema: ctrlrun.policy/v2 grew out of the gateway — a tool call has no decorator to carry an effect template;
  • EventSink took file writing off the store, which the v0.1 kernel had owned.

v0.3's line now records that --principal-from-client-info is removed there, since the authority model makes a self-reported name an authorization input.

Release verification

Per the definition-of-done line added earlier in this project — from a fresh git clone into a temp directory, never from the working tree:

Check Result
Full suite from a fresh clone 1269 passed
A core wheel install's entire dependency closure click, PyYAML, ctrlrun — nothing else
ctrlrun demo from that wheel 4 scenarios, 0.7 s, no network
ctrlrun[gateway] and ctrlrun[otel] in fresh venvs both install clean
OTelEventSink() / serve() from the core install MissingDependency naming the exact pip install line, never ModuleNotFoundError
README's gateway command, verbatim, from the gateway extra produces the output the README shows
mypy --strict src/, ruff check, ruff format --check clean

Wheel metadata confirms the extras are extras:

Version: 0.2.0
Requires-Dist: pyyaml
Requires-Dist: click
Requires-Dist: httpx>=0.27; extra == "gateway"
Requires-Dist: opentelemetry-api>=1.20; extra == "otel"
…

Definition of done

  • ✅ Every acceptance test in §10 passes, and every one in SPEC-v0.1 §7 still does — T13–T31, T26b, T30b, T51–T55, all present as named tests.
  • ✅ pip install -e . && ctrlrun demo runs four scenarios well under 60 s with no network.
  • ✅ import ctrlrun imports no module from an extra — T30 asserts it in a subprocess, and it also excludes ssl and ctrlrun.acs.
  • ✅ The README quick start works verbatim; every sentence of the opening paragraph maps to code in CLAIMS.md.
  • ✅ mypy --strict src/ and ruff check pass.
  • ✅ Release verification ran from a fresh clone.

No mutation table for this PR: it changes documentation, a version string and no behaviour. The suite is unchanged at 1269.

Version 0.2.0. Not tagged, not published.

README gains the second quick start — an existing MCP server behind one
gateway — with the gateway's real startup output, the one that names every
action with no effect: template. A write with no effect key is exactly the
configuration this exists to prevent, and it belongs on the line that starts
the process rather than in a receipt three weeks later. Plus one sentence each
on reconcile= and the OTel extra, and links to SPEC-v0.2 and ACS.md.

docs/CLAIMS.md regenerated for v0.2.0: every sentence the README gained,
mapped to code and to the test that proves it, and a short section naming the
two claims the README deliberately does not make — ACS conformance, and
exactly-once execution.

CHANGELOG 0.2.0 with a Compatibility section: a v0.1 ctrlrun.yaml loads
unchanged, the receipt schema is unchanged, and a v0.1 database is read
without migration because the one new table is created on open.

ROADMAP reconciled against what actually shipped rather than what it planned.
Three things arrived early and one was never listed: the ACS adapter was a
v0.3 standards line; Suspended/Control.resume were on no milestone at all and
are public API now; policy schema v2 grew out of the gateway; EventSink took
file writing off the store. v0.3's line records that
--principal-from-client-info is removed there.
@arpanghoshal
arpanghoshal merged commit ef5c974 into main Sep 3, 2026
3 checks passed
@arpanghoshal
arpanghoshal deleted the item-9-release branch September 3, 2026 21:38
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