Skip to content

fix: arm64 gateway health detection fails on non-TTY environments - #1723

Merged
ericksoa merged 7 commits into
NVIDIA:mainfrom
kagura-agent:fix/arm64-gateway-health
Apr 16, 2026
Merged

fix: arm64 gateway health detection fails on non-TTY environments#1723
ericksoa merged 7 commits into
NVIDIA:mainfrom
kagura-agent:fix/arm64-gateway-health

Conversation

@kagura-agent

@kagura-agent kagura-agent commented Apr 10, 2026

Copy link
Copy Markdown
Contributor

Summary

Fixes #1711. nemoclaw onboard never completes on ARM64 (Raspberry Pi 5) because the gateway health check always returns false, even though the gateway is fully functional.

Root Cause

Three issues combine to break health detection on ARM64:

  1. openshell status returns empty string in non-TTY contexts (Node.js child process on ARM64)
  2. isGatewayHealthy() hard-gates on isGatewayConnected(), which requires "Connected" in status output — no fallback when status is empty
  3. isGatewayConnected() doesn't match "Server Status" (OpenShell 0.0.25+ changed output format)
  4. Health poll timeout too short for ARM64 — k3s takes 90–180s to init, but default is 5×2s=10s

Changes

src/lib/gateway-state.ts

  • isGatewayConnected(): also match "Server Status" (OpenShell 0.0.25+)
  • isGatewayHealthy(): accept gateway info as proof of health when status is empty — if the named gateway exists (hasStaleGateway) and has an active endpoint (hasActiveGatewayInfo) and the name matches, treat as healthy

src/lib/onboard.ts

  • Add gateway select before each health probe (ensures correct gateway is active in non-TTY environments)
  • Increase default poll on ARM64: 30×10s (5 minutes) vs 5×2s (10 seconds)
  • All values remain overridable via NEMOCLAW_HEALTH_POLL_COUNT and NEMOCLAW_HEALTH_POLL_INTERVAL

test/gateway-state.test.ts (new)

  • 13 unit tests covering:
    • isGatewayConnected with Connected, Server Status, empty, and undefined inputs
    • isGatewayHealthy primary path, ARM64 fallback path, and failure cases
    • getGatewayReuseState healthy detection via both paths

Testing

  • npx vitest run test/gateway-state.test.ts — 13/13 pass
  • npx tsc -p tsconfig.src.json --noEmit — zero errors
  • Full suite: 1313 pass, 5 fail (pre-existing, unrelated to this change)

Summary by CodeRabbit

  • Bug Fixes

    • Broadened gateway connection detection to recognize additional status outputs.
    • Refined health-check logic to more reliably infer gateway health, including a fallback when status output is effectively empty.
    • Ensure the correct gateway is selected in headless/non-interactive environments before probing status.
    • Increased health-check polling limits on ARM64 to handle slower startup.
  • Tests

    • Added comprehensive tests covering connection detection, health evaluation (including the empty‑status fallback), and reuse‑state outcomes.

Signed-off-by: kagura-agent kagura-agent@users.noreply.github.com

 NVIDIA#1711)

Three changes that combine to fix the ARM64 onboard loop:

1. isGatewayConnected(): also match 'Server Status' (OpenShell 0.0.25+)
2. isGatewayHealthy(): accept gateway info as proof of health when
   openshell status returns empty (ARM64/non-TTY fallback path)
3. onboard health poll: add gateway select before each probe, increase
   defaults on ARM64 (30×10s vs 5×2s) to account for slow k3s init

All values remain overridable via NEMOCLAW_HEALTH_POLL_COUNT and
NEMOCLAW_HEALTH_POLL_INTERVAL environment variables.
@coderabbitai

coderabbitai Bot commented Apr 10, 2026

Copy link
Copy Markdown
Contributor

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

Updated gateway health detection and polling: status parsing now recognizes "Server Status", health evaluation accepts gateway-info as a fallback when status is empty, ARM64 polling defaults increased, and a gateway select is executed before each health probe.

Changes

Cohort / File(s) Summary
Gateway health logic
src/lib/gateway-state.ts
isGatewayConnected now matches both "Connected" and "Server Status". isGatewayHealthy computes connected, activeGatewayName, and activeInfo, and accepts a gateway‑info-based fallback when status is empty but gateway metadata and active info confirm the named gateway.
Onboard probe behavior
src/lib/onboard.ts
Before each health probe run openshell gateway select <GATEWAY_NAME> (errors ignored) to ensure correct selection in non‑TTY runs. Increase ARM64 defaults: NEMOCLAW_HEALTH_POLL_COUNT (5→30) and NEMOCLAW_HEALTH_POLL_INTERVAL (2→10).
Tests
test/gateway-state.test.ts, test/onboard.test.ts
Add Vitest suite with realistic OpenShell fixtures validating parsing/classification (isGatewayConnected, isGatewayHealthy, getReportedGatewayName, hasStaleGateway, hasActiveGatewayInfo, getGatewayReuseState) and adjust an existing onboard test expectation (connected + empty gw metadata + gw-info now yields healthy).

Sequence Diagram(s)

sequenceDiagram
    participant Onboard as Onboard Process
    participant CLI as OpenShell CLI
    participant GW as Gateway Info Provider

    Onboard->>CLI: run "gateway select <GATEWAY_NAME>" (ignore errors)
    Onboard->>CLI: run "status"
    CLI-->>Onboard: statusOutput (may be empty / contain "Connected" or "Server Status")
    Onboard->>CLI: run "gateway info" and "gateway info -g"
    CLI-->>GW: gwInfoOutput, activeGatewayInfoOutput
    Onboard->>Onboard: isGatewayConnected(statusOutput)
    Onboard->>Onboard: getReportedGatewayName(...), hasStaleGateway(...), hasActiveGatewayInfo(...)
    Onboard-->>Onboard: determine healthy if (status indicates connected and name matches) OR (status empty but gw-info confirms name+endpoint)
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Poem

🐰 I nudged the shell to pick the door,

When silent status hid its song,
I checked the info, waited more,
On ARM64 the waits grew strong,
I hopped — now health replies before long.

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 16.67% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately describes the main fix addressing ARM64 gateway health detection failures in non-TTY environments, which is the primary objective of this PR.
Linked Issues check ✅ Passed All coding requirements from issue #1711 are met: isGatewayConnected() matches "Server Status" [#1711], isGatewayHealthy() uses gateway-info fallback [#1711], gateway select runs before probes [#1711], and ARM64 timeouts increased [#1711].
Out of Scope Changes check ✅ Passed All changes directly address issue #1711 requirements: gateway-state logic updates, onboard polling behavior improvements, and comprehensive test coverage align with the stated objectives.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Comment @coderabbitai help to get the list of available commands and usage tips.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (1)
test/gateway-state.test.ts (1)

77-93: Add a regression case for non-empty, non-connected status.

Line 77-93 should also assert that fallback does not mark healthy when status is present but explicitly disconnected. This will lock in the intended “empty-status-only” fallback behavior.

✅ Suggested test addition
 describe("isGatewayHealthy", () => {
+  it("returns false when status is present but disconnected", () => {
+    const statusDisconnected = `
+Server Status
+
+Gateway: nemoclaw
+Status: Disconnected
+`;
+    expect(isGatewayHealthy(statusDisconnected, GW_INFO_NAMED, GW_INFO_ACTIVE)).toBe(false);
+  });
+
   it("returns true when status shows Connected and gateway name matches", () => {
     expect(isGatewayHealthy(STATUS_CONNECTED, GW_INFO_NAMED, GW_INFO_ACTIVE)).toBe(true);
   });
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@test/gateway-state.test.ts` around lines 77 - 93, Add a regression test
ensuring that a non-empty status string that indicates "disconnected" does not
trigger the fallback healthy result: update the test suite around the existing
cases for isGatewayHealthy by adding a case that passes a non-empty disconnected
status (instead of ""), with GW_INFO_NAMED and GW_INFO_ACTIVE (or similar
GW_INFO_* fixtures), and assert isGatewayHealthy(disconnectedStatus,
GW_INFO_NAMED, GW_INFO_ACTIVE) returns false so only an empty status uses the
fallback logic.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@src/lib/gateway-state.ts`:
- Around line 94-97: The fallback health check currently returns true when
namedGatewayKnown && activeInfo && activeGatewayName === GATEWAY_NAME even if
the status output is non-empty; change the conditional to only apply the
fallback when the status output is empty/blank (e.g., add a check like !status
|| status.trim() === ''), so update the if that contains namedGatewayKnown,
activeInfo and activeGatewayName === GATEWAY_NAME to include the emptiness check
for status before returning true.

---

Nitpick comments:
In `@test/gateway-state.test.ts`:
- Around line 77-93: Add a regression test ensuring that a non-empty status
string that indicates "disconnected" does not trigger the fallback healthy
result: update the test suite around the existing cases for isGatewayHealthy by
adding a case that passes a non-empty disconnected status (instead of ""), with
GW_INFO_NAMED and GW_INFO_ACTIVE (or similar GW_INFO_* fixtures), and assert
isGatewayHealthy(disconnectedStatus, GW_INFO_NAMED, GW_INFO_ACTIVE) returns
false so only an empty status uses the fallback logic.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: adcd16f8-ccbd-4aca-bdf5-2899f0b208d8

📥 Commits

Reviewing files that changed from the base of the PR and between d3c1e49 and a094956.

📒 Files selected for processing (3)
  • src/lib/gateway-state.ts
  • src/lib/onboard.ts
  • test/gateway-state.test.ts

Comment thread src/lib/gateway-state.ts
@kagura-agent

Copy link
Copy Markdown
Contributor Author

@coderabbitai Good catch — the fallback was indeed too broad. Fixed in 3b0dada: added a statusEmpty guard so the fallback only triggers when statusOutput is empty/blank (after stripping ANSI). Also added a test case verifying that non-empty status output does not trigger the fallback path.

@coderabbitai

coderabbitai Bot commented Apr 10, 2026

Copy link
Copy Markdown
Contributor

Tip

For best results, initiate chat on the files or code changes.

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
git show 3b0dada --stat
git show 3b0dada -- src/lib/gateway-state.ts test/gateway-state.test.ts

Length of output: 1923


@kagura-agent: Thanks for the quick turnaround — the fix looks correct.

  • The statusEmpty guard (stripAnsi(statusOutput).trim().length === 0) properly handles ANSI-only output that would otherwise look non-empty, avoiding a subtle edge case.
  • The new test ("does not trigger fallback when status is non-empty") directly covers the regression I was concerned about: non-empty but unrecognized status no longer silently promotes a gateway to healthy via the fallback path.

Everything looks good. ✅

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick comments (2)
test/gateway-state.test.ts (2)

13-15: Unused imports: hasStaleGateway, hasActiveGatewayInfo, getReportedGatewayName.

These helper functions are imported but not directly tested. They're exercised indirectly through isGatewayHealthy and getGatewayReuseState. Consider either removing the unused imports or adding dedicated test cases for these utility functions.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@test/gateway-state.test.ts` around lines 13 - 15, The imports for
hasStaleGateway, hasActiveGatewayInfo, and getReportedGatewayName are unused in
this test file; either remove these three imports from the import list in
test/gateway-state.test.ts or add focused unit tests that call hasStaleGateway,
hasActiveGatewayInfo, and getReportedGatewayName directly (asserting expected
outputs for representative inputs) so they are covered; locate the import
statement that includes these symbols and either delete the three names or add
new test cases that reference those exact function names.

102-114: Consider adding tests for remaining GatewayReuseState values.

The current tests cover "healthy" and "missing" states well, including the ARM64 fallback path. For more complete coverage, consider adding tests for the "active-unnamed", "foreign-active", and "stale" states in a follow-up.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@test/gateway-state.test.ts` around lines 102 - 114, Add unit tests covering
the remaining GatewayReuseState values by adding new it() cases that call
getGatewayReuseState with inputs that produce "active-unnamed",
"foreign-active", and "stale"; for example, exercise the code paths using
combinations of GW_INFO_NAMED, GW_INFO_ACTIVE, STATUS_CONNECTED and empty or
mismatched gateway info strings to assert getGatewayReuseState returns
"active-unnamed", "foreign-active", and "stale" respectively (keep test names
descriptive and follow the existing describe("getGatewayReuseState") pattern).
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Nitpick comments:
In `@test/gateway-state.test.ts`:
- Around line 13-15: The imports for hasStaleGateway, hasActiveGatewayInfo, and
getReportedGatewayName are unused in this test file; either remove these three
imports from the import list in test/gateway-state.test.ts or add focused unit
tests that call hasStaleGateway, hasActiveGatewayInfo, and
getReportedGatewayName directly (asserting expected outputs for representative
inputs) so they are covered; locate the import statement that includes these
symbols and either delete the three names or add new test cases that reference
those exact function names.
- Around line 102-114: Add unit tests covering the remaining GatewayReuseState
values by adding new it() cases that call getGatewayReuseState with inputs that
produce "active-unnamed", "foreign-active", and "stale"; for example, exercise
the code paths using combinations of GW_INFO_NAMED, GW_INFO_ACTIVE,
STATUS_CONNECTED and empty or mismatched gateway info strings to assert
getGatewayReuseState returns "active-unnamed", "foreign-active", and "stale"
respectively (keep test names descriptive and follow the existing
describe("getGatewayReuseState") pattern).

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: a2d2d22a-a3e9-40a3-ae14-8847d1552978

📥 Commits

Reviewing files that changed from the base of the PR and between a094956 and 3b0dada.

📒 Files selected for processing (2)
  • src/lib/gateway-state.ts
  • test/gateway-state.test.ts

@wscurran wscurran added bug platform: arm64 Affects ARM64 or aarch64 architecture labels Apr 10, 2026
@wscurran

Copy link
Copy Markdown
Contributor

✨ Thanks for submitting this PR, which proposes a fix for a bug with gateway health detection on ARM64 and may improve the overall reliability of the onboard process.


Possibly related open issues:

- Add regression test for Disconnected status (non-empty status must
  not trigger ARM64 fallback healthy path)
- Add dedicated unit tests for hasStaleGateway, hasActiveGatewayInfo,
  and getReportedGatewayName (previously imported but only used
  indirectly)
- Add tests for remaining GatewayReuseState values: foreign-active,
  stale, active-unnamed

Signed-off-by: kagura-agent <kagura@openclaw.ai>

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick comments (2)
test/gateway-state.test.ts (2)

34-46: Deduplicate identical gateway-info fixtures to reduce drift.

GW_INFO_NAMED and GW_INFO_ACTIVE are identical today; sharing one base fixture makes future fixture edits safer.

Diff proposal
-const GW_INFO_NAMED = `
+const GW_INFO_NAMED_AND_ACTIVE = `
 Gateway Info

 Gateway: nemoclaw
 Gateway endpoint: https://127.0.0.1:8080/
 `;
 
-const GW_INFO_ACTIVE = `
-Gateway Info
-
-Gateway: nemoclaw
-Gateway endpoint: https://127.0.0.1:8080/
-`;
+const GW_INFO_NAMED = GW_INFO_NAMED_AND_ACTIVE;
+const GW_INFO_ACTIVE = GW_INFO_NAMED_AND_ACTIVE;
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@test/gateway-state.test.ts` around lines 34 - 46, GW_INFO_NAMED and
GW_INFO_ACTIVE are identical fixtures which can diverge accidentally; replace
the duplicate strings with a single shared fixture (e.g., GW_INFO or
BASE_GW_INFO) and have both GW_INFO_NAMED and GW_INFO_ACTIVE reference that
single value (or remove one and reuse the other where referenced) so future
edits are applied in one place; update any tests importing/using
GW_INFO_NAMED/GW_INFO_ACTIVE to use the shared symbol.

152-179: Add one ANSI-only status regression test for fallback eligibility.

Given the status-empty guard strips ANSI before trim, a focused ANSI-only input test would better pin the ARM64/non-TTY edge case.

Diff proposal
 describe("isGatewayHealthy", () => {
@@
   it("returns true via fallback when status is empty but gateway info confirms health (`#1711`)", () => {
     // ARM64 / non-TTY: openshell status returns ""
     expect(isGatewayHealthy("", GW_INFO_NAMED, GW_INFO_ACTIVE)).toBe(true);
   });
+
+  it("returns true via fallback when status is ANSI-only", () => {
+    const ansiOnlyStatus = "\u001b[2K\u001b[0m";
+    expect(isGatewayHealthy(ansiOnlyStatus, GW_INFO_NAMED, GW_INFO_ACTIVE)).toBe(true);
+  });
@@
 });
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@test/gateway-state.test.ts` around lines 152 - 179, Add a test that verifies
ANSI-only status triggers the fallback: call isGatewayHealthy with a status
string containing only ANSI escape sequences (e.g., green/reset codes) and
GW_INFO_NAMED and GW_INFO_ACTIVE as the other args, and assert it returns true;
place it near the other cases and name it like "returns true via fallback when
status is ANSI-only" to ensure the ANSI stripping + empty check allows fallback,
referencing isGatewayHealthy, GW_INFO_NAMED and GW_INFO_ACTIVE to locate the
test area.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Nitpick comments:
In `@test/gateway-state.test.ts`:
- Around line 34-46: GW_INFO_NAMED and GW_INFO_ACTIVE are identical fixtures
which can diverge accidentally; replace the duplicate strings with a single
shared fixture (e.g., GW_INFO or BASE_GW_INFO) and have both GW_INFO_NAMED and
GW_INFO_ACTIVE reference that single value (or remove one and reuse the other
where referenced) so future edits are applied in one place; update any tests
importing/using GW_INFO_NAMED/GW_INFO_ACTIVE to use the shared symbol.
- Around line 152-179: Add a test that verifies ANSI-only status triggers the
fallback: call isGatewayHealthy with a status string containing only ANSI escape
sequences (e.g., green/reset codes) and GW_INFO_NAMED and GW_INFO_ACTIVE as the
other args, and assert it returns true; place it near the other cases and name
it like "returns true via fallback when status is ANSI-only" to ensure the ANSI
stripping + empty check allows fallback, referencing isGatewayHealthy,
GW_INFO_NAMED and GW_INFO_ACTIVE to locate the test area.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 7ea57d7d-bbc5-4f6a-9e20-13f44c0abe75

📥 Commits

Reviewing files that changed from the base of the PR and between 3b0dada and 716ba07.

📒 Files selected for processing (1)
  • test/gateway-state.test.ts

Address CodeRabbit review suggestions:
- Share one base fixture for GW_INFO_NAMED/GW_INFO_ACTIVE
- Add ANSI-escape-only status test (fallback triggers after stripping)
@kagura-agent

Copy link
Copy Markdown
Contributor Author

Addressed the review suggestions in 12270e2:

  1. Deduplicated fixturesGW_INFO_NAMED and GW_INFO_ACTIVE now share a single GW_INFO_BASE constant
  2. Added ANSI-only status test — verifies fallback triggers when status contains only ANSI escape sequences (stripped to empty)
  3. Disconnected-status regression test — was already present from the initial commit ✅
  4. Unused importshasStaleGateway, hasActiveGatewayInfo, and getReportedGatewayName are all actively tested in their own describe blocks, so kept as-is

All 32 gateway-state tests pass.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick comments (1)
test/gateway-state.test.ts (1)

19-213: Consider centralizing the "nemoclaw" literal into one test constant.

The gateway name is repeated across multiple fixtures/assertions. A single constant would reduce maintenance drift if the default name changes.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@test/gateway-state.test.ts` around lines 19 - 213, Introduce a single test
constant for the gateway name (e.g., GATEWAY_NAME = "nemoclaw") and replace all
hard-coded "nemoclaw" literals in the fixtures and expectations
(STATUS_CONNECTED, STATUS_SERVER_STATUS_ONLY, GW_INFO_BASE, GW_INFO_NAMED,
GW_INFO_ACTIVE, GW_INFO_UNNAMED_ENDPOINT, STATUS_FOREIGN, and any uses of
replace that change "nemoclaw") to reference that constant; ensure tests that
build altered names (like other-gw) still work by replacing GATEWAY_NAME when
composing those variants and update references in tests that call
hasStaleGateway, getReportedGatewayName, isGatewayHealthy, and
getGatewayReuseState so they use the new GATEWAY_NAME constant.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Nitpick comments:
In `@test/gateway-state.test.ts`:
- Around line 19-213: Introduce a single test constant for the gateway name
(e.g., GATEWAY_NAME = "nemoclaw") and replace all hard-coded "nemoclaw" literals
in the fixtures and expectations (STATUS_CONNECTED, STATUS_SERVER_STATUS_ONLY,
GW_INFO_BASE, GW_INFO_NAMED, GW_INFO_ACTIVE, GW_INFO_UNNAMED_ENDPOINT,
STATUS_FOREIGN, and any uses of replace that change "nemoclaw") to reference
that constant; ensure tests that build altered names (like other-gw) still work
by replacing GATEWAY_NAME when composing those variants and update references in
tests that call hasStaleGateway, getReportedGatewayName, isGatewayHealthy, and
getGatewayReuseState so they use the new GATEWAY_NAME constant.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: da709aa8-930e-4736-b739-782f419771d0

📥 Commits

Reviewing files that changed from the base of the PR and between 716ba07 and 12270e2.

📒 Files selected for processing (1)
  • test/gateway-state.test.ts

@cv cv added the v0.0.18 label Apr 16, 2026
@kagura-agent kagura-agent changed the title fix: ARM64 gateway health detection fails on non-TTY environments fix: arm64 gateway health detection fails on non-TTY environments Apr 16, 2026
When status reports Connected with Gateway: nemoclaw, isGatewayHealthy
returns true via the primary path, so getGatewayReuseState correctly
returns 'healthy' not 'active-unnamed'.

Signed-off-by: kagura-agent <kagura-agent@users.noreply.github.com>
@prekshivyas prekshivyas self-assigned this Apr 16, 2026

@prekshivyas prekshivyas left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Solid fix for ARM64 onboarding — fallback is properly guarded on empty status, assertion change is correct (Connected + matching name = healthy), tests are comprehensive. @kagura-agent can you rebase onto main to trigger CI?

@ericksoa
ericksoa merged commit 64e5a41 into NVIDIA:main Apr 16, 2026
9 checks passed
@wscurran wscurran added bug-fix PR fixes a bug or regression and removed fix labels Jun 3, 2026
@wscurran wscurran removed the bug label Jun 8, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bug-fix PR fixes a bug or regression platform: arm64 Affects ARM64 or aarch64 architecture

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Gateway health detection fails on ARM64 (Raspberry Pi 5) — onboard loops forever

5 participants