Repository navigation
RegistryStack v0.38.0
Registry Stack v0.38.0
Registry Stack v0.38.0 is the beta-50 release. BReg can keep a subject-facing
access log for an entity that opts in, answers a row-boundary refusal on a
direct write as 412 precondition.failed, and recovers executor-denied
applications and superseded webhook work with new operator commands. Registry
Scheduling publishes the v1alpha2 HTTP contract, which carries opaque
external references on holds and appointments and lists a caller's
appointments by one of them. Evidence can read a signed assertion from
another Evidence deployment as a verified source, and the OID4VCI adapter
validates its whole catalog and every offer before a wallet spends its code.
Casework and Scheduling share one activation implementation and require
PostgreSQL 17.
This is the first release to publish Registry Messaging, Registry Render, and
the BReg citizen MCP gateway (breg-mcp) and review page (breg-review):
- Registry Messaging:
messagingandmessagingctlLinux amd64 binaries, the
ghcr.io/registrystack/messagingimage, and amessagingnamespace in the
unified Node.js and Python clients. - Registry Render: a
registry-renderLinux amd64 binary and the
ghcr.io/registrystack/registry-renderimage. breg-mcpandbreg-review: binaries for Linux amd64, Linux arm64, and
macOS arm64, and theghcr.io/registrystack/breg-mcpand
ghcr.io/registrystack/breg-reviewimages. The BReg installer does not
install them.- The Evidence OID4VCI adapter gains the
ghcr.io/registrystack/evidence-oid4vciimage beside its existing binary.
The release also publishes discoveryctl for Linux amd64, and a standalone
Registry Scheduling runtime binary for Linux amd64 beside the existing image
and schedulingctl binaries.
Upgrade to v0.38.0 from v0.37.0. Move the Casework and Scheduling databases to
PostgreSQL 17 or newer first. Scheduling adds one schema migration, applied
with schedulingctl plan and apply. A BReg project whose access profiles
declare rowBoundaries compiles to a new registryRevision and must be
rebuilt and applied, and a Casework project whose BReg source pins that
project must be repinned. The Scheduling HTTP contract changes for callers,
so upgrade every client with its runtime.
Compatibility and migration
Run the same release on every runtime, tool, and client, and upgrade in the
order upgrade and retire
describes: BReg first, then Casework, then Evidence, then Scheduling, then the
clients. Take the backups it names first; no product migrates backwards.
Upgrade Base Registry Engine from v0.37.0
- Do not upgrade a project that declares both
rowBoundariesand a
change-requestplannerto v0.38.0; see Known limitation. - Replace the
bregandbregctlbinaries or images. For a project that
declaresrowBoundaries, first rebuild and apply its package with the
v0.38.0bregctl, as the BREAKING entry on the generated OpenAPI document
below describes. Then restart everybregprocess. The runtime file needs
no change. An upgraded runtime and
bregctlkeep verifying and serving a database activated before
subject access-log storage existed, without an apply; the next successor
apply installs that storage, and a package that declaresaccessLogis
never served without it. - BREAKING: a direct create, patch, or batch item whose resulting row falls
outside the caller's row boundary answers412 precondition.failedbefore
any write, where it answered503 service.unavailable. The body is the
same value-free problem a staleIf-Matchanswers, retrying the unchanged
request cannot succeed, and the refusal is audited as a refusal. A batch
carrying one such item commits none of them, and an import item is refused
as an item. A genuine PostgreSQL privilege failure still answers503.
Handle a412on a create as a boundary refusal, not a retryable outage. - BREAKING: the generated OpenAPI document lists
412 precondition.failedon
every create and batch operation reachable through a profile with
rowBoundaries. The document is a packaged, byte-bound artifact that feeds
registryRevision, so such a project compiles to a newregistryRevision,
and a package an earlier release built for it no longer loads. Rebuild it
unchanged with the v0.38.0bregctl: run
bregctl test PROJECT --baseline-package DEPLOYED --runtime-config FILE --credentials FILE --output RECEIPT,
then
bregctl package PROJECT --baseline-package DEPLOYED --test-receipt RECEIPT --output BUILD,
whereDEPLOYEDis the absolute directory of the deployed package. Check and
applyBUILD/packagewithbregctl planandbregctl apply, as step 4 of
Upgrade in this order
describes. This change leaves a project withoutrowBoundariesuntouched. - A webhook destination that names
localhostor a*.localhosthost under
a profile that denies loopback, such asproductionHttps, is refused
before startup. The send-time address policy already refused every delivery
to it; useloopbackDevelopmentHttpfor a local receiver. bregctl generate evidence-sourcewrites protocol
breg-evidence-lookup-v2, so a source regenerated with v0.38.0 carries a
newbehaviorRevision, and
accepting it withevidencectl source updatechanges the revisions of the
Evidence questions that reach it. An imported source you do not regenerate
is unchanged.
Upgrade Registry Casework from v0.37.0
- BREAKING:
caseworkctl plan,apply, andstatus, andcasework serve
startup, refuse a PostgreSQL server older than 17 with an upgrade
instruction, before any migration or activation write. Upgrade the database
server first, then replace thecaseworkandcaseworkctlbinaries or
images. Start the runtime only after the repin below, when it applies. No
Casework schema migration is pending. - A Casework BReg source that pins a BReg project with
rowBoundariespins a
registryRevisionthe upgraded BReg no longer serves, and Casework startup
refuses it. After the BReg apply above, repin with
caseworkctl source add BREG_PROJECT --project PROJECT --source-id ID --apply,
then package, plan, and apply the Casework project once, and only then
startcasework, as step 5 of
Upgrade in this order
orders.
Upgrade Registry Scheduling from v0.37.0
- BREAKING:
schedulingctl plan,apply, andstatus, and
scheduling servestartup, refuse a PostgreSQL server older than 17 with
an upgrade instruction, before any migration or activation write. Upgrade
the database server first. - Replace the
schedulingandschedulingctlbinaries or images. Migration
10 adds the external-reference columns, and the runtime refuses to start
until it is applied: runschedulingctl plan --runtime-config FILE, then
schedulingctl apply --runtime-config FILE, and restart. Existing holds and
appointments receive an empty reference set, and their stored idempotency
hashes and receipts stay valid. - BREAKING: the HTTP contract is
v1alpha2.HoldDocumentand
AppointmentDocumentcarry a requiredexternalReferencesarray of
{product, recordType, identifier}objects, so a client that refuses
unknown members must be upgraded with the runtime. A hold and a direct
booking may sendexternalReferences; confirmation, cancellation, reads,
and idempotent replays keep the set, and a reschedule must omit it because
the appointment keeps the set its hold or booking established. Upgrade the
runtime before any client sends the field. - A reminder or observer destination on an
httpsURL that names
localhostor a*.localhosthost is refused before startup. The
send-time address policy already refused every delivery to it; use a plain
httploopback destination for a local receiver.
Upgrade Evidence from v0.37.0
- Replace the
evidencebinary or image, theevidencectlbinary, and the
evidence-oid4vcibinary, or move the adapter to its image, and restart. No runtime file needs editing unless a bundle breaks
the rule below. - BREAKING: a requirement's
subjectRoles[].roleis limited to 64 bytes
instead of 128, in the bundle schema and at startup, to match the Evidence
request contract. A bundle with a longer role fails startup; shorten the
role and every grant, request, and derivation input that names it before
replacing the binary. - BREAKING:
evidence-oid4vcirefuses a credential request whose inline
proofjwkcarries a member outsidekty,crv,x,y,alg,kid,
anduse(withuseonly assig), before any Evidence call, where it
dropped the member and accepted the proof. A wallet that sendskey_ops,
x5t,jku, or another such member stops receiving credentials. Before
cutting over, check that each wallet you serve sends only that member set. evidence-oid4vcirefuses its whole discovered catalog when any one
definition fails the Evidence request contract, where it advertised the
valid remainder. Run the adapter against its Evidence deployment before
cutting over, and fix or withdraw any definition it names.
Upgrade Relay, Discovery, and Registry Manifest from v0.37.0
- Replace the binaries or images and restart. Relay, Discovery, and Registry
Manifest need no configuration, package, or database change in this
release.
Adopt Registry Messaging, Registry Render, and the BReg citizen services
- No earlier release carries these surfaces, so there is nothing to upgrade
from a published release. A Messaging deployment built from source before
v0.38.0 must move its database to PostgreSQL 17 or newer, set
identity.databaseId, and activate its package withmessagingctl plan
andmessagingctl applybefore starting the runtime;messaging migrate
is gone. The Messaging changelog lists every breaking change a source
deployment crosses.
Base Registry Engine
- An entity may declare
accessLogto keep a subject-facing log of reads of
its records: who read the record, when, and for which declared purpose. The
subject reads it atGET /v1/records/{route}/{id}/access-logunder a
profile that currently grantsgetfor the record and whose verified
principal equals the storedsubjectField.retentionDaysdefaults to 90
and accepts 1 through 3650; a background worker erases expired rows every
minute.trustedIntermediariesnames the verified clients, at most 64,
that may forward the original requester and purpose in the
Registry-Access-RequesterandRegistry-Access-Purposeheaders, and
exemptionsdelay a documented entry for a named profile without omitting
it. A failed log insert refuses the read. An access-logged entity cannot
grant an anonymous profile any read. The log is stored apart from the
operational audit. See
subject-facing access logs. - Automatic review executors can renew credentials with
privateKeyJwt.
bregctl review-recovery retry-applicationrequeues anexecutor-denied
job after credentials or grants are corrected, keeping its exact current
approved proposal and idempotency key. Application conflicts and
precondition refusals retry with a delay of 5 seconds up to 5 minutes. - Dead letters retain a closed, value-free failure reason for operator
inspection.bregctl webhook liststays available when retained work names
a superseded binding, and the audited, generation-bound
bregctl webhook discardcloses eligible work without replaying it under
the replacement binding. bregctl devaccepts explicit service-clientreviewExecutorsbindings
for automatically applied requests and uses renewing local issuer
credentials.bregctl devclients may declareregistry_purposeas a list of the
purposes one client may use. Each authenticated journey step names an exact
scope subset and, for a multi-purpose client, one declaredpurpose, and
gets its own short-lived token. Dev refuses multi-purpose clients whose
distinct token claims together exceed 16.bregctl devseeds andschema testjourneys can load rows through an
import route withoperation: import, driving the production ingestion run
under an exact one-item import authority that dev opens and closes.
BReg citizen MCP gateway and review page
breg-mcpis 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. For every tool call it exchanges the chat host's
token for a registry token with the gateway as actor, so the chat host's
token never reaches BReg, and it takes a draft's target from the citizen's
own linked record, never from a tool argument.breg-reviewis the server-rendered page where the citizen signs in,
reads the draft BReg holds under their own token, and submits it. The page
holds no authority of its own.- Both services ship as release binaries and images from this release. See
the citizen MCP gateway.
Registry Messaging
- Registry Messaging sends one message to one destination over one channel
for an authorized caller, rendered from a reviewed template through an
operator-configured SMTP or HTTP provider, and reports what is known about
delivery. It owns its dispatch queue, provider calls, receipts, attempt
history, payload retention, and audit journal; why, when, and to whom to
send stay with the caller's source of record. - This is its first release. The
messagingruntime andmessagingctl
operator tool ship as Linux amd64 binaries and in the
ghcr.io/registrystack/messagingimage, and the HTTP contract is pre-1.0.
See the
Messaging changelog
for the full surface.
Registry Render
- Registry Render produces governed, byte-stable PDF documents from registry
data with Typst, as an offline CLI, an HTTP service, or a Rust library. This
release publishes theregistry-renderLinux amd64 binary and the
ghcr.io/registrystack/registry-renderimage, which keeps the template
package outside the image.
Registry Casework
caseworkctl source addkeeps an automatic executor's service apply
profile separate from human source-context profiles, so staff and
supervisors receive no executor scopes.checkand fixturetestreport
each request's application mode from its imported source description.- Activation shares its ledger and runtime privilege checks with Scheduling
throughregistry-platform-activation, and detects the loss of any
required table privilege, including when other required privileges remain
granted.
Registry Scheduling
GET /v1/appointmentslists the caller's own appointments carrying one
exact external reference, named by the required
externalReferenceProduct,externalReferenceRecordType, and
externalReferenceIdentifierquery parameters. Pages hold 1 to 200 items,
50 by default, and the cursor is bound to both the caller and the filter.
A reference is an identifier only: it confers no authority and Scheduling
never calls another product with it.- The Rust Scheduling client sends external references and lists
appointments by reference. - Activation shares its ledger and runtime privilege checks with Casework
and detects the loss of any required table privilege.
Evidence, Relay, Discovery, and Registry Manifest
- An
http-jsonsource may declareevidenceto read one predefined
assertion from another Evidence deployment. The block pins one reviewed
audience-scoped definition that supportssigned-jws, its independently
accepted keys intrustedJwks, optionalrevokedKeyIds,
maximumAssertionLifetimeSeconds, andclockSkewSeconds. Rust draws a
fresh nonce for every acquisition, sends the request with the ordinary
source credential, and verifies the signed answer before projection. The
source needs a fixedPOSTpath ending in/v1/evidence,
query: forbidden, andjsonBody: required; it cannot declarebatch,
unresolvedProblem, orforwardAccessAttribution: true, and every
selector in the pinned definition must usevalueOrigin: request. - An
http-jsonsource may setforwardAccessAttribution: trueto send the
verified requester and authorized purpose in the reserved
Registry-Access-RequesterandRegistry-Access-Purposeheaders. The
headers grant no source authority; the source must trust this Evidence
service as an intermediary on its own terms. A BReg source exported for an
access-logged entity sets it, and its connection client must be listed in
that entity'strustedIntermediaries. evidence-oid4vcichecks each offered selector against the published field
set, types, and bounds before an offer secret or exchange state exists, so
an unusable request is refused before a wallet spends its single-use code.
CredentialCatalog::derivereturns aResult.evidence-oid4vciomitsresponse_types_supportedfrom its authorization
server metadata, as OpenID4VCI 1.0 Final permits for a server that supports
only the Pre-Authorized Code Grant, instead of publishing an empty array.- BREAKING: an
evidence-oid4vciinline proofjwkaccepts only the
kty,crv,x,y,alg,kid, andusemembers, withuseonly
assig, the same closed set a
did:jwkproof already had. A key carrying any other member is refused
instead of having the member dropped. registry-evidence-clientrefuses a holder-bound batch answer whose
credential count differs from the number of presented holder keys, as the
same protocol refusal as an unparseable body. It also publishes its offline
request contract for an integrator that owns its HTTP transport:
EvidenceDefinitionsDocument::validate_for_request,
DefinitionSelector::accepts_request_values,
PreparedEvidenceRequest::prepare,
PreparedEvidenceRequest::claim_request_json, and
RetainedEvidenceVerification::from_prepared. None of them performs I/O.- Relay, Discovery, and Registry Manifest have no user-visible runtime
changes in this release.discoveryctlships as a Linux amd64 release
binary.
Shared platform and clients
registry-platform-activationis a new shared crate: the PostgreSQL
activation ledger, database identity, and runtime privilege checks Casework
and Scheduling use. Products keep their transactions, migrations, audit,
and package-specific activation hooks.registry-platform-httputilrefuseslocalhostand every*.localhost
name for aproductionHttpsorprivateServiceHttpdata destination when
the binding is constructed, whatever private ranges are allowed.registry-platform-hooksrecords a closed dead-letter reason and can
discard pending work, a dead letter, or an expired lease under its exact
generation, without rebinding or sending it.registry-platform-sdjwtcloses the inline proof key member set described
above.- The unified Node.js and Python clients add a
messagingnamespace over the
Rust Messaging client, to submit, inspect, cancel, and preview messages.
Editors
- The VS Code and Zed integrations cover BReg, Casework, Scheduling,
Messaging, Discovery, Registry Manifest, Registry Render, and Evidence
OID4VCI projects beside Relay and Evidence, with product-scoped
definitions, references, symbols, completion, hover, and local reference
diagnostics. They remain source-installed beta integrations; build the
hosted CLI from the same checkout. - The language server reads only
.yaml,.yml, and.jsonproduct
documents. A document reference that names any other file, such as a
private key, stays a navigation target and is never opened.
Release process
- Every runtime image overlays the fixed Debian
libssl3t64 3.5.7-1~deb13u3
from DSA-6531-1 on its Distroless base, beside the fixedlibc6it already
carried, and the Debian 13 image gate refuses an image without it. No
Registry Stack binary links or loads OpenSSL; the overlay keeps the shipped
library and the image scan current. - The release roster admits the
discoveryctlLinux amd64 binary, the
standalone Scheduling Linux amd64 runtime binary, the Messaging, Render,
breg-mcp, andbreg-reviewbinaries, and thebreg-mcp,breg-review,
messaging,registry-render, andevidence-oid4vciimages from v0.38.0,
through the same build, checksum, smoke, advisory, repeatability, and
verification steps as every other artifact. Each new image carries a
reviewed advisory baseline, and its private candidate package joins
scheduled candidate cleanup. registry-release preparechecks that the VS Code and Zed extension
manifests and lockfiles carry the release version, and that the excluded
Evidence fuzz lockfile uses the release path-package graph.- Four Evidence fuzz targets cover the verifier's flattened-JWS and SD-JWT VC
paths and the authoring readers for OpenAPI descriptions and project
documents. They run as a smoke in the merge queue when a change reaches
their crates and in the nightly sweep. The verifier'sfixturesfeature,
off by default, supports them, and a workspace package that enables it is
refused. The threat model and hardening checklist gain sections on the
automated adversary.
Known limitation
bregctl refuses a package with a change-request planner as a predecessor:
the package records the planner's declaringOrigin, which the predecessor
loader does not accept. A database activated with such a package therefore
cannot plan or apply a successor, and bregctl test or bregctl package with
--baseline-package naming it is refused. Initial activation and runtime
startup are unaffected. A project that also declares rowBoundaries must
rebuild and apply its package to run v0.38.0, so it cannot upgrade until the
fix ships. This limitation predates this release; the fix is tracked in
#1814.
Changes since v0.37.0.
This remains a pre-1.0 Beta release for self-hosted institutional pilots.