[GH-ISSUE #7363] [Bug] main CI has failed since a7f50e338: seven tests encode contracts superseded by recent commits, one fixture is date-dependent #4376

Closed
opened 2026-10-31 00:49:20 +00:00 by bsakaguchi · 2 comments
Owner

Originally created by @chordpli on GitHub (Oct 27, 2026).
Original GitHub issue: https://github.com/morluto/rea/issues/7363

Area: Other · Interface: Other · Earliest failure stage: Unknown (per test below)
REA version: source 15a8f6847 (also fails on a905a71e3)
Runtime and platform: Node 24.22.1; macOS 26.5.2 arm64 (local); ubuntu GitHub-hosted runners (CI)

Observed behavior

The CI workflow on main has not passed since a7f50e338 (2026-10-26T08:50Z). Every completed run since fails (fc7f042c8, dbe2c97af, 046c4ce35, 68533bc0a, 83bbad2b2); most pushes are cancelled by the next push before finishing. External PRs that merge main inherit the same failures (#6188, #5359).

At 15a8f6847 these tests fail locally (macOS) and in CI; none of them is a production regression as far as I can tell:

Test Introduced by Why it fails now
tests/composition/analysis-sessions/providerBinding.test.ts › preserves bundle-root identity for artifact inventory operations 2dd2ffcd4 isArtifactBundleSubject (BinarySessionExecution.ts:164) now requires target.bundleInfoPlist. The fixture opens a plain fixture.hop file (no bundle) and its fake provider returns a subject with a different digest — exactly the forged-subject case the guard rejects.
tests/boundary/filesystem/safeOutputTreeCloseFailures.test.ts › preserves extracted output when commit close fails (×2) 2dd2ffcd4 The client is created with sha256: "0".repeat(64); expectedRootSha256 → assertAdmittedRootDigest rejects it. Verified: using the zip's real digest makes all 6 tests pass.
tests/boundary/mcp/enhancedTools.limitations.test.ts › counts all own inventory dictionary entries in the composed overview 8706068b5 parseNativeInventoryCount (nativeInventory.ts:69-81) accepts only [{address, value}] rows (unreadable_output, "Provider returned an invalid inventory rows"). The fixture feeds dictionaries; BinaryOverview.test.ts in the same commit asserts dictionaries are malformed. All real providers emit rows (hopper_bridge.py:1041, IdaOperationRunner.ts:656, GhidraInventoryValues.ts:329). workflowSnapshotReplayMcp.test.ts had the same cause and passes again at 15a8f6847.
tests/boundary/filesystem/ghidraJavaProbe.test.ts › keeps empty Java bitness unresolved 4803c4f9c javaProperty (GhidraJavaProbe.ts:379-383) now requires LauncherHelper framing name = value. The fixture line sun.arch.data.model =\n has no separator space, so it is "not reported" instead of empty. A real JDK prints sun.arch.data.model = (trailing space), which still yields (sun.arch.data.model = ""). Bisected: 8 steps.
tests/boundary/cli/ghidraJavaDoctor.test.ts › doctor discovers Ghidra through an empty PATH component (Linux CI only) 81adb8977 The test runs the CLI with PATH: ""; on Linux the owned-process host must spawn ps before any child (ProcessOwnershipObservation.ts:1437-1446), so doctor fails with the process-ownership capability error (run 40425916879, shard 5). macOS skips that precheck. Never green on Linux since it was added.
tests/boundary/filesystem/ciPrHealth.test.ts › public CLI uses only GET and produces a report no commit Time bomb: the CLI uses Date.now() with a 14-day lookback (scripts/ci/pr-ci-health.mjs:14,31,41,95-101) and the fixture hardcodes created_at: "2026-10-13T00:00:00Z" (test:600), which left the window at 2026-10-27T00:00Z. Verified: moving the date makes it pass.

Reproduction

git checkout 15a8f6847 && npm ci && npm run test:local -- tests/composition/analysis-sessions/providerBinding.test.ts && npm run test:focused -- tests/boundary/filesystem/safeOutputTreeCloseFailures.test.ts tests/boundary/mcp/enhancedTools.limitations.test.ts tests/boundary/filesystem/ghidraJavaProbe.test.ts tests/boundary/filesystem/ciPrHealth.test.ts → 1 + 5 failed. ghidraJavaDoctor: Linux CI only (not reproduced locally).

Expected behavior

Tests assert the current contracts (admitted-source digests, canonical inventory rows, LauncherHelper property framing, a reachable ps with an empty PATH component, a clock-relative fixture) and main CI is green.

Impact and scope

No user-visible defect found in this set. CI signal is lost for every push and for contributor PRs; two unrelated real regressions in the same window were only visible through PR CI (see Issue 1).

Analysis or suspected cause

Source-derived with the verifications noted per row; bisects run with git bisect run on the respective test files.

Additional context

I will open one PR updating the six test files, unless you prefer to update them with your own commits. Proposed changes: real bundle fixture or digest-matching fake provider (providerBinding); real zip digest (safeOutputTree); canonical rows plus one negative dictionary case (enhancedTools); sun.arch.data.model = \n and asserting parsed facts rather than wording (ghidraJavaProbe); PATH: ":" + <dir containing ps> (ghidraJavaDoctor); clock-relative created_at for the CLI fixture, or an explicit observation-time input for the CLI (ciPrHealth).

Originally created by @chordpli on GitHub (Oct 27, 2026). Original GitHub issue: https://github.com/morluto/rea/issues/7363 Area: Other · Interface: Other · Earliest failure stage: Unknown (per test below) **REA version:** source `15a8f6847` (also fails on `a905a71e3`) **Runtime and platform:** Node 24.22.1; macOS 26.5.2 arm64 (local); ubuntu GitHub-hosted runners (CI) ### Observed behavior The `CI` workflow on `main` has not passed since a7f50e338 (2026-10-26T08:50Z). Every completed run since fails (fc7f042c8, dbe2c97af, 046c4ce35, 68533bc0a, 83bbad2b2); most pushes are cancelled by the next push before finishing. External PRs that merge `main` inherit the same failures (#6188, #5359). At 15a8f6847 these tests fail locally (macOS) and in CI; none of them is a production regression as far as I can tell: | Test | Introduced by | Why it fails now | |---|---|---| | `tests/composition/analysis-sessions/providerBinding.test.ts` › preserves bundle-root identity for artifact inventory operations | 2dd2ffcd4 | `isArtifactBundleSubject` (`BinarySessionExecution.ts:164`) now requires `target.bundleInfoPlist`. The fixture opens a plain `fixture.hop` file (no bundle) and its fake provider returns a subject with a different digest — exactly the forged-subject case the guard rejects. | | `tests/boundary/filesystem/safeOutputTreeCloseFailures.test.ts` › preserves extracted output when commit close fails (×2) | 2dd2ffcd4 | The client is created with `sha256: "0".repeat(64)`; `expectedRootSha256` → `assertAdmittedRootDigest` rejects it. Verified: using the zip's real digest makes all 6 tests pass. | | `tests/boundary/mcp/enhancedTools.limitations.test.ts` › counts all own inventory dictionary entries in the composed overview | 8706068b5 | `parseNativeInventoryCount` (`nativeInventory.ts:69-81`) accepts only `[{address, value}]` rows (`unreadable_output`, "Provider returned an invalid inventory rows"). The fixture feeds dictionaries; `BinaryOverview.test.ts` in the same commit asserts dictionaries are malformed. All real providers emit rows (hopper_bridge.py:1041, IdaOperationRunner.ts:656, GhidraInventoryValues.ts:329). `workflowSnapshotReplayMcp.test.ts` had the same cause and passes again at 15a8f6847. | | `tests/boundary/filesystem/ghidraJavaProbe.test.ts` › keeps empty Java bitness unresolved | 4803c4f9c | `javaProperty` (`GhidraJavaProbe.ts:379-383`) now requires LauncherHelper framing `name = value`. The fixture line `sun.arch.data.model =\n` has no separator space, so it is "not reported" instead of empty. A real JDK prints `sun.arch.data.model = ` (trailing space), which still yields `(sun.arch.data.model = "")`. Bisected: 8 steps. | | `tests/boundary/cli/ghidraJavaDoctor.test.ts` › doctor discovers Ghidra through an empty PATH component (Linux CI only) | 81adb8977 | The test runs the CLI with `PATH: ""`; on Linux the owned-process host must spawn `ps` before any child (`ProcessOwnershipObservation.ts:1437-1446`), so `doctor` fails with the `process-ownership` capability error (run 40425916879, shard 5). macOS skips that precheck. Never green on Linux since it was added. | | `tests/boundary/filesystem/ciPrHealth.test.ts` › public CLI uses only GET and produces a report | no commit | Time bomb: the CLI uses `Date.now()` with a 14-day lookback (`scripts/ci/pr-ci-health.mjs:14,31,41,95-101`) and the fixture hardcodes `created_at: "2026-10-13T00:00:00Z"` (test:600), which left the window at 2026-10-27T00:00Z. Verified: moving the date makes it pass. | ### Reproduction `git checkout 15a8f6847 && npm ci && npm run test:local -- tests/composition/analysis-sessions/providerBinding.test.ts && npm run test:focused -- tests/boundary/filesystem/safeOutputTreeCloseFailures.test.ts tests/boundary/mcp/enhancedTools.limitations.test.ts tests/boundary/filesystem/ghidraJavaProbe.test.ts tests/boundary/filesystem/ciPrHealth.test.ts` → 1 + 5 failed. ghidraJavaDoctor: Linux CI only (not reproduced locally). ### Expected behavior Tests assert the current contracts (admitted-source digests, canonical inventory rows, LauncherHelper property framing, a reachable `ps` with an empty PATH component, a clock-relative fixture) and `main` CI is green. ### Impact and scope No user-visible defect found in this set. CI signal is lost for every push and for contributor PRs; two unrelated real regressions in the same window were only visible through PR CI (see Issue 1). ### Analysis or suspected cause Source-derived with the verifications noted per row; bisects run with `git bisect run` on the respective test files. ### Additional context I will open one PR updating the six test files, unless you prefer to update them with your own commits. Proposed changes: real bundle fixture or digest-matching fake provider (providerBinding); real zip digest (safeOutputTree); canonical rows plus one negative dictionary case (enhancedTools); `sun.arch.data.model = \n` and asserting parsed facts rather than wording (ghidraJavaProbe); `PATH: ":" + <dir containing ps>` (ghidraJavaDoctor); clock-relative `created_at` for the CLI fixture, or an explicit observation-time input for the CLI (ciPrHealth).
Author
Owner

@chordpli commented on GitHub (Oct 27, 2026):

I am preparing one test-only PR covering the six files listed above (no production change unless the CI health CLI gains an explicit observation-time input). If you would rather update these tests alongside your own commits, say so and I will drop it.

<!-- gh-comment-id:6431792938 --> @chordpli commented on GitHub (Oct 27, 2026): I am preparing one test-only PR covering the six files listed above (no production change unless the CI health CLI gains an explicit observation-time input). If you would rather update these tests alongside your own commits, say so and I will drop it.
Author
Owner

@chordpli commented on GitHub (Oct 27, 2026):

Resolved by #7349 (1201c2554). On main a95b83c2b the latest completed CI run (40521448131) no longer fails any of the six files listed above. The remaining failure in that run is tests/acceptance/setup/hermesClientSetup.test.ts (Test shard 6/8 and Portable tests), which is a different test and not part of this report. #7366 is closed as superseded.

<!-- gh-comment-id:6445344235 --> @chordpli commented on GitHub (Oct 27, 2026): Resolved by #7349 (1201c2554). On `main` a95b83c2b the latest completed CI run (40521448131) no longer fails any of the six files listed above. The remaining failure in that run is `tests/acceptance/setup/hermesClientSetup.test.ts` (Test shard 6/8 and Portable tests), which is a different test and not part of this report. #7366 is closed as superseded.
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#4376
No description provided.