Skip to content

Bump the github-actions group with 2 updates#31

Merged
matajoh merged 1 commit into
mainfrom
dependabot/github_actions/github-actions-0a5ecb558a
Jun 8, 2026
Merged

Bump the github-actions group with 2 updates#31
matajoh merged 1 commit into
mainfrom
dependabot/github_actions/github-actions-0a5ecb558a

Conversation

@dependabot

@dependabot dependabot Bot commented on behalf of github Jun 8, 2026

Copy link
Copy Markdown
Contributor

Bumps the github-actions group with 2 updates: actions/checkout and pypa/cibuildwheel.

Updates actions/checkout from 6.0.2 to 6.0.3

Release notes

Sourced from actions/checkout's releases.

v6.0.3

What's Changed

New Contributors

Full Changelog: actions/checkout@v6...v6.0.3

Changelog

Sourced from actions/checkout's changelog.

Changelog

v6.0.3

v6.0.2

v6.0.1

v6.0.0

v5.0.1

v5.0.0

v4.3.1

v4.3.0

v4.2.2

v4.2.1

v4.2.0

v4.1.7

... (truncated)

Commits

Updates pypa/cibuildwheel from 3.4.1 to 4.0.0

Release notes

Sourced from pypa/cibuildwheel's releases.

v4.0.0

See @​henryiii's release post for more info on new features!

  • 🌟 Adds wheel auditing with abi3audit as a default after the repair step, with new audit-requires and audit-command options (#2805)

  • 🌟 Adds pyemscripten platform tag support (PEP 783), updates Pyodide to 314.0.0a2, and adds a pyodide-eol enable flag for building end-of-life Pyodide versions (#2812, #2848)

  • 🌟 Sets up delvewheel as the default repair-wheel-command for Windows, so extension module DLLs are now bundled automatically. Skip by setting it to empty if not needed. (#2831)

  • ✨ Adds CPython 3.15 support, under the enable option cpython-prerelease. This version of cibuildwheel uses 3.15.0b2. (#2833, #2850)

    While CPython is in beta, the ABI can change, so your wheels might not be compatible with the final release. For this reason, we don't recommend distributing wheels until RC1, at which point 3.15 will be available in cibuildwheel without the flag.

  • ✨ Adds CPython 3.15 support for iOS and Android (#2857, #2858)

  • ✨ Adds Android improvements for building NumPy and related packages, including auditwheel support, pkg-config and Fortran configuration, and the xbuild-files option (#2695)

  • ✨ Adds CIBUILDWHEEL_BUILD_IDENTIFIER environment variable set to the current build identifier (e.g. cp311-manylinux_x86_64) during per-build steps (#2872)

  • ✨ Adds {project} and {package} placeholders to config-settings (#2827)

  • ⚠️ Drops support for Python 3.8 (#2686)

  • ⚠️ Removes the experimental CPython 3.13 free-threading builds and the cpython-freethreading enable option. CPython 3.14+ free-threading support remains available without the enable flag. (#2684)

  • ⚠️ Drops support for Cirrus CI, which is shutting down June 1, 2026 (#2817)

  • ⚠️ Drops GraalPy 3.11 (gp311) support, as agreed in #2741, and removes GraalPy 24-only workarounds (#2895)

  • 🔐 Adds SHA256 verification for direct downloads of Python interpreters, virtualenv, and python-build-standalone assets (#2873)

  • 🔐 Adds tarfile extraction filter for safe archive extraction (#2856)

  • 🐛 Fixes UV_PYTHON not being set for before-build on Linux when using uv as the build-frontend (#2830)

  • 🐛 Fixes detection of musl libc when downloading python-build-standalone, which previously always selected the gnu asset on musl hosts like Alpine (#2889)

  • 🐛 Fixes config-settings expansion when {project} or {package} contains spaces or backslashes (#2886)

  • 🐛 Prevents deadlock when linux32 fails and forwards platform args to the sanity check (#2880, #2888)

  • 🐛 Fixes container resource leaks on start failure and during teardown (#2879, #2887)

  • 🐛 Removes potential partial cache-population in case of error (#2892)

  • 🐛 Raises a clear error when ANDROID_API_LEVEL is not an integer (#2891)

  • 🐛 Replaces assert with proper exception in python-build-standalone (#2859)

  • 🐛 Uses ConfigurationError when package_dir is outside cwd instead of a generic Exception (#2898)

  • 🛠 Updates dependencies and container pins (#2893, #2882, #2874, #2868, #2862, #2884, #2845, #2837, #2818, #2810, #2838, #2813)

  • 🛠 Updates Android to Python 3.13.13 and 3.14.4 (#2821)

  • 🛠 Applies Pyodide-specific patches to the Emscripten toolchain installation (#2800)

  • 🛠 Uses python -V -V for Windows build diagnostics (#2832)

  • 🛠 Simplifies pinned container image lookup (#2897)

  • 🛠 Minor fixups across error messages, OCI container, and options (#2860)

  • 💼 Adds PEP 723 metadata for bin/ scripts and drops the bin dependency group (#2819)

  • 💼 Improves Azure test reliability with retries and caching (#2890)

  • 💼 Fixes Windows GitLab CI test running (#2870)

  • 💼 Updates CI action pins and dev dependencies (#2902, #2867, #2851, #2843, #2826, #2823, #2820, #2807)

  • 💼 Adds agent and copilot setup files (#2861)

  • 💼 Uses if TYPE_CHECKING: blocks (#2866, #2864)

  • 🧪 Fixes Android tests using the uv frontend (#2809)

  • 🧪 Fixes the update-dependencies workflow to use uv to run nox (#2808)

  • 🧪 Adds unit tests for OCIContainer._get_platform_args (#2878)

  • 📚 Updates documentation for delvewheel as the default Windows repair-wheel-command, including the build diagram, schema defaults, and legal note (#2877, #2853, #2891)

  • 📚 Documents platform-specific before-build configuration (#2834)

  • 📚 Updates the "How it works" diagram with details of Android, iOS, and Pyodide builds (#2816)

  • 📚 Adds Pyodide icon and regenerates working examples data for Android, iOS, and Pyodide (#2815, #2811)

  • 📚 Adds intersphinx support for external documentation linking (#2871)

  • 📚 Adds instructions for building CUDA wheels and fixes manylinux container references in FAQ (#2896, #2900)

... (truncated)

Changelog

Sourced from pypa/cibuildwheel's changelog.


title: Changelog ref: changelog

Changelog

v4.0.0

7 June 2026

See @​henryiii's release post for more info on new features!

  • 🌟 Adds wheel auditing with abi3audit as a default after the repair step, with new audit-requires and audit-command options (#2805)

  • 🌟 Adds pyemscripten platform tag support (PEP 783), updates Pyodide to 314.0.0a2, and adds a pyodide-eol enable flag for building end-of-life Pyodide versions (#2812, #2848)

  • 🌟 Sets up delvewheel as the default repair-wheel-command for Windows, so extension module DLLs are now bundled automatically. Skip by setting it to empty if not needed. (#2831)

  • ✨ Adds CPython 3.15 support, under the enable option cpython-prerelease. This version of cibuildwheel uses 3.15.0b2. (#2833, #2850)

    While CPython is in beta, the ABI can change, so your wheels might not be compatible with the final release. For this reason, we don't recommend distributing wheels until RC1, at which point 3.15 will be available in cibuildwheel without the flag.

  • ✨ Adds CPython 3.15 support for iOS and Android (#2857, #2858)

  • ✨ Adds Android improvements for building NumPy and related packages, including auditwheel support, pkg-config and Fortran configuration, and the xbuild-files option (#2695)

  • ✨ Adds CIBUILDWHEEL_BUILD_IDENTIFIER environment variable set to the current build identifier (e.g. cp311-manylinux_x86_64) during per-build steps (#2872)

  • ✨ Adds {project} and {package} placeholders to config-settings (#2827)

  • ⚠️ Drops support for Python 3.8 (#2686)

  • ⚠️ Removes the experimental CPython 3.13 free-threading builds and the cpython-freethreading enable option. CPython 3.14+ free-threading support remains available without the enable flag. (#2684)

  • ⚠️ Drops support for Cirrus CI, which is shutting down June 1, 2026 (#2817)

  • ⚠️ Drops GraalPy 3.11 (gp311) support, as agreed in #2741, and removes GraalPy 24-only workarounds (#2895)

  • 🔐 Adds SHA256 verification for direct downloads of Python interpreters, virtualenv, and python-build-standalone assets (#2873)

  • 🔐 Adds tarfile extraction filter for safe archive extraction (#2856)

  • 🐛 Fixes UV_PYTHON not being set for before-build on Linux when using uv as the build-frontend (#2830)

  • 🐛 Fixes detection of musl libc when downloading python-build-standalone, which previously always selected the gnu asset on musl hosts like Alpine (#2889)

  • 🐛 Fixes config-settings expansion when {project} or {package} contains spaces or backslashes (#2886)

  • 🐛 Prevents deadlock when linux32 fails and forwards platform args to the sanity check (#2880, #2888)

  • 🐛 Fixes container resource leaks on start failure and during teardown (#2879, #2887)

  • 🐛 Removes potential partial cache-population in case of error (#2892)

  • 🐛 Raises a clear error when ANDROID_API_LEVEL is not an integer (#2891)

  • 🐛 Replaces assert with proper exception in python-build-standalone (#2859)

  • 🐛 Uses ConfigurationError when package_dir is outside cwd instead of a generic Exception (#2898)

  • 🛠 Updates dependencies and container pins (#2893, #2882, #2874, #2868, #2862, #2884, #2845, #2837, #2818, #2810, #2838, #2813)

  • 🛠 Updates Android to Python 3.13.13 and 3.14.4 (#2821)

  • 🛠 Applies Pyodide-specific patches to the Emscripten toolchain installation (#2800)

  • 🛠 Uses python -V -V for Windows build diagnostics (#2832)

  • 🛠 Simplifies pinned container image lookup (#2897)

  • 🛠 Minor fixups across error messages, OCI container, and options (#2860)

  • 💼 Adds PEP 723 metadata for bin/ scripts and drops the bin dependency group (#2819)

  • 💼 Improves Azure test reliability with retries and caching (#2890)

  • 💼 Fixes Windows GitLab CI test running (#2870)

  • 💼 Updates CI action pins and dev dependencies (#2902, #2867, #2851, #2843, #2826, #2823, #2820, #2807)

  • 💼 Adds agent and copilot setup files (#2861)

... (truncated)

Commits
  • f03ac76 Bump version: v4.0.0
  • 557c5f6 feat: remove GraalPy 3.11 (gp311) support (#2895)
  • 70975c2 chore: use ConfigurationError when package_dir is outside cwd (#2898)
  • e2f143c chore(deps): bump docker/setup-qemu-action from 4.0.0 to 4.1.0 in the actions...
  • 866ae74 docs: fix CUDA manylinux container references in FAQ (#2900)
  • 84b518a chore: simplify pinned image lookup (#2897)
  • 785d812 docs: add instructions for building CUDA wheels (#2896)
  • f6bd047 Bump version: v4.0.0rc2
  • 6cd2d19 fix: remove potential partial cache-population in case of error (#2892)
  • cdb170b [Bot] Update dependencies (#2893)
  • Additional commits viewable in compare view

Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


Dependabot commands and options

You can trigger Dependabot actions by commenting on this PR:

  • @dependabot rebase will rebase this PR
  • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
  • @dependabot show <dependency name> ignore conditions will show all of the ignore conditions of the specified dependency
  • @dependabot ignore <dependency name> major version will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself)
  • @dependabot ignore <dependency name> minor version will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself)
  • @dependabot ignore <dependency name> will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself)
  • @dependabot unignore <dependency name> will remove all of the ignore conditions of the specified dependency
  • @dependabot unignore <dependency name> <ignore condition> will remove the ignore condition of the specified dependency and ignore conditions

Bumps the github-actions group with 2 updates: [actions/checkout](https://github.com/actions/checkout) and [pypa/cibuildwheel](https://github.com/pypa/cibuildwheel).


Updates `actions/checkout` from 6.0.2 to 6.0.3
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](actions/checkout@de0fac2...df4cb1c)

Updates `pypa/cibuildwheel` from 3.4.1 to 4.0.0
- [Release notes](https://github.com/pypa/cibuildwheel/releases)
- [Changelog](https://github.com/pypa/cibuildwheel/blob/main/docs/changelog.md)
- [Commits](pypa/cibuildwheel@8d2b08b...f03ac76)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-version: 6.0.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: github-actions
- dependency-name: pypa/cibuildwheel
  dependency-version: 4.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: github-actions
...

Signed-off-by: dependabot[bot] <support@github.com>
@matajoh matajoh merged commit e985674 into main Jun 8, 2026
41 checks passed
@matajoh matajoh deleted the dependabot/github_actions/github-actions-0a5ecb558a branch June 8, 2026 15:04
matajoh added a commit to matajoh/bocpy that referenced this pull request Jun 8, 2026
A result-reading and documentation release. `Cown.unwrap()` replaces
ad-hoc context-manager reads of behavior results with a single
quiescence-guarded call lowered to the C capsule, and the test suite
moves wholesale to the `quiesce()` + `unwrap()` pattern. `Matrix`
gains arg-reductions (`argmin` / `argmax`) and an explicit PRNG
`seed`, and its matmul kernel is re-ordered for cache-friendly
auto-vectorization (bit-for-bit identical output). The legacy
`notice_sync` shim is removed in favour of
`quiesce(noticeboard=True)`.

**New Features**

- **`Cown.unwrap()`** — return the cown's stored value, or re-raise a
  captured behavior exception on the caller's thread (Rust
  `Result::unwrap` shape). Acquires the cown for the read and requires
  global quiescence (`quiesce` / `wait`) first, raising
  `RuntimeError` otherwise so a result is never read while its
  producer is still in flight. Lowered to a C-level
  `CownCapsule.unwrap`, so a behavior that returns a `Cown`
  (surfacing downstream as a bare `CownCapsule`) unwraps the same way
  without rewrapping. A captured exception is cleared on read, so it is
  not re-reported when the cown is dropped and a second `unwrap()`
  returns `None`.
- **`Matrix.argmin(axis=None)` / `Matrix.argmax(axis=None)`** — index
  of the minimum / maximum element, first occurrence on ties. Flat
  (`axis=None`) returns a row-major `int`; `axis=0` / `axis=1`
  return per-column / per-row index vectors. NaN elements are skipped
  unless the running extreme starts at NaN, which pins the result to
  that position (this differs from NumPy, which propagates NaN).
- **`Matrix.seed(value)`** — classmethod seeding the process-global C
  PRNG used by `normal()` / `uniform()`, making subsequent draws
  reproducible when generation stays on a single thread.
- **`examples/fanout_benchmark.py`** — a dispatch-rate microbenchmark
  for the fanout workload (a producer that allocates fresh consumer
  cowns it does not hold and dispatches one `@when` each), surfacing
  per-worker queue contention (`enqueue_cas_retries`) as the gating
  signal. Complements the chain workload in `examples/benchmark.py`.

**Improvements**

- **matmul cache-friendly reorder** — `impl_matmul` is re-ordered from
  `ijk` to `ikj` so the inner loop walks contiguous rows of the
  right-hand operand and the output, enabling compiler
  auto-vectorization. Output is bit-for-bit identical (each inner
  product still accumulates `k` in ascending order); measured ~2.9–3.2×
  faster on square shapes, ~1.5–1.8× on rectangular ones. A
  bitwise-reproducibility regression test pins the accumulation order.

**Bug Fixes**

A warm welcome and thank-you to first-time contributor **Shivanand
Mishra** (@xemishra), who tracked down and fixed a subtle transpiler
bug this release — exactly the kind of sharp-eyed catch that makes the
project better.

- **`@when` result assignment dropped for module-level behaviors**
  (microsoft#30, thanks @xemishra) — a behavior defined at module level
  transpiled without its result cown, so the exported module silently
  dropped the return value and downstream behaviors could not schedule
  over it. Fixed, with a regression test guarding the exported-module
  shape.
- **Nested `@when` capture** — the transpiler now correctly surfaces a
  nested `@when`'s free names as the outer behavior's captures and
  resolves its cown arguments in the outer frame, instead of leaving
  them to Python's closure machinery where they could not be reached
  from the worker interpreter.
- **`Matrix` range/return checks** — added overflow and return-value
  checks on the `range_read` path uncovered while migrating the
  matrix tests.

**Breaking Changes**

- **`notice_sync` removed** — the noticeboard-sync shim is gone from
  `bocpy.__all__`. Use `quiesce(noticeboard=True)` instead, which
  blocks until in-flight behaviors complete and returns a noticeboard
  snapshot without tearing the runtime down.

**Documentation**

- Removed the `notice_sync` references from `noticeboard` and the
  type stubs; documented the NaN tie-break behavior of
  `argmin` / `argmax`; corrected the happens-after example in the
  `thinking-in-boc` skill to order across genuinely unrelated data;
  added a `fanout_benchmark.py` section to the examples README.

**Tests**

- Migrated `test_boc.py`, `test_noticeboard.py`, and the scheduler /
  pinned-pump suites to the `quiesce()` + `Cown.unwrap()` pattern.
  Added matmul bitwise-reproducibility and `argmin` / `argmax` NaN
  regression tests.

**Dependencies**

- Bumped the `github-actions` group (microsoft#31, microsoft#27, dependabot):
  `actions/checkout` 6.0.2 → 6.0.3 and `pypa/cibuildwheel`
  3.4.1 → 4.0.0.

**Internal**

- Large comment scrub across the C extensions, Python runtime, scripts,
  and tests, followed by a remediation pass that restored load-bearing
  rationale (memory-ordering fences, UAF guards, deliberate-leak notes,
  and the vendored Apache-2.0 provenance header) as condensed
  summaries.
- Ignored Sphinx-related updates in `dependabot.yml` to keep the docs
  toolchain pinned.

Signed-off-by: Matthew A Johnson <matthew@matthewajohnson.org>
matajoh added a commit to matajoh/bocpy that referenced this pull request Jun 9, 2026
A result-reading and documentation release. `Cown.unwrap()` replaces
ad-hoc context-manager reads of behavior results with a single
quiescence-guarded call lowered to the C capsule, and the test suite
moves wholesale to the `quiesce()` + `unwrap()` pattern. `Matrix`
gains arg-reductions (`argmin` / `argmax`) and an explicit PRNG
`seed`, and its matmul kernel is re-ordered for cache-friendly
auto-vectorization (bit-for-bit identical output). The legacy
`notice_sync` shim is removed in favour of
`quiesce(noticeboard=True)` for reads and the new `notice_seed`
for synchronous main-thread seeding.

**New Features**

- **`notice_seed(key, value)`** — a synchronous, main-interpreter-only
  noticeboard write that commits under the noticeboard mutex *before it
  returns*, so every behavior scheduled afterwards observes it. Unlike
  the fire-and-forget `notice_write`, it gives read-your-writes ordering
  for installing read-mostly configuration before scheduling the
  behaviors that read it, and it starts the runtime if called first — so
  seeding can be a program's first bocpy call with no explicit `start()`.
  It is a plain overwrite and does not provide `notice_update`'s
  read-modify-write atomicity. Calling it from a worker raises
  `RuntimeError`.
- **`Cown.unwrap()`** — return the cown's stored value, or re-raise a
  captured behavior exception on the caller's thread (Rust
  `Result::unwrap` shape). Acquires the cown for the read and requires
  global quiescence (`quiesce` / `wait`) first, raising
  `RuntimeError` otherwise so a result is never read while its
  producer is still in flight. Lowered to a C-level
  `CownCapsule.unwrap`, so a behavior that returns a `Cown`
  (surfacing downstream as a bare `CownCapsule`) unwraps the same way
  without rewrapping. A captured exception is cleared on read, so it is
  not re-reported when the cown is dropped and a second `unwrap()`
  returns `None`.
- **`Matrix.argmin(axis=None)` / `Matrix.argmax(axis=None)`** — index
  of the minimum / maximum element, first occurrence on ties. Flat
  (`axis=None`) returns a row-major `int`; `axis=0` / `axis=1`
  return per-column / per-row index vectors. NaN elements are skipped
  unless the running extreme starts at NaN, which pins the result to
  that position (this differs from NumPy, which propagates NaN).
- **`Matrix.seed(value)`** — classmethod seeding the process-global C
  PRNG used by `normal()` / `uniform()`, making subsequent draws
  reproducible when generation stays on a single thread.
- **`examples/fanout_benchmark.py`** — a dispatch-rate microbenchmark
  for the fanout workload (a producer that allocates fresh consumer
  cowns it does not hold and dispatches one `@when` each), surfacing
  per-worker queue contention (`enqueue_cas_retries`) as the gating
  signal. Complements the chain workload in `examples/benchmark.py`.

**Improvements**

- **matmul cache-friendly reorder** — `impl_matmul` is re-ordered from
  `ijk` to `ikj` so the inner loop walks contiguous rows of the
  right-hand operand and the output, enabling compiler
  auto-vectorization. Output is bit-for-bit identical (each inner
  product still accumulates `k` in ascending order); measured ~2.9–3.2×
  faster on square shapes, ~1.5–1.8× on rectangular ones. A
  bitwise-reproducibility regression test pins the accumulation order.

**Bug Fixes**

A warm welcome and thank-you to first-time contributor **Shivanand
Mishra** (@xemishra), who tracked down and fixed a subtle transpiler
bug this release — exactly the kind of sharp-eyed catch that makes the
project better.

- **`@when` result assignment dropped for module-level behaviors**
  (microsoft#30, thanks @xemishra) — a behavior defined at module level
  transpiled without its result cown, so the exported module silently
  dropped the return value and downstream behaviors could not schedule
  over it. Fixed, with a regression test guarding the exported-module
  shape.
- **Nested `@when` capture** — the transpiler now correctly surfaces a
  nested `@when`'s free names as the outer behavior's captures and
  resolves its cown arguments in the outer frame, instead of leaving
  them to Python's closure machinery where they could not be reached
  from the worker interpreter.
- **`Matrix` range/return checks** — added overflow and return-value
  checks on the `range_read` path uncovered while migrating the
  matrix tests.

**Breaking Changes**

- **`notice_sync` removed** — the noticeboard-sync shim is gone from
  `bocpy.__all__`. Use `quiesce(noticeboard=True)` instead, which
  blocks until in-flight behaviors complete and returns a noticeboard
  snapshot without tearing the runtime down.

**Documentation**

- Removed the `notice_sync` references from `noticeboard` and the
  type stubs; documented the NaN tie-break behavior of
  `argmin` / `argmax`; corrected the happens-after example in the
  `thinking-in-boc` skill to order across genuinely unrelated data;
  added a `fanout_benchmark.py` section to the examples README.

**Tests**

- Migrated `test_boc.py`, `test_noticeboard.py`, and the scheduler /
  pinned-pump suites to the `quiesce()` + `Cown.unwrap()` pattern.
  Added matmul bitwise-reproducibility and `argmin` / `argmax` NaN
  regression tests.

**Dependencies**

- Bumped the `github-actions` group (microsoft#31, microsoft#27, dependabot):
  `actions/checkout` 6.0.2 → 6.0.3 and `pypa/cibuildwheel`
  3.4.1 → 4.0.0.

**Internal**

- Large comment scrub across the C extensions, Python runtime, scripts,
  and tests, followed by a remediation pass that restored load-bearing
  rationale (memory-ordering fences, UAF guards, deliberate-leak notes,
  and the vendored Apache-2.0 provenance header) as condensed
  summaries.
- Ignored Sphinx-related updates in `dependabot.yml` to keep the docs
  toolchain pinned.

Signed-off-by: Matthew A Johnson <matthew@matthewajohnson.org>
matajoh added a commit to matajoh/bocpy that referenced this pull request Jun 9, 2026
A result-reading and documentation release. `Cown.unwrap()` replaces
ad-hoc context-manager reads of behavior results with a single
quiescence-guarded call lowered to the C capsule, and the test suite
moves wholesale to the `quiesce()` + `unwrap()` pattern. `Matrix`
gains arg-reductions (`argmin` / `argmax`) and an explicit PRNG
`seed`, and its matmul kernel is re-ordered for cache-friendly
auto-vectorization (bit-for-bit identical output). The legacy
`notice_sync` shim is removed in favour of
`quiesce(noticeboard=True)` for reads and the new `notice_seed`
for synchronous main-thread seeding.

**New Features**

- **`notice_seed(key, value)`** — a synchronous, main-interpreter-only
  noticeboard write that commits under the noticeboard mutex *before it
  returns*, so every behavior scheduled afterwards observes it. Unlike
  the fire-and-forget `notice_write`, it gives read-your-writes ordering
  for installing read-mostly configuration before scheduling the
  behaviors that read it, and it starts the runtime if called first — so
  seeding can be a program's first bocpy call with no explicit `start()`.
  It is a plain overwrite and does not provide `notice_update`'s
  read-modify-write atomicity. Calling it from a worker raises
  `RuntimeError`.
- **`Cown.unwrap()`** — return the cown's stored value, or re-raise a
  captured behavior exception on the caller's thread (Rust
  `Result::unwrap` shape). Acquires the cown for the read and requires
  global quiescence (`quiesce` / `wait`) first, raising
  `RuntimeError` otherwise so a result is never read while its
  producer is still in flight. Lowered to a C-level
  `CownCapsule.unwrap`, so a behavior that returns a `Cown`
  (surfacing downstream as a bare `CownCapsule`) unwraps the same way
  without rewrapping. A captured exception is cleared on read, so it is
  not re-reported when the cown is dropped and a second `unwrap()`
  returns `None`.
- **`Matrix.argmin(axis=None)` / `Matrix.argmax(axis=None)`** — index
  of the minimum / maximum element, first occurrence on ties. Flat
  (`axis=None`) returns a row-major `int`; `axis=0` / `axis=1`
  return per-column / per-row index vectors. NaN elements are skipped
  unless the running extreme starts at NaN, which pins the result to
  that position (this differs from NumPy, which propagates NaN).
- **`Matrix.seed(value)`** — classmethod seeding the process-global C
  PRNG used by `normal()` / `uniform()`, making subsequent draws
  reproducible when generation stays on a single thread.
- **`examples/fanout_benchmark.py`** — a dispatch-rate microbenchmark
  for the fanout workload (a producer that allocates fresh consumer
  cowns it does not hold and dispatches one `@when` each), surfacing
  per-worker queue contention (`enqueue_cas_retries`) as the gating
  signal. Complements the chain workload in `examples/benchmark.py`.

**Improvements**

- **matmul cache-friendly reorder** — `impl_matmul` is re-ordered from
  `ijk` to `ikj` so the inner loop walks contiguous rows of the
  right-hand operand and the output, enabling compiler
  auto-vectorization. Output is bit-for-bit identical (each inner
  product still accumulates `k` in ascending order); measured ~2.9–3.2×
  faster on square shapes, ~1.5–1.8× on rectangular ones. A
  bitwise-reproducibility regression test pins the accumulation order.

**Bug Fixes**

A warm welcome and thank-you to first-time contributor **Shivanand
Mishra** (@xemishra), who tracked down and fixed a subtle transpiler
bug this release — exactly the kind of sharp-eyed catch that makes the
project better.

- **`@when` result assignment dropped for module-level behaviors**
  (microsoft#30, thanks @xemishra) — a behavior defined at module level
  transpiled without its result cown, so the exported module silently
  dropped the return value and downstream behaviors could not schedule
  over it. Fixed, with a regression test guarding the exported-module
  shape.
- **Nested `@when` capture** — the transpiler now correctly surfaces a
  nested `@when`'s free names as the outer behavior's captures and
  resolves its cown arguments in the outer frame, instead of leaving
  them to Python's closure machinery where they could not be reached
  from the worker interpreter.
- **`Matrix` range/return checks** — added overflow and return-value
  checks on the `range_read` path uncovered while migrating the
  matrix tests.

**Breaking Changes**

- **`notice_sync` removed** — the noticeboard-sync shim is gone from
  `bocpy.__all__`. Use `quiesce(noticeboard=True)` instead, which
  blocks until in-flight behaviors complete and returns a noticeboard
  snapshot without tearing the runtime down.

**Documentation**

- Removed the `notice_sync` references from `noticeboard` and the
  type stubs; documented the NaN tie-break behavior of
  `argmin` / `argmax`; corrected the happens-after example in the
  `thinking-in-boc` skill to order across genuinely unrelated data;
  added a `fanout_benchmark.py` section to the examples README.

**Tests**

- Migrated `test_boc.py`, `test_noticeboard.py`, and the scheduler /
  pinned-pump suites to the `quiesce()` + `Cown.unwrap()` pattern.
  Added matmul bitwise-reproducibility and `argmin` / `argmax` NaN
  regression tests.

**Dependencies**

- Bumped the `github-actions` group (microsoft#31, microsoft#27, dependabot):
  `actions/checkout` 6.0.2 → 6.0.3 and `pypa/cibuildwheel`
  3.4.1 → 4.0.0.

**Internal**

- Large comment scrub across the C extensions, Python runtime, scripts,
  and tests, followed by a remediation pass that restored load-bearing
  rationale (memory-ordering fences, UAF guards, deliberate-leak notes,
  and the vendored Apache-2.0 provenance header) as condensed
  summaries.
- Ignored Sphinx-related updates in `dependabot.yml` to keep the docs
  toolchain pinned.

Signed-off-by: Matthew A Johnson <matthew@matthewajohnson.org>
matajoh added a commit to matajoh/bocpy that referenced this pull request Jun 9, 2026
A result-reading and documentation release. `Cown.unwrap()` replaces
ad-hoc context-manager reads of behavior results with a single
quiescence-guarded call lowered to the C capsule, and the test suite
moves wholesale to the `quiesce()` + `unwrap()` pattern. `Matrix`
gains arg-reductions (`argmin` / `argmax`) and an explicit PRNG
`seed`, and its matmul kernel is re-ordered for cache-friendly
auto-vectorization (bit-for-bit identical output). The legacy
`notice_sync` shim is removed in favour of
`quiesce(noticeboard=True)` for reads and the new `notice_seed`
for synchronous main-thread seeding.

**New Features**

- **`notice_seed(key, value)`** — a synchronous, main-interpreter-only
  noticeboard write that commits under the noticeboard mutex *before it
  returns*, so every behavior scheduled afterwards observes it. Unlike
  the fire-and-forget `notice_write`, it gives read-your-writes ordering
  for installing read-mostly configuration before scheduling the
  behaviors that read it, and it starts the runtime if called first — so
  seeding can be a program's first bocpy call with no explicit `start()`.
  It is a plain overwrite and does not provide `notice_update`'s
  read-modify-write atomicity. Calling it from a worker raises
  `RuntimeError`.
- **`Cown.unwrap()`** — return the cown's stored value, or re-raise a
  captured behavior exception on the caller's thread (Rust
  `Result::unwrap` shape). Acquires the cown for the read and requires
  global quiescence (`quiesce` / `wait`) first, raising
  `RuntimeError` otherwise so a result is never read while its
  producer is still in flight. Lowered to a C-level
  `CownCapsule.unwrap`, so a behavior that returns a `Cown`
  (surfacing downstream as a bare `CownCapsule`) unwraps the same way
  without rewrapping. A captured exception is cleared on read, so it is
  not re-reported when the cown is dropped and a second `unwrap()`
  returns `None`.
- **`Matrix.argmin(axis=None)` / `Matrix.argmax(axis=None)`** — index
  of the minimum / maximum element, first occurrence on ties. Flat
  (`axis=None`) returns a row-major `int`; `axis=0` / `axis=1`
  return per-column / per-row index vectors. NaN elements are skipped
  unless the running extreme starts at NaN, which pins the result to
  that position (this differs from NumPy, which propagates NaN).
- **`Matrix.seed(value)`** — classmethod seeding the process-global C
  PRNG used by `normal()` / `uniform()`, making subsequent draws
  reproducible when generation stays on a single thread.
- **`Matrix` pickling** — `Matrix` now supports `pickle` (all
  protocols) and `copy.deepcopy` via `__reduce__`, so a matrix nested in
  a pickled container (dict, list, …) round-trips with its neighbours
  instead of raising `TypeError`. Serialization copies the raw,
  native-endian, row-major `double` buffer in one block, so the cost is
  linear in the element count with no per-element Python object churn and
  every value (including `NaN`, `±inf`, `-0.0`, and subnormals) is
  preserved bit-for-bit. The current interpreter must own the matrix:
  pickling one that has been released into a `Cown` raises
  `RuntimeError`. The encoding is native-endian, so a pickle is not
  portable across architectures of differing byte order.
- **`examples/fanout_benchmark.py`** — a dispatch-rate microbenchmark
  for the fanout workload (a producer that allocates fresh consumer
  cowns it does not hold and dispatches one `@when` each), surfacing
  per-worker queue contention (`enqueue_cas_retries`) as the gating
  signal. Complements the chain workload in `examples/benchmark.py`.

**Improvements**

- **matmul cache-friendly reorder** — `impl_matmul` is re-ordered from
  `ijk` to `ikj` so the inner loop walks contiguous rows of the
  right-hand operand and the output, enabling compiler
  auto-vectorization. Output is bit-for-bit identical (each inner
  product still accumulates `k` in ascending order); measured ~2.9–3.2×
  faster on square shapes, ~1.5–1.8× on rectangular ones. A
  bitwise-reproducibility regression test pins the accumulation order.

**Bug Fixes**

A warm welcome and thank-you to first-time contributor **Shivanand
Mishra** (@xemishra), who tracked down and fixed a subtle transpiler
bug this release — exactly the kind of sharp-eyed catch that makes the
project better.

- **`@when` result assignment dropped for module-level behaviors**
  (microsoft#30, thanks @xemishra) — a behavior defined at module level
  transpiled without its result cown, so the exported module silently
  dropped the return value and downstream behaviors could not schedule
  over it. Fixed, with a regression test guarding the exported-module
  shape.
- **Nested `@when` capture** — the transpiler now correctly surfaces a
  nested `@when`'s free names as the outer behavior's captures and
  resolves its cown arguments in the outer frame, instead of leaving
  them to Python's closure machinery where they could not be reached
  from the worker interpreter.
- **`Matrix` range/return checks** — added overflow and return-value
  checks on the `range_read` path uncovered while migrating the
  matrix tests.

**Breaking Changes**

- **`notice_sync` removed** — the noticeboard-sync shim is gone from
  `bocpy.__all__`. Use `quiesce(noticeboard=True)` instead, which
  blocks until in-flight behaviors complete and returns a noticeboard
  snapshot without tearing the runtime down.

**Documentation**

- Removed the `notice_sync` references from `noticeboard` and the
  type stubs; documented the NaN tie-break behavior of
  `argmin` / `argmax`; corrected the happens-after example in the
  `thinking-in-boc` skill to order across genuinely unrelated data;
  added a `fanout_benchmark.py` section to the examples README.

**Tests**

- Migrated `test_boc.py`, `test_noticeboard.py`, and the scheduler /
  pinned-pump suites to the `quiesce()` + `Cown.unwrap()` pattern.
  Added matmul bitwise-reproducibility and `argmin` / `argmax` NaN
  regression tests.

**Dependencies**

- Bumped the `github-actions` group (microsoft#31, microsoft#27, dependabot):
  `actions/checkout` 6.0.2 → 6.0.3 and `pypa/cibuildwheel`
  3.4.1 → 4.0.0.

**Internal**

- Large comment scrub across the C extensions, Python runtime, scripts,
  and tests, followed by a remediation pass that restored load-bearing
  rationale (memory-ordering fences, UAF guards, deliberate-leak notes,
  and the vendored Apache-2.0 provenance header) as condensed
  summaries.
- Ignored Sphinx-related updates in `dependabot.yml` to keep the docs
  toolchain pinned.

Signed-off-by: Matthew A Johnson <matthew@matthewajohnson.org>
matajoh added a commit to matajoh/bocpy that referenced this pull request Jun 9, 2026
A result-reading and documentation release. `Cown.unwrap()` replaces
ad-hoc context-manager reads of behavior results with a single
quiescence-guarded call lowered to the C capsule, and the test suite
moves wholesale to the `quiesce()` + `unwrap()` pattern. `Matrix`
gains arg-reductions (`argmin` / `argmax`) and an explicit PRNG
`seed`, and its matmul kernel is re-ordered for cache-friendly
auto-vectorization (bit-for-bit identical output). The legacy
`notice_sync` shim is removed in favour of
`quiesce(noticeboard=True)` for reads and the new `notice_seed`
for synchronous main-thread seeding.

**New Features**

- **`notice_seed(key, value)`** — a synchronous, main-interpreter-only
  noticeboard write that commits under the noticeboard mutex *before it
  returns*, so every behavior scheduled afterwards observes it. Unlike
  the fire-and-forget `notice_write`, it gives read-your-writes ordering
  for installing read-mostly configuration before scheduling the
  behaviors that read it, and it starts the runtime if called first — so
  seeding can be a program's first bocpy call with no explicit `start()`.
  It is a plain overwrite and does not provide `notice_update`'s
  read-modify-write atomicity. Calling it from a worker raises
  `RuntimeError`.
- **`Cown.unwrap()`** — return the cown's stored value, or re-raise a
  captured behavior exception on the caller's thread (Rust
  `Result::unwrap` shape). Acquires the cown for the read and requires
  global quiescence (`quiesce` / `wait`) first, raising
  `RuntimeError` otherwise so a result is never read while its
  producer is still in flight. Lowered to a C-level
  `CownCapsule.unwrap`, so a behavior that returns a `Cown`
  (surfacing downstream as a bare `CownCapsule`) unwraps the same way
  without rewrapping. A captured exception is cleared on read, so it is
  not re-reported when the cown is dropped and a second `unwrap()`
  returns `None`.
- **`Matrix.argmin(axis=None)` / `Matrix.argmax(axis=None)`** — index
  of the minimum / maximum element, first occurrence on ties. Flat
  (`axis=None`) returns a row-major `int`; `axis=0` / `axis=1`
  return per-column / per-row index vectors. NaN elements are skipped
  unless the running extreme starts at NaN, which pins the result to
  that position (this differs from NumPy, which propagates NaN).
- **`Matrix.seed(value)`** — classmethod seeding the process-global C
  PRNG used by `normal()` / `uniform()`, making subsequent draws
  reproducible when generation stays on a single thread.
- **`Matrix` pickling** — `Matrix` now supports `pickle` (all
  protocols) and `copy.deepcopy` via `__reduce__`, so a matrix nested in
  a pickled container (dict, list, …) round-trips with its neighbours
  instead of raising `TypeError`. Serialization copies the raw,
  native-endian, row-major `double` buffer in one block, so the cost is
  linear in the element count with no per-element Python object churn and
  every value (including `NaN`, `±inf`, `-0.0`, and subnormals) is
  preserved bit-for-bit. The current interpreter must own the matrix:
  pickling one that has been released into a `Cown` raises
  `RuntimeError`. The encoding is native-endian, so a pickle is not
  portable across architectures of differing byte order.
- **`examples/fanout_benchmark.py`** — a dispatch-rate microbenchmark
  for the fanout workload (a producer that allocates fresh consumer
  cowns it does not hold and dispatches one `@when` each), surfacing
  per-worker queue contention (`enqueue_cas_retries`) as the gating
  signal. Complements the chain workload in `examples/benchmark.py`.

**Improvements**

- **matmul cache-friendly reorder** — `impl_matmul` is re-ordered from
  `ijk` to `ikj` so the inner loop walks contiguous rows of the
  right-hand operand and the output, enabling compiler
  auto-vectorization. Output is bit-for-bit identical (each inner
  product still accumulates `k` in ascending order); measured ~2.9–3.2×
  faster on square shapes, ~1.5–1.8× on rectangular ones. A
  bitwise-reproducibility regression test pins the accumulation order.

**Bug Fixes**

A warm welcome and thank-you to first-time contributor **Shivanand
Mishra** (@xemishra), who tracked down and fixed a subtle transpiler
bug this release — exactly the kind of sharp-eyed catch that makes the
project better.

- **`@when` result assignment dropped for module-level behaviors**
  (microsoft#30, thanks @xemishra) — a behavior defined at module level
  transpiled without its result cown, so the exported module silently
  dropped the return value and downstream behaviors could not schedule
  over it. Fixed, with a regression test guarding the exported-module
  shape.
- **Nested `@when` capture** — the transpiler now correctly surfaces a
  nested `@when`'s free names as the outer behavior's captures and
  resolves its cown arguments in the outer frame, instead of leaving
  them to Python's closure machinery where they could not be reached
  from the worker interpreter.
- **`Matrix` range/return checks** — added overflow and return-value
  checks on the `range_read` path uncovered while migrating the
  matrix tests.

**Breaking Changes**

- **`notice_sync` removed** — the noticeboard-sync shim is gone from
  `bocpy.__all__`. Use `quiesce(noticeboard=True)` instead, which
  blocks until in-flight behaviors complete and returns a noticeboard
  snapshot without tearing the runtime down.

**Documentation**

- Removed the `notice_sync` references from `noticeboard` and the
  type stubs; documented the NaN tie-break behavior of
  `argmin` / `argmax`; corrected the happens-after example in the
  `thinking-in-boc` skill to order across genuinely unrelated data;
  added a `fanout_benchmark.py` section to the examples README.

**Tests**

- Migrated `test_boc.py`, `test_noticeboard.py`, and the scheduler /
  pinned-pump suites to the `quiesce()` + `Cown.unwrap()` pattern.
  Added matmul bitwise-reproducibility and `argmin` / `argmax` NaN
  regression tests.

**Dependencies**

- Bumped the `github-actions` group (microsoft#31, microsoft#27, dependabot):
  `actions/checkout` 6.0.2 → 6.0.3 and `pypa/cibuildwheel`
  3.4.1 → 4.0.0.

**Internal**

- Large comment scrub across the C extensions, Python runtime, scripts,
  and tests, followed by a remediation pass that restored load-bearing
  rationale (memory-ordering fences, UAF guards, deliberate-leak notes,
  and the vendored Apache-2.0 provenance header) as condensed
  summaries.
- Ignored Sphinx-related updates in `dependabot.yml` to keep the docs
  toolchain pinned.

Signed-off-by: Matthew A Johnson <matthew@matthewajohnson.org>
@matajoh matajoh mentioned this pull request Jun 9, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant