|
| 1 | +<!-- SPDX-License-Identifier: MIT --> |
| 2 | + |
| 3 | +# PR #32 — CI correction and README refresh |
| 4 | + |
| 5 | +## Observed failure |
| 6 | + |
| 7 | +Both initial CI runs at `a6144f4` failed only the complete firmware host suite: |
| 8 | +[pull-request run](https://github.com/PyBLE-dev/PyBLE/actions/runs/34618742875) |
| 9 | +and [branch-push run](https://github.com/PyBLE-dev/PyBLE/actions/runs/34618673864). |
| 10 | +Each ran 1,947 tests with one error and 24 skips. The failing test was |
| 11 | +`test_visible_replacement_during_callback_is_rejected_and_preserved` in |
| 12 | +`test_v061_hil_preflight_hardening.py`: its replacement file had disappeared. |
| 13 | +The firmware shell phase and Android WebView checks passed. Firmware builds |
| 14 | +were skipped because their host-test prerequisite failed; they did not report |
| 15 | +compiler failures. |
| 16 | + |
| 17 | +The host evidence writer closed its original descriptor before invoking the |
| 18 | +validation callback. Linux could reuse that unlinked file's inode number for a |
| 19 | +replacement. Cleanup then mistook the replacement for its own output and |
| 20 | +removed it. The same lifetime gap existed in the shared v0.6.0-profile writer. |
| 21 | + |
| 22 | +## Correction and boundaries |
| 23 | + |
| 24 | +Both writers now retain the original descriptor until publication checks and |
| 25 | +failure cleanup finish. The inode remains reserved while ownership is checked. |
| 26 | +Existing replacement files, including replacements with identical bytes, are |
| 27 | +rejected without deletion. Descriptor cleanup still occurs on success/failure. |
| 28 | + |
| 29 | +Specification commit `8c7a1ff`, regression commit `0bde1e6`, and implementation |
| 30 | +commit `8771c8b` preserve the specification-first red/green sequence. New tests |
| 31 | +observe real descriptor lifetime without relying on filesystem inode-reuse |
| 32 | +timing. They failed before the correction on this macOS host as well. |
| 33 | + |
| 34 | +Only host qualification tools changed. Firmware runtime, native modules, |
| 35 | +board overlays and version pins still match published source `c8f549e` exactly. |
| 36 | +No release threshold was relaxed, failed evidence rewritten, board operated, |
| 37 | +firmware rebuilt or live website changed. |
| 38 | + |
| 39 | +## Verification before the update push |
| 40 | + |
| 41 | +- Three deterministic inode-lifetime test methods passed for both writers, |
| 42 | + including success, failure cleanup and same-byte replacement cases. |
| 43 | +- The affected five-file writer/gate suite passed all 80 tests under Python |
| 44 | + 3.12, including the original failing regression. |
| 45 | +- All 42 publication tests and the Markdown link gate passed. |
| 46 | +- All six firmware roadmap/ledger tests passed after correcting the old |
| 47 | + expectation that v0.6.0 must still be the current public release. |
| 48 | +- Website tests: 342 passed across 23 files. |
| 49 | +- Clean-room, whitespace and PR-range DCO checks passed. |
| 50 | + |
| 51 | +The full Python 3.12 host suite is also rerun independently. Its final outcome |
| 52 | +and the subsequent Ubuntu CI results belong to the PR checks; focused host |
| 53 | +tests above are not hardware qualification evidence. |
| 54 | + |
| 55 | +## README and issue #24 |
| 56 | + |
| 57 | +The README now links the published v0.6.1 descriptor, exact source, owner |
| 58 | +confirmation, recovery material, tutorials, diagram and official examples. |
| 59 | +It documents the editable repository URL, branch selection, writable-folder |
| 60 | +guidance, multi-file deletion, App source version and offline privacy policy. |
| 61 | +Historical v0.6.0 citation metadata remains historical. Prepared store artifacts |
| 62 | +are not advertised as proof of a live release or later source changes. |
| 63 | + |
| 64 | +[Issue #24](https://github.com/PyBLE-dev/PyBLE/issues/24) describes the original |
| 65 | +automated release-admission checklist, including five hardening results, ten |
| 66 | +storage receipts and ten physical App/profile rows. The |
| 67 | +[owner-confirmed publication](firmware-v0.6.1-publication-2026-09-11.md) is recorded, |
| 68 | +but its retained descriptor still has five pending automated HIL rows. This PR |
| 69 | +does not certify all of #24's original criteria and must not auto-close it as |
| 70 | +completed. The maintainer may instead explicitly close that original workflow |
| 71 | +as superseded by the owner-confirmed publication decision, preserving the |
| 72 | +distinction. This follow-up neither closes the issue nor resumes hardware tests. |
0 commit comments