iperf3-lib 0.4.1__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.1 → iperf3_lib-0.4.2}/.github/workflows/ci.yml +41 -14
  2. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/.github/workflows/docs.yml +1 -1
  3. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/.github/workflows/python-preview.yml +6 -6
  4. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/.github/workflows/release.yml +16 -16
  5. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/Dockerfile.preview +1 -1
  6. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/Makefile +3 -3
  7. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/PKG-INFO +3 -3
  8. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/README.md +2 -2
  9. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/development/contributing.md +26 -0
  10. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/development/design/advanced-execution.md +4 -5
  11. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/development/releasing.md +3 -3
  12. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/development/roadmap.md +16 -4
  13. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/docker-entrypoint.sh +4 -3
  14. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/docs/changelog.md +36 -1
  15. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/docs/getting-started.md +8 -7
  16. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/docs/guides/choosing-an-integration.md +2 -2
  17. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/docs/guides/configuration-intent.md +4 -4
  18. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/docs/guides/migration-0.3.md +3 -2
  19. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/docs/guides/native-controls.md +1 -1
  20. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/docs/guides/running-tests.md +3 -3
  21. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/docs/index.md +9 -9
  22. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/docs/reference/api.md +7 -4
  23. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/docs/reference/compatibility.md +87 -8
  24. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/docs/security.md +2 -2
  25. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/overrides/main.html +1 -1
  26. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/pyproject.toml +3 -3
  27. iperf3_lib-0.4.2/scripts/ci_scope.py +200 -0
  28. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/scripts/docker_validate.py +2 -2
  29. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/scripts/python_preview.py +4 -4
  30. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/scripts/smoke_release.py +9 -4
  31. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/src/iperf3_lib/_cancellation.py +3 -2
  32. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/src/iperf3_lib/_event_capture.py +15 -9
  33. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/src/iperf3_lib/_execution.py +1 -3
  34. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/src/iperf3_lib/_live_event_types.py +10 -1
  35. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/src/iperf3_lib/adaptive.py +47 -15
  36. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/src/iperf3_lib/adaptive_execution.py +5 -0
  37. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/src/iperf3_lib/adaptive_reports.py +12 -0
  38. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/src/iperf3_lib/analysis.py +30 -0
  39. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/src/iperf3_lib/artifacts.py +60 -12
  40. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/src/iperf3_lib/assessments.py +12 -0
  41. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/src/iperf3_lib/async_trials.py +5 -0
  42. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/src/iperf3_lib/concurrent_execution.py +12 -0
  43. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/src/iperf3_lib/concurrent_reports.py +18 -2
  44. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/src/iperf3_lib/concurrent_trials.py +5 -0
  45. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/src/iperf3_lib/config.py +15 -2
  46. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/src/iperf3_lib/events.py +20 -0
  47. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/src/iperf3_lib/exceptions.py +8 -0
  48. iperf3_lib-0.4.2/src/iperf3_lib/exporters/__init__.py +8 -0
  49. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/src/iperf3_lib/exporters/prometheus.py +17 -8
  50. iperf3_lib-0.4.2/src/iperf3_lib/ffi/__init__.py +11 -0
  51. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/src/iperf3_lib/ffi/api.py +13 -2
  52. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/src/iperf3_lib/ffi/symbols.py +5 -0
  53. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/src/iperf3_lib/intent.py +13 -0
  54. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/src/iperf3_lib/iperf_client.py +72 -8
  55. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/src/iperf3_lib/iperf_server.py +7 -4
  56. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/src/iperf3_lib/native_options.py +10 -0
  57. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/src/iperf3_lib/plan_execution.py +10 -0
  58. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/src/iperf3_lib/plan_reports.py +12 -0
  59. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/src/iperf3_lib/reports.py +19 -2
  60. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/src/iperf3_lib/result.py +55 -6
  61. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/src/iperf3_lib/server_config.py +5 -0
  62. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/src/iperf3_lib/sweep_reports.py +11 -0
  63. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/src/iperf3_lib/sweeps.py +22 -1
  64. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/src/iperf3_lib/trials.py +14 -0
  65. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/sweep_helpers.py +29 -3
  66. iperf3_lib-0.4.2/tests/test_ci_scope.py +294 -0
  67. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_concurrent_reports.py +3 -1
  68. iperf3_lib-0.4.2/tests/test_correctness_and_typing.py +529 -0
  69. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_execution_worker.py +2 -1
  70. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_lifecycle_qualification.py +24 -0
  71. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_python_preview.py +5 -2
  72. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_python_preview_policy.py +13 -0
  73. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_server_additional.py +12 -1
  74. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_transport_evidence.py +64 -6
  75. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/uv.lock +59 -59
  76. iperf3_lib-0.4.1/src/iperf3_lib/exporters/__init__.py +0 -1
  77. iperf3_lib-0.4.1/src/iperf3_lib/ffi/__init__.py +0 -1
  78. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/.dockerignore +0 -0
  79. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/.gitattributes +0 -0
  80. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/.github/ISSUE_TEMPLATE/bug.yml +0 -0
  81. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  82. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/.github/ISSUE_TEMPLATE/feature.yml +0 -0
  83. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/.github/ISSUE_TEMPLATE/task.yml +0 -0
  84. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/.github/dependabot.yml +0 -0
  85. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/.gitignore +0 -0
  86. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/.yaga/change-policy.toml +0 -0
  87. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/.yaga/checks/repository.toml +0 -0
  88. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/.yaga/mode-policy.toml +0 -0
  89. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/.yaga/path-policy.toml +0 -0
  90. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/.yaga/size-policy.toml +0 -0
  91. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/.yaga/tree-policy.toml +0 -0
  92. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/AGENTS.md +0 -0
  93. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/CONTRIBUTING.md +0 -0
  94. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/Dockerfile +0 -0
  95. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/LICENSE +0 -0
  96. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/SECURITY.md +0 -0
  97. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/development/README.md +0 -0
  98. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/development/design/isolated-execution-qualification.md +0 -0
  99. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/development/design/live-event-qualification.md +0 -0
  100. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/development/design/native-event-observations.md +0 -0
  101. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/development/design/native-events-2026-09-26.json +0 -0
  102. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/development/documentation.md +0 -0
  103. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/docs/contributing.md +0 -0
  104. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/docs/design/advanced-execution.md +0 -0
  105. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/docs/design/native-event-observations.md +0 -0
  106. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/docs/documentation.md +0 -0
  107. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/docs/guides/adaptive-udp.md +0 -0
  108. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/docs/guides/analysis.md +0 -0
  109. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/docs/guides/artifacts.md +0 -0
  110. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/docs/guides/concurrent-plans.md +0 -0
  111. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/docs/guides/grafana.md +0 -0
  112. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/docs/guides/live-events.md +0 -0
  113. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/docs/guides/migration-0.4.md +0 -0
  114. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/docs/guides/prometheus.md +0 -0
  115. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/docs/guides/results.md +0 -0
  116. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/docs/guides/sweeps.md +0 -0
  117. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/docs/guides/trials.md +0 -0
  118. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/docs/reference/configuration.md +0 -0
  119. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/docs/reference/native-options.md +0 -0
  120. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/docs/releasing.md +0 -0
  121. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/docs/roadmap.md +0 -0
  122. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/docs/stylesheets/extra.css +0 -0
  123. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/examples/native_controls.py +0 -0
  124. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/examples/observability/Dockerfile +0 -0
  125. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/examples/observability/README.md +0 -0
  126. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/examples/observability/benchmark.py +0 -0
  127. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/examples/observability/dashboard.json +0 -0
  128. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/examples/observability/dashboards.yml +0 -0
  129. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/examples/observability/datasources.yml +0 -0
  130. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/examples/observability/kustomization.yaml +0 -0
  131. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/examples/observability/namespace.yaml +0 -0
  132. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/examples/observability/prometheus.yml +0 -0
  133. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/examples/observability/stack.yaml +0 -0
  134. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/examples/observability/verify.py +0 -0
  135. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/overrides/404.html +0 -0
  136. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/scripts/check_docs.py +0 -0
  137. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/scripts/qualify_lifecycle.py +0 -0
  138. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/scripts/release_artifacts.py +0 -0
  139. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/scripts/validate_release.py +0 -0
  140. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/scripts/verify_release_qualification.py +0 -0
  141. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/src/iperf3_lib/__init__.py +0 -0
  142. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/src/iperf3_lib/_event_stream.py +0 -0
  143. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/src/iperf3_lib/_evidence.py +0 -0
  144. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/src/iperf3_lib/_ipc.py +0 -0
  145. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/src/iperf3_lib/_worker.py +0 -0
  146. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/src/iperf3_lib/_worker_lifetime.py +0 -0
  147. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/src/iperf3_lib/capabilities.py +0 -0
  148. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/src/iperf3_lib/py.typed +0 -0
  149. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/_native_resource_inventory.py +0 -0
  150. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/conftest.py +0 -0
  151. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/adaptive/README.md +0 -0
  152. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/adaptive/v1-synthetic.json +0 -0
  153. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/artifacts/README.md +0 -0
  154. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/artifacts/development-v1-original-hashes.json +0 -0
  155. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/artifacts/legacy-end-only.json +0 -0
  156. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/artifacts/v1-failed.json +0 -0
  157. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/artifacts/v1-incomplete.json +0 -0
  158. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/artifacts/v1-native-3.19.1-tcp-bidirectional-client.json +0 -0
  159. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/artifacts/v1-native-3.19.1-tcp-reverse-server.json +0 -0
  160. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/artifacts/v1-native-3.21-sctp-reverse-client.json +0 -0
  161. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/artifacts/v1-native-3.21-tcp-evidence-client.json +0 -0
  162. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/artifacts/v1-native-3.21-tcp-warmup-server.json +0 -0
  163. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/artifacts/v1-native-3.21-udp-bidirectional-client.json +0 -0
  164. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/artifacts/v1-partial-zero-extensions.json +0 -0
  165. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/concurrent-plan-v3.json +0 -0
  166. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/native/3.19.1/sctp-bidirectional-client.json +0 -0
  167. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/native/3.19.1/sctp-bidirectional-server.json +0 -0
  168. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/native/3.19.1/sctp-forward-client.json +0 -0
  169. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/native/3.19.1/sctp-forward-server.json +0 -0
  170. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/native/3.19.1/sctp-reverse-client.json +0 -0
  171. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/native/3.19.1/sctp-reverse-server.json +0 -0
  172. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/native/3.19.1/tcp-bidirectional-client.json +0 -0
  173. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/native/3.19.1/tcp-bidirectional-server.json +0 -0
  174. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/native/3.19.1/tcp-forward-client.json +0 -0
  175. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/native/3.19.1/tcp-forward-server.json +0 -0
  176. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/native/3.19.1/tcp-reverse-client.json +0 -0
  177. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/native/3.19.1/tcp-reverse-server.json +0 -0
  178. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/native/3.19.1/tcp-warmup-client.json +0 -0
  179. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/native/3.19.1/tcp-warmup-server.json +0 -0
  180. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/native/3.19.1/udp-bidirectional-client.json +0 -0
  181. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/native/3.19.1/udp-bidirectional-server.json +0 -0
  182. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/native/3.19.1/udp-client.json +0 -0
  183. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/native/3.19.1/udp-reverse-client.json +0 -0
  184. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/native/3.19.1/udp-reverse-server.json +0 -0
  185. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/native/3.19.1/udp-server.json +0 -0
  186. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/native/3.21/sctp-bidirectional-client.json +0 -0
  187. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/native/3.21/sctp-bidirectional-server.json +0 -0
  188. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/native/3.21/sctp-forward-client.json +0 -0
  189. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/native/3.21/sctp-forward-server.json +0 -0
  190. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/native/3.21/sctp-reverse-client.json +0 -0
  191. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/native/3.21/sctp-reverse-server.json +0 -0
  192. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/native/3.21/tcp-bidirectional-client.json +0 -0
  193. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/native/3.21/tcp-bidirectional-server.json +0 -0
  194. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/native/3.21/tcp-forward-client.json +0 -0
  195. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/native/3.21/tcp-forward-server.json +0 -0
  196. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/native/3.21/tcp-reverse-client.json +0 -0
  197. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/native/3.21/tcp-reverse-server.json +0 -0
  198. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/native/3.21/tcp-warmup-client.json +0 -0
  199. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/native/3.21/tcp-warmup-server.json +0 -0
  200. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/native/3.21/udp-bidirectional-client.json +0 -0
  201. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/native/3.21/udp-bidirectional-server.json +0 -0
  202. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/native/3.21/udp-client.json +0 -0
  203. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/native/3.21/udp-reverse-client.json +0 -0
  204. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/native/3.21/udp-reverse-server.json +0 -0
  205. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/native/3.21/udp-server.json +0 -0
  206. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/native/3.22/sctp-bidirectional-client.json +0 -0
  207. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/native/3.22/sctp-bidirectional-server.json +0 -0
  208. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/native/3.22/sctp-forward-client.json +0 -0
  209. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/native/3.22/sctp-forward-server.json +0 -0
  210. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/native/3.22/sctp-reverse-client.json +0 -0
  211. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/native/3.22/sctp-reverse-server.json +0 -0
  212. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/native/3.22/tcp-bidirectional-client.json +0 -0
  213. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/native/3.22/tcp-bidirectional-server.json +0 -0
  214. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/native/3.22/tcp-forward-client.json +0 -0
  215. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/native/3.22/tcp-forward-server.json +0 -0
  216. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/native/3.22/tcp-reverse-client.json +0 -0
  217. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/native/3.22/tcp-reverse-server.json +0 -0
  218. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/native/3.22/tcp-warmup-client.json +0 -0
  219. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/native/3.22/tcp-warmup-server.json +0 -0
  220. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/native/3.22/udp-bidirectional-client.json +0 -0
  221. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/native/3.22/udp-bidirectional-server.json +0 -0
  222. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/native/3.22/udp-client.json +0 -0
  223. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/native/3.22/udp-reverse-client.json +0 -0
  224. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/native/3.22/udp-reverse-server.json +0 -0
  225. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/native/3.22/udp-server.json +0 -0
  226. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/native/README.md +0 -0
  227. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/native/capture.py +0 -0
  228. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/plan-reports/README.md +0 -0
  229. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/plan-reports/v2-cancelled-synthetic.json +0 -0
  230. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/reports/v1/README.md +0 -0
  231. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/reports/v1/baseline-pass.json +0 -0
  232. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/reports/v1/partial-failure.json +0 -0
  233. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/sweeps/README.md +0 -0
  234. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/fixtures/sweeps/v1-synthetic.json +0 -0
  235. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_adaptive.py +0 -0
  236. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_adaptive_execution.py +0 -0
  237. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_adaptive_integration.py +0 -0
  238. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_adaptive_reports.py +0 -0
  239. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_advanced_client_results.py +0 -0
  240. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_analysis.py +0 -0
  241. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_artifacts.py +0 -0
  242. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_assessments.py +0 -0
  243. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_async_trials.py +0 -0
  244. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_async_trials_integration.py +0 -0
  245. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_cancellation_integration.py +0 -0
  246. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_cancellation_ownership.py +0 -0
  247. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_capabilities.py +0 -0
  248. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_client_async_and_result.py +0 -0
  249. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_client_branches.py +0 -0
  250. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_client_integration_configs.py +0 -0
  251. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_client_mocked.py +0 -0
  252. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_client_more.py +0 -0
  253. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_concurrent_trials.py +0 -0
  254. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_concurrent_trials_integration.py +0 -0
  255. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_config.py +0 -0
  256. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_config_native_controls.py +0 -0
  257. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_docker_validate.py +0 -0
  258. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_docs.py +0 -0
  259. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_event_capture.py +0 -0
  260. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_event_stream.py +0 -0
  261. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_extended_compatibility.py +0 -0
  262. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_extended_configuration_contracts.py +0 -0
  263. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_ffi_dlopen.py +0 -0
  264. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_ffi_load.py +0 -0
  265. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_installed_smoke.py +0 -0
  266. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_intent.py +0 -0
  267. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_intent_integration.py +0 -0
  268. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_ipc.py +0 -0
  269. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_live_event_evidence.py +0 -0
  270. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_live_event_types.py +0 -0
  271. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_live_events_integration.py +0 -0
  272. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_native_controls_integration.py +0 -0
  273. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_native_options.py +0 -0
  274. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_native_resource_inventory.py +0 -0
  275. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_observability_example.py +0 -0
  276. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_plan_reports.py +0 -0
  277. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_prometheus_exporter.py +0 -0
  278. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_public_api.py +0 -0
  279. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_release_policy.py +0 -0
  280. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_release_qualification.py +0 -0
  281. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_reports.py +0 -0
  282. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_resource_stress_integration.py +0 -0
  283. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_result_native_fixtures.py +0 -0
  284. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_result_normalization.py +0 -0
  285. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_server.py +0 -0
  286. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_server_config.py +0 -0
  287. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_server_integration.py +0 -0
  288. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_server_iteration.py +0 -0
  289. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_server_serve_once.py +0 -0
  290. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_sweep_reports.py +0 -0
  291. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_sweeps.py +0 -0
  292. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_sweeps_integration.py +0 -0
  293. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_trials.py +0 -0
  294. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_trials_integration.py +0 -0
  295. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_worker_ipc_integration.py +0 -0
  296. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_worker_lifetime.py +0 -0
  297. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_worker_lifetime_integration.py +0 -0
  298. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/test_worker_protocol.py +0 -0
  299. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/tests/trial_helpers.py +0 -0
  300. {iperf3_lib-0.4.1 → iperf3_lib-0.4.2}/zensical.toml +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.1
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/
@@ -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
@@ -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
@@ -19,7 +19,7 @@ criteria have evidence; implementation and collected tests alone are insufficien
19
19
  | Proposal | Decision | Evidence needed for complete qualification |
20
20
  | --- | --- | --- |
21
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) | Owned typed async contexts preserve complete-result access and legacy callbacks. | Minimum/latest event assembly, bounded delivery, failure/overflow/abandonment tests, and lifecycle qualification. |
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
@@ -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.
@@ -211,8 +211,8 @@ aggregate workflow result together before publication.
211
211
  will remain true after publication; rendering and matching hashes alone do
212
212
  not check this. PyPI retains the first uploaded description and cannot apply
213
213
  a later repository edit to that release. Then run the Docker/native matrix,
214
- merge through the normal required checks, and run a build-only hosted
215
- rehearsal for the resulting exact commit. Inspect the retained distributions,
214
+ merge through the normal required checks, and run a nonpublishing hosted
215
+ qualification for the resulting exact commit. Inspect the retained distributions,
216
216
  hashes, and every installed-native receipt.
217
217
  4. Inspect the retained artifacts' rendered README and deployed documentation
218
218
  anonymously. Confirm
@@ -239,7 +239,7 @@ and post releases are not part of this publication policy.
239
239
  Validate a planned tag against the current metadata:
240
240
 
241
241
  ```bash
242
- uv run --no-project python scripts/validate_release.py --tag v0.4.1
242
+ uv run --no-project python scripts/validate_release.py --tag v0.4.2
243
243
  ```
244
244
 
245
245
  That local metadata check alone does not qualify the candidate. The workflow
@@ -5,8 +5,19 @@ This is retained planning background from the 0.3.0 development cycle.
5
5
  for current scope and completion status; the tables below preserve the planning
6
6
  context rather than certify the current release candidate.
7
7
 
8
- ## Released 0.4.0
9
-
8
+ ## 0.4.2 candidate and released 0.4.1 / 0.4.0
9
+
10
+ The 0.4.2 candidate ([issue #106](https://github.com/dariuszpanas/iperf3-lib/issues/106))
11
+ consolidates post-0.4.1 maintenance refinements: `address_family` verification
12
+ from connected socket endpoints, strict report and artifact validation
13
+ symmetry, consumer static-typing ergonomics and submodule `__all__` contracts
14
+ ([#102](https://github.com/dariuszpanas/iperf3-lib/issues/102)), adaptive UDP
15
+ and worker/live-event runtime optimizations
16
+ ([#103](https://github.com/dariuszpanas/iperf3-lib/issues/103)), and the
17
+ published API/schema stability policy and tagged documentation snapshots
18
+ ([#101](https://github.com/dariuszpanas/iperf3-lib/issues/101)).
19
+ Version 0.4.1 refines CI scope detection for documentation-only changes while
20
+ preserving the full native and installed-package qualification gates.
10
21
  Version 0.4.0 adds owned async and bounded concurrent plans,
11
22
  adaptive UDP experiments, and typed live-event consumption. Issues
12
23
  [#36](https://github.com/dariuszpanas/iperf3-lib/issues/36),
@@ -28,8 +39,9 @@ The 0.4.0 release completes this scope with the task-submission correction in
28
39
  recommendation. No additional feature cycle is required for this Beta release.
29
40
  Stable API/deprecation guarantees, immutable versioned documentation, broader
30
41
  platform coverage, longer mixed-workload qualification, and consumer feedback
31
- remain later stability work, tracked in
32
- [#78](https://github.com/dariuszpanas/iperf3-lib/issues/78).
42
+ remain post-0.4.0 stability work, tracked in
43
+ [#83](https://github.com/dariuszpanas/iperf3-lib/issues/83) (following the
44
+ completed 0.4.0 readiness checklist in [#78](https://github.com/dariuszpanas/iperf3-lib/issues/78)).
33
45
 
34
46
  ## Historical 0.3.0 planning
35
47
 
@@ -2,11 +2,12 @@
2
2
  set -euo pipefail
3
3
 
4
4
  # Keep the image's development environment aligned with its baked-in lockfile.
5
- if [[ -f /app/pyproject.toml && -f /app/uv.lock ]]; then
6
- uv sync --frozen --dev
7
- else
5
+ if [[ ! -f /app/pyproject.toml || ! -f /app/uv.lock ]]; then
8
6
  echo "error: /app must contain pyproject.toml and uv.lock" >&2
9
7
  exit 2
10
8
  fi
9
+ if [[ "${IPERF3_FORCE_UV_SYNC:-0}" == "1" || ! -f /opt/venv/pyvenv.cfg ]]; then
10
+ uv sync --frozen --dev
11
+ fi
11
12
 
12
13
  exec "$@"
@@ -4,7 +4,42 @@ These pages describe `main`. Released versions remain available through
4
4
  [GitHub releases](https://github.com/dariuszpanas/iperf3-lib/releases) and
5
5
  [PyPI](https://pypi.org/project/iperf3-lib/).
6
6
 
7
- ## 0.4.1
7
+ ## 0.4.2
8
+
9
+ - Verify `address_family` from observed socket endpoint literals in
10
+ `raw["start"]["connected"]`, populating `effective["address_family"]` as
11
+ `"ipv4"` or `"ipv6"` and treating `requested["address_family"] == "auto"` as
12
+ compatible with verified IPv4/IPv6 connections across client results,
13
+ artifacts, sweeps, and adaptive UDP experiments.
14
+ - Accept `ipaddress.IPv4Address | ipaddress.IPv6Address` for
15
+ `ClientConfig.server` and `Literal["tcp", "udp", "sctp"]` strings for
16
+ `ClientConfig.protocol` in static type checking while normalizing to
17
+ `Protocol`. Declare explicit `__all__` exports across all public submodules.
18
+ - Validate `TestResult` in-memory invariants (`version`, `protocol`,
19
+ `direction`, `reporting_role`) before artifact serialization, enforce
20
+ control-character and RFC 6901 JSON Pointer checks across artifact,
21
+ assessment, sweep, and concurrent report deserializers, preserve
22
+ `bytes_per_second` in `TrialAssessmentReport` text summaries, and include
23
+ `start_time_unix` in Prometheus exporter completeness checks.
24
+ - Reuse first-pass observation dictionaries in adaptive UDP summaries, skip
25
+ unconditional `ctypes.util.find_library` subprocess probes when `IPERF3_LIB`
26
+ or standard Linux loader names succeed, switch worker parent-child pipes to
27
+ binary I/O with direct UTF-8 `bytes` JSON parsing, validate live-event
28
+ payloads in a single pass, and add a `/proc` fallback for `WaitPID` in
29
+ `docker-entrypoint.sh`.
30
+ - Publish the [API and schema stability policy](reference/compatibility.md#compatibility-deprecation-and-archive-policy),
31
+ add tagged release documentation snapshot links (`v0.2.0`–`v0.4.1`), and
32
+ align architecture, design, and contributor documentation with the `0.4.x`
33
+ codebase.
34
+ - Route documentation-only pull requests and pushes away from the native Docker
35
+ matrix while preserving the required `ci` check, static/unit gates, and full
36
+ native coverage for code, workflow, and release paths. Align preview `uv`
37
+ provenance checks and stricter `ty` keyword-argument typing.
38
+
39
+ ## 0.4.1 — 2026-10-12
40
+
41
+ Published on [PyPI](https://pypi.org/project/iperf3-lib/0.4.1/) and as
42
+ [GitHub release v0.4.1](https://github.com/dariuszpanas/iperf3-lib/releases/tag/v0.4.1).
8
43
 
9
44
  - Make the packaged README independent of publication timing. The immutable
10
45
  0.4.0 description incorrectly calls 0.4.0 unreleased; a repository-only edit
@@ -9,12 +9,13 @@ configuration, result, experiment, and reporting features, or keep your runner
9
9
  and import its completed JSON.
10
10
 
11
11
  !!! note "Match the documentation to your version"
12
- This site follows `main`; the latest published version is **0.4.0**.
12
+ This site follows `main`; the latest published version is **0.4.1**.
13
13
  The project retains Beta maturity. Dataclasses, portable artifacts, analysis,
14
14
  trial plans, sweeps, and Prometheus output first shipped in 0.3.0; 0.4.0 adds
15
15
  owned async execution, concurrent plans, adaptive UDP and typed live events.
16
- Use documentation matching your installed version.
17
- Check the [changelog](changelog.md) and
16
+ Use documentation matching your installed version: see the
17
+ [tagged release documentation snapshots](reference/compatibility.md#release-documentation-snapshots),
18
+ [changelog](changelog.md), and
18
19
  [published releases](https://github.com/dariuszpanas/iperf3-lib/releases)
19
20
  for publication status.
20
21
 
@@ -28,7 +29,7 @@ changes, customizations, optional new APIs, and report readers.
28
29
 
29
30
  ## Install the Python package
30
31
 
31
- For the published 0.4.0 package, choose the installer used by your application:
32
+ For the published 0.4.1 package, choose the installer used by your application:
32
33
 
33
34
  ```bash
34
35
  uv add iperf3-lib
@@ -121,14 +122,14 @@ unavailable. For directional analysis or missing-data decisions, use
121
122
 
122
123
  ## Next steps
123
124
 
124
- - [Migrate a 0.2.0 application to dataclasses](guides/migration-0.3.md).
125
- - [Run TCP, UDP, reverse, or bidirectional tests](guides/running-tests.md).
125
+ - [Migrate a 0.2.0 application to dataclasses](guides/migration-0.3.md) or [upgrade from 0.3.0 to 0.4.0](guides/migration-0.4.md).
126
+ - [Run TCP, UDP, reverse, or bidirectional tests](guides/running-tests.md) and [consume typed live events](guides/live-events.md).
126
127
  - [Choose configuration values and understand validation](reference/configuration.md).
127
128
  - [Find a native CLI option's Python equivalent](reference/native-options.md)
128
129
  and [use binding, transport, timeout and event controls](guides/native-controls.md).
129
130
  - [Declare aggregate rate intent and inspect capabilities](guides/configuration-intent.md).
130
131
  - [Read flows, observations, intervals, and native JSON](guides/results.md).
131
132
  - [Save portable artifacts](guides/artifacts.md) and [analyze measurements](guides/analysis.md).
132
- - [Repeat and assess trials](guides/trials.md) or [run finite parameter sweeps](guides/sweeps.md).
133
+ - [Repeat and assess trials](guides/trials.md), [run bounded concurrent plans](guides/concurrent-plans.md), [run finite parameter sweeps](guides/sweeps.md), or [explore adaptive UDP rates](guides/adaptive-udp.md).
133
134
  - [Explore Prometheus snapshots and textfile output](guides/prometheus.md).
134
135
 
@@ -37,14 +37,14 @@ launch the `iperf3` executable or parse its human-readable terminal output.
37
37
  Expanded controls use libiperf's public argument parser inside an isolated
38
38
  Python/CFFI worker, so that path also works without the CLI executable.
39
39
 
40
- Process isolation remains part of the implementation. On current `main`, basic
40
+ Process isolation remains part of the implementation. Basic
41
41
  synchronous native calls run in the caller and must be serialized because
42
42
  libiperf has process-global state. Async operations, expanded controls, event delivery, and explicit execution
43
43
  timeouts use Python worker processes. The library manages their protocol,
44
44
  results, and cleanup; native traffic generation still happens in libiperf.
45
45
 
46
46
  !!! note "Additional ownership APIs in 0.4.0"
47
- Changes after 0.3.0 make async cancellation await worker cleanup and any
47
+ Starting in 0.4.0, async cancellation awaits worker cleanup and any
48
48
  active callback, reporting unconfirmed cleanup as `IperfCleanupError`.
49
49
  [Owned live-event streams](live-events.md), [bounded concurrent plans](concurrent-plans.md),
50
50
  and [adaptive UDP experiments](adaptive-udp.md) are also available in 0.4.0.
@@ -156,10 +156,10 @@ flags still collapse lookup/load failures to false; use the report when those
156
156
  distinctions matter. Parser-backed worker controls are distinct from dedicated
157
157
  setter probes. SCTP and MPTCP still depend on the native build and kernel. Basic
158
158
  direct calls remain non-reentrant. Async methods always select the isolated
159
- worker on current `main`; an explicit execution timeout also selects it for a
160
- synchronous client. Async cancellation waits for worker cleanup and any active
161
- callback, and unconfirmed cleanup raises `IperfCleanupError`. This support is
162
- new after 0.3.0; see [async cancellation](running-tests.md#integrate-with-asyncio).
159
+ worker; an explicit execution timeout also selects it for a synchronous client.
160
+ Starting in 0.4.0, async cancellation waits for worker cleanup and any active
161
+ callback, and unconfirmed cleanup raises `IperfCleanupError`; see
162
+ [async cancellation](running-tests.md#integrate-with-asyncio).
163
163
 
164
164
  ## Profiles and native option decisions
165
165