diff --git a/CHANGELOG.md b/CHANGELOG.md index 93ae998..df5f500 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,14 +2,14 @@ All notable changes to `fastdb` and its bindings are documented here. Release entries are retained after publication. Historical implementation notes below preserve the evidence available at their original date. -## 0.2.4 — release preparation +## 0.2.4 — 2026-10-29 - Fix ownership of standalone native database factories and standalone feature-reference factories in the Python binding. Repeated truncate/fill/save/close and file load/read/close cycles release their native allocations. - Pin borrowed buffers in the native database's release callback; release the export and shared mapping after its layers. Tables, rows, numeric arrays and chunks keep backing alive independently of the engine. Closing a RecordEngine releases its references; callers control checked-owner invalidation with `invalidate`. - Obtain bulk numeric columns directly from the native table address and field offset without creating per-row feature and geometry caches. Checked aliases follow snapshot remaps and reject stale row/column access. - Cache column accessors and arrays without table or fill-handler reference cycles, release obsolete builders, and attach NumPy chunk-array owners in C so cleanup is immediate with cyclic GC disabled. Engine-dependent writes after RecordEngine closure report a clear error; retained writable arrays remain usable. - Synchronize Python, Rust, TypeScript/WASM and the Core bundle at version 0.2.4. The Core bundle version is derived from the shared package manifests. -- Local validation and memory measurements are recorded in [the native memory report](docs/reports/0.2.4-native-memory.md). Exact-source CI, release artifacts and publication remain pending in [the 0.2.4 draft release record](docs/releases/0.2.4.md). +- Memory measurements are in [the native memory report](docs/reports/0.2.4-native-memory.md). Release evidence is tracked in [the 0.2.4 release record](docs/releases/0.2.4.md). ## 0.2.3 — 2026-10-21 diff --git a/docs/releases/0.2.4.md b/docs/releases/0.2.4.md index e31cde5..fd2bb5e 100644 --- a/docs/releases/0.2.4.md +++ b/docs/releases/0.2.4.md @@ -1,43 +1,80 @@ -# FastDB 0.2.4 release record — draft +# FastDB 0.2.4 release record + +The coordinated release uses immutable tag `v0.2.4`, source +`f82fa13adeae2b87a295bf984821c85c44b55a3d`, for Python `fastdb4py`, npm +`fastdb4ts`, Rust `fastdb`/`fastdb-sys` and the Core SDK. 0.2.4 addresses standalone native database ownership, numeric column cache -retention, and mapped backing lifetime. The design, prior measurements, and -validation boundary are in the [native memory report](../reports/0.2.4-native-memory.md). - -The coordinated release covers Python `fastdb4py`, npm `fastdb4ts`, Rust -`fastdb` and `fastdb-sys`, and the Core SDK bundles from one source commit. -Package manifests and lockfiles carry 0.2.4. Core bundle metadata derives the -version from the package manifests. - -## Validation - -Local checks pass 403 Python tests, compileall, sdist/wheel builds, 45 native -ASan/UBSan tests, 21 Rust unit/integration tests and one compile-fail doctest, -58 TypeScript/WASM tests, and both 117-symbol ABI checks on macOS ARM64. -Installed wheels on CPython 3.10 and 3.13 each pass all 403 Python tests. -Six-cycle, 15,498,593-row read/write -probes with cyclic GC disabled show bounded memory in the native memory report. -The release requires complete `tests.yml` and `release-artifacts.yml` runs for the -same final source on `main`, followed by exact-source consumer verification. - -| Evidence | Value | Status | -| --- | --- | --- | -| Final source SHA | | Pending | -| Successful `tests.yml` run | | Pending | -| Successful `release-artifacts.yml` run | | Pending | -| Candidate manifest digest and artifact IDs | | Pending | -| Complete archive inventory and hashes | | Pending | -| Immutable `v0.2.4` tag and GitHub release assets | | Pending | -| PyPI workflow and published inventory | | Pending | -| crates.io workflow and archive hashes | | Pending | -| npm workflow and tarball hash | | Pending | -| Installed published-consumer checks | | Pending | - -The candidate inventory comprises 35 Python wheels, one sdist, four Core -bundles, two Rust crates, and one npm tarball. Verify the native C++/C ABI/Rust -and installed-wheel consumers on Windows ARM64, along with the remaining -required platform and language gates. Record publication and installed -consumer evidence after the exact source and artifact identity checks pass. +retention, and mapped backing lifetime. The design, memory measurements and +local validation are in the [native memory report](../reports/0.2.4-native-memory.md). +The verified candidate keeps the 0.2.3 inventory of 43 archives: 35 Python +wheels, one sdist, four Core bundles, two Rust crates and one npm tarball. +Portable payload semantics and ABI-117 are unchanged. + +## Exact-source validation + +- [Run Tests 40932272066](https://github.com/world-in-progress/fastdb/actions/runs/40932272066): complete success, including sanitizers. +- [Release Artifacts 40932272107](https://github.com/world-in-progress/fastdb/actions/runs/40932272107): complete success; one retained 43-archive candidate. The native Windows x64 and ARM64 jobs each passed 41 C++ tests, including `legacy.lifetime`, and the ABI export check. + +Release Artifacts for the version merge `8f24619` +([run 40926228094](https://github.com/world-in-progress/fastdb/actions/runs/40926228094)) +failed to compile `tests/cpp/test_legacy_lifetime.cpp` with MSVC. The test +included `windows.h` after private headers that use `namespace std`, so the RPC +`byte` typedef was ambiguous with `std::byte`. +[PR #45](https://github.com/world-in-progress/fastdb/pull/45) defines +`WIN32_LEAN_AND_MEAN`. Pull-request CI does not build native Windows targets, +so the run above is the first Windows compile of the fix. + +The combined candidate is artifact `12922534983`; its GitHub ZIP digest is +`sha256:f7cb6fdf7e408d4b282f6baff7ea41001a3315d16fad88d1a14501068262b6bc`. +The exact CI `release-manifest.json` is 13,092 bytes, SHA-256 +`8a07ab93409811bb5e11418876ba082594758c2b3b87a766699c447586a9c5bf`. +The Python fragment is artifact `12924197817`. The candidate passed the +release verifier for its source SHA. + +## Windows x64 check before publication + +A Windows 11 x64 machine installed the candidate CPython 3.10 wheel from this +run into a fresh environment. + +- With cyclic GC disabled, six write cycles and six read cycles of a + 15,498,593-row F32 table kept the process commit charge (`PrivateUsage`) + flat: write cycles changed it by 0 bytes and read cycles by at most 4 KiB. + The published 0.2.3 wheel grew by 374–379 MiB per write cycle and + 312–317 MiB per read cycle in the same script. Removing the data file after + the cycles succeeded. +- The full Python suite passed 397 tests and skipped one. The five failures + are Windows shared-memory defects that also fail with 0.2.3 and its tests: + - `ObjectEngine.share()` closes its only handle, which deletes a Windows + named mapping before `ObjectEngine.load` opens it (four tests). + - `FastSerializer.loads_shm` compares the requested range with the + page-rounded size of an opened Windows mapping. The out-of-range test + therefore reaches the native loader, which raises + `Invalid FastDB database buffer.` instead of the size error; 0.2.3 raised + `AttributeError` there. + +These Windows defects are not regressions and remain open. + +## Publication + +- [PyPI 40940243958](https://github.com/world-in-progress/fastdb/actions/runs/40940243958): the tag push reused the exact-source Python artifact. +- [npm 40940925984](https://github.com/world-in-progress/fastdb/actions/runs/40940925984) and [Rust 40940920531](https://github.com/world-in-progress/fastdb/actions/runs/40940920531) published and verified the tested archives. + +The [GitHub release](https://github.com/world-in-progress/fastdb/releases/tag/v0.2.4) +retains the candidate archives, exact CI manifest, CI proof and publication +receipt. + +All 39 public registry files were downloaded and matched the CI manifest by +size and SHA-256: 36 PyPI files, one npm tarball and two Rust crates. +Consumer checks against the published bytes: + +- Python 3.10 on macOS ARM64 installed `fastdb4py==0.2.4` with + `--only-binary=:all:` into a fresh environment and passed all 403 Python + tests from the release source. +- The public npm tarball passed the packed `fastdb4ts/payload` inventory and + Wasm smoke check of `tests/ci/check_ts_payload_package.py`. +- No registry-only Rust consumer was built for this release. Both published + crates are byte-identical to the tested candidate. See [publishing](publishing.md) for the source-bound publication process and the [0.2.3 record](0.2.3.md) for the previous platform matrix. diff --git a/docs/reports/0.2.4-native-memory.md b/docs/reports/0.2.4-native-memory.md index ec38d7b..33a6e97 100644 --- a/docs/reports/0.2.4-native-memory.md +++ b/docs/reports/0.2.4-native-memory.md @@ -121,8 +121,10 @@ doctest, 58 TypeScript/WASM tests and 117-symbol native and WASM ABI checks. The three shutdown scripts each return zero twice in both Python runtimes. The six retained-view/release scenarios and chained writes pass on CPython 3.10. Release policy tests pass 105 cases and 98 subtests. -Windows, Linux, macOS x86_64 and free-threaded Python have -not been executed for this fix. Registry artifacts and the complete release -matrix remain subject to the [publishing process](../releases/publishing.md). +Pull-request CI ran the Python suite on Linux x86_64 with CPython 3.12 and +free-threaded 3.13. Release Artifacts built every wheel, ran its read/write +smoke and payload tests, and ran the native Core tests on Windows x64 and +ARM64. Before publication, a Windows x64 machine ran the full Python suite and +the memory loops; see the [0.2.4 release record](../releases/0.2.4.md). Raw logs, measurements and build archives are kept outside the source repository.