[GH-ISSUE #6556] [Bug] Portable CI fixtures assume host utilities and stale protocol facts #3947

Closed
opened 2026-10-31 00:45:30 +00:00 by bsakaguchi · 1 comment
Owner

Originally created by @gensokyo-dev on GitHub (Oct 23, 2026).
Original GitHub issue: https://github.com/morluto/rea/issues/6556

Before submitting

  • I searched open and closed issues for related reports.
  • I removed credentials and sensitive target information.

Area

Other — CI fixture portability.

Observed behavior

The same portable suite can pass on Ubuntu 24.04.5 and fail on Ubuntu 26.04.1 during the ubuntu-latest rollout. Firmware fixtures report the unblob version for a binwalk request; the alternate-launcher cleanup fixture loses its child before ps.

Observed in #6316, whose changes do not modify these fixtures:

Reproduction

A network-disabled, read-only container using the official Ubuntu 26.04 amd64 image sha256:42527649dbc4f9197a6073f426f488cbff0e9cc9f2afce32d91c383e4875634a produced:

readlink -f /usr/bin/true
/usr/bin/gnutrue
readlink -f /usr/bin/sleep
/usr/lib/cargo/bin/coreutils/sleep

Copying that sleep executable to an executable temporary file named Hopper, then running Hopper 0, exits 1 with coreutils: unknown program 'Hopper'. The probe allowed temporary execution and used one CPU, 128 MiB and 32 PIDs. This reproduces the underlying OS behavior, not the complete hosted-image test suite.

The current #6316 head passes all 38 cases in the two affected files on Debian 12 with Node 24.22.1.

Expected behavior

Fixture dispatch must follow its configured executable identity. A deliberately renamed executable used to test process identity must remain alive until the fixture handshake and preserve the intended executable/argv evidence independently of host coreutils packaging.

Impact and scope

Blocks required portable CI, including ordinary firmware and MCP boundary tests. Real Binwalk, Unblob and Hopper behavior is not established by these simulated fixtures. Other host assumptions remain unverified.

REA version

Source main 6c4d880f2dd9ca7d42593be916f90ec19b8a09d7; also observed at #6316 head f64cb0ec1e11c6405a7a1b8fdd93c54e73d6c0c6.

Runtime and platform

Node 24.22.1, Linux x64; hosted Ubuntu 26.04.1 image 20261012.163.1, compared with hosted Ubuntu 24.04.5 and local Debian 12.

Target and interface

Controlled test producers and process fixtures; CI / Other. Earliest stage: fixture setup/provider admission.

Relevant output and source-derived cause

Unsupported tool version 26.6.4; accepted releases are Binwalk 3.1.x.

tests/fixtures/firmware/provider.ts infers the engine from a command ending in /true, although production canonicalizes the configured path. tests/process-global/cleanLinuxHopperRuntime.test.ts copies and renames the host sleep program, which is a multicall executable on Ubuntu 26.

Additional context

Found while following #6480. Keep the fixture correction separate from the Node security guidance PR, retain lifecycle/ownership assertions, and verify against both standalone and multicall host representations.

Related lifetime finding: the unchanged baseline also fails the existing Python -u cases when a data chunk is treated as an entire readiness line. A barrier-controlled producer reproduces BrokenPipeError after the chunk consumer closes its pipe; line framing permits the producer to enter its idle lifetime. The fixture fix includes these directly related readiness readers.

Additional main-contract fixture drift

Following current main during integration exposed further test-producer assumptions, tracked in #6570:

  • Main 39d1b2d preserves unsigned MZ candidates as unresolved. The Go diagnostic and direct-image fixtures conflated this with malformed declared PE; retain both distinct cases.
  • Main 56685c6ec preserves legitimate Inspector parse-failure facts. The old negative fixture supplied a valid string script ID; use an actual malformed protocol value without changing count/completeness assertions. Hosted failure.
  • Main 50241b368 resolves push destinations that are directories. The ADB snapshot producer returned success for every command, falsely declaring its file destination a directory and appending the basename twice. Return explicit file probe facts and reject unknown commands. The two final-cleanup failures reproduced locally before fixing the producer; all 163 related ADB cases then passed. Hosted failure.

These are fixture corrections; no production contract rollback or real-provider/device verification is claimed.

Originally created by @gensokyo-dev on GitHub (Oct 23, 2026). Original GitHub issue: https://github.com/morluto/rea/issues/6556 ## Before submitting - [x] I searched open and closed issues for related reports. - [x] I removed credentials and sensitive target information. ## Area Other — CI fixture portability. ## Observed behavior The same portable suite can pass on Ubuntu 24.04.5 and fail on Ubuntu 26.04.1 during the `ubuntu-latest` rollout. Firmware fixtures report the unblob version for a binwalk request; the alternate-launcher cleanup fixture loses its child before `ps`. Observed in #6316, whose changes do not modify these fixtures: - [Passing Ubuntu 24 shard](https://github.com/morluto/rea/actions/runs/39922258534/job/120310607176). - [Ubuntu 26 failures in firmware integration and launcher lifetime](https://github.com/morluto/rea/actions/runs/39923997393/job/120316373382). - [One bounded rerun reproduces the firmware failure through MCP on Ubuntu 26](https://github.com/morluto/rea/actions/runs/39923997393/job/120321624094). ## Reproduction A network-disabled, read-only container using the official Ubuntu 26.04 amd64 image `sha256:42527649dbc4f9197a6073f426f488cbff0e9cc9f2afce32d91c383e4875634a` produced: ```text readlink -f /usr/bin/true /usr/bin/gnutrue readlink -f /usr/bin/sleep /usr/lib/cargo/bin/coreutils/sleep ``` Copying that sleep executable to an executable temporary file named `Hopper`, then running `Hopper 0`, exits 1 with `coreutils: unknown program 'Hopper'`. The probe allowed temporary execution and used one CPU, 128 MiB and 32 PIDs. This reproduces the underlying OS behavior, not the complete hosted-image test suite. The current #6316 head passes all 38 cases in the two affected files on Debian 12 with Node 24.22.1. ## Expected behavior Fixture dispatch must follow its configured executable identity. A deliberately renamed executable used to test process identity must remain alive until the fixture handshake and preserve the intended executable/argv evidence independently of host coreutils packaging. ## Impact and scope Blocks required portable CI, including ordinary firmware and MCP boundary tests. Real Binwalk, Unblob and Hopper behavior is not established by these simulated fixtures. Other host assumptions remain unverified. ## REA version Source main `6c4d880f2dd9ca7d42593be916f90ec19b8a09d7`; also observed at #6316 head `f64cb0ec1e11c6405a7a1b8fdd93c54e73d6c0c6`. ## Runtime and platform Node 24.22.1, Linux x64; hosted Ubuntu 26.04.1 image `20261012.163.1`, compared with hosted Ubuntu 24.04.5 and local Debian 12. ## Target and interface Controlled test producers and process fixtures; CI / Other. Earliest stage: fixture setup/provider admission. ## Relevant output and source-derived cause `Unsupported tool version 26.6.4; accepted releases are Binwalk 3.1.x`. `tests/fixtures/firmware/provider.ts` infers the engine from a command ending in `/true`, although production canonicalizes the configured path. `tests/process-global/cleanLinuxHopperRuntime.test.ts` copies and renames the host sleep program, which is a multicall executable on Ubuntu 26. ## Additional context Found while following #6480. Keep the fixture correction separate from the Node security guidance PR, retain lifecycle/ownership assertions, and verify against both standalone and multicall host representations. Related lifetime finding: the unchanged baseline also fails the existing Python `-u` cases when a data chunk is treated as an entire readiness line. A barrier-controlled producer reproduces `BrokenPipeError` after the chunk consumer closes its pipe; line framing permits the producer to enter its idle lifetime. The fixture fix includes these directly related readiness readers. ### Additional main-contract fixture drift Following current main during integration exposed further test-producer assumptions, tracked in #6570: - Main `39d1b2d` preserves unsigned MZ candidates as unresolved. The Go diagnostic and direct-image fixtures conflated this with malformed declared PE; retain both distinct cases. - Main `56685c6ec` preserves legitimate Inspector parse-failure facts. The old negative fixture supplied a valid string script ID; use an actual malformed protocol value without changing count/completeness assertions. [Hosted failure](https://github.com/morluto/rea/actions/runs/39934742311/job/120351880667). - Main `50241b368` resolves push destinations that are directories. The ADB snapshot producer returned success for every command, falsely declaring its file destination a directory and appending the basename twice. Return explicit file probe facts and reject unknown commands. The two final-cleanup failures reproduced locally before fixing the producer; all 163 related ADB cases then passed. [Hosted failure](https://github.com/morluto/rea/actions/runs/39936442296/job/120357408832). These are fixture corrections; no production contract rollback or real-provider/device verification is claimed.
bsakaguchi 2026-10-31 00:45:30 +00:00
  • closed this issue
  • added the
    bug
    triage
    labels
Author
Owner

@gensokyo-dev commented on GitHub (Oct 23, 2026):

Current fix is #6570 at c2e59bd53. Main 3ba194263 independently supersedes the firmware correction, so the PR now adopts it verbatim and retains runtime lifetime/readiness fixes. Main’s new MZ uncertainty semantics also required migrating the shared Go diagnostics and direct-image fixture while preserving malformed declared-PE coverage. Latest local results: 76 Ubuntu 26 cases, 185 Go/provider/CLI/MCP/parser cases, static checks and 2,117-file discovery passed. The review-reported retained-child lifetime now has a real verified 30-second backstop. Current-head hosted CI remains pending.

<!-- gh-comment-id:6362194592 --> @gensokyo-dev commented on GitHub (Oct 23, 2026): Current fix is #6570 at `c2e59bd53`. Main `3ba194263` independently supersedes the firmware correction, so the PR now adopts it verbatim and retains runtime lifetime/readiness fixes. Main’s new MZ uncertainty semantics also required migrating the shared Go diagnostics and direct-image fixture while preserving malformed declared-PE coverage. Latest local results: 76 Ubuntu 26 cases, 185 Go/provider/CLI/MCP/parser cases, static checks and 2,117-file discovery passed. The review-reported retained-child lifetime now has a real verified 30-second backstop. Current-head hosted CI remains pending.
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
morluto/rea#3947
No description provided.