Skip to content

perf: consolidate runtime lifecycle and queue hardening - #2

Draft
trumpyla wants to merge 58 commits into
mainfrom
perf/consolidated-runtime
Draft

perf: consolidate runtime lifecycle and queue hardening#2
trumpyla wants to merge 58 commits into
mainfrom
perf/consolidated-runtime

Conversation

@trumpyla

@trumpyla trumpyla commented Aug 1, 2026

Copy link
Copy Markdown
Member

Summary

  • Consolidate OpenClaw PR #478 with the later local runtime recovery work.
  • Preserve adapter and process-tree shutdown, queue-owner identity and lease safety, persistence locking, startup/eager-graph performance, capability caching, and Windows PATHEXT command resolution.
  • Keep release workflows, Homebrew, SBOM, provenance, npm closure, and SEA packaging changes out of this branch.

Why

The previous worktrees contained overlapping lifecycle, queue, persistence, and performance implementations. This branch reconciles those alternatives into one runtime-owned history with the newer failure shields and focused regression coverage.

The branch contains the full OpenClaw PR #478 head (5d3063b) and adds nine consolidation commits. It reports ACPX version 0.13.0.

Validation

  • pnpm run check
    • 974 tests: 973 passed, one platform skip, zero failures
    • 94.16% line/statement, 87.36% branch, and 96.07% function coverage
  • Focused lifecycle, process-tree, queue, persistence, pruning, spawn, capability-cache, and terminal suites
  • pnpm run lint:eager-graph (five eager chunks; only Commander remains external)
  • pnpm run perf:report against captured runtime metrics
  • Conflict-free detached combined-tree verification with release/consolidated-sbom, including the complete check and SEA packaged-binary tests

Ownership boundary

This PR owns runtime performance, process lifecycle, queue ownership, and persistence behavior. Release and supply-chain work is intentionally isolated in companion PR #3.

kelvinschen and others added 30 commits July 21, 2026 23:16
* fix(windows): require structured agent argv

* refactor(acp): own built-in command migration
Bumps the actions group with 1 update in the / directory: [actions/checkout](https://github.com/actions/checkout).


Updates `actions/checkout` from 7.0.0 to 7.0.1
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](actions/checkout@v7.0.0...v7.0.1)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-version: 7.0.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: actions
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Bumps [actions/setup-node](https://github.com/actions/setup-node) from 4 to 7.
- [Release notes](https://github.com/actions/setup-node/releases)
- [Commits](actions/setup-node@v4...v7)

---
updated-dependencies:
- dependency-name: actions/setup-node
  dependency-version: '7'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
…claw#442)

* fix(flows): swallow heartbeat write rejections from setInterval

void heartbeat() inside setInterval can reject when store.writeLive fails,
producing unhandledRejection noise and process flags. Catch rejections as
best-effort live-state updates, matching other best-effort .catch() sites
in the runtime.

Signed-off-by: Sebastien Tardif <sebtardif@ncf.ca>

* test(flows): prove heartbeat timer swallows writeLive rejections

Add a focused regression that forces best-effort heartbeat writes to
reject and asserts zero unhandledRejection events, matching the
setInterval .catch() boundary in FlowRunner.runWithHeartbeat.

Signed-off-by: Sebastien Tardif <sebtardif@ncf.ca>

* test(flows): exercise FlowRunner heartbeat writeLive rejection path

Replace the duplicated timer harness with a real FlowRunner shell node that
forces interval writeLive failures and asserts zero unhandledRejection.

Signed-off-by: Sebastien Tardif <sebtardif@ncf.ca>

* retrigger proof check

Signed-off-by: Sebastien Tardif <sebtardif@ncf.ca>

* fix(flows): harden heartbeat rejection coverage (openclaw#442)

Co-authored-by: Sebastien Tardif <sebtardif@ncf.ca>

---------

Signed-off-by: Sebastien Tardif <sebtardif@ncf.ca>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
* fix(session): avoid atomic write temp collisions

* test(session): make temp-path regression deterministic (openclaw#447)

Co-authored-by: Henk ter Harmsel <henk@chaink.it>

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
* feat(cli): add filesystem capability opt-out

* docs(cli): complete no-fs coverage (openclaw#469)

Co-authored-by: 甄新 <heyang.heyang@alibaba-inc.com>

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
* feat: add Pool ACP agent

Register Poolside as a built-in agent via `pool acp`.

* fix: add structured Pool agent launch

---------

Co-authored-by: Onur Solmaz <2453968+osolmaz@users.noreply.github.com>
* fix(cli): preserve positive timer durations

* fix(cli): share timer conversion with config (openclaw#459)

Co-authored-by: mehmetali <36207866+realmehmetali@users.noreply.github.com>

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
… reconnect" (openclaw#444)

* fix(cli): distinguish starting and reconnect states (openclaw#444)

Co-authored-by: Thomas Güttler <info@thomas-guettler.de>

* fix(cli): preserve reconnect status for live leases (openclaw#444)

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
Co-authored-by: Thomas Güttler <info@thomas-guettler.de>
* feat: add ZeroClaw ACP agent (openclaw#440)

Co-authored-by: jordanthejet <morepencils@gmail.com>

* fix(agents): register ZeroClaw structured argv (openclaw#440)

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
trumpyla added 10 commits July 29, 2026 19:27
Source-Commit: d49652824abb75f7550ea24d74014353fcdd5d8e
…ity caching

Source-Commit: d2f70209e56d8a7f84ac46f91a7a59ebd6fd4a9e
Source-Commit: d25c86a23be4756121c5cfab4358145e70fa821c
Source-Commit: d4459336b4fc8884fab220b5a945ab16c5da271e
Source-Commit: 7fbcd54a929f2884a4a0e42be8639db315079e08

Source-Scope: performance
Source-Commit: e2804e2b5412be2705afb18e9bb4958e023f2d1b
Source-Commit: 0abb6fedf5ff5169f0bfc50896480600aea3ec76

Source-Scope: performance
@trumpyla

trumpyla commented Aug 1, 2026

Copy link
Copy Markdown
Member Author

Performance comparison against OpenClaw main

Compared this PR at 5ebe1163767eae4e9feb21edd633760933dc6be9 with OpenClaw main pinned at 504040facb1992453cf16a2a096a1094fc4e48d4.

Environment: Apple M2 Pro, 12 logical CPUs, 32 GiB RAM, macOS Darwin 25.5.0, arm64, Node v24.11.0, pnpm 10.34.5. Both revisions were installed and built independently. Timings use alternating adjacent pairs, measured in the parent process from immediately before spawn through child close. The paired delta is the geometric mean of paired log ratios with a 10,000-resample 95% bootstrap CI.

Scenario n OpenClaw main median / p95 PR median / p95 Paired delta (95% CI)
--version 100 106.074 / 114.150 ms 54.028 / 58.243 ms -49.380% (-49.819%, -48.923%)
--help 80 106.307 / 112.818 ms 61.245 / 65.022 ms -42.311% (-42.841%, -41.765%)
sessions list --local 50 111.416 / 118.245 ms 112.408 / 123.186 ms +1.545% (+0.613%, +2.560%)
cold mock ACP sessions list 25 220.480 / 231.956 ms 364.398 / 371.743 ms +64.428% (+62.231%, +66.624%)
cold mock ACP exec 25 224.837 / 232.767 ms 367.742 / 376.810 ms +65.007% (+63.337%, +66.833%)

Static eager graph size improved from 4 chunks / 537,437 raw bytes / 116,993 gzip bytes to 5 chunks / 274,580 raw bytes / 62,305 gzip bytes: 48.9% fewer raw bytes and 46.7% fewer gzip bytes. The external eager dependency set dropped from the ACP SDK, Commander, and Zod to Commander only.

The branch's internal spans provide a lead on the cold ACP regression: deferred session-module loading averages about 44 ms and close averages about 84 ms. These spans overlap and must not be summed. The robust process-tree shutdown snapshot is a likely contributor to close cost, but this run does not prove it is the sole cause.

Conclusion: lightweight startup is materially faster, while cold ACP-backed operations are materially slower. This PR should not be described as a blanket performance improvement until the ACP lifecycle regression is addressed or explicitly accepted.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.