Skip to content
Arxo Arxo

Policy Configuration

Use policy invariants to enforce cycle limits and prevent regression. For an overview, see Circular Dependencies.

metrics:
- id: scc
policy:
invariants:
# No cycles allowed
- metric: scc.cycle_count
op: "=="
value: 0
severity: error
message: "Circular dependencies detected - all modules must be independent"
# Largest cycle size must be zero in acyclic graphs
- metric: scc.max_cycle_size
op: "=="
value: 0
severity: error
message: "Largest cycle must be zero"
# No nodes should be in cycles
- metric: scc.total_nodes_in_cycles
op: "=="
value: 0
severity: error
message: "Modules are stuck in circular dependencies"
policy:
invariants:
# Don't let cycles grow
- metric: scc.max_cycle_size
op: "<="
value: 5
severity: error
message: "Cycle too large (more than 5 nodes)"
# Limit total damage
- metric: scc.total_nodes_in_cycles
op: "<="
value: 20
severity: warning
message: "Too many nodes in cycles"

Track progress over time using baseline comparison:

arxo.yml
metrics:
- id: scc
policy:
baseline:
mode: git
ref: origin/main
invariants:
# Don't let the largest cycle grow
- metric: scc.max_cycle_size
op: "<="
baseline: true # Compare against baseline
severity: error
message: "Largest cycle is growing"
# Don't let total nodes in cycles increase
- metric: scc.total_nodes_in_cycles
op: "<="
baseline: true
severity: error
message: "More modules are getting stuck in cycles"
MetricUse forGood Direction
scc.cycle_countNumber of cyclesLower is better (0 = no cycles)
scc.max_cycle_sizeSize of largest cycle; use == 0 for zero cyclesLower is better (0 = no cycles)
scc.total_nodes_in_cyclesTotal modules involved in any cycleLower is better (0 = no cycles)
scc.component_countTotal SCCs (healthy = node count)Higher is better (more SCCs = fewer cycles)
MetricUse forGood Direction
scc.function.cycle_countNumber of function-level cyclesLower is better (0 = no cycles)
scc.function.max_cycle_sizeLargest function-level cycleLower is better (0 = no cycles)
scc.function.call_massCall volume within cycles (runtime coupling)Lower is better (0 = no cycles)
scc.function.total_nodes_in_cyclesFunctions stuck in call cyclesLower is better (0 = no cycles)