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):
defineSystemwith defaultphaseOnUpdate 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)passesworldanddtto 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/afteredges 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