Skip to content

Uncertainty Factors

Uncertainty factors are persistent conditions that systematically stretch or compress estimated effort. An inexperienced team, poorly defined requirements, or high technical complexity are uncertainty factors. They are not random events; they are known characteristics of the working environment that affect how long tasks are likely to take.

Understanding both risks and uncertainty factors — and when to use each — is essential for building realistic project models.

Every task can specify its own set of uncertainty factors. The simulator reads these labels, looks up the corresponding numeric multipliers from the configuration file, and multiplies them together to produce a single adjustment that scales the sampled base duration.

In the task pipeline, uncertainty factors are applied after estimate sampling and before risk impacts are added.

Supported Uncertainty Factors

mcprojsim supports five uncertainty factors out of the box. Each factor maps qualitative labels to numeric multipliers defined in the configuration file.

Team Experience

Reflects how familiar the team is with the technology and domain.

Level Default Multiplier Effect
high 0.90 10% faster than baseline
medium 1.00 No adjustment (baseline)
low 1.30 30% slower than baseline

An experienced team working in a familiar domain is likely to move faster. An inexperienced team facing unfamiliar technology needs more time for learning, mistakes, and rework.

Requirements Maturity

Captures how well-defined and stable the requirements are.

Level Default Multiplier Effect
high 1.00 Clear, stable requirements
medium 1.15 Some ambiguity or gaps
low 1.40 High ambiguity, likely changes

Poorly defined requirements lead to rework, misunderstandings, and scope changes. Even a skilled team slows down when the target keeps moving.

Technical Complexity

Indicates how technically challenging the work is.

Level Default Multiplier Effect
low 1.00 Well-understood technology
medium 1.20 Moderate complexity
high 1.50 Novel or cutting-edge work

Work involving unfamiliar architectures, new frameworks, or complex algorithms takes longer than routine development even for experienced teams.

Team Distribution

Reflects whether the team is colocated or distributed.

Level Default Multiplier Effect
colocated 1.00 Same location, easy communication
distributed 1.25 Remote/distributed, overhead applies

Distributed teams face communication delays, timezone differences, and coordination overhead. This factor accounts for that systematic slowdown.

Integration Complexity

Measures how much integration work is involved with other systems.

Level Default Multiplier Effect
low 1.00 Minimal integration needed
medium 1.15 Moderate integration effort
high 1.35 Complex multi-system integration

Tasks that require coordination with external APIs, databases, or third-party services carry additional overhead from interface changes, testing environments, and compatibility issues.

How the Combined Multiplier Is Calculated

When a task specifies multiple uncertainty factors, their multipliers are multiplied together to produce a single combined adjustment. The sampled base duration is then scaled by this combined multiplier.

Formula:

$$\text{adjusted_duration} = \text{base_duration} \times \prod_{i=1}^{n} \text{multiplier}_i$$

Example calculation:

Consider a task with the following uncertainty factors:

Factor Level Multiplier
team_experience medium 1.00
requirements_maturity low 1.40
technical_complexity high 1.50
team_distribution distributed 1.25
integration_complexity medium 1.15

Combined multiplier: $1.00 \times 1.40 \times 1.50 \times 1.25 \times 1.15 = 3.0188$

If the sampled base duration is 5 days, the adjusted duration becomes $5 \times 3.0188 \approx 15.1$ days.

This illustrates why multiple adverse factors compound quickly. Even moderate individual adjustments can produce a significant overall effect when multiplied together.

\newpage

Validation and Fallback Behavior

The current implementation distinguishes between project-file schema validation and runtime multiplier lookup:

  • The task model defines five named uncertainty fields: team_experience, requirements_maturity, technical_complexity, team_distribution, integration_complexity.
  • When these labels are looked up at runtime, missing factor names or unknown levels in the active configuration fall back to multiplier 1.0.

Practical implications:

  • If a configured factor name is missing entirely, that factor contributes no scaling (1.0).
  • If a level string is not present under a configured factor, that factor also contributes 1.0.
  • In other words, unknown or unmatched labels do not raise an error in multiplier lookup; they behave like neutral multipliers.

For predictable behavior, keep project-file labels aligned with your configured level names.

Default Values

If a task does not specify a particular uncertainty factor, the default level is applied. The defaults are:

Factor Default Level
team_experience medium
requirements_maturity medium
technical_complexity medium
team_distribution colocated
integration_complexity medium

A task that omits the uncertainty_factors block entirely still receives these defaults, resulting in a combined multiplier based on the default levels. In the default configuration, medium maps to 1.00 for team_experience but 1.15 for requirements_maturity, 1.20 for technical_complexity, and 1.15 for integration_complexity, so the default combined multiplier is not simply 1.0.

\newpage

Defining Uncertainty Factors in the Project File

Uncertainty factors are specified per task. You only need to include the factors you want to set explicitly; any omitted factors use their default level.

tasks:
  - id: "task_001"
    name: "Database schema design"
    estimate:
      low: 3
      expected: 5
      high: 10
      unit: "days"
    uncertainty_factors:
      team_experience: "high"
      requirements_maturity: "medium"
      technical_complexity: "low"
      team_distribution: "colocated"
      integration_complexity: "low"

You may also specify only the factors that differ from the defaults:

tasks:
  - id: "task_010"
    name: "Prototype ML pipeline"
    estimate:
      low: 8
      expected: 14
      high: 25
      unit: "days"
    uncertainty_factors:
      team_experience: "low"
      technical_complexity: "high"

Here, requirements_maturity, team_distribution, and integration_complexity all take their default values.

\newpage

Configuring Uncertainty Factor Multipliers

The numeric multipliers for each factor and level are defined in the configuration file (config.yaml), not in the project file. This separation means the project file describes the project conditions, while the configuration file defines how the organization interprets those conditions.

Default Configuration

uncertainty_factors:
  team_experience:
    high: 0.90      # Experienced team is 10% faster
    medium: 1.0     # Baseline
    low: 1.30       # Inexperienced team is 30% slower
  requirements_maturity:
    high: 1.0       # Well-defined requirements
    medium: 1.15    # Some ambiguity
    low: 1.40       # High ambiguity
  technical_complexity:
    low: 1.0        # Simple, well-understood technology
    medium: 1.20    # Moderate complexity
    high: 1.50      # High complexity, cutting-edge tech
  team_distribution:
    colocated: 1.0  # Team in same location
    distributed: 1.25  # Distributed team with communication overhead

  integration_complexity:
    low: 1.0        # Minimal integration
    medium: 1.15    # Moderate integration
    high: 1.35      # Complex integration with multiple systems

Customizing Multipliers

You can adjust the multipliers to match your organization's experience. For example, if your organization has found that distributed teams incur a higher overhead than the default 25%, you might change that value:

uncertainty_factors:
  team_distribution:
    colocated: 1.0
    distributed: 1.40  # 40% overhead for distributed work

Any values you specify in your configuration file are merged with the defaults. You only need to include the factors or levels you want to override.

If you provide a factor with only some levels (for example only distributed under team_distribution), unspecified levels continue to use defaults.

If you add additional factor names in configuration that are not referenced by the project task schema, they are effectively unused by the current simulation pipeline.

  • Keep task files focused on the five supported factor fields.
  • Keep organization-specific multiplier calibration in config.yaml.
  • Override only the factor levels that differ from defaults.
  • Recheck combined multiplier magnitude for heavily adverse combinations to avoid unintentionally extreme schedules.

Summary

Concept What It Models When It Applies How It Affects Duration
Uncertainty factor A persistent working condition Per task, every iteration Multiplies the sampled duration
  • Uncertainty factors are multiplicative: they scale the sampled base duration before risks are evaluated.
  • Multiple uncertainty factors compound: their multipliers are multiplied together, which can produce significant combined effects.

\newpage