feat(events): RefinementIterationEvent + orchestration state counter

This commit is contained in:
2026-06-04 00:50:16 +04:00
parent bcc20509e0
commit 9d1fe397f1
7 changed files with 88 additions and 0 deletions
@@ -0,0 +1,19 @@
package com.correx.core.events.events
import com.correx.core.events.types.SessionId
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
/**
* Records one pass through a refinement cycle (e.g. implementer→reviewer→implementer).
* [cycleKey] identifies the loop (e.g. "implement->review"). [iteration] is 1-based.
* Recorded so the runtime refinement guard is replay-deterministic (invariant #8).
*/
@Serializable
@SerialName("RefinementIteration")
data class RefinementIterationEvent(
val sessionId: SessionId,
val cycleKey: String,
val iteration: Int,
val maxIterations: Int,
) : EventPayload
@@ -14,4 +14,5 @@ data class OrchestrationState(
val pendingApproval: Boolean = false,
val failureReason: String? = null,
val retryPolicy: RetryPolicy? = null,
val refinementIterations: Map<String, Int> = emptyMap(),
)
@@ -23,6 +23,7 @@ import com.correx.core.events.events.ModelLoadedEvent
import com.correx.core.events.events.ModelUnloadedEvent
import com.correx.core.events.events.OrchestrationPausedEvent
import com.correx.core.events.events.OrchestrationResumedEvent
import com.correx.core.events.events.RefinementIterationEvent
import com.correx.core.events.events.RetryAttemptedEvent
import com.correx.core.events.events.RiskAssessedEvent
import com.correx.core.events.events.StageCompletedEvent
@@ -78,6 +79,7 @@ val eventModule = SerializersModule {
subclass(WorkflowFailedEvent::class)
subclass(WorkflowCompletedEvent::class)
subclass(RetryAttemptedEvent::class)
subclass(RefinementIterationEvent::class)
subclass(RiskAssessedEvent::class)
subclass(ChatSessionStartedEvent::class)
subclass(ChatTurnEvent::class)
@@ -0,0 +1,25 @@
package com.correx.core.events.serialization
import com.correx.core.events.events.EventPayload
import com.correx.core.events.events.RefinementIterationEvent
import com.correx.core.events.types.SessionId
import kotlin.test.Test
import kotlin.test.assertEquals
import kotlin.test.assertTrue
class RefinementEventSerializationTest {
@Test
fun `RefinementIterationEvent round-trips as polymorphic EventPayload`() {
val sample: EventPayload = RefinementIterationEvent(
sessionId = SessionId("s"),
cycleKey = "implement->review",
iteration = 2,
maxIterations = 3,
)
val encoded = eventJson.encodeToString(EventPayload.serializer(), sample)
assertTrue(encoded.contains("\"type\":\"RefinementIteration\""), "SerialName must be present: $encoded")
val decoded = eventJson.decodeFromString(EventPayload.serializer(), encoded)
assertEquals(sample, decoded)
}
}