Fix restart recovery for main sessions that use topic-suffixed transcript files by matching cleaned transcript lock paths directly while preserving the canonical session-id fallback for stale metadata.
Thanks @anyech.
Summary:
- The PR updates the Discord plugin with REST priority lanes and stale background drops, gateway send/member v ... normalization, explicit component forwarding, one-off component wait helpers, tests, and a changelog entry.
- Reproducibility: yes. The prior scheduler failure has a high-confidence source-level reproduction using one ... ne pending same-bucket request under fake timers, and the latest head adds a regression test for that path.
ClawSweeper fixups:
- Included follow-up commit: fix(discord): preserve option localizations
- Included follow-up commit: fix(discord): harden component sends
- Included follow-up commit: docs(changelog): note Discord Carbon parity hardening
- Included follow-up commit: fix(discord): harden Carbon parity
- Ran the ClawSweeper repair loop before final review.
Validation:
- ClawSweeper review passed for head 4fa634ef1a.
- Required merge gates passed before the squash merge.
Prepared head SHA: 4fa634ef1a
Review: https://github.com/openclaw/openclaw/pull/75363#issuecomment-4357438917
Co-authored-by: Peter Steinberger <steipete@gmail.com>
Co-authored-by: clawsweeper <274271284+clawsweeper[bot]@users.noreply.github.com>
Codex review on PR #75960 flagged that prepareClaudeCliSkillsPlugin and
the claude-live-session fingerprint read skillsSnapshot.resolvedSkills
directly without a disk fallback. After the persistence-layer strip,
those consumers would see an empty Skill[] on cold session resume,
breaking the documented Claude Code skills integration.
Add a hydration helper in ensureSkillSnapshot that rebuilds
resolvedSkills from a fresh workspace scan when the loaded snapshot
lacks it, while keeping the persisted prompt/skills/skillFilter/version
fields untouched so the model's prompt-cache key stays stable across
resume. The embedded runner's existing consumer-level fallback in
src/agents/pi-embedded-runner/skills-runtime.ts is now a redundant
safety net rather than the only fallback path.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Each SessionEntry carried the fully parsed Skill[] (including each
SKILL.md body) inside skillsSnapshot.resolvedSkills, multiplied across
every active session. Strip the field at the persistence chokepoint —
normalizeSessionStore in store-load.ts — so every load and every save
naturally drops it. The runtime already falls back to a workspace skill
scan when resolvedSkills is absent (see
src/agents/pi-embedded-runner/skills-runtime.ts:14), so prompts and
session resume behavior are unchanged.
Legacy sessions.json files self-heal on first load: normalize strips
the in-memory store, the next write rewrites the file in stripped form.
Test fixture (100 sessions × 50 skills × ~3KB body) goes from ~32MB to
under 2MB on disk.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>