Releases

Changelog

What changed in each release, and what it breaks. Generated from CHANGELOG.md, which is also the source for the GitHub release notes.

Notable changes to Capstead. Versions follow 0.MINOR.PATCH while the library is pre-1.0: a minor bump
may change behaviour or a public shape, a patch never does.

This file is the source for GitHub release notes. scripts/changelog-section.sh <version> extracts a
section verbatim and gh release create --notes-file publishes it, so an entry has to read as notes: open
with one line saying what the release gives you, then the categorised detail. Anything written only on the
release page will be lost the next time the notes are regenerated.

Entries before 0.8.0 came the other way. This file did not exist until 0.8.0, so 0.3.1 through
0.7.0 were written on the GitHub release pages first and are transcribed here — condensed to the
categories used above, with the code samples left on the releases. Where the two differ, the release
page is the original record.

0.10.0

Publish one interoperable, privacy-safe incident reproduction contract that Capstead Platform and authorized
lab runners can validate instead of maintaining two prose descriptions that drift silently.

Added

Contract guarantees

0.9.0

Record what an execution decided, not only how it went — namespaced, allow-listed attributes that persist
with the execution and come back on every read path.

CapabilityExecution has always answered how did this go: timing, success, retries, tokens, cost. It could
not answer what did it decide, and on which version of its inputs. A policy outcome, a sanitized reason
code, the revision of the source or fixture an execution acted on had nowhere to live, and overloading
version (the capability's own) or errorType (how it failed) would have been worse than adding nothing.

Added

Changed

Not included

Notes for anyone extending this

Example

@Capability(name = "Answer Question", domain = "Support")
public Answer answer(String question) {
    Retrieval retrieval = retriever.retrieve(question);

    CapabilityExecutionContext.recordAttribute("evidence.sourceRevision", retrieval.revision());
    CapabilityExecutionContext.recordAttribute("evidence.state", retrieval.state().name());

    if (!policy.permits(retrieval)) {
        CapabilityExecutionContext.recordAttribute("policy.authorization.outcome", "DENY");
        CapabilityExecutionContext.recordAttribute("policy.authorization.reason", "ACCESS_REVOKED");
        return Answer.refused();
    }

    CapabilityExecutionContext.recordAttribute("policy.authorization.outcome", "ALLOW");
    return generator.generate(question, retrieval);
}

Two executions of that capability can now be told apart by what they decided, not only by what they cost.

0.8.0

Walk a whole capability execution tree in one call, and get the actual tree from the actuator instead of one
level of it.

Breaking

Added

Fixed

Not included

subtree returns the same CapabilityExecution records the rest of CapabilityExecutionQuery returns
rather than a new export type. An export shape that consumers persist and diff is a contract worth settling
once, alongside the ordered execution events it will need to carry, so findByAttribute and a versioned
export shape remain open.

Example

// Every descendant, ordered root-first, parents before children.
List<CapabilityExecution> tree = query.subtree(rootExecutionId);
GET /actuator/capabilityexecutions/{id}
{
  "execution": { "capabilityName": "Generate Course", "executionId": "exec-1", … },
  "children": [
    { "execution": { "capabilityName": "Generate Lesson", … },
      "children": [ { "execution": { "capabilityName": "Score Lesson", … }, "children": [] } ] }
  ]
}

io.capstead:capstead-starter:0.8.0 · Maven Central

0.7.0

Meter and price model calls that are not billed by token — text-to-speech characters, transcription
seconds, per-request APIs — with no change to client code.

Added

Fixed

0.6.0

Describe a multi-step workflow in configuration and read its runs back, without client code or schema
changes.

Added

Fixed

0.5.1

Declarative capabilities stop requiring Spring AI, and the dashboard is worth opening before anything has
run.

Added

Changed

Fixed

0.4.0

Capstead can write and govern a capability, not only observe a hand-written one.

Added

Notes

0.3.2

Completes the 0.3.x line: the dashboard and the scorecards read the durable store, so what they report
survives a restart and covers every instance rather than the one that answered.

Fixed

Notes

0.3.1

Turns @Capability from static metadata into a durable execution recorder.

Added

Notes

We count visits using a daily rotating token, without analytics cookies. Do Not Track and Global Privacy Control are respected.