Repository navigation
v0.7.0
Build f9f433ee, canonical digest 9de209f5e0d40b51 — sorted keys, no
whitespace, which is what check-spec-freshness.sh compares and what the
release refuses to proceed without. Against 0.6.0, the last release published
to any registry: 535 → 544 paths, 723 → 736 operations (+16, −3), 352 → 352
schemas (+3, −3).
The first v0.7.0 tag, on 2026-09-22 at build 34cc8169, published nothing:
the platform deployed 3a9d4c08 between the regeneration and the tag, and the
release job refused the stale document in its first step, before any registry
was touched. 5732283f, c5694dc0 and f9f433ee followed while the refresh
was in CI. This entry describes the second cut.
The minor moves, and that is the point. A caret under 1.0 does not cross
the minor, so ^0.6.0 admits 0.6.1 automatically and refuses 0.7.0. This
release removes exported names and adds required request fields; on a patch
those would have arrived in builds nobody touched, and the first anyone heard
of it would have been a red compile. The number is the announcement.
Removed — three operations and eighteen exported names
The SPEC-package surface is withdrawn on the platform (uarp f058b582), so
it leaves the clients:
GETandPUT /admin/config/spec-packages, and
POST /admin/config/spec-packages/{packageId}/stripe-price.- Eighteen names disappear from the TypeScript models (1679 exports → 1720,
with these gone):SpecPackage,SpecPackagePricing,
SpecPackagePricingBillingInterval,SpecPackageIncludedInPlan,
SpecPackageProgram,SpecPackageProgramNav,SpecPackageProgramPage,
AdminSpecPackagesList,UpdateAdminSpecPackagesRequest,
CreateAdminSpecPackageStripePriceResponse,
CreateSpecPackageCheckoutSessionRequest,
ListBillingSpecPackagesResponsePackageand its…Entitlement,
DeleteCustomPlanForce, and the four*_VALUESconsts of those enums.
GET /billing/spec-packages and its checkout do NOT leave: the withdrawal
left the list answering [] and the checkout answering 410, both marked
deprecated, and both stay generated for clients that still call them.
Changed — six operations now require body fields they did not
Breaking for any call site that compiled without them:
| Operation | Newly required |
|---|---|
POST /governance/goals |
title, description, rationale, expected_impact, alignment_justification, resource_estimate_usd |
POST /governance/improvement/{agentId} |
title, description, rationale, changes, baseline_success_rate, failed_run_ids |
POST /governance/arbiter/cases |
description, rule_ids |
POST /bridge/delegate |
message |
POST /marketplace/listings/{listingId}/subscribe |
stripe_subscription_id |
POST /programs/{programId}/apply |
start_date |
POST /a2a/tasks tightens without a new top-level field: each entry of
messages now requires role ('user' | 'agent', no longer any string) and
a non-empty parts typed as A2APart[] rather than bare objects, and the
list itself needs at least one entry. The handler refused all of these with
422 already; the types now say so before the request is sent.
The first three were unusable in 0.6.0 rather than merely under-declared:
CreateGoalRequest shipped with one field beside a doc comment naming seven,
so no client generated from that document could form a valid request. They
compile differently here because they now describe what the handler actually
demands.
Added — a failed run says why, in a field
Run.error_codeandRun.error_details, and the same pair on
TenantOverviewRunsRecentItem— the thinner shape the fleet board reads.
error_codeis absent when the failure carries nothing to branch on, which
is deliberate;error_detailscarries what the code cannot
(retry_after_ms,quota_exhausted,stale_seconds).ErrorCodeandERROR_CODE_VALUES, 78 values — among the newest,
approval_rejectedfor a run that stopped because a person refused its tool
call, andkb_embedding_failed. New, not widened: 0.6.0
declared nocodeonErrorat all, in the tag or in the published
tarball, so there was nothing for a client to branch on.
Until this release no generated client could learn why a run failed except by
matching English in error — a sentence with no Accept-Language behind it.
Added — the rest of the surface
SpecToolCatalogSpecwithtools_waitingand
status: 'ready' | 'needs_connection': an installed SPEC that is waiting on
a connection says so instead of vanishing.UsageQuotaCounterand its eight kinds (runs,tokens,tokens_daily,
tool_calls,agents,teams,knowledge_bases,workspaces).GET|PUT /agents/{agentId}/mcp-serverswithMcpServerAuth— the connect
surface between an agent and the MCP servers its tenant has installed.- Billing:
GET|PUT|DELETE /billing/budget,GET|PUT /billing/overage,
GET /billing/promo,POST /billing/promo/redeem. GET /admin/data-explorer/export,POST /admin/data-explorer/import,
POST /auth/oauth/nonce(served undocumented until uarp #487),
GET /bridge/agent-specs,GET /companies/{companyId}/events.SubjectSweep,TenantSocialLinks.GET /agents/{agentId}/memory/coreandListCoreMemoryBlocksResponse—
every core memory block of an agent in one call, beside the per-label routes.GET /agents/{agentId}/experimentsandListExperimentsResponse— an
agent's evaluation experiments, newest first.InboxItem.tools(InboxItemTool): anapprovalrow names each tool the
run waits on, with how many calls named it, as data rather than prose.Run.approvals(RunApproval, decision'approved' | 'rejected'): each
human decision on a tool approval the run waited for, oldest first. Absent
on runs from before 2026-09-22, when nothing was recorded.POST /runs/{runId}/resumetakes an optionalResumeRunRequest; a string
input.noteis handed to the model as a user turn when the run continues.Objective.strikes_usedandabort_reason,AARRootCause.code,
AARObjectiveOutcome.abort_reason,MissionStartResponse.run_started.PUT /agents/{agentId}/memory/core/{label}documents409, and the public
session upload, respond and share routes document410for an agent made
private after the session opened.
Fixed — the tooling that made the last cut cost two attempts
scripts/update-spec.shgains--allow-shrink "<reason>". Its guard
correctly refuses a document smaller than the vendored copy, but its advice
on refusal was to pass a different url, which cannot work: the guard weighs
whatever is fetched, so the only url that satisfies it is a document stale
enough to still carry the withdrawn surface. The override requires a reason
and NAMES what leaves — paths, operations and schemas, each listed.scripts/set-version.shnow moves three things it silently left behind:
generator/package-lock.json, the crate's own version in
packages/rust/Cargo.lock, and the generator goldens, which bake
SDK_VERSIONin four languages. That last one is why the firstv0.6.0tag
published nothing — 40 of 100 generator tests red at the tag, every language
job dead before its publish step. Measured again here: 48 of 114 red
immediately after the bump, before the refresh.scripts/check-prose-schema.tsreports 0 divergences over all 736
operations.
Known
- The SwiftPM mirror is stuck at 0.5.13 (2026-08-21) because
SWIFT_MIRROR_TOKENexpired; 0.5.15, 0.5.21, 0.5.24 and 0.6.0 never reached
it. Swift consumers do not get this release until that token is reissued —
this is not something the tag can fix. examples/react-landingstill asks foruarp-sdk: ^0.6.0. It cannot ask
for^0.7.0before 0.7.0 exists on npm, so that bump follows the publish
rather than preceding it.