iperf3-lib 0.4.0__tar.gz → 0.4.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (300) hide show
  1. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/.github/workflows/ci.yml +41 -14
  2. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/.github/workflows/docs.yml +1 -1
  3. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/.github/workflows/python-preview.yml +6 -6
  4. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/.github/workflows/release.yml +16 -16
  5. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/Dockerfile.preview +1 -1
  6. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/Makefile +3 -3
  7. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/PKG-INFO +6 -6
  8. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/README.md +5 -5
  9. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/development/contributing.md +26 -0
  10. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/development/design/advanced-execution.md +8 -9
  11. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/development/design/isolated-execution-qualification.md +1 -1
  12. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/development/releasing.md +36 -17
  13. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/development/roadmap.md +28 -14
  14. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/docker-entrypoint.sh +4 -3
  15. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/docs/changelog.md +51 -4
  16. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/docs/getting-started.md +13 -11
  17. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/docs/guides/adaptive-udp.md +1 -1
  18. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/docs/guides/choosing-an-integration.md +5 -5
  19. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/docs/guides/concurrent-plans.md +1 -1
  20. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/docs/guides/configuration-intent.md +4 -4
  21. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/docs/guides/live-events.md +1 -1
  22. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/docs/guides/migration-0.3.md +3 -2
  23. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/docs/guides/migration-0.4.md +7 -7
  24. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/docs/guides/native-controls.md +1 -1
  25. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/docs/guides/running-tests.md +4 -4
  26. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/docs/guides/sweeps.md +1 -1
  27. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/docs/guides/trials.md +3 -3
  28. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/docs/index.md +9 -9
  29. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/docs/reference/api.md +16 -7
  30. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/docs/reference/compatibility.md +87 -8
  31. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/docs/security.md +2 -2
  32. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/overrides/main.html +1 -1
  33. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/pyproject.toml +3 -3
  34. iperf3_lib-0.4.2/scripts/ci_scope.py +200 -0
  35. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/scripts/docker_validate.py +2 -2
  36. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/scripts/python_preview.py +4 -4
  37. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/scripts/release_artifacts.py +19 -1
  38. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/scripts/smoke_release.py +9 -4
  39. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/src/iperf3_lib/_cancellation.py +3 -2
  40. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/src/iperf3_lib/_event_capture.py +15 -9
  41. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/src/iperf3_lib/_execution.py +1 -3
  42. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/src/iperf3_lib/_live_event_types.py +10 -1
  43. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/src/iperf3_lib/adaptive.py +47 -15
  44. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/src/iperf3_lib/adaptive_execution.py +5 -0
  45. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/src/iperf3_lib/adaptive_reports.py +12 -0
  46. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/src/iperf3_lib/analysis.py +30 -0
  47. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/src/iperf3_lib/artifacts.py +60 -12
  48. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/src/iperf3_lib/assessments.py +12 -0
  49. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/src/iperf3_lib/async_trials.py +5 -0
  50. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/src/iperf3_lib/concurrent_execution.py +12 -0
  51. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/src/iperf3_lib/concurrent_reports.py +18 -2
  52. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/src/iperf3_lib/concurrent_trials.py +5 -0
  53. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/src/iperf3_lib/config.py +15 -2
  54. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/src/iperf3_lib/events.py +20 -0
  55. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/src/iperf3_lib/exceptions.py +8 -0
  56. iperf3_lib-0.4.2/src/iperf3_lib/exporters/__init__.py +8 -0
  57. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/src/iperf3_lib/exporters/prometheus.py +17 -8
  58. iperf3_lib-0.4.2/src/iperf3_lib/ffi/__init__.py +11 -0
  59. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/src/iperf3_lib/ffi/api.py +13 -2
  60. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/src/iperf3_lib/ffi/symbols.py +5 -0
  61. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/src/iperf3_lib/intent.py +13 -0
  62. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/src/iperf3_lib/iperf_client.py +72 -8
  63. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/src/iperf3_lib/iperf_server.py +7 -4
  64. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/src/iperf3_lib/native_options.py +10 -0
  65. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/src/iperf3_lib/plan_execution.py +10 -0
  66. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/src/iperf3_lib/plan_reports.py +12 -0
  67. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/src/iperf3_lib/reports.py +19 -2
  68. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/src/iperf3_lib/result.py +55 -6
  69. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/src/iperf3_lib/server_config.py +5 -0
  70. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/src/iperf3_lib/sweep_reports.py +11 -0
  71. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/src/iperf3_lib/sweeps.py +22 -1
  72. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/src/iperf3_lib/trials.py +14 -0
  73. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/sweep_helpers.py +29 -3
  74. iperf3_lib-0.4.2/tests/test_ci_scope.py +294 -0
  75. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_concurrent_reports.py +3 -1
  76. iperf3_lib-0.4.2/tests/test_correctness_and_typing.py +529 -0
  77. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_execution_worker.py +2 -1
  78. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_lifecycle_qualification.py +24 -0
  79. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_python_preview.py +5 -2
  80. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_python_preview_policy.py +13 -0
  81. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_release_policy.py +103 -2
  82. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_server_additional.py +12 -1
  83. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_transport_evidence.py +64 -6
  84. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/uv.lock +59 -59
  85. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/zensical.toml +1 -1
  86. iperf3_lib-0.4.0/src/iperf3_lib/exporters/__init__.py +0 -1
  87. iperf3_lib-0.4.0/src/iperf3_lib/ffi/__init__.py +0 -1
  88. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/.dockerignore +0 -0
  89. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/.gitattributes +0 -0
  90. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/.github/ISSUE_TEMPLATE/bug.yml +0 -0
  91. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  92. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/.github/ISSUE_TEMPLATE/feature.yml +0 -0
  93. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/.github/ISSUE_TEMPLATE/task.yml +0 -0
  94. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/.github/dependabot.yml +0 -0
  95. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/.gitignore +0 -0
  96. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/.yaga/change-policy.toml +0 -0
  97. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/.yaga/checks/repository.toml +0 -0
  98. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/.yaga/mode-policy.toml +0 -0
  99. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/.yaga/path-policy.toml +0 -0
  100. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/.yaga/size-policy.toml +0 -0
  101. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/.yaga/tree-policy.toml +0 -0
  102. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/AGENTS.md +0 -0
  103. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/CONTRIBUTING.md +0 -0
  104. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/Dockerfile +0 -0
  105. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/LICENSE +0 -0
  106. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/SECURITY.md +0 -0
  107. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/development/README.md +0 -0
  108. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/development/design/live-event-qualification.md +0 -0
  109. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/development/design/native-event-observations.md +0 -0
  110. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/development/design/native-events-2026-09-26.json +0 -0
  111. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/development/documentation.md +0 -0
  112. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/docs/contributing.md +0 -0
  113. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/docs/design/advanced-execution.md +0 -0
  114. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/docs/design/native-event-observations.md +0 -0
  115. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/docs/documentation.md +0 -0
  116. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/docs/guides/analysis.md +0 -0
  117. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/docs/guides/artifacts.md +0 -0
  118. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/docs/guides/grafana.md +0 -0
  119. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/docs/guides/prometheus.md +0 -0
  120. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/docs/guides/results.md +0 -0
  121. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/docs/reference/configuration.md +0 -0
  122. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/docs/reference/native-options.md +0 -0
  123. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/docs/releasing.md +0 -0
  124. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/docs/roadmap.md +0 -0
  125. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/docs/stylesheets/extra.css +0 -0
  126. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/examples/native_controls.py +0 -0
  127. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/examples/observability/Dockerfile +0 -0
  128. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/examples/observability/README.md +0 -0
  129. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/examples/observability/benchmark.py +0 -0
  130. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/examples/observability/dashboard.json +0 -0
  131. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/examples/observability/dashboards.yml +0 -0
  132. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/examples/observability/datasources.yml +0 -0
  133. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/examples/observability/kustomization.yaml +0 -0
  134. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/examples/observability/namespace.yaml +0 -0
  135. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/examples/observability/prometheus.yml +0 -0
  136. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/examples/observability/stack.yaml +0 -0
  137. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/examples/observability/verify.py +0 -0
  138. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/overrides/404.html +0 -0
  139. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/scripts/check_docs.py +0 -0
  140. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/scripts/qualify_lifecycle.py +0 -0
  141. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/scripts/validate_release.py +0 -0
  142. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/scripts/verify_release_qualification.py +0 -0
  143. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/src/iperf3_lib/__init__.py +0 -0
  144. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/src/iperf3_lib/_event_stream.py +0 -0
  145. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/src/iperf3_lib/_evidence.py +0 -0
  146. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/src/iperf3_lib/_ipc.py +0 -0
  147. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/src/iperf3_lib/_worker.py +0 -0
  148. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/src/iperf3_lib/_worker_lifetime.py +0 -0
  149. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/src/iperf3_lib/capabilities.py +0 -0
  150. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/src/iperf3_lib/py.typed +0 -0
  151. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/_native_resource_inventory.py +0 -0
  152. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/conftest.py +0 -0
  153. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/adaptive/README.md +0 -0
  154. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/adaptive/v1-synthetic.json +0 -0
  155. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/artifacts/README.md +0 -0
  156. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/artifacts/development-v1-original-hashes.json +0 -0
  157. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/artifacts/legacy-end-only.json +0 -0
  158. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/artifacts/v1-failed.json +0 -0
  159. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/artifacts/v1-incomplete.json +0 -0
  160. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/artifacts/v1-native-3.19.1-tcp-bidirectional-client.json +0 -0
  161. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/artifacts/v1-native-3.19.1-tcp-reverse-server.json +0 -0
  162. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/artifacts/v1-native-3.21-sctp-reverse-client.json +0 -0
  163. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/artifacts/v1-native-3.21-tcp-evidence-client.json +0 -0
  164. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/artifacts/v1-native-3.21-tcp-warmup-server.json +0 -0
  165. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/artifacts/v1-native-3.21-udp-bidirectional-client.json +0 -0
  166. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/artifacts/v1-partial-zero-extensions.json +0 -0
  167. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/concurrent-plan-v3.json +0 -0
  168. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/native/3.19.1/sctp-bidirectional-client.json +0 -0
  169. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/native/3.19.1/sctp-bidirectional-server.json +0 -0
  170. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/native/3.19.1/sctp-forward-client.json +0 -0
  171. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/native/3.19.1/sctp-forward-server.json +0 -0
  172. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/native/3.19.1/sctp-reverse-client.json +0 -0
  173. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/native/3.19.1/sctp-reverse-server.json +0 -0
  174. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/native/3.19.1/tcp-bidirectional-client.json +0 -0
  175. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/native/3.19.1/tcp-bidirectional-server.json +0 -0
  176. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/native/3.19.1/tcp-forward-client.json +0 -0
  177. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/native/3.19.1/tcp-forward-server.json +0 -0
  178. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/native/3.19.1/tcp-reverse-client.json +0 -0
  179. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/native/3.19.1/tcp-reverse-server.json +0 -0
  180. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/native/3.19.1/tcp-warmup-client.json +0 -0
  181. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/native/3.19.1/tcp-warmup-server.json +0 -0
  182. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/native/3.19.1/udp-bidirectional-client.json +0 -0
  183. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/native/3.19.1/udp-bidirectional-server.json +0 -0
  184. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/native/3.19.1/udp-client.json +0 -0
  185. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/native/3.19.1/udp-reverse-client.json +0 -0
  186. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/native/3.19.1/udp-reverse-server.json +0 -0
  187. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/native/3.19.1/udp-server.json +0 -0
  188. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/native/3.21/sctp-bidirectional-client.json +0 -0
  189. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/native/3.21/sctp-bidirectional-server.json +0 -0
  190. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/native/3.21/sctp-forward-client.json +0 -0
  191. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/native/3.21/sctp-forward-server.json +0 -0
  192. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/native/3.21/sctp-reverse-client.json +0 -0
  193. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/native/3.21/sctp-reverse-server.json +0 -0
  194. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/native/3.21/tcp-bidirectional-client.json +0 -0
  195. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/native/3.21/tcp-bidirectional-server.json +0 -0
  196. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/native/3.21/tcp-forward-client.json +0 -0
  197. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/native/3.21/tcp-forward-server.json +0 -0
  198. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/native/3.21/tcp-reverse-client.json +0 -0
  199. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/native/3.21/tcp-reverse-server.json +0 -0
  200. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/native/3.21/tcp-warmup-client.json +0 -0
  201. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/native/3.21/tcp-warmup-server.json +0 -0
  202. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/native/3.21/udp-bidirectional-client.json +0 -0
  203. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/native/3.21/udp-bidirectional-server.json +0 -0
  204. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/native/3.21/udp-client.json +0 -0
  205. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/native/3.21/udp-reverse-client.json +0 -0
  206. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/native/3.21/udp-reverse-server.json +0 -0
  207. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/native/3.21/udp-server.json +0 -0
  208. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/native/3.22/sctp-bidirectional-client.json +0 -0
  209. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/native/3.22/sctp-bidirectional-server.json +0 -0
  210. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/native/3.22/sctp-forward-client.json +0 -0
  211. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/native/3.22/sctp-forward-server.json +0 -0
  212. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/native/3.22/sctp-reverse-client.json +0 -0
  213. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/native/3.22/sctp-reverse-server.json +0 -0
  214. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/native/3.22/tcp-bidirectional-client.json +0 -0
  215. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/native/3.22/tcp-bidirectional-server.json +0 -0
  216. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/native/3.22/tcp-forward-client.json +0 -0
  217. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/native/3.22/tcp-forward-server.json +0 -0
  218. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/native/3.22/tcp-reverse-client.json +0 -0
  219. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/native/3.22/tcp-reverse-server.json +0 -0
  220. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/native/3.22/tcp-warmup-client.json +0 -0
  221. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/native/3.22/tcp-warmup-server.json +0 -0
  222. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/native/3.22/udp-bidirectional-client.json +0 -0
  223. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/native/3.22/udp-bidirectional-server.json +0 -0
  224. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/native/3.22/udp-client.json +0 -0
  225. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/native/3.22/udp-reverse-client.json +0 -0
  226. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/native/3.22/udp-reverse-server.json +0 -0
  227. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/native/3.22/udp-server.json +0 -0
  228. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/native/README.md +0 -0
  229. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/native/capture.py +0 -0
  230. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/plan-reports/README.md +0 -0
  231. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/plan-reports/v2-cancelled-synthetic.json +0 -0
  232. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/reports/v1/README.md +0 -0
  233. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/reports/v1/baseline-pass.json +0 -0
  234. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/reports/v1/partial-failure.json +0 -0
  235. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/sweeps/README.md +0 -0
  236. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/fixtures/sweeps/v1-synthetic.json +0 -0
  237. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_adaptive.py +0 -0
  238. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_adaptive_execution.py +0 -0
  239. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_adaptive_integration.py +0 -0
  240. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_adaptive_reports.py +0 -0
  241. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_advanced_client_results.py +0 -0
  242. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_analysis.py +0 -0
  243. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_artifacts.py +0 -0
  244. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_assessments.py +0 -0
  245. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_async_trials.py +0 -0
  246. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_async_trials_integration.py +0 -0
  247. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_cancellation_integration.py +0 -0
  248. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_cancellation_ownership.py +0 -0
  249. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_capabilities.py +0 -0
  250. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_client_async_and_result.py +0 -0
  251. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_client_branches.py +0 -0
  252. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_client_integration_configs.py +0 -0
  253. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_client_mocked.py +0 -0
  254. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_client_more.py +0 -0
  255. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_concurrent_trials.py +0 -0
  256. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_concurrent_trials_integration.py +0 -0
  257. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_config.py +0 -0
  258. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_config_native_controls.py +0 -0
  259. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_docker_validate.py +0 -0
  260. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_docs.py +0 -0
  261. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_event_capture.py +0 -0
  262. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_event_stream.py +0 -0
  263. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_extended_compatibility.py +0 -0
  264. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_extended_configuration_contracts.py +0 -0
  265. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_ffi_dlopen.py +0 -0
  266. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_ffi_load.py +0 -0
  267. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_installed_smoke.py +0 -0
  268. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_intent.py +0 -0
  269. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_intent_integration.py +0 -0
  270. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_ipc.py +0 -0
  271. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_live_event_evidence.py +0 -0
  272. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_live_event_types.py +0 -0
  273. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_live_events_integration.py +0 -0
  274. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_native_controls_integration.py +0 -0
  275. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_native_options.py +0 -0
  276. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_native_resource_inventory.py +0 -0
  277. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_observability_example.py +0 -0
  278. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_plan_reports.py +0 -0
  279. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_prometheus_exporter.py +0 -0
  280. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_public_api.py +0 -0
  281. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_release_qualification.py +0 -0
  282. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_reports.py +0 -0
  283. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_resource_stress_integration.py +0 -0
  284. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_result_native_fixtures.py +0 -0
  285. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_result_normalization.py +0 -0
  286. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_server.py +0 -0
  287. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_server_config.py +0 -0
  288. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_server_integration.py +0 -0
  289. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_server_iteration.py +0 -0
  290. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_server_serve_once.py +0 -0
  291. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_sweep_reports.py +0 -0
  292. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_sweeps.py +0 -0
  293. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_sweeps_integration.py +0 -0
  294. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_trials.py +0 -0
  295. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_trials_integration.py +0 -0
  296. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_worker_ipc_integration.py +0 -0
  297. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_worker_lifetime.py +0 -0
  298. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_worker_lifetime_integration.py +0 -0
  299. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/test_worker_protocol.py +0 -0
  300. {iperf3_lib-0.4.0 → iperf3_lib-0.4.2}/tests/trial_helpers.py +0 -0
@@ -20,6 +20,30 @@ concurrency:
20
20
  cancel-in-progress: true
21
21
 
22
22
  jobs:
23
+ scope:
24
+ name: CI scope
25
+ runs-on: ubuntu-latest
26
+ timeout-minutes: 5
27
+ outputs:
28
+ native-required: ${{ steps.scope.outputs.native-required }}
29
+ steps:
30
+ - name: Check out exact event revision and comparison history
31
+ uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
32
+ with:
33
+ ref: ${{ github.event.pull_request.head.sha || github.sha }}
34
+ fetch-depth: 0
35
+ persist-credentials: false
36
+ - name: Select required CI coverage
37
+ id: scope
38
+ env:
39
+ EVENT_NAME: ${{ github.event_name }}
40
+ BASE_SHA: ${{ github.event.pull_request.base.sha || github.event.before }}
41
+ HEAD_SHA: ${{ github.event.pull_request.head.sha || github.sha }}
42
+ run: >-
43
+ python scripts/ci_scope.py detect
44
+ --event "$EVENT_NAME" --base "$BASE_SHA" --head "$HEAD_SHA"
45
+ --github-output "$GITHUB_OUTPUT" --summary "$GITHUB_STEP_SUMMARY"
46
+
23
47
  lint-and-types:
24
48
  name: lint-and-types
25
49
  runs-on: ubuntu-latest
@@ -36,7 +60,7 @@ jobs:
36
60
 
37
61
  - name: Install uv and Python
38
62
  id: setup-uv
39
- uses: astral-sh/setup-uv@c18668ad3cf93ea998bef934396af7bb5c839dc7 # v10.2.0
63
+ uses: astral-sh/setup-uv@07a047e608db84b3d8c06cd9a7c7dcc9c355c18e # v10.3.2
40
64
  with:
41
65
  python-version: "3.12"
42
66
  enable-cache: true
@@ -73,7 +97,7 @@ jobs:
73
97
  --github-output "$GITHUB_OUTPUT"
74
98
 
75
99
  - name: Retain the exact lifecycle qualification distributions
76
- uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
100
+ uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
77
101
  with:
78
102
  name: lifecycle-distributions
79
103
  path: lifecycle-dist/*
@@ -93,12 +117,13 @@ jobs:
93
117
  fetch-depth: 0
94
118
  persist-credentials: false
95
119
  - name: Check pull request title and commits
96
- uses: dariuszpanas/yaga/actions/commit-check@f61bbfa878447157239bb92ff67977bd64400afd # v0.2.0
120
+ uses: dariuszpanas/yaga/actions/commit-check@fe0a4b219002c7f49eee055f1fd7ef9c8ccd526f # v0.3.0
97
121
 
98
122
  docker-matrix-tests:
99
123
  name: docker (${{ matrix.python }}, iperf ${{ matrix.iperf }})
100
124
  runs-on: ubuntu-latest
101
- needs: lint-and-types
125
+ needs: [scope, lint-and-types]
126
+ if: needs.scope.outputs.native-required == 'true'
102
127
  timeout-minutes: 45
103
128
  strategy:
104
129
  fail-fast: false
@@ -119,7 +144,7 @@ jobs:
119
144
  persist-credentials: false
120
145
 
121
146
  - name: Download the retained wheel, sdist and source manifest
122
- uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
147
+ uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2
123
148
  with:
124
149
  name: lifecycle-distributions
125
150
  path: lifecycle-dist
@@ -175,7 +200,7 @@ jobs:
175
200
 
176
201
  - name: Retain installed lifecycle receipts and test logs
177
202
  if: always()
178
- uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
203
+ uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
179
204
  with:
180
205
  name: lifecycle-py${{ matrix.python }}-iperf${{ matrix.iperf }}
181
206
  path: lifecycle-evidence/*
@@ -185,19 +210,21 @@ jobs:
185
210
  ci:
186
211
  name: ci
187
212
  runs-on: ubuntu-latest
188
- needs: [lint-and-types, commit-policy, docker-matrix-tests]
213
+ needs: [scope, lint-and-types, commit-policy, docker-matrix-tests]
189
214
  if: ${{ always() }}
190
215
  timeout-minutes: 5
191
216
  steps:
217
+ - name: Check out exact event revision
218
+ uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
219
+ with:
220
+ ref: ${{ github.event.pull_request.head.sha || github.sha }}
221
+ persist-credentials: false
192
222
  - name: Verify required jobs
193
223
  env:
224
+ SCOPE_RESULT: ${{ needs.scope.result }}
225
+ NATIVE_REQUIRED: ${{ needs.scope.outputs.native-required }}
194
226
  LINT_RESULT: ${{ needs.lint-and-types.result }}
195
- TEST_RESULT: ${{ needs.docker-matrix-tests.result }}
227
+ NATIVE_RESULT: ${{ needs.docker-matrix-tests.result }}
196
228
  COMMIT_RESULT: ${{ needs.commit-policy.result }}
197
229
  EVENT_NAME: ${{ github.event_name }}
198
- run: |
199
- test "$LINT_RESULT" = "success"
200
- test "$TEST_RESULT" = "success"
201
- if [ "$EVENT_NAME" = "pull_request" ]; then
202
- test "$COMMIT_RESULT" = "success"
203
- fi
230
+ run: python scripts/ci_scope.py gate
@@ -24,7 +24,7 @@ jobs:
24
24
  with:
25
25
  persist-credentials: false
26
26
  - name: Install uv and Python
27
- uses: astral-sh/setup-uv@c18668ad3cf93ea998bef934396af7bb5c839dc7 # v10.2.0
27
+ uses: astral-sh/setup-uv@07a047e608db84b3d8c06cd9a7c7dcc9c355c18e # v10.3.2
28
28
  with:
29
29
  python-version: "3.12"
30
30
  enable-cache: true
@@ -29,7 +29,7 @@ jobs:
29
29
  fetch-depth: 0
30
30
  persist-credentials: false
31
31
  - name: Install stable build tools
32
- uses: astral-sh/setup-uv@c18668ad3cf93ea998bef934396af7bb5c839dc7 # v10.2.0
32
+ uses: astral-sh/setup-uv@07a047e608db84b3d8c06cd9a7c7dcc9c355c18e # v10.3.2
33
33
  with:
34
34
  python-version: "3.12"
35
35
  - name: Qualify source before native execution
@@ -54,7 +54,7 @@ jobs:
54
54
  --distributions preview-dist --revision "$SOURCE_REVISION" \
55
55
  --github-output "$GITHUB_OUTPUT"
56
56
  - name: Retain preview distributions and manifest
57
- uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
57
+ uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
58
58
  with:
59
59
  name: python-preview-distributions
60
60
  path: preview-dist/*
@@ -77,7 +77,7 @@ jobs:
77
77
  ref: ${{ needs.build.outputs.revision }}
78
78
  persist-credentials: false
79
79
  - name: Download the same preview distributions
80
- uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
80
+ uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2
81
81
  with:
82
82
  name: python-preview-distributions
83
83
  path: preview-dist
@@ -96,7 +96,7 @@ jobs:
96
96
  cache-to: type=gha,mode=max,scope=preview-base-iperf${{ matrix.iperf }}
97
97
  - name: Install the exact candidate interpreter in a separate environment
98
98
  run: |
99
- docker pull ghcr.io/astral-sh/uv:0.12.23@sha256:dd2385ac82b9aff6489344ec2b22916db986eb135454d030bce3038c7598a689
99
+ docker pull ghcr.io/astral-sh/uv:0.13.5@sha256:32a7bb39b496babbd997b0a39a4d66c126bdaf5661b302bf6f06abda8deca6ff
100
100
  docker build --builder default --load -f Dockerfile.preview \
101
101
  --build-arg NATIVE_IMAGE=iperf3-lib-preview-base:local \
102
102
  -t iperf3-lib-preview:local .
@@ -107,7 +107,7 @@ jobs:
107
107
  run: |
108
108
  mkdir -p preview-evidence
109
109
  docker image inspect iperf3-lib-preview:local > preview-evidence/image.json
110
- docker image inspect ghcr.io/astral-sh/uv:0.12.23@sha256:dd2385ac82b9aff6489344ec2b22916db986eb135454d030bce3038c7598a689 > preview-evidence/uv-image.json
110
+ docker image inspect ghcr.io/astral-sh/uv:0.13.5@sha256:32a7bb39b496babbd997b0a39a4d66c126bdaf5661b302bf6f06abda8deca6ff > preview-evidence/uv-image.json
111
111
  docker run --rm -v "${{ github.workspace }}/preview-evidence:/evidence" \
112
112
  iperf3-lib-preview:local \
113
113
  /opt/preview-venv/bin/python -I /app/scripts/python_preview.py \
@@ -170,7 +170,7 @@ jobs:
170
170
  '
171
171
  - name: Retain preview runtime, installed receipts and logs
172
172
  if: always()
173
- uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
173
+ uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
174
174
  with:
175
175
  name: python-preview-rc3-iperf${{ matrix.iperf }}
176
176
  path: preview-evidence/**
@@ -44,7 +44,7 @@ jobs:
44
44
  fetch-depth: 0
45
45
  persist-credentials: false
46
46
  - name: Install uv and Python
47
- uses: astral-sh/setup-uv@c18668ad3cf93ea998bef934396af7bb5c839dc7 # v10.2.0
47
+ uses: astral-sh/setup-uv@07a047e608db84b3d8c06cd9a7c7dcc9c355c18e # v10.3.2
48
48
  with:
49
49
  python-version: "3.12"
50
50
  enable-cache: true
@@ -90,7 +90,7 @@ jobs:
90
90
  --distributions dist --manifest release-evidence/lifecycle-manifest.json \
91
91
  --revision "$EXPECTED_REVISION" --github-output "$GITHUB_OUTPUT"
92
92
  - name: Upload retained distributions and identity manifest
93
- uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
93
+ uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
94
94
  with:
95
95
  name: release-bundle
96
96
  path: |
@@ -123,7 +123,7 @@ jobs:
123
123
  ref: ${{ needs.build.outputs.revision }}
124
124
  persist-credentials: false
125
125
  - name: Download retained release bundle
126
- uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
126
+ uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2
127
127
  with:
128
128
  name: release-bundle
129
129
  - name: Verify retained distribution hashes
@@ -212,7 +212,7 @@ jobs:
212
212
  '
213
213
  - name: Retain installed-native evidence
214
214
  if: always()
215
- uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
215
+ uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
216
216
  with:
217
217
  name: native-evidence-py${{ matrix.python }}-iperf${{ matrix.iperf }}
218
218
  path: native-evidence/*.json
@@ -239,7 +239,7 @@ jobs:
239
239
  --python "$PYTHON_VERSION" --native "$IPERF3_VERSION" --output /evidence
240
240
  - name: Retain installed lifecycle receipts and logs
241
241
  if: always()
242
- uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
242
+ uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
243
243
  with:
244
244
  name: lifecycle-evidence-py${{ matrix.python }}-iperf${{ matrix.iperf }}
245
245
  path: lifecycle-evidence/*
@@ -266,20 +266,20 @@ jobs:
266
266
  ref: ${{ needs.build.outputs.revision }}
267
267
  persist-credentials: false
268
268
  - name: Install qualification verifier dependencies
269
- uses: astral-sh/setup-uv@c18668ad3cf93ea998bef934396af7bb5c839dc7 # v10.2.0
269
+ uses: astral-sh/setup-uv@07a047e608db84b3d8c06cd9a7c7dcc9c355c18e # v10.3.2
270
270
  with:
271
271
  python-version: "3.12"
272
272
  - name: Download retained release bundle
273
- uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
273
+ uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2
274
274
  with:
275
275
  name: release-bundle
276
276
  - name: Download all installed smoke receipts
277
- uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
277
+ uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2
278
278
  with:
279
279
  pattern: native-evidence-py*
280
280
  path: retained/smoke
281
281
  - name: Download all installed lifecycle receipts and logs
282
- uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
282
+ uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2
283
283
  with:
284
284
  pattern: lifecycle-evidence-py*
285
285
  path: retained/lifecycle
@@ -302,7 +302,7 @@ jobs:
302
302
  --output release-evidence/qualification.json
303
303
  echo "Qualified revision: $EXPECTED_REVISION" >> "$GITHUB_STEP_SUMMARY"
304
304
  - name: Retain the verified release qualification index
305
- uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
305
+ uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
306
306
  with:
307
307
  name: release-qualification
308
308
  path: release-evidence/qualification.json
@@ -322,7 +322,7 @@ jobs:
322
322
  id-token: write
323
323
  steps:
324
324
  - name: Download retained release bundle
325
- uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
325
+ uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2
326
326
  with:
327
327
  name: release-bundle
328
328
  - name: Verify retained distribution hashes
@@ -356,7 +356,7 @@ jobs:
356
356
  raise SystemExit(f"Release artifact changed: {name}")
357
357
  PY
358
358
  - name: Publish to TestPyPI
359
- uses: pypa/gh-action-pypi-publish@dc37677b2e1c63e2034f94d8a5b11f265b73ba33 # v1.14.2
359
+ uses: pypa/gh-action-pypi-publish@7245906fb61fa33a13554f9d5fb856fe61758086 # v1.14.3
360
360
  with:
361
361
  repository-url: https://test.pypi.org/legacy/
362
362
 
@@ -373,7 +373,7 @@ jobs:
373
373
  id-token: write
374
374
  steps:
375
375
  - name: Download retained release bundle
376
- uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
376
+ uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2
377
377
  with:
378
378
  name: release-bundle
379
379
  - name: Verify retained distribution hashes
@@ -407,7 +407,7 @@ jobs:
407
407
  raise SystemExit(f"Release artifact changed: {name}")
408
408
  PY
409
409
  - name: Publish to PyPI
410
- uses: pypa/gh-action-pypi-publish@dc37677b2e1c63e2034f94d8a5b11f265b73ba33 # v1.14.2
410
+ uses: pypa/gh-action-pypi-publish@7245906fb61fa33a13554f9d5fb856fe61758086 # v1.14.3
411
411
 
412
412
  github-release:
413
413
  name: Create GitHub release from retained artifacts
@@ -419,7 +419,7 @@ jobs:
419
419
  contents: write
420
420
  steps:
421
421
  - name: Download retained release bundle
422
- uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
422
+ uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2
423
423
  with:
424
424
  name: release-bundle
425
425
  - name: Verify retained distribution hashes
@@ -453,7 +453,7 @@ jobs:
453
453
  raise SystemExit(f"Release artifact changed: {name}")
454
454
  PY
455
455
  - name: Download verified qualification index
456
- uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
456
+ uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2
457
457
  with:
458
458
  name: release-qualification
459
459
  path: release-evidence
@@ -1,7 +1,7 @@
1
1
  # The native image is built from the unchanged Dockerfile for each libiperf endpoint.
2
2
  ARG NATIVE_IMAGE
3
3
 
4
- FROM ghcr.io/astral-sh/uv:0.13.0@sha256:cdc6093146eb3ff6a40107b38f008b789e050e77ad87865e381d9917da55a168 AS preview-uv
4
+ FROM ghcr.io/astral-sh/uv:0.13.5@sha256:32a7bb39b496babbd997b0a39a4d66c126bdaf5661b302bf6f06abda8deca6ff AS preview-uv
5
5
  FROM ${NATIVE_IMAGE}
6
6
 
7
7
  COPY --from=preview-uv /uv /uvx /usr/local/bin/
@@ -83,9 +83,9 @@ docs-serve:
83
83
  $(UV) run --frozen zensical serve
84
84
 
85
85
  build:
86
- $(UV) build --no-sources
87
- $(UV) run --frozen --no-dev --group release twine check dist/*
88
- $(UV) run --frozen --no-dev --group release check-wheel-contents dist/*.whl
86
+ $(UV) build --no-sources --clear
87
+ $(UV) run --frozen --isolated --no-dev --group release twine check dist/*
88
+ $(UV) run --frozen --isolated --no-dev --group release check-wheel-contents dist/*.whl
89
89
 
90
90
  docker-build:
91
91
  $(UV) run --frozen python scripts/docker_validate.py build \
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: iperf3-lib
3
- Version: 0.4.0
3
+ Version: 0.4.2
4
4
  Summary: Programmable network benchmarking and analysis powered by libiperf.
5
5
  Project-URL: Homepage, https://github.com/dariuszpanas/iperf3-lib
6
6
  Project-URL: Documentation, https://dariuszpanas.github.io/iperf3-lib/
@@ -80,13 +80,13 @@ Python **3.12–3.15** with the standard GIL is supported. Stable CI and release
80
80
  qualification cover all four Python versions against both native endpoints,
81
81
  including installed wheel and sdist checks.
82
82
 
83
- The **0.4.0 candidate is unreleased**; **0.3.0** is the latest published version.
84
- Documentation follows `main`. The installation guide explains how to choose
83
+ The project has **Beta** maturity. Documentation follows `main`.
84
+ The installation guide explains how to choose
85
85
  between a published package and a source revision; consult the
86
86
  [changelog](https://dariuszpanas.github.io/iperf3-lib/changelog.html) for release
87
87
  status. Upgrade guidance covers
88
88
  [0.2.0 to 0.3.0](https://dariuszpanas.github.io/iperf3-lib/guides/migration-0.3.html)
89
- and [unreleased changes after 0.3.0](https://dariuszpanas.github.io/iperf3-lib/guides/migration-0.4.html).
89
+ and [0.3.0 to 0.4.0](https://dariuszpanas.github.io/iperf3-lib/guides/migration-0.4.html).
90
90
 
91
91
  ## Documentation
92
92
 
@@ -95,11 +95,11 @@ and execution limits.
95
95
 
96
96
  | Topic | Guides and references |
97
97
  | --- | --- |
98
- | Run clients and servers | [Running tests](https://dariuszpanas.github.io/iperf3-lib/guides/running-tests.html) · [Python API](https://dariuszpanas.github.io/iperf3-lib/reference/api.html) |
98
+ | Run clients and servers | [Running tests](https://dariuszpanas.github.io/iperf3-lib/guides/running-tests.html) · [Live events](https://dariuszpanas.github.io/iperf3-lib/guides/live-events.html) · [Python API](https://dariuszpanas.github.io/iperf3-lib/reference/api.html) |
99
99
  | Bind interfaces and tune traffic | [Native-control recipes](https://dariuszpanas.github.io/iperf3-lib/guides/native-controls.html) · [Configuration](https://dariuszpanas.github.io/iperf3-lib/reference/configuration.html) · [Complete native-option inventory](https://dariuszpanas.github.io/iperf3-lib/reference/native-options.html) |
100
100
  | Check support and execution limits | [Compatibility and native setup](https://dariuszpanas.github.io/iperf3-lib/reference/compatibility.html) · [Rate intent and capabilities](https://dariuszpanas.github.io/iperf3-lib/guides/configuration-intent.html) |
101
101
  | Interpret and save measurements | [Results](https://dariuszpanas.github.io/iperf3-lib/guides/results.html) · [Portable artifacts](https://dariuszpanas.github.io/iperf3-lib/guides/artifacts.html) |
102
- | Analyze and compare experiments | [Analysis](https://dariuszpanas.github.io/iperf3-lib/guides/analysis.html) · [Trials and baselines](https://dariuszpanas.github.io/iperf3-lib/guides/trials.html) · [Parameter sweeps](https://dariuszpanas.github.io/iperf3-lib/guides/sweeps.html) |
102
+ | Analyze and compare experiments | [Analysis](https://dariuszpanas.github.io/iperf3-lib/guides/analysis.html) · [Trials and baselines](https://dariuszpanas.github.io/iperf3-lib/guides/trials.html) · [Concurrent plans](https://dariuszpanas.github.io/iperf3-lib/guides/concurrent-plans.html) · [Parameter sweeps](https://dariuszpanas.github.io/iperf3-lib/guides/sweeps.html) · [Adaptive UDP](https://dariuszpanas.github.io/iperf3-lib/guides/adaptive-udp.html) |
103
103
  | Integrate monitoring | [Prometheus](https://dariuszpanas.github.io/iperf3-lib/guides/prometheus.html) · [Grafana](https://dariuszpanas.github.io/iperf3-lib/guides/grafana.html) |
104
104
 
105
105
  ## Contributing
@@ -47,13 +47,13 @@ Python **3.12–3.15** with the standard GIL is supported. Stable CI and release
47
47
  qualification cover all four Python versions against both native endpoints,
48
48
  including installed wheel and sdist checks.
49
49
 
50
- The **0.4.0 candidate is unreleased**; **0.3.0** is the latest published version.
51
- Documentation follows `main`. The installation guide explains how to choose
50
+ The project has **Beta** maturity. Documentation follows `main`.
51
+ The installation guide explains how to choose
52
52
  between a published package and a source revision; consult the
53
53
  [changelog](https://dariuszpanas.github.io/iperf3-lib/changelog.html) for release
54
54
  status. Upgrade guidance covers
55
55
  [0.2.0 to 0.3.0](https://dariuszpanas.github.io/iperf3-lib/guides/migration-0.3.html)
56
- and [unreleased changes after 0.3.0](https://dariuszpanas.github.io/iperf3-lib/guides/migration-0.4.html).
56
+ and [0.3.0 to 0.4.0](https://dariuszpanas.github.io/iperf3-lib/guides/migration-0.4.html).
57
57
 
58
58
  ## Documentation
59
59
 
@@ -62,11 +62,11 @@ and execution limits.
62
62
 
63
63
  | Topic | Guides and references |
64
64
  | --- | --- |
65
- | Run clients and servers | [Running tests](https://dariuszpanas.github.io/iperf3-lib/guides/running-tests.html) · [Python API](https://dariuszpanas.github.io/iperf3-lib/reference/api.html) |
65
+ | Run clients and servers | [Running tests](https://dariuszpanas.github.io/iperf3-lib/guides/running-tests.html) · [Live events](https://dariuszpanas.github.io/iperf3-lib/guides/live-events.html) · [Python API](https://dariuszpanas.github.io/iperf3-lib/reference/api.html) |
66
66
  | Bind interfaces and tune traffic | [Native-control recipes](https://dariuszpanas.github.io/iperf3-lib/guides/native-controls.html) · [Configuration](https://dariuszpanas.github.io/iperf3-lib/reference/configuration.html) · [Complete native-option inventory](https://dariuszpanas.github.io/iperf3-lib/reference/native-options.html) |
67
67
  | Check support and execution limits | [Compatibility and native setup](https://dariuszpanas.github.io/iperf3-lib/reference/compatibility.html) · [Rate intent and capabilities](https://dariuszpanas.github.io/iperf3-lib/guides/configuration-intent.html) |
68
68
  | Interpret and save measurements | [Results](https://dariuszpanas.github.io/iperf3-lib/guides/results.html) · [Portable artifacts](https://dariuszpanas.github.io/iperf3-lib/guides/artifacts.html) |
69
- | Analyze and compare experiments | [Analysis](https://dariuszpanas.github.io/iperf3-lib/guides/analysis.html) · [Trials and baselines](https://dariuszpanas.github.io/iperf3-lib/guides/trials.html) · [Parameter sweeps](https://dariuszpanas.github.io/iperf3-lib/guides/sweeps.html) |
69
+ | Analyze and compare experiments | [Analysis](https://dariuszpanas.github.io/iperf3-lib/guides/analysis.html) · [Trials and baselines](https://dariuszpanas.github.io/iperf3-lib/guides/trials.html) · [Concurrent plans](https://dariuszpanas.github.io/iperf3-lib/guides/concurrent-plans.html) · [Parameter sweeps](https://dariuszpanas.github.io/iperf3-lib/guides/sweeps.html) · [Adaptive UDP](https://dariuszpanas.github.io/iperf3-lib/guides/adaptive-udp.html) |
70
70
  | Integrate monitoring | [Prometheus](https://dariuszpanas.github.io/iperf3-lib/guides/prometheus.html) · [Grafana](https://dariuszpanas.github.io/iperf3-lib/guides/grafana.html) |
71
71
 
72
72
  ## Contributing
@@ -19,6 +19,32 @@ repository policies. `make test` runs non-native tests. Docker is required for
19
19
  workflow lint and the full native suite; see [compatibility](../docs/reference/compatibility.md)
20
20
  for supported versions. Run non-native gates before native tests.
21
21
 
22
+ ## CI coverage for documentation changes
23
+
24
+ Pull requests and main pushes that change only the following documentation
25
+ files skip the eight native Docker jobs:
26
+
27
+ | Location | Allowed files |
28
+ | --- | --- |
29
+ | Repository root | `README.md`, `CONTRIBUTING.md`, `SECURITY.md` |
30
+ | Anywhere under `docs/` or `development/` | `.md`, `.css` and image files |
31
+ | Anywhere under `overrides/` | `.html`, `.css` and image files |
32
+
33
+ Allowed image suffixes are `.png`, `.jpg`, `.jpeg`, `.gif`, `.webp`, `.svg` and
34
+ `.ico`. These paths and suffixes are case-sensitive. Changes must use ordinary
35
+ non-executable files. Changes to any other path, executable or nonregular file
36
+ modes, mixed changes, an empty diff or an uncertain comparison require the full
37
+ native matrix. Renames retain both old and new paths for this decision.
38
+
39
+ Quality checks, non-native unit tests, YAGA policies, the strict documentation
40
+ build, README rendering and local-link checks, and the package build still run.
41
+ The short workflow lint check also remains Docker-backed.
42
+
43
+ The required `ci` result always runs and accepts a skipped native matrix only
44
+ after an explicit documentation-only decision and successful remaining checks.
45
+ Manual and scheduled CI runs still use the full matrix. Release qualification
46
+ and publication always retain their complete native gates.
47
+
22
48
  ## Stable local Docker validation
23
49
 
24
50
  `make docker-build` and `make docker-test` copy the selected checkout into one
@@ -1,6 +1,6 @@
1
1
  # Advanced execution: design and release disposition
2
2
 
3
- Status: **implementation contracts for the unreleased 0.4.0 scope**. The original
3
+ Status: **implementation contracts shipped in 0.4.0**. The original
4
4
  design review and native-event exploration were recorded on 2026-09-26.
5
5
  The [native-control guide](../../docs/guides/native-controls.md) and
6
6
  [live-event guide](../../docs/guides/live-events.md) document the public interfaces.
@@ -18,8 +18,8 @@ criteria have evidence; implementation and collected tests alone are insufficien
18
18
 
19
19
  | Proposal | Decision | Evidence needed for complete qualification |
20
20
  | --- | --- | --- |
21
- | [Adaptive UDP #34](https://github.com/dariuszpanas/iperf3-lib/issues/34) | Qualified and merged through PR69; see the [unreleased guide](../../docs/guides/adaptive-udp.md). | The issue retains exact-source synthetic, minimum/latest native, isolated impairment, and installed wheel/sdist evidence. |
22
- | [Live events #35](https://github.com/dariuszpanas/iperf3-lib/issues/35) | Owned typed async contexts preserve complete-result access and legacy callbacks. | Minimum/latest event assembly, bounded delivery, failure/overflow/abandonment tests, and lifecycle qualification. |
21
+ | [Adaptive UDP #34](https://github.com/dariuszpanas/iperf3-lib/issues/34) | Qualified and merged through PR69; see the [0.4.0 guide](../../docs/guides/adaptive-udp.md). | The issue retains exact-source synthetic, minimum/latest native, isolated impairment, and installed wheel/sdist evidence. |
22
+ | [Live events #35](https://github.com/dariuszpanas/iperf3-lib/issues/35) | Qualified and merged through PR70; see the [0.4.0 live-event guide](../../docs/guides/live-events.md). | The [live-event qualification map](live-event-qualification.md) and issue retain minimum/latest event assembly, bounded delivery, failure/overflow/abandonment, and installed lifecycle evidence. |
23
23
  | [Process isolation #36](https://github.com/dariuszpanas/iperf3-lib/issues/36) | Qualified and merged through PR68. | The [acceptance map](isolated-execution-qualification.md) and issue retain the exact-source installed matrix, bounded transport, partial evidence and resource cleanup qualification. |
24
24
 
25
25
  Native event shapes have been observed in a small loopback experiment. The
@@ -52,7 +52,7 @@ defines the current platform and native-version coverage.
52
52
 
53
53
  ### Admission and evidence
54
54
 
55
- The unreleased implementation is split between `adaptive.py` (pure decisions),
55
+ The 0.4.0 implementation is split between `adaptive.py` (pure decisions),
56
56
  `adaptive_execution.py` (sequential batches) and `adaptive_reports.py` (standalone
57
57
  schema-1 archives). The [user guide](../../docs/guides/adaptive-udp.md) states its
58
58
  explicit limitations and public API. The following criteria remain the
@@ -126,7 +126,7 @@ and all admission limits with controlled observations. Then qualify bounded
126
126
  native mechanics on libiperf 3.19.1 and 3.22 and a controlled impaired link
127
127
  with recorded rate/loss settings. Clean loopback alone cannot validate the
128
128
  loss-threshold algorithm. Explicit finite sweeps remain the published 0.3.0
129
- mechanism; adaptive UDP remains unreleased until separately selected and qualified.
129
+ mechanism; adaptive UDP shipped in 0.4.0 with its separate qualification.
130
130
 
131
131
  ## Typed live events
132
132
 
@@ -186,7 +186,7 @@ and discards future nonterminal payloads; the owner must still drain/clean up
186
186
  the direct run or await an isolated worker's terminal state. Queue bounds do
187
187
  not cancel a native call.
188
188
 
189
- ### Qualification still required
189
+ ### Qualification contract
190
190
 
191
191
  The 22 exploratory probes establish small event-shape observations only.
192
192
  The [live-event qualification map](live-event-qualification.md) connects these
@@ -306,7 +306,7 @@ Truncated or malformed frames invalidate only that worker's channel. Cap
306
306
  pending output, drain while waiting, and reject replayed/wrong-request terminal
307
307
  frames. Waiting for exit while a worker blocks sending its result can deadlock.
308
308
 
309
- ### Qualification still required
309
+ ### Isolated worker qualification contract
310
310
 
311
311
  Test startup/import/native-load failure, malformed/oversized frames, crashes
312
312
  before and after allocation, stalled connection/run, user cancellation,
@@ -327,8 +327,7 @@ design do not establish its cancellation, stress or orphan-cleanup qualification
327
327
 
328
328
  Close each issue only when its implementation and qualification criteria are
329
329
  met, with acceptance checkboxes and retained exact-source evidence reconciled.
330
- Issues #34 and #36 record their completed qualification. The live-event issue
331
- tracks the remaining candidate evidence separately. The native-controls implementation must preserve complete results and
330
+ Issues #34, #35, and #36 record their completed qualification and shipped in 0.4.0. The native-controls implementation must preserve complete results and
332
331
  explicit lifecycle/concurrency limits while its combined source is qualified.
333
332
  Revisit each broader proposal with its own acceptance evidence and release
334
333
  decision; adaptive UDP selection remains separate from explicit sweeps.
@@ -8,7 +8,7 @@ Use the exact candidate commit, retained distributions and current Actions resul
8
8
  | --- | --- | --- |
9
9
  | Concurrent admission and contention | Invocation-local worker and aggregate target-rate caps, endpoint/user-resource exclusion and per-cell dependencies. Targets include streams, directions and warm-ups; wire traffic is measured separately. | Admission/race tests plus positive native traffic from overlapping workers, actual exclusions/rate-cap backfill and schema-v3 reservation histories. |
10
10
  | Comparison methodology | Descriptive analysis by default; comparisons require a declared matched cohort/contention method. Native-setting compatibility alone is insufficient. | The [comparison method](../../docs/guides/concurrent-plans.md#compare-experiments-with-a-declared-contention-policy), complete histories and strict v1/v2 type boundaries. Unknown contention remains inconclusive; no automatic concurrent performance assessment is claimed. |
11
- | Plan and consumer ownership | Cancellation owns every admitted child through cleanup. Callback failure suppresses delivery and propagates after shutdown. The unreleased typed iterator adds an owned context; see its [qualification map](live-event-qualification.md). | Queued/startup/completion races, repeated cancellation, multi-worker cleanup failure retaining original owners, and callback failure after positive native traffic. |
11
+ | Plan and consumer ownership | Cancellation owns every admitted child through cleanup. Callback failure suppresses delivery and propagates after shutdown. The typed iterator added in 0.4.0 provides an owned context; see its [qualification map](live-event-qualification.md). | Queued/startup/completion races, repeated cancellation, multi-worker cleanup failure retaining original owners, and callback failure after positive native traffic. |
12
12
  | Shutdown and grace | Admission-only stops let peers finish; an optional overall deadline bounds that drain. Hard stops have zero natural-completion grace, then TERM/KILL cleanup with retained ownership on failure. | Deadline-after-admission-stop and first-cause tests; actual reaping/closed pipes. Cleanup-attempt budgets do not bound blocked callbacks or Python return time. |
13
13
  | Partial outcomes | Completed results remain artifacts. Interrupted and exceptional trials retain bounded diagnostic events, with unstarted trials explicit. No native summary or C finalizer is invented after a kill. | Existing v1/v2 fixtures, strict v2/v3 reports and saved native report/hash round-trips with positive partial intervals. Sequential SIGKILL and real output-pipe interruption after positive traffic must retain the completed prefix, failed active trial and unstarted suffix over TCP and UDP. |
14
14
  | IPC bounds | Versioned frames, identities/order, bounded queues/control capacity and terminal/EOF/exit validation. Native capture is outside wire/queue bounds. | Malformed, oversized, replayed/truncated and saturated channel tests, including interruption during incomplete output. |
@@ -6,7 +6,7 @@ decision.
6
6
 
7
7
  The published 0.3.0 scope included finite sequential trials, explicit sweeps,
8
8
  expanded native controls, callback events and isolated Python/CFFI workers.
9
- The planned 0.4.0 scope adds owned async and bounded concurrent plans, adaptive
9
+ The published 0.4.0 scope adds owned async and bounded concurrent plans, adaptive
10
10
  UDP experiments, and typed live-event consumption. Their current qualification
11
11
  maps are linked from the [advanced execution design](design/advanced-execution.md).
12
12
  Historical release receipts do not qualify these additions. Release notes and
@@ -24,9 +24,9 @@ GIL configuration. The release verifier rejects prerelease versions.
24
24
  The eight-cell release gate requires **16 smoke and 16 lifecycle receipts,
25
25
  784 selected cases and 2352 passed phases**.
26
26
 
27
- Issue [#63](https://github.com/dariuszpanas/iperf3-lib/issues/63) tracks support
28
- and qualification evidence. Rerun the complete non-publishing release rehearsal
29
- on the final 0.4.0 candidate. Historical RC3 results or an earlier successful
27
+ Issue [#63](https://github.com/dariuszpanas/iperf3-lib/issues/63) retains support
28
+ and qualification evidence. Run the complete non-publishing release rehearsal
29
+ on each final release candidate. Historical RC3 results or an earlier successful
30
30
  candidate cannot replace evidence for that exact source and its retained
31
31
  wheel/sdist pair. Python `>=3.12`, the shared wheel format and the two native
32
32
  endpoints remain unchanged. Free-threaded builds are outside this matrix.
@@ -81,7 +81,9 @@ A successful rehearsal contains:
81
81
  and unit gates, YAGA policy checks, and Docker-backed workflow lint.
82
82
  - One wheel/sdist pair checked with Twine and wheel-content validation.
83
83
  Both embedded descriptions must match the candidate README and render with
84
- valid documentation links. Every absolute documentation URL in the README,
84
+ valid documentation links. The descriptions must be suitable for publication:
85
+ temporary claims such as "unreleased" or "latest published version" are
86
+ rejected. Every absolute documentation URL in the README,
85
87
  including its deployed HTML fragments, is checked alongside the public
86
88
  landing and changelog pages.
87
89
  - A `release-bundle` artifact with those distributions and
@@ -194,16 +196,26 @@ aggregate workflow result together before publication.
194
196
  deferred to a later version.
195
197
  2. Update `project.version` in `pyproject.toml` and the local project identity
196
198
  in `uv.lock`. Keep historical artifact producer identities unchanged. Record
197
- selected changes under a versioned **unreleased candidate** heading in the
198
- [changelog](../docs/changelog.md); a metadata version does not establish publication.
199
- Update installation examples, migration instructions, and the banner
200
- together. Keep the README's documentation links current; release history
201
- and version-specific instructions belong in the linked pages.
202
- 3. Run local quality/unit gates before the Docker/native matrix. Merge the
203
- candidate through the normal required checks, then run a build-only hosted
204
- rehearsal for the resulting exact commit. Inspect the retained distributions,
199
+ selected changes under a version heading in the
200
+ [changelog](../docs/changelog.md), without a publication date until upload
201
+ succeeds; a metadata version does not establish publication. Track candidate
202
+ status in the release issue. Prepare installation examples and migration
203
+ instructions together, and update the site's latest-release banner after
204
+ publication. Keep the packaged README release-neutral: no "unreleased",
205
+ "not yet published" or "latest published version" claims. Factual feature
206
+ availability, compatibility, Beta maturity and migration links are appropriate.
207
+ Release status and dates belong in the linked changelog and release pages.
208
+ 3. Run local quality/unit gates and build preview wheel/sdist archives. Inspect
209
+ their embedded, rendered README as the eventual PyPI description before
210
+ accepting the candidate for native qualification. Confirm that its wording
211
+ will remain true after publication; rendering and matching hashes alone do
212
+ not check this. PyPI retains the first uploaded description and cannot apply
213
+ a later repository edit to that release. Then run the Docker/native matrix,
214
+ merge through the normal required checks, and run a nonpublishing hosted
215
+ qualification for the resulting exact commit. Inspect the retained distributions,
205
216
  hashes, and every installed-native receipt.
206
- 4. Inspect the rendered README and deployed documentation anonymously. Confirm
217
+ 4. Inspect the retained artifacts' rendered README and deployed documentation
218
+ anonymously. Confirm
207
219
  the Pages revision, actual page content, and public links. The automated
208
220
  HTTP checks alone do not establish that the intended revision is displayed.
209
221
  5. For measurement/exporter changes, also require the real
@@ -211,8 +223,11 @@ aggregate workflow result together before publication.
211
223
  or a string comparison of metrics is insufficient.
212
224
  6. After qualification, obtain the explicit publication decision. Only an
213
225
  actual publication establishes a release date and permits changing the
214
- changelog's candidate status. Do not rebuild qualified distribution bytes
215
- merely to remove a temporary publication-status sentence from their README.
226
+ changelog's publication date. If any packaged content, including its README,
227
+ needs correction after qualification, prepare a new candidate and repeat
228
+ exact-source qualification before publishing. Never publish a known stale
229
+ description to preserve an earlier qualification. Once published, retain the
230
+ immutable distribution bytes; a description correction needs a new release.
216
231
  7. Verify the registry's trusted-publisher configuration and intended publishing
217
232
  environment restrictions before selecting a publication target. The workflow
218
233
  does not create or administratively configure those settings for a rehearsal.
@@ -224,7 +239,7 @@ and post releases are not part of this publication policy.
224
239
  Validate a planned tag against the current metadata:
225
240
 
226
241
  ```bash
227
- uv run --no-project python scripts/validate_release.py --tag v0.4.0
242
+ uv run --no-project python scripts/validate_release.py --tag v0.4.2
228
243
  ```
229
244
 
230
245
  That local metadata check alone does not qualify the candidate. The workflow
@@ -258,6 +273,10 @@ assets and their hashes against the retained manifest. Install the published
258
273
  package in a clean environment, check version and lazy import, and run a
259
274
  native smoke with a supported library. Inspect the public PyPI description
260
275
  and its documentation links without maintainer authentication.
276
+ Check that the description's wording is correct for the published release;
277
+ matching the qualified source does not establish semantic correctness. Keep the
278
+ release checklist open if this fails. A newer release can correct the default
279
+ project page, but the old version's description remains immutable.
261
280
 
262
281
  If publication is interrupted, inspect which files reached the registry
263
282
  before retrying. Published files cannot be overwritten. If only GitHub Release