v0.1.25.32 — lenient deserialization on cross-plane read schemas
Cross-plane read tolerance hardening — closes the second of two items from the post-v0.1.25.31 alignment audit against runtime v0.1.25.14 (paired with runcycles/cycles-server#108 which closed the first). No spec change, no wire change — read-side tolerance adjustment in admin only.
Changed
- Lenient deserialization on cross-plane read schemas.
EventandWebhookDeliverynow declare@JsonIgnoreProperties(ignoreUnknown = true)at the class level. Runtime (cycles-server) is the authoritative writer ofevent:*anddelivery:*Redis records; admin only reads them. Previously the admin POJOs wereignoreUnknown = false— so any additive field runtime shipped in a patch release would break admin'slistEvents/listWebhookDeliverieswithUnrecognizedPropertyExceptionuntil admin lockstep-updated the POJO. This violated the "additive fields are safe" invariant the admin/runtime split is built on. Runtime can now ship additive fields in any patch without forcing an admin release. - Hygiene: removed a dead
@JsonIgnoreProperties(ignoreUnknown = false)fromErrorResponse. That annotation was never reachable at runtime (admin writesErrorResponseto the wire; no reader path exists inside admin), so it was inert.
Unchanged (scope discipline)
- Strict mode preserved on admin-owned schemas:
WebhookSubscription,Tenant,Budget,Policy,ApiKey, everyEventData*subtype, everyBulk*Request/Bulk*Filter, every*CreateRequest/*UpdateRequest. Admin writes these — a typo there is an admin-internal bug and must fail loudly. The lenient tolerance is scoped to schemas runtime writes.
Internal
- No wire contract change. No spec edits (
cycles-governance-admin-v0.1.25.yamlstill atinfo.version=0.1.25.28). - Two test cases pin the invariant:
EventModelTest#event_tolerantOfUnknownFieldAddedByRuntimeandWebhookModelTest#webhookDelivery_tolerantOfUnknownFieldAddedByRuntime. A future regression — someone re-addingignoreUnknown = false— would fail these tests immediately.
Compatibility
- No client-visible behavior change. Admin-written request/response payloads still validate strictly.
- No DB migration.
- No upgrade ordering with runtime — that's the whole point of the change.