Skip to content

0.1.0

Latest

Choose a tag to compare

@doeixd doeixd released this 17 Sep 18:23
· 105 commits to main since this release

[0.1.0] - 2026-09-17

Behaviour changes

  • a persisted compaction checkpoint may now be a rollover (kind: "rollover") as well as a summary; summaries decode as before. (c30de48; measured by test/fixtures/compaction-checkpoint.json)
  • none for a caller -- every tag, table default and key prefix keeps its exact value; the fixture records them so a later change cannot pass unmeasured. (fb22c34; measured by test/fixtures/namespace-manifest.json)
  • a delegation whose child was interrupted now fails the parent's tool call with SubagentInterruptedError carrying the partial text, instead of succeeding with the partial text as the answer. (dc2d6d6; measured by test/fixtures/namespace-manifest.json)
  • none for a caller -- every error _tag keeps its value; the fixture records the bare set so a rename cannot pass unmeasured. (3e3d1d0; measured by test/fixtures/error-tags-manifest.json)
  • the Cloudflare host gains a dispatch-intent table affe_dispatch beside affe_history; existing tables keep their names and shapes. (aa506e5; measured by test/fixtures/namespace-manifest.json)
  • one identifier, affe-agent/internal/ParentEvents, joins the namespace manifest; it is a harness-provided reference and never crosses a wire. DelegatedEvent is a new event tag, additive under the tolerant decoder, emitted only for a child made with Inherit.events: "parent"; nothing changes on the wire for a caller who does not opt in. (9a9c255; measured by test/fixtures/namespace-manifest.json)
  • AgentObservationLagError is a new error tag in the remote error union and the error-tags manifest, delivered as an SSE failure frame or RPC stream error with status 503 where a status is needed; existing tags and statuses are unchanged. An observer of events or stream that falls more than 2048 envelopes or 8 MiB behind is now ended with it instead of retaining without bound; a consumer that keeps up sees no change. (df360f9; measured by test/fixtures/error-tags-manifest.json)
  • UnsupportedConversion is a new error tag in the error-tags manifest, raised only by the optional affe-agent/effect-uai adapter when a conversion cannot be represented faithfully; no existing tag, status or wire shape changes, and a caller who does not import that subpath cannot encounter it. (133d14f; measured by test/fixtures/error-tags-manifest.json)
  • AgentTraceLimitError is a new error tag in the error-tags manifest, raised only by an Agent.start handle's events when its retained trace outgrows its bound; the submission, canonical history and durable delivery are unaffected, and no existing tag or wire shape changes. (33afe17; measured by test/fixtures/error-tags-manifest.json)
  • AgentToolProgressLimitError is a new error tag in the error-tags manifest, and one submission may now publish at most 8 MiB of tool progress (lowerable through toolProgress.maxBytes), failing the offending call and its run rather than truncating the snapshot; a tool that stays under the ceiling sees no change, and no existing tag or wire shape changes. (893fd9a; measured by test/fixtures/error-tags-manifest.json)
  • RunCompleted gains an optional exhaustion field and AgentSubmission.Result an exhaustion: Option<Exhaustion> naming which built-in ceiling ended a run ("turns", "tool-calls", "duration", "tokens", "cost"); it is absent for an ordinary stop, a custom policy's own reason and an interruption, the field is optional so a journal written before it still decodes, and stopReason is unchanged in both content and meaning. (959bd9a; measured by test/fixtures/run-completed.json)
  • AgentExhaustedError is a new error tag in the error-tags manifest, raised only by onExhaustion: "fail"; AgentLoop.Limits.finalTurn and Presets.PolicyOptions.finalTurn are replaced by onExhaustion: "stop" | "final-answer" | "fail", where "final-answer" is the old finalTurn: true except that it now declines for maxDuration, and the default remains stop. (c57b3dd; measured by test/fixtures/error-tags-manifest.json)
  • ToolExecution.Alone now rejects the whole batch -- a sibling of an Alone call no longer runs and gets the new ToolBatchRejectedError -- and the AgentOutput tool is Alone, so an answer beside another call is refused and the model asked again; AgentLoop.State has a new required outputReported field, and an agent with an output stops on a committed answer rather than on the call's presence. (ddd72c8; measured by test/fixtures/error-tags-manifest.json)
  • a new ToolScheduling kernel module and affe-agent/ToolScheduling/Current reference (default: no constraint), and a durable submission now journals an execution-strategy activity so a recovered attempt runs its tools with the strategy it was admitted with rather than the replacement process's. (5b79340; measured by test/fixtures/namespace-manifest.json)
  • a durable submission journals a contract-digests activity at its first execution and refuses a replay whose tools changed or were removed with ToolContractChangedError (a new error tag); a recorded new_context result that does not decode now fails the turn instead of being ignored. (bc40db7; measured by test/fixtures/error-tags-manifest.json)
  • a new ToolExposure kernel module and Agent field (default eager(), unchanged requests); under a visibility rule or progressive exposure the model is sent a toolChoice.oneOf subset and a call outside it is refused with the new ToolNotExposedError. (2772b6f; measured by test/fixtures/error-tags-manifest.json)
  • a corrupt persisted compaction checkpoint no longer fails the turn; it is discarded, reported as CompactionCheckpointDiscarded, and rebuilt. Old checkpoints are rebuilt once under the new fingerprint. (0b289f9; measured later, in 33a3b4c)
  • subagent delegation is now refused past 8 levels by default (SubagentDepthExceededError); pass maxDepth to change it. (a165708; measured by test/fixtures/namespace-manifest.json)
  • CloudflareHost.make now requires principal and authorization, and RelayServer.layer requires authorization; the allow-everything defaults and the header-as-principal default are gone. (9342c8e; type-level only, nothing on a wire to measure)
  • AgentSession.Snapshot has a required version field (1), written by snapshot and by exports; snapshots without one still decode as version 1, and an unknown version is refused. (4acc464; measured later, in 33a3b4c)
  • the default Memory.recall rendering adds a line when more memories matched than were shown; DeliveryLogConformance gains a paging case, so a log that ignores read limit now fails it. (3783b93; measured later, in 33a3b4c)
  • Code Mode's per-call outcome can now be "uncertain" or "not-started" when a program is interrupted; consumers matching the three old values should handle both. (a35673a; measured later, in 33a3b4c)
  • a durable non-idempotent tool call now journals a start marker activity; a submission whose process died inside (or just before) such a handler ends with DurableToolUnresolvedError instead of running the handler again. (1a770eb; measured later, in 33a3b4c)
  • ToolContracts is exported from affe-agent/durable, with CompatibleWith; ToolContractChangedError's message prints the full recorded digest and names the declaration. (d730666; measured by test/fixtures/namespace-manifest.json)
  • a recovered durable run's undecided permission calls now run under the stricter of the policy it was admitted with and the current one, or are refused if a changed policy cannot be re-created; a regexp matcher with matching flags now describes as regexp/:. (725551e; measured by test/fixtures/error-tags-manifest.json)
  • a recovered durable attempt now runs its calls under the stricter of the host scheduling it was admitted under and the current host's, or is refused (ToolSchedulingChangedError) if a changed Serialize cannot be re-created. (5e13679; measured by test/fixtures/error-tags-manifest.json)
  • Agent.describe tool entries gain source; tools bound through ToolSource carry a ToolSourceId annotation, a new frozen namespace identifier. (1455d5e; measured by test/fixtures/namespace-manifest.json)
  • the built-in control tools' contract digests are now frozen by fixture; changing one is a journal change that must declare compatibility or accept refused replays. (33a3b4c; measured by test/fixtures/code-mode-outcomes.json, test/fixtures/compaction-checkpoint-discarded.json, test/fixtures/control-tool-digests.json, test/fixtures/memory-recall-truncated.json, test/fixtures/snapshot-unversioned.json, test/fixtures/tool-activity-names.json)
  • a durable run that asks for an answer from inside a tool call (a subagent forwarding its child's approval, or a handler that asks) now fails with DurableElicitationInToolCallError instead of hanging. (9a1b01c; measured by test/fixtures/error-tags-manifest.json, test/fixtures/namespace-manifest.json)
  • the journal's permission-policy and host-scheduling records are frozen by fixture; a regexp matcher with matching flags describes as regexp/:. (57106e8; measured by test/fixtures/admission-descriptions.json)
  • AgentOutput.fromTool refuses a provider-defined tool, at compile time and with a TypeError at construction (e30f31f; type-level only, nothing on a wire to measure)
  • the durable channel table gains a nullable claimed_by column (sqlStoreWithTable migrates an older table; a self-managed table must add it), and a drain claims rows instead of deleting them (9efd2c5; measured by test/fixtures/channel-input-table.json)
  • a host's eventLog for a durable session with a delivery log reads the whole log (oldest is its first event) instead of the host's bounded tail (470a6c0; measured by test/fixtures/durable-event-log.json)
  • AgentBusyError carries the incumbent's submissionId when the refusing side knows it, on every client (1436537; measured by test/fixtures/busy-error.json)
  • a durable session store constructed with blobs writes history files over maxInlineBytes as content-addressed blob references (rows without the option are unchanged) (7092a8e; measured by test/fixtures/history-blob-row.json)
  • a relay configured with sendRate refuses a sender over its rate with RelayRateLimitedError, a new member of the relay's wire error union (f6e49b9; measured by test/fixtures/namespace-manifest.json)
  • the five frozen control-tool digests moved (struct JSON Schemas now render additionalProperties: true under Effect rc.115), so durable replays recorded under the old digests are refused by name (02dc9fd; measured by test/fixtures/control-tool-digests.json)