Skip to content

refactor(qa): add shared QA channel contract and harden worker startup#64562

Merged
mcaxtr merged 14 commits into
mainfrom
refactor/qa-transport-hardening
Apr 12, 2026
Merged

refactor(qa): add shared QA channel contract and harden worker startup#64562
mcaxtr merged 14 commits into
mainfrom
refactor/qa-transport-hardening

Conversation

@mcaxtr

@mcaxtr mcaxtr commented Apr 11, 2026

Copy link
Copy Markdown
Member

Problem

The shared E2E QA runner in qa-lab was directly coupled to qa-channel.

Files like extensions/qa-lab/src/suite.ts and extensions/qa-lab/src/qa-gateway-config.ts were assuming qa-channel behavior inline, including:

  • readiness checks
  • gateway config wiring
  • delivery fields
  • message-state access
  • transport-backed actions
  • report notes

That coupling makes the shared runner own behavior that belongs to a QA channel implementation. If another QA channel implementation is added later, the shared runner would need more transport-specific branches, or a separate runner would need to duplicate orchestration, reporting, worker lifecycle, and scenario execution.

While validating this refactor, the full suite also exposed shared worker lifecycle issues:

  • transient gateway startup races
  • RPC startup/token mismatch races
  • restart/shutdown instability under concurrent scenario execution

What this PR changes

1. Introduces a shared QA channel contract

This PR adds an explicit shared QA channel contract in:

  • extensions/qa-lab/src/qa-transport.ts
  • extensions/qa-lab/src/qa-transport-registry.ts

It moves the current qa-channel behavior into its own implementation in:

  • extensions/qa-lab/src/qa-channel-transport.ts

It rewires the shared suite to depend on that contract instead of directly assuming qa-channel behavior in:

  • extensions/qa-lab/src/suite.ts
  • extensions/qa-lab/src/qa-gateway-config.ts

2. Extracts common QA channel capabilities

The common QA channel capabilities now live in the shared base and are inherited by implementations.

That shared capability surface covers:

  • send inbound message
  • wait for outbound message
  • read/reset normalized message state
  • generic action execution
  • generic readiness helpers
  • common transcript/state assertions

qa-channel now uses that shared capability base as the first implementation.

3. Hardens shared worker startup and restart behavior

This PR also hardens:

  • extensions/qa-lab/src/gateway-child.ts
  • extensions/qa-lab/src/gateway-rpc-client.ts
  • src/gateway/server-close.ts
  • src/gateway/server-channels.ts

The hardening includes:

  • retrying transient startup races
  • treating retryable RPC startup failures correctly
  • requiring a real RPC success before a worker gateway is treated as ready
  • using per-client RPC ordering instead of cross-worker serialization
  • making restart/shutdown behavior more reliable

Why this structure

This PR makes the shared runner own shared orchestration and makes the QA channel implementation own its transport-specific behavior.

After this change:

  • qa-lab owns suite orchestration
  • qa-channel is an implementation of the shared QA channel contract
  • the shared runner no longer depends on qa-channel internals

That gives the shared QA layer a clean boundary and removes transport-specific behavior from the shared runner.

What did not change

  • existing qa-channel scenarios still work
  • no current scenario migration is required
  • this PR does not add qa-whatsapp, qa-telegram, or any other new QA channel yet
  • current maintainers using the existing suite should see the same behavior

Validation

This refactor was validated against the current shared QA system.

Focused tests

Ran:

  • pnpm test extensions/qa-lab/src/qa-channel-transport.test.ts extensions/qa-lab/src/qa-gateway-config.test.ts extensions/qa-lab/src/gateway-child.test.ts extensions/qa-lab/src/gateway-rpc-client.test.ts extensions/qa-lab/src/suite.test.ts extensions/qa-lab/src/live-transports/shared/live-gateway.runtime.test.ts

Result:

  • 63/63 tests passed

Build

Ran:

  • pnpm build

Result:

  • passed

Full existing QA suite

Ran:

  • pnpm openclaw qa suite --output-dir .artifacts/qa-e2e/transport-hardening-pr

Result:

  • 37/37 scenarios passed

@aisle-research-bot

aisle-research-bot Bot commented Apr 11, 2026

Copy link
Copy Markdown

🔒 Aisle Security Analysis

We found 3 potential security issue(s) in this PR:

# Severity Title
1 🟠 High Symlink TOCTOU allows arbitrary directory clearing outside repo in QA artifact preservation
2 🟡 Medium Channel stop timeout leaves channel task running and unmanaged after abort
3 🟡 Medium Sensitive data exposure via unredacted failure reply text in QA suite reports
1. 🟠 Symlink TOCTOU allows arbitrary directory clearing outside repo in QA artifact preservation
Property Value
Severity High
CWE CWE-367
Location extensions/qa-lab/src/gateway-child.ts:147-159

Description

preserveQaGatewayDebugArtifacts() attempts to constrain preserveToDir to the repository by calling ensureRepoBoundDirectory(), but then performs destructive operations (readdir + rm) on the path after the check using only the returned pathname.

Because the filesystem can change between the validation and use (TOCTOU), an attacker with write access to the repo filesystem can:

  • Provide a valid in-repo preserveToDir during ensureRepoBoundDirectory()
  • Replace that directory with a symlink to an arbitrary location after validation but before clearQaGatewayArtifactDir()
  • Cause clearQaGatewayArtifactDir() to iterate and rm -rf entries in the symlink target directory (outside the repo)

Vulnerable code:

const preserveToDir = params.repoRoot
  ? await ensureRepoBoundDirectory(params.repoRoot, params.preserveToDir, "QA gateway artifact directory", { mode: 0o700 })
  : params.preserveToDir;
await fs.mkdir(preserveToDir, { recursive: true, mode: 0o700 });
await clearQaGatewayArtifactDir(preserveToDir);

While this primarily affects local/CI threat models, it is still an arbitrary delete/write primitive if untrusted code can manipulate the workspace concurrently (e.g., malicious PR code, compromised dependency running tests, or a multi-tenant runner).

Recommendation

Avoid validating a path and then later using it by name for destructive operations.

Mitigations (prefer combining multiple):

  1. Re-validate immediately before destructive use and refuse symlinks for the final directory itself:
import { constants as FS_CONST } from "node:fs";

async function assertSafeDir(dir: string, repoRoot: string) {// Ensure dir itself is not a symlink
  const st = await fs.lstat(dir);
  if (st.isSymbolicLink()) throw new Error("preserveToDir must not be a symlink");// Ensure realpath is within repo at time-of-use
  const repoReal = await fs.realpath(repoRoot);
  const dirReal = await fs.realpath(dir);
  const rel = path.relative(repoReal, dirReal);
  if (rel.startsWith("..") || path.isAbsolute(rel)) throw new Error("preserveToDir must stay within repo");
}

await assertSafeDir(preserveToDir, params.repoRoot);
await clearQaGatewayArtifactDir(preserveToDir);
  1. Avoid following symlinks when opening/operating on the directory by using file-descriptor-based APIs (open with O_NOFOLLOW where supported and fd-relative operations). If full openat semantics aren’t feasible in Node, at least lstat + realpath immediately before each readdir/rm and abort if the directory’s realpath changes.

  2. Consider writing artifacts into a fresh, uniquely named directory you create yourself under a trusted root (e.g., ${outputDir}/artifacts/...) rather than clearing an attacker-chosen directory.

2. 🟡 Channel stop timeout leaves channel task running and unmanaged after abort
Property Value
Severity Medium
CWE CWE-400
Location src/gateway/server-channels.ts:570-585

Description

In stopChannel, if the channel task does not settle within CHANNEL_STOP_ABORT_TIMEOUT_MS (5s) after abort() is signaled, the function returns early without removing the task/abort handles from internal stores.

Impact:

  • A user/admin initiated stop (or shutdown) may not actually stop the channel’s background task, so it can continue to process external events/messages.
  • Because store.tasks/store.aborts are not cleared on timeout, subsequent operations can be stuck:
    • startChannelInternal will refuse to start a new task (if (store.tasks.has(id)) return;), leaving the channel in a permanent “running but cannot be restarted/stopped cleanly” state.
    • Repeated stopChannel calls will repeatedly hit the same timeout and return, causing an unbounded resource leak if the task holds sockets/timers, and preventing reliable shutdown.

Vulnerable code:

const stoppedCleanly = await waitForChannelStopGracefully(task, CHANNEL_STOP_ABORT_TIMEOUT_MS);
if (!stoppedCleanly) {
  setRuntime(channelId, id, { running: true, lastError: `channel stop timed out...` });
  return; // leaves store.aborts/store.tasks entries intact
}
store.aborts.delete(id);
store.tasks.delete(id);

This is a security-relevant availability/integrity issue when “stop” is expected to prevent further processing (e.g., disabling an integration) and/or when shutdown expects tasks to terminate.

Recommendation

Ensure stop operations leave the system in a consistent and enforceable state even when graceful shutdown times out.

Recommended fixes (choose one based on desired semantics):

  1. Do not return early: clear bookkeeping entries and mark the runtime as stopping/unknown, while continuing to observe/log the task until it settles.

  2. Track and expose a distinct stopping: true state, and prevent message handling in the plugin when in stopping state.

  3. If a hard stop is required, implement a forceful termination mechanism appropriate for the runtime (e.g., closing underlying connections, canceling consumers), and/or treat timeout as an error that blocks shutdown.

Example (bookkeeping cleanup + explicit stopping state):

if (!stoppedCleanly) {
  store.aborts.delete(id);
  store.tasks.delete(id);
  setRuntime(channelId, id, {
    accountId: id,
    running: false,
    restartPending: false,
    lastError: `channel stop timed out after ${CHANNEL_STOP_ABORT_TIMEOUT_MS}ms`,// optionally add: stoppingFailed: true
  });
  return;
}

If the task can still run after cleanup, additionally attach a .catch/.finally handler to ensure it cannot become an unobserved resource leak, and ensure plugins check abort signals and stop processing promptly.

3. 🟡 Sensitive data exposure via unredacted failure reply text in QA suite reports
Property Value
Severity Medium
CWE CWE-532
Location extensions/qa-lab/src/qa-transport.ts:118-121

Description

The QA suite transport wait helper throws an Error containing the raw outbound message text (or the extracted failure text) when it detects a failure reply. That error is later captured and written into QA suite markdown reports as step/scenario details.

This can leak sensitive information into test artifacts (e.g., .artifacts/qa-e2e/.../report.md) when failure replies include provider error messages or other content that may contain secrets/tokens.

  • assertNoFailureReplies() throws new Error(...) containing message text.
  • runScenario() catches the error, converts it to text via formatErrorMessage(error), and stores it in the report details.

Vulnerable code:

throw new Error(extractQaFailureReplyText(failureMessage.text) ?? failureMessage.text);

Even though a log redaction helper exists (gateway-log-redaction.ts), it is not applied to failure reply text before it is persisted into reports.

Recommendation

Redact or avoid persisting raw message text in thrown errors and reports.

Options:

  1. Redact failure text before throwing (recommended):
import { redactQaGatewayDebugText } from "./gateway-log-redaction.js";

const failureText = extractQaFailureReplyText(failureMessage.text) ?? failureMessage.text;
throw new Error(redactQaGatewayDebugText(failureText));
  1. Store a stable, non-sensitive error code and keep the raw transcript only in protected runtime logs (or behind an explicit OPENCLAW_QA_DEBUG=1 gate).

  2. If transcript text must be included, apply secret/token scrubbing (Bearer tokens, API keys, OAuth tokens, token= URL params, etc.) consistently for:

  • failure reply text
  • formatted transcripts (e.g. formatTransportTranscript)
  • report rendering inputs

Analyzed PR: #64562 at commit 8ee100e

Last updated on: 2026-04-12T17:46:49Z

@openclaw-barnacle openclaw-barnacle Bot added docs Improvements or additions to documentation gateway Gateway runtime extensions: qa-lab size: XL maintainer Maintainer-authored PR labels Apr 11, 2026

@chatgpt-codex-connector chatgpt-codex-connector 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.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: d1780efb25

ℹ️ About Codex in GitHub

Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".

Comment thread extensions/qa-lab/src/qa-transport.ts
@greptile-apps

greptile-apps Bot commented Apr 11, 2026

Copy link
Copy Markdown
Contributor

Greptile Summary

This PR introduces a shared QaTransportAdapter contract (qa-transport.ts, qa-transport-registry.ts) with a concrete qa-channel implementation (qa-channel-transport.ts), decoupling the shared QA runner from qa-channel internals. It also hardens gateway worker startup by adding per-attempt port selection with retries, graceful/forced HTTP server close, and bounded channel-stop timeouts.

All 37 existing QA scenarios and 63 unit tests pass.

Confidence Score: 5/5

Safe to merge; all findings are P2 style/hardening suggestions that do not affect correctness under normal operation.

The refactor is well-structured, boundary-clean, and thoroughly validated (63 unit tests + 37 E2E scenarios pass). The two flagged issues are both in unreachable or edge-case paths: the extra config build with a throwaway port is a code-smell but idempotent in practice, and the rpcClient cleanup gap in the outer catch only matters if the post-loop defensive check throws, which cannot happen when the loop exits via break. All remaining feedback is P2.

extensions/qa-lab/src/gateway-child.ts — two minor cleanup/style items in the retry loop and outer catch.

Comments Outside Diff (1)

  1. extensions/qa-lab/src/gateway-child.ts, line 885-892 (link)

    P2 Extra buildStagedGatewayConfig invocation before the retry loop

    buildStagedGatewayConfig(1) is called here only to extract allowedPluginIds, but it also runs stageQaLiveAnthropicSetupToken and any caller-supplied mutateConfig as side effects — once before the loop, and then again on each retry attempt. The port 1 is never listened on, but the token-staging and mutateConfig callbacks may have observable side effects (writing credential files, transforming config). Consider extracting just the plugin-ID derivation into a helper that doesn't require a full staged config, or document that both callbacks must be idempotent.

    Prompt To Fix With AI
    This is a comment left during a code review.
    Path: extensions/qa-lab/src/gateway-child.ts
    Line: 885-892
    
    Comment:
    **Extra `buildStagedGatewayConfig` invocation before the retry loop**
    
    `buildStagedGatewayConfig(1)` is called here only to extract `allowedPluginIds`, but it also runs `stageQaLiveAnthropicSetupToken` and any caller-supplied `mutateConfig` as side effects — once before the loop, and then again on each retry attempt. The port `1` is never listened on, but the token-staging and `mutateConfig` callbacks may have observable side effects (writing credential files, transforming config). Consider extracting just the plugin-ID derivation into a helper that doesn't require a full staged config, or document that both callbacks must be idempotent.
    
    How can I resolve this? If you propose a fix, please make it concise.
Prompt To Fix All With AI
This is a comment left during a code review.
Path: extensions/qa-lab/src/gateway-child.ts
Line: 885-892

Comment:
**Extra `buildStagedGatewayConfig` invocation before the retry loop**

`buildStagedGatewayConfig(1)` is called here only to extract `allowedPluginIds`, but it also runs `stageQaLiveAnthropicSetupToken` and any caller-supplied `mutateConfig` as side effects — once before the loop, and then again on each retry attempt. The port `1` is never listened on, but the token-staging and `mutateConfig` callbacks may have observable side effects (writing credential files, transforming config). Consider extracting just the plugin-ID derivation into a helper that doesn't require a full staged config, or document that both callbacks must be idempotent.

How can I resolve this? If you propose a fix, please make it concise.

---

This is a comment left during a code review.
Path: extensions/qa-lab/src/gateway-child.ts
Line: 1038-1043

Comment:
**`rpcClient` not cleaned up in outer error catch**

If the defensive post-loop check (`!child || !cfg || !baseUrl || !wsUrl || !rpcClient`) were to throw — only possible via a programming error, since a successful `break` always sets all five — the outer `catch` terminates `child` but never calls `rpcClient.stop()`, leaving the WebSocket connection open. Adding `await rpcClient?.stop().catch(() => {})` alongside `terminateChildProcess(child)` in that outer catch would make the cleanup symmetric with the retry-attempt cleanup path.

How can I resolve this? If you propose a fix, please make it concise.

Reviews (1): Last reviewed commit: "refactor(qa): harden worker gateway star..." | Re-trigger Greptile

Comment thread extensions/qa-lab/src/gateway-child.ts

@chatgpt-codex-connector chatgpt-codex-connector 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.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 2215302eb4

ℹ️ About Codex in GitHub

Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".

Comment thread extensions/qa-lab/src/gateway-child.ts

@chatgpt-codex-connector chatgpt-codex-connector 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.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 741041bd0b

ℹ️ About Codex in GitHub

Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".

Comment thread extensions/qa-lab/src/suite.ts
@mcaxtr
mcaxtr force-pushed the refactor/qa-transport-hardening branch from 741041b to 48e4f65 Compare April 11, 2026 02:23

@chatgpt-codex-connector chatgpt-codex-connector 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.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 48e4f656dc

ℹ️ About Codex in GitHub

Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".

Comment thread src/gateway/server-close.ts Outdated

@chatgpt-codex-connector chatgpt-codex-connector 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.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: ffb37830da

ℹ️ About Codex in GitHub

Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".

Comment thread src/gateway/server-channels.ts Outdated

@chatgpt-codex-connector chatgpt-codex-connector 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.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 2d1cd92fc5

ℹ️ About Codex in GitHub

Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".

Comment thread extensions/qa-lab/src/gateway-child.ts

@chatgpt-codex-connector chatgpt-codex-connector 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.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 77b0a3e876

ℹ️ About Codex in GitHub

Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".

Comment thread extensions/qa-lab/src/suite.ts

@chatgpt-codex-connector chatgpt-codex-connector 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.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: f9687012ae

ℹ️ About Codex in GitHub

Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".

Comment thread extensions/qa-lab/src/gateway-child.ts

@chatgpt-codex-connector chatgpt-codex-connector 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.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: b13234c7fa

ℹ️ About Codex in GitHub

Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".

Comment thread extensions/qa-lab/src/gateway-child.ts Outdated
@mcaxtr
mcaxtr force-pushed the refactor/qa-transport-hardening branch from 979d2f0 to a23e259 Compare April 12, 2026 16:08
@mcaxtr

mcaxtr commented Apr 12, 2026

Copy link
Copy Markdown
Member Author

Follow-up on the updated Aisle summary:

Addressed in a23e259fad:

  • Broadened QA gateway Bearer-token redaction in extensions/qa-lab/src/gateway-log-redaction.ts so sanitized logs also catch tokens containing characters like +, /, and =.
  • Added regression coverage through the existing gateway-child and gateway-rpc-client tests.

Reviewed and not taking in this PR:

  • Destructive preserve-dir clearing in extensions/qa-lab/src/gateway-child.ts
    • The reported “wipe arbitrary repo directories” impact is overstated for the actual suite path in this PR. preserveToDir is derived from the suite-owned output directory (outputDir/artifacts/gateway-runtime), not from an arbitrary external path.
    • There is still an internal hardening concern because preserveQaGatewayDebugArtifacts() will clear whatever repo-bound directory it is handed. I agree that can be tightened further, but I am not expanding this PR again for that follow-up.
  • Wildcard allowFrom in extensions/qa-lab/src/qa-channel-transport.ts
    • I am not taking this here. The risk depends on exposing QA injection endpoints beyond the intended local/loopback boundary. That is not the usage model of this PR.
  • Stop-timeout bookkeeping in src/gateway/server-channels.ts
    • I am not taking this here either. The current behavior is an intentional tradeoff to avoid starting a second task on top of a still-live one. Changing that safely needs a larger lifecycle/state design, not another small patch on this PR.

So, for the current Aisle summary:

  • Bearer-token redaction: fixed
  • preserve-dir clearing: reviewed, follow-up hardening
  • wildcard allowFrom: reviewed, not taking in this PR
  • stop-timeout bookkeeping: reviewed, not taking in this PR

@chatgpt-codex-connector chatgpt-codex-connector 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.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: a23e259fad

ℹ️ About Codex in GitHub

Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".

Comment thread extensions/qa-lab/src/gateway-child.ts Outdated
@openclaw-barnacle openclaw-barnacle Bot added the channel: qa-channel Channel integration: qa-channel label Apr 12, 2026
@mcaxtr
mcaxtr merged commit 000fc7f into main Apr 12, 2026
137 of 142 checks passed
@mcaxtr
mcaxtr deleted the refactor/qa-transport-hardening branch April 12, 2026 18:03
lovewanwan pushed a commit to lovewanwan/openclaw that referenced this pull request Apr 28, 2026
openclaw#64562)

* refactor(qa): add shared transport contract and suite migration

* refactor(qa): harden worker gateway startup

* fix(qa): scope waits and sanitize shutdown artifacts

* fix(qa): confine artifacts and redact preserved logs

* fix(qa): block symlink escapes in artifact paths

* fix(gateway): clear shutdown race timers

* fix(qa): harden shutdown cleanup paths

* fix(qa): sanitize gateway logs in thrown errors

* fix(qa): harden suite startup and artifact paths

* fix(qa): stage bundled plugins from mutated config

* fix(qa): broaden gateway log bearer redaction

* fix(qa-channel): restore runtime export

* fix(qa): stop failed gateway startups as a process tree

* fix(qa-channel): load runtime hook from api surface
ogt-redknie pushed a commit to ogt-redknie/OPENX that referenced this pull request May 2, 2026
openclaw#64562)

* refactor(qa): add shared transport contract and suite migration

* refactor(qa): harden worker gateway startup

* fix(qa): scope waits and sanitize shutdown artifacts

* fix(qa): confine artifacts and redact preserved logs

* fix(qa): block symlink escapes in artifact paths

* fix(gateway): clear shutdown race timers

* fix(qa): harden shutdown cleanup paths

* fix(qa): sanitize gateway logs in thrown errors

* fix(qa): harden suite startup and artifact paths

* fix(qa): stage bundled plugins from mutated config

* fix(qa): broaden gateway log bearer redaction

* fix(qa-channel): restore runtime export

* fix(qa): stop failed gateway startups as a process tree

* fix(qa-channel): load runtime hook from api surface
github-actions Bot pushed a commit to Desicool/openclaw that referenced this pull request May 9, 2026
openclaw#64562)

* refactor(qa): add shared transport contract and suite migration

* refactor(qa): harden worker gateway startup

* fix(qa): scope waits and sanitize shutdown artifacts

* fix(qa): confine artifacts and redact preserved logs

* fix(qa): block symlink escapes in artifact paths

* fix(gateway): clear shutdown race timers

* fix(qa): harden shutdown cleanup paths

* fix(qa): sanitize gateway logs in thrown errors

* fix(qa): harden suite startup and artifact paths

* fix(qa): stage bundled plugins from mutated config

* fix(qa): broaden gateway log bearer redaction

* fix(qa-channel): restore runtime export

* fix(qa): stop failed gateway startups as a process tree

* fix(qa-channel): load runtime hook from api surface
globalcaos pushed a commit to globalcaos/tinkerclaw that referenced this pull request May 13, 2026
openclaw#64562)

* refactor(qa): add shared transport contract and suite migration

* refactor(qa): harden worker gateway startup

* fix(qa): scope waits and sanitize shutdown artifacts

* fix(qa): confine artifacts and redact preserved logs

* fix(qa): block symlink escapes in artifact paths

* fix(gateway): clear shutdown race timers

* fix(qa): harden shutdown cleanup paths

* fix(qa): sanitize gateway logs in thrown errors

* fix(qa): harden suite startup and artifact paths

* fix(qa): stage bundled plugins from mutated config

* fix(qa): broaden gateway log bearer redaction

* fix(qa-channel): restore runtime export

* fix(qa): stop failed gateway startups as a process tree

* fix(qa-channel): load runtime hook from api surface
github-actions Bot pushed a commit to Desicool/openclaw that referenced this pull request May 24, 2026
openclaw#64562)

* refactor(qa): add shared transport contract and suite migration

* refactor(qa): harden worker gateway startup

* fix(qa): scope waits and sanitize shutdown artifacts

* fix(qa): confine artifacts and redact preserved logs

* fix(qa): block symlink escapes in artifact paths

* fix(gateway): clear shutdown race timers

* fix(qa): harden shutdown cleanup paths

* fix(qa): sanitize gateway logs in thrown errors

* fix(qa): harden suite startup and artifact paths

* fix(qa): stage bundled plugins from mutated config

* fix(qa): broaden gateway log bearer redaction

* fix(qa-channel): restore runtime export

* fix(qa): stop failed gateway startups as a process tree

* fix(qa-channel): load runtime hook from api surface
jameslcowan pushed a commit to jameslcowan/openclaw that referenced this pull request Jun 2, 2026
openclaw#64562)

* refactor(qa): add shared transport contract and suite migration

* refactor(qa): harden worker gateway startup

* fix(qa): scope waits and sanitize shutdown artifacts

* fix(qa): confine artifacts and redact preserved logs

* fix(qa): block symlink escapes in artifact paths

* fix(gateway): clear shutdown race timers

* fix(qa): harden shutdown cleanup paths

* fix(qa): sanitize gateway logs in thrown errors

* fix(qa): harden suite startup and artifact paths

* fix(qa): stage bundled plugins from mutated config

* fix(qa): broaden gateway log bearer redaction

* fix(qa-channel): restore runtime export

* fix(qa): stop failed gateway startups as a process tree

* fix(qa-channel): load runtime hook from api surface
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

channel: qa-channel Channel integration: qa-channel docs Improvements or additions to documentation extensions: qa-lab gateway Gateway runtime maintainer Maintainer-authored PR size: XL

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant