Native directory callback checkpoint (2026-10-11): source 0d83b6dc6 and verified evidence. Unbuffered directory read callbacks now execute inside their actual FSREQCALLBACK; close callbacks receive the request as their receiver and one error argument. Buffered callbacks use nextTick without another filesystem request, while synchronous buffered reads remain available. Promise overloads share the operation queue. Null callbacks, closed read overloads, immediate close state and ordinary callback exceptions follow the verified reference contract.
54/54 Debug steps; 26 native groups; 22 unchanged upstream files/invocations: 134 passed cases plus fifteen process checks, zero failures/skips, two upstream TODOs and 59 filtered exclusions. Fourteen ABI controls (452 assertions) and 32 report-validator controls pass. All 454 committed artifacts and 65 replayed report outcomes validate, preserving deliberate negatives. Source/original hashes match committed and pinned bytes. Node v26.10.0 and Home controls verify receivers, argument counts, real execution identity/resource, buffering, queue behavior and exception delivery. The rejected initial close-receiver assumption and Home pre-fix failure remain retained. Pickier keeps three preexisting errors and two quote warnings; the native control adds no findings.
Remaining: #878 remains open for repeated callback throws, every queued error combination, Windows/all-platform and Release/ASAN proof. General Promise/continuation hooks, directory/glob grouping beyond these verified paths and other producers remain #877. The direct-stream cancellation and WebSocket client TODOs receive no pass credit; filtered cases are exclusions. Corpus #876, context #871/#856, performance #869/#873/#874/#872 and HTTPS #875/#532 remain open. Earlier excluded regressions and the broader ABI suite were not rerun. This checkpoint does not establish full Bun-suite completion.
Earlier checkpoints (superseded by current callback evidence above)
Owned directory stream checkpoint (2026-10-11): source 6b57de653 and verified evidence. Dir now owns branded native descriptors/iterators, with streaming reads, configured buffering, file kinds, descriptor-relative recursive opens, buffer names/paths and URL validation. Async open/read/close use actual filesystem jobs, Strong roots, admission/barriers and cancellation cleanup. Explicit close, iterator exit, GC and worker shutdown retire real OS descriptors. Collection warnings defer to the live owning context; async byte paths are copied before scheduling. Pinned class/global layouts and JS2Native IDs are unchanged.
Final validation: 54/54 Debug steps; 26 native groups; seventeen unchanged pinned originals with 119 passed cases plus twelve process checks, zero failures/skips/filters and two upstream TODOs. GC/worker lifecycle controls inspect actual OS descriptors. All three SDK configuration transitions pass. Fourteen ABI controls (452 assertions), five Zig binding checks and 32 report-validator controls pass. The publication executable is byte-identical to the runtime-tested executable. All 844 committed artifacts and 120 replayed report outcomes validate, including 23 deliberately negative or historical failed outcomes. Three existing Pickier errors and one warning were reproduced on the committed baseline.
The exact WebKit SDK was restored and verified against its release SHA256. Its disappearance exposed stale native configuration; the pinned maker ignores advertised metadata/directory dependencies, so native configuration now declares these untracked observations through the supported build API. Failed SDK/configuration runs, the bufferSize:null regression and rejected Node reference assumptions remain retained. Node ordinary recursion passes; Node itself fails recursive traversal after its root path is renamed, which remains a separate parity consideration. No original assertions/snapshots were changed.
Remaining: #878 stays open for full read callback receiver/exception semantics and Windows/all-platform/Release/ASAN proof. Directory/glob resource grouping, general Promise/continuation lifecycle and other producers remain #877. The upstream direct-stream cancellation and WebSocket client TODOs receive no passing credit. Earlier #874/#872 failures were not rerun; corpus #876, context #871/#856, performance #869/#873 and HTTPS #875/#532 remain open. This establishes directory ownership progress, not full Bun-suite completion.
Earlier checkpoints (superseded by current ownership evidence above)
Compound rm/opendir callback checkpoint (2026-10-10): source c176f88fb and verified evidence. Callback rm validates directories through native callback lstat, then deletes through native callback rm. Opendir stat validation/completion uses the native callback lane with existing error mapping. Dir.close callbacks deliver through nextTick, so throws reach uncaughtException rather than rejecting internal operation promises. Queue serialization is preserved.
25 native groups; 32 validator controls; 54/54 Debug steps. Twenty-one unique original files, invoked twenty-two times: 111 passes plus thirteen process checks, zero failures/skips/TODOs, 123 per-invocation filtered cases. All 466 committed artifacts and 65 restored report outcomes validate; source hashes match committed bytes. Unchanged opendir and exact rm validation selections pass. Initial bounded failure and rejected read-exception reference assumption remain retained; read delivery was restored. Upstream assertions/snapshots and pin hashes are unchanged. Pickier retains three existing prefer-const errors and one warning, reproduced by baseline.
Dir remains a lazy path-backed listing with a placeholder handle. #878 requires actual descriptors/iterators, rename identity, streaming and platform ownership. Compound cp, directory/glob resource grouping and full read exception/receiver behavior remain open with promise/native-producer work in #877. Earlier #874/#872 were not rerun and remain open. Corpus #876, performance #869/#873, HTTPS #875/#532 and context #871/#856 remain open. Excluded regressions remain unverified; full Bun suite and Release/ASAN/all-platform coverage remain open under #66.
Earlier status and acceptance requirements (historical where superseded):
Home owns the filesystem source, but Dir still uses new Dir(1, path, ...) as a lazy path-backed view. The first read loads a complete readdir result by path; it is not an owned native directory descriptor/iterator.
Direct native stat validation and correct callback exception delivery improve ordinary opendir behavior, but do not establish descriptor lifetime or directory-stream identity.
Acceptance:
- Open and retain an actual native directory descriptor/iterator, with equivalent Windows ownership.
- Read incrementally from that handle and preserve identity across directory rename/path changes.
- Serialize read/close operations, preserve sync/async concurrency errors and release resources on explicit close, async iteration completion, collection and shutdown.
- Complete read callback exception/receiver semantics against the pinned reference contract; retain incompatible or failed outcomes separately.
- Verify unchanged original directory tests and ordinary lifecycle/platform controls without placeholder handle values.
Parent: #66. Related native callback/hook producer coverage: #877.