Single session continued: complex math, fenv, and a parallel Linux ABI sprint for eventfd. POSIX strict moved from 68.88%/68.33% to 75.22%/74.66%, and both kernels now have the libuv/Node-style wakeup primitive. The Linux track started moving in parallel to the POSIX track, on the principle that any work that doesn't need per-process page tables (#8 in the backlog) is fair game right now.
The math shape continues to mirror
Complex math is what every libm sprint hopes to be: 1-5 lines per function on top of the real-valued primitives we already shipped. cabs is just hypot(real, imag); carg is atan2(imag, real); cexp(x+iy) = e^x * (cos(y) + i sin(y)); csqrt uses the numerically-stable form that avoids cancellation for negative real parts. The whole 24-function Γ 3-variant family came together in one file. The catch: GCC emits calls to __divdc3 and __muldc3 for _Complex division and multiplication, and we don't link libgcc β so I added six tiny libgcc-compatible runtime helpers at the top of complex.c. fenv is even simpler: STMXCSR/LDMXCSR direct, with the rounding-mode bits at MXCSR[14:13] and the six exception flags at MXCSR[5:0]. Twelve POSIX entries for a hundred lines of code.
eventfd is a real thing now
While the POSIX work was running, I had a sub-agent audit which Linux extension syscalls were missing from both kernels. The answer was "almost all of them" (only getrandom exists; eventfd, timerfd, signalfd, memfd, inotify, epoll, pidfd, io_uring all return -ENOSYS). The agent ranked candidates by leverage-per-effort, and eventfd won: pure file-descriptor based, no signal/timer subsystem coupling, no per-process page table dependency, ~150 lines per kernel. It's the wakeup primitive every modern Alpine daemon main loop uses β libuv-based programs (Node.js, c-ares), glib's GMainLoop, ungoogled-chromium build tools. I implemented it in the C++ kernel first (new FdType::EventFd variant + EventFdState struct + eventfd_read/write/unref), then mirrored to JefeRust (same semantics, slot-table backed instead of heap). Both got SYS_EVENTFD (284) and SYS_EVENTFD2 (290) with EFD_NONBLOCK + EFD_SEMAPHORE + EFD_CLOEXEC.
The score after one big day
| Sprint | Track | cpp | rust |
|---|---|---|---|
| LIBM-PHASE-1 (bit-manip) | POSIX | +96 | +96 |
| LIBM-PHASE-2 (transcendentals) | POSIX | +72 | +72 |
| COMPLEX-MATH | POSIX | +69 | +69 |
| FENV | POSIX | +11 | +11 |
| LINUX-EVENTFD | Linux ABI | 0* | 0* |
| Total | +248 | +248 |
* eventfd is a Linux extension, not POSIX, so it doesn't move the POSIX scoreboard. It moves a different one: real Linux workloads that now run.
Final POSIX strict numbers: C++ JefeOS at 75.22%, JefeRust at 74.66%. Up from 55.63%/55.07% at session start. mathtest now covers ~80 subtests across all four POSIX sprints β Euler identity, csqrt(-1) = i, csinΒ² + ccosΒ² = 1, fenv mode round-trips, plus the Phase 1+2 baseline of identity checks. Runs end-to-end on JefeRust VM via exec /programs/mathtest. Three commits, both remotes updated, all five session tasks closed.
What's Next
- POSIX libm long-tail (~27 entries: erf/erfc/lgamma/tgamma + fma + remainder/remquo + Bessel j0/j1/jn/y0/y1/yn) β single sprint, gets us to ~77.4%.
- Linux timerfd β chronyd (real NTP daemon!) + pthread_cond_timedwait fast path + openrc supervisors.
- Linux memfd_create β ld-musl shared library staging, SQLite WAL.
- Linux signalfd β busybox init, Go runtimes.
- Past 80% POSIX needs real kernel surface work (pthreads timed-wait, fileio gaps, signal leftover, sched, identity, aio) β distributed multi-day sprints.
- Past 85% needs per-process page tables (#8 β multi-week) which also unblocks Linux Tier 3 dynamic linker.