- await: add the one-awaiter-per-future guard `sched.Task.wait` has — a second concurrent `await` on the same pending future would overwrite the single `park` handle and orphan the first awaiter (silent deadlock). Now aborts loudly. (Fan-in over SEPARATE futures — `race` — registers one awaiter each, so it stays fine.) - Document the Future/ThunkBox ALLOCATOR-LIFETIME contract: both are allocated from the `context.allocator` in force at `async`, which must outlive the future (the long-lived-container rule). Calling `async` inside a transient arena torn down before `run()` is a use-after-free; the common case (program GPA) is safe. A deeper own-allocator capture is deferred to convergence. - Document that `cancel` does NOT stop an already-spawned worker (model (a) — the worker still runs; the sticky `canceled` atomic is the source of truth). True work-cancellation is Phase 3. - Drop the dead `f.task = null` (immediately overwritten by spawn_raw). The new `io_abort` extern shifts the prelude type table — 40 `.ir` snapshots regenerated (behavior-preserving; no `.exit`/`.stdout`/`.stderr` changed). Suite 829/0.
820 KiB
820 KiB