Skip to content

W-028: ecs-schedule systems and ordering (SCH-F02)

Type: feature · Size: M · Epic: E-schedule-v0 · Target: packages/ecs-schedule · Breaking: no Depends: W-011, W-027 Refs: spec SCH-010, SCH-011, SCH-012, SCH-013, SCH-014, SCH-015, SCH-016, SCH-017, SCH-018, SCH-019, SCH-020, SCH-021, SCH-022, SCH-023, SCH-106

Goal

Implement defineSystem and the before/after ordering inside the phase order from W-027. Add a minimal schedule.run(world, dt) that calls systems in phase order, so ordering can be tested. Full run semantics (runPhase, runPhases, dt validation) are in W-029. Build-time validation is complete here; the plan is computed once and never re-sorted.

Steps

  • S1 (SCH-010): defineSystem with default phase OnUpdate and a name check; files: packages/ecs-schedule/src/system.ts, packages/ecs-schedule/tests/system-define.test.ts
  • S2 (SCH-011, SCH-012): minimal run(world, dt) passes world and dt to each system; systems in the same phase without edges run in declaration order; files: packages/ecs-schedule/src/run.ts, packages/ecs-schedule/tests/system-order.test.ts
  • S3 (SCH-013, SCH-014, SCH-015, SCH-016): same-phase before/after edges with a stable topological sort; cross-phase edges that agree are accepted; contradicting edges throw at build; files: packages/ecs-schedule/src/system-order.ts, packages/ecs-schedule/tests/system-edges.test.ts
  • S4 (SCH-017, SCH-018, SCH-019, SCH-020, SCH-023): cycle errors naming the systems (including self-reference); unknown edge targets; unknown phase; duplicate objects; duplicate names; files: packages/ecs-schedule/src/system-validate.ts, packages/ecs-schedule/tests/system-validate.test.ts
  • S5 (SCH-021, SCH-022, SCH-106): validation only at build; order depends only on the arrays passed to createSchedule; mutating those arrays after build does not change what runs; files: packages/ecs-schedule/tests/system-plan.test.ts
  • S6 (changeset): add .changeset/w-028-ecs-schedule-systems.md (patch, @workspace/ecs-schedule)

Log

  • 2026-11-01 created from the approved spec split of W-004 (Triage)
  • 2026-11-02 moved to Now, state active (Triage)
  • 2026-11-02 S1 done
  • 2026-11-02 S2 done
  • 2026-11-02 S3 done
  • 2026-11-02 S4 done (one invalid mixed-cycle test corrected by TestWriter)
  • 2026-11-02 S5 done
  • 2026-11-02 S6 done
  • 2026-11-02 review approved
  • 2026-11-02 done