[BUG] Integration fixture readers leave file handles open despite successful exits #71

Closed
opened 2026-09-21 21:33:03 +02:00 by erikinkinen · 0 comments
Owner

Summary

The full helper suite emits 36 ResourceWarning diagnostics from 15 commands even though their exit statuses are zero. Unclosed fixture files violate the required warning-free gate; Python finalizer diagnostics cannot be accepted solely from process status.

Reproduction

The affected shell fixtures are unchanged from Integration dff878dd3545c4751b3c05d37b2bdd5e21cce548. Select the documented original tools and run the maintained helper suite with PYTHONWARNINGS=error, or exercise a representative affected command:

PYTHONWARNINGS=error tests/dynlink-acceptance-closure.sh

Inspect the retained stderr as well as the exit code.

Expected and actual behavior

Expected: fixture JSON, TOML and binary readers/writers close their selected files deterministically on success and failure, and helper validation emits no resource warnings.

Actual: inline Python uses json.load(open(...)), tomllib.load(open(...)) and unowned direct reads/writes. Python reports unclosed file objects during finalization, including with warnings promoted to errors; the helper process can still return zero. The complete local suite retains 36 such diagnostics across 15 commands. A sibling fixture contains the same loader pattern even though that branch did not emit a warning in this run.

Environment and identity

Linux x86-64, the maintained original helper/tool selections and Python warning errors. The unchanged fixture sources come from Integration dff878dd3545c4751b3c05d37b2bdd5e21cce548; the observation occurred while validating the startup-contract correction. All original command/status/stream bytes and per-line warning classification are retained. This is a host fixture resource-lifetime defect; no guest capability leak or shared CI timeout cause is inferred.

Evidence and prior checks

All 170 maintained helper commands returned zero, but the final stream audit correctly refused warning-free publication. Affected fixtures cover acceptance/dependency closure, executable inventories, image/lookup/object-store manifests, boot-filesystem closure, RTC and native application packaging, and porting-wave gates. Original warnings remain preserved independently of later changed-input validation.

Tracking

Replace unowned fixture opens with scoped stream custody or closing file helpers and revalidate every altered fixture under the same warning policy. Keep all fixture assertions and source/authority checks. Include actual stream diagnostics in acceptance, not only exit statuses. Related: startup admission 69, audit 11, WIP PR 12 and Phase 6 completion.

Signed startup source/feature correction — 21 September 2026:

Integration fd8a5cf0dbcf9a9cd3ddb6038370295e6ec2c8fa requires the complete runtime transition in both Rootd and its orchestration policy. The direct Kernel builder records the actual local compiler feature closure, compares original source before and after linking, and includes source identity in its cache key. Contract v2 requires the Kernel revision/tree and actual artifact/metadata binding; old receipts, synthetic wrappers and modified source cannot acquire this declaration. This remains local observed provenance, not publisher authentication or complete compiler closure.

All 171 maintained helper commands have successful, warning-free final evidence. Eight new Kernel controls cover original trees, actual cfg closure, changed inputs, hidden/redirected source, custom builds, synthetic wrappers and cache identity. Sixteen fixture readers/writers now close files explicitly; bug 71 retains the original 36 resource warnings from 15 exit-zero commands. The previously unlisted filesystem-mirror fixture now participates in CI. Earlier Markdown failures also remain retained. Formatting, source policy and final Markdown pass; identical Rust inputs retain four strict orchestration matrices.

The technical manual update 76672dff8ff83 passes 45 tests, 2,431 pages, 450,096 word bounds and both changed-page visual reviews. Original Docs 1001/1002 passes from four complete logs totaling 774,770 bytes. Each manual log retains its earlier reference-convergence warnings; final LaTeX passes have no warnings or layout overflow.

A fresh ordinary package from the signed Integration runner is under construction. Actual corrected image admission and startup capture remain pending under bug 69; no threshold or 120/15/10 capture limit changes. Original Integration 1705/1706 is monitored separately. Native external Rust/LLVM/runtime rebuilding and both complete EriX guest build generations remain mandatory.

Actual original-source startup capture — 21 September 2026:

Signed Integration fd8a5cf0dbcf builds the ordinary image without warnings and its actual Kernel-bound contract passes preflight. The VM and complete observer finish with all required stages, zero dropped records, empty QEMU stderr, successful cleanup and unchanged source image. Admission bug 69 is resolved independently of performance.

The strict timing gate fails: root-to-final readiness 5.974133160 seconds (limit 5), largest service interval 3.098663889 (limit 1), final readiness to caret 1.262470092 (limit 1), and four native commands 4.769234506 (limit 2). The maintained offline profiler identifies RTC-provider to TTYD as the largest service interval, followed by roughly one-second Powerboxd and Launchd intervals. These are host observation windows, not loader-only causal measurements. The new canonical timing bug retains the exact image, timing and command identities and every original limit. Host/toolchain description fields remain explicitly incomplete; no provenance or speedup is invented.

The sixteen helper stream-custody corrections also pass all changed controls; all 171 selected helper commands have successful warning-free final evidence. Bug 71 is resolved with its original 36 warnings retained. Full CI for 1705/1706 remains separately monitored. No startup-performance or full native toolchain/EriX guest-build acceptance is awarded.

## Summary The full helper suite emits 36 `ResourceWarning` diagnostics from 15 commands even though their exit statuses are zero. Unclosed fixture files violate the required warning-free gate; Python finalizer diagnostics cannot be accepted solely from process status. ## Reproduction The affected shell fixtures are unchanged from Integration `dff878dd3545c4751b3c05d37b2bdd5e21cce548`. Select the documented original tools and run the maintained helper suite with `PYTHONWARNINGS=error`, or exercise a representative affected command: ```sh PYTHONWARNINGS=error tests/dynlink-acceptance-closure.sh ``` Inspect the retained stderr as well as the exit code. ## Expected and actual behavior Expected: fixture JSON, TOML and binary readers/writers close their selected files deterministically on success and failure, and helper validation emits no resource warnings. Actual: inline Python uses `json.load(open(...))`, `tomllib.load(open(...))` and unowned direct reads/writes. Python reports unclosed file objects during finalization, including with warnings promoted to errors; the helper process can still return zero. The complete local suite retains 36 such diagnostics across 15 commands. A sibling fixture contains the same loader pattern even though that branch did not emit a warning in this run. ## Environment and identity Linux x86-64, the maintained original helper/tool selections and Python warning errors. The unchanged fixture sources come from Integration `dff878dd3545c4751b3c05d37b2bdd5e21cce548`; the observation occurred while validating the startup-contract correction. All original command/status/stream bytes and per-line warning classification are retained. This is a host fixture resource-lifetime defect; no guest capability leak or shared CI timeout cause is inferred. ## Evidence and prior checks All 170 maintained helper commands returned zero, but the final stream audit correctly refused warning-free publication. Affected fixtures cover acceptance/dependency closure, executable inventories, image/lookup/object-store manifests, boot-filesystem closure, RTC and native application packaging, and porting-wave gates. Original warnings remain preserved independently of later changed-input validation. ## Tracking Replace unowned fixture opens with scoped stream custody or closing file helpers and revalidate every altered fixture under the same warning policy. Keep all fixture assertions and source/authority checks. Include actual stream diagnostics in acceptance, not only exit statuses. Related: [startup admission 69](https://git.erikinkinen.fi/erix/integration/issues/69), [audit 11](https://git.erikinkinen.fi/erix/integration/issues/11), [WIP PR 12](https://git.erikinkinen.fi/erix/integration/pulls/12) and [Phase 6 completion](https://git.erikinkinen.fi/erix/integration/issues/65). Signed startup source/feature correction — 21 September 2026: Integration [fd8a5cf0dbcf9a9cd3ddb6038370295e6ec2c8fa](https://git.erikinkinen.fi/erix/integration/commit/fd8a5cf0dbcf9a9cd3ddb6038370295e6ec2c8fa) requires the complete runtime transition in both Rootd and its orchestration policy. The direct Kernel builder records the actual local compiler feature closure, compares original source before and after linking, and includes source identity in its cache key. Contract v2 requires the Kernel revision/tree and actual artifact/metadata binding; old receipts, synthetic wrappers and modified source cannot acquire this declaration. This remains local observed provenance, not publisher authentication or complete compiler closure. All 171 maintained helper commands have successful, warning-free final evidence. Eight new Kernel controls cover original trees, actual cfg closure, changed inputs, hidden/redirected source, custom builds, synthetic wrappers and cache identity. Sixteen fixture readers/writers now close files explicitly; [bug 71](https://git.erikinkinen.fi/erix/integration/issues/71) retains the original 36 resource warnings from 15 exit-zero commands. The previously unlisted filesystem-mirror fixture now participates in CI. Earlier Markdown failures also remain retained. Formatting, source policy and final Markdown pass; identical Rust inputs retain four strict orchestration matrices. The technical manual update [76672dff8ff83](https://git.erikinkinen.fi/erix/docs/commit/76672dff8ff83b04914abe3c8f4b08b13835144f) passes 45 tests, 2,431 pages, 450,096 word bounds and both changed-page visual reviews. Original Docs [1001](https://git.erikinkinen.fi/erix/docs/actions/runs/1001)/[1002](https://git.erikinkinen.fi/erix/docs/actions/runs/1002) passes from four complete logs totaling 774,770 bytes. Each manual log retains its earlier reference-convergence warnings; final LaTeX passes have no warnings or layout overflow. A fresh ordinary package from the signed Integration runner is under construction. Actual corrected image admission and startup capture remain pending under [bug 69](https://git.erikinkinen.fi/erix/integration/issues/69); no threshold or 120/15/10 capture limit changes. Original Integration [1705](https://git.erikinkinen.fi/erix/integration/actions/runs/1705)/[1706](https://git.erikinkinen.fi/erix/integration/actions/runs/1706) is monitored separately. Native external Rust/LLVM/runtime rebuilding and both complete EriX guest build generations remain mandatory. Actual original-source startup capture — 21 September 2026: Signed Integration [fd8a5cf0dbcf](https://git.erikinkinen.fi/erix/integration/commit/fd8a5cf0dbcf9a9cd3ddb6038370295e6ec2c8fa) builds the ordinary image without warnings and its actual Kernel-bound contract passes preflight. The VM and complete observer finish with all required stages, zero dropped records, empty QEMU stderr, successful cleanup and unchanged source image. Admission bug 69 is resolved independently of performance. The strict timing gate fails: root-to-final readiness 5.974133160 seconds (limit 5), largest service interval 3.098663889 (limit 1), final readiness to caret 1.262470092 (limit 1), and four native commands 4.769234506 (limit 2). The maintained offline profiler identifies RTC-provider to TTYD as the largest service interval, followed by roughly one-second Powerboxd and Launchd intervals. These are host observation windows, not loader-only causal measurements. [The new canonical timing bug](https://git.erikinkinen.fi/erix/integration/issues/72) retains the exact image, timing and command identities and every original limit. Host/toolchain description fields remain explicitly incomplete; no provenance or speedup is invented. The sixteen helper stream-custody corrections also pass all changed controls; all 171 selected helper commands have successful warning-free final evidence. Bug 71 is resolved with its original 36 warnings retained. Full CI for 1705/1706 remains separately monitored. No startup-performance or full native toolchain/EriX guest-build acceptance is awarded.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
erix/integration#71
No description provided.