Virtual-Deadline Scheduling (avionics/fsw/virtual-deadline-scheduling)
Use when the task is deciding the offline schedulability of an
avionics flight software task set under the dual-criticality
execution-time model scheduled by EDF-VD, the virtual-deadline
scheduling algorithm of Baruah, Bonifaci, D'Angelo, Li,
Marchetti-Spaccamela, Megow and Stougie (2012). Each task carries a
low-criticality execution-time estimate C_LO and a high-criticality
estimate C_HI, and EDF is priority-free: there is no task list order
and no deadline key, only the implicit period T. This leaf implements
the closed-form per-mode demand test, pure Python, stdlib only. It
pairs with avionics/fsw/mixed-criticality-scheduling, the
fixed-priority AMC-rtb branch of the same dual-criticality model, and
with avionics/fsw/real-time-scheduling, whose classic implicit-deadline
EDF verdict this leaf reproduces exactly on an all-LO set.
Domain quick reference
- Task model: {name, criticality, C_LO, C_HI, T}, criticality "LO" or
"HI", C_HI at least C_LO, one time unit, implicit deadline D = T. A
LO task carries no high estimate, so its C_HI equals its C_LO. There
is no priority order: any task list order is accepted.
- Per-mode demand sums: a = u_lo_lo = sum over LO tasks of C_LO / T,
b = u_hi_lo = sum over HI tasks of C_LO / T, c = u_hi_hi = sum over
HI tasks of C_HI / T. U_LO = a + b, U_HI = c.
- Virtual-deadline factor: x = b / (1 - a) when a HI task exists and
a < 1 (every HI task's LO-mode deadline shortens to x * T); x = 1.0
(no tightening) when no HI task exists; x is None when a >= 1 with
at least one HI task, the LO tasks alone saturating the processor.
- LO-mode condition (the EDF demand density of the virtual-deadline
LO-mode schedule): a + b / x <= 1, which at the canonical factor is
exactly U_LO <= 1.
- HI-mode condition (the demand condition after the LO to HI
criticality mode change, when LO jobs are dropped): c + a * x <= 1.
The a * x term is the virtual-deadline tightening cost: a smaller x
helps the HI-mode condition, a larger x helps the LO-mode condition.
- Verdicts: lo-criticality-mode feasible iff the LO-mode condition
holds (False when x is None); hi-criticality-mode feasible iff the
HI-mode condition holds, vacuously True for an all-LO set (c = 0,
no HI task to guarantee); the whole-set edf-vd feasible verdict is
lo feasible and hi feasible.
- Multiprocessor-form cross-check: a <= (1 - c) / (1 - c + b) holds
iff c + a * x <= 1 holds, an equivalent restatement of the HI-mode
condition.
- Units are one time unit throughout (ms in the worked example below).
Module constant TOL = 1e-12 is the tolerance every comparison uses.
The DO-178C software level scheme A-E frames which tasks need the
higher-assurance estimate as reference-only context; no level is
ever determined here.
Workflow
- Build the task list with each task's criticality, C_LO, C_HI and T;
EDF is priority-free, so any list order is accepted.
- Compute the per-mode demand sums (a, b, c) with utilizations(tasks),
returning u_lo_lo, u_hi_lo, u_hi_hi, u_lo and u_hi.
- Derive the common virtual-deadline factor with
virtual_deadline_factor(tasks): 1.0 with no HI task, None when the
LO tasks alone saturate the processor.
- Get the per-HI-task virtual deadlines x * T with
virtual_deadlines(tasks), keyed by task name ("task" when a task
carries no name key), an empty dict for an all-LO set, None when no
factor exists.
- Check the lo-criticality-mode demand condition a + b / x <= 1 with
lo_mode_feasible(tasks).
- Check the hi-criticality-mode demand condition c + a * x <= 1 with
hi_mode_feasible(tasks), vacuously True for an all-LO set.
- Gather every result in one call with edf_vd_report(tasks): the
demand sums, x, the virtual deadlines, both mode verdicts and the
whole-set feasible verdict.
- Get the convenience whole-set verdict alone with feasible(tasks).
Confirm the deterministic checks, including ValueError rejection of
non-physical inputs, with the contract test
scripts/test_virtual_deadline_scheduling.py.
Worked example
Task set A, three avionics fsw processes in ms, any list order (EDF is
priority-free), implicit deadlines D = T:
- flight-control: criticality HI, C_LO 1.0, C_HI 2.0, T 5.0.
- health-monitor: criticality HI, C_LO 2.0, C_HI 4.0, T 10.0.
- guidance: criticality LO, C_LO 2.0, C_HI 2.0, T 10.0 (dropped after
the criticality mode change, so only its C_LO / T contributes to the
per-mode sums).
edf_vd_report(SET_A) (module output): u_lo_lo 0.2 (guidance only,
2.0/10.0), u_hi_lo 0.4 (1.0/5.0 + 2.0/10.0), u_hi_hi 0.8 (2.0/5.0 +
4.0/10.0), u_lo 0.6000000000000001, u_hi 0.8. The virtual-deadline
factor x is 0.5 exactly (0.4 / (1 - 0.2)); the LO-mode density
a + b/x prints 1, so lo_feasible is True. The HI-mode demand
c + a*x is 0.90000000000000002, at most 1, so hi_feasible is True:
flight-control and health-monitor can overrun to their C_HI estimates
and still meet their real deadlines after the criticality mode
change. virtual_deadlines gives {flight-control: 2.5, health-monitor:
5.0}, i.e. 0.5 * 5.0 and 0.5 * 10.0 ms. The multiprocessor-form
cross-check (1 - c) / (1 - c + b) evaluates to 0.33333333333333326,
above a 0.2, consistent with the HI-mode condition holding. The
whole-set verdict feasible is True.
Task set B (HI-mode overload, the mode-change verdict): guidance LO
C_LO 3.0, T 10.0; flight-control HI C_LO 1.0, C_HI 3.0, T 10.0;
health-monitor HI C_LO 2.0, C_HI 6.0, T 10.0. Module output: u_lo_lo
0.3, u_hi_lo 0.30000000000000004, u_hi_hi 0.8999999999999999, u_lo
0.6000000000000001, x 0.42857142857142866 (the LO-mode density prints
1, so lo_feasible is True). The HI-mode demand c + ax is
1.0285714285714285, strictly above 1, so hi_feasible is False and the
whole verdict is False: the HI-mode demand c = 0.9 alone is at most 1,
yet the ax tightening term 0.1285714285714286 shows the LO tasks
leave too little early slack for the mode change. Virtual deadlines
print 4.2857142857142865 ms for both HI tasks (x * 10.0).
Task set C (LO-mode overload, the no-factor verdict): guidance LO
C_LO 8.0, T 10.0; trim LO C_LO 1.0, T 5.0; flight-control HI C_LO 1.0,
C_HI 2.0, T 10.0. Module output: u_lo_lo 1.0 (the LO tasks alone
saturate the processor), u_hi_lo 0.1, u_hi_hi 0.2, u_lo 1.1. The
factor x reports None, lo_feasible False, hi_feasible False, feasible
False, virtual_deadlines None: no common virtual-deadline factor
exists and edf-vd rejects the set.
Identity anchors (module output): the all-LO set [(1, 3), (1, 4),
(2, 8)] gives u_lo 0.8333333333333333, x 1.0, feasible True with an
empty virtual_deadlines dict; the all-LO overload [(2, 3), (2, 5),
(2, 7)] gives u_lo 1.3523809523809525, feasible False (hi_feasible
stays vacuously True); the HI-only set [(1.0, 2.0, 5.0), (2.0, 4.0,
10.0)] gives u_hi 0.8, x 0.4, feasible True; the no-overrun collapse
of set A (every C_HI equal to C_LO) gives u_lo 0.6000000000000001,
x 0.5, HI demand c + a*x 0.5 (equal to x since c = b at the collapse),
feasible True.
Verification
- Confirm edf_vd_report(SET_A) gives u_lo_lo 0.2, u_hi_lo 0.4, u_hi_hi
0.8, u_lo 0.6, u_hi 0.8, x 0.5, lo_feasible True, hi_feasible True,
feasible True, virtual_deadlines {flight-control: 2.5,
health-monitor: 5.0}, LO-mode density 1.0 and HI-mode demand 0.9.
- Confirm set B (u_lo_lo 0.3, u_hi_lo 0.3, u_hi_hi 0.9, x
0.42857142857142866) gives lo_feasible True, hi_feasible False,
feasible False, HI-mode demand 1.0285714285714285.
- Confirm set C (u_lo_lo 1.0) gives x None, lo_feasible False,
hi_feasible False, feasible False, virtual_deadlines None.
- Confirm the all-LO identity against the pack sibling's classic
results: [(1, 3), (1, 4), (2, 8)] gives u_lo 0.8333333333333333,
x 1.0, feasible True; [(2, 3), (2, 5), (2, 7)] gives u_lo
1.3523809523809525, feasible False.
- Confirm the multiprocessor-form equivalence on set A:
(1 - c) / (1 - c + b) = 0.33333333333333326, above a 0.2, and holds
iff hi_mode_feasible holds on every HI-bearing validation set.
- Confirm every non-physical input (empty list, missing key, boolean
or non-positive C_LO/C_HI/T, C_HI below C_LO, a LO task with C_HI
above C_LO, an unknown criticality word) raises ValueError from
every public function.
- Run the contract test offline: python3
scripts/test_virtual_deadline_scheduling.py (deterministic).
Related leaves
- avionics/fsw/mixed-criticality-scheduling: the fixed-priority
AMC-rtb branch of the same dual-criticality (C_LO, C_HI) model, over
a deadline-monotonic priority order with a per-task fixed-point
response-time solve; this leaf runs the priority-free EDF branch
with a closed-form demand test instead, on the same C_LO/C_HI pair.
- avionics/fsw/real-time-scheduling: the single-execution-time
implicit-deadline (C, T) model whose classic EDF full-utilization
verdict this leaf reproduces exactly on an all-LO set (a <= 1); a
task with no HI estimate belongs there, not here.
- avionics/do178c/planning: software level and DAL determination, the
context that motivates the C_LO/C_HI split; this leaf never
determines a level.
Pitfalls
- Treating the LO-mode density as a real test: at the canonical factor
a + b/x always prints 1 when a HI task exists, by construction; the
substantive LO-mode requirement is that a factor exists at all
(x is not None), not that the density differs from 1.
- Skipping the HI-mode check after a passing LO-mode verdict: set B
passes the LO-mode condition (density 1) yet fails the HI-mode
condition (c + a*x = 1.0285714285714285, above 1); both conditions
must hold for the whole-set verdict.
- Assuming an all-LO set can fail hi_mode_feasible: an all-LO set has
no HI task to guarantee, so hi_feasible is vacuously True even when
a > 1 (the all-LO overload identity); the whole-set verdict still
fails there because lo_feasible is False.
- Imposing a priority order on the task list: EDF is priority-free, so
no deadline-monotonic or other ordering check exists here, unlike
the fixed-priority AMC-rtb sibling.
- Mistaking this leaf for the AMC-rtb fixed-point response-time
analysis: this leaf never iterates a per-task response time or
charges an interference sum; it is the closed-form per-mode demand
test of Baruah et al. 2012 (avionics/fsw/mixed-criticality-
scheduling owns the response-time branch).
- Applying this leaf to a single-estimate (C, T) task set: a task with
no HI estimate belongs to avionics/fsw/real-time-scheduling; this
leaf's model requires the C_LO/C_HI pair and criticality tag on
every task.
Behavior contract (gate 3)
Run the deterministic contract test (stdlib unittest, offline, no
network, exits 0):
python3 scripts/test_virtual_deadline_scheduling.py
The test covers the worked sets A, B and C from the spec, the all-LO
and HI-only reductions against the pack siblings' classic results, the
no-overrun collapse identity, the multiprocessor-form equivalence, the
factor discipline (0 < x <= 1 iff U_LO <= 1, x is None iff a >= 1 with
a HI task present), the HI-mode vacuous-True scope on an all-LO set,
determinism across runs, and ValueError rejection of every
non-physical input enumerated above.
Compliance
- Standards referenced, not reproduced: DO-178C (RTCA, joint EUROCAE
ED-12C) frames the avionics software lifecycle context in which the
scheduling analysis artifact is recorded, per standards-map.yaml.
The edf-vd closed-form demand test is public science (Baruah,
Bonifaci, D'Angelo, Li, Marchetti-Spaccamela, Megow and Stougie,
IEEE Transactions on Computers 61(8):1140-1152, 2012), summary-only;
no standard text is reproduced and no software level or DAL is ever
determined by this leaf.
- compliance: STANDARDS-REF, gated: false.
1---2name: virtual-deadline-scheduling3description: Use when you must decide the offline schedulability of an avionics flight software task set under the dual-criticality execution-time model scheduled by edf-vd virtual-deadline scheduling: each task carries the C_LO and C_HI execution-time estimates with C_HI at least C_LO and the implicit-deadline period T, sum the per-mode demand contributions of the LO and HI tasks, derive the common virtual-deadline factor x for the HI tasks, and check the lo-criticality-mode and the hi-criticality-mode demand conditions after the criticality mode change. Produces the per-mode demand sums, the virtual-deadline factor x, the per-HI-task virtual deadlines x*T, the lo-criticality-mode feasible verdict, the hi-criticality-mode feasible verdict, and the whole-set edf-vd feasible verdict. Trigger: edf vd scheduling, virtual deadline scheduling, virtual deadline factor, dual criticality mode change, lo criticality mode demand, hi criticality mode demand.4license: Apache-2.05---67# Virtual-Deadline Scheduling (avionics/fsw/virtual-deadline-scheduling)89Use when the task is deciding the offline schedulability of an10avionics flight software task set under the dual-criticality11execution-time model scheduled by EDF-VD, the virtual-deadline12scheduling algorithm of Baruah, Bonifaci, D'Angelo, Li,13Marchetti-Spaccamela, Megow and Stougie (2012). Each task carries a14low-criticality execution-time estimate C_LO and a high-criticality15estimate C_HI, and EDF is priority-free: there is no task list order16and no deadline key, only the implicit period T. This leaf implements17the closed-form per-mode demand test, pure Python, stdlib only. It18pairs with avionics/fsw/mixed-criticality-scheduling, the19fixed-priority AMC-rtb branch of the same dual-criticality model, and20with avionics/fsw/real-time-scheduling, whose classic implicit-deadline21EDF verdict this leaf reproduces exactly on an all-LO set.2223## Domain quick reference2425- Task model: {name, criticality, C_LO, C_HI, T}, criticality "LO" or26 "HI", C_HI at least C_LO, one time unit, implicit deadline D = T. A27 LO task carries no high estimate, so its C_HI equals its C_LO. There28 is no priority order: any task list order is accepted.29- Per-mode demand sums: a = u_lo_lo = sum over LO tasks of C_LO / T,30 b = u_hi_lo = sum over HI tasks of C_LO / T, c = u_hi_hi = sum over31 HI tasks of C_HI / T. U_LO = a + b, U_HI = c.32- Virtual-deadline factor: x = b / (1 - a) when a HI task exists and33 a < 1 (every HI task's LO-mode deadline shortens to x * T); x = 1.034 (no tightening) when no HI task exists; x is None when a >= 1 with35 at least one HI task, the LO tasks alone saturating the processor.36- LO-mode condition (the EDF demand density of the virtual-deadline37 LO-mode schedule): a + b / x <= 1, which at the canonical factor is38 exactly U_LO <= 1.39- HI-mode condition (the demand condition after the LO to HI40 criticality mode change, when LO jobs are dropped): c + a * x <= 1.41 The a * x term is the virtual-deadline tightening cost: a smaller x42 helps the HI-mode condition, a larger x helps the LO-mode condition.43- Verdicts: lo-criticality-mode feasible iff the LO-mode condition44 holds (False when x is None); hi-criticality-mode feasible iff the45 HI-mode condition holds, vacuously True for an all-LO set (c = 0,46 no HI task to guarantee); the whole-set edf-vd feasible verdict is47 lo feasible and hi feasible.48- Multiprocessor-form cross-check: a <= (1 - c) / (1 - c + b) holds49 iff c + a * x <= 1 holds, an equivalent restatement of the HI-mode50 condition.51- Units are one time unit throughout (ms in the worked example below).52 Module constant TOL = 1e-12 is the tolerance every comparison uses.53 The DO-178C software level scheme A-E frames which tasks need the54 higher-assurance estimate as reference-only context; no level is55 ever determined here.5657## Workflow58591. Build the task list with each task's criticality, C_LO, C_HI and T;60 EDF is priority-free, so any list order is accepted.612. Compute the per-mode demand sums (a, b, c) with utilizations(tasks),62 returning u_lo_lo, u_hi_lo, u_hi_hi, u_lo and u_hi.633. Derive the common virtual-deadline factor with64 virtual_deadline_factor(tasks): 1.0 with no HI task, None when the65 LO tasks alone saturate the processor.664. Get the per-HI-task virtual deadlines x * T with67 virtual_deadlines(tasks), keyed by task name ("task" when a task68 carries no name key), an empty dict for an all-LO set, None when no69 factor exists.705. Check the lo-criticality-mode demand condition a + b / x <= 1 with71 lo_mode_feasible(tasks).726. Check the hi-criticality-mode demand condition c + a * x <= 1 with73 hi_mode_feasible(tasks), vacuously True for an all-LO set.747. Gather every result in one call with edf_vd_report(tasks): the75 demand sums, x, the virtual deadlines, both mode verdicts and the76 whole-set feasible verdict.778. Get the convenience whole-set verdict alone with feasible(tasks).78 Confirm the deterministic checks, including ValueError rejection of79 non-physical inputs, with the contract test80 scripts/test_virtual_deadline_scheduling.py.8182## Worked example8384Task set A, three avionics fsw processes in ms, any list order (EDF is85priority-free), implicit deadlines D = T:8687- flight-control: criticality HI, C_LO 1.0, C_HI 2.0, T 5.0.88- health-monitor: criticality HI, C_LO 2.0, C_HI 4.0, T 10.0.89- guidance: criticality LO, C_LO 2.0, C_HI 2.0, T 10.0 (dropped after90 the criticality mode change, so only its C_LO / T contributes to the91 per-mode sums).9293edf_vd_report(SET_A) (module output): u_lo_lo 0.2 (guidance only,942.0/10.0), u_hi_lo 0.4 (1.0/5.0 + 2.0/10.0), u_hi_hi 0.8 (2.0/5.0 +954.0/10.0), u_lo 0.6000000000000001, u_hi 0.8. The virtual-deadline96factor x is 0.5 exactly (0.4 / (1 - 0.2)); the LO-mode density97a + b/x prints 1, so lo_feasible is True. The HI-mode demand98c + a*x is 0.90000000000000002, at most 1, so hi_feasible is True:99flight-control and health-monitor can overrun to their C_HI estimates100and still meet their real deadlines after the criticality mode101change. virtual_deadlines gives {flight-control: 2.5, health-monitor:1025.0}, i.e. 0.5 * 5.0 and 0.5 * 10.0 ms. The multiprocessor-form103cross-check (1 - c) / (1 - c + b) evaluates to 0.33333333333333326,104above a 0.2, consistent with the HI-mode condition holding. The105whole-set verdict feasible is True.106107Task set B (HI-mode overload, the mode-change verdict): guidance LO108C_LO 3.0, T 10.0; flight-control HI C_LO 1.0, C_HI 3.0, T 10.0;109health-monitor HI C_LO 2.0, C_HI 6.0, T 10.0. Module output: u_lo_lo1100.3, u_hi_lo 0.30000000000000004, u_hi_hi 0.8999999999999999, u_lo1110.6000000000000001, x 0.42857142857142866 (the LO-mode density prints1121, so lo_feasible is True). The HI-mode demand c + a*x is1131.0285714285714285, strictly above 1, so hi_feasible is False and the114whole verdict is False: the HI-mode demand c = 0.9 alone is at most 1,115yet the a*x tightening term 0.1285714285714286 shows the LO tasks116leave too little early slack for the mode change. Virtual deadlines117print 4.2857142857142865 ms for both HI tasks (x * 10.0).118119Task set C (LO-mode overload, the no-factor verdict): guidance LO120C_LO 8.0, T 10.0; trim LO C_LO 1.0, T 5.0; flight-control HI C_LO 1.0,121C_HI 2.0, T 10.0. Module output: u_lo_lo 1.0 (the LO tasks alone122saturate the processor), u_hi_lo 0.1, u_hi_hi 0.2, u_lo 1.1. The123factor x reports None, lo_feasible False, hi_feasible False, feasible124False, virtual_deadlines None: no common virtual-deadline factor125exists and edf-vd rejects the set.126127Identity anchors (module output): the all-LO set [(1, 3), (1, 4),128(2, 8)] gives u_lo 0.8333333333333333, x 1.0, feasible True with an129empty virtual_deadlines dict; the all-LO overload [(2, 3), (2, 5),130(2, 7)] gives u_lo 1.3523809523809525, feasible False (hi_feasible131stays vacuously True); the HI-only set [(1.0, 2.0, 5.0), (2.0, 4.0,13210.0)] gives u_hi 0.8, x 0.4, feasible True; the no-overrun collapse133of set A (every C_HI equal to C_LO) gives u_lo 0.6000000000000001,134x 0.5, HI demand c + a*x 0.5 (equal to x since c = b at the collapse),135feasible True.136137## Verification138139- Confirm edf_vd_report(SET_A) gives u_lo_lo 0.2, u_hi_lo 0.4, u_hi_hi140 0.8, u_lo 0.6, u_hi 0.8, x 0.5, lo_feasible True, hi_feasible True,141 feasible True, virtual_deadlines {flight-control: 2.5,142 health-monitor: 5.0}, LO-mode density 1.0 and HI-mode demand 0.9.143- Confirm set B (u_lo_lo 0.3, u_hi_lo 0.3, u_hi_hi 0.9, x144 0.42857142857142866) gives lo_feasible True, hi_feasible False,145 feasible False, HI-mode demand 1.0285714285714285.146- Confirm set C (u_lo_lo 1.0) gives x None, lo_feasible False,147 hi_feasible False, feasible False, virtual_deadlines None.148- Confirm the all-LO identity against the pack sibling's classic149 results: [(1, 3), (1, 4), (2, 8)] gives u_lo 0.8333333333333333,150 x 1.0, feasible True; [(2, 3), (2, 5), (2, 7)] gives u_lo151 1.3523809523809525, feasible False.152- Confirm the multiprocessor-form equivalence on set A:153 (1 - c) / (1 - c + b) = 0.33333333333333326, above a 0.2, and holds154 iff hi_mode_feasible holds on every HI-bearing validation set.155- Confirm every non-physical input (empty list, missing key, boolean156 or non-positive C_LO/C_HI/T, C_HI below C_LO, a LO task with C_HI157 above C_LO, an unknown criticality word) raises ValueError from158 every public function.159- Run the contract test offline: python3160 scripts/test_virtual_deadline_scheduling.py (deterministic).161162## Related leaves163164- avionics/fsw/mixed-criticality-scheduling: the fixed-priority165 AMC-rtb branch of the same dual-criticality (C_LO, C_HI) model, over166 a deadline-monotonic priority order with a per-task fixed-point167 response-time solve; this leaf runs the priority-free EDF branch168 with a closed-form demand test instead, on the same C_LO/C_HI pair.169- avionics/fsw/real-time-scheduling: the single-execution-time170 implicit-deadline (C, T) model whose classic EDF full-utilization171 verdict this leaf reproduces exactly on an all-LO set (a <= 1); a172 task with no HI estimate belongs there, not here.173- avionics/do178c/planning: software level and DAL determination, the174 context that motivates the C_LO/C_HI split; this leaf never175 determines a level.176177## Pitfalls178179- Treating the LO-mode density as a real test: at the canonical factor180 a + b/x always prints 1 when a HI task exists, by construction; the181 substantive LO-mode requirement is that a factor exists at all182 (x is not None), not that the density differs from 1.183- Skipping the HI-mode check after a passing LO-mode verdict: set B184 passes the LO-mode condition (density 1) yet fails the HI-mode185 condition (c + a*x = 1.0285714285714285, above 1); both conditions186 must hold for the whole-set verdict.187- Assuming an all-LO set can fail hi_mode_feasible: an all-LO set has188 no HI task to guarantee, so hi_feasible is vacuously True even when189 a > 1 (the all-LO overload identity); the whole-set verdict still190 fails there because lo_feasible is False.191- Imposing a priority order on the task list: EDF is priority-free, so192 no deadline-monotonic or other ordering check exists here, unlike193 the fixed-priority AMC-rtb sibling.194- Mistaking this leaf for the AMC-rtb fixed-point response-time195 analysis: this leaf never iterates a per-task response time or196 charges an interference sum; it is the closed-form per-mode demand197 test of Baruah et al. 2012 (avionics/fsw/mixed-criticality-198 scheduling owns the response-time branch).199- Applying this leaf to a single-estimate (C, T) task set: a task with200 no HI estimate belongs to avionics/fsw/real-time-scheduling; this201 leaf's model requires the C_LO/C_HI pair and criticality tag on202 every task.203204## Behavior contract (gate 3)205206Run the deterministic contract test (stdlib unittest, offline, no207network, exits 0):208209 python3 scripts/test_virtual_deadline_scheduling.py210211The test covers the worked sets A, B and C from the spec, the all-LO212and HI-only reductions against the pack siblings' classic results, the213no-overrun collapse identity, the multiprocessor-form equivalence, the214factor discipline (0 < x <= 1 iff U_LO <= 1, x is None iff a >= 1 with215a HI task present), the HI-mode vacuous-True scope on an all-LO set,216determinism across runs, and ValueError rejection of every217non-physical input enumerated above.218219## Compliance220221- Standards referenced, not reproduced: DO-178C (RTCA, joint EUROCAE222 ED-12C) frames the avionics software lifecycle context in which the223 scheduling analysis artifact is recorded, per standards-map.yaml.224 The edf-vd closed-form demand test is public science (Baruah,225 Bonifaci, D'Angelo, Li, Marchetti-Spaccamela, Megow and Stougie,226 IEEE Transactions on Computers 61(8):1140-1152, 2012), summary-only;227 no standard text is reproduced and no software level or DAL is ever228 determined by this leaf.229- compliance: STANDARDS-REF, gated: false.