Skip to content

Tags: platform-engineering-labs/formae

Tags

0.87.0-dev.2

Toggle 0.87.0-dev.2's commit message
0.87.0-dev.2: resolvable no-op reconcile fixes (PLA-31 #535, PLA-115 #…

…534)

0.87.0-dev.1

Toggle 0.87.0-dev.1's commit message
0.87.0-dev.1: formae profile command + per-invocation --profile flag

0.87.0-dev.0

Toggle 0.87.0-dev.0's commit message
0.87.0-dev.0: embed resolvables inside String-typed fields (PLA-68)

0.86.2

Toggle 0.86.2's commit message
formae 0.86.2

0.86.2-dev.1

Toggle 0.86.2-dev.1's commit message

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature.
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).

0.86.1-dev.4

Toggle 0.86.1-dev.4's commit message

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature.
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.

0.86.1-dev.0

Toggle 0.86.1-dev.0's commit message

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature.
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.

0.86.0

Toggle 0.86.0's commit message

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature.
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.