fix(release): restore direct package Telegram acceptance (#129912)

* fix(release): provision package acceptance plugin registry

* fix(release): accept registry tuple in package dispatch

* fix(release): default Docker advisory input

* fix(release): bind artifact registry to package source

* fix(release): preserve package advisory dispatch

* fix(ci): bound hosted release gate checks

Co-authored-by: Tak Hoffman <781889+Takhoffman@users.noreply.github.com>

* test(ci): update release-gate manifest fixture

* fix(ci): avoid duplicate release gate lint

* test(release): restore Docker helper fixture path

---------

Co-authored-by: Tak Hoffman <781889+Takhoffman@users.noreply.github.com>
This commit is contained in:
Vincent Koc
2026-08-27 08:32:19 +08:00
committed by GitHub
parent 0b60846fa4
commit 8afa8f339e
11 changed files with 835 additions and 77 deletions
+40 -12
View File
@@ -545,12 +545,13 @@ jobs:
OPENCLAW_CI_CHANGED_PATHS_JSON: ${{ steps.changed_scope.outputs.changed_paths_json || 'null' }}
OPENCLAW_CI_CHECKOUT_REVISION: ${{ steps.checkout_ref.outputs.sha }}
OPENCLAW_CI_HISTORICAL_TARGET: ${{ steps.historical_target.outputs.eligible || 'false' }}
OPENCLAW_CI_RELEASE_GATE: ${{ inputs.release_gate && 'true' || 'false' }}
OPENCLAW_CI_RELEASE_CANDIDATE_TARGET: ${{ steps.release_candidate_target.outputs.eligible || 'false' }}
OPENCLAW_CI_TARGET_CONTEXT_TARGET: ${{ steps.target_context_target.outputs.eligible || 'false' }}
OPENCLAW_CI_WORKFLOW_REVISION: ${{ github.sha }}
OPENCLAW_CI_REPOSITORY: ${{ github.repository }}
OPENCLAW_CI_EVENT_NAME: ${{ github.event_name }}
OPENCLAW_CI_RUNNER_BACKEND: ${{ (github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name != github.repository) && 'github' || vars.OPENCLAW_CI_RUNNER_BACKEND }}
OPENCLAW_CI_RUNNER_BACKEND: ${{ (github.event_name == 'workflow_dispatch' || (github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name != github.repository)) && 'github' || vars.OPENCLAW_CI_RUNNER_BACKEND }}
run: |
manifest_node_args=()
if [ "${GITHUB_EVENT_NAME:-}" = "workflow_dispatch" ]; then
@@ -668,6 +669,7 @@ jobs:
})();
const docsOnly = parseBoolean(process.env.OPENCLAW_CI_DOCS_ONLY);
const docsChanged = parseBoolean(process.env.OPENCLAW_CI_DOCS_CHANGED);
const releaseGate = parseBoolean(process.env.OPENCLAW_CI_RELEASE_GATE);
const runNode = parseBoolean(process.env.OPENCLAW_CI_RUN_NODE) && !docsOnly;
const runNodeFastOnly =
runNode && parseBoolean(process.env.OPENCLAW_CI_RUN_NODE_FAST_ONLY);
@@ -755,6 +757,24 @@ jobs:
});
}
}
if (releaseGate) {
checksFastCoreTasks.push(
...Array.from({ length: 5 }, (_, index) => {
const stripe = index + 1;
return {
check_name: `checks-fast-release-lint-core-${stripe}`,
runtime: "node",
stripe,
task: `release-lint-core-${stripe}`,
};
}),
{
check_name: "checks-fast-release-lint-extensions",
runtime: "node",
task: "release-lint-extensions",
},
);
}
const compactPullRequest = isCanonicalRepository && eventName === "pull_request";
const dockerSeedLanes =
@@ -1930,11 +1950,11 @@ jobs:
max-parallel: 12
matrix: ${{ fromJson(needs.preflight.outputs.checks_fast_core_matrix) }}
env:
CHECKOUT_BASE_SHA: ${{ matrix.task == 'baseline-ratchets' && needs.preflight.outputs.diff_base_revision || '' }}
CHECKOUT_BASE_SHA: ${{ (matrix.task == 'baseline-ratchets' || startsWith(matrix.task, 'release-lint-')) && needs.preflight.outputs.diff_base_revision || '' }}
steps:
- *linux_node_checkout_step
- name: Prepare release-gate ratchet merge tree
if: matrix.task == 'baseline-ratchets' && github.event_name == 'workflow_dispatch' && inputs.release_gate
if: (matrix.task == 'baseline-ratchets' || startsWith(matrix.task, 'release-lint-')) && github.event_name == 'workflow_dispatch' && inputs.release_gate
env:
GH_TOKEN: ${{ github.token }}
PULL_REQUEST_NUMBER: ${{ inputs.pull_request_number }}
@@ -1976,7 +1996,6 @@ jobs:
fi
git checkout --detach "$merge_sha"
echo "RATCHET_BASE_REF=${frozen_base_sha}" >> "$GITHUB_ENV"
echo "RATCHET_RELEASE_MERGE_TREE=true" >> "$GITHUB_ENV"
- name: Setup Node environment
uses: ./.ci-harness/.github/actions/setup-node-env
@@ -2046,9 +2065,14 @@ jobs:
fi
pnpm check:max-lines-ratchet --base "$base_ref"
pnpm check:assertion-safety --base "$base_ref"
if [[ "${RATCHET_RELEASE_MERGE_TREE:-}" == "true" ]]; then
node --import tsx scripts/run-oxlint-shards.mts --only=core --only=extensions --threads=1
fi
;;
release-lint-core-*)
stripe="${TASK#release-lint-core-}"
node --import tsx scripts/run-oxlint-shards.mts \
--only=core --split-core --core-stripe="${stripe}/5" --threads=1
;;
release-lint-extensions)
node --import tsx scripts/run-oxlint-shards.mts --only=extensions --threads=1
;;
bun-launcher)
OPENCLAW_E2E_SKIP_BUILD=1 OPENCLAW_TEST_BUN_LAUNCHER=1 pnpm test test/openclaw-launcher.e2e.test.ts
@@ -2636,9 +2660,10 @@ jobs:
FROZEN_TARGET: ${{ needs.preflight.outputs.frozen_target }}
HISTORICAL_TARGET: ${{ needs.preflight.outputs.compatibility_target }}
FORMAT_CHECK: ${{ needs.preflight.outputs.run_format_check }}
RELEASE_GATE: ${{ inputs.release_gate && 'true' || 'false' }}
RUN_CONTROL_UI_I18N: ${{ needs.preflight.outputs.run_control_ui_i18n }}
RUN_UI_TESTS: ${{ needs.preflight.outputs.run_ui_tests }}
RUNNER_BACKEND: ${{ (vars.OPENCLAW_CI_RUNNER_BACKEND == 'github' || vars.OPENCLAW_CI_RUNNER_BACKEND == 'hybrid' || (github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name != github.repository)) && 'github' || vars.OPENCLAW_CI_RUNNER_BACKEND }}
RUNNER_BACKEND: ${{ (vars.OPENCLAW_CI_RUNNER_BACKEND == 'github' || vars.OPENCLAW_CI_RUNNER_BACKEND == 'hybrid' || github.event_name == 'workflow_dispatch' || (github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name != github.repository)) && 'github' || vars.OPENCLAW_CI_RUNNER_BACKEND }}
OPENCLAW_LOCAL_CHECK: "0"
TASK: ${{ matrix.task }}
PR_BASE_SHA: ${{ github.event_name == 'pull_request' && needs.preflight.outputs.diff_base_revision || '' }}
@@ -2735,9 +2760,12 @@ jobs:
lint_args=(--threads=8)
if [ "$RUNNER_BACKEND" = "github" ]; then
# Five dedicated hosted jobs own the aggregated core Programs. Keep
# extension preparation, optional UI checks, and formatting in
# this sixth lane so each 4-core runner stays below ~6m.
# extension preparation in this sixth lane except when the exact
# merge-tree release lint job already owns it.
lint_args=(--only=extensions --only=scripts --threads=1)
if [ "$RELEASE_GATE" = "true" ]; then
lint_args=(--only=scripts --threads=1)
fi
export GOMAXPROCS=2
elif [ "$(nproc)" -lt 8 ]; then
# Fork PRs build each semantic Program once. Bound both oxlint
@@ -2875,7 +2903,7 @@ jobs:
contents: read
name: check-lint-core-${{ matrix.stripe }}
needs: [preflight]
if: ${{ needs.preflight.outputs.run_check == 'true' && (vars.OPENCLAW_CI_RUNNER_BACKEND == 'github' || vars.OPENCLAW_CI_RUNNER_BACKEND == 'hybrid' || (github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name != github.repository)) }}
if: ${{ needs.preflight.outputs.run_check == 'true' && (vars.OPENCLAW_CI_RUNNER_BACKEND == 'github' || vars.OPENCLAW_CI_RUNNER_BACKEND == 'hybrid' || github.event_name == 'workflow_dispatch' || (github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name != github.repository)) }}
runs-on: ubuntu-24.04
timeout-minutes: 15
strategy:
@@ -2910,7 +2938,7 @@ jobs:
contents: read
name: check-test-types-core-${{ matrix.stripe }}
needs: [preflight]
if: ${{ needs.preflight.outputs.run_check == 'true' && (vars.OPENCLAW_CI_RUNNER_BACKEND == 'github' || vars.OPENCLAW_CI_RUNNER_BACKEND == 'hybrid' || (github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name != github.repository)) }}
if: ${{ needs.preflight.outputs.run_check == 'true' && (vars.OPENCLAW_CI_RUNNER_BACKEND == 'github' || vars.OPENCLAW_CI_RUNNER_BACKEND == 'hybrid' || github.event_name == 'workflow_dispatch' || (github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name != github.repository)) }}
# Measured 232-269s per stripe on hosted 4-core; hybrid attempt 1 rides
# the 8 vCPU class like the compact large rows, retries stay hosted.
runs-on: ${{ vars.OPENCLAW_CI_RUNNER_BACKEND == 'github' && 'ubuntu-24.04' || (vars.OPENCLAW_CI_RUNNER_BACKEND == 'hybrid' && github.run_attempt > 1) && 'ubuntu-24.04' || github.event_name == 'workflow_dispatch' && 'ubuntu-24.04' || (vars.OPENCLAW_CI_RUNNER_BACKEND == 'hybrid' && github.repository == 'openclaw/openclaw' && (github.event_name != 'pull_request' || contains(fromJSON('["OWNER","MEMBER","COLLABORATOR","CONTRIBUTOR"]'), github.event.pull_request.author_association)) && 'blacksmith-8vcpu-ubuntu-2404' || 'ubuntu-24.04') }}
+9 -5
View File
@@ -409,11 +409,15 @@ jobs:
echo "Artifact-backed Telegram E2E requires the complete prerelease plugin registry tuple." >&2
exit 1
fi
expected_registry_name="docker-e2e-prepublish-plugin-registry-${PREPUBLISH_PLUGIN_REGISTRY_ARTIFACT_RUN_ID}-${PREPUBLISH_PLUGIN_REGISTRY_ARTIFACT_RUN_ATTEMPT}"
if [[ "$PREPUBLISH_PLUGIN_REGISTRY_ARTIFACT_NAME" != "$expected_registry_name" ]]; then
echo "Prerelease plugin registry artifact name does not match its producer run." >&2
exit 1
fi
expected_registry_suffix="-${PREPUBLISH_PLUGIN_REGISTRY_ARTIFACT_RUN_ID}-${PREPUBLISH_PLUGIN_REGISTRY_ARTIFACT_RUN_ATTEMPT}"
case "$PREPUBLISH_PLUGIN_REGISTRY_ARTIFACT_NAME" in
"docker-e2e-prepublish-plugin-registry${expected_registry_suffix}" | \
"package-acceptance-telegram-plugin-registry${expected_registry_suffix}") ;;
*)
echo "Prerelease plugin registry artifact name does not match its producer run." >&2
exit 1
;;
esac
fi
case "${PROVIDER_MODE}" in
mock-openai | live-frontier) ;;
@@ -1307,6 +1307,7 @@ jobs:
package_sha256: ${{ (needs.resolve_target.outputs.package_acceptance_package_spec == '' && needs.resolve_target.outputs.package_mode != 'published') && needs.prepare_release_package.outputs.package_sha256 || '' }}
package_source_sha: ${{ needs.prepare_release_package.outputs.source_sha }}
package_version: ${{ needs.prepare_release_package.outputs.package_version }}
prepublish_plugin_registry_json: ${{ needs.prepare_release_package.outputs.prepublish_plugin_registry_json }}
suite_profile: custom
docker_lanes: release-typed-onboarding doctor-switch update-channel-switch skill-install update-corrupt-plugin upgrade-survivor published-upgrade-survivor root-managed-vps-upgrade update-restart-auth plugins-offline plugin-update plugin-binding-command-escape
published_upgrade_survivor_baselines: ${{ needs.resolve_target.outputs.run_release_soak == 'true' && 'last-stable-4 2026.4.23 2026.5.2 2026.4.15' || '' }}
+145 -14
View File
@@ -249,6 +249,11 @@ on:
required: false
default: ""
type: string
prepublish_plugin_registry_json:
description: Immutable prerelease plugin registry tuple from the package producer
required: false
default: ""
type: string
suite_profile:
description: "Acceptance profile: smoke, package, telegram, product, full, or custom"
required: false
@@ -428,6 +433,7 @@ env:
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: "true"
NODE_VERSION: "24.19.0"
PACKAGE_ARTIFACT_NAME: package-under-test-${{ github.run_id }}-${{ github.run_attempt }}
TELEGRAM_PLUGIN_REGISTRY_ARTIFACT_NAME: package-acceptance-telegram-plugin-registry-${{ github.run_id }}-${{ github.run_attempt }}
jobs:
resolve_package:
@@ -448,6 +454,7 @@ jobs:
package_source_sha: ${{ steps.resolve.outputs.package_source_sha }}
package_sha256: ${{ steps.resolve.outputs.sha256 }}
package_version: ${{ steps.resolve.outputs.package_version }}
prepublish_plugin_registry_json: ${{ steps.registry_identity.outputs.json }}
published_upgrade_survivor_baseline: ${{ steps.upgrade_survivor_baselines.outputs.baseline }}
published_upgrade_survivor_baselines: ${{ steps.upgrade_survivor_baselines.outputs.baselines }}
published_upgrade_survivor_scenarios: ${{ inputs.published_upgrade_survivor_scenarios }}
@@ -471,6 +478,80 @@ jobs:
install-bun: ${{ inputs.source == 'ref' && 'true' || 'false' }}
install-deps: "true"
- name: Validate prerelease plugin registry input
id: registry_input
env:
CANDIDATE_ARTIFACT_JSON: ${{ inputs.candidate_artifact_json || '' }}
PREPUBLISH_PLUGIN_REGISTRY_JSON: ${{ inputs.prepublish_plugin_registry_json || '' }}
shell: bash
run: |
set -euo pipefail
normalize_registry_tuple() {
local json="$1"
local source="$2"
[[ -n "${json// }" ]] || return 0
jq -cer \
--arg source "$source" \
'
def digits: test("^[1-9][0-9]*$");
def hex64: test("^[a-f0-9]{64}$");
def fields: [
"prepublishPluginRegistryArtifactName", "prepublishPluginRegistryArtifactId",
"prepublishPluginRegistryArtifactDigest", "prepublishPluginRegistryArtifactRunId",
"prepublishPluginRegistryArtifactRunAttempt", "prepublishPluginRegistryManifestSha256"
];
def tuple:
. as $input
| reduce fields[] as $field ({}; .[$field] = $input[$field])
| .prepublishPluginRegistryArtifactId |= tostring
| .prepublishPluginRegistryArtifactRunId |= tostring
| .prepublishPluginRegistryArtifactRunAttempt |= tostring;
if type != "object" then error("not an object") else . end
| . as $input
| [fields[] as $field | select($input | has($field))] as $present
| if ($present | length) == 0 and $source == "candidate" then empty
elif ($present | length) != 6 or
($source == "direct" and ((keys | sort) != (fields | sort)))
then error("incomplete or unexpected fields")
else tuple
end
| . as $tuple
| select(
(
.prepublishPluginRegistryArtifactName ==
("docker-e2e-prepublish-plugin-registry-" +
$tuple.prepublishPluginRegistryArtifactRunId + "-" +
$tuple.prepublishPluginRegistryArtifactRunAttempt) or
.prepublishPluginRegistryArtifactName ==
("package-acceptance-telegram-plugin-registry-" +
$tuple.prepublishPluginRegistryArtifactRunId + "-" +
$tuple.prepublishPluginRegistryArtifactRunAttempt)
) and
([
.prepublishPluginRegistryArtifactId,
.prepublishPluginRegistryArtifactRunId,
.prepublishPluginRegistryArtifactRunAttempt
] | all(.[]; digits)) and
([
.prepublishPluginRegistryArtifactDigest,
.prepublishPluginRegistryManifestSha256
] | all(.[]; hex64))
)
' <<< "$json" 2>/dev/null || {
echo "Prerelease plugin registry JSON must contain one complete immutable tuple." >&2
exit 1
}
}
candidate_registry="$(normalize_registry_tuple "$CANDIDATE_ARTIFACT_JSON" candidate)"
direct_registry="$(normalize_registry_tuple "$PREPUBLISH_PLUGIN_REGISTRY_JSON" direct)"
if [[ -n "$candidate_registry" && -n "$direct_registry" &&
"$candidate_registry" != "$direct_registry" ]]; then
echo "Prerelease plugin registry inputs disagree." >&2
exit 1
fi
printf 'json=%s\n' "${direct_registry:-$candidate_registry}" >> "$GITHUB_OUTPUT"
- name: Validate package artifact input identity
id: input_artifact
if: inputs.source == 'artifact'
@@ -558,6 +639,8 @@ jobs:
PACKAGE_FILE_NAME: ${{ inputs.package_file_name }}
PACKAGE_SOURCE_SHA: ${{ inputs.package_source_sha }}
PACKAGE_VERSION: ${{ inputs.package_version }}
PREPUBLISH_PLUGIN_REGISTRY_JSON: ${{ steps.registry_input.outputs.json }}
TELEGRAM_MODE: ${{ inputs.telegram_mode }}
TRUSTED_SOURCE_ID: ${{ inputs.trusted_source_id }}
OPENCLAW_TRUSTED_PACKAGE_TOKEN: ${{ secrets.OPENCLAW_TRUSTED_PACKAGE_TOKEN }}
shell: bash
@@ -578,6 +661,15 @@ jobs:
}
fi
set --
if [[ -z "$PREPUBLISH_PLUGIN_REGISTRY_JSON" &&
"$TELEGRAM_MODE" != "none" &&
("$SOURCE" == "ref" || "$SOURCE" == "artifact") ]]; then
set -- \
--plugin-registry-output-dir .artifacts/package-acceptance-telegram-plugin-registry \
--required-plugin-packages-json '["@openclaw/codex"]'
fi
node --import tsx scripts/resolve-openclaw-package-candidate.mts \
--source "$SOURCE" \
--package-ref "$PACKAGE_REF" \
@@ -589,7 +681,8 @@ jobs:
--output-dir .artifacts/docker-e2e-package \
--output-name openclaw-current.tgz \
--metadata .artifacts/docker-e2e-package/package-candidate.json \
--github-output "$GITHUB_OUTPUT"
--github-output "$GITHUB_OUTPUT" \
"$@"
echo "package_file_name=openclaw-current.tgz" >> "$GITHUB_OUTPUT"
if [[ "$SOURCE" == "artifact" ]]; then
jq -e \
@@ -747,6 +840,44 @@ jobs:
retention-days: 14
if-no-files-found: error
- name: Upload Telegram prerelease plugin registry artifact
id: upload_telegram_registry
if: steps.resolve.outputs.plugin_registry_manifest_sha256 != ''
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
with:
name: ${{ env.TELEGRAM_PLUGIN_REGISTRY_ARTIFACT_NAME }}
path: .artifacts/package-acceptance-telegram-plugin-registry/
retention-days: 14
if-no-files-found: error
- name: Prepare prerelease plugin registry identity
id: registry_identity
env:
GENERATED_ARTIFACT_DIGEST: ${{ steps.upload_telegram_registry.outputs.artifact-digest }}
GENERATED_ARTIFACT_ID: ${{ steps.upload_telegram_registry.outputs.artifact-id }}
GENERATED_MANIFEST_SHA256: ${{ steps.resolve.outputs.plugin_registry_manifest_sha256 }}
SUPPLIED_REGISTRY_JSON: ${{ steps.registry_input.outputs.json }}
shell: bash
run: |
set -euo pipefail
if [[ -n "$GENERATED_ARTIFACT_ID" ]]; then
[[ -z "$SUPPLIED_REGISTRY_JSON" ]] || {
echo "Package Acceptance generated a registry despite a supplied immutable tuple." >&2
exit 1
}
SUPPLIED_REGISTRY_JSON="$(
jq -cn \
--arg prepublishPluginRegistryArtifactName "$TELEGRAM_PLUGIN_REGISTRY_ARTIFACT_NAME" \
--arg prepublishPluginRegistryArtifactId "$GENERATED_ARTIFACT_ID" \
--arg prepublishPluginRegistryArtifactDigest "$GENERATED_ARTIFACT_DIGEST" \
--arg prepublishPluginRegistryArtifactRunId "$GITHUB_RUN_ID" \
--arg prepublishPluginRegistryArtifactRunAttempt "$GITHUB_RUN_ATTEMPT" \
--arg prepublishPluginRegistryManifestSha256 "$GENERATED_MANIFEST_SHA256" \
'$ARGS.named'
)"
fi
printf 'json=%s\n' "$SUPPLIED_REGISTRY_JSON" >> "$GITHUB_OUTPUT"
- name: Summarize package candidate
env:
INPUT_ARTIFACT_DIGEST: ${{ steps.input_artifact.outputs.artifact_digest }}
@@ -909,7 +1040,7 @@ jobs:
pull-requests: read
uses: ./.github/workflows/openclaw-live-and-e2e-checks-reusable.yml
with: &docker_acceptance_inputs
advisory: ${{ inputs.advisory }}
advisory: ${{ inputs.advisory || false }}
ref: ${{ needs.resolve_package.outputs.package_source_sha || inputs.workflow_ref }}
include_repo_e2e: false
include_release_path_suites: ${{ needs.resolve_package.outputs.include_release_path_suites == 'true' }}
@@ -929,12 +1060,12 @@ jobs:
package_source_sha: ${{ needs.resolve_package.outputs.package_source_sha }}
package_version: ${{ needs.resolve_package.outputs.package_version }}
enable_prepublish_plugin_registry: ${{ contains(fromJSON('["artifact","ref"]'), inputs.source) }}
prepublish_plugin_registry_artifact_name: ${{ fromJSON(inputs.candidate_artifact_json || '{}').prepublishPluginRegistryArtifactName || '' }}
prepublish_plugin_registry_artifact_id: ${{ fromJSON(inputs.candidate_artifact_json || '{}').prepublishPluginRegistryArtifactId || '' }}
prepublish_plugin_registry_artifact_digest: ${{ fromJSON(inputs.candidate_artifact_json || '{}').prepublishPluginRegistryArtifactDigest || '' }}
prepublish_plugin_registry_artifact_run_id: ${{ fromJSON(inputs.candidate_artifact_json || '{}').prepublishPluginRegistryArtifactRunId || '' }}
prepublish_plugin_registry_artifact_run_attempt: ${{ fromJSON(inputs.candidate_artifact_json || '{}').prepublishPluginRegistryArtifactRunAttempt || '' }}
prepublish_plugin_registry_manifest_sha256: ${{ fromJSON(inputs.candidate_artifact_json || '{}').prepublishPluginRegistryManifestSha256 || '' }}
prepublish_plugin_registry_artifact_name: ${{ startsWith(fromJSON(needs.resolve_package.outputs.prepublish_plugin_registry_json || '{}').prepublishPluginRegistryArtifactName || '', 'docker-e2e-prepublish-plugin-registry-') && fromJSON(needs.resolve_package.outputs.prepublish_plugin_registry_json || '{}').prepublishPluginRegistryArtifactName || '' }}
prepublish_plugin_registry_artifact_id: ${{ startsWith(fromJSON(needs.resolve_package.outputs.prepublish_plugin_registry_json || '{}').prepublishPluginRegistryArtifactName || '', 'docker-e2e-prepublish-plugin-registry-') && fromJSON(needs.resolve_package.outputs.prepublish_plugin_registry_json || '{}').prepublishPluginRegistryArtifactId || '' }}
prepublish_plugin_registry_artifact_digest: ${{ startsWith(fromJSON(needs.resolve_package.outputs.prepublish_plugin_registry_json || '{}').prepublishPluginRegistryArtifactName || '', 'docker-e2e-prepublish-plugin-registry-') && fromJSON(needs.resolve_package.outputs.prepublish_plugin_registry_json || '{}').prepublishPluginRegistryArtifactDigest || '' }}
prepublish_plugin_registry_artifact_run_id: ${{ startsWith(fromJSON(needs.resolve_package.outputs.prepublish_plugin_registry_json || '{}').prepublishPluginRegistryArtifactName || '', 'docker-e2e-prepublish-plugin-registry-') && fromJSON(needs.resolve_package.outputs.prepublish_plugin_registry_json || '{}').prepublishPluginRegistryArtifactRunId || '' }}
prepublish_plugin_registry_artifact_run_attempt: ${{ startsWith(fromJSON(needs.resolve_package.outputs.prepublish_plugin_registry_json || '{}').prepublishPluginRegistryArtifactName || '', 'docker-e2e-prepublish-plugin-registry-') && fromJSON(needs.resolve_package.outputs.prepublish_plugin_registry_json || '{}').prepublishPluginRegistryArtifactRunAttempt || '' }}
prepublish_plugin_registry_manifest_sha256: ${{ startsWith(fromJSON(needs.resolve_package.outputs.prepublish_plugin_registry_json || '{}').prepublishPluginRegistryArtifactName || '', 'docker-e2e-prepublish-plugin-registry-') && fromJSON(needs.resolve_package.outputs.prepublish_plugin_registry_json || '{}').prepublishPluginRegistryManifestSha256 || '' }}
include_live_suites: ${{ needs.resolve_package.outputs.include_live_suites == 'true' }}
live_models_only: false
shared_image_artifact_namespace: ${{ inputs.shared_image_artifact_namespace }}
@@ -1023,12 +1154,12 @@ jobs:
package_sha256: ${{ needs.resolve_package.outputs.package_sha256 }}
package_source_sha: ${{ needs.resolve_package.outputs.package_source_sha }}
package_version: ${{ needs.resolve_package.outputs.package_version }}
prepublish_plugin_registry_artifact_name: ${{ fromJSON(inputs.candidate_artifact_json || '{}').prepublishPluginRegistryArtifactName || '' }}
prepublish_plugin_registry_artifact_id: ${{ fromJSON(inputs.candidate_artifact_json || '{}').prepublishPluginRegistryArtifactId || '' }}
prepublish_plugin_registry_artifact_digest: ${{ fromJSON(inputs.candidate_artifact_json || '{}').prepublishPluginRegistryArtifactDigest || '' }}
prepublish_plugin_registry_artifact_run_id: ${{ fromJSON(inputs.candidate_artifact_json || '{}').prepublishPluginRegistryArtifactRunId || '' }}
prepublish_plugin_registry_artifact_run_attempt: ${{ fromJSON(inputs.candidate_artifact_json || '{}').prepublishPluginRegistryArtifactRunAttempt || '' }}
prepublish_plugin_registry_manifest_sha256: ${{ fromJSON(inputs.candidate_artifact_json || '{}').prepublishPluginRegistryManifestSha256 || '' }}
prepublish_plugin_registry_artifact_name: ${{ fromJSON(needs.resolve_package.outputs.prepublish_plugin_registry_json || '{}').prepublishPluginRegistryArtifactName || '' }}
prepublish_plugin_registry_artifact_id: ${{ fromJSON(needs.resolve_package.outputs.prepublish_plugin_registry_json || '{}').prepublishPluginRegistryArtifactId || '' }}
prepublish_plugin_registry_artifact_digest: ${{ fromJSON(needs.resolve_package.outputs.prepublish_plugin_registry_json || '{}').prepublishPluginRegistryArtifactDigest || '' }}
prepublish_plugin_registry_artifact_run_id: ${{ fromJSON(needs.resolve_package.outputs.prepublish_plugin_registry_json || '{}').prepublishPluginRegistryArtifactRunId || '' }}
prepublish_plugin_registry_artifact_run_attempt: ${{ fromJSON(needs.resolve_package.outputs.prepublish_plugin_registry_json || '{}').prepublishPluginRegistryArtifactRunAttempt || '' }}
prepublish_plugin_registry_manifest_sha256: ${{ fromJSON(needs.resolve_package.outputs.prepublish_plugin_registry_json || '{}').prepublishPluginRegistryManifestSha256 || '' }}
package_label: openclaw@${{ needs.resolve_package.outputs.package_version }}
harness_ref: ${{ inputs.workflow_ref }}
provider_mode: ${{ needs.resolve_package.outputs.telegram_mode }}