v0.1.57
Highlights
Webhook delivery
- Durable replay no longer wedges on one wide payload — The durable dispatch claim query selected every column, including the delivery
payload, under an ordering no index satisfies, so MySQL filesorted the payload into each sort record. A single delivery larger thansort_buffer_sizefailed the claim query withError 1038 (HY001): Out of sort memoryon every poll, permanently stalling durable replay behind that one row.FindNextnow claims in two steps — a narrow ordered key scan, then a keyed fetch of the payload — so claim latency and memory no longer scale with payload size. (#860)
GitHub checks
- Aggregate deployments stay off databases they have not registered — On repositories with no directory allowlist, schema-config discovery kept every config it found, so an aggregate leader configured with no databases of its own would try to plan a participant's database and turn a
DatabaseNotConfiguredErrorinto failing aggregate checks plus a "Plan Failed" comment on routine fan-out PRs. Discovery now keeps only configs the deployment actually registers. (#865)
Authorization
- Read-tier access for gateway-verified service callers —
forward_authpreviously had a single lane: an authenticating proxy forwarding a human's identity headers. A service calling the API as itself was rejected as untrusted even when a mesh gateway had already terminated and verified its client certificate, and the only workaround — trusting that gateway as a proxy — would have let anything behind it self-assert user and group headers into the write tier. A second, read-only lane now grants gateway-verified service callers read-tier access without that escalation, configured byforward_auth.trusted_gateway_spiffe,forward_auth.read_service_spiffe, and the optionalforward_auth.caller_spiffe_header. The lane fails closed — gateways without callers (or callers without a gateway) refuse to start, it requires SPIFFE-anchored proxy trust, a SPIFFE ID may never be both a trusted proxy and a trusted gateway, service callers are denied the write tier (service_caller_write), and an empty config disables the lane entirely. All three keys are new and optional, so existing configuration is unaffected. (#864)
Observability
- Untrusted-proxy denials name the identity that arrived — An
untrusted_proxydenial logged only the path and the remote address, which behind a sidecar is always loopback, leaving an operator unable to answer what identity the request presented. The denial log now carriesxfcc_uris(the SPIFFE URI SVIDs parsed fromX-Forwarded-Client-Cert) andxfcc_uri_count, so a missing trust-anchor entry is visible directly in the log line. (#863)
Storage
- Never-written task readiness fields removed — Per-shard readiness has always been folded into canonical task state before it leaves the engine, so the persisted
tasks.ready_to_completecolumn and theShardProgress.ready_to_completeproto field were never written or read. Both are gone: the column is dropped from the embeddedtasksschema, and proto field 8 isreserved, keeping the wire format compatible with older peers. Two upgrade notes:EnsureSchemarefuses the resultingDROP COLUMNunlessstorage.allow_destructive_schema_changesis set, so the column is simply left in place by default (a warning is logged, startup continues) — do not enable that flag until every process reading the table is on this version or newer; and, as always, upgrade the control plane before any consumer that readsShardProgress. (#861) - Advisory lockers injected per target — The last package-level
namedlock.Lockerbindings are replaced by per-target injection, and a target with no locker now fails closed instead of opening a connection. (#859)
Dependencies
- Spirit updated to
v0.15.2-0.20260727035859-220f8b6cfca1— Picks up read-side copier autoscaling and the matching connection-pool sizing; no schemabot source changes were required. Spirit / checkpoint compatibility: the checkpoint table format (_<table>_chkpnt) is unchanged across this range —pkg/checkpointis byte-identical between the old and new pins — so a copy that is in flight when the process restarts resumes from its checkpoint instead of restarting from zero. (#855)
Maintenance
- Latest plan-comment lookup uses
slices.Backward— Behavior-preserving rewrite of the newest-first scan in the webhook plan-comment path. (#825)
Contributors
Full Changelog: v0.1.56...v0.1.57