Doctor: expose UI freshness health findings#84290
Conversation
|
Codex review: needs real behavior proof before merge. Reviewed May 31, 2026, 5:06 AM ET / 09:06 UTC. Summary PR surface: Source +122, Tests +125. Total +247 across 7 files. Reproducibility: yes. from source inspection: the PR maps UI freshness findings to Review metrics: 1 noteworthy metric.
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 findings
Review detailsBest possible solution: Keep the structured UI freshness visibility, but preserve default lint compatibility by making the broad check informational or opt-in unless maintainers explicitly accept the stricter warning-level lint gate and refresh the proof/body for that chosen behavior. Do we have a high-confidence way to reproduce the issue? Yes, from source inspection: the PR maps UI freshness findings to Is this the best way to solve the issue? No for merge as-is: the implementation is narrow, but the default warning severity makes an existing automation/preflight surface stricter without a settled compatibility decision. The safer path is informational/default-compatible visibility or an explicit strict mode. Full review comments:
Overall correctness: patch is incorrect AGENTS.md: found and applied where relevant. Codex review notes: model gpt-5.5, reasoning high; reviewed against 84b025eb6221. Label changesLabel changes:
Label justifications:
Evidence reviewedPR surface: Source +122, Tests +125. Total +247 across 7 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
|
Crabbox proof imagesCrabbox run The proof images are stored in a public GitHub Gist because |
|
ClawSweeper PR egg ✨ Hatched: 🌱 uncommon Frosted Crabkin Hatch commandComment Hatchability rules:
Rarity: 🌱 uncommon. What is this egg doing here?
|
f67e9cb to
da75d3d
Compare
da75d3d to
49b6ff2
Compare
49b6ff2 to
ab23b05
Compare
|
@clawsweeper re-review Rebuilt this PR as the small UI freshness doctor slice stacked on #85566; old plugin-registry/systemd/startup contents were removed. Proof is in the PR body and Real behavior proof is passing. |
|
🦞🧹 I asked ClawSweeper to review this item again. Re-review progress:
|
|
@clawsweeper re-review |
|
🦞🧹 I asked ClawSweeper to review this item again. Re-review progress:
|
|
@clawsweeper re-review Updated this PR on head Changes since the last review:
Validation rerun:
|
|
🦞🧹 I asked ClawSweeper to review this item again. Re-review progress:
|
|
@clawsweeper re-review Updated head
Validation rerun:
|
|
🦞🧹 I asked ClawSweeper to review this item again. Re-review progress:
|
|
Pre-merge verification for Behavior addressed: git diff --check origin/main...HEAD
node_modules/.bin/oxfmt --check --threads=1 src/agents/bash-tools.exec-foreground-failures.test.ts src/commands/doctor-ui.test.ts src/commands/doctor-ui.ts src/flows/doctor-core-checks.ts src/flows/doctor-health-contributions.test.ts src/flows/doctor-health-contributions.ts src/flows/doctor-health-conversion-plan.ts
node_modules/.bin/oxlint --tsconfig config/tsconfig/oxlint.core.json src/agents/bash-tools.exec-foreground-failures.test.ts src/commands/doctor-ui.test.ts src/commands/doctor-ui.ts src/flows/doctor-core-checks.ts src/flows/doctor-health-contributions.test.ts src/flows/doctor-health-contributions.ts src/flows/doctor-health-conversion-plan.ts
node scripts/run-vitest.mjs src/commands/doctor-ui.test.ts src/flows/doctor-health-contributions.test.ts src/commands/doctor-lint.test.ts src/agents/bash-tools.exec-foreground-failures.test.ts --reporter=dot --pool=forks --testTimeout=30000 --hookTimeout=30000
GOMAXPROCS=4 node scripts/run-tsgo.mjs -p tsconfig.core.json --noEmit --incremental false --pretty false
GOMAXPROCS=4 node scripts/run-tsgo.mjs -p test/tsconfig/tsconfig.core.test.json --noEmit --incremental false --pretty false
GOMAXPROCS=4 node scripts/run-tsgo.mjs -p tsconfig.extensions.json --noEmit --incremental false --pretty false
.agents/skills/autoreview/scripts/autoreview --mode branch --base origin/mainEvidence after fix: local focused Vitest passed 3 shards / 36 tests; oxfmt, oxlint, diff check, and all three tsgo lanes passed. Autoreview reported no accepted/actionable findings. |
Summary
maybeRepairUiProtocolFreshness()path used byopenclaw doctor --fix.ui/sources.This PR does not change the public health/plugin SDK contract, does not invent file diffs for generated UI assets, and does not move existing doctor repair order into the broad structured runner.
Real behavior proof
Behavior or issue addressed:
openclaw doctor --lintcan report missing/stale Control UI assets, and dry-run repair output can preview the build/rebuild process effect without mutating generated UI files or changing the existingopenclaw doctor --fixrepair ownership.Real environment tested:
WSL Ubuntu 24.04 durable OpenClaw worktree at
/root/src/openclaw-84290-refresh, head403c9bdbdbe9, source harness using the real doctor health registry and temporary ignoreddist/control-ui/index.htmlstates. Paths below are redacted.Exact steps or command run after this patch:
git diff --checknode_modules/.bin/oxfmt --check --threads=1 src/commands/doctor-ui.ts src/commands/doctor-ui.test.ts src/flows/doctor-core-checks.ts src/flows/doctor-health-contributions.ts src/flows/doctor-health-contributions.test.ts src/flows/doctor-health-conversion-plan.tsnode_modules/.bin/oxlint --tsconfig config/tsconfig/oxlint.core.json src/commands/doctor-ui.ts src/commands/doctor-ui.test.ts src/flows/doctor-core-checks.ts src/flows/doctor-health-contributions.ts src/flows/doctor-health-contributions.test.ts src/flows/doctor-health-conversion-plan.tsnode scripts/run-vitest.mjs src/commands/doctor-ui.test.ts src/flows/doctor-health-contributions.test.ts src/commands/doctor-lint.test.ts --reporter=dot --pool=forks --testTimeout=30000 --hookTimeout=30000node scripts/run-tsgo.mjs -p tsconfig.core.json --noEmit --incremental false --pretty falsenode scripts/run-tsgo.mjs -p test/tsconfig/tsconfig.core.test.json --noEmit --incremental false --pretty falsenode --import tsx /tmp/84290-real-proof.mjsbash /mnt/c/src/claws-hapi/.agents/skills/autoreview/scripts/autoreview --mode branch --base origin/mainEvidence after fix:
Focused validation passed: oxfmt reported all matched files use the correct format; oxlint reported 0 warnings and 0 errors; Vitest reported 3 focused files and 34 tests passed; core and core-test tsgo exited 0; autoreview reported
autoreview clean: no accepted/actionable findings reported.Redacted behavior proof output:
Observed result after fix:
The structured health check reports missing Control UI assets and stale assets through lint JSON. Dry-run repair returns preview process effects for build/rebuild without generated file diffs. Real doctor --fix repair remains in the existing pre-health UI freshness slot, while the broad structured runner excludes positional-owned checks. When git can prove there are no schema commits since the UI build, no stale finding is emitted; when git history is unavailable, the mtime mismatch remains reportable without commit details. Slim/source-limited installs do not get prompted to run an impossible UI rebuild.
What was not tested:
No live Control UI rebuild was run because this PR intentionally leaves build/rebuild execution on the existing doctor preflight repair path. No generated UI asset diff is emitted because generated build output is not stable or cheap to preview as a file diff.
Validation
git diff --checknode_modules/.bin/oxfmt --check --threads=1 src/commands/doctor-ui.ts src/commands/doctor-ui.test.ts src/flows/doctor-core-checks.ts src/flows/doctor-health-contributions.ts src/flows/doctor-health-contributions.test.ts src/flows/doctor-health-conversion-plan.tsnode_modules/.bin/oxlint --tsconfig config/tsconfig/oxlint.core.json src/commands/doctor-ui.ts src/commands/doctor-ui.test.ts src/flows/doctor-core-checks.ts src/flows/doctor-health-contributions.ts src/flows/doctor-health-contributions.test.ts src/flows/doctor-health-conversion-plan.tsnode scripts/run-vitest.mjs src/commands/doctor-ui.test.ts src/flows/doctor-health-contributions.test.ts src/commands/doctor-lint.test.ts --reporter=dot --pool=forks --testTimeout=30000 --hookTimeout=30000node scripts/run-tsgo.mjs -p tsconfig.core.json --noEmit --incremental false --pretty falsenode scripts/run-tsgo.mjs -p test/tsconfig/tsconfig.core.test.json --noEmit --incremental false --pretty falsenode --import tsx /tmp/84290-real-proof.mjsbash /mnt/c/src/claws-hapi/.agents/skills/autoreview/scripts/autoreview --mode branch --base origin/mainclean