Tags: platform-engineering-labs/formae
Tags
0.87.0-dev.1: formae profile command + per-invocation --profile flag
0.87.0-dev.0: embed resolvables inside String-typed fields (PLA-68)
fix(patch): replace Atomic list fields wholesale instead of remove+add A list field marked with the Atomic update method now produces a single whole-array replace operation instead of per-element remove and add. AWS Cloud Control does not reliably apply a remove+add pair against a mutually-exclusive list such as NetworkFirewall FirewallPolicy StatefulDefaultActions: the live resource ends up holding both the old and the new value, which AWS then rejects. The JSON patch formae generated was itself a correct RFC 6902 remove+add — the failure is on the Cloud Control side — so the fix is to emit a single replace, matching how the underlying UpdateFirewallPolicy API and the existing object-level Atomic hint already behave. The behavior change lives in the jsonpatch dependency, which now honors the Atomic hint for array values and not only objects. This bump pulls in that support and adds a regression test for the nested dotted-hint case (FirewallPolicy.StatefulDefaultActions).
refactor(discovery,sync): use GenericTimeout for periodic re-arm
Replace hand-rolled timer-state bookkeeping in the discovery and
synchronizer actors with statemachine.GenericTimeout. A named
GenericTimeout auto-cancels any prior timer with the same name, so the
"exactly one periodic timer in flight" invariant is enforced by the
framework instead of by a boolean flag the handlers maintain.
The Once-vs-periodic distinction collapses: every Discover{} and
Synchronize{} is treated the same, force-discovery and force-sync
callers just send the bare message, and every transition to Idle
returns a rescheduleAction. There is no flag whose stale value could
suppress the next schedule. Deleted: Discover.Once, Synchronize.Once,
tickPending, isScheduledSync, scheduleNextSync, and the reschedule
branches in onStateChange.
This also fixes a latent wedge in the synchronizer with the same shape
as the recently-fixed discovery wedge: data.isScheduledSync =
!message.Once ran before the busy guard, so a ForceSync arriving while
a periodic cycle was running would clobber the flag to false and the
running cycle would never schedule a successor. User-triggered rather
than apply-triggered, but the same dead-until-restart failure mode.
Tests assert on the returned action rather than recording SendAfter
calls. Two tests per package: a wedge regression and a disabled-config
guard. The earlier discovery tests are replaced - under the named-timer
design their scenarios are structurally impossible (no Once flag, no
double-schedule possible) so their names no longer describe behavior
worth locking in.
refactor(discovery,sync): use GenericTimeout for periodic re-arm
Replace hand-rolled timer-state bookkeeping in the discovery and
synchronizer actors with statemachine.GenericTimeout. A named
GenericTimeout auto-cancels any prior timer with the same name, so the
"exactly one periodic timer in flight" invariant is enforced by the
framework instead of by a boolean flag the handlers maintain.
The Once-vs-periodic distinction collapses: every Discover{} and
Synchronize{} is treated the same, force-discovery and force-sync
callers just send the bare message, and every transition to Idle
returns a rescheduleAction. There is no flag whose stale value could
suppress the next schedule. Deleted: Discover.Once, Synchronize.Once,
tickPending, isScheduledSync, scheduleNextSync, and the reschedule
branches in onStateChange.
This also fixes a latent wedge in the synchronizer with the same shape
as the recently-fixed discovery wedge: data.isScheduledSync =
!message.Once ran before the busy guard, so a ForceSync arriving while
a periodic cycle was running would clobber the flag to false and the
running cycle would never schedule a successor. User-triggered rather
than apply-triggered, but the same dead-until-restart failure mode.
Tests assert on the returned action rather than recording SendAfter
calls. Two tests per package: a wedge regression and a disabled-config
guard. The earlier discovery tests are replaced - under the named-timer
design their scenarios are structurally impossible (no Once flag, no
double-schedule possible) so their names no longer describe behavior
worth locking in.
build(deps): bump ergo fork to v1.999.320-pel.2 (spawn-stall fixes) Bumps the ergo fork from v1.999.320-pel.1 to v1.999.320-pel.2 in the root module and the pkg/plugin SDK module. The new tag fixes two defects in ergo's net/proto connection layer that caused intermittent 5s SpawnRegister timeouts, where remote PluginOperator spawns failed with "timed out" even though the plugin was responsive. The first is a reply-drop race: remote request/reply created an unbuffered result channel and delivered the reply with a non-blocking send, so a reply arriving in the sub-millisecond window before the requester parked on the channel was silently dropped, leaving the requester to wait out the full 5s deadline. The fix buffers the result channels (cap 1). The second is a stale send flusher on lane re-dial: when a pooled connection lane's socket died, the dialing side re-dialed and installed the new socket for reading but left the lane's send flusher bound to the dead socket, so messages on that lane were silently lost. The fix recreates the flusher on re-dial. Dependency bump only; no source changes in this repo. Validated over a multi-hour production soak with no stalls.
PreviousNext