* refactor(ui): dedupe chat styles and make styles.css import order real
* refactor(ui): dedupe chat tool-row styles into chat files
* refactor(ui): keep light bubble skin after role variants
* refactor(ui): keep light bubble skin after role variants
* refactor(ui): keep light bubble skin after role variants
* fix(transcripts): mark delivery mirrors as artifacts
* fix(transcripts): mark delivery mirrors as artifacts
* fix(transcripts): mark delivery mirrors as artifacts
applyFinalEffectiveToolPolicy and collectAttemptExplicitToolAllowlistSources
took ~15 raw identity params each and silently re-resolved a second
capability profile when callers forgot to pass one — with divergent
session inputs (attempt allowlist sources resolved policy off the live
session key while tool construction used the sandbox policy key). The
profile param is now required, the fallback resolution stacks are
deleted, and the attempt threads its single resolved profile into tool
construction, the final bundled pass, and allowlist sources. Doctor and
gateway tools.effective callers resolve their config-scope profile
explicitly at the callsite. createOpenClawCodingTools keeps its optional
self-resolve as public plugin-SDK convenience.
Scope fell back to caller-supplied groupId/groupChannel/groupSpace when
chatType was unknown, while the profile publishes those same fields
trust-checked (null when dropped). A dropped caller group could classify
an unknown-audience conversation as shared for downstream audience and
credential decisions. Scope now classifies only from live chat type,
server-derived session keys (new sessionKeyNamesGroupConversation), and
trust-checked group facts; dropped groups resolve to unknown.
The azure coordinator has been timing out (10m, no lease) while delegated
Blacksmith Testbox leases in about a minute. Make blacksmith-testbox the
.crabbox.yaml default, keep --provider aws/azure for direct VM proof, and
refresh the crabbox/openclaw-testing skill text that still claimed an AWS
default. Formatting proof: sibling-checkout oxfmt --check passed (hook needs
node_modules this worktree lacks). Testbox proof: tbx_01kwp8h31773z2vphbcae1syzr
(node --version, exit 0, 1m07s) via
https://github.com/openclaw/openclaw/actions/runs/28702438266
Session ingest has normalized legacy assistant string content into
[{ type: "text" }] blocks since #98908, which updated the core
cli-runner session-history analog but missed this extension file.
The suite only runs in full local runs and the dispatch-only
plugin-prerelease lane, so push/PR CI stayed green while local
scripts/pr prepare-gates failed on any OS.
refs #99857
The chat composer's model picker and provider-usage pill become quiet borderless text controls; the reasoning flyout swaps its button list for a discrete Faster–Smarter slider (native range input) with stop dots, filled track, inherited-default marker, ghosted off-scale defaults, live value label, and one-click 'Use default' reset — single-level models render a toggle instead. The persistent sidebar VERSION pill is replaced by a slim connection-status line; the gateway version remains in Settings' Quick Settings footer. Includes review fixes from Codex autoreview (singleton level selectable) and the GitHub Codex review (off-scale default thumb), plus a 40px mobile touch target.
Closes#99837
Store the pricing fingerprint once on the cache root and stop persisting redundant filePath/sessionId metadata in each cache entry. Pricing changes still invalidate cached entries before refresh, and v5 caches rebuild through the schema version bump.
Fixes#99511
Co-authored-by: weco.ai <noreply@weco.ai>