Repository navigation
test(e2e): fix EXDEV fixture permissions #10808
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Merged
Changes from 6 commits
Commits
Show all changes
62 commits
Select commit
Hold shift + click to select a range
2e935c7
test(e2e): fix EXDEV fixture permissions
rsliter b745aae
test(e2e): cover EXDEV fixture permissions
rsliter 1bc9355
test(e2e): resume delayed EXDEV pairing
rsliter 1b2cef9
test(e2e): reconcile delayed pairing resume
rsliter 44df48c
test(e2e): expose fixture through policy
rsliter a2589be
merge: refresh main for typecheck
rsliter 601c616
test(e2e): harden EXDEV retry handoff
rsliter 4e2efeb
merge: refresh main for advisor fixes
rsliter 626ee1e
merge: refresh main for CI fixes
rsliter 7111aca
test(e2e): prove EXDEV install mutation
rsliter f3cd488
test(e2e): verify cross-device identity
rsliter 858916b
test(e2e): bind EXDEV fixture identities
rsliter 7ed4e18
docs(e2e): align EXDEV lifecycle evidence
rsliter 7754238
test(e2e): remove redundant runtime version alias
rsliter 6333774
test(e2e): validate EXDEV runtime anchor
rsliter d1bce9e
Merge remote-tracking branch 'origin/main' into codex/fix-exdev-fixtu…
rsliter e2996f6
Merge remote-tracking branch 'origin/main' into codex/fix-exdev-fixtu…
rsliter 5fa7fb0
test(e2e): follow retry evidence move
rsliter eeb318d
Merge remote-tracking branch 'origin/main' into codex/fix-exdev-fixtu…
rsliter c288bc7
test(e2e): recover pairing during recreation
rsliter cfbfe1a
test(e2e): cover recreation retry wiring
rsliter 6202b18
Merge remote-tracking branch 'origin/main' into codex/fix-exdev-fixtu…
rsliter 82c5ba2
test(e2e): fail closed without diagnostics
rsliter ce3b1d8
Merge remote-tracking branch 'origin/main' into codex/fix-exdev-fixtu…
rsliter 6cf5378
test(e2e): validate canonical OpenShell features
rsliter 518f40d
Merge remote-tracking branch 'origin/main' into codex/fix-exdev-fixtu…
rsliter 197c750
merge: refresh main into EXDEV fixture repair
rsliter cfd48df
merge: refresh PR #10808 from main
rsliter fea5eba
merge: refresh PR #10808 from main
rsliter 17ebfad
test(e2e): reconcile EXDEV assertion budget
rsliter 5cd3827
test(e2e): fail closed on EXDEV pairing gaps
rsliter 2f25385
merge: refresh PR #10808 from main
rsliter 29b1421
docs(e2e): qualify EXDEV diagnostic evidence
rsliter 74ed4ab
test(e2e): restore EXDEV fixture runtime user
rsliter f376db7
merge: refresh PR #10808 from main
rsliter 36463bd
merge: refresh PR #10808 from main
rsliter 9f7328e
merge: refresh PR #10808 from main
rsliter 334c110
test(e2e): address EXDEV review feedback
rsliter 7259bf6
merge: refresh PR #10808 from main
rsliter 526ac45
merge: refresh PR #10808 from main
rsliter 813e827
merge: refresh PR #10808 from main
rsliter f517e9b
merge: refresh PR #10808 from main
rsliter 70f9154
test(e2e): simplify EXDEV failure evidence
rsliter ba598a2
merge: refresh PR #10808 from main
rsliter 81ac604
test(e2e): address EXDEV advisor findings
rsliter a8ed89e
merge: refresh PR #10808 from main
rsliter 3f85ed9
merge: refresh PR #10808 from main
rsliter d84b032
fix(e2e): bound trusted image inspection
rsliter 4b33434
fix(e2e): retain EXDEV retry evidence
rsliter 4a93960
merge: refresh PR #10808 from main
rsliter debee6f
test(e2e): simplify pairing diagnostics artifacts
rsliter 660c45f
Merge remote-tracking branch 'origin/main' into codex/pr10808-signed-…
rsliter 6e3dc32
test(e2e): remove duplicate EXDEV fixture payload
rsliter e4ded2d
Merge remote-tracking branch 'origin/main' into codex/pr10808-signed-…
rsliter c7fae6e
test(e2e): distinguish image inspection failures
rsliter 89f3bc4
Merge remote-tracking branch 'origin/main' into codex/pr10808-signed-…
rsliter bdf5064
test(e2e): clarify EXDEV support titles
rsliter 30c9a54
test: simplify EXDEV failure coverage
rsliter 4037387
docs: clarify EXDEV fixture handoff
rsliter f902276
Merge remote-tracking branch 'origin/main' into codex/pr10808-signed-…
rsliter 4af10ac
merge: refresh PR #10808 after final-handoff fix
rsliter 2fd9797
docs(e2e): clarify EXDEV diagnostics trigger
rsliter File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,104 @@ | ||
| // SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. | ||
| // SPDX-License-Identifier: Apache-2.0 | ||
|
|
||
| import { type CommandExitResult, outputContainsReadySandbox } from "../fixtures/clients/command.ts"; | ||
| import { | ||
| runBoundedRetry, | ||
| type BoundedRetryResult, | ||
| type RetryEvidence, | ||
| } from "../fixtures/retry-policy.ts"; | ||
|
|
||
| const OPERATION = "openclaw-plugin-runtime-exdev.onboard-pairing"; | ||
| const OWNER = "openclaw-plugin-runtime-exdev"; | ||
|
|
||
| type OnboardPairingRetryOptions<T extends CommandExitResult> = { | ||
| sandboxName: string; | ||
| run(attempt: number): Promise<T>; | ||
| reconcile(value: T | undefined, error: unknown, attempt: number): Promise<boolean>; | ||
| onEvidence(evidence: RetryEvidence): Promise<void> | void; | ||
| }; | ||
|
|
||
| type PairingTarget = { | ||
| gatewayName: string; | ||
| stateDirectory: string; | ||
| version: string; | ||
| }; | ||
|
|
||
| type OnboardPairingSession = { | ||
| agent: string | null; | ||
| failure: unknown; | ||
| machine: { state: string }; | ||
| metadata: { fromDockerfile: string | null; gatewayName: string }; | ||
| resumable: boolean; | ||
| sandboxName: string | null; | ||
| status: string; | ||
| }; | ||
|
|
||
| type OnboardPairingReconciliationOptions<T extends CommandExitResult> = { | ||
| expectedFromDockerfile: string; | ||
| sandboxName: string; | ||
| captureDiagnostics(): Promise<void>; | ||
| listSandbox(): Promise<T>; | ||
| loadSession(): OnboardPairingSession | null; | ||
| resolveTarget(): PairingTarget | null; | ||
| }; | ||
|
|
||
| export function classifyOpenClawPluginOnboard<T extends CommandExitResult>( | ||
| value: T | undefined, | ||
| error: unknown, | ||
| sandboxName: string, | ||
| ): | ||
| | { outcome: "passed" } | ||
| | { outcome: "failed"; failureClass: "deterministic" | "transient-external" } { | ||
| if (error === undefined && value?.exitCode === 0) return { outcome: "passed" }; | ||
| const message = `OpenClaw onboarding for '${sandboxName}' is incomplete because its canonical CLI device pairing did not appear. Resume or rerun onboarding.`; | ||
| const output = value ? `${value.stdout}\n${value.stderr}` : ""; | ||
| return { | ||
| outcome: "failed", | ||
| failureClass: | ||
| error === undefined && output.includes(message) ? "transient-external" : "deterministic", | ||
| }; | ||
| } | ||
|
|
||
| /** Resume once when the startup watcher has not yet published canonical pairing. */ | ||
| export function runOpenClawPluginOnboardWithPairingResume<T extends CommandExitResult>( | ||
| options: OnboardPairingRetryOptions<T>, | ||
| ): Promise<BoundedRetryResult<T>> { | ||
| return runBoundedRetry({ | ||
| operation: OPERATION, | ||
| owner: OWNER, | ||
| idempotence: "reconciled-mutation", | ||
| maxAttempts: 2, | ||
| run: options.run, | ||
| classify: (value, error) => classifyOpenClawPluginOnboard(value, error, options.sandboxName), | ||
| reconcile: options.reconcile, | ||
| onEvidence: options.onEvidence, | ||
| }); | ||
| } | ||
|
|
||
| /** Require the paused finalization session and its live runtime before resume can continue. */ | ||
| export async function reconcileOpenClawPluginOnboardPairing<T extends CommandExitResult>( | ||
| options: OnboardPairingReconciliationOptions<T>, | ||
| ): Promise<boolean> { | ||
| await options.captureDiagnostics(); | ||
| const list = await options.listSandbox(); | ||
| if (list.exitCode !== 0 || !outputContainsReadySandbox(list, options.sandboxName)) return false; | ||
| try { | ||
| const target = options.resolveTarget(); | ||
| if (!target) return false; | ||
| const session = options.loadSession(); | ||
| return ( | ||
| session !== null && | ||
| session.status === "in_progress" && | ||
| session.resumable === true && | ||
| session.failure === null && | ||
| session.sandboxName === options.sandboxName && | ||
| session.agent === "openclaw" && | ||
| session.machine.state === "post_verify" && | ||
| session.metadata.gatewayName === target.gatewayName && | ||
| session.metadata.fromDockerfile === options.expectedFromDockerfile | ||
| ); | ||
| } catch { | ||
| return false; | ||
| } | ||
| } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.