=== 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
