Skip to content

[pull] main from openclaw:main - #198

Open
pull[bot] wants to merge 10000 commits into
vibecoder11200:mainfrom
openclaw:main
Open

pull[bot] wants to merge 10000 commits into
vibecoder11200:mainfrom
openclaw:main

Conversation

@pull

@pull pull Bot commented Sep 30, 2026 •

Copy link
Copy Markdown

See Commits and Changes for more details.


Created by pull[bot] (v2.0.0-alpha.4)

Can you help keep this open source service alive? 💖 Please sponsor : )

@pull pull Bot locked and limited conversation to collaborators Sep 30, 2026
@pull pull Bot added the ⤵️ pull label Sep 30, 2026
openclaw-mantis Bot and others added 28 commits November 7, 2026 08:18
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
…lid output (#194535)

* fix(sqlite): report a crashed Bun SQLite probe's exit instead of invalid output

* fix(sqlite): regenerate embedded Bun probe diagnostics
…94531)

Register the schema-41 PostgreSQL migration test added by #193682 so the existing completeness guard and conformance shards cover it.

Co-authored-by: roboclaw-bot <309084314+roboclaw-bot@users.noreply.github.com>
Co-authored-by: steipete <58493+steipete@users.noreply.github.com>
Pin the intentional schema-41 SQLite facts insert per 512-row batch and verify facts persist for the seed and appended messages. Preserve PostgreSQL budgets and allocate exactly seven added regression-test lines.

Co-authored-by: roboclaw-bot <309084314+roboclaw-bot@users.noreply.github.com>
Co-authored-by: steipete <58493+steipete@users.noreply.github.com>
…l loads (#194494)

fix(llama-cpp): keep one caller's stop from aborting a shared model load

The llama.cpp provider shares one GGUF preparation between concurrent callers, but it used the first caller's cancel signal. Stopping caller A also aborted callers B and C, a joining caller's own stop was ignored, and A's cleanup could evict a load that was still running. Each caller now waits on the shared load with its own signal through the existing helper, and the shared load is cleaned up only when it settles.

Evidence: built Gateway with three concurrent chats on the same local GGUF model, twice per ref. On main, stopping A aborted B and caused about 1.33 artifact reads; with this change B and C reach their own result with exactly one artifact read. Stopping B, and single and shared-load controls, behave as expected. The download path was not measured. Details: #194494 (comment).

Thanks @shuisadev and @SunnyShu0925.

Co-authored-by: SunnyShu <shu.zongyu@xydigit.com>
Co-authored-by: Ayaan Zaidi <hi@obviy.us>
* fix(gateway): resume work after delayed database admission

Retain exact crash-recovery intervals per physical agent until its admitted stores complete recovery. Preserve clean gaps, existing run identity consumption, current authority, and bounded restart dispatch; report unavailable agents explicitly.

Keep positively bound session authority current when unrelated agents become readable, while preserving logical and physical owner invalidation. No configuration or SQLite schema change.

* fix(gateway): skip empty agent recovery barriers
Audit time: 2026-11-07T07:17:49Z.
Inclusive cutoff: 2026-10-31T07:17:49Z.
Base SHA: 7a16dd8.

Refresh 29 direct npm dependencies and goldmark; remove 50 expired
release-age exclusions. Carry existing patches and repin the existing
AWS core/credential-provider and file-type overrides with their parents.

Defer ACP SDK 2.2 (batch-frame closure regression) and the October 30
TypeScript nightly (native resolver API breaks build/lint). Retain the
prior mailauth, CUA, formatter/linter, Convex, scheduler/router majors,
Matrix/Solid, virtual-core, Codex, tsrs and release-CLI deferrals, plus
separately owned OpenTelemetry/Anthropic/Vertex/Copilot/MXC migrations.
Cargo and Bundler locks remain unqualified and unchanged.
Co-authored-by: RomneyDa <6581799+RomneyDa@users.noreply.github.com>
fix(sessions): keep the session color when a session is reset

Fixes #194548.

`sessions.reset` kept a session's icon, label, category and pinned state but dropped its saved color. The color is now preserved with the other presentation settings. A cleared or unset color stays unset.

Evidence: built Linux Gateway with `sessions.patch` (icon and color), then `sessions.reset`, then a readback over RPC. Main lost the color after the reset; with this change it is kept in both the reset response and a fresh list. Clear and unset controls stay absent, and icon, labels, category, pin and placement are unchanged. Details: #194554 (comment).

Thanks @wr-web.

Co-authored-by: Ayaan Zaidi <hi@obviy.us>
## What Problem This Solves

Many iOS app tests read Swift source files as text and check for exact strings. They break on harmless refactors, protect nothing the compiler or real tests do not already protect, and one of them (`RootTabsSidebarRegressionTests` "sidebar has one agent selector and one session inventory") is already red on `main` after a sidebar refactor. CI never runs it, so nobody noticed.

## User Impact

No app change. iOS contributors stop updating string pins after refactors, and the full `pnpm ios:test` run loses one false failure.

## Why This Change Was Made

Each deleted test either pins wording or layout (class A), or repeats a rule that the compiler or a real test already checks (class B):

- `DevicePermissionsTests` "onboarding has no aggregate system permission prompt": `OnboardingStep` has no `.permissions` case, so the compiler enforces it; the intro→welcome behavior test stays.
- `OnboardingDiscoveredGatewayTests` (whole file): `GatewayConnectionController` has no plain `connect(_:)`, and `GatewayConnectionSecurityTests` covers the returned failure message.
- `RootTabsSidebarRegressionTests` (whole file): layout continuity, gestures, hit targets and the agent selector are covered by `RootSidebarShellContinuityTests`, `RootSidebarShellGestureTests` and `OpenClawSnapshotUITests`; the rest were modifier-string pins.
- `RuntimeLocalizationSourceGuardTests` "voice waveform stays on avatar…": a Dynamic Island design pin.
- `WatchApprovalTransportSourceGuardTests`: four tests (loading copy, outcome parsing, identifier policy, notification identity). Their real rules now have behavior tests:
  - `GatewaySettingsStoreTests`: `ExecApprovalIdentifier.exact` edge bytes, and `ExactOpaqueIdentifierKey` stays byte exact (composed vs decomposed Unicode) and dot safe in notification components.
  - `WatchInboxStoreOperationTests` "only a correlated snapshot closes approvals it omits": an unsolicited empty snapshot (for example from an iPhone cache) keeps a pending approval; the response to the Watch's own request closes it. This replaces the source check for `guard hasCanonicalRequestCorrelation else { return true }`.
  - `WatchInboxStoreOperationTests` "received approval snapshots keep approval and gateway IDs exactly as sent": a snapshot sent through `WatchConnectivityReceiver` with space-padded IDs is stored byte for byte. This replaces the source checks that the parser uses `WatchApprovalID.exact`/`WatchGatewayID.exact` without trimming.
  - `WatchInboxStoreOperationTests` "received resolution keeps its semantic outcome over the legacy decision": a resolved payload with `outcome: allowedAlways` and legacy `decision: deny`, sent through the receiver, records Allowed always. This replaces the source check that the receiver forwards `outcome`.
  - `WatchInboxStoreOperationTests` "resolved approvals block only their exact Unicode ID": resolving a composed-Unicode ID does not block the canonically equal decomposed ID. This replaces the source checks on exact tombstone key matching.
- `OpenClawTypographyTests`: the per-screen wording pins, including `local device settings use branded typography` added in #191524. The typography scanner (`iOS app text and control calls keep branded font boundaries`, `secure fields do not use platform placeholder text`) still checks every app, Watch and chat UI source file for system fonts, so it keeps enforcing the `apps/ios/AGENTS.md` rule. `apps/ios/AGENTS.md` now points at the scanner instead of asking for new per-screen pins.

Source-text tests that are the only check on a real rule (for example Watch approval retry state, scanner start/stop, the Live Activity owner, startup scene-phase order) stay unchanged here. They need behavior-test replacements, some with new production seams, and will follow separately.

## Evidence

- `pnpm ios:test` (whole `OpenClaw` scheme) on an iPhone 17 simulator: 1330 passed, 3 skipped, 1 failed. The failure is `WatchApprovalTransportSourceGuardTests` "retry reset matches the exact active attempt", a kept source-text test that is already red on `main` (its pin went stale when `upsertExecApproval` gained `resetResolutionAttemptID`); it needs a behavior-test replacement and is not in any CI list. Before this change the same run also failed `RootTabsSidebarRegressionTests` (deleted here).
- After the final formatting fix: `pnpm ios:test OpenClawTypographyTests GatewaySettingsStoreTests`: 49 passed, including the moved identifier assertions.
- `OpenClawWatchApp` scheme, `OpenClawWatchTests/WatchInboxStoreOperationTests` on a watchOS simulator: 37 passed. Mutation checks, one per new Watch test: removing the `hasCanonicalRequestCorrelation` guard, trimming the parsed approval ID, dropping the parsed `outcome`, and matching tombstones with Unicode-equivalent `String ==` each fail exactly the matching test. All sources restored unchanged.
- SwiftFormat lint clean on changed files. `pnpm native:i18n:verify` passes. No CI workflow, script or project file names a deleted suite; `OpenClawTypographyTests` (named in `ci.yml` and `scripts/lib/ci-ios-smoke-plan.mjs`) still exists.
- Swift test deletions do not touch the TypeScript test-line ratchet.
- Review: hosted ClawSweeper on this PR.

Merge danger: two-way door. Test-only and one guidance line; a revert restores the tests.

Co-authored-by: Ayaan Zaidi <hi@obviy.us>
)

* fix(ci): clear inherited test budget and unused export failures

Reconcile outstanding test-line debt from #194468, #194417, and #194464 with exact per-PR allocations. Shrink the scalar by the 37 test lines removed here so the effective ceiling equals 6559825.

Remove the renderer test-only export introduced by #191935 and the digest helper orphaned by #194456. Route the ingress fixture through the production HTTP owner and retain install/persistence and worker loading proof.

* test(gateway): specify the ingress fixture base path

Supply the required empty controlUiBasePath to the production startup HTTP handler. The UI E2E typecheck passes; runtime behavior and test-line accounting are unchanged.

* test(gateway): close failed ingress responses safely
…3890)

* improve(ui): use shared toast styling for persistent chat errors

Preserve persistent error ownership while sharing toast presentation, recovery controls, and diagnostic disclosures. Match the rounded error block with top-right Copy and a right-side disclosure chevron.

Co-authored-by: vyctorbrzezowski <51521767+vyctorbrzezowski@users.noreply.github.com>

* fix(ui): preserve long diagnostic scrolling during toast adoption

Restore the prior diagnostic height and keyboard scrolling bounds, align E2E selectors with shared toast presentation, and prune the retired selector allowance without changing the design.

Co-authored-by: vyctorbrzezowski <51521767+vyctorbrzezowski@users.noreply.github.com>

* fix(ui): retain deferred toast styles and reload warning coverage

Keep rich toast styles inline with their renderer instead of adding a duplicate CSS asset, simplify the equivalent action slot, and retain the full reload-warning fixture. The rendered design is unchanged.

Co-authored-by: vyctorbrzezowski <51521767+vyctorbrzezowski@users.noreply.github.com>

* fix(ui): keep persistent error actions aligned and dismissible

Pin recovery actions beside the error title so expanding details no longer moves them, let diagnostics span the full width, move the long discard action below the message on phones, and show the dismiss control on touch devices. Correct the startup recovery title expectation.

Co-authored-by: vyctorbrzezowski <51521767+vyctorbrzezowski@users.noreply.github.com>

* fix(ui): make persistent reply errors dismissible

Show the dismiss control on persistent errors without requiring hover, let reply failures be dismissed through the run-recovery owner, and keep the badge clear of the trailing action. Placement failures stay non-dismissible because their actions are the only recovery path.

Co-authored-by: vyctorbrzezowski <51521767+vyctorbrzezowski@users.noreply.github.com>

* fix(ui): keep persistent error dismiss inside the card

Place the always-visible dismiss control inline so scrolling composer containers on phones no longer clip it or scroll sideways. Migrate the remaining E2E consumers of the retired error markup, scope the reload-warning locator to the toast lane, compact the browser regressions, and record their test-line allocation.

Co-authored-by: vyctorbrzezowski <51521767+vyctorbrzezowski@users.noreply.github.com>

* fix(ui): keep dismissed reply errors dismissed across history reloads

Record the dismissed run in the run-error owner so history reconciliation does not restore the same failure; a different run failing still shows its error. Tighten the stale dismiss assertion and drop an unused rule.

Co-authored-by: vyctorbrzezowski <51521767+vyctorbrzezowski@users.noreply.github.com>

* test: record exact test-line growth for persistent error toast

Co-authored-by: vyctorbrzezowski <51521767+vyctorbrzezowski@users.noreply.github.com>

---------

Co-authored-by: vyctorbrzezowski <51521767+vyctorbrzezowski@users.noreply.github.com>
…4510)

* fix(models): retain sticky default writes after reply completion

* refactor(models): use canonical selection scope in gateway types

Co-authored-by: Peter Steinberger <steipete@gmail.com>
On a warm reload of a chat with cached Details, the transcript rows painted first and the Details pane stayed empty for another 688 to 840 ms while its Session and Environment modules loaded one after the other. That empty column was the last visible step between the old page and the complete cached page.

The chat snapshot prewarm now reads the cached Details docking receipt and, when it was saved wide for the current viewport width, starts the Session and Environment imports in parallel through one shared desktop loader. The pane header records the docking layout as a tuple whose first fact is the viewport width, so a snapshot saved in a 2200 px window and reopened at 1000 px no longer loads Details that placement keeps closed. The docking receipt is an optional additive field in the client snapshot schema; no store or schema version changes.

On one quiet c7a.4xlarge, eleven interleaved pairs plus A/A, the native active chat now paints Details in the same frame as the rows in 10/11 pairs (main 0/11); lag after rows drops 820 to 0 ms and complete-page LoAF through the first Details paint drops 425.9 to 297.1 ms (paired -130.4 ms, 11/11). First and final rows cost about +23 ms paired, an accepted lead exception. #193217's backtracking probe stays at 0 px in all 44 captures, and the Details motion test passed 20/20 on each arm.

Bytes are a recorded lead exception for this PR: CI base to head Startup +738 B, Chat +666 B, New +514 B. Startup's baseline was regenerated through the owner command; Chat and New caps sit at the exact CI value plus 64 B with comments naming this PR. Test lines carry an exact 258-line allocation.

The red UI unit, UI E2E and ratchet jobs on the final head match main's own scheduled CI from the same hour (run 42347241784 at facdbeb) or main's inherited test-lines debt; the five Details reload cases executed and passed in CI.
…4567)

Bound lifecycle drain fan-out and omit deleting agents from session catalogs. The 85-line test allocation covers restart capacity and catalog planning/delivery regressions.
Co-authored-by: Peter Steinberger <steipete@gmail.com>
Co-authored-by: vincentkoc <25068+vincentkoc@users.noreply.github.com>
* fix(ui): use each provider's brand name instead of its title-cased id

Providers without an entry in the display-label table were shown as their
title-cased id ("Tencent Tokenhub", "Litellm", "Vllm"). Add the names each
bundled plugin already uses for its provider label.

Co-authored-by: obviyus <22031114+obviyus@users.noreply.github.com>

* chore(test): allocate test lines for provider brand-name cases

Co-authored-by: obviyus <22031114+obviyus@users.noreply.github.com>

* test(ui): expect ClawRouter's brand name in the catalog refresh notice

Co-authored-by: obviyus <22031114+obviyus@users.noreply.github.com>

---------

Co-authored-by: obviyus <22031114+obviyus@users.noreply.github.com>
* fix(gateway): make crashes visible after automatic restarts

Record unclean predecessors through the existing boot receipt and SQLite
machine-state owner, retain ten diagnostic facts, and enrich native exit
evidence after startup. Surface crashes in logs, status, Doctor, health and
readiness without changing successor health.

Use bounded crash retries for Windows task children and macOS SIGILL exits.
Clean shutdown and restart handoff remain non-crashes. Add focused lifecycle,
supervisor and diagnostic regressions plus troubleshooting documentation.

* fix(gateway): bound crash journal inspection

* fix(gateway): share crash and restart recovery lifecycle

Reuse the boot owner predecessor window, preserve retained recovery intervals across clean starts, and consolidate crash reporting. Restore optional status history types and bound journal test indexing.

* test(gateway): size crash coverage allocation after main reconciliation
* chore(deps): update fs-safe to 0.28.0

* fix(state): enable fs-safe DrvFS compatibility on verified mounts

* fix: align fs-safe adoption tooling and test contracts

* test(plugins): complete shared JSON fixture migration
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
…94577)

Materialize missing checkout and CI-reuse commits with normal fetch negotiation before local-only probes and checkout. Preserve partial-clone filters and private FETCH_HEAD, and reuse existing batched blob hydration.
* fix(test): apply HTTP latency to native plugin benchmarks

* test(ui): allocate native asset latency fixture lines

Grant exactly the nine net test-helper lines needed to apply benchmark HTTP latency to native plugin assets. Keep the shared test-line baseline unchanged; the staged ratchet passes at the measured ceiling.
* test(ui): diagnose sidebar snapshot receipt timeouts

* fix(ui): capture settled sidebar after readiness-only updates

* fix(ui): use public sidebar context for diagnostics

* refactor(ui): validate snapshot readiness at capture

* test(ui): keep sidebar timeout diagnostics out of route bundles

* test(ui): align snapshot repair budgets with complete build

* test(ui): refresh snapshot repair caps after main merge
fix(tmux): report sessions with several clients as attached

The bundled tmux skill reported a session as attached only when exactly one client was attached, so a session with two or more clients showed as detached. Any attached count above zero now reports attached. Zero and one clients, ordering, timestamps, queries and sockets are unchanged.

Evidence: real tmux with 0, 1 and 2 independent clients on a private socket in Linux Docker, running the packaged script. Main labeled the 2-client session detached; with this change it is attached. The 0 and 1 client controls and output order are unchanged. Details: #194565 (comment).

Thanks @zhangguiping-xydt.

Co-authored-by: Ayaan Zaidi <hi@obviy.us>
vincentkoc and others added 30 commits November 8, 2026 03:03
* fix(ci): reconcile dead-code exports with live consumers

* fix(ci): keep absent lazy bindings undefined

* fix(ci): defer resolved UI export work to main
* fix(memory): use portable glob semantics for extra paths

* chore(memory): remove one-off glob benchmark
…ct (#194620)

## What Problem This Solves

Fixes: "Auto-connect on launch" in Gateway settings turns itself back on when the app reconnects (socket drop, Gateway restart, returning from background, push wake), so a user who turned it off gets auto-connected on the next launch anyway.

## User Impact

Turning off "Auto-connect on launch" now sticks. Pairing or an explicit connect still turns it on, as before.

## Why This Change Was Made

`NodeAppModel.handleNodeGatewayConnected` stored `gateway.autoconnect = true` on every node connect (added in #99572). Reconnects inside an existing connect attempt (channel reconnects, the foreground stale-socket restart, push-wake reconnects, settings refreshes) also reach that handler, so they overwrote the user's choice.

The handler now enables the preference once per connect attempt (`gatewayConnectGeneration`). Explicit connects, auto-connect at launch and target-review resumes start a new attempt and still enable it; reconnects keep their attempt's generation and leave the preference alone. Nothing else reads or writes the preference differently.

## Evidence

iPhone 17 simulator, isolated Gateway profile: pair with a setup code (toggle On), turn "Auto-connect on launch" off in Settings → Gateway, restart the Gateway so the app drops and reconnects on its own, then read the toggle and the stored preference.

- Before (`main`): after the reconnect the toggle is On and `gateway.autoconnect` is `true`.
- After: the app reconnects (sidebar Online), the toggle stays Off and `gateway.autoconnect` stays `false`.

| Before (`main`) | After |
|---|---|
| ![Before: Auto-connect on launch is back on after a reconnect](https://github.com/user-attachments/assets/64d51e87-2a4c-41fe-bc05-3139730f7ec0) | ![After: Auto-connect on launch stays off after a reconnect](https://github.com/user-attachments/assets/a4b12ace-b082-4572-b41e-36f04d766e4d) |

- New `GatewayConnectionControllerTests` "reconnects keep the user's auto-connect choice" drives a real connection against the native loopback Gateway fixture: connect (preference on), user turns it off, foreground stale-socket restart reconnects (preference stays off), new explicit connect (preference on). It fails on `main` at the reconnect step and passes with the fix.
- `pnpm ios:test GatewayConnectionControllerTests GatewayConnectionSecurityTests NodeAppModelInvokeTests SettingsHubVisualProofTests GatewayAccessDeviceAuthBindingTests`: 403 passed. `GatewayIngressControllerTests` (includes the ingress activation tests that set this preference): 94 passed on a fresh simulator.
- SwiftFormat lint clean.
- Review: hosted ClawSweeper on this PR.

Merge danger: two-way door. One preference write becomes conditional; no schema, protocol or reconnect timing changes.

Co-authored-by: Ayaan Zaidi <hi@obviy.us>
Co-authored-by: vyctorbrzezowski <51521767+vyctorbrzezowski@users.noreply.github.com>
* fix(build): isolate standalone native export resolution

Capture package exports in a fresh instance of the build runtime so earlier bundling cannot exhaust the resolver state used to build the native lookup table. Verify ambiguous missing entries independently and fail before publishing an incomplete artifact.

* test: reconcile standalone regression allocation with CI base

* test: share standalone native fixture setup
* fix: keep Send now available after steering falls back

Retain the captured input capability across proven steering withdrawal. Re-admit it with fresh writer authority before call-scoped interruption, and settle queued custody as consumed so the correction reaches the next model decision once.

* test: match Send now event adapter callback contract
…94955)

* fix: adopt controllers across completed historical incident gates

Bind the historical gate and completion explicitly while independently approving the current retained source and actual four-file closure. Reuse the existing gate handoff, installation, and replay owner; historical completion grants no current authority.

* test: measure workspace shape inside the runtime fixture
* fix(ui): keep retained transcript rows steady during scroll-up

* fix(ui): preserve native scrolling during transcript correction

* fix(ui): clamp transcript corrections at native zero

Avoid painting a temporary column shift after an upward native gesture reaches the start boundary. Cover the native-zero phase alongside settled and active-scroll measurements.

* fix(ui): distinguish reader input from transcript layout motion

* fix(ui): keep the transcript start anchored after row growth

* perf(ui): accept measured transcript anchor byte tradeoff

* test(ui): account for transcript regression coverage

* perf(ui): retain measured Chat headroom after main integration
* fix(gateway): release old session rows after metadata updates

Tie strong publication caches to materialization lifetimes and keep preceding audience views weak for optional structural sharing. Remove retained revision graphs and extend the existing collection regression to cover common display rows.

Co-authored-by: steipete <58493+steipete@users.noreply.github.com>

* fix(gateway): initialize snapshot measurement publication cache

Supply the required previousViews map in the synthetic snapshot fixture. Fix TS2741 in check-test-types; focused typecheck reproduces the error before this change and passes afterward.

Co-authored-by: steipete <58493+steipete@users.noreply.github.com>

---------

Co-authored-by: roboclaw-bot <309084314+roboclaw-bot@users.noreply.github.com>
Co-authored-by: steipete <58493+steipete@users.noreply.github.com>
…sessions

Co-authored-by: vyctorbrzezowski <51521767+vyctorbrzezowski@users.noreply.github.com>
…rofile is unknown

Co-authored-by: vyctorbrzezowski <51521767+vyctorbrzezowski@users.noreply.github.com>
Co-authored-by: vyctorbrzezowski <51521767+vyctorbrzezowski@users.noreply.github.com>
* fix(release): isolate Plugin SDK predecessor fetch

Co-authored-by: RomneyDa <6581799+RomneyDa@users.noreply.github.com>

* fix(release): resolve SDK renderer preload

Co-authored-by: RomneyDa <6581799+RomneyDa@users.noreply.github.com>

* fix(release): make predecessor review CI-safe

Resolve the TypeScript preload from the trusted tooling module so bundled workers do not assume a sibling source file. Reconcile the test-line allocation exactly against current main.

Co-authored-by: RomneyDa <6581799+RomneyDa@users.noreply.github.com>

---------

Co-authored-by: RomneyDa <dallinromney@gmail.com>
Co-authored-by: RomneyDa <6581799+RomneyDa@users.noreply.github.com>
…94947)

* fix(models): avoid repeated module probes for absent build stamps

* test(models): describe the mocked module namespace explicitly
Co-authored-by: vyctorbrzezowski <51521767+vyctorbrzezowski@users.noreply.github.com>
…#194913)

The warm-reload browser probe tags text with elementtiming so rows and Details report their first paint. Its MutationObserver re-resolved the row or Details context for every added node and every text node: about 4,876 roots and 4,098 text walkers before the native rows painted. On the native 3,000-session fixture that work sat inside the pane task, so every native warm-reload number carried it.

The observer now collects each batch's added roots and drops roots nested in another root of the same batch. It resolves the row or Details context once per remaining root and walks each scope's text once. It tags exactly the same text parents as before. On large rows it keeps late-arriving visible text eligible, so a 3,859 px transcript scrolled to its end still reports rows Element Timing.

Equivalence on one AWS c7a.4xlarge: same-capture dual observers on native active (2), native archived and Team active produced identical rows and Details Element Timing and identical annotated sets. Annotator tax, measured with 8 interleaved pairs plus A/A in steady-state timing mode: native active rows 566 to 502 ms (A/A-adjusted 54 ms), native archived 534 to 492 ms (49 ms), Team within noise; native walkers fall from about 4,100 to 6. Corrected steady-state rows: Team active 338 ms [332, 341] and archived 320 ms [316, 333], 12/12 under 480 ms; native active 492 ms [480, 505] and archived 484 ms [464, 485].

Application runtime is unchanged; the probe is +11 executable lines. The 183 new test lines carry their own allocation. Focused probe and CLI tests pass. The exact-head test-line ratchet is over by 22 lines inherited from main (tracked by #194489), and the Security High and changed-path scan jobs failed on GitHub API rate limits; neither involves this change.
* improve: reduce Gateway startup module-file overhead

Bundle OpenAI and ws, defer clean-profile legacy inspection, and instrument startup module loads without starving Windows probe I/O.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

* refactor: share legacy session source detection

---------

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Dallin Romney <dallinromney@gmail.com>
Document existing revision comparison and fenced setup verification without introducing a new runtime receipt API.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Remove the duplicated failure-details block from session hovercards and its unused styles. Keep the sidebar failure indicator and the error inside the conversation unchanged.

Drop the previous proposal's acknowledgement controls, read-receipt helpers and associated tests. The Subagents panel remains unchanged.

Co-authored-by: Mitchell Etzel <16581152+etzelm@users.noreply.github.com>
Co-authored-by: Dallin Romney <dallinromney@gmail.com>
Co-authored-by: Vyctor H. Brzezowski <krzyszchweski@gmail.com>
* fix(release): recover quota-limited publisher reads safely

Preserve fresh authorization across quota waits, bound publication concurrency, and correct Parallel ClawHub metadata.

Co-authored-by: RomneyDa <6581799+RomneyDa@users.noreply.github.com>

* fix(release): narrow recovery to Parallel metadata

Remove quota retries, transport changes, concurrency tuning and their tests from this release fix. Defer quota resilience to the release retrospective; retain only the required Parallel category correction and regression coverage.

Co-authored-by: RomneyDa <6581799+RomneyDa@users.noreply.github.com>

---------

Co-authored-by: RomneyDa <6581799+RomneyDa@users.noreply.github.com>
* fix(ui): correct squeezed Environment menu button

Worked on by:
- @vyctorbrzezowski

Co-authored-by: vyctorbrzezowski <51521767+vyctorbrzezowski@users.noreply.github.com>
OpenClaw-Publication: 9878def6-3585-4a4b-9304-2e125d14689e

* fix(ui): correct squeezed Environment menu button

Worked on by:
- @vyctorbrzezowski

Co-authored-by: vyctorbrzezowski <51521767+vyctorbrzezowski@users.noreply.github.com>
OpenClaw-Publication: 45ab25c0-01b8-4c39-a366-e91f975b6c81

---------

Co-authored-by: vyctorbrzezowski <51521767+vyctorbrzezowski@users.noreply.github.com>
Accept a bounded contiguous native replacement chain from the retained
journal config identity to the reviewed current config. Bind each audit
link, reject gaps, forks and foreign writers, and compare the backup with
the final preimage. Preserve the single-link startup additive guard and
skip native read-only observations.

Add regression coverage for historical Gateway PIDs, an identical-byte
replacement, interleaved reads, the chain limit and refusal boundaries.
fix(skills): package sources with normalized timestamps

The skill packager wrote ZIP entries with the source file timestamps. ZIP can only store dates from 1980 to 2107, so packaging failed for files with dates outside that range (for example, epoch timestamps from a tar extract). Out-of-range timestamps are now clamped into the ZIP range, and in-range timestamps are written as before.

This replaces #194614 by @zhangguiping-xydt and keeps their commit. The original branch history broke review-source preparation.

Evidence: the npm-packaged packager CLI in secretless Linux Docker with real GNU tar and touch timestamps and real zipfile reads. A source tree with epoch timestamps, an epoch resource and a 2108 resource all package and read back correctly, with the expected dates, file list and content, and the source metadata stays unchanged. Archives with normal timestamps are byte-identical to main. The regression passes in four time zones. Details: #194700 (comment).

Thanks @zhangguiping-xydt.

Co-authored-by: zhangguiping-xydt <zhangguiping-xydt@users.noreply.github.com>
Co-authored-by: Ayaan Zaidi <hi@obviy.us>
fix(ui): show elapsed time on main-chat subagent cards

Fixes #194737.

The main-chat subagent card showed no elapsed time. The collection projection in chat-details-snapshot dropped each session's existing startedAt and endedAt, and the collection SubagentRow did not render elapsed time. The projection now keeps those timing fields, and the row uses the same existing elapsed renderer as ordinary rows. Clocks, formats and layout are unchanged.

Evidence: the built Gateway and UI in real Linux Chromium, run twice on main and twice with this change. A real run spawned five subagents in two waves. Main showed no elapsed labels on the card; with this change all five show elapsed time, active clocks advance and finished ones freeze. Queued, ordinary-row and Subagents-panel controls pass. Gzip size: startup +27 B, chat boot -33 B, combined -6 B. The before and after screenshots were inspected and are in the evidence comment: #194778 (comment).

Co-authored-by: Ayaan Zaidi <hi@obviy.us>
Co-authored-by: vyctorbrzezowski <51521767+vyctorbrzezowski@users.noreply.github.com>
fix(skills): fail packaging when a source directory is unreadable

The skill packager listed files with Path.rglob, which silently skips directories it cannot read. A skill with an unreadable subdirectory then reported success and replaced a complete .skill with a ZIP that held only SKILL.md. The packager now walks with os.walk(onerror=raise) and stops on the first unreadable directory. The existing excluded and staging directories are still skipped, and no-follow, containment, POSIX sort order and atomic publication are unchanged.

Evidence: the packaged CLI as a non-root user in Linux Docker with a chmod 000 subdirectory, run twice on main and twice with this change. Main replaced an existing archive with a SKILL.md-only ZIP. With this change, packaging fails, the existing archive is kept and no new archive is created. Restored permissions, an unreadable excluded node_modules, symlinks and file modes give the same results as main. Details: #194635 (comment).

Thanks @zhangguiping-xydt.

Co-authored-by: Ayaan Zaidi <hi@obviy.us>
…4887)

* perf(ui): show model provider auth before catalog discovery

* perf(ui): release model refresh rows after auth

* fix(ui): retain catalog diagnostics through background publication

* test(ui): reconcile inherited test-line debt

* test(ui): trim allocation to current main debt

* test: shrink Models refresh allocation to current debt

* fix(ui): retry provider usage independently of catalog refresh
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.