* fix(release): preserve validation plan across reruns
* test(release): align rerun plan assertions
* refactor(release): use canonical plan cache action
* style(test): format release plan cache assertion
Two traps hit while reading a team-host session with images: hosted/systemd
installs keep state under the service user's home (root can carry a stray
install), and user-attached images live in message.__openclaw.media[] rather
than image content parts, so parts-only extractors find nothing.
A linked worktree whose base predates (or carries) wrapper changes relative
to origin/main previously hit a hard refusal, even though the canonical
checkout held exactly the trusted origin/main wrapper the refusal message
told the operator to go run by hand. When the canonical checkout is clean
and byte-identical to fetched refs/remotes/origin/main, exec it with a loud
stderr notice instead; advisory dev-wrapper opt-in keeps precedence, and
the refusal remains when no anchor-matching wrapper exists on disk.
Also records the squash-merged stacked-branch rebase gotcha
(git rebase --onto origin/main <landed-branch>) in the PR maintainer skill.
Three audit lanes over the remaining sections:
- Repair Doctrine/Code/Tests/Start: merge bullets that restate the same
obligation (read-broadly pair, LOC+closeout, verification pair, helper-rent
pair, narrow-API pair, over-engineering pair, test-value trio); relocate the
consolidate-duplicated-setup clause into the test-audit skill's authoring
gate; split the Codex hard gate into its own bullet.
- Architecture: cite CI enforcement instead of restating it (coercion-helper
guard owns isRecord carve-outs); defer additive-SQLite criteria to
docs/reference/database-schemas.md (verbatim coverage); merge the channel
transport-only trio, hot-path pair, and process-stable/freshness trio;
every approval gate untouched.
- Platform/Ops: delete the three deployed-agent bullets (generated-media wake,
message_tool_only, memory wiki) — deployed agents read runtime prompts and
docs, not this repo's AGENTS.md, and docs/tools/media-overview.md,
docs/gateway/config-channels.md, and the memory-wiki plugin surfaces cover
every clause (wiki-maintainer skill gains the verify-contact-data line);
move SwiftUI Observation + provider-schema bullets to Code; compress Mac
signing to its doc pointer.
- ClawSweeper: 13 wording compressions; every schema field name and gate kept.
Adversarial no-loss audit ran over the diff; its four findings (external-API
live-test weakened by a feasibility qualifier, dropped orchestration-only
clause, existing-vs-obsolete abstraction flip, oversold channel-doc pointer)
are all restored/fixed.
* docs(agents): fact-check, disambiguate, and further slim root AGENTS.md
Second cleanup pass over root AGENTS.md driven by three audit lanes
(fact-check vs repo, confusion/contradiction hunt, cut candidates):
- Fact fixes: delete the @buape/carbon pin rule (dependency no longer exists
in any manifest or pnpm-lock.yaml); fix the reply-format example to a real
file (extensions/telegram/src/bot-access.ts).
- Confusion fixes: define checkout classes once in Commands and merge the
three conflicting test/check bullets onto them; state that the mock-gateway
harness verdict satisfies channel-visible proof as an explicit exception to
mandatory UI screenshots; complete the Map scoped-guide list (src/tui, test)
and note deeper subtree guides; inline the dangling 'Start-section evidence
bar' reference; gate issue-closing and public-comment posting on explicit
authority; scope the NO_REPLY rule to ClawSweeper hook sessions; clarify
auto-provisioning vs Architecture's compat-fallback deletion rules.
- Cuts/moves: scripts/pr gotchas, throttle-lock recovery, non-main merge
procedure, media-upload mechanics, and merge-ref-race recognition into
$openclaw-pr-maintainer; QA private build flag into $openclaw-qa-testing;
release-branch CI dispatch refs and release-ci-summary limits into
$release-openclaw-ci; Vitest ENOTEMPTY race into $openclaw-testing;
WebVNC screenshot etiquette into $crabbox; delete bullets duplicated by
those skills (prompt snapshots, QA YAML) and the obsolete rebrand-doctor
bullet; compress the preflight, Codex gate, SQLite-additive, ClawSweeper,
and Execution Identity wording without dropping any invariant.
* docs(agents): exempt extended-stable canonical dispatch from the target_context_ref rule
* docs(agents): dedupe root AGENTS.md and move workflow detail into owning skills
Root AGENTS.md loads into every session; ~9.5KB of it duplicated content
already owned by skills (crabbox, openclaw-testing, release-openclaw-*,
openclaw-pr-maintainer, openclaw-changelog-update) or restated the same
invariant in multiple sections. Skills absorb the root-only operational
details first (Testbox/Crabbox mechanics, backport default target, fork-code
landing variant), then root keeps hard policy and routing only.
Also fixes skill drift found during the audit: positional testbox status id,
missing remote-unavailable local-fallback policy, delegated-flag reject list,
and aligns the early performance dispatch fail_on_regression flag with the
Full Release Validation profile gate (true stable / false beta).
* docs(agents): derive fail_on_regression from release profile in dispatch example
Measured canonical-main first-start delay: median 180s, average 209s; 10 of the last 30 runs waited more than 300s.
Approved tradeoff: up to ~+30 concurrent Blacksmith VMs during merge storms. Scope is canonical main pushes only; pull requests, manual runs, non-main refs, and forks keep their existing semantics.
Bump the canonical-main concurrency group from v7 to v8 so in-flight old-group runs cannot mix with the two-slot pipeline.
* refactor(plugin-sdk): replace API baselines with diffs
* perf(plugin-sdk): bound API diff resources
* fix(plugin-sdk): isolate API diff dependencies
* fix(release): forward Plugin SDK acknowledgement
* fix(release): enforce SDK acknowledgement on publish
* chore: preserve generated-doc ignore policy
* fix(release): freeze SDK API evidence before publish
* fix(ci): satisfy SDK evidence guards
* fix(release): bind complete SDK evidence
* fix(release): authenticate plugin SDK evidence
* fix(plugin-sdk): abort interrupted API diffs
* test(ui): freeze page clock in background-tasks rail e2e
The rail transcript is compared byte-for-byte across the detail-panel
round-trip while it renders live relative ages; on slow CI runners the
second boundary ticks between the two reads (11s -> 12s) and fails the
equality assertion. Fix the page Date with Playwright setFixedTime while
keeping timers running so the tasks.list polling assertions still hold.
Repro: a 1.5s stall between the reads fails pre-fix with the exact CI
diff and passes post-fix.
* fix(scripts): drop unused export on dependency-evidence CLI main
Knip's workflow scan re-roots script references after an actions/checkout
step that sets path:, so the new trusted-tooling checkout in
openclaw-npm-release.yml stops marking this CLI as a workflow entry and
its exported main() surfaces as an unused export in check-dependencies.
Nothing imports main; the module invokes it through its own entry guard,
so the export keyword was dead surface either way.
---------
Co-authored-by: Peter Steinberger <steipete@gmail.com>
Adds a Fetching Sessions and Transcripts section: sessions CLI first, then
the per-agent SQLite data plane (session_nodes lookup from chat URL
fragments, transcript_events shape, __openclaw sender provenance,
session_transcript_fts, media://inbound mapping) and a dependency-free
node:sqlite read-only recipe for hosts without sqlite3. Read-only-against-
live-gateway rule stated inline.
- Rename openclaw-test-audit skill to test-audit; add an authoring-gate mode
invoked whenever tests are written, not only during sweeps.
- Repair Doctrine: capture the failing repro before editing; regression tests
must fail on pre-fix code. Bug fixes default to net <=0 production LOC via
the refactor that absorbs the fix, not a bolted-on guard.
- ClawSweeper policy: production-vs-test LOC reviewMetrics entry is now
unconditional for code PRs, counted with judgment; net-positive bug-fix
deltas become risks findings with bestSolution naming the absorbing refactor.