Split out of #408 (closed — the cooperative task layer shipped in v0.28.0). The one acceptance item from #408 not yet done: the differential proof that migrates liferaft off its hand-rolled src/scheduler.eigs onto the upstream task_spawn/task_yield/task_send/task_recv + task_sched_seed layer and confirms its byte-for-byte replay-under-chaos results still hold.
Why it's worth doing (not blocking)
liferaft's own src/scheduler.eigs works today, so this is validation, not a fix. But it's the strongest evidence the upstream layer is a faithful superset of a real hand-rolled deterministic scheduler — and it deletes a duplicated primitive from a consumer (the forcing-function payoff). If the migration surfaces a gap (a scheduling decision liferaft needs that task_sched_seed can't express), that gap is the real deliverable.
Acceptance
- liferaft drops
src/scheduler.eigs in favor of the upstream task builtins.
- Its existing seeded chaos-replay suite stays byte-for-byte green (same-seed two-run diff).
- Any expressiveness gap found is filed upstream rather than worked around.
Split out of #408 (closed — the cooperative task layer shipped in v0.28.0). The one acceptance item from #408 not yet done: the differential proof that migrates liferaft off its hand-rolled
src/scheduler.eigsonto the upstreamtask_spawn/task_yield/task_send/task_recv+task_sched_seedlayer and confirms its byte-for-byte replay-under-chaos results still hold.Why it's worth doing (not blocking)
liferaft's own
src/scheduler.eigsworks today, so this is validation, not a fix. But it's the strongest evidence the upstream layer is a faithful superset of a real hand-rolled deterministic scheduler — and it deletes a duplicated primitive from a consumer (the forcing-function payoff). If the migration surfaces a gap (a scheduling decision liferaft needs thattask_sched_seedcan't express), that gap is the real deliverable.Acceptance
src/scheduler.eigsin favor of the upstream task builtins.