Unreleased documentation. These pages follow the main branch and can change before the next release. For supported guidance, use v0.44.0.
This page records notable changes to the documentation site and the product versions it documents. Per-product release notes live in each product repository; the entries below link to the relevant product pages on this site rather than duplicating release notes.
Unreleased
Section titled “Unreleased”- BREAKING: Proposal lifecycle event subjects use
proposalReferenceandproposalRevision. Record event subjects keeprecordReferenceandrecordRevision. Update receivers that parse Proposal envelopes; mixed or open subject shapes are refused.
v0.44.0 beta-56
Section titled “v0.44.0 beta-56”- Managed local installations expose one
rstackcommand and install product components on demand. Registry Coordinator publishes its runtime and operator binaries, installer, and unified Node.js and Python client namespace for the first time. Its image remains held, as do Render client packages. Registry Document Store remains source-only. See Registry Coordinator and the client API.
- BREAKING: Base Registry Engine (BReg), Casework, and Scheduling start fresh
pre-1.0 database baselines. BReg refuses the v0.43.0
attachment-verification shape; Casework and Scheduling install schema version
200 and refuse lower ledgers. Keep each old database for reconciliation,
provision a fresh one, and apply the v0.44.0 package. Rebuild the BReg package
with the v0.44.0 tooling and apply it with
--initial. See upgrade and retire.
- BReg adds configured event-record descriptors, a caller-filtered read-only
event-record view in its Rust, Node.js, and Python clients, presentation
grouping, and configurable business identifiers. BREAKING: inspection
formats advance, sending-side webhook names become hook names,
eventDestinationsbecomesdestinations.hooks, and attachment storage and verification useurlinstead ofendpoint. See the BReg configuration reference.
- Scheduling adds composed bookings, named resource reservations, records-managed arrival windows, source busy import, operational appointment reads, source-managed assisted booking, attendance observations, and signed purpose-specific events. Casework adds approval templates and can count negative advice in a non-final stage without settling the review.
- Registry Evidence can generate fixed request bindings from selector fields and can set a target signing-validity maximum up to one year. BREAKING: the Evidence OID4VCI runtime requires a durable audit destination and a keyed-pseudonym hash key before startup. See configure Evidence OID4VCI.
- Evidence adds library-only building blocks for Token Status List checking and
status-ledger transitions. The running service does not call them, and
v0.44.0 does not issue credentials with a
statusclaim. The OID4VCI adapter routes exchange state through a store interface, but released configuration still selects the in-memory store and cannot select the PostgreSQL backend.
- The source tree includes a synthetic G2P and P2G payment simulator for lab
and workflow tests. It binds to loopback by default and requires explicit
--allow-networkto listen on a non-loopback address. The simulator never moves money and is not a released payment rail or runtime artifact.
- BREAKING: command reports use explicit
--format human|json; Manifest separates artifact selection from report encoding; client response bounds, attempt and connection timeouts, and mutation retry counts use their full parameter names. Update scripts and client construction together.
v0.43.0 beta-55
Section titled “v0.43.0 beta-55”- v0.43.0 continues the forward state path from v0.42.0. BREAKING: active
Base Registry Engine (BReg) Records cannot reference tombstoned targets. Build a successor package against
the deployed baseline, validate it on a representative restored-data copy,
repair invalid active references through the current package, and repeat
validation before activating the successor and switching runtimes.
bregctl plandoes not inspect live rows. See upgrade and retire.
- BREAKING: current product checks reject prohibited Unicode display controls
and same-namespace identifier definitions differing only by
-versus_. Run the applicable product checks before cutover and repair the reported definitions. Supported multilingual shaping and direction marks remain valid; equivalent peer labels warn unless--deny-warningsis selected. Discovery’s current parser checkstitleanddescription, while its immutable v1alpha1 schema, context, and SHACL remain unchanged. See configuration files.
- Base Registry Engine (BReg) inspection retains authored labels on fields, datasets, access
profiles, and hooks. Model inspection links objects to per-document source paths so a tool can
distinguish authored members from compiled defaults where those members correspond to source.
Lifecycle inspection describes each state’s responsibility,
including the conditions for submitted work. The model, access, and actions formats advance
to
v1alpha6, proposals tov1alpha2, and lifecycle tov1alpha7; select their matching schemas and rebuild packages. See authored values and display.
- Display-only BReg successor packages activate as metadata updates and retain compatible frozen Proposal submissions. Unchanged rebuilds remain empty plans. Casework routing findings point to the authored rule or stage and retain independent errors without duplicate findings for derived projections.
v0.42.0 beta-54
Section titled “v0.42.0 beta-54”- BREAKING: v0.42.0 reads no state that v0.41.0 wrote. The Base Registry Engine (BReg) carries no
state migration from v0.41.0 and names no refusal for an earlier database, so point it only at a
fresh one. Casework, Scheduling, and Messaging each install their schema as one baseline
numbered 100 and refuse a ledger below it at
plan,apply, and startup. Evidence needs a newly authored normalized project, target, and target authority. Migration: finish, drain, or record open work, keep each v0.41.0 database unchanged for reconciliation and rollback, and apply the v0.42.0 packages to fresh databases as upgrade and retire describes. See upgrades and state.
- BReg requires PostgreSQL 17 or later and a UTF8 database. Generated text columns and
indexes use the built-in
pg_catalog.pg_c_utf8collation, and a non-UTF8 database is refused with recovery guidance. Migration: provision the fresh BReg database on PostgreSQL 17 or later with UTF8 encoding.
- BREAKING: BReg projects declare
recordTypesand Actions, and durable Proposals replace the entity-backed change-request model and its routes, with no compatibility layer. The Rust, Node.js, and Python clients use standalone Proposal methods (startProposal,prepareProposal,executeProposal,recoverProposal, the Proposal attachment methods,getProposal, andlistProposals);immediateActionsbecomesactions,selectImmediateActionbecomesselectAction,contractFingerprintbecomesrevision, and BReg metadata is version 2. The Proposal list takeslimitand refusestop; ingestion runs takecursor, answernextCursor, and refuseafter. Proposal documents and events carry a requiredturn, lists filter byturnandstate=rejected, and a page may hold fewer thanlimititems. A Proposal event’ssubject.recordReferenceis/v1/proposals/{id}. A rejecting Review ends the Proposal in the terminal staterejectedand commands answer409 proposal.rejected; a changes-requested result recordsreview-returned. Under required ReviewapplicationStatus.statereadsawaiting-reviewuntil approval,application-refusedmeans only an executor refusal, and theapplylink reportsreview-changes-requestedorreview-endedwith recoveryrevise.applicationStatus.recoveryisretryorcorrect-input, and link availability no longer liststerminal.bregctl explain lifecycle,bregctl explain events, andbregctl explain routesanswerv1alpha6. Migration: rewrite the project, rebuild the package, update clients and receivers together, keep paging whilenextCursoris present, and start a new Proposal after a rejection. See manage changes.
- BREAKING: an immediate BReg Action whose declared field guard fails at commit answers
412 action.guard_failedinstead of412 precondition.failedwhen the current-target admission checks pass and the selected profile can read the failed guard’s target fields. The code confirms that blocker; it does not promise the Action would otherwise succeed. A stale condition or a guard the caller cannot read remains412 precondition.failed. Migration: clients that matchprecondition.failed, for example to offer reload and retry, must accept the new code.
- BREAKING: a decided Casework ReviewResult and every
ReviewDecisionReceiptname the selectedoutcome, and BReg reads it. An approve without an outcome is refused with400 request.invalidand reasonoutcome-not-declared, a policy withpurpose: approvalmust declare its approval outcomes, and approvals in one stage must name the same outcome (approval-outcome-differs). Every outcome declarespublicReason: required,optional, ornone; a decision’spublicReasonis bounded at 2000 bytes and released to the producer. A privatereasonover its bound answersmaximum-bytes-exceededinstead oftext-invalid. Migration: upgrade Casework and every review producer, including BReg, together, because mixed versions leave an approved Proposalsubmitted; addpublicReasonto every outcome and sendoutcomewith every approval.
- BREAKING: Casework replaces source-owned WorkItems with one ReviewPolicy, ReviewRequest,
ReviewTask, Decision, and ReviewResult model and refuses retained legacy schemas. The project
format follows the cross-product configuration conventions: duration objects such as
after: {hours: 48},terminalRetentionDaysandaccountabilityRetentionDays,retention: {receiptRetentionDays}for trusted producers, ID-keyed mappings in place of lists,type: stage, anchor objects,atRisk: {before: {workingDays: N}}, and nocompleteOnor routingwhen: {activity}. Producer findings readno-policies,too-many-policies,invalid-policy,duplicate-policy,receipt-retention-out-of-range, andreceipt-retention-exceeds-result-retention. Task list, next-task, and holdings reads finish a bounded scan or refusereview.query-too-broad. In Rust,ClockPolicyErrorgainsCalendar { at, reason }and is no longerCopy. Migration: rewrite the project from the error each old spelling reports, use a fresh database, update scripts that match the old codes, and narrow broad queues. See change a Casework package.
- BREAKING: configuration names converge. BReg moves
idempotency.receiptRetentionDaysandeventDelivery.payloadRetentionDaysinto a top-levelretentionblock asreceiptRetentionDaysandhookPayloadRetentionDays. BReg and SchedulingtaskGrantStatusentries namestatusResourceinstead ofcaseworkResource, and the Rust fieldTaskGrantStatusConfig::casework_resourcebecomesstatus_resource. Schedulingretention.attemptReceiptRetentionDaysand Messagingretention.submissionReceiptRetentionDaysbecomeretention.receiptRetentionDays, at most 365. Messaging and Scheduling defaultscopeClaimtoscope, and Scheduling defaultsreadsScopetoscheduling:readandexplainScopetoscheduling:explain. Old keys reportconfig.removed-key. Migration: rename each key, and set the scope settings explicitly when your issuer emits the earlier spellings.
- BREAKING: every token-verifying runtime, including Coordinator source builds, uses one issuer
network policy. An operator-declared issuer or JWKS URI may resolve to a private or loopback
address; a discovered cross-origin
jwks_urimust use HTTPS and may not. Cloud metadata and link-local addresses are always refused, and plain HTTP beyond loopback needsallowInsecureHttp: true. Migration: declare a private key endpoint asjwksSource: {type: uri, uri: ...}or serve it from the issuer origin. See connect an OIDC issuer.
- BREAKING: BReg audit records name activation UUIDs
activationId, and import authority records keepauthorityActivationId. Activation refuses withapply.hooks.local-retainedwhile local hook work needs the active package and audits the refusal with outcomerefused.bregctl webhook listreportsreplayEligibleonly when operator permission and the proposal policy both allow a replay. Events without a compiled delivery, and everyregistry-platform-hooksenvelope, are bounded at 1 MiB instead of 2 MiB. Scheduling reminder events use the shared hook envelope with content typeapplication/json. A stalledstdoutaudit destination refuses audited requests withAuditUnavailableReason::Stalledafter 5 seconds. Migration: update audit consumers and replay automation, runbregctl webhook drainbefore apply, project smaller events, and parse reminders as the hook envelope. See BReg webhooks.
- BREAKING:
bregctl doctornames why a database connection was refused withstartup.database.unreachable,capacity-exhausted,tls-refused,authentication-refused,missing,timeout,configuration-refused, orsecret-refusedinstead ofstartup.database.connection-refused, and reportsstartup.database.catalog-driftinstead ofstartup.database.unready. AcanonicalBaseIriin the reserved.invalidnamespace is refused asbreg.registry.canonical-base-iri-reservedoutside a database initialized forlocal. Migration: update automation that matches the old codes, and pointcanonicalBaseIriat a hostname you control. See inspect and diagnose.
- BREAKING: Evidence authoring uses one normalized
evidence.yamlproject with Sources, Functions, AssertionDefinitions, and Outputs, plus a separate target and complete target authority.EvidenceFixturecontrol keys use camelCase, such assyntheticOnlyandexpectedValue, and old spellings reportconfig.removed-key. Local development starts withevidencectl dev start PROJECT;dev --detachanddev --projectare removed. Migration: author the current model, rename fixture control keys, runevidencectl test PROJECT --target TARGET --deny-warnings, and rebuild the package.
- BREAKING: the Discovery bindings and
@registrystack/clientno longer exportvalidateSelectionorvalidate_selection.registry-platform-calendarresolves a deadline in a daylight-saving gap to the first instant after it and in a fold to the earlier instant, andCalendarEvaluationErroroffset variants carry their values. Migration: callvalidateSelectionStructureorvalidate_selection_structure, and match the calendar error variants with{ .. }.
- BReg serves one submitted Proposal version at
GET /v1/proposals/{id}/submissions/{version}, shows a reviewer’spublicReason, sweeps expired Evidence uses and terminal webhook metadata, uses declaredrecordTypes[].indexesfor filtered, sorted lists, and advertises a per-target availability check for immediate Actions with reference inputs. Casework acceptsrevokedKeyIdsandmaximumTokenLifetimeSeconds, keeps decided tasks in own-decision and supervision reads, and adds caseload preview and apply. Scheduling prunes outbox and observer metadata and expires raw claim owners afterretention.claimOwnerRetentionDays. BReg, Casework, and Messaging local development pull PostgreSQL from Docker Hub again, so development egress allowlists need Docker Hub.
- Registry Coordinator source is in the repository, but v0.42.0 publishes no Coordinator binary, image, or client namespace. Build it from source as configure the Coordinator describes.
v0.41.0 beta-53
Section titled “v0.41.0 beta-53”- BREAKING: the published
registry-stack-clientPython package requires Python 3.11 or later: itsRequires-Pythonis>=3.11(was>=3.10), its wheels are built against the Python 3.11 stable ABI and namedcp311-abi3(wascp310-abi3), and Python 3.10 is no longer supported. The floor moves because Python 3.10 reached end of life on 2026-10-01, so it no longer has the more than six months of upstream support that release preparation requires of a dependency pinned to a long-term-support line. Migration: run your application on Python 3.11 or later before you upgrade the client package, and name thecp311-abi3file where an install command names a wheel from the GitHub Release. The client API reference gives the runtime and platform requirements of the package.
- BREAKING: the published
@registrystack/clientNode.js package and its platform packages@registrystack/client-darwin-arm64,@registrystack/client-linux-arm64-gnu, and@registrystack/client-linux-x64-gnurequire Node.js 24.11.0 or later: theirengines.nodeis>=24.11.0(was>=22.12.0), and Node.js 22 is no longer supported. The floor moves because Node.js 22 reaches end of life on 2027-04-30, so from 2026-10-30 it no longer has the more than six months of upstream support that release preparation requires of a dependency pinned to a long-term-support line. Migration: run your application on Node.js 24 LTS, version 24.11.0 or later, before you upgrade the client package. The client API reference gives the runtime and platform requirements of the package.
- Standalone Linux binaries, including CLI tools, and the Base Registry Engine (BReg), Registry Casework, Registry Scheduling, and Evidence installers accept glibc 2.34 and newer, where they required 2.35. glibc 2.34 is the version the RHEL 9 family and Amazon Linux 2023 carry. See known limitations.
- Workflow
actions/setup-gosteps that compile AWS-LC-FIPS from source use Go 1.27.2, where they used 1.24.4. Go remains a build tool and is not shipped. The distinct canonical Linux builder still uses the snapshot-pinned Go package in its Debian 13 builder image.
- The four BReg, Registry Casework, Registry Scheduling, and Evidence installers start every staged
Linux binary with
--versionbefore they select the release, as they already did on macOS. An installer checks the glibc floor of the release it was published with, so an installer asked for an earlier release could select binaries built for a newer glibc than the host carries; those binaries then failed at first run. The installer now refuses that release, names the binary that did not start, and leaves the installed toolset selected. See known limitations.
- BREAKING: BReg revision reads no longer accept the v0.38.0-and-earlier provenance that journaled
an immediate action under its effect identifier. A detail read, or a list page containing such a
revision, answers
503 source.unavailable. v0.41.0 reads only predecessor state created by a v0.40.0 apply, which already journals the entity’s canonical operation identifier and needs no change. An older deployment must first follow the v0.40.0 fresh-database migration, then upgrade that v0.40.0 predecessor state.
- BREAKING: BReg refuses a database without subject access-log storage before it binds a listener.
Every apply from v0.38.0 onward installed that storage, including when the package declares no
accessLog, so predecessor state created by a v0.40.0 apply needs no change. v0.41.0 does not upgrade older state in place: an older deployment must first follow the v0.40.0 fresh-database migration, then upgrade that v0.40.0 predecessor state.
- BReg’s Rust, Node.js, and Python clients accept additive object members in metadata and valid
Problem envelopes. Unsupported must-understand capabilities disable only the affected binding,
and unsupported descriptive metadata omits only the affected statistical dataset, descriptive
change-request capability, selector, or spatial capability. An unknown temporal mode retains its
inert
temporaldescriptor because null means the collection is non-temporal. Valid unknown Problem codes retain their HTTP status and trace ID without inferred semantics; malformed known fields and envelopes still fail as protocol errors.
bregctl devderives the local runtime’s principal and purpose claim mappings from the compiled project and refuses an unservable mixed mapping before it retains development state.caseworkctl source adduses the same-versionbregctl explain accessresult to generate thecasework-readerprofile with the BReg project’s one compiledprincipalClaim, preserves exact test-bound client variants, and accepts equivalent trailing-slash spellings of the Casework review endpoint.
- The native citizen self-registration acceptance project combines ThunderID SMS signup, account-owned BReg applications, Casework review, and transactional Person creation, account linking, and program enrollment through configured BReg actions. It proves an adopter composition across existing product boundaries and adds no built-in business model or runtime.
- Registry Casework task templates can use
authorizationMode: deferredwith a lifetime of up to seven days. Immediate grants keep their 900-second ceiling. A deferred review grant is bound to the task’s assignment generation and ends when assignment or terminal state changes; deferred grants cannot carry Evidence bounds. Casework migration 0022 installs the grant-window constraints and assignment-generation trigger, validating the affected tables under an exclusive lock.
- The shared Registry Platform task-grant status transport now supplies BReg and Scheduling with
TaskGrantStatusConfig, endpoint validation, status credentials, exact binding checks, and the default Casework status scope and route. BReg accepts optionalstatusScopeandstatusPath, and its development tooling can bind declared Casework task authorities into the generated runtime.
- BREAKING: BReg treats a
401or403from the Casework task-grant status endpoint as an outage, answering503 service.unavailablewhere it answered412 precondition.failed. A404still refuses the grant with412. The shared transport identifies itself asregistry-task-statusinstead ofregistry-breg-task-status. Update alerts for a revoked or misconfigured status client, and update access-log user-agent matches.
- BREAKING: BReg validates each
taskGrantStatusentry when it reads the runtime file and reportsbreg.runtime.invalid-task-grant-statusat/taskGrantStatus, where activation reportedbreg.runtime.invalid-binding. The endpoint and client members now use their URL, external identifier, resource URI, and issuer types at that boundary. A configuration that v0.40.0 activated already meets the member rules. Update scripts that match the earlier diagnostic code.
- BREAKING: Registry Casework removes
casework migrateandcaseworkctl db. Usecaseworkctl plan --runtime-config FILEfollowed bycaseworkctl apply --runtime-config FILE. It also removes thecasework.package.retired-manifestrefusal. v0.40.0 already refused these commands and packages with the retired manifest, so no valid v0.40.0 package needs rebuilding for this cleanup. Rebuild an older retained package withcaseworkctl packageinstead of matching the removed code.
- BREAKING:
caseworkctl devremoves a database volume only when it carries the session ownership label. Every v0.40.0 session labels its volume. Before you remove an older unlabeledcasework-dev-<identifier>volume, inspect and back up its contents. Removing the volume withdocker volume rmpermanently destroys its data. Follow the v0.41.0 release note.
- BREAKING: the Casework BReg source adapter refuses a legacy bare continuation cursor that names no request entity. Every cursor stored by v0.40.0 names its entity, so a v0.40.0 database needs no migration.
- BREAKING:
caseworkctl devreports five configuration refusals with exit status 1, where it reportedcaseworkctl.operational-failureand exit status 3:caseworkctl.dev.integrations-invalid,caseworkctl.dev.shared-client-mismatch,caseworkctl.dev.shared-task-authority-mismatch,caseworkctl.dev.source-binding-invalid, andcaseworkctl.dev.borrowed-principal-invalid. A borrowed issuer session also refusesprincipalClaim: sub, because that claim names the issuer owner’s subject. Use a stable claim in every Casework access profile, register it for each client in both projects’dev-clients.yaml, and update scripts that match the earlier status and code.
- BREAKING:
CaseworkTaskAssertionSourceclassifies a Casework4xxassertion refusal other than408or429asinvalid-credential, where it classified every failure asunavailable. Request a new approval instead of retrying an expired, revoked, or absent grant.
- BREAKING:
evidencectl buildis now an unknown command. Useevidencectl packagewith the project directory as its positional argument and retain the same--targetand--outputoptions.evidencectl initandevidencectl newno longer accept the inactive--generate-keysoption; remove it because a local project already creates disposable keys.
- BREAKING: Registry Scheduling requires a top-level
taskGrantStatusin every runtime file. List one to 32 task authorities whenever the deployment requires current status or revocation checks, and for deferred work.taskGrantStatus: unchecked-final-fifteen-minuteschecks only the grant’s remaining lifetime because the signed token does not identify its original mode. It admits any grant with at most 900 seconds remaining without checking revocation, including the final 900 seconds of a deferred grant. Use it only when the deployment accepts that stale-authority window. An omitted member is refused at startup withscheduling.runtime.missing-task-grant-status.
- BREAKING: Registry Scheduling removes three refusals for pre-v0.40.0 inputs.
scheduling migrateis an unknown command; activate withschedulingctl planandschedulingctl apply.scheduling.package.retired-manifestis replaced by the ordinary package-content refusals, so rebuild withschedulingctl package.schedulingctl.activation.earlier-releaseis replaced byschedulingctl.store-unavailable, so start from a new database when the retained policy uses the pre-v0.40.0 identity. A database activated by v0.40.0 needs no reset. Direct Rust consumers must removeRuntimeError::RemovedCommand,RuntimeError::exit_code,runtime::removed_command_refusal,RuntimeConfigError::RetiredPackageManifest,config::RETIRED_PACKAGE_MANIFEST_FILE, andStoreError::EarlierRelease.
- Registry Scheduling’s
POST /v1/appointments/receiptand Registry Messaging’sPOST /v1/messages/receiptuse the originalIdempotency-Key, request body, and verified caller identity to resolve the retained original success receipt. They do not return the request body or repeat the mutation. Both routes use current ordinary read authority. Scheduling can recover the receipt after the task grant ends. An unresolved receipt answers409 receipt.unresolved, which does not prove that no effect occurred. The Rust, Node.js, and Python clients carry both routes.
- BREAKING (Rust API):
registry_scheduling_core::ProblemCodeandregistry_messaging_core::ProblemCodegainReceiptUnresolved. Add that arm, or a wildcard arm, to exhaustive matches.
- BReg and Casework local development pull the same pinned PostgreSQL image from
public.ecr.aws/docker/library/postgres. Messaging pulls that PostgreSQL mirror and Mailpit fromghcr.io/axllent/mailpit. Development egress allowlists must admitpublic.ecr.awsand, for Messaging,ghcr.io. Retained BReg and Casework containers using the earlier Docker Hub PostgreSQL reference at the same digest remain accepted; BReg PostGIS sessions still use Docker Hub’spostgis/postgisimage.
v0.40.0 beta-52
Section titled “v0.40.0 beta-52”- BREAKING: v0.40.0 does not upgrade v0.39.0 configuration, packages, or databases in place, and it provides no automatic migration. Rewrite the configuration you keep, rebuild every package with the v0.40.0 tools, repin expected digests, and apply Base Registry Engine (BReg), Registry Casework, Registry Scheduling, and Registry Messaging to new databases. A new database holds no spent idempotency key, so a committed write replayed against it can execute again: finish recovering outstanding writes against the v0.39.0 runtime, and stop that runtime, before you direct callers to the new deployment. The forward state path starts at v0.40.0, and later releases again read the state their immediate predecessor wrote. Follow the upgrade steps; upgrades and state gives the rule.
- BREAKING: every maintained product reads its files under one configuration convention.
Authored, operator, fixture, development-state, and report formats open with a product-owned
apiVersionandkindenvelope and follow shared reader rules, and a retired form has no compatibility alias. Registry Manifest’s exchange envelopes and the frozen Evidence Gateway deployment grammars keep their documented exceptions. The v0.40.0 release notes link the complete migration notes: 269 breaking items across nine product fragments, each with its replacement form, migration step, and diagnostic mapping. Read the fragment for every product you run. Configuration files states the shared rules and lists the formats by product.
- BREAKING: a variant block is tagged by
typewhere its format documents one, including an issuer’sjwksSourceand action and hook handlers. Multi-word protocol values, tooling statuses, and client error classifications are written in kebab-case where the product notes say so: for example, the Evidence problem codeevidence.invalid_requestisevidence.invalid-request, and thestatuslabel ofevidence_http_requests_totalisclient-errororserver-error. Update configuration and every comparison in scripts, clients, audit queries, and alerts from the old-to-new tables in the migration notes. Standard-owned words, including registered OAuth error codes, keep their standard spelling.
- BREAKING: offline checks report positioned, value-free diagnostics and share one exit
contract: 0 when the input is accepted, 1 on a refusal or on a warning under
--deny-warnings, 2 on a usage error, and 3 when an input cannot be read.bregctl checkandschedulingctl checktake--deny-warnings, where they took--deny-findings, and plainevidence checkis offline: runevidence check --require-runtime-dependencieson the target host for the full proof. Update automation that matched earlier sentences, dotted field paths, diagnostic codes, report members, or product-specific exit values. See read a diagnostic and check a file before you deploy it.
- BREAKING: closed inputs refuse unknown or duplicate keys, explicit nulls, substitution outside a declared scalar position, invalid or duplicate identifiers, and out-of-range values. Delete an optional member written as null, and replace secret paths with the documented secret references. Shared URL fields refuse raw backslashes, whitespace, control characters, and a host the URL parser rewrites: write an internationalized host in punycode and an IPv4 address in canonical form.
- BREAKING: OIDC
allowedClientsis required, and a repeated client is refused. List the clients the deployment admits. Writeunrestrictedonly where the product allows it: BReg accepts it, and Registry Scheduling and Registry Messaging accept it in no mode. A client listed underassertionIssuersnames at least one issuer; remove an empty entry to grant it no exchange authority.
- BREAKING: a BReg registry serves authenticated callers only.
anonymouson an access profile is refused asconfig.removed-key, and every route except the probes and the review completion receiver answers a request without a verified bearer token with401 authentication.refusedbefore any profile, query, or record is read. Thebreg_anonymous_refusals_totalmetric is removed, and a baseline package that granted unauthenticated access is refused.
- BREAKING: a BReg access profile groups its
permissionsas a mapping ofentities,actions, anddatasets, where it was one list, andrequiredScopesis required on every profile asunrestrictedor a list of at least one scope. Access to a statistical dataset is granted there as{dataset, operations}with the operationsread-live,publish, andread-releases, andliveandreleaseson astatisticalDatasetsentry are refused. A standing agent profile,actorKind: agentwithouttaskGrant, cannot holdpublish: move it to a profile a person or service uses directly, re-lock affected modules, and rebuild the package.
- BREAKING: BReg spends an idempotency key once per configured issuer and verified caller
across ordinary write routes. A changed write under a spent key answers
409 idempotency.conflict, and an exact retry after the receipt horizon answers410 idempotency.expiredand never executes again in that database. Use a new key for every distinct write.idempotency.receiptRetentionDayssets the horizon, 7 days by default and at most 365. BReg schedules no automatic sweep: runbregctl idempotency-retention erase-expiredas drop expired idempotency responses describes.
- BREAKING: a BReg ingestion run belongs to the verified caller, where it belonged to an
audit-keyed pseudonym, and no run, chunk, or receipt crosses the state reset. A
bregctl data importcheckpoint written against v0.39.0 cannot resume against the new registry: import again with a new checkpoint path.
- BREAKING: BReg governed record, history, statistics, attachment, GIS, ingestion-run, and
discovery reads refuse
HEADwith the concealed 404 an unsupported method receives. SendGET./health,/healthz, and/readystill answerHEAD.
- BREAKING: every BReg governed action handler declares
abi: registry.action-handler/v1, and a retainedregistry.action-handler/v2declaration is refused withbreg.action.handler-abi-invalid. An action’sevidencedeclaration alone selects Evidence access for its Rhai handler. Replace the v2 value, keep theevidencedeclaration, re-lock affected modules, and rebuild the package. Evidence consumption by an action remains a trial.
- Registry Casework adds reviewer and Supervisor discovery. Active review-task lists accept
ownership=assigned-to-meandownership=unclaimed, a decided single-task read includesdecidedByCaller, and the decision author can recover a minimaldecisionReceiptthat excludes the private reason and the producer result.GET /v1/review-tasks/own-decisionslists the caller’s retained decisions, andGET /v1/review-tasks/supervisionlists active and retained terminal tasks in a Supervisor’s current queues without a holder, submitted context, private reason, or producer result. An expired, erased, mismatched, or unauthorized continuation answers410 review.result-expired: restart without a cursor. See the Registry Casework API.
- BREAKING: Registry Casework activation refuses a policy package that no longer declares the
review producer of an in-flight review.
caseworkctl planandcaseworkctl applyreportcasework.activation.stranded-work, naming the producer and the number of in-flight reviews, and the runtime repeats the refusal before it listens. Let the reviews that producer submitted reach a result before you remove or rename it, or setpackage.acknowledgeStrandedWorkto the digest the refusal names.
- BREAKING: Registry Messaging scopes a spent submission key to the caller’s verified issuer and
subject, and rotating the audit hash key no longer frees it. A changed request under a key
whose receipt has passed
retention.submissionReceiptRetentionDaysanswers409 idempotency.key-reusedfor as long as the message record is held. Onceretention.recordRetentionDayshas cleared the record and its request hash, every request under the key answers410 idempotency.expired. Deploy Registry Messaging gives the drain to finish before you move senders to the new runtime.
- Registry Scheduling owns a hold or an appointment by the verified issuer and subject that booked it, so rotating the audit hash key no longer detaches a caller from its claims.
- BREAKING: several commands rename an argument and accept no alias.
evidence-oid4vci check,inspect, andservetake--runtime-config FILEandEVIDENCE_OID4VCI_RUNTIME_CONFIG, where they took--config FILEandEVIDENCE_OID4VCI_CONFIG.schedulingctl records applyandintentstake the runtime file as--runtime-config FILE, where it was positional.caseworkctl simulatetakes--simulation FILE, where it took--fixture FILE.evidencectlrefuses--projectontarget explain,dev stop,dev clean,source add,source suggest,source detach,fixtures run, andtooling editor: pass the project directory as the positional argument.
evidencectl dev start PROJECT --target TARGET --issuer-project OWNER --preserve-target-authenticated-contextkeeps a selected local target’s reviewed humanauthenticated-contextbindings for a borrowed BReg issuer. A retained local session keeps the mode it started in: stop and clean it before you start it in the other mode.
- The BReg, Registry Casework, Registry Scheduling, and Registry Messaging clients report an
unknown mutation outcome and resend a keyed mutation under the same key, with the same
request, at most twice by default. A 4xx response or an unusable
Retry-Afterstops the resend. See unknown outcomes and the same-key retry.
- The unified Node.js and Python clients add Registry Scheduling: the
schedulingnamespace of@registrystack/clientand theregistry_client.schedulingmodule ofregistry-stack-client. BReg immediate-action preparation and recovery are available in Node.js and Python. The Rust, Node.js, and Python BReg clients read the caller-filteredstatisticalDatasetsdescriptors the runtime publishes, and BReg and its clients accept a record or GeoJSON continuation of up to 10,978 bytes. See the client API reference.
- API stability and versioning publishes the compatibility promise that takes effect at 1.0: the promised products and surfaces, the experimental surfaces, and the deprecation rules. v0.40.0 remains pre-1.0, and this release does not activate the promise.
- BREAKING: for direct Rust consumers of the workspace crates,
RuntimeConfigErrorexposes diagnostics in place ofRuntimeConfigErrorKind,kind(),code(),field(), andmessage().registry-platform-dispatchandregistry-platform-hookswrite their state words in kebab-case, Registry Manifest removesrender_entity_shaclin favor ofrender_shacl, and the shared APIs that only the retired Registry Relay consumed are removed. The Platform changelog keeps the complete inventory of removed items.
v0.39.0 beta-51
Section titled “v0.39.0 beta-51”- BREAKING: Registry Relay is retired and absent from 0.39.0. The
relayandrelayctlbinaries, the Relay installer, the Relay container image, theregistry-relay-clientRust crate, and therelaynamespace of the unified Rust, Node.js, and Python clients are removed, and Registry Discovery refuses a package index that contains a Relay service. v0.38.0 is the last release that ships them, and Relay receives no security fixes once 0.39.0 is released. There is no automatic migration: choose Base Registry Engine, Evidence Gateway, or Registry Manifest for each consumer and source, removerelayclient imports, and remove Relay origins from a Discovery index and rebuild it withdiscoveryctl packagebefore upgrading. The Registry Relay retirement decision gives the scope, the support boundary, and where the v0.38.0 release and documentation remain available.
- BREAKING: before 1.0, a release reads only the state its immediate predecessor wrote. v0.39.0 reads state written by v0.38.0 and nothing older, and the paths that served only earlier releases are removed from Base Registry Engine (BReg), Registry Casework, Evidence, and Registry Scheduling. Upgrade one release at a time and finish each release’s upgrade steps before starting the next. Each product changelog lists every removed command, option, key, and refusal code.
- BREAKING: every BReg project compiles to a new
registryRevisionand a new managed schema fingerprint, because every package installs the statistical release store, and a package v0.38.0 built no longer loads in the v0.39.0 runtime. A project that declares immediate actions, derived string, text, decimal, integer, or vocabulary fields, or one vocabulary on projected fields that admit different codes also changes its generated row policy, views, or codelist. Rebuild it with the v0.39.0bregctl testandbregctl package, each naming the deployed package with--baseline-package, as test and package the successor gives in full, and apply it withbregctl planandbregctl applybefore switching the runtime. Then repin any Registry Casework BReg source for it withcaseworkctl source add ... --applyand package, plan, and apply the Casework project once. A package whose project declares a change-requestplanneris now accepted as the predecessor, where earlier releases refused it and no successor of it could be built or applied.
- BReg adds governed statistical datasets. A root project declares count datasets under
statisticalDatasets; a live profile reads exact counts its own list grant could already count, one publisher publishes immutable versioned releases under minimum-count suppression and rounding, and a released-data reader needs no record permission. Seven operations under/v1/statistics/serve JSON or CSV,bregctl statistics publishandwithdrawdrive the lifecycle over HTTP, and the Rust, Node.js, and Python clients carry the operations. Publish a statistical series gives the steps, and the publish statistics states the inference risks the disclosure method accepts.
- BREAKING: BReg derived SQL accepts only reviewed PostgreSQL grammar.
JSON_QUERY,JSON_TABLE,XMLTABLE, SQL/JSON aggregates and constructors, XML functions,NATURALandUSINGjoins, column alias lists, whole-row references, and casts outside the reviewed built-in scalar types are refused;JSON_VALUEandJSON_EXISTSstay available. A derived value that does not fit its declared length, scale, precision, range, or vocabulary is no longer truncated or rounded: the generated view raises a value-free error and an API read of it answers503 source.unavailable.
- BREAKING: the BReg
containsandprefixtext-search operators (containsandstartswithin$filter) match without regard to case on string, text, and vocabulary-code fields.%,_, and backslash match literally, andequalsandinkeep exact, case-sensitive matching.
- BREAKING: a BReg background worker or the metrics listener that panics or returns before
shutdown ends
bregwith exit status 1, where the process kept serving without the task. Runbregunder a supervisor that restarts it on failure. The metrics listener publishesbreg_worker_last_success_age_seconds,breg_queue_oldest_pending_age_seconds, andbreg_active_package_infowith the package digest the process verified at startup.
- BREAKING:
bregctl applyandplanreport a migration lock another session holds asapply.database.in_progress, where they reportedapply.database.unavailable, and the maintenance commands report it under their ownin_progresscodes. The webhook, request-retention, import-authority, and evidence-retention commands refuse a package thatpackage.expectedDigestdoes not pin under*.package.refusedcodes.bregctl applyandplantake--expected-digestand refuse another package asapply.package.digest_mismatchbefore any database contact.
- BREAKING: a BReg reviewed migration’s
rehearsal.jsonno longer carriesproofs, andbregctl testandpackagerefuse a receipt that still does withmigration.review.receipt_proofs_retired.bregctl test --fingerprint-onlymeasures the schema fingerprint a fresh install of the candidate produces without running fixtures.
- BREAKING: the BReg WebAssembly executor builds Wasmtime without its default features and
refuses a handler module that uses GC types, exception handling, or
externref. A build without thewasmfeature refuses a WASM hook handler withhook.handler.wasm_build_unsupported. The executor runs Wasmtime 48.0.5, which carries the fixes for RUSTSEC-2026-0325, RUSTSEC-2026-0326, and RUSTSEC-2026-0327.
- BREAKING:
bregctl devtakes PostgreSQL loopback port 15432 on a first start, where it took 55432, andcaseworkctl devtakes 15433, where it took 55433. A session that already started keeps its port.bregctl devpins a session on its compiled content, so runbregctl dev stop --removeon a session an earlier release started.
bregctl checkreportsaccess.profile.create_required_field_not_writablewhen a direct create or import grant omits a required writable stored field. A missing or malformedIdempotency-Keyon a BReg immediate action names the header infieldPath, and the Rust, Node.js, and Python BReg clients expose the validatedfieldPathof an accepted problem.
- A Registry Casework inbox view that is empty over a recently reconciled source returns
complete. Retry abudget_exhaustedpage that waited only for source discovery without a cursor, and deduplicate the retried walk byitemId.caseworkctl source add --casework-endpoint URLsets the Casework endpoint of the local BReg review authority, andcaseworkctl devreports a local session failure undercaseworkctl.dev.*codes.
- BREAKING: Registry Discovery service search accepts
serviceKind=evidenceonly and no longer takes thesemanticClassandoperationFamilyfilters. A search that sendsserviceKind=relayor either filter answers400with the invalid-request problem.
- A nightly channel publishes evaluation builds from protected
mainas immutable GitHub prereleases and container image tags, with no npm package, PyPI package, or documentation site. The BReg, Casework, and Evidence installers downloaded from a numbered release stay pinned to that release. Use a numbered release for a production deployment.
v0.38.0 beta-50
Section titled “v0.38.0 beta-50”- BREAKING: a Base Registry Engine (BReg) direct create, patch, or batch item whose resulting row
falls outside the caller’s row boundary answers
412 precondition.failedbefore any write, where it answered503 service.unavailable. Retrying the unchanged request cannot succeed, a batch carrying one such item commits none of them, and a genuine PostgreSQL privilege failure still answers503. Handle a412on a create as a boundary refusal, not a retryable outage.
- BREAKING: the generated BReg OpenAPI document lists
412 precondition.failedon every create and batch operation reachable through a profile withrowBoundaries, so such a project compiles to a newregistryRevisionand a package an earlier release built for it no longer loads. Rebuild it unchanged with the v0.38.0bregctl testandbregctl package, each naming the deployed package with--baseline-package, as test and package the successor gives in full, and apply it withbregctl planandbregctl apply, then repin any Registry Casework BReg source for it withcaseworkctl source add ... --applyand package, plan, and apply the Casework project once.
- A BReg entity may declare
accessLogto keep a subject-facing log of reads of its records. The record subject reads it atGET /v1/records/{route}/{id}/access-log, retention defaults to 90 days,trustedIntermediariesmay forward the original requester and purpose, andexemptionsdelay a documented entry without omitting it. The log is stored apart from the operational audit, and a failed log insert refuses the read.
- BReg automatic review executors can renew credentials with
privateKeyJwt, andbregctl review-recovery retry-applicationrequeues an executor-denied job. Webhook dead letters keep a closed failure reason, andbregctl webhook discardcloses eligible work captured under a superseded binding without replaying it.
- BREAKING: Registry Casework and Registry Scheduling activation (
plan,apply, andstatus) and runtime startup refuse a PostgreSQL server older than 17, before any migration or activation write. Upgrade the database server before upgrading either product.
- BREAKING: Registry Scheduling publishes the
v1alpha2HTTP contract. Holds and appointments carry a requiredexternalReferencesarray of opaque{product, recordType, identifier}links, a hold or direct booking may send it, and a reschedule must omit it.GET /v1/appointmentslists the caller’s own appointments carrying one exact reference. The fresh-install baseline stores the references, so configure and apply a fresh database before restarting, and upgrade the runtime before any client sends the field.
- BREAKING: an Evidence requirement’s
subjectRoles[].roleis limited to 64 bytes instead of 128, in the bundle schema and at startup. Shorten a longer role and every input that names it before upgrading.
- An Evidence
http-jsonsource may declareevidenceto read one predefined assertion from another Evidence deployment, verified against pinnedtrustedJwksbefore projection. Separately, a source that does not declareevidencemay setforwardAccessAttributionto send the verified requester and purpose to a source that trusts this service as an intermediary; startup refuses a source that sets both.evidence-oid4vcivalidates its whole catalog and every offer before an offer secret exists.
- The release publishes a
discoveryctlLinux amd64 binary and a standalone Registry Scheduling Linux amd64 runtime binary beside the Scheduling image andschedulingctlbinaries.
- Registry Messaging and Registry Render ship for the first time, each as release binaries and a
ghcr.io/registrystack/<name>image, and the Evidence OID4VCI adapter gains theghcr.io/registrystack/evidence-oid4vciimage. The unified Node.js and Python clients add amessagingnamespace. See deploy Registry Messaging and run Registry Render in serve mode.
breg-mcpships for the first time, a supporting service beside BReg: an MCP gateway a chat host uses to act for one verified citizen. It reads the citizen’s own record and creates or patches change-request drafts for it, and has no code path to submit, revise, cancel, or apply one. It verifies the chat host’s token as an OAuth protected resource and, for every tool call, exchanges it (RFC 8693) for a registry token with the gateway as actor, so the chat host’s token never reaches BReg. It takes a draft’s target from the citizen’s own linked record, never from a tool argument.breg-mcp checkvalidates the runtime configuration andbreg-mcp serveruns the gateway. This release publishesbreg-mcpandbreg-reviewas binaries for Linux amd64, Linux arm64, and macOS arm64, and as theghcr.io/registrystack/breg-mcpandghcr.io/registrystack/breg-reviewimages; the BReg installer does not install them. See citizen chat assistant.
breg-reviewships for the first time, a server-rendered review page beside the gateway. The citizen signs in with an authorization code and PKCE, reads the draft BReg holds under their own token, and submits it; the page holds no authority of its own.breg-review checkvalidates the runtime configuration and resolves its secrets without opening a socket, andbreg-review servelistens at its explicit privatelistener.bindand stops cleanly on SIGINT or SIGTERM. Its shared audit stream records the action, thechangeRequestId, keyedprincipalPseudonymandclientPseudonymvalues, and the outcome, never a field value or token.
- The VS Code and Zed integrations cover every maintained product, and the language server reads
only
.yaml,.yml, and.jsonproduct documents.
v0.37.0 beta-49
Section titled “v0.37.0 beta-49”- BREAKING: Base Registry Engine (BReg) refuses to compile a standing
agent profile, one with
actorKind: agentand notaskGrant, that holdssubmit_request,revise_request,cancel_request, orapply_request, withaccess_profile.standing_agent.operation_forbidden, or that holdscreateorpatchon an entity without achangeRequest, orimport,tombstone, orbatchon any entity, withaccess_profile.standing_agent.direct_mutation_forbidden. A standing agent carries no human approval, so it may read and author change-request drafts while a human submits them; move the lifecycle operations to a profile the person uses directly.
- BREAKING: BReg refuses to compile a standing agent profile that holds an
immediate-action permission, with
access_profile.standing_agent.action_forbidden. An immediate action commits its effects at once, with no draft for the person to confirm, so a token carrying a trustedactno longer reaches any immediate action. Move the action permission to a profile the person uses directly.
- BREAKING: BReg refuses to compile a module that contributes an access
profile declaring a
taskGrant, whether on an entity it adds or on one it extends, withaccess_profile.task_grant.module_forbidden. Task-grant ceilings are checked only where grants are authored, in projectaccessProfiles; declare the task-grant profile there.
- BREAKING: BReg accepts an
actclaim of exactly{sub, iss}whenissequals the verified token issuer, as a token exchange writes it, beside exactly{sub}. A token whoseact.subis the trusted actor for its client is an agent token whatever itsregistry_actor_kindclaim says, so it no longer satisfies a profile that declaresactorKind: human.
- BREAKING: BReg admits a token carrying a trusted
actonly on an access profile that declaresactorKind: agent. A profile that declares noactorKindrefuses such a token, so a delegated caller cannot borrow the operations of a profile written for people using BReg directly. Tokens withoutactare admitted as before.
- BReg’s audit journal records the agent behind a delegated request. A
request carrying a trusted
actwrites the sharedauthorizationobject on its refusal, mutation, and request lifecycle records, with actor kindagentand a keyedactorPseudonymscoped to the package revision beside the principal and client pseudonyms. The raw actor identifier is never stored, and task-grant records withoutactare unchanged.
- BReg’s audit journal records delegated authority on reads. A read’s
terminal record, for records, lists, lookups, revisions, history, and
snapshots, now carries the
authorizationobject for a task-grant or delegated token. Direct tokens record no such object, as before.
registry-platform-ratelimitis a new shared crate with two in-memory keyed limiters,TokenBucketLimiterandFixedWindowCounter, each capped at a fixed number of tracked keys. Evidence now uses it for its request budget and failed-selector counter with no change in behavior: the same refill, key cap, pruning, and refusals.
- Platform crates gain token exchange, sign-in, and security header primitives.
ExchangeAuthorization::upstreamsends an optional actor token with an RFC 8693 exchange.PrivateKeyJwt::redeem_authorization_coderedeems an authorization code with PKCE and the configured resource, and returns any ID token unverified.CspBuilder::deny_by_defaultstarts a policy fromdefault-src 'none', andwith_form_actionandwith_style_srcadd directives to it.AuthorizationAuditEvent::without_purposebuilds an allowed or denied event for a product that records no purpose. Thetest-authorization-serverfeature ofregistry-platform-testingadds a local authorization server for authorization code, client credentials, and token exchange tests.
- BREAKING: a Base Registry Engine (BReg) record or query
400names the member or parameter at fault infieldPath, where it carried none before;detailandcodeare unchanged. A create body names/dataor/data/<apiName>, a JSON Patch document names/<n>and its members, a batch body names/items,/changeContext, and each item’s members, a malformedIdempotency-Keyand a batchIf-Matchname the header, and aquery.invalidrefusal names the parameter. An unknown and a withheld name answer the same problem and are never echoed. The v0.37.0 Rust, Node.js, and Python BReg clients acceptfieldPathonrequest.invalidandquery.invalid; upgrade a client that rejects unfamiliar problem members with the runtime. See Mutations.
- BREAKING: a BReg JSON Patch
testof a field the grant does not let the caller read answers400 request.invalidat/<n>/pathbefore the record is read, like atestof an unknown field, instead of a404or412first. Test only fields the grant lists inreadableFields. A read path whose target entity has no permission entry in the caller’s profile answers with the records the path grant authorizes instead of503 source.unavailable.
- BREAKING: Registry Casework selects the source profile only by the
Registry-Source-Profileheader on decide and both attempt recovery routes.DecideRequestno longer carriessourceProfileId,RecoverAttemptRequestis a closed empty object, and a body that still sendssourceProfileIdis refused with 422request.unprocessable; the Rust, Node.js, and Python clients follow.caseworkctl dev tokenwrites theRegistry-Casework-Profileline into a profile client’s header file, and a review inbox left empty only because that header is missing answers 400source-profile.required. See Revisions, actions, and recovery.
- BREAKING: every Casework mutating route parses its JSON body strictly: a duplicate object member at
any depth, or a raw integer IEEE 754 binary64 cannot represent exactly, is refused with 422
request.unprocessable, and aContent-Typethat does not parse whole asapplication/jsonorapplication/*+jsonis refused with 415request.unsupported-media-type. Send such an integer as a string.
- Registry Casework refuses a zero or over-maximum page
limitwith the new closed problem coderequest.limit-out-of-range, andReviewTaskPagecarries a requiredstatus. A plain item, history, or clocks read across a moved source binding returns the retained item without actions instead of 409work-item.proposal-changed. A source binding or policy field an adapter refuses is named by its key path. See Problem codes.
- Registry Scheduling starts a hold’s time to live once its capacity transaction takes its locks,
so a hold created under contention keeps its whole
holdPolicy.ttlMinutes, and answers availability for a horizon orstartpast the last representable instant instead of panicking the request.
v0.36.0 beta-48
Section titled “v0.36.0 beta-48”- BREAKING: Base Registry Engine (BReg) records every activation in a database ledger and ships
unsigned, environment-neutral packages named by their package digest. Package signing is removed,
so upgrade to v0.35.0 first: this release does not read a predecessor package without a
SHA256SUMSenvelope.bregctl planandbregctl statusreport what an apply would change and what the database activated, andbregctl applywithout--initialadopts a database an earlier release installed.package.environmentandpackage.instanceIdmove to the runtime file’sidentity,package.sequenceis removed, and the runtimepackageblock keeps onlyrootandexpectedDigest. Every package’s schema fingerprint changes, and a project that declared a package identity compiles to a newregistryRevision, so rebuild each package with the v0.36.0bregctl package. In split-role mode, plan, apply, and startup refuse a runtime role that can write the ledger or the registry state. After upgrading BReg, re-import each BReg source into Evidence once and repin each BReg source in Casework. See Upgrade in this order.
- The shared audit writer recovers an active file whose final line a crash tore: the next start
moves those bytes to the owner-only side file
<audit.path>.torn, truncates to the last complete line, and logs it, instead of refusing to start. A configuredaudit.pathending in a companion suffix is refused. Evidence Gateway and Scheduling write operational logs to standard error, so astdoutaudit destination carries audit entries alone, andevidencectl audit showreads histories with request-batch entries and names denials, transient failures, and earlier operations left without an outcome. See Audit retention and Operate the Evidence Gateway audit log.
- BREAKING:
evidencectlfollows the shared ctl report and exit contract. Under--format jsoneach command writes one object on standard output opening withok,command, andstatus, all member names camelCase, and nothing on standard error;commandreplaces the formeroperationmember, and fixture reports useevaluatedCases,failingCase,expectedClass, andobservedClass. An unreadable file or a missing local dev session exits3instead of1. Commands that read one project take it as a positional<project>; the former--projectflag stays accepted but hidden on them.source import,source diff,source update, andtarget newkeep their documented--project, theaccesscommands andaudit showstill act on the current directory, anddoctorkeeps its--projectoption.testandfixtures runaccept--format junit, anddev start --name-prefixsets the local issuer container name prefix. Update scripts that readoperationor snake_case fixture keys. See evidencectl.
- BREAKING: Registry Casework activates a package in the database with
caseworkctl planandcaseworkctl apply, recorded in an activation ledger, andcasework serveonly reads that activation.casework migrateandcaseworkctl db migrateare removed and exit 2 naming the two commands.runtime.yamlrequiresidentity.databaseId. In split-role mode, apply, plan, and startup refuse a runtime role that owns a Casework object, can create in the schema, or holds TRIGGER, and any trigger no Casework migration creates, naming the statement to run. Startup refuses a Base Registry Engine (BReg) source whose pinnedsourceRevisiondiffers from the registry revision it serves, andcaseworkctl check PROJECT --against-breg-package DIRcompares a pin with a closed BReg package before deployment.planrefuses a runtime role that cannot read the ledger, namingcaseworkctl apply. Acaseworkctl devsession created by this release connects with one database role. To upgrade, addidentity.databaseId, repin each BReg source after upgrading BReg, then plan and apply once before starting the runtime; with split roles, a trigger an operator added to a Casework table blocks startup until it is dropped. See plan, apply, and serve.
- BREAKING: Registry Scheduling activates a package with
schedulingctl planandschedulingctl apply, recorded in an activation ledger, andscheduling servewrites no activation state.scheduling migrateis removed and exits 2 naming the two commands.runtime.yamlrequiresidentity.databaseId. In split-role mode, plan, apply, and startup refuse a runtime role that owns a Scheduling object, can create in the schema, or holds TRIGGER, and any trigger attached to ascheduling_*table, naming the statement to run; apply never revokes TRIGGER itself.planrefuses a runtime role that cannot read the ledger, namingschedulingctl apply. To upgrade, addidentity.databaseIdand runschedulingctl applyonce before starting the runtime; with split roles, a trigger an operator added to a Scheduling table blocks startup until it is dropped. Seeproducts/scheduling/CHANGELOG.md.
- BREAKING: every
caseworkctlandschedulingctl--format jsonreport opens withok,command, andstatus, in that order, asevidencectlreports do.okis true exactly when the exit code is 0, and a failure without a report of its own names its exit class asdomain-refusal,usage-error, oroperational-failurewith at least one diagnostic.caseworkctlreports move tocaseworkctl/v1alpha3, and theschedulingctlrecords report’s command isrecords apply. Seeproducts/casework/CHANGELOG.mdandproducts/scheduling/CHANGELOG.md.
schedulingctlis published as a release binary forlinux-amd64,linux-arm64, andmacos-arm64, likecaseworkctl. The BReg, Casework, and Scheduling images each carry their operator tool beside the runtime, at/usr/local/bin/bregctl,/usr/local/bin/caseworkctl, and/usr/local/bin/schedulingctl, built from the same source. The entrypoint stays the runtime, so a serving container is unchanged; runplan,apply, andstatusfrom the image you serve by overriding the entrypoint, or from a Kubernetes Jobcommand:. The Scheduling runtime stays an image-only artifact and has no installer. See Activate from the image and Run plan, apply, and status from the image.
v0.35.0 beta-47
Section titled “v0.35.0 beta-47”- BREAKING: Base Registry Engine (BReg) gives every
referencefield a btree index unless a declared index or a unique constraint withoutwhenalready leads with it, andbregctl checkreportsentity.list.unindexed_filterandentity.list.unindexed_sortfor a filterable or sortable list field no index leads with. The findings fail a check only under--deny-findings, so a pipeline that runsbregctl check --deny-findingsfails until those fields are indexed. An upgraded engine refuses an active package whose project has a reference field no index leads with, because its compiler now derives a different schema:doctorreportsstartup.package.refusedwiththe package compiler derivation failed. Build and apply a successor with the upgradedbregctlbefore starting the upgradedbreg; the plan classes each new index as compatible additive, and its plainCREATE INDEXblocks writes to that table until the migration commits. See indexes and monitor and recover.
- BReg sessions name themselves in
pg_stat_activity:bregfor the runtime andbregctlfor operator commands, unless the connection URL setsapplication_name. Runtime sessions carryidle_in_transaction_session_timeoutof 120 seconds as a startup option, so PostgreSQL ends a session left idle inside an open transaction and the pool replaces it. Poolers must run in session mode; one that drops the startup options needs the bound set on the runtime role. See set a PostgreSQL baseline.
- BReg runtime sessions carry
jit=offas a startup option placed before any options in the connection URL. Row-level security made the planner’s cost estimate for a short filtered collection page cross the JIT thresholds, and compiling that plan took several times longer than running it. An operator who wants JIT back adds-c jit=onto the URLoptions. Poolers must run in session mode; one that drops the startup options needsjit = offset on the runtime role. See set a PostgreSQL baseline.
breglogs, andbregctl doctorreports under a newadvisorieslist, value-free PostgreSQL advisories: the connection numbers one replica’s pool is compared with, a warning when that pool may take more than half of the usable connections, warnings whenautovacuumortrack_countsis off, and a note whenpg_stat_statementsis not installed or not loaded throughshared_preload_libraries. Advisories never refuse startup or changedoctor’s exit status, and need no extra grant. See deploy a registry.
-
Breaking audit change: all six runtimes use the shared per-process file or stdout writer. Documented rotation, retention, shipping to append-only storage, and the mutation crash gap. Removed procedures for the retired audit verification, export, and prune commands. See Base Registry Engine audit retention, Evidence audit, and audit upgrades.
-
BREAKING: published Base Registry Engine packages now carry the shared
SHA256SUMSenvelope.bregctl packagereports itspackageDigestand can add a hash-coveredREVISIONwith--revision.bregverifies every listed file at startup in addition to the existing BReg signatures and deployment bindings, andpackage.expectedDigestcan pin the shared digest. Rebuild old package directories withbregctl packagebefore starting this version.
- BREAKING:
evidencectl packagenow publishes one environment-neutral package directory withSHA256SUMSand an optional hash-coveredREVISION; it no longer copiesruntime.yamlinto the output. Evidence Gateway verifies every listed file at startup andpackage.expectedDigestpins the package digest. The separate Evidence bundle and runtime revisions are removed, while each requirement’s package-derivedconfigurationRevisionremains. The retiredevidencectl buildspelling is refused withevidencectl packageas the fix.
evidence check --require-runtime-dependenciesandevidence servename the fault that stopped a Transit signer from initializing, after the unchangedevidence: runtime signing initialization failed:prefix: no answer on the Unix socket, a refused key read, a provider server error such as a sealed provider, a malformed response, a key whose custody is unsafe, akeyVersionabove the key’slatest_versionor below itsmin_encryption_version, a public key that is not the governed one, or a failed self-test. No cause carries a path, provider response, or key material. See build and activate the successor.
- An Evidence access-token issuer that serves its key set under a private
certificate authority can be trusted through a named
tlsTrustProfileon the bundle’sauthenticationblock, bound inruntime.yamlexactly like a source’s profile. The CA is trusted beside the system roots for thejwksUriconnection alone, hostname verification stays on, and a local HTTPjwksUricannot name a profile. A profile bound on one side only is refused, andevidence check --require-runtime-dependenciesfetches the key set through it before the listener binds. See an issuer behind a private CA.
evidencectl doctor --runtime-config <file> --without-audit-lock, and the runtime’sevidence check --require-runtime-dependencies --without-audit-lock, check a candidate staged beside the Evidence instance it will replace. Without the option the check opens the audit destination as startup does, so it refuses while that instance holds the destination’s single-writer lock, and the refusal now names the option. With it, the audit hash key is checked as startup checks it, and the audit directory and files are checked for ownership, mode, write access, and a complete final entry, without taking the lock. A second writer is not detected; the JSONproofBoundarysays so. See evidencectl.
- BREAKING:
evidencectlrefuses a derivation whoseanswerreads a fact its question’s source does not declare, asevidence.authoring.derivation-fact-undeclaredagainst the derivation file. The declared facts are an inline operation’ssource.facts[].name, or the properties of a referenced source’s closedfactSchema.check,test,package,source diff, andsource updateall refuse, as do the compatibility spellingsfixtures runandbuild, so a Base Registry Engine (BReg) field rename that a derivation still reads under its old name is refused beforesource updateinstalls it or a candidate is packaged. The check reads the project, not the running registry: a field renamed in a registry that already serves a deployed candidate still fails every request that reads it while/readyreports ready, so change the registry and deploy the rebuilt candidate together. Only literal reads such asfacts["status"]andfacts.statusare checked, and a??fallback between names passes when any of them is declared. See evidencectl.
- BREAKING:
bregctl test --baseline-runtime-configrehearses the successor migration before it writes a receipt. It rebuilds the active package’s schema from its signed sources on the disposable test database, runs the migration in apply order, requires the candidate schema, and rolls back. A plan that used to fail only atapplynow failstest, sopackagecannot sign it, and a predecessor thisbregctlcannot rebuild is refused asmigration.rehearsal.baseline_unavailableormigration.rehearsal.baseline_not_reproducible. The rehearsal runs over empty tables, so it does not prove data-dependent steps. A failure reports the SQLSTATE and the object names, never the PostgreSQL message. See test and package the successor.
- BREAKING: when PostgreSQL refuses a statement after
bregctl applybegan maintenance, the report isapply.migration.statement_failedinstead ofapply.migration.failed, and its message names the SQLSTATE, its class, and the table, column, or constraint PostgreSQL reported, never the PostgreSQL message or a stored value.registry-bregreports it asMigrationError::StatementFailed, from the newPostgresKernelError::Statementvariant, so an exhaustive match on either enum needs the new arm;PostgresFailureis exported fromregistry_breg::postgresunder every feature set. A lost connection, including a session the server ended (SQLSTATE class 08, 57P01 to 57P05, 25P03), still reportsapply.migration.failed, while a compiler or reviewed statement that times out is a refused statement with SQLSTATE 57014. The target stays pinned as before. See troubleshooting.
- BREAKING:
bregctl history rebaselineno longer refuses a registry holding more than 1,000 live rows. It verifies every live row against its journal head in pages of 1,000 inside one transaction, so a registry of any size can regain snapshot coverage after an erasure. The codeshistory.rebaseline.live_rows.budget_exceededandfield_encryption.erase_history.rebaseline.live_rows_budget_exceededare gone, and so areHistoryRebaselineError::LiveRowBudgetExceededandMAX_REBASELINE_LIVE_ROWSinregistry-breg. The run holds every entity table exclusively, reads included, until it commits, so a larger registry means a longer read and write outage: size a maintenance window from a rehearsal. See restore snapshot coverage after an erasure.
- Raising a
textfield’smaxLengthis a compatible additive change,field_length_widened, applied live: the successor replaces the column’s length check and validates the stored rows, with no reviewed migration. Revisions recorded under the lower limit stay readable, and an action over the entity stays additive asaction_target_fields_widened. Astringfield’smaxLengthis its column type, so raising it still needs a reviewed migration. See review and apply changes.
- Lowering a
stringfield’sminLengthunder the samemaxLengthis alsofield_length_widened, applied live: the successor replaces the column’s minimum check, or drops it when the minimum falls to 0, with no reviewed migration. Revisions recorded under the higher minimum stay readable, and an action over the entity stays additive. Raising aminLength, changing astringfield’smaxLength, and widening adecimalstill need a reviewed migration. See review and apply changes.
bregctl diffreports every removed field or entity asdiff.history.removed_values_retained. Removing one from the package drops the live column or table, but the values stay in every revision snapshot recorded before the change and in every database backup; onlybregctl history eraseremoves them, whole revisions of one record at a time. See review and apply changes.
- BREAKING: a reviewed
chunked_backfillstep now appends one history revision for every row each chunk changes, in the same commit as the chunk, so snapshot and as-of reads agree with the backfilled rows. ItschunkSizecap falls from 10,000 to 1,000, and its SQL must be a singleUPDATEof the declared entity that names no record metadata column, uses no Unicode-escape identifier or string, and names no other statement word outside comments and plain string literals; the journal also refuses a step that changedcreated_atorupdated_at. A plan outside those limits thattestandpackageused to accept is now refused, andtestreports a journaled step whose SQL the history journal refuses asmigration.rehearsal.history_step_refused. See write a reviewed migration descriptor.
- Base Registry Engine (BReg) reports an accepted review whose result lookup
answers an empty
404asrecovery.code: result-unknown-to-authorityinstead of leaving the code empty. The result poller serves a review that has a pending webhook completion first and one its authority no longer knows last, and a pending completion makes its review due at once. The newbregctl review-recovery resubmitsubmits the exact retained review request again under its original idempotency key, andbregctl review-recovery closestops waiting on a review the authority will never answer, reportingoperator-closed. See change an active registry.
- BREAKING: Evidence Gateway reads
runtime.yamlthrough the shared runtime configuration loader and declares its access-token issuer and audit key through the shared blocks. The runtime file now opens withapiVersion: registry.registrystack.org/evidence-runtime/v1alpha1andkind: EvidenceRuntimeConfiginstead ofversion: 1;bundleDirectoryispackage.root, with an optionalpackage.expectedDigestpin; andlistener.bindHostwithlistener.portis onelistener.bind: host:portvalue, as it is formetricsListener.secretProviders.environment: {}enablessecret:env/NAMEreferences besidesecret:file/name, and runtime string values accept${VAR}outside secret references andsecretProviders, while a${...}expression in the governed bundle is refused with the field that holds it. In the governed bundle, the flatauthenticationfields move underauthentication.oidc,kind: oidc-access-tokenis dropped, the one-entryaudienceslist is a singleaudience,jwksUriisjwksSource: {kind: uri, uri: ...}, andaudit.hashSecretRefisaudit.hashKeyRef;audit.hashKeyVersionis unchanged. Every subcommand that reads the runtime file takes the required--runtime-config FILEafter the subcommand; the global--runtimeflag, theREGISTRY_EVIDENCE_RUNTIMEvariable, and the default path are gone, and the container image passes the flag in its default command. A removed key, flag, or variable is refused with the name of its replacement. To migrate, rewrite the project’sgovernance.yamlandruntime.yamlwith the new keys, rebuild the candidate with the matchingevidencectl, and replace--runtime FILEwith<subcommand> --runtime-config FILEin service definitions. See configure Evidence Gateway.
- BREAKING: Registry Casework reads
runtime.yamlthrough the shared runtime configuration loader and declares its secret providers, database, listener bind, OpenID Connect issuer and clients, and audit key through the shared blocks. The runtime file may not pass through a symbolic link and is at most 1 MiB.${VAR},${VAR:-default}, and${VAR:?message}are substituted in string values after parsing; an expression in a field ending inRefor undersecretProvidersis refused, and one incasework.yamlis refused by the runtime and bycaseworkctl check.listener.bindis required.authentication.oidc.issuermust be anhttpsURL without credentials, query, or fragment, with plainhttpaccepted only on an IPv4 loopback host underdevelopment-loopback, andaudienceis at most 512 characters. Underoperator-controlled-upstream,authentication.oidc.allowedClientsmust name at least one client, because an empty list admits every client the issuer verifies;development-loopbackstill accepts an empty list.authentication.oidc.jwksUriis removed: declarejwksSourcewithkind: uriand the same URL asuri.audit.hashKeyRefmust be an exact secret reference. To migrate, addlistener.bindif it was omitted, list the admitted clients inallowedClientsfor a production deployment, replacejwksUri, and move any environment expression out ofcasework.yaml. See configure the runtime.
- BREAKING: Base Registry Engine reads
runtime.yamlthrough the shared runtime configuration loader and declares its OpenID Connect issuer, audit key, listeners, and secret providers through the shared blocks.bregtakes the runtime file as--runtime-config FILE;--configis refused with the replacement named,bregctl request-retention cleanup-attachmentsno longer accepts its--configalias, and the container image passes the new flag in its default command.${VAR},${VAR:-default}, and${VAR:?message}are substituted in string values after parsing, so a substituted value is always text and never a number, boolean, or YAML structure; a${...}expression in a field ending inRefor undersecretProvidersis refused asruntime_config.substitution_in_reference, and one in the authored project or module files is refused assource.environment_expression. An empty YAML scalar is now null rather than an empty string, so quote""where an empty string is meant.authentication.oidc.issuermust be anhttpsURL without credentials, query, or fragment, with plainhttpaccepted only on an IPv4 loopback host,audienceis at most 512 characters, andjwksSourcegainskind: uribesidediscoveryandstatic. A file missingapiVersionorkindis refused asruntime_config.invalid_api_versionorruntime_config.invalid_kind. To migrate, replace--config FILEwith--runtime-config FILEin service definitions and write any number or boolean that came from a variable directly in the file. See deploy a registry.
-
BREAKING: Registry Relay reads
runtime.yamlthrough the shared runtime configuration loader. The file now opens withapiVersion: registry.registrystack.org/relay-runtime/v1alpha1andkind: RelayRuntimeConfig;server.bindislistener.bind,packagePathis an absolutepackage.rootwith an optionalpackage.expectedDigestpin, andauthentication.issuerisauthentication.oidcwithissuerand ajwksSourceofkind: discoveryorkind: uri. Asecret:file/reference resolves under the declaredsecretProviders.file.rootinstead of beside the runtime file, andsecret:env/needssecretProviders.environment.relay checkandrelay servetake the required absolute--runtime-config FILE; the--runtimeflag, theRELAY_RUNTIMEvariable, and the default path are gone. A removed key is refused with the name of its replacement, and an environment expression such as${VAR}in the authoredregistry.yamlis refused ascontract.environment_expression. The Registry Relay retirement decision records the current status of this surface. -
BREAKING: Registry Discovery reads
runtime.yamlthrough the shared runtime configuration loader. The file now opens withapiVersion: registry.registrystack.org/discovery-runtime/v1alpha1andkind: DiscoveryRuntimeConfiginstead ofschemaVersion, andlistener.addressislistener.bind. The binary takes--runtime-config FILE, an absolute path free of symbolic links, in place of--runtime, and the container image passes it in its default command. A removed key is refused with the name of its replacement. See configure Registry Discovery.
- BREAKING: Registry Render reads
runtime.yamlthrough the shared runtime configuration loader. The file now opens withapiVersion: registry.registrystack.org/render-runtime/v1alpha1andkind: RenderRuntimeConfig;server.bindislistener.bindand is required,server.shutdownGraceSecondsislistener.shutdownGraceSeconds,bundle.pathispackage.root, and secret providers are declared undersecretProviders. Paths, includingaudit.path, must be absolute, and a removed key, among themaudit.directory,audit.integrityKeyRef, andaudit.maxSegmentBytes, is refused with the name of its replacement.serve,healthcheck, andchecktake--runtime-config FILE, and none reads a default path or theREGISTRY_RENDER_RUNTIMEvariable. An environment expression such as${VAR}in the authored bundlemanifest.yamlis refused with the field that holds it. See run Registry Render in serve mode.
- BREAKING: Registry Scheduling reads
runtime.yamlthrough the shared runtime configuration loader.authentication.oidc.jwksUriis removed and refused with the name of its replacement, ajwksSourceofkind: uri;listener.bindis required and no longer defaults to a loopback port; the file and every configured path are refused when they pass through a symbolic link; and an environment expression such as${VAR}in the authoredscheduling.yaml, records, or fixtures is refused with the field that holds it.runtime.yamlstring values accept${VAR}outside*Reffields andsecretProviders, and an optionalpackage.expectedDigestpins the policy the runtime starts on.
-
Base Registry Engine (BReg) adds the
importoperation and import authorities, so a governed entity can take a bulk load without grantingbatch,create, orpatchto a direct-write profile.importis create-only, is served only through ingestion runs, and is not a direct write for change control, sochange_control.direct_write_grantaccepts it on a controlled entity. An import run is created only inside an open import authority that an operator opens withbregctl import-authority openfor one entity and one profile, with a window of at most 30 days, a maximum item count, and optional pinned input digests. Every chunk counts against the authority; closing it, its expiry, its exhaustion, or a successor package activation stops the run withblockedReasonimportAuthorityClosed. Opening, closing, expiry, exhaustion, and supersession each append an audit record, and every run audit record carriesimportAuthorityId. The compiler refusesimportwithout entity batch bounds (import.batch_bounds.required), without an authenticated principal (import.principal.required), and beside abatchgrant on the same entity (import.batch.redundant).bregctl data validatereports the source’sinputDigestfor pinning; the digest is a label the client announces with the run and the server records, never recomputed over the written items. The runtime installs a new internal table and a run column on its next apply. See load records through an import window. -
BREAKING: the ingestion-run
blockedReasongains the valueimportAuthorityClosed, and the RustBRegIngestionBlockedReasonenum gainsImportAuthorityClosed; a client that matched the only previous value exhaustively must handle the new one. The attempt that blocks a run on its authority is recorded aslastAttempt.outcomeimportAuthorityClosed, notbindingChanged, so the RustBRegIngestionAttemptOutcomeenum and the Node.jsBRegIngestionAttemptOutcometype gain the same value. Theingestion.run_blockedproblem detail now reads “The ingestion run is blocked and refuses further chunks.” because the run’sblockedReason, not the detail, names the cause. -
BREAKING:
bregctl data importreports a run creation the server refuses with412asdata.import.ingestion_run.import_authority_requiredwhen the grant isimport, anddata.import.ingestion_run.precondition_failedotherwise, instead ofdata.import.operation.refused. A blocked run reportsdata.import.ingestion_run.import_authority_closedordata.import.ingestion_run.blockedwith its reason.
- BREAKING: the Base Registry Engine runtime refuses to serve a database that
is not the one its instance claim names. The claim records the PostgreSQL
system identifier and database object identifier at the first apply, so a
logically restored copy (
pg_dumpandpg_restore) or a registry moved bypg_upgradeno longer starts:bregrefuses with the newStartupErrorvariantInstanceClaimMismatch,GET /readyanswers503, andbregctl doctorreportsstartup.instance_claim.mismatch. This keeps a restored copy from serving beside its original as a divergent writer of the same registry. Once the original is stopped for good, the new commandbregctl instance-claim adopt --acknowledge-original-retiredmoves the claim to the copy with a raised epoch and, once that commits, appends an audit entry naming the previous and the adopted claim;bregctl instance-claim statusreports whether the claim matches. A physical copy (base backup, point-in-time recovery, snapshot, or promoted replica) keeps its identity and is not refused. The claim is recorded only into a fresh database, one with no committed revision and no commit head, so an existing registry records none when its next apply installs the new internal table: runinstance-claim adoptonce after that apply, before starting the server. Adopting also supersedes every open import authority, with its own audit record, so a restored backup brings no authority back. On a managed PostgreSQL service that withholdspg_control_system(), the claim compares the database object identifier alone. The claim is checked at startup and on readiness, not per request. A RustmatchoverStartupErrormust handle the new variant. See after a logical restore.
v0.34.0 beta-46
Section titled “v0.34.0 beta-46”bregctl applyreports a migration database it could not reach, or an apply lock another session held past the lock timeout, before maintenance began asapply.database.unavailable, with the suggested actionverify_migration_authority, instead ofapply.migration.failed. Nothing was changed, so the message says to retry the same apply once the database is reachable rather than to reconcile. The same holds when confirming an already-active package. A failure after maintenance began still reportsapply.migration.failed. A reachable database that has never been activated, such as a first apply run without--initial, is not unavailable: it reportsapply.package.active_mismatch, whose message now names--initial. See monitor and recover.
bregctl applytreats the already-active package as a no-op, so a repeated deploy exits 0 withactivation: already_activeand changes nothing. The package is verified in full as the configured active package, and the database must record exactly that package (revision digest, schema fingerprint, sequence, and deployment identity) as active with no maintenance pending; otherwiseapplyrefuses withapply.package.active_mismatch. A different package at the active sequence still refuses. Package binding refusals now reportapply.package.binding_mismatchwith the differing runtime key as the diagnostic path, such asidentity.databaseIdorpackage.activeSequence, instead of the genericapply.package.refused, and never either value. See review and apply changes.
bregctl applyreports a successor refused because retained history coverage does not admit it asapply.history.coverage_incomplete, with the suggested actionprepare_history_rebaseline_request, instead ofapply.migration.failed. The refusal leaves maintenance state unchanged, and its message names the recovery: finish a pendingfield-encryption erase-historyrun or runhistory rebaseline, then apply the same package again. See retain, erase, and audit.
bregctl applyreports a successor package with nothing to apply asapply.package.empty_plan, with the suggested actioncorrect_package_build, instead of a package binding refusal. See monitor and recover.
- Base Registry Engine (BReg) no longer fails an accepted review that the
review authority still reports as pending. A
202from the result resource no longer spends the result-poll attempt budget and clears an earlierresult-lookup-uncertain, and the submission recovery deadline no longer ends an accepted review, so an approval that arrives days later is still reconciled and, in automatic mode, applied. Failed lookups and empty404answers still exhaust the budget asresult-poll-attempts-exhausted, and a410still fails the review asresult-expired; BReg no longer reportsresult-recovery-expired. See operate Base Registry Engine.
- BReg clears a submission’s recorded error when it reconciles the terminal
review result, so the review projection of a settled review reports
recovery.state: noneinstead ofoperatorAttentionfor a result lookup that failed before the result arrived. See operate Base Registry Engine.
- BREAKING:
caseworkctl source add --applywrites one lifecycle hook per paired BReg request entity,casework-lifecycle-v1-<entity>, because BReg requires hook ids to be unique across a registry. The Casework BReg source binding no longer acceptseventType. RemoveeventTypefrom each*.breg-runtime.yamlbinding and every barecasework-lifecycle-v1hook from the BRegregistry.yaml, then repeatcaseworkctl source add --apply. See deploy Registry Casework.
- BREAKING: Base Registry Engine (BReg) drops the
supersededchange-request state, which no transition ever wrote. A request isdraft,submitted,cancelled, orapplied; thebregStateenum in generated OpenAPI and the Rust, Node.js, and Python clients loses the value, and a hookwhencondition namingsupersededno longer compiles. The review result statussupersededis unchanged. See change requests.
- BReg decides the change-request actions it offers from the settled review
result. A rejected request offers only
cancel_request. A send-back, or an approval whoseavailableUntilpassed before it was applied, offersrevise_requestwithrebase: falseandcancel_request, and no longer offersapply_request. Ananswered,cancelled, orsupersededresult keeps revise and cancel but no longer offersapply_request, which it could never pass. BReg refuses the shapes it does not offer: a revise after a rejection, or a rebase after a send-back or an expired approval, answers409 mutation.conflict. The review projection reports an expired approval as application stateexpired, including one whose automatic application is queued but not yetapplying, which the Rust, Node.js, and Python clients accept, and request lists whose profile disclosesreview_statecan filter onreviewOutcome. The automatic application worker leaves a queued job unclaimed once its cached approval’savailableUntilhas passed, rather than spend a retry on a request that no longer offersapply_request. Such a job also no longer holds its review authority or executor binding: the activation check that refuses to drop a binding with durable work outstanding no longer counts it, so an operator may remove a binding an expired, queued job no longer needs.bregctl explain lifecyclereports the check as itsreview_outcomelayer. See change requests.
- BREAKING: BReg refuses to compile an access profile with a
taskGrantthat holdsapply_request, withaccess_profile.task_grant.operation_forbidden. Applying a reviewed request needs a profile of its own without delegated authority; moveapply_requestthere.
- BReg no longer contacts the review authority for an apply made under a revoked or expired task grant, whether the caller’s or the one frozen on the proposal: it checks both grants first and records the refused apply in the audit journal. The apply itself was already refused under such a grant, so this closes an early outbound call, not an authorization bypass.
- Base Registry Engine (BReg) read permissions can require the subject’s
recorded consent with
requireConsent. A row reaches a declared recipient organization only while a live give for that recipient, purpose, and profile is recorded; PostgreSQL checks it on every read, and a withdrawal applies to the next request.bregctl module add consentgenerates the consent records, actions, and profiles for one subject entity.bregctl checkreportsaccess.consent.ungated_clientfor an ungated profile that reads the same rows. Access preview scenarios acceptactorKindandrequesterClientand report the derivedrecipients. See require consent for a read and control access and reads.
- A code added to a BReg field vocabulary is now a compatible additive
migration, so it needs no reviewed migration evidence;
bregctl diffclassifies itlock_or_rewrite_riskbecause the column check is replaced under a table lock. An action input that starts accepting codes is additive only when each gained code is new to its vocabulary in the same successor.bregctl diffattaches a reviewreasonto consent-related access changes. See change an active registry.
- BREAKING:
bregctl init --from publicschemaand the four BReg starters follow PublicSchemamainat commite5cfbbc, version 0.3.0. Theagricultural-holdingsstarter takes PublicSchema’s agricultural holder names: its*-holding-operator-roleentities and routes become*-agricultural-holder-role, and theoperatedHoldingandholdingOperator*fields becomeholderFarmandholderPerson,holderOrganization, orholderGroup. A project copied from that starter keeps working as written; initialize it again to take the new names, which come without a data migration. Theseed-lotsstarter aligns its fields to renamed PublicSchema concepts. PublicSchema retiredpublic_mandate, so thepublic-organizationsstarter aligns its free-textdescriptionfield to PublicSchema’sdescriptioninstead. Neither starter changes a field, route, or record. PublicSchema definesend_dateas the last day a period applies, so a period includes its end date. See derive a registry from PublicSchema.
- A
--selectiondocument forbregctl init --from publicschemamay now name amodelRevisionalongsidemodelVersion. PublicSchema can keep one version label across structurally different revisions, somodelVersionalone does not pin one;modelRevisionpins the upstream commit the embedded snapshot was copied from, andinitrefuses a selection naming a different one. The wizard, thehouseholdstarter selection, and the Evidence tutorial’s selection write it, and the generated README’s attribution section states it beside the version. See derive a registry from PublicSchema.
v0.33.0 beta-45
Section titled “v0.33.0 beta-45”- Registry Scheduling joins the release with published openings, exact-time offerings, arrival windows, holds, and accountable appointments. Each commitment requires a task grant bounded to the offering’s service, location, and action. The release publishes a Scheduling container image, without a binary or installer asset. See the Registry Scheduling API.
- BREAKING: Registry Casework replaces hosted decisions with source-neutral review requests, tasks, kinds, results, and accountability. Base Registry Engine (BReg) delegates governed change-request review to Casework through a review authority binding. The Casework migration drops the experimental hosted tables without carrying their data forward. See review BReg changes in Casework.
- BREAKING: BReg entity
eventsare now sharedhooks, and deliveries carry a signed hook envelope instead of the earlier bare body. Rewrite each entity declaration, drain the existing outbox before upgrading, update receivers, and regenerate project locks. BReg now requires PostgreSQL 17 or newer.
- BReg ships WebAssembly action handlers enabled by default, field encryption for restricted fields, and durable resumable ingestion runs. Existing Rhai and declarative action handlers keep working. See field encryption for restricted fields and the BReg client capabilities.
- Registry Render is available from source with offline CLI, HTTP service, and Rust library modes for deterministic Typst PDF rendering. v0.33.0 does not publish a Render release asset or container image. See the Registry Render overview.
- Evidence tooling adds machine-readable reports, an offline-complete starter,
and self-checking local target generation. Object answer schemas must now
declare
propertiesandadditionalProperties: false.
- The BReg clients expose typed applied-request results and durable ingestion
runs.
bregctl explainandcaseworkctlmachine-readable output now use versioned, closed JSON report contracts.
v0.32.0 beta-44
Section titled “v0.32.0 beta-44”- Exchanged access tokens carry
registry_assertion_issuer, derived from the verified subject-token issuer. Evidence, Base Registry Engine (BReg), and Casework can pair each client with the assertion issuers it may present and refuse any other. Without that configuration no pairing rule applies.
- BReg governed request application can re-check fresh Evidence and
linked-record preconditions at Apply, and BReg Evidence providers can use
privateKeyJwtto refresh credentials instead of a statictokenRef. See operate Base Registry Engine.
- Evidence questions can answer with a governed
bounded-identifiervalue. The Rust, Node.js, and Python Evidence clients can authenticate through token exchange, and the BReg, Relay, and Casework clients can obtain person- or task-grant-bound exchanged tokens. See how Evidence works and the client API.
- Local development can compose BReg, Evidence, and Casework under one shared
issuer.
evidencectl access client addadds task-grant and first-party exchange modes, andbregctl examples runruns the scenarios a project authors inexamples/scenarios.json. See evidencectl.
- Local ThunderID development containers are now named per state root. After
upgrading, remove a container started by v0.31.0 once with
docker rm -f thunderid-<label>-<id prefix>and start the session again. Retained state is untouched.
v0.31.0 beta-43
Section titled “v0.31.0 beta-43”- Registry Mint retired; the
mintconfig key and retired CLI flags are refused.
- Grant authority removed: Base Registry Engine (BReg)
taskGrant.authorityand task status clientauthority, CaseworktaskAuthority.id, and Evidence’sgrantAuthorityclaim name. BReg status clients are keyed by source issuer only.
- Casework task assertions no longer carry
registry_grant_authorityorregistry_grant_source_issuer; ThunderID derives the source issuer from the verifiediss.
- Local dev databases holding grants or drafts from before #1044 no longer load; reset local dev state.
@registrystack/clientexposesbreg.verifyWebhookDelivery()for Node receivers. The helper delegates the Version 1 signature contract to the shared Rust verifier and returns the authenticated CloudEvents attributes, delivery metadata, and exact body. Receivers still bound clock skew, validate the expected event contract, and deduplicate before applying an effect. See verify a hook delivery.
v0.30.0 beta-42
Section titled “v0.30.0 beta-42”- Registry Casework ships with Registry Stack 0.30.0 and has a documentation set
of its own: an overview, the
decide your first work item tutorial that a
CI gate replays, how Casework works,
author a Casework policy,
deploy Registry Casework,
retain, erase, and settle, the
API contract, and a Casework section
in the client API reference. The installer
casework-install.shinstallscaseworkandcaseworkctl, andcaseworkctl dev startstarts a retained local runtime with its PostgreSQL container, pinned stock issuer, and seeded directory.
- Registry Casework names the failing secret reference and the rule it broke
when a database, audit, or static JWKS secret cannot be resolved, without
echoing the value; the operator file accepts
authentication.oidc.jwksSource: {kind: static, documentRef: …}beside issuer discovery; and the two work-item history routes are documented separately:hosted-historyfor hosted work andhistoryfor source-scoped reads underRegistry-Source-Profile. See deploy Registry Casework.
- Base Registry Engine warns about unknown or disallowed access-token key
identifiers in its JSON log messages, at most once per minute
per authenticator. Caller refusals remain value-free. The warning does
not establish provider key rotation. The operations guide describes how
to confirm rotation and replace a static
documentRefpin supplied by either a file or an environment variable. Automated coverage verifies authentication refusal, bounded diagnostics, and recovery after replacing an in-memory key set; it does not execute the operational runbook. See operating Base Registry Engine.
- The Base Registry Engine access-token verifier admits both RFC 9068
spellings of the access-token media type as one configured token type:
accessTokenType: at+jwtandaccessTokenType: application/at+jwteach accept tokens whosetypheader carries either spelling. Alltypmatching remains case-insensitive, and values outside the configured token type are still refused. An issuer can switch between the two permitted spellings without an engine configuration change. ThunderID emitsat+jwt, while other providers may emit the full media type. See operating Base Registry Engine.
GET /v1/registrylists each operation’sreadableRequestFieldsbesidereadableFields, so a caller can learn before a read whether its selected profile receives request review state, actor references, or decision reasons. The list follows the rule request reads apply: an anonymous profile, or an entity without a change request, lists no request fields. See Base Registry Engine API.
- The Rust, Node.js, and Python Base Registry Engine clients accept the
action.refusedproblem an immediate action answers a declared business rule with. No client registered that code, so the one refusal a caller is meant to act on arrived as an opaque protocol failure. The typed error carries the package-declared reason asrefusal_codein Rust and Python andrefusalCodein Node.js, beside the status, the code, and the trace identifier, and the catalogue label stays in the detail. A reason outside the published bounds, a missing one, or one attached to any other code fails closed. See client API reference.
- The published problem-code table documents
action.evidence_failed, the 503 an immediate action answers when a declared Evidence dependency could not be acquired or accepted. The engine registers the code and answers with it, and the table named every other one. See Base Registry Engine API.
readableRequestFieldswidens toreview_stateandactor_reference, disclosingreview,reviewTiming,submitterReference, andapplierReferenceon a change-request record for a non-anonymous profile. Every change-request action response now also includesactorReference, independent ofreadableRequestFields. See Base Registry Engine API.
v0.29.0 beta-41
Section titled “v0.29.0 beta-41”- BREAKING: request-lifecycle webhook bodies add required
request.reasonPresentand optionalrequest.reason. Update strict receiver schemas before activating this release. Deliveries that can match rejection or revision now need a destinationclassificationCeilingof at leastinternal, or lifecycle filters that exclude both outcomes. See Base Registry Engine API and deliver declared events.
- Base Registry Engine adds governed request attachment slots, PostgreSQL or operator-bound S3 storage, and asynchronous external verification. Select storage and verification before the first upload, which pins both bindings. Request-detail erasure now includes attachment references; external cleanup retries remain an operator responsibility. See runtime configuration and retain, erase, and audit.
- Reject and request-revision actions accept an optional explanation. Request
grants default to showing retained reason text; set
readableRequestFieldsto[]to hide it. Current and retained proposal decisions follow the selected profile’s authority. See Base Registry Engine API. bregctl dev eventsinspects receipts from the local webhook receiver, with captured values available only through--include-payload. See deliver declared events.
bregctl devreports the check that refused a start instead of only the private log directory. The rehearsal, package build, activation, and verification run inside a detached supervisor, so a refused journey step now reaches your terminal with its code, itsjourneys[i].steps[j]path, and its own message. See author journeys.bregctl dev startcompares thebregit resolved against its own version before it starts anything, and refuses a binary from another release by name, giving both versions and the fix. The issuer runs from the pinned stock image. Previously a binary mismatch surfaced much later as a refused package or an unready database.- A refused fixture logical reference names its class: a field the entity does not declare, a field the access profile grant does not make writable, a request body with no field, a step identifier that is not stable, a step naming both an entity and an action or neither, or a capture no earlier step declares. The sentence still carries no authored value.
bregctl checkno longer tells you to drop a row boundary field fromwritableFieldson a grant that also creates. The boundary compiles to an INSERTWITH CHECKpinning that field to the caller’s claim, so the field has to stay writable and each create has to send a value the claim allows.access.profile.writable_row_boundarynow words its advice for the grant’s operations, the newaccess.profile.row_boundary_not_writablereports a create whose boundary field is not writable, andbregctl testnames the row boundary rather than reporting an anonymous reference refusal. See control access per profile.
- The Rust, Node.js, and Python Base Registry Engine clients select governed request attachment slots from caller-filtered registry metadata and run the upload, download, and delete exchanges. A slot carries the served size limit, the accepted content types, and the route authority, so an empty body, an oversize body, or an unaccepted media type refuses before any request. Raise the client’s maximum response bytes when a slot serves more than the 8 MiB default read bound. See client API reference.
- A request attachment slot serves the
classificationits registry configuration authored. It travels in thex-registry-attachmentextension, so it reaches/v1/registryand the caller-filtered OpenAPI document under the same filtering as the size bound and the accepted content types, and the Rust, Node.js, and Python clients read it off the selected slot. A caller can now tell restricted slot content from public before downloading any bytes. The value is advisory: it grants and withholds no route. See Base Registry Engine API.
- The attachment download operation sends the bare
attachmentdisposition inContent-Disposition. No stored slot metadata holds a filename, and the served OpenAPI document pins the header to that exact value. Callers choose their own filename when saving the bytes. See Base Registry Engine API.
v0.28.0 beta-40
Section titled “v0.28.0 beta-40”- BREAKING:
bregctl devandbregctl dev stoptake a positional project directory. Replace--project <dir>with<dir>in scripts. Both commands still default to the current directory. See create and query your first registry. - Base Registry Engine supports bounded Rhai action handlers, linked-target acceptance checks, native persisted-field patterns, and membership read boundaries. Test new patterns against PostgreSQL before packaging; adding a pattern validates existing rows under a table lock, and changing or removing one requires a reviewed migration. See Actions and Proposals, modeling patterns, and control access and reads.
- The trial action-handler ABI version 2 resolves declared, verified Evidence
Gateway assertions with operator-bound providers. Accepted assertion material
has a separate 24-hour retention period. Use
bregctl evidence-retention erase-expiredto erase expired assertion bytes and verification context while keeping receipts replayable. See retain, erase, and audit.
submitterTargetscan require current same-profile GET authority over the native-reference targets of a manually applied change request, including on exact replay. Request lists expose authorized filtering and sorting onbregState,proposalVersion, andeffectDigest; ordinary field API names cannot reuse those names. Structured fields also accept an array schema root with declareditems. See declare change requests and actions.- The unified Node.js client’s Base Registry Engine namespace adds exact-JSON metadata, record, and lifecycle methods. Serialized JSON avoids silent rounding at the JavaScript number boundary, and unsupported values refuse. Keep exact values as JSON text or use a lossless decoder.
bregctl init --from publicschemaderives a project from the embedded model through a wizard, selection file, or starter. Four starter projects include local examples that can resume or restart. Projects copied from the unreleasedprofessional-licencesstarter must be initialized again because its correction fields changed without a migration path. See derive a registry from PublicSchema.evidencectl source addpreviews a connection from a stopped local registry and performs it with--apply, preserving records, revisions, and client identities. It requires a matching-versionbregctlonPATH. See the evidencectl workflow reference.- Registry Manifest refuses duplicate concept terms on a field after IRI expansion and scheme/host case comparison. Remove repeated entries before validating or republishing. Valid manifests retain their authored spelling and source digest. See contracts.
- Export, migration, local development, and Compose preflight failures report clearer recovery information. Evidence authoring validates source origins and runtime settings consistently with deployment checks, and bounds child diagnostics and version handshakes. See the evidencectl workflow reference and change an active registry.
- Release checksums now include SLSA build provenance for the publication
workflow that assembles
SHA256SUMS; candidate evidence retains the binding to payload builds. See OpenSSF and release trust. - CLI reference pages and generated reference data are built from reviewed source inputs during the documentation build.
Documentation present in v0.27.0
Section titled “Documentation present in v0.27.0”- Clarified that Discovery selection validation checks closed structure and
capability binding, not trust or currentness, and kept the compatibility
aliases for existing Node.js and Python adopters. The Rust crate renamed
validate_service_selectiontovalidate_service_selection_structurewith no alias, because the crate is unpublished and exempt from the compatibility promise. - Added the adopter-owned accepted-service handoff and explicit online renewal workflow. Credentials and native Evidence or Relay input and output remain outside Discovery and follow local acceptance.
- Documented Base Registry Engine from its released installer, binaries, and container image instead of a build from a checkout.
- Pinned the Base Registry Engine tutorial checkouts to the installed version and
documented the
--installedmode of the quickstart and demo launchers.
2026-08-20
Section titled “2026-08-20”Documentation prepared for the v0.23.0 beta-34 release:
- Documented Registry Discovery: the curated, read-only index of public
Evidence and Relay service descriptions, the closed
registry-discovery-v1alpha1provider profile, the bounded relying-party search and ambiguity-safe selection, and thediscoveryctloperator flow. - Documented that a Discovery selection is inert public metadata, not a trust decision and not a native request.
- Documented the npm and PyPI distribution of the Registry Discovery client package alongside the existing Evidence and Relay clients.
- Documented the progressive Evidence client API across the Node and Python bindings and the synchronized client tutorial paths.
- Documented
relayctl’s human-readable default output and the unchanged--jsonreport document. - Reorganized the sidebar by what a reader came to do, published two tutorials, and retired the duplicate chooser page.
- Rewrote the style guide for readers rather than runners, and stopped printing values a reader cannot reproduce, such as compiled contract revisions and installation-dependent counts.
- Added the v0.23.0 beta-34 candidate documentation archive.
2026-08-14
Section titled “2026-08-14”Documentation prepared for the v0.22.0 beta-33 release:
- Documented the explicit container-private Evidence listener mode, native Evidence, Mint, and Relay deployment checks, and the common Compose runtime preflight.
- Documented Relay issuer identity independently from OIDC discovery or direct JWKS transport while preserving canonical discovery compatibility.
- Added Registry Mint’s opt-in client-secret profile for managed standard OAuth
clients, while retaining
private_key_jwtas the default and sole method for Evidence and delegated authority. - Added owner-only client-secret provisioning, per-installation registration, bounded rotation and revocation guidance, and a QGIS Client Credentials walkthrough. The walkthrough is configuration guidance, not release-gate interoperability evidence.
- Documented the npm and PyPI distribution transaction for the exact checksum-covered Evidence and Relay client packages. Registry publication is accepted only when registry digests match the candidate bytes.
- Documented that the Relay installer verifies and installs matching
relayandrelayctlbinaries together on Linux amd64 and preserves the previous pair on failure. - Documented eager Evidence trusted-key validation, Mint’s reserved
scopeauthority boundary, categorical Relay editor diagnostics, and governed-only Relay project indexing. - Hardened synchronized product documentation so it is compiled as inert Markdown and refuses active raw HTML or unsafe rendered destinations.
- Added the v0.22.0 beta-33 candidate documentation archive.
2026-08-13
Section titled “2026-08-13”Documentation updates for the v0.21.0 beta-32 release:
- Documented the official Evidence Gateway and Registry Mint runtime images alongside the existing Registry Relay image.
- Distinguished the source-build definitions under
docker/from the reviewed release-image definitions underrelease/docker/. - Documented operator-mounted configuration, governed packages, secrets, keys, and audit storage for all three runtime images.
- Added the v0.21.0 candidate documentation archive.
2026-08-12
Section titled “2026-08-12”Documentation updates for the v0.20.1 beta-31 patch release:
- Documented Evidence HTTP sources that treat one exact governed 404 Problem Details response as a neutral unresolved consultation instead of a source failure.
- Documented the data-free
declaredUnresolved: truefixture case and the fail-closed behavior for malformed, undeclared, or mismatched responses. - Added the v0.20.1 candidate documentation archive. Registry Mint and Relay V2 behavior are unchanged from v0.20.0.
Documentation updates for the v0.20.0 beta-30 release:
- BREAKING: Made
holderBoundBatchMaxSizea required member of theregistry.evidence-definitions/v1metadata response. - Upgrade the Evidence runtime, Evidence clients, and Evidence OID4VCI adapter
together. New clients read an older response without this member as a batch
size of
1; older strict clients reject responses that contain the new member. - BREAKING: Removed the reserved
registry_relayvocabulary prefix fromregistry-manifest/v1. Use absolute IRIs or declare an institution-owned active vocabulary before validating and republishing affected metadata. - Documented the first prebuilt Relay Node.js and Python client packages, which are attached to the matching GitHub Release rather than published to npm or PyPI.
- Added the v0.20.0 candidate documentation archive and advanced maintained release, installation, contract, and standards references to v0.20.0.
- Added generated command references for the current CLIs, Relay V2 editor support, complete OID4VCI delivery guidance, and Evidence local source API mock guidance.
- Removed the remaining Relay V1 and
registryctlsource references from the current product surface while retaining their v0.19.0 retirement record.
2026-08-11
Section titled “2026-08-11”Documentation updates for the v0.19.0 beta-29 release, which replaced both Relay identities:
- BREAKING:
relayreplaces theregistry-relayruntime, andrelayctlreplacesregistryctl. The legacy runtime, the Rhai worker, theregistryctlbinary, its installer, its image lock, and the PostgreSQL release closure are absent from the release. - Rewrote the Relay documentation around the V2 model: a governed registry contract, a deployment-local runtime document, and generated package artifacts. Relay V1 configuration is not an in-place upgrade input.
- Documented the V2 read surface: bounded Record reads, named lookups and searches, CRS84 Point data as GeoJSON or JSON-FG, and a profiled SDMX data and structure read subset. Access profiles stay independent of wire-format selection.
- Removed the documentation for capabilities V2 does not implement: spreadsheet, HTTP, and PostgreSQL sources, Rhai script adapters, API-key and OAuth client-credentials authentication, the two-lane public and consultation split, materialization, and the administrative posture endpoint. Known limitations records what is now absent.
- Replaced the pinned Relay OpenAPI reference with the per-deployment model.
Relay V2 generates its description from the adopter’s registry contract and
serves it at
GET /openapi.json. - Removed the generated authoring reference and diagnostic catalogs, which
were produced from
registryctlintrospection commands thatrelayctldoes not yet offer. - Rewrote the normative RS-* specifications for the Relay protocol, adopter tooling, operational posture, security, and terminology against the V2 contracts.
- Recorded the Relay V1 and registryctl retirement decision and redirected the retired routes.
- Documented the Relay installer and the
ghcr.io/registrystack/relay:v0.19.0image.relayctlhas no installer; it is taken from the release assets or built from source. - Documented the Evidence bounded multi-subject request batch, which shares one authorization and execution budget and returns results in request order. Existing single-subject clients need no wire-format migration.
- A Registry Docs archive is not part of this release, so the current documentation can be updated without waiting for a runtime release.
2026-08-09
Section titled “2026-08-09”Documentation updates for the v0.18.0 beta-28 release candidate:
- Added holder-bound Evidence issuance, bounded atomic batches, and presentation verification with RFC 9901 key-binding JWTs.
- Added the Evidence OID4VCI 1.0 Final wallet-delivery adapter, including its protected offer flow, proof validation, single-replica constraint, and bounded in-memory lifecycle.
- Documented reviewed immutable SQLite extraction, fixed multi-stage source acquisition, and private-key-JWT source authentication.
- Added the
evidence-oid4vcibinary to the Evidence installer and release inventory for all three supported platforms. - Added the v0.18.0 candidate documentation archive.
2026-08-07
Section titled “2026-08-07”Documentation updates for the v0.17.0 beta-27 release candidate:
- Added the Evidence runtime, adopter tooling, relying-party client, portable verifier, and Registry Mint supporting service to the maintained product documentation.
- Added Evidence tutorials and operator guidance for fixed source acquisition, authorization, minimum-disclosure output, signing, key rotation, audit, and relying-party verification.
- Retired Registry Notary from the current product and release surfaces while preserving historical release records.
- Documented Relay scalar-only attribute-release claims and the warning for aggregate routes without a longitudinal privacy budget.
- Added the v0.17.0 candidate archive and the stable Registryctl installer served from the exact promoted documentation archive.
- Recorded Node and Python Evidence client packages as GitHub Release assets, without npm or PyPI publication.
2026-08-03
Section titled “2026-08-03”Product direction update:
- Recorded the decision to retire Registry Notary from the current product surface while preserving historical changelogs, decision records, and release manifests.
- Reframed the supported product paths around Registry Relay for scoped, protected reads and Evidence for minimum-disclosure assertions.
- Kept Evidence independent from the retired Notary product model, with Registry Mint limited to supporting token issuance.
Adopter-facing breaking change:
- Raised the registryctl approved-set schema to version
2.0and made registryctl refuse an approved set issued before the retirement, including a version1.0document, a set carrying anotarylane, and a set binding cross-lane interface digests. - Required affected deployments to re-approve their baseline from the current lane bundles, because the removed cross-lane interface digests are no longer verified and the old approval’s integrity claim is no longer enforced. See Approve the initial product baseline.
2026-08-01
Section titled “2026-08-01”Stabilization updates for the v0.16.3 beta-26 release candidate:
- Recorded that v0.16.2 stopped after staging an unpublished draft and before public image or documentation publication.
- Added the v0.16.3 candidate archive and retained v0.16.0 through v0.16.2 as failed-train records.
- Simplified Beta publication recovery without changing product behavior.
Fix-forward updates for the v0.16.2 beta-25 release candidate:
- Recorded that the immutable v0.16.1 tag workflow stopped after creating an unpublished empty draft GitHub Release.
- Recorded that v0.16.1 has no public release, final images, assets, or documentation, and directed adopters to install only v0.16.2.
- Added the candidate
v0.16.2archive while retaining the v0.16.0 and v0.16.1 failed-train records and v0.15.2 as the latest published release.
Fix-forward updates for the v0.16.1 beta-24 release candidate:
- Recorded that the immutable v0.16.0 tag workflow failed during startup before any job or public write.
- Recorded that v0.16.0 has no GitHub Release, final images, assets, or documentation, and directed adopters to install only v0.16.1.
- Added the candidate
v0.16.1archive while retaining the v0.16.0 candidate history and v0.15.2 as the latest published release.
Documentation updates for the v0.16.0 beta-23 release candidate:
- Added the maintained spreadsheet and HTTP adopter journeys, including the common authoring, test, development, build, trust, and deployment workflow.
- Documented separate public and consultation Relay lanes, signed artifact roots, persistent audit records, and strict public Relay client validation.
- Documented Relay sensitive-read gates, snapshot recovery, no-expiry OAuth migration, and Script budget accounting.
- Documented Notary’s registry-backed evidence requirement, structured claims, registrar offers, representative issuance, delegated-target enforcement, expiry rechecking, and state-catalog upgrade procedure.
- Added the candidate
v0.16.0archive while retainingv0.15.2as the latest published release until promotion completes.
2026-07-28
Section titled “2026-07-28”Fix-forward updates for the v0.15.2 beta-22 release:
- Recorded the immutable partial v0.15.1 publication and moved forward without reusing its tag or public image names.
- Bound capsule validation to the exact same-digest candidate-to-public Registry Stack image mappings.
- Made observational promotion telemetry nonblocking and removed its obsolete fixed measurement count.
Fix-forward updates for the v0.15.1 beta-21 release candidate:
- Preserved the immutable failed v0.15.0 tag and recorded that its workflow stopped before any public release or image publication.
- Corrected exact annotated-tag binding extraction without weakening the closed candidate-binding parser.
- Prepared the
v0.15.1candidate docset while retaining the failed v0.15.0 candidate archive and v0.13.0 as the latest published release.
Documentation updates for the v0.15.0 beta-20 release candidate:
- Published the versioned Registryctl installer and the spreadsheet-first local API and registry-backed claim tutorials as the maintained beginner path.
- Added generated configuration, ownership, authoring, fixture, and operator references for the complete project-authoring surface.
- Documented all-row spreadsheet validation, stable governed attribute release, Relay-to-Notary consultation closure, and value-free activation diagnostics.
- Added the candidate
v0.15.0archive while retainingv0.13.0as the latest published release until promotion completes. - Recorded that v0.14.0 was not published and is not part of this release lineage.
- Kept Solmara, hosted publication, external OpenID, OpenCRVS, DHIS2, wallet, verifier, and country-acceptance evidence as separate gates.
2026-07-26
Section titled “2026-07-26”Unreleased current-source documentation updates:
- Added task-oriented Start, Connect your data, Operate, Security, and Reference navigation for new adopters.
- Added generated references for all five authored and both runtime configuration domains, with fail-closed field-intent and ownership coverage.
- Added separate generated authoring, fixture, and operator diagnostic references.
- Restored the released spreadsheet API and live registry-backed claim tutorials as the primary beginner path.
- Kept advanced operations for rotation, materialization, reapproval, diagnosis, Script workers, recovery, upgrade, migration, and rollback available from the operator handoff instead of presenting them as beginner journeys.
These pages describe the current source under test. They are not part of the immutable v0.13.0 archive and do not claim candidate, hosted, country, interoperability, or production evidence.
2026-07-25
Section titled “2026-07-25”Documentation updates for the v0.13.0 beta-17 release:
- Advanced current source citations, install commands, verification examples,
contracts, projects, and standards links to Registry Stack
v0.13.0. - Added the
v0.13.0archived docset while retaining every earlier release archive. - Documented removal of Relay’s inert
provenance.consentresult member, the required pre-release consultation-state re-bootstrap, and Notary’s matching closed decoder. - Documented the shared deployment-waiver
referenceand optionalsummarycontract, with the retiredreasonfield rejected. - Updated Registryctl authoring examples to keep source adaptation, evidence
policy, and consumer decisions separate, and recorded the
registryctl.smoke.v1report schema. - Kept Solmara, hosted publication, external integration, OpenID, lifecycle, OpenSPP holdout, and pilot evidence as separate held gates.
2026-07-23
Section titled “2026-07-23”- Made the Relay-to-Notary-to-evidence-consumer responsibility boundary normative for 1.0 project authoring. Updated Notary guidance and registryctl examples to keep reusable evidence separate from consumer-owned requirements, decisions, workflow, and action rules.
2026-07-20
Section titled “2026-07-20”Documentation updates for the v0.12.2 beta-16 fix-forward release:
- Advanced current source citations, install commands, verification examples,
contracts, projects, and standards links to Registry Stack
v0.12.2. - Added the
v0.12.2archived docset while retaining the incomplete v0.12.0 and v0.12.1 publication records and every earlier archive. - Recorded separate Registryctl and Relay release builds, verification of the shipped Relay feature set, and pinned canonical binary and image wrappers used to reproduce candidate hashes and ordered runtime root filesystem layers.
- Recorded Relay’s move to
quick-xml0.41 and the exactryu-js1.0.3 pin, retiring temporary dependency exceptions without adding product features. - Moved Registry Notary router tests to in-process transport where network semantics are not under test, preventing release-gate socket exhaustion without changing production request handling.
- Recorded the production fix that isolates each single-use eSignet authorization-code exchange on short-lived DNS-pinned transport, with redirects and proxies denied, bounded timeouts, and no transparent retry.
- Kept Solmara, hosted publication, external integration, OpenID, lifecycle, and pilot evidence held.
Documentation updates for the v0.12.1 beta-15 fix-forward release:
- Advanced current source citations, install commands, verification examples,
contracts, projects, and standards links to Registry Stack
v0.12.1. - Added the
v0.12.1archived docset while retaining the incomplete v0.12.0 publication record and every earlier archive. - Recorded the root-filesystem-bound reviews for the three non-fixable Debian
13
libc6findings that stopped the v0.12.0 publication attempt. - Recorded deterministic release plans, remote tag checks, both-image Open Containers Initiative label smoke, and safer release workflow routing.
- Kept Solmara, hosted publication, external integration, OpenID, lifecycle, and pilot evidence held.
2026-07-19
Section titled “2026-07-19”Documentation updates for the v0.12.0 beta-14 release:
-
Advanced current source citations, install commands, verification examples, contracts, projects, and standards links to Registry Stack
v0.12.0. -
Added the
v0.12.0archived docset while retaining the v0.11.0 and earlier archives. -
Documented Registry Notary’s issuer-initiated pre-authorized-code profile, bounded batch evaluation, generated runtime configuration schema, and fail-closed credential-status verification.
-
Documented Registry Relay’s intended 1.0 support roster and protected per-resource last-good refresh health.
-
Updated Registryctl tutorials for human-readable report defaults and the matching v0.12.0 binary, image lock, and image generation.
-
Recorded the Debian 13 runtime transition and kept candidate-only lifecycle, external integration, OpenID, Solmara, hosted, and pilot evidence held.
-
Documented Relay’s protected per-resource refresh-health metrics, restricted posture observation, last-good availability behavior, and default alert at three consecutive failures.
-
Documented the source installer for the optional VS Code and Zed semantic-navigation integrations. Editor installation is user- or profile-scoped and remains separate from project-local schema setup through
registryctl initorregistryctl authoring editor.
2026-07-18
Section titled “2026-07-18”Documentation updates for the v0.11.0 beta-13 release:
- Advanced current source citations, install commands, verification examples,
contracts, projects, and standards links to Registry Stack
v0.11.0. - Added the
v0.11.0archived docset while retaining the v0.10.0 and earlier archives. The public release inventory remains eight artifacts. Registryctl embeds the optional preview language server; it is not a separate release artifact. The VS Code and Zed extensions remain source-installed developer previews and are not marketplace packages. - Published the registry-backed local Notary tutorial and the maintained authoring-workspace catalog. Registryctl continues to expose exactly five public starters. The local tutorial proves evaluation only, not credential, wallet, presentation, or OID4VCI interoperability.
- Documented the credential-issuance migration: only fresh, non-delegated, registry-backed evaluations with exact Relay provenance are credential capable. Source-free and delegated results remain evaluation and rendering surfaces, and old evaluations require re-evaluation before issuance. No database migration is required solely for this narrowing.
- Added migration coverage for ambiguous primary credentials, strict empty environment expansion, Relay Script host-call diagnostics, and offline audit quarantine recovery.
This beta does not claim stable 1.0 completion, full OID4VCI interoperability, hosted promotion, audit completion, or an external pilot result.
2026-07-16
Section titled “2026-07-16”Documentation updates for the v0.10.0 beta-12 release:
- Advanced current source citations, install commands, and deployment examples to Registry Stack
v0.10.0. - Added the
v0.10.0archived docset with the four formal products and Crosswalk. Solmara Lab remains a separate adopter demo, not a released Registry Stack artifact. - Published the Notary PostgreSQL install, role, migration, retention, backup, restore, recovery, supported-version, restart, and multi-instance contract.
- Added separate Relay consultation-state backup and restore guidance without sharing Relay roles, schemas, or tables with Notary.
- Replaced the retired monorepo Lab documentation route with a source-backed Solmara local journey.
Migration notes:
- Notary production correctness state now uses Notary-owned PostgreSQL. The pre-1.0 Redis cutover is a stopped-writer transition with explicit drain and credential-status gates.
- Registry project authoring now uses
registry-stack.yaml, explicit integrations, fixtures, service topologies, and environment bindings. Reauthor pre-1.0 project files and review changed RFC 8785 canonical digests before signing. - Deploy one Notary authority per Relay trust domain. Identical replicas may share that authority’s Notary database, but Relay and Notary retain separate state ownership.
- Deploy the released Relay Rhai and Notary CEL workers only for their owning product’s adapter contract. They are not a shared extension or state framework.
2026-07-10
Section titled “2026-07-10”Documentation updates for the v0.9.0 beta-11 release:
- Advanced the active monorepo docs and source citations to RegistryStack
v0.9.0. - Added the
v0.9.0archived docset pinned to the beta-11 freeze source ref. - Updated registryctl install examples and current deployment tutorials to the
v0.9.0release tag while retaining the published v0.8.4 stale-digest workaround until tagged artifact proof closes it. - Kept hosted first-run publication held while the credential failure in GH#330 and the complete GH#198 fresh-reader run remain open.
Migration notes:
- Registryctl project generation now requires the strict image lock from the same release beside
the binary, or at an explicitly verified
REGISTRYCTL_IMAGE_LOCKpath. Existing projects still run from their stored immutable pins. See GH#339. - Relay passes a client-supplied trust-context header to the PDP only when the caller has the exact
registry:trust:<field>:<value>scope. Update caller scopes before relying on those fields; their value-bearing audit scopes are now pseudonymized. See GH#338. - Notary federation denials now preserve their audit context. No new client request field is required, but operators should retain the enriched denial records. See GH#337.
2026-07-04
Section titled “2026-07-04”Documentation updates for the v0.8.4 beta-10 release:
- Advanced the active monorepo docs and source citations to RegistryStack
v0.8.4. - Added the
v0.8.4archived docset pinned to the beta-10 source ref. - Updated registryctl install examples and current deployment tutorials to the
v0.8.4release tag. - Recorded v0.8.3 as the first provenance-bearing root release.
2026-06-26
Section titled “2026-06-26”Documentation updates for the v0.8.3 security and release-trust patch:
- Advanced the active monorepo docs and source citations to RegistryStack
v0.8.3. - Added the
v0.8.3archived docset pinned to the beta-9 source ref. - Updated registryctl install examples to the
v0.8.3release tag. - The
v0.8.2docset remains archived; its release carries no tag-bound SLSA provenance.
2026-06-25
Section titled “2026-06-25”Documentation updates for the v0.8.2 fix-forward release:
- Advanced the active monorepo docs and source citations to RegistryStack
v0.8.2. - Added the
v0.8.2archived docset pinned to the beta-8 source ref. - Updated registryctl install examples to the
v0.8.2release tag. - Kept the
v0.8.1docset archived (source tag only; no release artifacts were published).
Documentation updates for the v0.8.1 source release:
- Advanced the active monorepo docs and source citations to RegistryStack
v0.8.1. - Added the
v0.8.1archived docset pinned to the beta-7 source ref. - Added monorepo-aware archive handling for v0.8.x docsets while keeping older beta archives on their legacy source repos.
- Updated registryctl install examples to the
v0.8.1release tag.
2026-06-24
Section titled “2026-06-24”Documentation updates for the beta-5 source release:
- Added the
Beta 5docset with pinned refs for Platform, Manifest, Notary, Relay, Lab, registryctl, Crosswalk, and Atlas as a Lab input. - Advanced the active product docs to Registry Relay
v0.5.0, Registry Notaryv0.7.0, and Registry Manifestv0.2.2. - Updated OpenCRVS, FHIR-adjacent, and standalone deployment tutorial references to the beta-5 release pins.
2026-06-22
Section titled “2026-06-22”Documentation updates for the beta-4 source release:
- Added the
Beta 4docset with pinned refs for Platform, Manifest, Notary, Relay, Lab, registryctl, Crosswalk, and Atlas as a Lab input. - Advanced the active product docs to Registry Relay
v0.4.1, Registry Notaryv0.6.2, and Registry Manifestv0.2.2. - Updated source citations and tutorial install commands to beta-4 refs.
2026-06-21
Section titled “2026-06-21”Documentation updates for the beta-3 release candidate:
- Added the
Beta 3docset with pinned candidate refs for Platform, Manifest, Notary, Relay, Lab, registryctl, Crosswalk, and Atlas as a Lab input. - Re-pinned repo-doc imports, source links, and registryctl installer paths away from mutable
mainURLs. - Added OpenCRVS and FHIR tutorial coverage for beta-3.
2026-06-20
Section titled “2026-06-20”Documentation updates published:
- A scannable homepage section index to orient new visitors.
- Dark mode with a theme toggle.
- Outcome-first tutorials with prerequisites and numbered steps.
- New reference pages for the registryctl CLI, error and status codes, and environment variables.
- A native, searchable, theme-aware API reference.
- A per-page footer showing the last-reviewed date, an edit link, and a feedback control.
2026-06-13
Section titled “2026-06-13”Documentation set: the Latest docset published from the main branch, tracking main snapshots of Registry Relay (retired), Registry Notary, and Registry Manifest.
2026-06-12
Section titled “2026-06-12”Documentation set: the Beta 2026-06-12 docset frozen and archived, covering the following product versions.
| Product | Version |
|---|---|
| Registry Notary | v0.3.0 |
| Registry Relay | v0.2.0 |
| Registry Manifest | v0.2.0 |
| registryctl | v0.1.0 |
| Registry Platform | v0.2.1 |
| Crosswalk | crosswalk-core-v0.2.0 |
Cookies on Registry Stack
We use optional cookies to understand how you use the main Registry Stack website and this documentation. If you contact us, we may link this activity to your enquiry. You can change your choice at any time. Read the privacy policy.
Your browser asks sites not to track you, so optional tracking stays off.
We could not use or save that choice. Optional tracking remains off.