180 lines
7.4 KiB
Plaintext
180 lines
7.4 KiB
Plaintext
=== deporder EVIDENCE ===
|
|
Wed Oct 21 10:30:31 UTC 2026
|
|
Python 3.14.7
|
|
|
|
=== 1. full suite: python3 test_deporder.py ===
|
|
test_bad_spec_exit_4 (__main__.CliTests.test_bad_spec_exit_4) ... ok
|
|
test_bad_subcommand_exit_4 (__main__.CliTests.test_bad_subcommand_exit_4) ... ok
|
|
test_cycle_exit_2 (__main__.CliTests.test_cycle_exit_2) ... ok
|
|
test_missing_file_exit_4 (__main__.CliTests.test_missing_file_exit_4) ... ok
|
|
test_ok_exit_0 (__main__.CliTests.test_ok_exit_0) ... ok
|
|
test_unknown_dep_exit_3 (__main__.CliTests.test_unknown_dep_exit_3) ... ok
|
|
test_workers_flag_overrides_spec (__main__.CliTests.test_workers_flag_overrides_spec) ... ok
|
|
test_known_length (__main__.CriticalPathTests.test_known_length) ... ok
|
|
test_matches_reference (__main__.CriticalPathTests.test_matches_reference) ... ok
|
|
test_path_is_precedence_chained (__main__.CriticalPathTests.test_path_is_precedence_chained) ... ok
|
|
test_single_node (__main__.CriticalPathTests.test_single_node) ... ok
|
|
test_tie_break_is_lexicographic (__main__.CriticalPathTests.test_tie_break_is_lexicographic) ... ok
|
|
test_acyclic_has_no_cycle (__main__.GraphTests.test_acyclic_has_no_cycle) ... ok
|
|
test_cycle_error_message (__main__.GraphTests.test_cycle_error_message) ... ok
|
|
test_cycle_in_one_component_only (__main__.GraphTests.test_cycle_in_one_component_only) ... ok
|
|
test_self_loop (__main__.GraphTests.test_self_loop) ... ok
|
|
test_three_cycle_path_is_a_real_cycle (__main__.GraphTests.test_three_cycle_path_is_a_real_cycle) ... ok
|
|
test_two_cycle (__main__.GraphTests.test_two_cycle) ... ok
|
|
test_unknown_dep_reports_sorted_pairs (__main__.GraphTests.test_unknown_dep_reports_sorted_pairs) ... ok
|
|
test_chain (__main__.OrderTests.test_chain) ... ok
|
|
test_diamond_is_lexicographic (__main__.OrderTests.test_diamond_is_lexicographic) ... ok
|
|
test_disconnected_components_interleave (__main__.OrderTests.test_disconnected_components_interleave) ... ok
|
|
test_order_prefix_property_on_random_dags (__main__.OrderTests.test_order_prefix_property_on_random_dags) ... ok
|
|
test_20k_node_graph_under_budget (__main__.PerfTests.test_20k_node_graph_under_budget) ...
|
|
[perf] 20k nodes / 39987 edges: 0.92s (critical path 20000)
|
|
ok
|
|
test_key_insertion_order_does_not_change_output (__main__.PlanTests.test_key_insertion_order_does_not_change_output) ... ok
|
|
test_plan_fields (__main__.PlanTests.test_plan_fields) ... ok
|
|
test_plan_is_repeatable (__main__.PlanTests.test_plan_is_repeatable) ... ok
|
|
test_empty (__main__.ScheduleTests.test_empty) ... ok
|
|
test_schedule_invariants_on_random_dags (__main__.ScheduleTests.test_schedule_invariants_on_random_dags) ... ok
|
|
test_single_worker_equals_serial (__main__.ScheduleTests.test_single_worker_equals_serial) ... ok
|
|
test_two_workers_never_exceed_capacity (__main__.ScheduleTests.test_two_workers_never_exceed_capacity) ... ok
|
|
test_unbounded_workers_equals_critical_path (__main__.ScheduleTests.test_unbounded_workers_equals_critical_path) ... ok
|
|
test_defaults (__main__.SpecTests.test_defaults) ... ok
|
|
test_duplicate_deps_collapse (__main__.SpecTests.test_duplicate_deps_collapse) ... ok
|
|
test_est_coerced_to_float (__main__.SpecTests.test_est_coerced_to_float) ... ok
|
|
test_rejects_malformed (__main__.SpecTests.test_rejects_malformed) ... ok
|
|
test_workers_override (__main__.SpecTests.test_workers_override) ... ok
|
|
test_chain (__main__.WaveTests.test_chain) ... ok
|
|
test_diamond (__main__.WaveTests.test_diamond) ... ok
|
|
test_parallel_roots_and_skew (__main__.WaveTests.test_parallel_roots_and_skew) ... ok
|
|
test_single_node (__main__.WaveTests.test_single_node) ... ok
|
|
test_waves_match_reference_and_cover_every_task (__main__.WaveTests.test_waves_match_reference_and_cover_every_task) ... ok
|
|
|
|
----------------------------------------------------------------------
|
|
Ran 42 tests in 1.902s
|
|
|
|
OK
|
|
SUITE_EXIT=0
|
|
|
|
=== 2. CLI on examples/pipeline.json ===
|
|
{
|
|
"critical_path": {
|
|
"length": 14.0,
|
|
"tasks": [
|
|
"fetch_sources",
|
|
"compile_core",
|
|
"unit_tests",
|
|
"package"
|
|
]
|
|
},
|
|
"makespan": 14.0,
|
|
"order": [
|
|
"fetch_sources",
|
|
"compile_core",
|
|
"compile_plugins",
|
|
"lint",
|
|
"unit_tests",
|
|
"package"
|
|
],
|
|
"schedule": [
|
|
{
|
|
"end": 2.0,
|
|
"start": 0.0,
|
|
"task": "fetch_sources",
|
|
"worker": 0
|
|
},
|
|
{
|
|
"end": 8.0,
|
|
"start": 2.0,
|
|
"task": "compile_core",
|
|
"worker": 1
|
|
},
|
|
{
|
|
"end": 5.0,
|
|
"start": 2.0,
|
|
"task": "compile_plugins",
|
|
"worker": 2
|
|
},
|
|
{
|
|
"end": 9.0,
|
|
"start": 8.0,
|
|
"task": "lint",
|
|
"worker": 0
|
|
},
|
|
{
|
|
"end": 12.0,
|
|
"start": 8.0,
|
|
"task": "unit_tests",
|
|
"worker": 2
|
|
},
|
|
{
|
|
"end": 14.0,
|
|
"start": 12.0,
|
|
"task": "package",
|
|
"worker": 1
|
|
}
|
|
],
|
|
"serial_time": 18.0,
|
|
"tasks": [
|
|
"compile_core",
|
|
"compile_plugins",
|
|
"fetch_sources",
|
|
"lint",
|
|
"package",
|
|
"unit_tests"
|
|
],
|
|
"waves": [
|
|
[
|
|
"fetch_sources"
|
|
],
|
|
[
|
|
"compile_core",
|
|
"compile_plugins"
|
|
],
|
|
[
|
|
"lint",
|
|
"unit_tests"
|
|
],
|
|
[
|
|
"package"
|
|
]
|
|
],
|
|
"workers": 3
|
|
}
|
|
CLI_EXIT=0
|
|
|
|
=== 3. CLI on examples/cycle.json ===
|
|
dependency cycle: draft -> review -> publish -> draft
|
|
CYCLE_EXIT=2
|
|
|
|
=== 4. CLI on examples/ghost.json ===
|
|
unknown dependencies: app -> missing_module
|
|
GHOST_EXIT=3
|
|
|
|
=== 5. mutation harness: python3 mutate_teeth.py ===
|
|
deporder mutation harness: 11 mutations
|
|
----------------------------------------------------------------------------------------------------
|
|
waves: drop the +1 level bump CAUGHT exit 1 | FAILED (failures=5)
|
|
why: every task collapses into wave 0
|
|
order: pop the heap tail instead of the min CAUGHT exit 1 | FAILED (failures=5)
|
|
why: lexicographic tie-break lost in Kahn
|
|
cycles: disable the residual-node check CAUGHT exit 1 | FAILED (failures=5)
|
|
why: cycle silently yields a partial order
|
|
cycle path: report a single node CAUGHT exit 1 | FAILED (failures=3)
|
|
why: reported 'cycle' is not a cycle
|
|
unknown deps: stop validating CAUGHT exit 1 | FAILED (failures=1, errors=1)
|
|
why: ghost dependency accepted
|
|
spec: allow est == 0 CAUGHT exit 1 | FAILED (failures=1)
|
|
why: zero-duration task accepted
|
|
critical path: break the predecessor tie-break CAUGHT exit 1 | FAILED (failures=1)
|
|
why: path no longer lexicographically canonical
|
|
schedule: release completions strictly before now CAUGHT exit 1 | FAILED (failures=1, errors=8)
|
|
why: worker never freed / clock stalls
|
|
schedule: double every task duration CAUGHT exit 1 | FAILED (failures=4)
|
|
why: makespan and critical-path bound violated
|
|
schedule: pin the clock to itself (kill the stall guard) CAUGHT exit 1 | FAILED (failures=1, errors=8)
|
|
why: guard fires: stalled scheduler must not spin
|
|
graph: drop the redundant set() in build_graph SURVIVED suite PASSED on mutant (not caught)
|
|
why: parse_spec already deduplicates; guard is redundant
|
|
----------------------------------------------------------------------------------------------------
|
|
caught 10/11 mutants that must die; 0 problem(s)
|
|
MUT_EXIT=0
|