Progression Policy
The Progression Policy (POLICY_TYPE_PROGRESSION) controls automated behaviors related to participant progression through tournament structures, including qualifier placement, double-exit BYE propagation, and qualifier replacement rules.
Policy Type: progression
When to Use:
- Automatically placing qualifiers into main draws
- Controlling BYE propagation in double-exit scenarios
- Managing qualifier replacement when matchUp outcomes change
- Automating participant flow between structures
- Enforcing federation-specific progression rules
Policy Structure
{
progression: {
policyName?: string; // Optional policy identifier
doubleExitPropagateBye?: boolean; // a double exit produces a BYE, not an exit (default: true)
autoPlaceQualifiers?: boolean; // Auto-place qualifiers (default: false)
autoReplaceQualifiers?: boolean; // Replace if winningSide changes (default: false)
autoRemoveQualifiers?: boolean; // Remove if winningSide cleared (default: false)
}
}
Attributes:
-
doubleExitPropagateBye: A double exit (
DOUBLE_WALKOVER,DOUBLE_DEFAULT) removes both competitors, so nobody will arrive in the position its loser would have taken in a connected structure. Whentrue— the default — that position becomes a BYE. Whenfalseit receives a producedWALKOVERorDEFAULTEDinstead. Set it tofalseif you award ranking points bymatchUpStatusand need a first-round walkover told apart from a BYE. -
autoPlaceQualifiers: When
true, qualifiers are randomly assigned to qualifier positions in the main draw when qualifying completes. -
autoReplaceQualifiers: When
true, placed qualifiers will be replaced in target structures if the qualifying matchUp'swinningSideis changed. -
autoRemoveQualifiers: When
true, placed qualifiers will be removed from target structures if the qualifying matchUp'swinningSideis removed.
Default Policy
import { fixtures } from 'tods-competition-factory';
const { POLICY_PROGRESSION_DEFAULT } = fixtures.policies;
// Defaults:
// {
// progression: {
// doubleExitPropagateBye: true, // A double exit produces a BYE
// autoPlaceQualifiers: false, // Manual qualifier placement
// autoReplaceQualifiers: false, // Manual replacement
// autoRemoveQualifiers: false // Manual removal
// }
// }
Double-Exit BYE Propagation
BYE Propagation (default: true)
// When a first-round matchUp is a DOUBLE_WALKOVER or DOUBLE_DEFAULT:
// neither competitor advances, and neither is a loser who can be fed into a connected structure
// the position that loser would have taken becomes a BYE, and its opponent advances through it
const byePropagationPolicy = {
[POLICY_TYPE_PROGRESSION]: {
policyName: 'BYE Propagation',
doubleExitPropagateBye: true, // Default
},
};
Within the structure where the double exit happened nothing changes: the next matchUp still receives a
produced WALKOVER or DEFAULTED, and whoever arrives opposite it is awarded it. The policy governs
only the position in the CONNECTED structure.
Produced Exits (doubleExitPropagateBye: false)
// When a first-round matchUp is a DOUBLE_WALKOVER or DOUBLE_DEFAULT:
// the position its loser would have taken receives a produced WALKOVER or DEFAULTED instead of a BYE
// (may award ranking points, depending on the provider's rules)
const producedExitPolicy = {
[POLICY_TYPE_PROGRESSION]: {
policyName: 'Produced Exits',
doubleExitPropagateBye: false,
},
};
tournamentEngine.attachPolicies({
policyDefinitions: producedExitPolicy,
});
When to turn it off:
- You award ranking points by
matchUpStatusand a produced walkover must count where a BYE would not - Your published results must show that a position was vacated by a walkover rather than by a BYE
Automatic Qualifier Placement
Manual Placement (default: false)
// Default: tournament directors manually place qualifiers
const manualPlacement = {
[POLICY_TYPE_PROGRESSION]: {
autoPlaceQualifiers: false, // Default
},
};
// Manual placement workflow:
// 1. Qualifying completes
// 2. TD reviews qualifiers
// 3. TD manually assigns qualifiers to main draw positions
Automatic Placement (autoPlaceQualifiers: true)
// Qualifiers automatically placed when qualifying completes
const autoPlacement = {
[POLICY_TYPE_PROGRESSION]: {
policyName: 'Auto Qualifier Placement',
autoPlaceQualifiers: true, // Automatic random assignment
},
};
tournamentEngine.attachPolicies({
policyDefinitions: autoPlacement,
});
// Automatic workflow:
// 1. Qualifying completes
// 2. Qualifiers automatically assigned to available qualifier positions
// 3. Random distribution among available qualifier slots
Use Cases:
- Streamlined tournament operations
- Events with many qualifiers
- Automated tournament management systems
- Consistency in qualifier placement
Qualifier Replacement and Removal
Replacement on winningSide Change
const replacementPolicy = {
[POLICY_TYPE_PROGRESSION]: {
policyName: 'Auto Replacement',
autoPlaceQualifiers: true, // Enable automatic placement
autoReplaceQualifiers: true, // Replace if outcome changes
},
};
// Scenario:
// 1. Qualifier A wins final qualifying matchUp → placed in main draw
// 2. Referee changes winningSide to Qualifier B → A removed, B placed
// 3. Main draw automatically updated
Removal on winningSide Cleared
const removalPolicy = {
[POLICY_TYPE_PROGRESSION]: {
policyName: 'Auto Removal',
autoPlaceQualifiers: true,
autoRemoveQualifiers: true, // Remove if winningSide cleared
},
};
// Scenario:
// 1. Qualifier A placed in main draw
// 2. Referee clears winningSide from qualifying matchUp
// 3. Qualifier A automatically removed from main draw
Combined Replacement and Removal
const fullAutomation = {
[POLICY_TYPE_PROGRESSION]: {
policyName: 'Full Qualifier Automation',
autoPlaceQualifiers: true, // Auto-place when qualifying completes
autoReplaceQualifiers: true, // Replace if winningSide changes
autoRemoveQualifiers: true, // Remove if winningSide cleared
},
};
tournamentEngine.attachPolicies({
policyDefinitions: fullAutomation,
});
Real-World Examples
ITF Event With BYE Propagation
import { policyConstants } from 'tods-competition-factory';
const { POLICY_TYPE_PROGRESSION } = policyConstants;
// ITF rules: first-round walkovers don't award ranking points
const itfProgressionPolicy = {
[POLICY_TYPE_PROGRESSION]: {
policyName: 'ITF Progression',
doubleExitPropagateBye: true, // Use BYEs instead of walkovers
autoPlaceQualifiers: false, // Manual qualifier placement (ITF standard)
},
};
tournamentEngine.attachPolicies({
policyDefinitions: itfProgressionPolicy,
});
Automated Tournament System
// Fully automated progression for online tournament platform
const automatedProgressionPolicy = {
[POLICY_TYPE_PROGRESSION]: {
policyName: 'Fully Automated Progression',
doubleExitPropagateBye: false,
autoPlaceQualifiers: true,
autoReplaceQualifiers: true,
autoRemoveQualifiers: true,
},
};
// Benefits:
// - No manual intervention needed
// - Real-time updates as qualifying completes
// - Automatic corrections if results change
// - Consistent behavior across all events
Conservative Manual Control
// Tournament director maintains full control
const manualControlPolicy = {
[POLICY_TYPE_PROGRESSION]: {
policyName: 'Manual Control',
doubleExitPropagateBye: false, // Standard walkovers
autoPlaceQualifiers: false, // Manual placement
autoReplaceQualifiers: false, // Manual replacement
autoRemoveQualifiers: false, // Manual removal
},
};
// Use when:
// - Special considerations for qualifier placement
// - Seeding adjustments needed
// - Complex multi-event scenarios
// - TD preference for manual control
Policy Application
Event-Level Progression
// Different progression rules for different events
tournamentEngine.attachPolicies({
policyDefinitions: {
[POLICY_TYPE_PROGRESSION]: {
autoPlaceQualifiers: true,
autoReplaceQualifiers: true,
},
},
eventId: 'singles-event-id',
});
tournamentEngine.attachPolicies({
policyDefinitions: {
[POLICY_TYPE_PROGRESSION]: {
autoPlaceQualifiers: false, // Manual for doubles
},
},
eventId: 'doubles-event-id',
});
Notes
- Default behavior: All automation features disabled for maximum control
- doubleExitPropagateBye: Only affects double-exit structures (e.g., double-elimination, Curtis Consolation)
- autoPlaceQualifiers: Requires qualifier positions defined in main draw
- autoReplaceQualifiers: Only works when
autoPlaceQualifiers: true - autoRemoveQualifiers: Only works when
autoPlaceQualifiers: true - Policies affect progression between linked structures
- Tournament-level policy applies to all events unless overridden
- Event-level policy overrides tournament-level settings
- Automatic placement is random among available qualifier positions
- BYE vs. WALKOVER distinction important for ranking points
- Qualifier replacement preserves draw integrity
- Manual control allows for special seeding considerations
Related Concepts
- Draw Structures - Understanding structure types
- Draw Types - Double-exit and qualifying scenarios