Repair catalog 1→5, and stop titling findings with machine text - #25
Merged
Conversation
…th machine text Repair catalog goes 1 -> 5. Three toggles share one configToggleRepair contract, so preflight, verification and rollback cannot drift apart between them: auto-update-enabled-warning update.auto.enabled -> false no-hybrid-search agents.defaults.memorySearch.query.hybrid.enabled -> true no-memory-flush agents.defaults.compaction.memoryFlush.enabled -> true Each reads the key back through OpenClaw as its verification, so a `config set` that reports success but changes nothing still fails. An unreadable key is refused as config_state_unknown rather than treated as false, and rollback restores the previous value. Verified against a real OpenClaw 2026.6.11 install: both new toggles applied, verified current "true", and the findings were gone on rescan. Four of the five repairs now work without a service manager. The port conflict is still not repaired, on purpose: every version of that repair ends in killing a process ClawFix does not own, which is not a guarded repair whatever the preview says. Also stops handing raw upstream text to users as finding titles. A gateway probe that timed out produced `[critical] timeout`, and a config error produced `JSON5 parse failed: SyntaxError: JSON5: invalid character 'i' at 1:8`. Both now lead with an actionable sentence and carry the upstream text as detail. That change broke the doctor-findings dedup, which had matched on the raw message, so the same problem appeared twice — found on the real machine; the dedup now compares the detail as well as the headline.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Continues #24. Two things: more of what ClawFix detects is now repairable, and findings stop
shouting raw upstream text at the user.
Repair catalog: 1 → 5
Three more repairs, all
openclaw config setwith the read-back as verification, all sharing oneconfigToggleRepaircontract so the guard rails cannot drift apart between them.auto-update-enabled-warningupdate.auto.enabled→ falsegateway-loopback-no-authgateway.auth.mode→ tokenno-hybrid-searchagents.defaults.memorySearch.query.hybrid.enabled→ truecurrent:"true", finding goneno-memory-flushagents.defaults.compaction.memoryFlush.enabled→ truecurrent:"true", finding goneFour of the five now work without a service manager, so a containerised OpenClaw is no longer
a host where ClawFix can only look and shrug.
gateway-not-runningstill needs systemd orlaunchd — that is OpenClaw's own restart path.
Each toggle refuses an unreadable key (
config_state_unknown) rather than reading "cannot read"as "false", and rollback restores the previous value.
Port conflict: deliberately still not repaired
The obvious next repair — ClawFix already knows the squatting PID — was not added, because every
version of it ends in killing a process ClawFix does not own. That is not a guarded repair
whatever the preview says. If it is wanted later, the safe shape is to refuse unless the listener
is itself a stale OpenClaw process, and even then prefer OpenClaw's
--forcerestart over a kill.Findings stopped shouting machine text
[critical] timeoutcame fromnativeStatus.gateway.errorused directly as a title — a probethat gave up, presented as a critical OpenClaw fault named "timeout". Same pattern produced
JSON5 parse failed: SyntaxError: JSON5: invalid character 'i' at 1:8. Both now lead with asentence and keep the upstream text as detail:
Fixing the title broke the doctor-findings dedup, which had been matching on the raw message, so
the same problem briefly appeared twice — once well-titled, once raw. That was caught on the real
machine rather than in tests; the dedup now compares the detail as well as the headline.
Gates
418 node tests, 91 TUI tests, tsc clean, prove:remediation, validate:repairs, npm audit clean,
node --checksweep, 21-file package allowlist — all run locally before pushing.