refactor: merge cycle policy into semantic validation layer

Wire SemanticValidator into the production validator pipeline and
consolidate cycle-policy types under core:validation.

- Add SemanticValidator(CycleExitRule(requirePolicyForCycles=false))
  to the prod ValidationPipeline (no-op default, preserves behavior)
- Move CyclePolicy/Binding/Signature/Factory from core:transitions.policy
  to core:validation.policy (validation already owns ValidationContext)
- Rename CyclePolicyBindingRule -> CycleExitRule (issue code unchanged)
- Delete dead CyclePolicyResolver + PolicyValidation
This commit is contained in:
2026-05-30 12:57:01 +04:00
parent d68c76ee3c
commit 32d15de034
10 changed files with 52 additions and 45 deletions
@@ -3,7 +3,7 @@ package com.correx.core.validation.model
import com.correx.core.sessions.SessionState
import com.correx.core.transitions.analysis.DetectedCycle
import com.correx.core.transitions.graph.WorkflowGraph
import com.correx.core.transitions.policy.CyclePolicyBinding
import com.correx.core.validation.policy.CyclePolicyBinding
data class ValidationContext(
val graph: WorkflowGraph,
@@ -0,0 +1,15 @@
package com.correx.core.validation.policy
sealed interface CyclePolicy {
data class Retry(
val maxAttempts: Int
) : CyclePolicy
data class Refinement(
val maxIterations: Int
) : CyclePolicy
data class Approval(
val timeoutMs: Long
) : CyclePolicy
}
@@ -0,0 +1,6 @@
package com.correx.core.validation.policy
data class CyclePolicyBinding(
val cycle: CycleSignature,
val policy: CyclePolicy
)
@@ -0,0 +1,9 @@
package com.correx.core.validation.policy
import com.correx.core.events.types.StageId
import java.util.*
data class CycleSignature(
val nodes: SortedSet<StageId>,
val edges: SortedSet<Pair<StageId, StageId>>,
)
@@ -0,0 +1,19 @@
package com.correx.core.validation.policy
import com.correx.core.events.types.StageId
import com.correx.core.transitions.graph.TransitionEdge
import java.util.*
object CycleSignatureFactory {
fun from(nodes: List<StageId>, edges: List<TransitionEdge>): CycleSignature {
val nodeSet = TreeSet<StageId>(compareBy { it.value })
nodeSet.addAll(nodes)
val edgeSet = TreeSet<Pair<StageId, StageId>>(
compareBy({ it.first.value }, { it.second.value })
)
edges.forEach { edgeSet.add(it.from to it.to) }
return CycleSignature(nodes = nodeSet, edges = edgeSet)
}
}
@@ -1,12 +1,12 @@
package com.correx.core.validation.semantic.rules
import com.correx.core.transitions.policy.CycleSignatureFactory
import com.correx.core.validation.policy.CycleSignatureFactory
import com.correx.core.validation.model.ValidationContext
import com.correx.core.validation.model.ValidationIssue
import com.correx.core.validation.model.ValidationSeverity
import com.correx.core.validation.semantic.SemanticRule
class CyclePolicyBindingRule(
class CycleExitRule(
private val requirePolicyForCycles: Boolean
) : SemanticRule {