惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Project Zero
Project Zero
Security Archives - TechRepublic
Security Archives - TechRepublic
C
Cyber Attacks, Cyber Crime and Cyber Security
Security Latest
Security Latest
Scott Helme
Scott Helme
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
V
Vulnerabilities – Threatpost
C
CERT Recently Published Vulnerability Notes
S
Schneier on Security
G
GRAHAM CLULEY
L
Lohrmann on Cybersecurity
D
Darknet – Hacking Tools, Hacker News & Cyber Security
I
Intezer
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
F
Full Disclosure
T
The Exploit Database - CXSecurity.com
P
Proofpoint News Feed
WordPress大学
WordPress大学
Microsoft Azure Blog
Microsoft Azure Blog
H
Help Net Security
大猫的无限游戏
大猫的无限游戏
MyScale Blog
MyScale Blog
Hacker News: Ask HN
Hacker News: Ask HN
G
Google Developers Blog
H
Heimdal Security Blog
O
OpenAI News
Hugging Face - Blog
Hugging Face - Blog
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
L
LangChain Blog
C
Cisco Blogs
云风的 BLOG
云风的 BLOG
IT之家
IT之家
Cyberwarzone
Cyberwarzone
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Know Your Adversary
Know Your Adversary
博客园 - 聂微东
The Cloudflare Blog
C
Check Point Blog
K
Kaspersky official blog
C
CXSECURITY Database RSS Feed - CXSecurity.com
月光博客
月光博客
T
Tor Project blog
T
Threat Research - Cisco Blogs
T
Tailwind CSS Blog
P
Proofpoint News Feed
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
A
About on SuperTechFans
小众软件
小众软件
Cloudbric
Cloudbric
A
Arctic Wolf

Recent Commits to openclaw:main

test: merge chat side-result checks · openclaw/openclaw@ddd2c2a test: merge cron history checks · openclaw/openclaw@f7eb746 test: merge responsive navigation shell checks · openclaw/openclaw@c2e4b47 docs(changelog): add codex oauth fixes · openclaw/openclaw@628e6cd test: merge navigation routing cases · openclaw/openclaw@5d8cecb Tests: mock channel registry bundled fallback · openclaw/openclaw@2b08233 Secrets: avoid broad web search discovery for single plugin config · openclaw/openclaw@a464f59 test: merge config view browser checks · openclaw/openclaw@20cf511 fix(status): align oauth health with runtime · openclaw/openclaw@eed7116 feat: add macOS screen snapshots for monitor preview (#67954) thanks … · openclaw/openclaw@f377db1 fix: report shared auth scopes in hello-ok (#67810) thanks @BunsDev · openclaw/openclaw@0b6c39b Auto-reply: avoid eager bundled route fallback · openclaw/openclaw@3ea1bf4 Tests: narrow session binding contract setup · openclaw/openclaw@54e4e16 fix(macOS): enable undo/redo in webchat composer text input (#34962) · openclaw/openclaw@00951dc Tests: speed up channel setup promotion · openclaw/openclaw@82b529a Docs: refresh agent instructions · openclaw/openclaw@5775fe2 fix(auth): serialize OAuth refresh across agents to fix #26322 (#67876) · openclaw/openclaw@8e79080 test: allow ollama public surface boundary test · openclaw/openclaw@7d4f1a6 Docs: add test performance guardrails · openclaw/openclaw@89706d3 Tests: restore context-engine usage proof · openclaw/openclaw@e4c4f95 Tests: slim context engine runtime coverage · openclaw/openclaw@74c198f ci: retry failed custom checkouts · openclaw/openclaw@0ee5baf test: trim duplicate provider auth onboarding cases · openclaw/openclaw@1ffc02e matrix: fix sessions_spawn --thread subagent session spawning (#67643) · openclaw/openclaw@1ce2596 test: reduce auth choice fixture churn · openclaw/openclaw@857b9cd test: mock health status config boundaries · openclaw/openclaw@9d5ab4a test: mock onboard config io boundary · openclaw/openclaw@299694d test: mock legacy state plugin boundaries · openclaw/openclaw@2713089 test: mock channel install boundaries · openclaw/openclaw@b945248 test: mock doctor preview channel boundaries · openclaw/openclaw@b1a3ad4 test: trim doctor command hotspots · openclaw/openclaw@c66f16a test: isolate agent auth and spawn hotspots · openclaw/openclaw@9285935 test: stabilize MCP startup disposal race · openclaw/openclaw@dd9d2eb test: merge browser contract server suites · openclaw/openclaw@5817a76 test: narrow ollama provider discovery setup · openclaw/openclaw@a0d9598 build: declare qa-lab aimock runtime dependency · openclaw/openclaw@24431e5 test: speed up safe-bins exec harness · openclaw/openclaw@ee856ab test: preserve tool helpers in embedded runner mocks · openclaw/openclaw@acd86a0 refactor: move memory embeddings into provider plugins · openclaw/openclaw@77e6e4c test: reuse system-run temp fixtures · openclaw/openclaw@7e9ff0f test: trim hotspot wait overhead · openclaw/openclaw@12a59b0 Check: avoid duplicate boundary prep · openclaw/openclaw@baf11b8 test: reduce hotspot fixture overhead · openclaw/openclaw@3a59edd feat(ui): overhaul settings and slash command UX (#67819) thanks @Bun… · openclaw/openclaw@2cfb660 QA Matrix: exit cleanly on failure · openclaw/openclaw@42805d2 QA Matrix: isolate scenario coverage · openclaw/openclaw@7e659e1 Matrix: refresh crypto bootstrap state · openclaw/openclaw@94081d8 QA Lab: add provider registry · openclaw/openclaw@bb7e982 Matrix: add plugin changelog · openclaw/openclaw@4acab55 test: trim more hotspot overhead · openclaw/openclaw@f485311 test: trim remaining hotspot tests · openclaw/openclaw@6ba8626 test: narrow hotspot mocks · openclaw/openclaw@dbc8179 test: isolate gemini embedding request helpers · openclaw/openclaw@cd330f5 test: trim memory and mcp hotspots · openclaw/openclaw@fd48dfa test: slim provider registry mocks · openclaw/openclaw@2e08c77 test: harden Parallels update smoke · openclaw/openclaw@1a98090 feat: default Anthropic to Opus 4.7 · openclaw/openclaw@628b454 fix: harden node-host shell payload mutability checks · openclaw/openclaw@75c551e fix: land node-host approval binding for native binaries (#66731) (th… · openclaw/openclaw@29919bb CI: add daily schedule to CodeQL workflow (#67645) · openclaw/openclaw@69d25f5 fix(gateway): capture config hash after plugin auto-enable to prevent… · openclaw/openclaw@8c11210 fix: repair sanitized replay tool results before send (#67620) (thank… · openclaw/openclaw@c3c7a99 fix: restrict HTML timeout short-circuit to transient statuses · openclaw/openclaw@de129a6 fix: keep TUI watchdog bound to active run (#67401) (thanks @xantorres) · openclaw/openclaw@3525273 Gateway/skills: dedupe skills prefix-match + drop dead fallback on log · openclaw/openclaw@d7f489f Extensions/lmstudio: back off inference preload after consecutive fai… · openclaw/openclaw@b555214 TUI/streaming: add watchdog that resets the activity indicator after … · openclaw/openclaw@f44ab20 Agents/tool-loop: enable unknown-tool stream guard by default · openclaw/openclaw@36ed367 Gateway/skills: invalidate session skills snapshot on config write · openclaw/openclaw@b23d59a fix: classify HTML provider error pages correctly (#67642) (thanks @s… · openclaw/openclaw@e588e90 fix(skills): remove unused model-usage import (#67641) · openclaw/openclaw@55f05df docs(changelog): credit codex fix superseded PRs · openclaw/openclaw@e485f24 fix(openai-codex): normalize stale transport metadata in resolution a… · openclaw/openclaw@90801ba CI: pin Docker-related GitHub Actions (#67632) · openclaw/openclaw@f697b01 Android: modernize WebView and discovery API usage (#67627) · openclaw/openclaw@44a6e50 fix(deps): bump hono to 4.12.14 and @hono/node-server to 1.19.14 (GHS… · openclaw/openclaw@fbccc18 fix(deps): bump dompurify to 3.4.0 (#67614) · openclaw/openclaw@2c2dc00 CI: add explicit permissions to all workflow jobs (fixes code-scannin… · openclaw/openclaw@01b7516 fix: register bundled TTS providers and route overrides correctly (#6… · openclaw/openclaw@6ea3cdd fix: align host tilde paths with OS home (#62804) (thanks @stainlu) · openclaw/openclaw@ecfaf64 fix: flush creds queue before reconnect socket open (#67464) (thanks … · openclaw/openclaw@405c63f fix: strip standalone <function> tool call tags from visible text (#6… · openclaw/openclaw@78df859 fix(agents): preserve cli session metadata before transcript persist … · openclaw/openclaw@898fd04 docs(changelog): move cli transcript entry · openclaw/openclaw@c1817c6 fix(agents): normalize cli transcript api field · openclaw/openclaw@3a3fae0 docs(changelog): note cli transcript persistence · openclaw/openclaw@6c343f1 fix(agents): persist cli transcript turns · openclaw/openclaw@b8ef507 fix(msteams): harden security-sensitive flows (#65841) · openclaw/openclaw@c56b56e [Dashboard] Fix exec approval modal overflow for long command content… · openclaw/openclaw@053c5b0 Docs: remove QA changelog entry · openclaw/openclaw@7fd5771 QA: fix private runtime source loading (#67428) · openclaw/openclaw@d5933af docs(gateway): correct protocol.md schema path, hello-ok example, aut… · openclaw/openclaw@489404d CI: pin Node 22 runners to 22.18.0 · openclaw/openclaw@4ffa621 models.authStatus: normalize provider ids + tighten env-backed escape… · openclaw/openclaw@f2fdb9d Update CHANGELOG.md · openclaw/openclaw@7694a92 test(parallels): clean up npm update guard jobs · openclaw/openclaw@045ea7b Plugins: prefer scanDir override paths · openclaw/openclaw@b2974da fix(dreaming): default storage.mode to "separate" so phase blocks sto… · openclaw/openclaw@8c392f0 fix(memory-core): skip dreaming transcript ingestion via session stor… · openclaw/openclaw@a1b01f0 fix: dedupe replayed exec.finished node events (#67281) · openclaw/openclaw@5dcf526
ci(release): streamline beta publish verification · openclaw/openclaw@1c5fda1
steipete · 2026-05-21 · via Recent Commits to openclaw:main

@@ -348,6 +348,7 @@ jobs:

348348

needs: [resolve_release_target]

349349

runs-on: ubuntu-latest

350350

timeout-minutes: 60

351+

environment: npm-release

351352

steps:

352353

- name: Checkout release SHA

353354

uses: actions/checkout@v6

@@ -450,7 +451,7 @@ jobs:

450451451452

pending_json="$(gh api -X GET "repos/${GITHUB_REPOSITORY}/actions/runs/${run_id}/pending_deployments" 2>/dev/null || true)"

452453

if [[ -z "${pending_json}" ]] || ! printf '%s' "${pending_json}" | jq -e 'length > 0' >/dev/null 2>&1; then

453-

return 0

454+

return 1

454455

fi

455456456457

approved=0

@@ -462,13 +463,15 @@ jobs:

462463

gh api -X POST "repos/${GITHUB_REPOSITORY}/actions/runs/${run_id}/pending_deployments" \

463464

-F "environment_ids[]=${env_id}" \

464465

-f state=approved \

465-

-f comment="Approve release gate from OpenClaw Release Publish wrapper" >/dev/null

466+

-f comment="Approve child release gate after parent release approval" >/dev/null

466467

approved=1

467468

done < <(printf '%s' "${pending_json}" | jq -r '.[] | select(.current_user_can_approve == true) | [.environment.id, .environment.name] | @tsv')

468469469470

if [[ "${approved}" == "1" ]]; then

470471

echo "${workflow}: approved available pending environment gates"

472+

return 0

471473

fi

474+

return 1

472475

}

473476474477

print_failed_run_summary() {

@@ -511,7 +514,7 @@ jobs:

511514

if [[ "$state" != "$last_state" ]]; then

512515

echo "${workflow} still ${status} (updated ${updated_at}): ${url}"

513516

print_pending_deployments "${workflow}" "${run_id}"

514-

approve_pending_deployments "${workflow}" "${run_id}"

517+

approve_pending_deployments "${workflow}" "${run_id}" || true

515518

last_state="$state"

516519

fi

517520

sleep 30

@@ -558,6 +561,85 @@ jobs:

558561

wait_run_pid="$!"

559562

}

560563564+

wait_for_job_success() {

565+

local workflow="$1"

566+

local run_id="$2"

567+

local job_name="$3"

568+

local jobs_json job_json run_status run_conclusion status conclusion url deadline

569+570+

deadline=$((SECONDS + 900))

571+

while true; do

572+

jobs_json="$(gh run view --repo "$GITHUB_REPOSITORY" "$run_id" --json status,conclusion,jobs)"

573+

run_status="$(printf '%s' "$jobs_json" | jq -r '.status')"

574+

run_conclusion="$(printf '%s' "$jobs_json" | jq -r '.conclusion // ""')"

575+

job_json="$(printf '%s' "$jobs_json" | jq -c --arg name "$job_name" '.jobs[]? | select(.name == $name) | {status, conclusion, url}' | head -n 1)"

576+

if [[ -n "$job_json" ]]; then

577+

status="$(printf '%s' "$job_json" | jq -r '.status')"

578+

conclusion="$(printf '%s' "$job_json" | jq -r '.conclusion // ""')"

579+

url="$(printf '%s' "$job_json" | jq -r '.url // ""')"

580+

if [[ "$status" == "completed" ]]; then

581+

if [[ "$conclusion" == "success" || "$conclusion" == "skipped" ]]; then

582+

echo "${workflow} ${job_name} ${conclusion}: ${url}"

583+

echo "- ${workflow} ${job_name}: ${conclusion} (${url})" >> "$GITHUB_STEP_SUMMARY"

584+

return 0

585+

fi

586+

echo "${workflow} ${job_name} failed: ${conclusion} ${url}" >&2

587+

print_failed_run_summary "${run_id}"

588+

return 1

589+

fi

590+

echo "${workflow} ${job_name} still ${status}: ${url}"

591+

elif [[ "$run_status" == "completed" ]]; then

592+

if [[ "$run_conclusion" == "success" ]]; then

593+

echo "${workflow} completed before ${job_name} was needed."

594+

echo "- ${workflow} ${job_name}: not needed" >> "$GITHUB_STEP_SUMMARY"

595+

return 0

596+

fi

597+

echo "${workflow} completed before ${job_name} with ${run_conclusion}." >&2

598+

print_failed_run_summary "${run_id}"

599+

return 1

600+

else

601+

echo "${workflow} waiting for ${job_name} to start: https://github.com/${GITHUB_REPOSITORY}/actions/runs/${run_id}"

602+

fi

603+

if (( SECONDS >= deadline )); then

604+

echo "${workflow} ${job_name} did not complete within 15 minutes." >&2

605+

return 1

606+

fi

607+

sleep 10

608+

done

609+

}

610+611+

approve_child_publish_environment() {

612+

local workflow="$1"

613+

local run_id="$2"

614+

local run_json status conclusion deadline

615+616+

deadline=$((SECONDS + 900))

617+

while true; do

618+

if approve_pending_deployments "${workflow}" "${run_id}"; then

619+

echo "- ${workflow}: child environment gate approved" >> "$GITHUB_STEP_SUMMARY"

620+

return 0

621+

fi

622+

run_json="$(gh run view --repo "$GITHUB_REPOSITORY" "$run_id" --json status,conclusion,url)"

623+

status="$(printf '%s' "$run_json" | jq -r '.status')"

624+

conclusion="$(printf '%s' "$run_json" | jq -r '.conclusion // ""')"

625+

if [[ "$status" == "completed" ]]; then

626+

if [[ "$conclusion" == "success" ]]; then

627+

echo "${workflow}: completed before child environment approval was needed"

628+

return 0

629+

fi

630+

echo "${workflow}: completed before child environment approval with ${conclusion}" >&2

631+

print_failed_run_summary "${run_id}"

632+

return 1

633+

fi

634+

if (( SECONDS >= deadline )); then

635+

echo "${workflow}: child environment approval was not available within 15 minutes." >&2

636+

print_pending_deployments "${workflow}" "${run_id}"

637+

return 1

638+

fi

639+

sleep 10

640+

done

641+

}

642+561643

create_or_update_github_release() {

562644

local release_version notes_version title notes_file changelog_file latest_arg prerelease_args

563645

release_version="${RELEASE_TAG#v}"

@@ -679,12 +761,81 @@ jobs:

679761

} >> "$GITHUB_STEP_SUMMARY"

680762

}

681763764+

append_release_proof_to_github_release() {

765+

local release_version body_file notes_file tarball integrity telegram_line clawhub_line

766+767+

release_version="${RELEASE_TAG#v}"

768+

body_file="${RUNNER_TEMP}/release-body.md"

769+

notes_file="${RUNNER_TEMP}/release-notes-with-proof.md"

770+

tarball="$(npm view "openclaw@${release_version}" dist.tarball --json | jq -r '.')"

771+

integrity="$(npm view "openclaw@${release_version}" dist.integrity --json | jq -r '.')"

772+

gh release view "${RELEASE_TAG}" --repo "$GITHUB_REPOSITORY" --json body --jq .body > "${body_file}"

773+774+

if [[ -n "${NPM_TELEGRAM_RUN_ID// }" ]]; then

775+

telegram_line="- npm Telegram beta E2E: https://github.com/${GITHUB_REPOSITORY}/actions/runs/${NPM_TELEGRAM_RUN_ID}"

776+

else

777+

telegram_line="- npm Telegram beta E2E: not supplied"

778+

fi

779+

if [[ "${WAIT_FOR_CLAWHUB}" == "true" ]]; then

780+

clawhub_line="- plugin ClawHub publish: https://github.com/${GITHUB_REPOSITORY}/actions/runs/${plugin_clawhub_run_id}"

781+

else

782+

clawhub_line="- plugin ClawHub publish: dispatched separately, not awaited by this proof: https://github.com/${GITHUB_REPOSITORY}/actions/runs/${plugin_clawhub_run_id}"

783+

fi

784+785+

RELEASE_BODY_FILE="${body_file}" \

786+

RELEASE_NOTES_FILE="${notes_file}" \

787+

RELEASE_VERSION="${release_version}" \

788+

RELEASE_TAG="${RELEASE_TAG}" \

789+

RELEASE_REPO="${GITHUB_REPOSITORY}" \

790+

RELEASE_TARBALL="${tarball}" \

791+

RELEASE_INTEGRITY="${integrity}" \

792+

RELEASE_PUBLISH_RUN_ID="${GITHUB_RUN_ID}" \

793+

PREFLIGHT_RUN_ID="${PREFLIGHT_RUN_ID}" \

794+

FULL_RELEASE_VALIDATION_RUN_ID="${FULL_RELEASE_VALIDATION_RUN_ID}" \

795+

PLUGIN_NPM_RUN_ID="${plugin_npm_run_id}" \

796+

OPENCLAW_NPM_RUN_ID="${openclaw_npm_run_id}" \

797+

CLAWHUB_LINE="${clawhub_line}" \

798+

TELEGRAM_LINE="${telegram_line}" \

799+

node --input-type=module <<'NODE'

800+

import { readFileSync, writeFileSync } from "node:fs";

801+802+

const bodyFile = process.env.RELEASE_BODY_FILE;

803+

const notesFile = process.env.RELEASE_NOTES_FILE;

804+

if (!bodyFile || !notesFile) {

805+

throw new Error("Missing release notes file paths.");

806+

}

807+808+

const body = readFileSync(bodyFile, "utf8").trimEnd();

809+

const section = [

810+

"### Release verification",

811+

"",

812+

`- npm package: https://www.npmjs.com/package/openclaw/v/${process.env.RELEASE_VERSION}`,

813+

`- registry tarball: ${process.env.RELEASE_TARBALL}`,

814+

`- integrity: \`${process.env.RELEASE_INTEGRITY}\``,

815+

`- release publish: https://github.com/${process.env.RELEASE_REPO}/actions/runs/${process.env.RELEASE_PUBLISH_RUN_ID}`,

816+

`- npm preflight: https://github.com/${process.env.RELEASE_REPO}/actions/runs/${process.env.PREFLIGHT_RUN_ID}`,

817+

`- full release validation: https://github.com/${process.env.RELEASE_REPO}/actions/runs/${process.env.FULL_RELEASE_VALIDATION_RUN_ID}`,

818+

`- plugin npm publish: https://github.com/${process.env.RELEASE_REPO}/actions/runs/${process.env.PLUGIN_NPM_RUN_ID}`,

819+

process.env.CLAWHUB_LINE,

820+

`- OpenClaw npm publish: https://github.com/${process.env.RELEASE_REPO}/actions/runs/${process.env.OPENCLAW_NPM_RUN_ID}`,

821+

process.env.TELEGRAM_LINE,

822+

].join("\n");

823+824+

const withoutOldProof = body.replace(/\n?### Release verification\n[\s\S]*?(?=\n### |\n## |$)/, "");

825+

writeFileSync(notesFile, `${withoutOldProof.trimEnd()}\n\n${section}\n`);

826+

NODE

827+828+

gh release edit "${RELEASE_TAG}" --repo "$GITHUB_REPOSITORY" --notes-file "${notes_file}"

829+

echo "- Release proof: appended to GitHub release" >> "$GITHUB_STEP_SUMMARY"

830+

}

831+682832

{

683833

echo "### Publish sequence"

684834

echo

685835

echo "- Workflow ref: \`${CHILD_WORKFLOW_REF}\`"

686836

echo "- Release tag: \`${RELEASE_TAG}\`"

687837

echo "- Release SHA: \`${TARGET_SHA}\`"

838+

echo "- Release approval: this workflow job"

688839

echo "- Plugin npm and ClawHub publish: dispatched in parallel"

689840

if [[ "${PUBLISH_OPENCLAW_NPM}" == "true" ]]; then

690841

echo "- OpenClaw npm publish: starts after plugin npm succeeds"

@@ -698,8 +849,8 @@ jobs:

698849

fi

699850

} >> "$GITHUB_STEP_SUMMARY"

700851701-

npm_args=(-f publish_scope="${PLUGIN_PUBLISH_SCOPE}" -f ref="${TARGET_SHA}")

702-

clawhub_args=(-f publish_scope="${PLUGIN_PUBLISH_SCOPE}" -f ref="${TARGET_SHA}")

852+

npm_args=(-f publish_scope="${PLUGIN_PUBLISH_SCOPE}" -f ref="${TARGET_SHA}" -f release_publish_run_id="${GITHUB_RUN_ID}")

853+

clawhub_args=(-f publish_scope="${PLUGIN_PUBLISH_SCOPE}" -f ref="${TARGET_SHA}" -f release_publish_run_id="${GITHUB_RUN_ID}")

703854

if [[ -n "${PLUGINS}" ]]; then

704855

npm_args+=(-f plugins="${PLUGINS}")

705856

clawhub_args+=(-f plugins="${PLUGINS}")

@@ -725,6 +876,7 @@ jobs:

725876

-f preflight_only=false \

726877

-f preflight_run_id="${PREFLIGHT_RUN_ID}" \

727878

-f full_release_validation_run_id="${FULL_RELEASE_VALIDATION_RUN_ID}" \

879+

-f release_publish_run_id="${GITHUB_RUN_ID}" \

728880

-f npm_dist_tag="${RELEASE_NPM_DIST_TAG}")"

729881

echo "- OpenClaw npm run ID: \`${openclaw_npm_run_id}\`" >> "$GITHUB_STEP_SUMMARY"

730882

else

@@ -739,7 +891,9 @@ jobs:

739891

wait_for_run_background plugin-clawhub-release.yml "${plugin_clawhub_run_id}" "${clawhub_result}"

740892

clawhub_pid="${wait_run_pid}"

741893

else

742-

echo "- plugin-clawhub-release.yml: not awaited (${plugin_clawhub_run_id})" >> "$GITHUB_STEP_SUMMARY"

894+

wait_for_job_success plugin-clawhub-release.yml "${plugin_clawhub_run_id}" "Validate release publish approval"

895+

approve_child_publish_environment plugin-clawhub-release.yml "${plugin_clawhub_run_id}"

896+

echo "- plugin-clawhub-release.yml: publish not awaited (${plugin_clawhub_run_id})" >> "$GITHUB_STEP_SUMMARY"

743897

fi

744898745899

openclaw_result=""

@@ -776,6 +930,7 @@ jobs:

776930777931

if [[ "${failed}" == "0" && -n "${openclaw_npm_run_id}" ]]; then

778932

verify_published_release

933+

append_release_proof_to_github_release

779934

fi

780935

if [[ "${failed}" != "0" ]]; then

781936

exit 1