diff --git a/.github/workflows/pip-release.yml b/.github/workflows/pip-release.yml index fcfaf818..3896fd0f 100644 --- a/.github/workflows/pip-release.yml +++ b/.github/workflows/pip-release.yml @@ -111,33 +111,16 @@ jobs: CIBW_ARCHS_WINDOWS: ${{ matrix.arch }} CIBW_BUILD_FRONTEND: "build" CIBW_BEFORE_BUILD: "pip install maturin>=1.7" - # PUBLISHED wheels carry the full SOTA feature set. A pip extra - # (`[aether]`) CANNOT enable a Rust cargo feature on an already-built - # wheel, so the only way P6 reaches PyPI users is to compile it in. - # `default = []` stays in Cargo.toml (dev builds + the wheel-size - # budget job keep guarding the small base compile); the RELEASE build - # opts in here via maturin's PEP517 args. Measured 1.68 MiB — well - # under the ADR-117 §5.4 5 MiB budget. Set per-platform because - # CIBW_ENVIRONMENT_LINUX overrides the general CIBW_ENVIRONMENT. - CIBW_ENVIRONMENT: 'MATURIN_PEP517_ARGS="--features sota"' # The PyO3 sdist landing depends on the cargo/Rust toolchain # being present. cibuildwheel images carry rustup on Linux # but we also pin a known-good version for reproducibility. CIBW_BEFORE_ALL_LINUX: "curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --default-toolchain 1.82" - CIBW_ENVIRONMENT_LINUX: 'PATH="$HOME/.cargo/bin:$PATH" MATURIN_PEP517_ARGS="--features sota"' - # Smoke-test every built wheel before accepting it. This ASSERTS the - # SOTA bindings are present and importable — the prior version only - # printed __build_features__ and asserted hello(), so a wheel missing - # every P6 binding published green. A featureless wheel now fails here - # instead of shipping an ImportError to users. + CIBW_ENVIRONMENT_LINUX: 'PATH="$HOME/.cargo/bin:$PATH"' + # Smoke-test every built wheel before accepting it. Catches + # the case where the wheel imports but the compiled symbols + # are missing. CIBW_TEST_REQUIRES: "pytest>=8.0" - CIBW_TEST_COMMAND: >- - python -c "import wifi_densepose as w; - assert w.hello() == 'ok'; - missing = [f for f in ('p6-aether-bindings','p6-meridian-bindings','p6-mat-bindings') if f not in w.__build_features__]; - assert not missing, ('published wheel is missing SOTA bindings: ' + str(missing) + ' have=' + str(w.__build_features__)); - import wifi_densepose.aether, wifi_densepose.mat, wifi_densepose.meridian; - print('OK — SOTA bindings present:', w.__build_features__)" + CIBW_TEST_COMMAND: 'python -c "import wifi_densepose; assert wifi_densepose.hello() == \"ok\"; print(wifi_densepose.__build_features__)"' with: package-dir: python output-dir: wheelhouse diff --git a/python/wifi_densepose/aether.py b/python/wifi_densepose/aether.py index 80f1a010..40238224 100644 --- a/python/wifi_densepose/aether.py +++ b/python/wifi_densepose/aether.py @@ -4,10 +4,10 @@ Self-supervised 128-dim L2-normalized embeddings for WiFi CSI: room fingerprinting, person re-identification, and anomaly scoring, computed entirely offline by the Rust core (no server, no network). -Included in the official ``wifi-densepose`` wheels. It is absent only from a -from-source build that did not enable the Rust ``aether`` feature; rebuild with -``maturin ... --features aether`` (or ``--features sota`` for all three P6 -subsystems) in that case. +Not in the binary wheels yet (see ruvnet/RuView#1412 — the P6 SOTA +bindings are shipped source-build-only for now to keep the base wheel +small). Build from source with ``maturin ... --features aether`` (or +``--features sota`` for all three P6 subsystems). Quick start:: @@ -23,15 +23,14 @@ from __future__ import annotations from wifi_densepose import _native -# The AETHER symbols are compiled into `_native` only under the Rust -# `aether` feature, which the official wheels enable. They are absent only from -# a from-source build that omitted the feature — name the actual fix (rebuild -# with the feature), not a pip extra, which cannot add compiled code to an -# already-built wheel (ADR-185 §6 acceptance criterion). +# The AETHER symbols are compiled into `_native` only under the Rust `aether` +# feature. The binary wheels do NOT enable it yet (ruvnet/RuView#1412); +# it is available from a source build with the feature. Name that fix, not +# a pip extra, which cannot add compiled code to a built wheel. if not hasattr(_native, "AetherConfig"): raise ImportError( - "wifi_densepose.aether is not available in this build. The official " - "wheels include it; if you built from source, rebuild with " + "wifi_densepose.aether is not in the binary wheels yet " + "(see ruvnet/RuView#1412). Build from source with " "`maturin ... --features aether` (or `--features sota`)." ) diff --git a/python/wifi_densepose/mat.py b/python/wifi_densepose/mat.py index 3620b882..b9dbb90d 100644 --- a/python/wifi_densepose/mat.py +++ b/python/wifi_densepose/mat.py @@ -3,9 +3,10 @@ WiFi-based disaster-survivor detection and START-protocol triage from CSI: ingest CSI frames, run a scan cycle, and query detected survivors by triage. -Included in the official ``wifi-densepose`` wheels. It is absent only from a -from-source build that did not enable the Rust ``mat`` feature; rebuild with -``maturin ... --features mat`` (or ``--features sota``) in that case. +Not in the binary wheels yet (see ruvnet/RuView#1412 — the P6 SOTA +bindings are shipped source-build-only for now to keep the base wheel +small). Build from source with ``maturin ... --features mat`` (or +``--features sota`` for all three P6 subsystems). Quick start:: @@ -36,8 +37,8 @@ from wifi_densepose import _native # MAT symbols are compiled into `_native` only under the Rust `mat` feature. if not hasattr(_native, "DisasterResponse"): raise ImportError( - "wifi_densepose.mat is not available in this build. The official " - "wheels include it; if you built from source, rebuild with " + "wifi_densepose.mat is not in the binary wheels yet " + "(see ruvnet/RuView#1412). Build from source with " "`maturin ... --features mat` (or `--features sota`)." ) diff --git a/python/wifi_densepose/meridian.py b/python/wifi_densepose/meridian.py index e5d833d2..6c98e76b 100644 --- a/python/wifi_densepose/meridian.py +++ b/python/wifi_densepose/meridian.py @@ -4,9 +4,10 @@ Hardware-invariant CSI normalization, geometry-conditioned deployment, few-shot room adaptation, and cross-domain evaluation — the tch-free inference/adaptation path of Project MERIDIAN, computed by the Rust core. -Included in the official ``wifi-densepose`` wheels. It is absent only from a -from-source build that did not enable the Rust ``meridian`` feature; rebuild with -``maturin ... --features meridian`` (or ``--features sota``) in that case. +Not in the binary wheels yet (see ruvnet/RuView#1412 — the P6 SOTA +bindings are shipped source-build-only for now to keep the base wheel +small). Build from source with ``maturin ... --features meridian`` (or +``--features sota`` for all three P6 subsystems). Quick start:: @@ -33,8 +34,8 @@ from wifi_densepose import _native # `meridian` feature; absent in a base wheel (ADR-185 §6 acceptance). if not hasattr(_native, "HardwareNormalizer"): raise ImportError( - "wifi_densepose.meridian is not available in this build. The official " - "wheels include it; if you built from source, rebuild with " + "wifi_densepose.meridian is not in the binary wheels yet " + "(see ruvnet/RuView#1412). Build from source with " "`maturin ... --features meridian` (or `--features sota`)." )