OODA Coefficients Reference

Complete catalog of every tunable coefficient in the OODA Loop System (Feature 032). All coefficients live in the OODADefines class within src/babylon/config/defines.py unless otherwise noted.

Access pattern:

from babylon.config.defines import GameDefines

defines = GameDefines()
ooda = defines.ooda  # OODADefines instance

# Example: get base observe time
ooda.base_observe_time  # 1.0

Cycle Time Weights

Used in babylon.ooda.cycle_time.compute_cycle_time() to compute the four-phase additive OODA cycle time.

Formula:

\[T_{cycle} = T_{observe} + T_{orient} + T_{decide} + T_{act}\]

Where:

\[\begin{split}T_{observe} &= \texttt{base\_observe\_time} + \texttt{sensor\_latency} \times \texttt{latency\_weight} \\ T_{orient} &= \max\bigl(\texttt{base\_orient\_time} \times (1 - \texttt{coherence} \times \texttt{coherence\_weight}),\ \texttt{orient\_time\_floor}\bigr) \\ T_{decide} &= \texttt{decision\_base} \times (1 + \texttt{bureaucratic\_depth} \times \texttt{depth\_weight}) \\ T_{act} &= \texttt{base\_act\_time}\end{split}\]

Parameter

Default

Constraints

Description

base_observe_time

1.0

gt=0

Base Observe phase duration (ticks).

latency_weight

0.5

ge=0

Weight of sensor_latency on Observe phase.

base_orient_time

2.0

gt=0

Base Orient phase duration.

coherence_weight

0.6

ge=0, le=1.0

Weight of ideological_coherence on Orient phase.

base_act_time

1.0

gt=0

Base Act phase duration (fixed, not modified by profile).

coord_weight

0.3

ge=0

Weight of coordination on Act phase (reserved for future use).

depth_weight

0.4

ge=0

Weight of bureaucratic_depth on Decide phase.

orient_time_floor

0.1

ge=0.0

Minimum Orient phase duration. Prevents coherence from zeroing out Orient.

Code location: src/babylon/config/defines.py:2141-2177, used in src/babylon/ooda/cycle_time.py:17-39.

Decision Mode Base Times

The decision_base term in the Decide phase formula. Looked up by DecisionMode enum value in babylon.ooda.cycle_time.compute_cycle_time().

Parameter

Default

Constraints

Description

decision_mode_base_autocratic

1.0

gt=0

AUTOCRATIC: single decision-maker, fastest.

decision_mode_base_delegate

2.0

gt=0

DELEGATE: leader delegates to trusted subordinates.

decision_mode_base_democratic

3.0

gt=0

DEMOCRATIC: majority vote among members.

decision_mode_base_consensus

5.0

gt=0

CONSENSUS: full agreement required, slowest.

Ordering invariant: AUTOCRATIC (1.0) < DELEGATE (2.0) < DEMOCRATIC (3.0) < CONSENSUS (5.0).

Code location: src/babylon/config/defines.py:2179-2199, used in src/babylon/ooda/cycle_time.py:42-58.

Initiative Scoring Weights

Five-component weighted sum in babylon.ooda.initiative.compute_initiative_score().

Formula:

\[I = w_{speed} \times \frac{1}{T_{cycle}} + w_{inst} \times B_{inst} + w_{ci} \times C + w_{embed} \times E + w_{mom} \times M\]

Parameter

Default

Constraints

Description

initiative_weight_speed

2.0

ge=0

Weight for speed component (inverse cycle time).

initiative_weight_institutional

1.0

ge=0

Weight for institutional bonus (state advantage).

initiative_weight_counterintel

1.5

ge=0

Weight for counter-intelligence capability.

initiative_weight_embeddedness

1.0

ge=0

Weight for community embeddedness.

initiative_weight_momentum

0.5

ge=0

Weight for recent success momentum.

Code location: src/babylon/config/defines.py:2201-2226, used in src/babylon/ooda/initiative.py:22-67.

Institutional Bonus by Jurisdiction

The \(B_{inst}\) term in the initiative formula. Looked up by JurisdictionLevel enum value.

Parameter

Default

Constraints

Description

institutional_bonus_federal

5.0

ge=0

NATIONAL (federal) jurisdiction. FBI, DEA, ATF.

institutional_bonus_state

3.0

ge=0

STATE jurisdiction. State police, National Guard.

institutional_bonus_local

1.5

ge=0

COUNTY or MUNICIPAL jurisdiction. Local PD, sheriff.

institutional_bonus_nonstate

0.0

ge=0

Non-state organizations (factions, civil society, business).

Code location: src/babylon/config/defines.py:2228-2248, used in src/babylon/ooda/initiative.py:148-167.

Momentum

Momentum rewards consecutive successful actions and decays exponentially per tick.

Formula:

\[\begin{split}M_{t+1} = M_t \times \texttt{momentum\_decay} + \begin{cases} \texttt{momentum\_success\_bonus} & \text{if action succeeded} \\ 0 & \text{otherwise} \end{cases}\end{split}\]

Parameter

Default

Constraints

Description

momentum_decay

0.8

ge=0, lt=1.0

Exponential decay factor per tick. Higher = slower decay.

momentum_success_bonus

0.2

ge=0

Bonus added per successful action.

Code location: src/babylon/config/defines.py:2250-2261, used in src/babylon/ooda/initiative.py:127-145.

Action Cost Modifiers

Community-modified action costs in babylon.ooda.action_costs.compute_action_cost().

Formula:

\[\begin{split}\texttt{modifier} = \begin{cases} \max\bigl(\texttt{min\_cost\_modifier},\ 1.0 - \texttt{overlap} \times \texttt{embeddedness\_discount}\bigr) & \text{if embedded (overlap > 0)} \\ \texttt{contradiction\_cost\_multiplier} & \text{if across contradiction axis} \\ \texttt{outsider\_cost\_multiplier} & \text{otherwise (outsider)} \end{cases}\end{split}\]
\[\texttt{effective\_cost} = \max\bigl(1,\ \lceil \texttt{base\_cost} \times \texttt{modifier} \rceil\bigr)\]

Parameter

Default

Constraints

Description

embeddedness_discount

0.5

ge=0, le=1.0

Cost discount factor for embedded orgs. Higher = steeper discount.

contradiction_cost_multiplier

2.5

gt=1.0

Cost multiplier when org and target are on opposite sides of a contradiction axis.

outsider_cost_multiplier

1.5

gt=1.0

Cost multiplier for orgs with no membership in the target community.

min_cost_modifier

0.5

gt=0, le=1.0

Floor cost modifier. Even fully embedded orgs pay at least 50% of base cost.

Code location: src/babylon/config/defines.py:2263-2285, used in src/babylon/ooda/action_costs.py:34-82.

Consciousness Effect Limits

Per-tick clamping in babylon.ooda.action_effects.compute_consciousness_delta().

Parameter

Default

Constraints

Description

max_ci_delta_per_tick

0.05

gt=0, le=1.0

Maximum absolute CI delta per action per tick. Prevents runaway consciousness shifts.

Code location: src/babylon/config/defines.py:2287-2293, used in src/babylon/ooda/action_effects.py:85-88.

Action Base Consciousness Multipliers

The action_base term in the consciousness delta formula. Zero means the action has no consciousness effect (e.g., AGITATE affects contestation instead).

Formula:

\[\Delta_{CI} = \text{clamp}\bigl(\texttt{tendency\_modifier} \times \texttt{cadre} \times \texttt{cohesion} \times \texttt{credibility} \times \texttt{action\_base},\ \pm\texttt{max\_ci\_delta}\bigr)\]

Parameter

Default

Constraints

Description

action_base_educate

1.2

ge=0

EDUCATE: direct political education. Highest CI multiplier.

action_base_agitate

0.0

ge=0

AGITATE: increases contestation, not CI directly. Zero base.

action_base_provide_service

0.6

ge=0

PROVIDE_SERVICE: serve-the-people programs. Moderate CI effect.

action_base_recruit

0.3

ge=0

RECRUIT: bringing in new members. Low CI effect.

action_base_organize

0.5

ge=0

ORGANIZE: building community structures. Moderate CI effect.

action_base_propagandize

0.8

ge=0

PROPAGANDIZE: media and messaging. High CI effect.

action_base_repress

0.8

ge=0

REPRESS: state violence. Backfire CI effect (always +CI on target, REVOLUTIONARY tendency).

action_base_surveil

0.2

ge=0

SURVEIL: state surveillance. Smaller backfire CI effect than REPRESS.

action_base_assimilate

1.0

ge=0

ASSIMILATE: institutional co-optation. Negative CI effect (pushes LIBERAL tendency).

Special case – PROVIDE_SERVICE tendency split (hardcoded in _get_effective_action_base):

  • REVOLUTIONARY org: uses action_base_provide_service (0.6)

  • LIBERAL org: uses action_base_provide_service * 0.3 (0.18)

  • Other tendency: zero effect

Code location: src/babylon/config/defines.py:2295-2340, used in src/babylon/ooda/action_effects.py:231-246.

Autonomy Tradeoff

The autonomy-breadth tradeoff in babylon.ooda.constraints.apply_autonomy_modifier().

Formula:

\[\begin{split}\texttt{effectiveness} = \begin{cases} 1.0 & \text{if } n_{targets} \leq 1 \\ \max\bigl(0.1,\ 1.0 - \texttt{autonomy} \times \texttt{scale} \times \frac{n_{targets} - 1}{n_{targets}}\bigr) & \text{otherwise} \end{cases}\end{split}\]

Parameter

Default

Constraints

Description

autonomy_effectiveness_scale

0.5

ge=0, le=1.0

Scale factor for the autonomy-effectiveness tradeoff. Higher = steeper penalty for spreading actions.

Code location: src/babylon/config/defines.py:2342-2348, used in src/babylon/ooda/constraints.py:92-116.

Agitation-Contestation Coupling

AGITATE actions increase ideological_contestation on the target community. When contestation exceeds a threshold, EDUCATE actions receive a bonus multiplier.

Parameter

Default

Constraints

Description

agitation_contestation_delta

0.1

ge=0, le=1.0

Contestation increase per AGITATE action.

agitation_educate_bonus

1.5

ge=1.0

EDUCATE CI delta multiplier when community contestation exceeds threshold.

contestation_threshold

0.3

ge=0, le=1.0

Contestation level at which EDUCATE bonus activates.

Mechanic: AGITATE first to raise contestation above 0.3, then EDUCATE with 1.5x multiplier. This models how agitation creates the conditions for effective political education.

Code location: src/babylon/config/defines.py:2350-2367, used in src/babylon/ooda/action_effects.py:78-82 (EDUCATE bonus) and src/babylon/ooda/action_effects.py:150-163 (AGITATE resolver).

Lifecycle Modifiers

Elder legitimacy in babylon.ooda.lifecycle_capacity.elder_legitimacy_bonus().

Parameter

Default

Constraints

Description

elder_legitimacy_multiplier

1.3

ge=1.0

CI delta multiplier when organization has elder (D’-phase) members. Elders lend legitimacy.

Code location: src/babylon/config/defines.py:2369-2374, used in src/babylon/ooda/lifecycle_capacity.py:44-70.

Counter-Intelligence

Counter-intelligence score progression.

Parameter

Default

Constraints

Description

counter_intel_increment

0.1

ge=0, le=1.0

Counter-intel score increment per successful COUNTER_INTEL action.

Code location: src/babylon/config/defines.py:2376-2382.

Base Action Point Costs

Default AP cost for each of the 21 action types. All are integers with ge=1. Modified at runtime by babylon.ooda.action_costs.compute_action_cost().

Parameter

Default

Description

base_cost_educate

1

Political education. Cheap, high CI impact.

base_cost_agitate

1

Raise contestation. Cheap, no direct CI effect.

base_cost_fundraise

1

Generate resources.

base_cost_employ

1

Business auto-metabolism.

base_cost_surveil

1

State surveillance. Cheap, low backfire.

base_cost_map_network

1

Intelligence mapping.

base_cost_propose_alliance

1

Diplomatic overture.

base_cost_denounce

1

Public condemnation.

base_cost_recruit

2

Grow membership.

base_cost_organize

2

Build community structures.

base_cost_propagandize

2

Media and messaging.

base_cost_provide_service

2

Serve-the-people programs.

base_cost_repress

2

State violence. Moderate cost, high backfire.

base_cost_protest

2

Public demonstration.

base_cost_counter_intel

2

Counter-intelligence operations.

base_cost_attack_infrastructure

2

Sabotage community infrastructure.

base_cost_assimilate

2

Institutional co-optation.

base_cost_strike

3

Labor withdrawal. Expensive, powerful.

base_cost_expropriate

3

Seize property/resources. Expensive.

base_cost_infiltrate

3

Intelligence infiltration. Expensive.

base_cost_build_infrastructure

3

Build community infrastructure. Expensive, lasting effect.

Code location: src/babylon/config/defines.py:2384-2411.

Layer 3 Propagation Coefficients

Used by babylon.ooda.layer3.process_layer3() to propagate action consequences to community state.

Parameter

Default

Constraints

Description

repress_heat_delta

0.15

ge=0.0, le=1.0

Heat increase per REPRESS action. Heavy state attention.

surveil_heat_delta

0.05

ge=0.0, le=1.0

Heat increase per SURVEIL action. Light state attention.

build_infrastructure_delta

0.1

ge=0.0, le=1.0

Infrastructure increase per BUILD_INFRASTRUCTURE action.

attack_infrastructure_delta

0.1

ge=0.0, le=1.0

Infrastructure decrease per ATTACK_INFRASTRUCTURE action.

Code location: src/babylon/config/defines.py:2413-2428, used in src/babylon/ooda/layer3.py:97-222.

Module-Level Constants

Constants defined outside OODADefines, typically structural data or loop safety limits.

Structural Constants

Constant

Location

Description

_CONTRADICTION_PAIRS

action_costs.py:25-31

5 tuples of (CommunityType, CommunityType) defining contradiction axes: SETTLER/NEW_AFRIKAN, SETTLER/FIRST_NATIONS, SETTLER/CHICANO, PATRIARCHAL/WOMEN, PATRIARCHAL/TRANS.

_UNIVERSAL_ACTIONS

action_eligibility.py

frozenset of 12 ActionTypes available to all org types: RECRUIT, ORGANIZE, EDUCATE, AGITATE, PROPAGANDIZE, FUNDRAISE, PROTEST, COUNTER_INTEL, MAP_NETWORK, PROPOSE_ALLIANCE, DENOUNCE, BUILD_INFRASTRUCTURE.

_NPC_PRIORITIES

npc_stub.py:20-47

Priority queues by org type. STATE_APPARATUS: SURVEIL first. POLITICAL_FACTION: EDUCATE first. CIVIL_SOCIETY: PROVIDE_SERVICE first. BUSINESS: EMPLOY first.

Loop Safety Limits

All OODA modules enforce static upper bounds on iterations per the project’s loop safety rule. These are not tunable game parameters.

Constant

Value

Location

Scope

_MAX_ACTIONS_PER_ORG

20

constraints.py:15

Maximum actions processed per organization per tick.

max_orgs

1000

layer0.py:39

Maximum Business orgs processed in Layer 0.

max_results

1000

layer3.py (5 functions)

Maximum action results iterated per sub-processor.

max_edges

1000

action_costs.py:102,141

Maximum edges iterated for membership overlap.

max_nodes

1000

action_effects.py:281

Maximum nodes iterated for community membership.

max_actions

20

npc_stub.py:78

Maximum NPC actions selected per org.

Hardcoded Multipliers

Two values are hardcoded in function bodies rather than in OODADefines:

Value

Location

Purpose

0.3

action_effects.py:243

LIBERAL tendency multiplier for PROVIDE_SERVICE (action_base * 0.3).

0.1

constraints.py:116

Autonomy effectiveness floor. Prevents complete ineffectiveness.

0.01

action_effects.py:68

Minimum overlap for credibility (max(overlap, 0.01)).

Coefficient Derivation Chain

Every tunable coefficient in OODADefines traces back to one of five empirical irreducibles through a three-level hierarchy. Field descriptions use category tags to indicate provenance:

  • [A] Direct substitution from an existing source primitive

  • [B] Computed from source primitives via an explicit formula

  • [C] Grounded in empirical data (COIN studies, census, organizational theory)

  • [D] Theoretically justified but not computationally derivable

  • [E] Engineering constant (structural value, keep as literal)

Level 0: Empirical Irreducibles

ID

Value

Symbol

Source

IR-1

7 weeks

\(\tau_{1/2}\)

Political half-life. FM 3-24 counterinsurgency doctrine: insurgent activity recovers to 50% within 6–8 weeks post-operation. Produces \(\lambda = \ln 2 / 7 \approx 0.1\).

IR-2

0.8

\(\alpha\)

Imperial extraction capacity. Amin/Emmanuel unequal exchange: ~80% of periphery surplus transferred to core.

IR-3

0.3

\(p_c\)

Network percolation threshold. For social networks with \(\langle k \rangle \approx 3\text{--}4\), site percolation \(p_c \approx 1 / \langle k \rangle\).

IR-4

1.5×

rent premium

Gentrification rent premium. Census/HUD data, UCLA Urban Displacement Project: median rent increase of 40–60% during rapid displacement.

IR-5

0.2

\(\Delta S\)

George Floyd solidarity shift. Pew Research 2020: 20 percentage point shift in white BLM support.

Level 1: Source Primitives

Source primitives are GameDefines constants that OODA coefficients reference. Each derives from a Level 0 irreducible.

Primitive

Default

Derivation

From

consciousness.decay_lambda

0.1

\(\ln 2 / 7\)

IR-1

consciousness.agitation_decay_rate

0.1

= decay_lambda

IR-1

consciousness.routing_scale

0.1

= decay_lambda

IR-1

consciousness.sensitivity

0.5

\(\lambda / (1 - \alpha)\)

IR-1 + IR-2

economy.extraction_efficiency

0.8

Amin/Emmanuel

IR-2

solidarity.activation_threshold

0.3

\(p_c \approx 1/\langle k \rangle\)

IR-3

solidarity.scaling_factor

0.5

= consciousness.sensitivity

IR-1 + IR-2

territory.heat_decay_rate

0.1

= decay_lambda

IR-1

territory.heat_spillover_rate

0.05

= heat_decay_rate / 2

IR-1

territory.high_profile_heat_gain

0.15

= rent_spike × heat_decay

IR-1 + IR-4

territory.rent_spike_multiplier

1.5

Census/HUD

IR-4

territory.eviction_heat_threshold

0.8

= \(\alpha\)

IR-2

struggle.solidarity_gain_per_uprising

0.2

Pew Research

IR-5

Level 2: OODA Coefficients

Coefficient

Default

Cat

Formula / Source

repress_heat_delta

0.15

A

= territory.high_profile_heat_gain

surveil_heat_delta

0.05

A

= territory.heat_spillover_rate

momentum_success_bonus

0.2

A

= struggle.solidarity_gain_per_uprising

agitation_contestation_delta

0.1

A

= consciousness.agitation_decay_rate

momentum_decay

0.8

B

\(1 - 2\lambda\)

max_ci_delta_per_tick

0.05

B

\(\lambda / 2\)

action_base_educate

1.2

B

\(1 + 2\lambda\)

action_base_propagandize

0.8

B

\(1 - 2\lambda\)

action_base_repress

0.8

B

\(\alpha\)

action_base_surveil

0.2

B

\(1 - \alpha\)

action_base_provide_service

0.6

B

\(k + \text{routing\_scale}\)

action_base_organize

0.5

B

\(k\) (sensitivity)

action_base_recruit

0.3

B

\(p_c\) (activation threshold)

contestation_threshold

0.3

B

\(p_c\) (activation threshold)

agitation_educate_bonus

1.5

B

= territory.rent_spike_multiplier

embeddedness_discount

0.5

B

= solidarity.scaling_factor

elder_legitimacy_multiplier

1.3

C

\(1 + \text{ideology\_institutional\_weight}\)

counter_intel_increment

0.1

C

\(\lambda\) (Sparrow network entropy)

outsider_cost_multiplier

1.5

C

= territory.rent_spike_multiplier (Prebisch-Singer)

contradiction_cost_multiplier

2.5

C

\(\approx \sqrt{4.2}\) (incarceration disparity)

institutional_bonus_federal

5.0

C

FM 3-24 force density ratio

institutional_bonus_state

3.0

C

RAND state police force ratio

institutional_bonus_local

1.5

C

Galula administrative presence premium

Runtime Validation

Call OODADefines.validate_derivations(game_defines) to detect coefficient drift when source primitives are changed via YAML overrides or scenario configs:

defines = GameDefines.load_from_yaml("custom_scenario.yaml")
drifts = defines.ooda.validate_derivations(defines)
if drifts:
    for msg in drifts:
        print(f"WARNING: {msg}")

Code location: src/babylon/config/defines.py, validated in tests/unit/ooda/test_coefficient_derivations.py.

See Also