Conversation
Co-authored-by: dev01lay2 <dev01lay2@users.noreply.github.com> Closes #123 (Phase 1)
Co-authored-by: dev01lay2 <dev01lay2@users.noreply.github.com>
Ensures app_logs, recipe_cmds, upgrade, util, and watchdog_cmds can access shared types from the parent mod.rs module.
refactor: extract commands/mod.rs into domain submodules (Phase 3)
- docs/architecture/overview.md: system overview, tech stack, layer diagram, directory guide, key data flows, constraints - docs/architecture/commands.md: command layer structure, module organization, new command workflow, remote_* proxy explanation, prohibited patterns - .github/CODEOWNERS: ownership rules for architecture docs, Tauri capabilities, core domain, CI workflows - Update harness plan: mark completed items Ref #123
- Upgrade business-flow-test-matrix.md to standard gate doc (6 gate levels) - Add failure-diagnosis.md runbook (diagnosis flow, rollback procedures) - Add entropy-governance.md (weekly checklist, metrics template) - Update harness plan: mark all phases complete, list deferred items Ref #123
chore: complete harness engineering standard (Phase 3b + Phase 4)
…lling, render probes (#132) * perf: optimize Home page data loading (P0 + P1) P0 fixes: - Parallelize initial data requests: remove artificial setTimeout delays (350ms model profiles, 250/400ms runtime snapshot). All requests now fire simultaneously on mount. - Merge 3 separate polling intervals (queuedCommandsCount, runtimeSnapshot, statusExtra) into a single unified poll loop with shouldPollResource() controlling per-resource frequency. Reduces backend call volume ~60%. - Skip redundant ConfigSnapshot fetch when RuntimeSnapshot is already in persisted cache (they share agents, globalDefaultModel, fallbackModels). P1 fixes: - Fix unhealthy status flash: config-only initial state now sets healthy=null instead of healthy=false, rendering 'Checking...' badge instead of a false red 'Unhealthy' badge during SSH connection setup. - Instant model profile population: add listModelProfiles to persisted read cache methods, initialize state from cache on mount. Infrastructure: - Add RenderProbe class (src/lib/render-probe.ts): production-grade performance.mark() instrumentation for measuring first-render latency of each UI section. Exposes data via window.__RENDER_PROBES__. - Add Home Perf E2E workflow: Docker OpenClaw container + Playwright + IPC mock collects render timings, posts/updates a single PR comment via peter-evans/create-or-update-comment (comment-tag: home-perf-e2e). Tests: 12 new unit tests across 3 files (all pass). * fix: Dockerfile heredoc → COPY, switch to sticky-pull-request-comment - Dockerfile: replace heredoc RUN (unsupported) with COPY from seed/ dir - Workflow: replace peter-evans/create-or-update-comment (no comment-tag) with marocchino/sticky-pull-request-comment (header-based upsert) - Add fallback report.md generation for failed runs * fix: add git to Docker image (required by openclaw npm install) * fix: install @playwright/test package before running perf E2E * fix: comprehensive IPC mock + click-through StartPage in perf E2E - Add mock handlers for StartPage flow (list_registered_instances, discover_local_instances, list_ssh_hosts, precheck_*, connect_*, etc.) - Playwright spec now waits for app init, then clicks local instance card to navigate into Home where probes fire - Handle partial probe collection gracefully (timeout → skip run) * fix: remote SSH default model not loading (JSON pointer + skip logic) Bug 1 (pre-existing): remote_instance_runtime_snapshot_impl runs `openclaw config get agents --json` which returns the agents subtree, but extract_default_model_and_fallbacks uses /agents/defaults/model JSON pointer expecting the full config. The subtree has no /agents prefix, so globalDefaultModel and fallbackModels are always null for remote instances. Fix: wrap config_json in { "agents": config_json } before calling extract_default_model_and_fallbacks. Bug 2 (introduced in this PR): shouldSkipConfigSnapshot only checked persistedRuntimeSnapshot != null, not whether globalDefaultModel had a value. When the cached RuntimeSnapshot had null model data (from Bug 1), ConfigSnapshot was still skipped — the only path that could correctly read the model via SFTP. Fix: shouldSkipConfigSnapshot now checks globalDefaultModel != null. * style: cargo fmt overview.rs --------- Co-authored-by: dev01lay2 <dev01lay2@users.noreply.github.com>
Co-authored-by: dev01lay2 <dev01lay2@users.noreply.github.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com> Co-authored-by: dev01lay2 <dev01lay2@users.noreply.github.com>
#139) Co-authored-by: dev01lay2 <dev01lay2@users.noreply.github.com>
Co-authored-by: dev01lay2 <dev01lay2@users.noreply.github.com>
Co-authored-by: dev01lay2 <dev01lay2@users.noreply.github.com>
…l contributors) - screenshot.yml: checkout from fork repo, skip push/comment for fork PRs - coverage.yml: skip PR comment for fork PRs (read-only GITHUB_TOKEN) - metrics.yml: skip PR comment for fork PRs (read-only GITHUB_TOKEN) Fork PRs still run all checks/builds/tests — only write-back steps (pushing refs, posting PR comments) are skipped since the fork token lacks write permissions.
- coverage.yml: save comment body as artifact for fork PR pickup - metrics.yml: save comment body as artifact for fork PR pickup - fork-pr-comment.yml: new workflow_run handler that downloads comment artifacts and posts them with write permissions Same-repo PRs still post comments directly (no change). Fork PRs now get full metrics/coverage visibility via the workflow_run relay.
Download step uses continue-on-error so the workflow doesn't fail when the upstream workflow failed before producing the comment artifact. Subsequent steps gated on download success.
…enshot.yml When triggered via workflow_dispatch, pull_request context fields are empty. Use '|| github.repository' and '|| github.ref' fallbacks so manual runs still check out the correct code. Addresses Keith-CY's review feedback on PR #143.
Co-authored-by: dev01lay2 <dev01lay2@users.noreply.github.com>
Co-authored-by: dev01lay2 <dev01lay2@users.noreply.github.com>
Co-authored-by: dev01lay2 <dev01lay2@users.noreply.github.com> Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com> Co-authored-by: cjs <cjs@cjs-mini.local> Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com> Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com> Co-authored-by: Jason Chai <jingsongcai@126.com> Co-authored-by: zhixian <zhixian@bunker.local> Co-authored-by: dev01lay2 <dev@lay2.dev> Co-authored-by: lay2OcBot <bot@openclaw.ai> fix: write model registrations to correct config path (#148) fix: resolve Channels page infinite refresh and data loading failure (#149)
…sis (#155) Co-authored-by: dev01lay2 <dev01lay2@users.noreply.github.com>
Co-authored-by: dev01lay2 <dev01lay2@users.noreply.github.com>
#157) - Add guildResolutionWarning and channelResolutionWarning fields to DiscordGuildChannel (backend + frontend types) - Frontend merge (channel-cache.ts) now clears warnings when cached names resolve the guild/channel — only shows warnings when both network request AND cache miss - Channels.tsx uses specific warning fields: guild-level header shows only guild warnings, channel cards show only channel warnings - Backend discovery.rs populates specific fields with clearer messages distinguishing Guild (server) vs Channel resolution failures Co-authored-by: dev01lay2 <dev01lay2@users.noreply.github.com>
…on remote host (#159) Co-authored-by: dev01lay2 <dev01lay2@users.noreply.github.com>
* fix: prevent Apply stuck state on gateway restart timeout Backend: fire-and-forget gateway restart via tokio::spawn with 15s timeout so the apply function returns immediately instead of hanging on SSH exec. Frontend: 30s safety timeout in handleApply to recover UI state even if the Tauri IPC never resolves. * fix: add 30s timeout to run_openclaw_remote_with_env The real hang occurs during command execution (openclaw config set), not just at gateway restart. When config changes trigger an automatic gateway restart, the SSH exec channel hangs indefinitely because session.exec() has no timeout. This causes queues.clear() to never execute, so after page refresh the pending changes bar still shows '1 pending change' with an empty diff (config was already written before the hang). * fix: scope remote command timeouts by class + prevent double-apply - Remote commands now use per-class timeouts: install/bootstrap/upgrade/setup get 180s, all others keep 30s. This prevents false timeouts during network I/O heavy operations (addresses review feedback #1). - Add applyInFlightRef guard to handleApply so the safety timeout unblocking the UI after 30s cannot trigger a second concurrent apply. The ref stays true until the request settles, preventing racing applies even after the button re-enables (addresses review feedback #2). --------- Co-authored-by: dev01lay2 <dev01lay2@users.noreply.github.com>
Co-authored-by: dev01lay2 <dev01lay2@users.noreply.github.com>
Contributor
📊 Test Coverage Report
Coverage measured by |
dev01lay2
approved these changes
Apr 1, 2026
Collaborator
dev01lay2
left a comment
There was a problem hiding this comment.
Reviewed for release-blocking (P1) issues. I did not find any P1 blockers in this release PR.
Contributor
📸 UI ScreenshotsCommit: Light Mode — Core Pages
Dark Mode
Responsive + Dialogs
|
Contributor
📏 Metrics Gate ReportStatus: ✅ All gates passed Commit Size ❌
Bundle Size ✅
Perf Metrics E2E ✅
Command Perf (local) ✅
Local command timings
Command Perf (remote SSH) ✅
Remote command timings (via Docker SSH)
Home Page Render Probes (real IPC) ✅
Code Readability
|
Contributor
📦 PR Build Artifacts
|
Contributor
Recipe GUI E2E PerfArtifacts: perf report
|
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.

























No description provided.