Show the official Pi provider mark beside Pi external-session catalog headings in the Control UI sidebar. Keep OpenCode sibling branding covered and preserve transcript navigation and paired-node view-only behavior.
Proof: focused sidebar tests, browser-driven external-catalog E2E, production Control UI build/performance checks, UI typecheck, formatting/style checks, source-blind behavior validation, and clean Codex autoreview. GitHub Actions was in a confirmed service outage; maintainer explicitly directed landing without Actions. The repository full local gate reached unrelated failures across Codex, launchd, CLI, plugin naming, QA, and tooling suites after build and check passed.
Preserve native Telegram quote attribution in agent-visible input and terminate quotes before following ordinary text.
Co-authored-by: Peter Steinberger <steipete@macos.shared>
* fix(test): close zalo agent state databases before lifecycle temp-dir removal (#119796)
* fix(test): close zalouser agent state databases before ingress temp-dir removal (#119796)
* fix(test): close zalouser fixture databases before restoring parent state env (#119796)
ClawSweeper re-review finding: the ingress fixture restored
OPENCLAW_STATE_DIR before closing cached per-agent databases, so lease
release could open a shared-state write against the parent fixture env.
Move both closes ahead of the env restore (canonical fixture order) and
add a nested-environment regression asserting the parent state dir stays
untouched.
* docs: point openclaw-refactor-docs at technical-documentation
The openclaw-docs skill was removed in 0dabb7010b,
which replaced it with technical-documentation. openclaw-refactor-docs was not
updated and still told the agent to read ../openclaw-docs/SKILL.md first, so the
read returned nothing and the refactor proceeded without the style and page-type
rules it was supposed to apply.
* docs: use a workspace-relative path for the technical-documentation read
OpenClaw resolves relative read paths from the session workspace cwd
(resolveReadPath -> resolveToCwd -> resolvePath(cwd, path) in
src/agents/sessions/tools/path-utils.ts), not from the directory holding
the skill file. ../technical-documentation/SKILL.md therefore resolved
outside the workspace and the read still failed.
Use .agents/skills/technical-documentation/SKILL.md, which is the path
that exists from the workspace root.
* docs: resolve technical-documentation support files via {baseDir}
The skill names ten support files relatively (six references/*.md and four
agents/*.md). read resolves relative paths from the session workspace cwd,
so none of them resolved: they exist only under the skill directory.
{baseDir} is the documented mechanism for exactly this and resolves against
the skill own directory, so it works regardless of where the skill is
installed. CONTRIBUTING.md is left alone: it is a workspace-root file and
already resolves.
* Revert the {baseDir} rewrite: it was cleanup, not a fix
The skills catalog prompt already instructs the model to resolve a relative
reference against the skill directory and use the resulting absolute path
(src/skills/loading/skill-contract.ts). These ten references were therefore
never broken, and rewriting them does not belong in a rename follow-up.
Restores this file to its state on main.
* Restore the sibling-relative read path
The skills catalog prompt resolves a relative reference against the skill
directory, so ../technical-documentation/SKILL.md resolves to
.agents/skills/technical-documentation/SKILL.md and was already correct.
Rewriting it workspace-relative was churn on a line whose only defect was
the retired skill name.
This leaves the PR as what it claimed to be: three references to a skill
that was renamed in 0dabb70.
Self-learning reviewer edits existing skills via targeted patches: it quotes the exact live text (or appends a section) and the service composes the full body inside the receipt-pinned read that hash-binds the proposal — untouched content survives by construction, and patches auto-apply through the scanner-gated pipeline. Full-body rewrites and oversized-skill edits stay pending for the operator. The review prompt shifts to active capture within the existing evidence gates, and shallow same-sender turns accumulate per session (provider-identity scoped, zero-iteration and duplicate-run contracts honored, aborted provenance carried, bounded state) so quick corrections get reviewed with their own transcripts. Replaces closed#119856.
Keep Telegram native and typed callback routes under their owning handlers. Expired or malformed typed buttons now clear their controls and return visible unavailable feedback while legacy raw plugin callbacks remain compatible.