fix: Mattermost fails to load after configured plugin repair#98608
Conversation
|
Codex review: needs real behavior proof before merge. Reviewed July 2, 2026, 10:17 AM ET / 14:17 UTC. Summary PR surface: Source +6, Tests +100. Total +106 across 2 files. Reproducibility: yes. source-reproducible: the linked report provides concrete 2026.6.10 to 2026.6.11 container logs, and current main source shows the same-id repaired candidate can route to channel activation while gateway startup requires explicit plugin activation. I did not rerun the Docker upgrade path. Review metrics: 1 noteworthy metric.
Root-cause cluster Members:
Proposal only: this assessment does not dispatch repair, suppress jobs, mutate sibling items, close, or merge anything. Merge readiness Overall follows the weaker of proof and patch quality, so missing proof can cap an otherwise strong patch. Rank-up moves:
Proof guidance:
Risk before merge
Maintainer options:
Next step before merge
Security Review detailsBest possible solution: Land one origin-aware config repair for the canonical Mattermost issue after redacted patched Doctor/gateway proof shows the activation bit is written and Mattermost loads on restart. Do we have a high-confidence way to reproduce the issue? Yes, source-reproducible: the linked report provides concrete 2026.6.10 to 2026.6.11 container logs, and current main source shows the same-id repaired candidate can route to channel activation while gateway startup requires explicit plugin activation. I did not rerun the Docker upgrade path. Is this the best way to solve the issue? Yes, this appears to be the narrow owner-boundary fix: keep external same-id channel plugins on the AGENTS.md: found and applied where relevant. Codex review notes: model internal, reasoning high; reviewed against 40d4e321105a. Label changesLabel justifications:
Evidence reviewedPR surface: Source +6, Tests +100. Total +106 across 2 files. View PR surface stats
What I checked:
Likely related people:
What the crustacean ranks mean
Shiny media proof means a screenshot, video, or linked artifact directly shows the changed behavior. Runtime, network, CSP, and security claims still need visible diagnostics. How this review workflow works
|
b81c2eb to
8d4b0ab
Compare
|
Merged using rebase. What changed after review:
Verification:
Landed on
Thanks @jacobtomlinson! |
Closes #98564
AI-assisted: yes, prepared with Codex.
What Problem This Solves
Fixes an issue where users upgrading a configured Mattermost deployment from OpenClaw 2026.6.10 to 2026.6.11 could run
openclaw doctor --fix, see the missing external Mattermost plugin installed, and still have the gateway start without Mattermost loaded.We proved this locally with the reported container upgrade path: start a 2026.6.10 OpenClaw container with
channels.mattermost.enabled=true, MattermostbaseUrl, and a bot token supplied through a SecretRef; verify Mattermost loads and connects; replace that container withghcr.io/openclaw/openclaw:2026.6.11while preserving the same state/config; runopenclaw doctor --fix --non-interactive; then restart the 2026.6.11 gateway. After repair, the gateway still started with only the built-in plugin set and omitted Mattermost untilplugins.entries.mattermost.enabled=truewas set manually.Why This Change Was Made
Doctor already materializes auto-enable candidates for plugins repaired from existing configuration. The missing piece was that repaired channel plugin IDs such as
mattermostwere treated like built-in channel activation because their plugin ID is also a channel ID. This change keeps repaired plugin activation on the plugin config path so doctor writesplugins.entries.<id>.enabled=true, which is the explicit activation contract non-bundled gateway channel plugins require.User Impact
Users with configured Mattermost channels can upgrade from the bundled Mattermost release to the externalized Mattermost plugin release, run doctor repair, and have the gateway load Mattermost on restart without manually setting
plugins.entries.mattermost.enabled=true.Evidence
Manual local container proof for the regression:
http server listening (8 plugins: browser, canvas, device-pair, file-transfer, mattermost, memory-core, phone-control, talk-voice; ...)[mattermost] connected as @testopenclaw doctor --fix --non-interactiveinstalled the plugin but the restarted gateway omitted Mattermost:Installed missing configured plugin "mattermost" from @openclaw/mattermost.http server listening (7 plugins: browser, canvas, device-pair, file-transfer, memory-core, phone-control, talk-voice; ...)plugins.entries.mattermost.enabled=truemanually and restarting the same 2026.6.11 container made Mattermost load and connect again, proving the repair needed to materialize that activation bit.Focused local validation for this patch:
node scripts/run-vitest.mjs src/config/plugin-auto-enable.channels.test.tsnode scripts/run-vitest.mjs src/commands/doctor/repair-sequencing.test.tsnode scripts/run-vitest.mjs src/config/plugin-auto-enable.core.test.tsgit diff --check.agents/skills/autoreview/scripts/autoreview --mode local