Files

241 KiB
Raw Permalink Blame History

Progress

Phase 156 (English-first README and official showcase prep) — Completed

  • Scope:
    • Make the repository easier for OpenClaw maintainers and international users to understand at first glance.
    • Keep Chinese users one click away instead of hiding or downgrading the Chinese landing page.
    • Prepare copy-paste-ready outreach text for X and Discord showcase posts.
  • Changed files:
    • README.md
    • README.zh-CN.md
    • README.en.md
    • docs/SHOWCASE.md
    • docs/PROGRESS.md
  • Implementation:
    • Switched the root README.md to the full English landing page so the default GitHub homepage now opens in English.
    • Restored the Chinese landing page as README.zh-CN.md and kept the language switch at the very top so Chinese readers do not get lost.
    • Kept README.en.md as a compatibility entry pointing to the new English default, so older links do not break.
    • Added docs/SHOWCASE.md with ready-to-post outreach copy for X, Discord #showcase, and Chinese audience sharing.
    • Tightened the install examples so the repo clone step now uses the actual directory name: openclaw-control-center.
  • Verification:
    • Manual README link/path review
    • Manual showcase copy review
  • Remaining gap:
    • GitHub repository topics / social preview still need to be adjusted through repo settings rather than source control.

Phase 155 (Standalone collaboration page for agent handoffs) — Completed

  • Scope:
    • Add a dedicated Collaboration / 协作 page so users can inspect agent-to-agent handoffs without overloading Staff or Tasks.
    • Keep the presentation Apple-native and readable: no extra drilldown page, no inner-card scrolling, and no raw payload dumps.
  • Changed files:
    • src/ui/server.ts
    • test/ui-render-smoke.test.ts
    • docs/PROGRESS.md
  • Implementation:
    • Added a first-class collaboration dashboard section and sidebar entry between Staff and Memory.
    • Reused existing execution-chain/session evidence to build collaboration threads instead of inventing a second runtime model.
    • Added collaboration summary metrics for active, waiting handoff, blocked, and completed-today threads.
    • Built inline-expandable collaboration thread cards with:
      • agent avatar chains
      • current-owner status
      • short human summaries
      • a compact handoff timeline
      • folded technical details for session keys
    • Added lightweight client-side filters for all / in progress / blocked / completed / multi-agent / Main-dispatched views.
    • Kept tool noise out of the default view so the page reads like collaboration history rather than backend logs.
  • Verification:
    • npm run build
    • npm test
    • npm run smoke:ui
  • Remaining gap:
    • V1 still derives collaboration threads from visible execution-chain evidence, so it is strongest for accepted/spawned parent-child flows and not yet a full free-form chat transcript browser.

Phase 154 (Workspace root overrides and USER/TASKS doc discovery) — Completed

  • Scope:
    • Fix document and memory file discovery when control-center is installed outside the OpenClaw workspace tree.
    • Expose USER.md and TASKS.md in the workspace file workbench instead of silently omitting them.
  • Changed files:
    • src/ui/server.ts
    • .env.example
    • README.md
    • README.en.md
    • INSTALL_PROMPT.md
    • INSTALL_PROMPT.en.md
    • test/ui-render-smoke.test.ts
    • docs/PROGRESS.md
  • Implementation:
    • Added explicit support for OPENCLAW_CONFIG_PATH, OPENCLAW_WORKSPACE_ROOT, and OPENCLAW_AGENT_ROOT in the UI server path resolution layer.
    • Replaced the hardcoded process.cwd()-relative workspace-root assumption with a safer resolution order:
      • explicit OPENCLAW_WORKSPACE_ROOT
      • inferred workspace root from openclaw.json
      • fallback to OPENCLAW_HOME/workspace
    • Resolved configured agent workspace paths relative to the OpenClaw config directory so relative workspace entries no longer break when control-center is installed elsewhere.
    • Added USER.md and TASKS.md to both shared and per-agent workspace document candidates, and raised their sort priority so they surface naturally in the workbench.
    • Extended install docs and copy-paste install prompts so standalone installs outside the workspace tree now point users to the correct override envs instead of leaving discovery to fail silently.
  • Verification:
    • npm run build
    • npm test
    • npm run smoke:ui
  • Remaining gap:
    • The legacy agent-local memory summary helpers still use OPENCLAW_AGENT_ROOT for a few non-workbench fallbacks. Workbench discovery is fixed, but fully decoupling every legacy fallback from repo location can be done later if standalone users report it.

Phase 153 (CLI insight cards for connection, memory, context, security, and update state) — Completed

  • Scope:
    • Add high-value OpenClaw CLI visibility surfaces without changing the existing information architecture, visual style, or operator workflows.
    • Keep the new signals human-readable, cached, and safe to render even when some CLI data sources are unavailable.
  • Changed files:
    • src/runtime/openclaw-cli-insights.ts
    • src/ui/server.ts
    • test/openclaw-cli-insights.test.ts
    • test/ui-render-smoke.test.ts
    • scripts/ui-smoke.js
    • scripts/run_verifier.sh
    • docs/PROGRESS.md
  • Implementation:
    • Added a cached OpenClaw CLI insight adapter that normalizes connection health, update status, security findings, and memory state into plain-language view models.
    • Inserted new cards into the existing Apple-style surfaces instead of creating new pages:
      • Overview: connection health
      • Usage: context pressure
      • Memory: memory state
      • Settings: connection health, security risk summary, update status
    • Kept the new modules read-only and resilient to partial installs so missing Gateway, Codex, or subscription data degrades into explicit status messaging instead of broken UI.
    • Recovered valid CLI JSON even when a command exits late, so slow OpenClaw status probes no longer turn the first page load into a 500.
    • Moved insight prewarming behind ui listening and localized the visible Chinese connection/security/update copy so the new cards stay fast enough to open and read naturally.
    • Replaced misleading 0 / - placeholders with explicit loading states when a CLI snapshot is still warming up, so first-load cards stay honest instead of looking broken.
    • Removed the detailed 接线状态 card from 总览 and kept it only in 设置, so the overview no longer repeats setup diagnostics that already have a dedicated home.
    • Rewrote the 用量数据 row inside 接线状态 from an unexplained 5/6 counter into a plain-language explanation that tells the operator what is missing, what that affects, and what to do next in Settings.
    • Moved the 上下文压力 card below 定时任务用量占比, so Usage still opens with scope, trend, subscription, and timed-job comparison before deeper session pressure detail.
    • Moved the 记忆状态 card below the editable 记忆文件工作台, so the page still starts with the actual memory files and only then shows the health/status summary.
    • Replaced the remaining verifier script absolute path with a repo-relative invocation so release/readiness checks stay green in public clones.
  • Verification:
    • npm run build
    • node --import tsx --test test/openclaw-cli-insights.test.ts
    • node --import tsx --test test/ui-render-smoke.test.ts
    • npm test
    • npm run smoke:ui
  • Remaining gap:
    • These cards currently refresh through short-lived cached CLI reads. If we later see low-end machines struggle with the added commands, the next step is stale-while-refresh at the CLI adapter layer, not UI simplification.

Phase 152 (Session-preview cold-start optimization without UI changes) — Completed

  • Scope:
    • Reduce the overview cold-start stall caused by session preview history reads without changing page structure, copy, or data semantics.
  • Changed files:
    • src/clients/openclaw-live-client.ts
    • test/openclaw-live-client-history.test.ts
    • docs/PROGRESS.md
  • Implementation:
    • Replaced the per-session external tail subprocess path with an in-process reverse file reader that scans recent JSONL history directly from the end of the file.
    • Kept the same sessionsHistory API shape and the same history normalization logic so execution chains, previews, and UI copy stay unchanged.
    • Added regression coverage for large cached history files and files without a trailing newline.
  • Verification:
    • npm run build
    • npm test
    • npm run smoke:ui
    • Local route timing after restart on UI_PORT=4522:
      • overview first open: about 5.38s -> about 0.84s
      • usage-cost first open: about 1.18s -> about 0.95s
      • projects-tasks first open: about 0.38s -> about 0.57s
      • repeated overview opens: about 0.82s, 0.62s, 1.13s, 0.25s, 0.21s

Phase 151 (Route-latency optimization without UI changes) — Completed

  • Scope:
    • Reduce slow first-navigation and post-cache-expiry stalls without changing page structure, copy, or data surfaces.
  • Changed files:
    • src/runtime/usage-cost.ts
    • src/ui/server.ts
    • docs/PROGRESS.md
  • Implementation:
    • Parallelized runtime usage scanning across agents and session files so full usage snapshots no longer block on a long sequential .jsonl walk.
    • Switched heavy UI caches to stale-while-refresh behavior for live sessions, replay preview, and usage snapshots so expired caches refresh in the background instead of freezing section switches.
    • Kept the same full usage truth path and the same rendered surfaces; the optimization is request-path and cache behavior only.
  • Verification:
    • npm run build
    • npm test
    • npm run smoke:ui
    • Local route timing after restart:
      • overview first open: about 3.67s -> about 0.75s
      • usage-cost first open: about 0.62s -> about 0.29s
      • projects-tasks after cache expiry: about 3.44s -> about 0.28s
      • after 12s idle: overview ~0.73s, usage ~0.79s, tasks ~0.28s

Phase 150 (Tracked runtime source restored to the public repo) — Completed

  • Scope:
    • Fix the public repository so fresh clones include the full src/runtime source tree.
    • Prevent future releases from passing when a core source directory exists locally but is missing from Git history.
  • Changed files:
    • .gitignore
    • src/runtime/*
    • scripts/release-audit.sh
    • test/oss-readiness.test.ts
    • docs/PROGRESS.md
  • Implementation:
    • Added the full src/runtime source tree to version control after confirming it had been left untracked.
    • Kept .gitignore anchored to the root runtime/ data directory so public source files under src/runtime/ remain trackable.
    • Hardened release-audit and oss-readiness checks to fail if src/ui/server.ts or src/runtime/usage-cost.ts are missing from Git.
  • Verification:
    • npm run build
    • npm test
    • npm run smoke:ui
    • npm run release:audit

Phase 149 (Repo completeness checks added to install docs) — Completed

  • Scope:
    • Prevent install agents from misdiagnosing the repo as incomplete when they are in the wrong directory or a bad checkout.
  • Changed files:
    • README.md
    • README.en.md
    • INSTALL_PROMPT.md
    • INSTALL_PROMPT.en.md
    • docs/PROGRESS.md
  • Implementation:
    • Replaced clone placeholders with the canonical public GitHub URL.
    • Added explicit repo-completeness checks for package.json, src/runtime, src/ui, and .env.example.
    • Added recovery steps that instruct OpenClaw to re-clone the canonical repo instead of asking for missing runtime code when the checkout is wrong or incomplete.
  • Verification:
    • npm run build
    • npm run release:audit

Phase 148 (README setup copy rewritten for users) — Completed

  • Scope:
    • Remove author-facing wording from the public setup section and make the install copy read like user-facing product documentation.
  • Changed files:
    • README.md
    • README.en.md
    • docs/PROGRESS.md
  • Implementation:
    • Replaced mega prompt with clearer install-instruction wording in Chinese.
    • Replaced This prompt should also cover... with user-facing language that states the install block already accounts for common situations.
    • Reworded the handoff line so users are told to copy the block directly into OpenClaw.
  • Verification:
    • npm run build
    • npm run release:audit

Phase 147 (Standalone install prompt files added) — Completed

  • Scope:
    • Make the public install prompt easier to copy without forcing users to extract it from the README.
    • Keep Chinese as the default public path while preserving a matching English version.
  • Changed files:
    • INSTALL_PROMPT.md
    • INSTALL_PROMPT.en.md
    • README.md
    • README.en.md
    • docs/PROGRESS.md
  • Implementation:
    • Added standalone install prompt files in Chinese and English.
    • Linked both README files to the standalone prompt files right before the embedded mega prompt.
    • Kept the same environment-coverage rules, safety defaults, and handoff format in the extracted files.
  • Verification:
    • npm run build
    • npm run release:audit

Phase 146 (README install prompt hardened for mixed OpenClaw environments) — Completed

  • Scope:
    • Make the public install mega prompt more robust across different OpenClaw environments, provider models, and machine setups.
    • Keep the control-center setup path strict about safe defaults while distinguishing hard blockers from allowed degraded installs.
  • Changed files:
    • README.md
    • README.en.md
    • docs/PROGRESS.md
  • Implementation:
    • Expanded the README setup prompt to cover provider API-key/OpenRouter/Anthropic-style environments in addition to Codex/GPT subscription-backed ones.
    • Added explicit checks for node, npm, repo write access, npm-registry reachability, multiple candidate OpenClaw homes, and multiple Gateway candidates.
    • Made the prompt forbid fabricating provider secrets and require reporting upstream OpenClaw/provider prerequisites separately from control-center install success.
    • Clarified which missing inputs are hard blockers versus degraded-but-acceptable control-center installs.
  • Verification:
    • npm run build
    • npm run release:audit

Phase 144 (README visuals sanitized for public promotion) — Completed

  • Scope:
    • Remove real operational content from the public README visuals before promotion.
    • Keep the public-facing README visually representative without exposing real runtime names, recent output, or live usage totals.
  • Changed files:
    • README.md
    • README.en.md
    • docs/assets/readme-hero-zh.svg
    • docs/assets/readme-hero-en.svg
    • docs/assets/readme-token-zh.svg
    • docs/assets/readme-token-en.svg
    • docs/assets/readme-staff-zh.svg
    • docs/assets/readme-staff-en.svg
    • docs/PROGRESS.md
  • Implementation:
    • Replaced public README screenshot assets with language-specific sanitized SVG illustrations.
    • Removed real job names, recent-output snippets, and live usage figures from the public-facing visuals.
    • Updated README copy from literal screenshot framing to sanitized preview framing.
  • Verification:
    • visual review of the README-linked assets
    • npm run release:audit

Phase 145 (README visuals restored to PNG screenshots for GitHub rendering) — Completed

  • Scope:
    • Fix blank README image rendering on GitHub after the SVG switch.
    • Restore the real PNG screenshots the project was already comfortable showing publicly.
  • Changed files:
    • README.md
    • README.en.md
    • docs/assets/overview-hero-zh.png
    • docs/assets/overview-hero-en.png
    • docs/assets/token-share-zh.png
    • docs/assets/token-share-en.png
    • docs/assets/staff-zh.png
    • docs/assets/staff-en.png
    • docs/PROGRESS.md
  • Implementation:
    • Switched both README files back from SVG illustrations to PNG screenshots.
    • Restored Chinese screenshots for the Chinese README and English screenshots for the English README.
    • Reverted the preview copy back to screenshot framing so GitHub renders the page as intended.
  • Verification:
    • README asset references reviewed
    • npm run release:audit

Phase 143 (Tasks page now defaults to schedule and cron execution) — Completed

  • Scope:
    • Stop making the tasks page look empty or contradictory when staff are active through cron/ad-hoc sessions but there are no tracked task rows.
    • Make schedule and cron execution the primary view, with tracked-task boards demoted behind a secondary foldout.
  • Changed files:
    • src/ui/server.ts
    • test/ui-render-smoke.test.ts
    • docs/PROGRESS.md
  • Implementation:
    • Reframed the tasks-page lead copy so it explains that staff activity can come from cron or ad-hoc runtime sessions before anything lands in the tracked task store.
    • Promoted Today and next schedule and Cron execution board to the always-visible primary view.
    • Moved tracked tasks, follow-up items, execution chains, project lanes, live feed, and raw tables behind a Tracked tasks and follow-up detail block.
    • Updated current-task navigation anchors so overview and readiness links land on the new tracked-task summary instead of the old lane anchor.
  • Verification:
    • npm run build
    • npm test
    • npm run smoke:ui

Phase 142 (Documents workbench now includes identity and soul markdown files) — Completed

  • Scope:
    • Fix the document workbench so Main and active agents expose their IDENTITY.md and SOUL.md files instead of hiding them behind an overly narrow core-doc whitelist.
    • Keep memory workbench behavior unchanged.
  • Changed files:
    • src/ui/server.ts
    • test/ui-render-smoke.test.ts
    • docs/PROGRESS.md
  • Implementation:
    • Added IDENTITY.md and SOUL.md to both the Main document candidates and per-agent document candidates.
    • Added BOOTSTRAP.md to Main document candidates so root-level operator identity/bootstrap docs stay visible together.
    • Updated document ordering so identity/soul/bootstrap files appear near the top of each document group instead of being buried at the bottom.
    • Extended the UI smoke source assertions to lock these document candidates into the workbench configuration.
  • Verification:
    • npm run build
    • npm test
    • npm run smoke:ui

Phase 141 (README install prompt now handles heterogeneous OpenClaw environments) — Completed

  • Scope:
    • Make the OpenClaw setup mega prompt robust for users whose machine, subscription state, agent roster, or data sources differ from the maintainer's environment.
    • Explicitly distinguish hard blockers from acceptable degraded states.
  • Changed files:
    • README.md
    • README.en.md
    • docs/PROGRESS.md
  • Implementation:
    • Expanded the Chinese and English installation prompts so they no longer assume default agent names, default paths, Codex presence, or subscription snapshots.
    • Added explicit guidance for no-subscription / no-Codex / no-billing-snapshot users and for machines that can run locally before live Gateway observability is connected.
    • Required the installing OpenClaw to classify missing pieces as either startup blockers or degradations and to report which surfaces will remain partial.
  • Verification:
    • npm run build
    • npm test
    • npm run smoke:ui
    • npm run release:audit

Phase 140 (README onboarding now defaults to OpenClaw-driven setup) — Completed

  • Scope:
    • Make the README recommend OpenClaw-assisted install as the primary onboarding path instead of an optional extra.
    • Remove maintainer-only publishing hygiene details from the main operator onboarding flow.
  • Changed files:
    • README.md
    • README.en.md
    • docs/PROGRESS.md
  • Implementation:
    • Rewrote the install section so the default recommendation is a full OpenClaw mega prompt that installs, configures, verifies, and hands off the next steps.
    • Moved manual .env editing into a fallback path instead of the default path.
    • Compressed repository publishing notes into a small maintainer-only section.
  • Verification:
    • npm run build
    • npm test
    • npm run smoke:ui

Phase 139 (README now highlights token attribution instead of the overview ring) — Completed

  • Scope:
    • Replace the less informative left-hand README screenshot with a token-attribution pie chart view.
    • Keep the staff page as the second representative screenshot and give the attribution screenshot slightly more width.
  • Changed files:
    • README.md
    • README.en.md
    • docs/assets/token-share-zh.png
    • docs/assets/token-share-en.png
    • docs/PROGRESS.md
  • Implementation:
    • Captured localized Timed-job usage share / 定时任务用量占比 screenshot assets that include the pie chart and attribution list.
    • Replaced the old overview-ring slot in both READMEs with the new token-attribution asset.
    • Rebalanced the screenshot table widths to 56% / 44% so the attribution graphic has enough room to read.
  • Verification:
    • npm run build
    • npm test
    • npm run smoke:ui

Phase 138 (README screenshot set now highlights the control ring and staff page) — Completed

  • Scope:
    • Replace the less distinctive README screenshot block with the two most representative surfaces: the control ring posture card and the staff page.
    • Keep Chinese and English screenshot assets aligned with their matching README language.
  • Changed files:
    • README.md
    • README.en.md
    • docs/assets/overview-focus-zh.png
    • docs/assets/overview-focus-en.png
    • docs/assets/staff-zh.png
    • docs/assets/staff-en.png
    • .gitignore
    • docs/PROGRESS.md
  • Implementation:
    • Generated fresh localized overview focus crops that center the circular control ring and its posture summary.
    • Generated fresh localized staff-page screenshots that show the agent roster cards and current work state.
    • Replaced the README screenshot section in both languages with the new representative pair and short operator-facing captions.
    • Ignored temporary WebKit capture artifacts used during asset generation.
  • Verification:
    • npm run build
    • npm test
    • npm run smoke:ui

Phase 137 (English overview headline now reads Overview Control Center) — Completed

  • Scope:
    • Make the English top-level overview headline feel more branded by expanding Overview to Overview Control Center.
    • Keep navigation labels unchanged and leave Chinese copy as-is.
  • Changed files:
    • src/ui/server.ts
    • test/ui-render-smoke.test.ts
    • docs/PROGRESS.md
  • Implementation:
    • Added an English-only overview title override for the main page header.
    • Kept the sidebar nav label as Overview so navigation stays short and scannable.
    • Added a regression assertion to lock the new headline behavior in place.
  • Verification:
    • npm run build
    • npm test
    • npm run smoke:ui

Phase 136 (README screenshots now match page language) — Completed

  • Scope:
    • Make the public README screenshots language-consistent so Chinese copy uses Chinese screenshots and English copy uses English screenshots.
  • Changed files:
    • README.md
    • docs/assets/usage-zh.png
    • .gitignore
    • docs/PROGRESS.md
  • Implementation:
    • Replaced the Chinese README usage screenshot reference from the English asset to a dedicated Chinese usage screenshot.
    • Kept the English README on the English screenshot asset.
    • Ignored local screenshot-candidate artifacts created while preparing the Chinese screenshot.
  • Verification:
    • npm run build
    • npm test
    • npm run smoke:ui

Phase 135 (English overview health ring no longer collides in README or UI) — Completed

  • Scope:
    • Fix the English Health score ring so the inner label does not crowd or visually collide with the score.
    • Align the public English README hero image with the corrected UI treatment.
  • Changed files:
    • src/ui/server.ts
    • test/ui-render-smoke.test.ts
    • docs/assets/overview-hero-en.png
    • .gitignore
    • docs/PROGRESS.md
  • Implementation:
    • Shortened the English ring label from Health score to Health while keeping the full meaning in aria-label.
    • Stabilized the inner ring layout with explicit two-row grid alignment, centered label text, and tighter bounds.
    • Replaced the English README hero asset with a corrected version whose health ring matches the new English UI treatment.
    • Ignored local screenshot-inspection and preview artifacts created while fixing the asset.
  • Verification:
    • npm run build
    • npm test
    • npm run smoke:ui

Phase 134 (GitHub README now defaults to Chinese, with English as an explicit switch) — Completed

  • Scope:
    • Make the public GitHub landing page default to Chinese instead of English.
    • Keep English available as a first-class alternate README, not a page anchor trick.
  • Changed files:
    • README.md
    • README.en.md
    • README.zh-CN.md
    • docs/PROGRESS.md
  • Implementation:
    • Promoted the Chinese README content into README.md so GitHub now lands on Chinese by default.
    • Created README.en.md as the standalone English landing page.
    • Updated the language links so Chinese opens the default README and English opens the dedicated English file.
  • Verification:
    • npm run release:audit
    • npm run build
    • npm test
    • npm run smoke:ui

Phase 133 (README hero screenshots tightened to remove floaty outer whitespace) — Completed

  • Scope:
    • Fix the public README hero screenshots that looked washed out and “floating” on GitHub because too much outer whitespace from the browser page was included.
    • Keep the same overview-first hero concept, but crop it tighter to the actual product surface.
  • Changed files:
    • docs/assets/overview-hero-en.png
    • docs/assets/overview-hero-zh.png
    • .gitignore
    • docs/PROGRESS.md
  • Implementation:
    • Replaced both README hero screenshots with tighter crops that remove the large outer page margins.
    • Kept the wide landscape aspect ratio while making the control-center surface fill the frame more naturally.
    • Ignored temporary *-tight.png local crop artifacts so they do not pollute repo status.
  • Verification:
    • npm run release:audit passed.
    • npm run build passed.
    • npm test passed.
    • npm run smoke:ui passed.

Phase 132 (README now explains every primary product section) — Completed

  • Scope:
    • Make the public README explain what each main control-center section actually does instead of only showing screenshots and setup steps.
    • Keep the explanation operator-facing and useful for non-technical readers in both English and Chinese.
  • Changed files:
    • README.md
    • README.zh-CN.md
    • docs/PROGRESS.md
  • Implementation:
    • Added a full section-by-section tour to the English README:
      • Overview
      • Usage
      • Staff
      • Memory
      • Documents
      • Tasks
      • Settings
    • Added the matching Chinese section guide to README.zh-CN.md.
    • Wrote each section in plain language around:
      • what it shows
      • why it matters
      • when to use it
  • Verification:
    • npm run release:audit passed.
    • npm run build passed.
    • npm test passed.
    • npm run smoke:ui passed.

Phase 131 (README hero switched from icon block to wide overview screenshot) — Completed

  • Scope:
    • Replace the weak-looking small icon block at the top of the public README with a product-led hero that immediately shows the real UI.
    • Use a wide landscape crop so the GitHub landing page feels intentional instead of vertically awkward.
  • Changed files:
    • README.md
    • README.zh-CN.md
    • docs/assets/overview-hero-en.png
    • docs/assets/overview-hero-zh.png
    • docs/PROGRESS.md
  • Implementation:
    • Captured new wide overview hero screenshots for both English and Chinese.
    • Replaced the small icon block at the top of each README with the appropriate overview hero screenshot.
    • Removed the duplicated overview image from the lower screenshot section and kept the secondary usage screenshot there.
  • Verification:
    • npm run release:audit passed.
    • npm run build passed.
    • npm test passed.
    • npm run smoke:ui passed.

Phase 130 (README language switch becomes real file-level localization) — Completed

  • Scope:
    • Replace the fake in-page README language jump with a real English/Chinese file split for GitHub readers.
    • Ensure clicking 中文 opens a fully Chinese page instead of only jumping to a later section in the same file.
  • Changed files:
    • README.md
    • README.zh-CN.md
    • docs/PROGRESS.md
  • Implementation:
    • Converted README.md into the English landing page only.
    • Added a standalone README.zh-CN.md as the Chinese landing page.
    • Replaced the old in-page anchor toggle with file-level language links:
      • English README links to README.zh-CN.md
      • Chinese README links back to README.md
    • Removed the duplicated embedded Chinese onboarding block from the English README.
  • Verification:
    • npm run release:audit passed.
    • npm run build passed.
    • npm test passed.
    • npm run smoke:ui passed.

Phase 129 (Public brand lock-in + first icon asset) — Completed

  • Scope:
    • Lock the public-facing project name to one clear, durable brand for GitHub and package metadata.
    • Add a first reusable icon asset that matches the Apple-native visual direction already used by the product UI.
  • Changed files:
    • README.md
    • package.json
    • package-lock.json
    • docs/assets/openclaw-control-center-icon.svg
    • docs/assets/openclaw-control-center-icon.png
    • docs/PROGRESS.md
  • Implementation:
    • Standardized the public project name to OpenClaw Control Center.
    • Renamed the package metadata to openclaw-control-center.
    • Added a vector icon master plus PNG preview export:
      • rounded Apple-style tile
      • control-ring motif
      • three-claw central mark
    • Updated README branding copy and top-of-file icon usage to match the new public name.
  • Verification:
    • npm run release:audit passed.
    • npm run build passed.
    • npm test passed.
    • npm run smoke:ui passed.

Phase 128 (Standalone public-release workflow and audit gate) — Completed

  • Scope:
    • Convert open-source readiness from a one-off manual check into a repeatable local release workflow.
    • Keep internal planning and automation artifacts out of the future standalone public repo by default.
  • Changed files:
    • .gitignore
    • README.md
    • package.json
    • scripts/release-audit.sh
    • docs/PUBLISHING.md
    • docs/PROGRESS.md
  • Implementation:
    • Added npm run release:audit as a public-release hygiene gate.
    • Added scripts/release-audit.sh to scan the real workspace contents for:
      • personal absolute home paths
      • hard-coded internal channel ids
      • obvious secret/token leaks
      • tracked runtime/build/internal-only paths once the directory becomes its own git repo
    • Added docs/PUBLISHING.md with the recommended best-practice flow:
      • publish only control-center/
      • keep it as a standalone repo
      • run audit/build/test/smoke before every push
    • Extended .gitignore so internal planning and one-off workflow files do not get swept into the future public repo by accident.
  • Verification:
    • npm run release:audit passed.
    • npm run build passed.
    • npm test passed.
    • npm run smoke:ui passed.

Phase 127 (README hero polish + real screenshots for public GitHub landing) — Completed

  • Scope:
    • Make the public README read like a real open-source landing page instead of jumping straight into internal-style detail.
    • Add real product screenshots so GitHub visitors can see the UI before reading setup steps.
  • Changed files:
    • README.md
    • docs/assets/overview-en.png
    • docs/assets/usage-en.png
    • docs/PROGRESS.md
  • Implementation:
    • Added a top-of-file product summary:
      • why this exists
      • what users get
      • who it is for
      • a short 5-minute start
    • Captured fresh local product screenshots for Overview and Usage.
    • Embedded those screenshots into the README using GitHub-friendly relative asset paths.
  • Verification:
    • node --import tsx --test test/oss-readiness.test.ts passed.
    • npm run build passed.
    • npm test passed.
    • npm run smoke:ui passed.

Phase 126 (Current-project agent roster becomes the only source of truth) — Completed

  • Scope:
    • Ensure agent discovery always reflects the current OpenClaw project roster instead of stale runtime folders or old session stores.
    • Stop retired agents from reappearing in staff cards, busy-agent summaries, runtime presence, or live-session merges.
  • Changed files:
    • src/runtime/current-agent-catalog.ts
    • src/runtime/agent-roster.ts
    • src/runtime/office-session-presence.ts
    • src/clients/openclaw-live-client.ts
    • src/ui/server.ts
    • test/agent-roster.test.ts
    • test/office-roster.test.ts
    • test/office-session-presence.test.ts
    • docs/PROGRESS.md
  • Implementation:
    • Added a shared current-agent catalog loader backed by openclaw.json.
    • When openclaw.json defines agents, it now becomes the authoritative current-project roster.
    • Runtime folder scans and live-session store merges now filter to configured current agents instead of reviving stale agent directories such as old codex.
    • Office/staff/execution summaries now honor the configured roster as a whitelist, so unknown runtime agents no longer reappear on the dashboard.
  • Verification:
    • npm test passed.
    • npm run build passed.
    • npm run smoke:ui passed.

Phase 125 (Bilingual README onboarding for external OpenClaw users) — Completed

  • Scope:
    • Turn the public README into a real onboarding document for new OpenClaw users instead of a short internal quick-start note.
    • Provide both English and Chinese step-by-step setup instructions, plus a reusable prompt users can hand to their own OpenClaw to prepare .env.
  • Changed files:
    • README.md
    • .env.example
    • docs/PROGRESS.md
  • Implementation:
    • Added top-level language navigation in README.md so GitHub readers can jump directly to English or Chinese onboarding.
    • Expanded setup guidance into full install/config/verify/first-use checklists for both languages.
    • Added copy-paste-ready setup prompts in both English and Chinese so users can ask their own OpenClaw to inspect paths, prepare .env, and keep safe first-run defaults.
    • Exposed optional path overrides in .env.example for non-default OPENCLAW_HOME, CODEX_HOME, and subscription snapshot locations.
  • Verification:
    • node --import tsx --test test/oss-readiness.test.ts passed.
    • npm run build passed.
    • npm test passed.

Phase 124 (Open-source doc hygiene cleanup) — Completed

  • Scope:
    • Remove internal-only documentation traces that make the public repo look tied to one operator environment.
    • Keep the engineering history useful without exposing hard-coded channel ids, localhost verification commands, or real runtime session identifiers.
  • Changed files:
    • docs/mission-control-runbook-v2.md
    • docs/PROGRESS.md
  • Implementation:
    • Replaced the hard-coded reporting channel reference in the mission runbook with a generic configured-destination instruction.
    • Sanitized older progress entries so public history now records verification outcomes in plain language instead of embedding:
      • local validation commands tied to one operator machine
      • concrete local curl pipelines
      • real runtime session identifiers
      • machine-specific live verification traces
  • Verification:
    • node --import tsx --test test/oss-readiness.test.ts passed.
    • repo leak audit no longer finds the removed channel id or sanitized localhost/session-command traces in public docs.

Phase 123 (Stale session errors no longer pollute current-state queues) — Completed

  • Scope:
    • Stop old dead sessions from surfacing as fresh SESSION_ERROR items on the Overview and in Waiting for your decision / 等待你决策.
    • Keep current-state runtime metrics automatic and meaningful without hiding real fresh failures.
  • Changed files:
    • src/runtime/commander.ts
    • src/ui/server.ts
    • test/commander-ordering.test.ts
    • test/ui-render-smoke.test.ts
    • docs/PROGRESS.md
  • Implementation:
    • Added a 6h freshness gate for runtime issue sessions in the commander exception layer.
    • Current-state blocked / waiting_approval / error sessions now count only if they still have recent runtime activity.
    • Rewired Overview Runtime issues / 运行异常 to reuse the filtered commander exceptions instead of recounting raw session states.
    • This keeps stale store-only corpses in history/export paths, but removes them from the live decision queue and top-level health signals.
  • Verification:
    • npm test passed.
    • npm run build passed.
    • npm run smoke:ui passed.

Phase 122 (Runtime issue signal keeps real session states) — Completed

  • Scope:
    • Make Runtime issues / 运行异常 use real abnormal session states from live OpenClaw data instead of flattening sessions to running / idle.
    • Keep the metric automatic and operator-meaningful with no new manual inputs.
  • Changed files:
    • src/contracts/openclaw-tools.ts
    • src/clients/openclaw-live-client.ts
    • src/mappers/openclaw-mappers.ts
    • src/ui/server.ts
    • test/openclaw-mappers.test.ts
    • test/ui-render-smoke.test.ts
    • docs/PROGRESS.md
  • Implementation:
    • Extended live session records to carry explicit upstream state text.
    • Preserved explicit states from CLI output and local session stores during session-list merge.
    • Normalized live states so the dashboard now keeps blocked, waiting_approval, and error instead of collapsing everything into running or idle.
    • Switched UI live-snapshot merging to reuse normalized session summaries.
  • Verification:
    • npm test passed.
    • npm run build passed.
    • npm run smoke:ui passed.

Phase 121 (Quota window labels stop leaking minute-level telemetry noise) — Completed

  • Scope:
    • Fix quota cards and overview subscription summaries that exposed Codex weekly windows as raw minute counts like 10081m.
    • Keep small telemetry drift invisible to non-technical users by snapping near-common quota windows back to stable labels.
  • Changed files:
    • src/runtime/usage-cost.ts
    • src/ui/server.ts
    • test/usage-cost.test.ts
    • test/ui-render-smoke.test.ts
    • docs/PROGRESS.md
  • Implementation:
    • Added common-window snapping in the Codex telemetry formatter:
      • near 300 minutes renders as 5h
      • near 10080 minutes renders as 7d
    • Hardened UI label normalization so raw minute labels such as 300m / 10081m still display as 5h / Week.
  • Verification:
    • npm test passed.
    • npm run build passed.
    • npm run smoke:ui passed.
    • live /?section=overview&lang=zh no longer shows 10081m.

Phase 120 (Execution-chain board promoted to large Apple-style cards) — Completed

  • Scope:
    • Stop the execution-chain board from cramming four narrow cards into one row.
    • Make card titles readable again by moving the badge rail out of the title's horizontal squeeze zone.
  • Changed files:
    • src/ui/server.ts
    • test/ui-render-smoke.test.ts
    • docs/PROGRESS.md
  • Implementation:
    • Rebuilt execution-chain cards as larger, roomier cards:
      • grid now uses wide-card minimums instead of narrow four-up tiles
      • narrower layouts collapse the board to one card per row
    • Reworked the card header:
      • title and context stay together as the visual headline
      • badges now sit below the title block instead of stealing headline width
    • Split dense body text into clearer bands:
      • source/latest row
      • session-flow capsule
      • summary line
    • Added plain-language cleanup for pipe-style execution summaries so strings like accepted=yes | spawned=yes no longer leak into visible cards.
  • Verification:
    • npm test passed.
    • npm run build passed.
    • npm run smoke:ui passed.
    • live /?section=projects-tasks&lang=zh verified after PM2 restart.

Phase 119 (Keep runtime-first metrics, drop frontstage certainty panels) — Completed

  • Scope:
    • Remove the extra certainty/explainer panels from Overview / Tasks / Settings so the existing dashboard structure stays intact.
    • Keep the runtime-first automatic scoring under the hood and route users back to the original high-value entry points: current tasks and follow-up items.
  • Changed files:
    • src/ui/server.ts
    • test/ui-render-smoke.test.ts
    • docs/PROGRESS.md
  • Implementation:
    • Pulled Information certainty / 信息确定性 out of the visible Overview and Settings pages.
    • Pulled the standalone Execution certainty / 执行确定性 board out of the Tasks page while keeping runtime-first task inference for summaries and task detail.
    • Restored top-level task entry actions to Open current tasks / 查看当前任务 and Open follow-up items / 查看待处理.
    • Kept automatic health signals tied to runtime evidence only:
      • review queue
      • blocked / waiting / failing sessions
      • stalled runs
      • budget risk
  • Verification:
    • npm test passed.
    • npm run build passed.
    • npm run smoke:ui passed.

Phase 118 (Automatic runtime-first overview and task certainty signals) — Completed

  • Scope:
    • Remove the most visible Overview / Tasks health signals that depended on manual task metadata such as dueAt, blocked, or owner assignment.
    • Re-anchor the top-level control posture and task certainty around runtime evidence only: review queue, session issues, stalled runs, approvals, tool activity, and execution traces.
  • Changed files:
    • src/ui/server.ts
    • test/ui-render-smoke.test.ts
    • scripts/ui-smoke.sh
    • docs/PROGRESS.md
  • Implementation:
    • Reworked the Overview decision layer to use automatic runtime signals:
      • Review queue / 审阅队列 now reads from unacked action items only
      • Runtime issues / 运行异常 now reflects blocked / waiting / error sessions plus stalled runs
      • Stalled runs / 停滞执行 now detects running sessions that have gone quiet for too long
      • Health score / 健康分 no longer deducts points from manual dueAt or task-level blocked flags
    • Reworked Execution certainty / 执行确定性 scoring:
      • removed boosts/penalties tied to owner, dueAt, task.status === blocked, and overdue
      • cards now score from linked sessions, runtime visibility, recent activity, tool evidence, execution-chain evidence, pending approvals, and session states
    • Reworked the task-hub summary strip and sidebar so they now point users to runtime evidence boards instead of manual blocked/overdue task counts.
    • Hardened ui-smoke startup:
      • switched from a blind fixed sleep to readiness polling
      • extended the default wait window so local verification no longer flakes on slower UI startup
  • Verification:
    • npm test passed.
    • npm run build passed.
    • npm run smoke:ui passed.

Phase 117 (Usage promoted to the second nav slot) — Completed

  • Scope:
    • Move Usage / 用量 directly under Overview / 总览 in the dashboard sidebar.
    • Keep English and Chinese navigation order aligned so mobile and desktop match the same information hierarchy.
  • Changed files:
    • src/ui/server.ts
    • test/ui-render-smoke.test.ts
    • docs/PROGRESS.md
  • Implementation:
    • Reordered the canonical dashboard section link list so usage-cost sits immediately after overview.
    • Added regression coverage that asserts:
      • Overview appears before Usage
      • Usage appears before Staff
      • 总览 appears before 用量
      • 用量 appears before 员工
  • Verification:
    • node --import tsx --test test/ui-render-smoke.test.ts passed.
    • npm run build passed.
    • Runtime smoke confirmed sidebar order on /?section=overview&lang=zh.

Phase 116 (Editable workbench scope stays config-truthful under config errors) — Completed

  • Scope:
    • Prevent deleted agent folders from reappearing in Documents / Memory when old workspace directories still exist.
    • Keep the workbench conservative when config parsing fails: under-show instead of showing stale agents.
  • Changed files:
    • src/ui/server.ts
    • test/ui-render-smoke.test.ts
    • docs/PROGRESS.md
  • Implementation:
    • Hardened editable-scope fallback policy:
      • valid openclaw.json keeps driving the facet list
      • invalid config now falls back to Main only instead of scanning stale workspace folders
    • Kept Main always present in editable scopes, even if config omits it
  • Verification:
    • node --import tsx --test test/ui-render-smoke.test.ts passed.
    • npm run build passed.
    • npm run smoke:ui passed.
    • live /docs?lang=en confirmed Available views: Main, Coq, Monkey, Otter, Pandas, Tiger

Phase 115 (Apple-native card elevation and background contrast tune) — Completed

  • Scope:
    • Make cards separate more clearly from the page canvas without changing information hierarchy.
    • Keep the UI aligned with the existing Apple-native visual direction instead of introducing a new style language.
  • Changed files:
    • src/ui/server.ts
    • docs/PROGRESS.md
  • Implementation:
    • Tuned the main canvas to a cooler, slightly deeper system-style gray so white cards read more clearly in the foreground.
    • Upgraded core card fills, borders, and shadows:
      • primary cards
      • KPI/hero cards
      • execution-chain cards
      • status chips
      • task/queue/lane cards
    • Kept the effect restrained:
      • no layout changes
      • no information-density changes
      • just stronger separation, depth, and polish
  • Verification:
    • npm run build passed.
    • node --import tsx --test test/ui-render-smoke.test.ts passed.
    • npm run smoke:ui passed.

Phase 114 (Execution-chain card hardening against raw payload titles) — Completed

  • Scope:
    • Prevent raw JSON-like payloads from surfacing as execution-chain card titles.
    • Keep long execution-chain text inside the card so badges and neighboring cards do not get overlapped.
  • Changed files:
    • src/ui/server.ts
    • test/ui-render-smoke.test.ts
    • docs/PROGRESS.md
  • Implementation:
    • Added defensive execution-chain title sanitization:
      • unmapped isolated runs always keep stable titles like Main · Cron 隔离执行
      • mapped cards now refuse JSON-like payload titles and convert structured payloads into short plain-language summaries instead
    • Hardened execution-chain layout:
      • card body now clips overflow safely
      • badge rail and meta rows now obey wrap/break constraints instead of leaking into neighboring cards
  • Verification:
    • node --import tsx --test test/ui-render-smoke.test.ts passed.
    • npm run build passed.
    • Runtime smoke passed:
      • /?section=projects-tasks&lang=zh no longer renders raw attemptedQueries / ok payloads inside card titles
      • execution-chain cards render stable titles and readable summaries

Phase 113 (Open-source release hygiene and portability pass) — Completed

  • Scope:
    • Make the repo safe to publish externally without shipping machine-specific paths, embedded local secrets, or local-only startup assumptions.
    • Add regression coverage for baseline OSS readiness so these leaks do not return.
  • Changed files:
    • .gitignore
    • LICENSE
    • package.json
    • .env.example
    • src/config.ts
    • ecosystem.config.cjs
    • mission.config.json
    • workflows/pandas_v3_autopilot.lobster
    • scripts/run_verifier.sh
    • scripts/ui-smoke.sh
    • scripts/mc_dod_evaluator.py
    • scripts/mc_rollback_plan.py
    • README.md
    • docs/ARCHITECTURE.md
    • docs/mission.runbook.md
    • docs/PROGRESS.md
    • test/oss-readiness.test.ts
  • Implementation:
    • Added basic release metadata:
      • .gitignore now excludes runtime/build artifacts and local env files
      • LICENSE added under MIT
      • package.json is no longer marked private
    • Removed machine-specific launch assumptions:
      • GATEWAY_URL is now environment-configurable with the local websocket kept only as the default fallback
      • PM2 sample config now uses __dirname and environment-injected LOCAL_API_TOKEN
      • mission/workflow/verifier files now use repo-relative paths instead of one developer machine path
      • UI smoke is now a first-class repo script instead of an ad hoc one-liner
    • Sanitized public-facing docs:
      • OpenClaw paths now use ~/.openclaw/... or repo-relative references
      • embedded local token values were removed
  • Verification:
    • npm run build passed.
    • node --import tsx --test test/oss-readiness.test.ts passed.
    • npm test passed.
    • npm run smoke:ui passed.

Phase 112 (Staff status freshness semantics fix) — Completed

  • Scope:
    • Fix the staff overview so Working / 工作中 reflects live execution rather than simply “has unfinished tasks”.
    • Make Working on / 正在处理什么 stop sounding live when the agent is only queued for later work.
  • Changed files:
    • src/ui/server.ts
    • test/office-roster.test.ts
    • docs/PROGRESS.md
    • README.md
  • Implementation:
    • Fixed office-card status derivation:
      • live session states still mark an agent as running
      • unfinished tasks without live sessions now keep the agent at idle
      • this removes the sticky false-positive where backlog alone made someone look active
    • Fixed staff work-label wording:
      • live execution still uses Working on / 正在处理什么
      • queued-but-not-live work now uses Next up / 下一项
    • Kept cache behavior short:
      • staff status/recent-activity cache remains only 3s
      • live sessions polling baseline remains 5s
  • Verification:
    • npm run build passed.
    • node --import tsx --test test/office-roster.test.ts passed.
    • npm test passed.
    • Added regression coverage for:
      • agents with unfinished tasks but no live sessions stay idle
      • staff overview uses 下一项 instead of live-work wording when work is queued, not currently executing

Phase 111 (Execution-chain card cleanup for non-technical readability) — Completed

  • Scope:
    • Fix the Execution chain board where raw JSON payloads were leaking directly into card titles and summaries.
    • Make execution-chain cards stay readable even when session keys or payloads are long.
  • Changed files:
    • src/ui/server.ts
    • test/ui-render-smoke.test.ts
    • docs/PROGRESS.md
    • README.md
  • Implementation:
    • Replaced unstable unmapped-card titles with stable human labels:
      • cards now show titles like Main · Cron 隔离执行
      • removed the behavior where raw response payloads became the headline
    • Added best-effort payload summarization for JSON-like snippets:
      • success/error states now render as short status summaries
      • common counters such as queries / scanned / qualified / sent are shown as readable chips in one line
      • truncated JSON-like snippets are handled too, so half-cut payloads no longer leak into the UI
    • Hardened execution-chain card layout:
      • long titles clamp instead of pushing badges off the card
      • long session keys now wrap inside the card instead of blowing up the grid
  • Verification:
    • npm run build passed.
    • node --import tsx --test test/ui-render-smoke.test.ts passed.
    • npm test passed.
    • Runtime smoke confirmed:
      • /?section=projects-tasks&lang=zh now shows Main · Cron 隔离执行
      • summaries now read like 成功 · 查询 30 · 成功 30, 失败 · 错误 locked, 成功 · 扫描 120 · 入选 2 · 发送 2
      • raw JSON keys such as attemptedQueries no longer appear in visible execution-chain card copy

Phase 110 (Docs/memory agent scope follows active config) — Completed

  • Scope:
    • Fix the Documents / Memory workbenches so they stop treating stale workspace folders as live agents.
    • Restore Main as the root OpenClaw facet and keep editable file content aligned with the latest source files.
  • Changed files:
    • src/ui/server.ts
    • test/ui-render-smoke.test.ts
    • docs/PROGRESS.md
    • README.md
  • Implementation:
    • Replaced raw workspace/agents/* facet discovery with config-first scope resolution from ~/.openclaw/openclaw.json:
      • main now renders as the root facet instead of the vague 共享
      • removed agents such as dolphin and mission-ops no longer appear just because old folders still exist on disk
      • workspace-folder scanning remains only as fallback when config is unavailable
    • Aligned both editable workbenches to the same scope source:
      • Documents now shows Main plus currently enabled agents
      • Memory now shows Main plus currently enabled agents
    • Kept editable file content live against source files:
      • file entries still read mtime and text directly from the source path
      • save actions still write directly back to the same source file
  • Verification:
    • npm run build passed.
    • node --import tsx --test test/ui-render-smoke.test.ts passed.
    • npm test passed.
    • Runtime smoke confirmed:
      • /?section=docs&lang=en now shows Available views: Main, Coq, Monkey, Otter, Pandas, Tiger
      • /?section=memory&lang=en now shows Available views: Main, Coq, Monkey, Otter, Pandas, Tiger
      • Dolphin and Mission Ops no longer appear in those facet controls
      • /api/files?scope=workspace returns live updatedAt and sourcePath values from source files

Phase 109 (Session-detail UX alignment and docs/memory language cleanup) — Completed

  • Scope:
    • Fix session-detail entry points that still dropped users onto JSON routes or forced English-only detail pages.
    • Remove the most visible mixed-language punctuation and stale Chinese-only docs index behavior from Memory / Documents.
  • Changed files:
    • src/ui/server.ts
    • test/ui-render-smoke.test.ts
    • docs/PROGRESS.md
    • README.md
  • Implementation:
    • Fixed all user-facing session-detail links to use the real drill-down page instead of /sessions/:id JSON:
      • overview tool activity
      • recent session lists
      • task evidence / execution-chain links
    • Localized /session/:id:
      • page now follows lang=en|zh
      • Chinese session detail now shows Chinese headings and returns to the localized overview
    • Localized /docs index and made it accept lang:
      • English users now see an English docs index
      • index now offers a direct path back into the Documents workbench
    • Cleaned visible English punctuation on Memory / Documents:
      • Available views, sidebar Updated, and workbench Files no longer show Chinese punctuation on English pages
  • Verification:
    • npm run build passed.
    • node --import tsx --test test/ui-render-smoke.test.ts passed.
    • npm test passed.
    • Runtime smoke confirmed:
      • /?section=overview&lang=en session links now point to /session/...?...lang=en
      • /session/agent:main:main?lang=zh renders Chinese headings and localized back link
      • /?section=memory&lang=en now shows Available views: Main, ..., Updated: ..., and Files: ...
      • /docs?lang=en now renders an English docs index with Open document workbench

Phase 108 (Search truth-source alignment and import validation clarity) — Completed

  • Scope:
    • Fix search surfaces that could under-report real matches or miss current live sessions.
    • Ensure import-live bad file paths fail as clear validation errors instead of generic internal errors.
  • Changed files:
    • src/ui/server.ts
    • src/runtime/import-live.ts
    • src/runtime/api-docs.ts
    • test/ui-render-smoke.test.ts
    • docs/PROGRESS.md
    • README.md
  • Implementation:
    • Fixed all /api/search/* endpoints to separate total match count from returned rows:
      • count now means full matches before limit
      • returned now means how many rows are in this response
    • Fixed /api/search/sessions to read the live-merged session snapshot:
      • search results now stay aligned with /sessions instead of silently missing newer runtime sessions
    • Fixed bounded dashboard-search helpers to carry the same count vs returned semantics:
      • avoids future UI regressions where “命中”/“matches” only reflected the current slice
    • Fixed import-live file path resolution errors:
      • bad fileName values now return structured validation failures instead of bubbling into 500 INTERNAL_ERROR
    • Updated generated API docs and route notes to reflect the new semantics.
  • Verification:
    • npm run build passed.
    • node --import tsx --test test/ui-render-smoke.test.ts passed.
    • npm test passed.
    • Added smoke coverage for:
      • bounded search helpers returning count=2 with returned=1
      • invalid import-live file paths producing validation issues instead of thrown errors

Phase 107 (Feature-correctness sweep for approvals, replay, and tool activity) — Completed

  • Scope:
    • Remove user-facing mismatches discovered during the feature-by-feature observability audit across approvals, replay, and overview tool activity.
    • Ensure visible counts, previews, and entry links point to real current surfaces instead of deprecated section routes.
  • Changed files:
    • src/ui/server.ts
    • test/ui-render-smoke.test.ts
    • docs/PARITY-MATRIX-v3.md
    • docs/PROGRESS.md
    • README.md
  • Implementation:
    • Fixed approval counts to use the full approval set instead of the 5-item preview slice:
      • pending approvals, pending decisions, and sidebar counts now reflect all current approvals
      • preview lists still stay short, but now say when they are only showing the latest subset
    • Fixed replay summary counts to use replay totals instead of limited preview lengths:
      • replay signal chips now report total timeline / digest / export availability
      • replay metrics keep the shown-vs-total breakdown
    • Fixed overview tool-activity detail so it actually loads session preview data:
      • the page no longer says “no tool-call sessions yet” while the same page shows live tool-call counts
    • Removed stale section-entry misinformation from current routes/docs:
      • user-facing parity routes no longer point at deprecated ?section=alerts / ?section=replay-audit
      • parity docs now point approvals to the task hub decision lane and replay to /audit
  • Verification:
    • npm run build passed.
    • node --import tsx --test test/ui-render-smoke.test.ts passed.
    • Runtime smoke confirmed:
      • Overview tool activity now shows Active tool sessions (12) instead of an empty state while tool calls are visible
      • /audit remains the working replay/audit entry
      • /cron returned ok with enabledJobs: 9, totalJobs: 9
      • /healthz returned ok with snapshot and monitor both ok

Phase 106 (Cold-path cache coalescing without splitting truth sources) — Completed

  • Scope:
    • Reduce first-navigation and section-switch latency after the Phase 105 correctness fixes, without reintroducing separate summary/full truth paths.
    • Keep Overview / Settings / Usage numerically aligned while stopping repeated scans of the same heavy runtime evidence.
  • Changed files:
    • src/ui/server.ts
    • src/runtime/usage-cost.ts
    • test/ui-render-smoke.test.ts
    • docs/PROGRESS.md
    • README.md
  • Implementation:
    • Added short-lived read-model cache reuse keyed by source file stamps:
      • avoids reloading snapshot + task/project/budget files for every page hit inside the cache window
      • primes caches when the UI server starts
    • Added in-flight coalescing for heavy dashboard work:
      • concurrent page opens now share one usage-cost build instead of racing identical recomputations
      • runtime usage / digests / Codex subscription telemetry now reuse cached source loads
    • Split live-session caching from snapshot-file invalidation:
      • dashboard pages can reuse the latest gateway session list for one polling window
      • avoids forcing a fresh live session fetch on every route render
    • Stabilized usage cache keys around real session/status content instead of generatedAt alone:
      • repeated navigations keep the same usage/quota truth when the underlying execution state has not changed
  • Verification:
    • npm run build passed.
    • node --import tsx --test test/ui-render-smoke.test.ts passed.
    • Runtime smoke confirmed:
      • back-to-back Overview dropped from about 2.56s to about 0.41s
      • back-to-back Usage dropped to about 0.41s
      • after one priming hit, concurrent Overview / Settings / Usage completed in about 1.13s batch time with aligned values

Phase 105 (Observability correctness alignment across usage, live execution, and task evidence) — Completed

  • Scope:
    • Fix operator-facing inconsistencies where the same control-center showed conflicting numbers or conflicting certainty across pages.
    • Prioritize correctness over the previous lightweight summary shortcut for usage and quota signals.
  • Changed files:
    • src/ui/server.ts
    • test/ui-render-smoke.test.ts
    • docs/PROGRESS.md
    • README.md
  • Implementation:
    • Unified usage / quota source across dashboard pages:
      • Overview / Tasks / Settings / Usage now all read the full usage snapshot instead of mixing summary and full paths
      • removes page-to-page disagreement on today usage and Codex quota windows
    • Unified live execution counts:
      • aggregate active sessions cards now use the same runtime presence signal as the certainty surface
      • live tool session backfill now merges with existing snapshot sessions instead of only running when the snapshot is empty
    • Removed task evidence truncation from certainty paths:
      • task certainty now loads linked session evidence for the current task set instead of trusting only the first page of recent sessions
      • task detail no longer cuts linked evidence to the first 6 sessions
    • Fixed detail-page language carry-through:
      • task detail / cron detail routes now respect lang
      • dashboard links carry the current language into detail pages
  • Verification:
    • npm run build passed.
    • node --import tsx --test test/ui-render-smoke.test.ts passed.
    • npm test passed.
    • Runtime smoke confirmed:
      • Overview and Usage now show the same today usage and the same quota windows
      • Overview active-session signals now agree with the certainty card
      • English task detail page stays in English and returns to the English task board

Phase 104 (Dashboard cold-start trimmed with summary usage mode) — Completed

  • Scope:
    • Reduce Overview / Tasks / Settings cold-start latency without removing the plain-language certainty layer added for non-technical operators.
    • Keep the full Usage page intact while stopping other sections from scanning full runtime usage logs on first paint.
  • Changed files:
    • src/runtime/usage-cost.ts
    • src/ui/server.ts
    • test/ui-render-smoke.test.ts
    • docs/PROGRESS.md
  • Implementation:
    • Added summary / full usage-cost build modes.
    • Dashboard now loads:
      • summary usage snapshot for Overview / Tasks / Team / Settings / Memory / Docs
      • full usage snapshot only when the operator actually opens the Usage section
    • Split render-time usage caches by mode so a lightweight page render no longer warms the heavy path by accident.
    • Kept operator-facing signals available on summary mode:
      • period totals
      • budget forecast
      • subscription room
      • connection certainty / blind-spot hints
    • Softened execution fallback wording from fixed 30d language to broader Recent usage so the non-Usage pages stay accurate when they rely on lightweight data.
  • Verification:
    • npm run build passed.
    • node --import tsx --test test/ui-render-smoke.test.ts passed.

Phase 68 (Plain-language certainty layer for non-technical operators) — Completed

  • Scope:
    • Add a plain-language certainty layer so non-technical users can judge which dashboard information is trustworthy now and where blind spots still exist.
    • Make task execution certainty explicit, so a task is no longer just “listed on a board” without evidence of real OpenClaw execution.
  • Changed files:
    • src/ui/server.ts
    • test/ui-render-smoke.test.ts
    • docs/PROGRESS.md
  • Implementation:
    • Added Information certainty surface to Overview and Settings:
      • freshness / staff ownership / live execution / usage-cost / subscription / replay-history are translated into user-facing confidence signals
      • highlights both what you can trust now and what may still be incomplete
    • Added Execution certainty board to Tasks:
      • scores in-flight tasks by linked sessions, recent activity, live execution, approvals, overdue state, and execution-chain evidence
      • explains in plain language whether each task is truly being carried or still lacks proof
    • Upgraded task detail page into an evidence page:
      • shows certainty judgement
      • shows linked session evidence with recent activity summaries
    • Wired office/staff visibility to best-effort runtime live-session presence instead of leaving that signal unused.
    • Added short render-time cache for the runtime live-session presence probe so the new certainty layer does not add repeated page-load drag.
  • Verification:
    • npm run build passed.
    • node --import tsx --test test/ui-render-smoke.test.ts passed.

Phase 67 (Memory facet filtering hard fix + show all agent selectors) — Completed

  • Scope:
    • Fix left memory file list not actually narrowing when switching agent tabs.
    • Show full agent selector set in memory tabs, even when some agents currently have zero memory files.
  • Changed files:
    • src/ui/server.ts
    • test/ui-render-smoke.test.ts
    • docs/PROGRESS.md
  • Implementation:
    • Added dedicated memory facet source listMemoryFacetOptions():
      • always includes Main
      • includes all agent directories under workspace agents/
    • Wired memory workbench to use explicit facet options:
      • facetOptions: memoryFacetOptions
    • Fixed filtering render bug:
      • added .file-nav-item[hidden] { display: none !important; }
      • also applies inline item.style.display toggle for deterministic hide/show
    • Kept memory scope strict:
      • only MEMORY.md + memory/ paths
  • Verification:
    • npm run build passed.
    • node --import tsx --test test/ui-render-smoke.test.ts passed.

Phase 66 (Quota reset time localized to browser timezone) — Completed

  • Scope:
    • Replace UTC reset text in the 5h / Week quota cards with browser-local short time/date formatting.
    • Match the Codex official widget more closely for reset display.
  • Changed files:
    • src/ui/server.ts
    • test/ui-render-smoke.test.ts
    • docs/PROGRESS.md
  • Implementation:
    • Replaced server-rendered UTC reset text with client-local reset placeholders.
    • Added data-quota-reset-at + data-quota-window markers to quota rows.
    • Added client-side quota reset formatter:
      • 5h => local short time
      • Week => local short month/day
      • cross-year fallback => month/day/year
  • Verification:
    • npm run build passed.
    • node --import tsx --test test/ui-render-smoke.test.ts passed.

Phase 65 (Codex rate-limit source alignment) — Completed

  • Scope:
    • Fix the 5h / Week quota mismatch against the official Codex quota widget.
    • Prefer the canonical Codex quota window over model-specific quota windows emitted in the same session log.
  • Changed files:
    • src/runtime/usage-cost.ts
    • test/usage-cost.test.ts
    • docs/PROGRESS.md
  • Implementation:
    • Extended Codex rate-limit snapshots with limitId / limitName.
    • Added priority-based snapshot selection:
      • prefer limit_id = codex
      • fall back to model-specific codex_* only when canonical Codex is absent
    • Applied the same priority logic both:
      • within a single session log
      • across recent session logs
    • Added regression tests covering:
      • canonical codex vs codex_bengalfox conflict
      • model-specific fallback when canonical Codex is absent
  • Verification:
    • npm run build passed.
    • node --import tsx --test test/usage-cost.test.ts passed.

Phase 64 (Memory page: Main memory restored + only memory files) — Completed

  • Scope:
    • Restore explicit Main memory visibility.
    • Stop showing non-memory profile files inside the memory editor.
  • Changed files:
    • src/ui/server.ts
    • test/ui-render-smoke.test.ts
    • docs/PROGRESS.md
  • Implementation:
    • Remapped root workspace memory to Main instead of the vague 共享.
    • Memory page now only includes true memory sources:
      • root MEMORY.md
      • root memory/
      • each agent MEMORY.md
      • each agent memory/
    • Removed non-memory profile files from memory scope:
      • USER.md
      • SOUL.md
      • IDENTITY.md
    • Kept direct source-file writeback behavior unchanged.
  • Verification:
    • npm run build passed.
    • node --import tsx --test test/ui-render-smoke.test.ts passed.
    • runtime smoke confirms Main、Coq、Dolphin、Monkey、Otter、Pandas、Tiger.

Phase 63 (Docs page renamed + curated by shared/agent) — Completed

  • Scope:
    • Rename the workspace page to a user-facing documents page.
    • Replace all-workspace / session-oriented wording with shared-doc + per-agent curated Markdown editing.
    • Keep memory page agent-switching behavior unchanged.
  • Changed files:
    • src/ui/server.ts
    • test/ui-render-smoke.test.ts
    • docs/PROGRESS.md
  • Implementation:
    • Renamed navigation and page copy from Workspace/工作区 to Documents/文档.
    • Kept the same secure file API scope, but the UI now presents it as a documents workbench.
    • Documents page now shows:
      • shared document count
      • discovered agent count
      • facet switching by 共享 / agent
    • Curated document source stays limited to:
      • shared Markdown files
      • each agent's most useful core Markdown files
    • Removed session-history style doc presentation from the documents page:
      • deleted the 聊天输出结构化入库 panel from the visible docs UI
      • replaced it with explicit 共享 / 智能体 archive wording
  • Verification:
    • npm run build passed.
    • node --import tsx --test test/ui-render-smoke.test.ts passed.

Phase 62 (Remove office live scene by request) — Completed

  • Scope:
    • Remove the office live 2D scene from the team view.
    • Keep real agent cards and local pixel avatar animation.
  • Changed files:
    • src/ui/server.ts
    • test/ui-render-smoke.test.ts
    • docs/PROGRESS.md
  • Implementation:
    • Removed the 办公室 2D 实况 section from the merged team/agent page.
    • Deleted the unused office-scene renderer, CSS, and scene movement script.
    • Kept the card-based agent area and client-only avatar idle animation.
  • Verification:
    • npm run build passed.
    • node --import tsx --test test/ui-render-smoke.test.ts passed.

Phase 61 (Navigation speed hardening: remove artificial delay + short heavy-cache) — Completed

  • Scope:
    • Remove intentional page-leave delay so navigation is instant.
    • Add short cache for expensive render-time computations to reduce section switch latency.
    • Keep all animations while avoiding UX slowdown.
  • Changed files:
    • src/ui/server.ts
    • test/ui-render-smoke.test.ts
    • docs/PROGRESS.md
  • Implementation:
    • Removed delayed redirect in client nav script:
      • deleted setTimeout(..., 120) page-leave handoff
      • now direct window.location.href = href
    • Added short-lived server render caches (3s) for:
      • session preview (listSessionConversations)
      • usage snapshot (buildUsageCostSnapshot)
    • Added smoke assertion to guard against regressions:
      • no artificial leave delay in source script.
  • Verification:
    • npm run build passed.
    • node --import tsx --test test/ui-render-smoke.test.ts passed.
    • runtime latency check after restart:
      • overview: cold 0.633s, warm 0.123s
      • team: cold 0.125s, warm 0.120s
      • usage: cold 0.125s, warm 0.125s

Phase 60 (Docs structured ingest + Office 2D walking scene) — Completed

  • Scope:
    • Close remaining gap: docs hub was file aggregation only, missing auto structured ingest from chat outputs.
    • Upgrade office page from static cards to a true 2D “walking + watercooler” scene.
    • Keep memory SQLite timeline out-of-scope per latest requirement.
  • Changed files:
    • src/runtime/doc-hub.ts (new)
    • src/ui/server.ts
    • test/doc-hub.test.ts (new)
    • test/ui-render-smoke.test.ts
    • docs/PROGRESS.md
  • Implementation:
    • Added structured chat doc pipeline:
      • scans recent sessions and history messages
      • detects document-like assistant outputs (plan/report/spec/runbook-style content)
      • generates normalized doc entries (title/category/excerpt/session/agent/timestamp)
      • persists merged index to runtime/doc-hub-chat.json
    • Docs page now merges two sources:
      • file aggregation (docs, runtime/digests, runtime/evidence)
      • chat structured ingest (runtime/doc-hub-chat.json)
    • Docs UI now includes:
      • source labels (聊天入库 / 文件文档)
      • source filter (全部来源/聊天入库/文件文档)
      • session deep-link for chat-ingested docs
    • Office page now includes full 2D scene:
      • zone layout (执行区/审批区/支援区/待命区/交流区)
      • agents move continuously between zones based on runtime status
      • periodic “串门” behavior to交流区 (watercooler)
      • scene uses high-quality pixel avatars rendered on canvas
  • Verification:
    • npm run build passed.
    • node --import tsx --test test/doc-hub.test.ts passed.
    • node --import tsx --test test/ui-render-smoke.test.ts passed.
    • npm test has one pre-existing unrelated failure:
      • test/triplet-control.test.ts -> dod check emits machine-readable pass/fail status (NOT_DONE).

Phase 59 (DoD copy/readability + always-visible four-signal quick rows) — Completed

  • Scope:
    • Tighten non-technical wording in global-visibility EN copy.
    • Keep Chinese heartbeat run text fully Chinese and easier to read.
    • Keep cron/heartbeat/current tasks/tool calls visible in the right sidebar on every section.
  • Changed files:
    • src/ui/server.ts
    • test/ui-render-smoke.test.ts
    • runtime/evidence/product-dod.json
    • docs/PROGRESS.md
  • Implementation:
    • Simplified EN global-visibility schedule wording:
      • Schedule checks (cron) -> Timed jobs
      • See schedule checks -> See timed jobs
    • Simplified related EN action/result lines:
      • Schedule checks are on/off -> Timed jobs are on/off
      • Active schedule checks -> Active timed jobs
    • Added heartbeat mode label mapping for dashboard text:
      • dry_run -> 演练
      • live -> 执行
    • Added sidebar quick rows (always rendered) for four DoD signals:
      • timed jobs / heartbeat / current tasks / tool calls
      • each row links to the corresponding detail anchor.
  • Verification:
    • npm run build passed.
    • node --import tsx --test test/ui-render-smoke.test.ts passed.
    • npm test passed.
    • npm run dod:check passed (DONE).

Phase 58 (Token type share + Cron-internal share) — Completed

  • Scope:
    • Add token share by conversation type for non-technical management view.
    • Add cron-internal token share by concrete cron job.
  • Changed files:
    • src/runtime/usage-cost.ts
    • src/ui/server.ts
    • test/usage-cost.test.ts
    • test/ui-render-smoke.test.ts
    • docs/PROGRESS.md
  • Implementation:
    • Runtime usage now reads totalTokens from OpenClaw sessions.json and de-duplicates by sessionId to avoid duplicate aliases.
    • Added usage breakdown dimensions:
      • breakdown.bySessionType (Cron, Discord, Telegram, Main/内部会话)
      • breakdown.byCronJob (cron job-level token totals, mapped by ~/.openclaw/cron/jobs.json)
      • breakdown.byCronAgent (cron 内按 agent 的 token totals)
    • UI now renders two new sections in Overview and Usage pages:
      • Token 类型占比(全量会话)
      • Cron 任务内 Token 占比
      • Cron 内各 Agent 占比
    • Each section shows tokens, percent share, session count, and data status.
  • Verification:
    • npm run build passed.
    • npm test passed (42/42).
    • /api/usage-cost returns bySessionType and byCronJob.
    • Usage page renders both share tables with percentages.

Phase 57 (DoD gap polish: clearer strip visibility + simpler heartbeat wording) — Completed

  • Scope:
    • Keep global visibility explicit for cron/heartbeat/current tasks/tool calls on all sections.
    • Keep zh copy fully Chinese while reducing technical wording in EN/ZH heartbeat/schedule guidance.
    • Make compact strip status more informative without changing data paths.
  • Changed files:
    • src/ui/server.ts
    • test/ui-render-smoke.test.ts
    • docs/PROGRESS.md
  • Implementation:
    • Upgraded compact global-visibility strip chips to show per-signal current-action text (not just count + status badge).
    • Simplified heartbeat purpose/action wording for middle-school readability:
      • EN: Check assigned tasks and start the picked ones.
      • ZH: 检查已分配任务,并启动挑中的任务。
      • EN: Heartbeat is on: ...
      • ZH: 任务心跳已开启:...
    • Simplified schedule/heartbeat follow-up guidance in both runtime model and smoke model copy.
  • Verification:
    • node --import tsx --test test/ui-render-smoke.test.ts passed.
    • npm run build passed.
    • npm test passed (44/44).
    • npm run dev smoke passed (single monitor cycle in readonly mode).
    • npm run dod:check remains NOT_DONE only for existing non-target declaration:
      • product-real-subscription-connected=false.

Phase 56 (DoD copy gap polish: explicit current tasks + simpler heartbeat wording) — Completed

  • Scope:
    • Keep full Chinese coverage in global-visibility copy.
    • Make EN global signal wording explicitly current tasks.
    • Reduce technical wording in heartbeat result text for middle-school readability.
  • Changed files:
    • src/ui/server.ts
    • test/ui-render-smoke.test.ts
    • docs/PROGRESS.md
  • Implementation:
    • Updated EN global-visibility strip/card label:
      • Tasks in progress: -> Current tasks:
      • See tasks in progress -> See current tasks
    • Updated EN global-visibility current-task row labels:
      • Tasks in progress -> Current tasks
    • Simplified heartbeat latest-result copy:
      • EN: Last heartbeat: selected N tasks, started M.
      • ZH: 最近心跳:挑出 N 个任务,启动 M 个。
  • Verification:
    • npm run build passed.
    • node --import tsx --test test/ui-render-smoke.test.ts passed.
    • npm test passed.

Phase 55 (Cron/Heartbeat real job visibility + purpose catalog) — Completed

  • Scope:
    • Fix dashboard blind spot where cron/heartbeat showed generic placeholders.
    • Expose real job name, owner, purpose, and schedule for non-technical users.
  • Changed files:
    • src/ui/server.ts
    • docs/PROGRESS.md
  • Implementation:
    • Cron catalog now loads from OpenClaw real job registry with fallback path detection:
      • ~/.openclaw/cron/jobs.json
      • workspace-derived ../../../../cron/jobs.json
    • Overview 定时任务监控 upgraded to 7-column table:
      • Job ID / 任务名 / 负责人 / 任务目的 / 状态 / 下次运行 / 距离执行
    • Added Agent 执行任务目录 section:
      • shows source (OpenClaw or Runtime) + job purpose + schedule + status.
    • Heartbeat card now shows latest run details:
      • run time, mode, selected count, executed count, latest picked tasks summary.
    • Global visibility now reflects real cron catalog counts and top active job names/purpose.
  • Verification:
    • npm run build passed.
    • node --import tsx --test test/ui-render-smoke.test.ts passed (9/9).
    • pm2 restart pandas-control-center completed.
    • runtime smoke:
      • overview page renders real job names from the runtime catalog.
      • cron catalog source shown as ~/.openclaw/cron/jobs.json.
      • heartbeat shows latest execution metadata.

Phase 54 (Provider subscription connected from Codex CLI telemetry) — Completed

  • Scope:
    • Replace local estimated subscription signal with real provider telemetry from Codex CLI.
    • Keep UI readable for non-technical users while preserving data truthfulness.
  • Changed files:
    • src/runtime/usage-cost.ts
    • src/ui/server.ts
    • docs/PROGRESS.md
  • Implementation:
    • Added Codex rate-limit adapter in usage runtime:
      • scans recent ~/.codex/sessions/**/*.jsonl
      • extracts latest event_msg -> token_count -> rate_limits
      • maps to subscription contract as connected provider signal:
        • status=connected
        • planLabel=Codex 实时额度(主窗口)
        • consumed/remaining/limit from % window (used, 100-used, 100)
        • reasonCode=provider_connected
    • Subscription connect hint now also points to Codex telemetry connector path.
    • UI formatting now renders numeric subscription fields as % when unit is percent.
  • Verification:
    • npm run build passed.
    • npm test passed (42/42).
    • live API check:
      • /api/usage-cost now reports subscription.status=connected, connectors.subscriptionUsage=connected.
      • source path resolves to latest Codex session telemetry file.

Phase 53 (DoD copy polish: simpler EN + stronger visibility gate) — Completed

  • Scope:
    • Keep zh copy fully Chinese and middle-school readable.
    • Simplify EN global visibility wording while keeping cron/heartbeat/current tasks/tool calls explicit.
    • Harden DoD source audit so four-signal visibility is required across all dashboard sections.
  • Changed files:
    • src/ui/server.ts
    • scripts/dod-check.ts
    • test/ui-render-smoke.test.ts
    • docs/PROGRESS.md
  • Implementation:
    • Simplified EN Global Visibility copy:
      • summary: One place to see cron, heartbeat, current tasks, and tool calls.
      • strip labels: Cron: / Heartbeat:
      • cron row copy: Cron is running., Cron on: N., Keep cron on.
    • Kept zh global visibility wording fully Chinese and unchanged for coverage safety.
    • Added DoD render-token checks to enforce cross-section visibility mount:
      • renderGlobalVisibilityStripCard(...)
      • section switch block (overview card vs non-overview strip)
      • dashboard content mount includes globalVisibilityBlock.
  • Verification:
    • npm run build passed.
    • npm test passed (42/42).
    • node --import tsx --test test/ui-render-smoke.test.ts passed.
    • npm run health:snapshot passed (HEALTH_SNAPSHOT_WRITTEN).
    • npm run dod:check remains NOT_DONE only for existing non-target declaration:
      • product-real-subscription-connected=false.

Phase 52 (DoD copy tighten: explicit current-task global signal) — Completed

  • Scope:
    • Keep full Chinese coverage and plain-language readability.
    • Make the EN global visibility label explicitly match current tasks.
    • Preserve always-visible four-signal strip/card behavior with minimal risk.
  • Changed files:
    • src/ui/server.ts
    • test/ui-render-smoke.test.ts
    • docs/PROGRESS.md
  • Implementation:
    • Updated EN global visibility chip label from Tasks in progress: to Current tasks:.
    • Simplified EN empty-state wording to plural form:
      • No schedule checks, heartbeat, current task, or tool call yet.
      • -> No schedule checks, heartbeat, current tasks, or tool calls yet.
  • Verification:
    • npm run build passed.
    • npm test passed (42/42).
    • npm run dod:check remains NOT_DONE only for existing non-target declaration:
      • product-real-subscription-connected=false.

Phase 51 (DoD gap hardening: cross-section global visibility strip) — Completed

  • Scope:
    • Keep product DoD copy constraints intact (full Chinese coverage, non-technical wording, middle-school readability).
    • Restore always-visible global signals for cron / heartbeat / current tasks / tool calls across all dashboard sections.
    • Make minimal safe UI-only changes.
  • Changed files:
    • src/ui/server.ts
    • test/ui-render-smoke.test.ts
    • docs/PROGRESS.md
  • Implementation:
    • Dashboard composition now mounts a section-aware visibility block:
      • overview uses full renderGlobalVisibilityCard(...)
      • non-overview sections use compact renderGlobalVisibilityStripCard(...)
    • This keeps four-key-signal status visible globally without re-rendering the full table on every page.
    • Updated smoke assertions to enforce the new strip/card switch in source.
  • Verification:
    • node --import tsx --test test/ui-render-smoke.test.ts test/ui-language-preferences.test.ts passed (10/10).
    • npm run build passed.
    • npm test passed (42/42).
    • npm run dod:check still returns NOT_DONE only for existing non-target declaration:
      • product-real-subscription-connected=false.
    • Runtime HTTP smoke could not be executed in this sandbox:
      • server bind blocked with listen EPERM: operation not permitted 127.0.0.1:<port>.

Phase 50 (Billing truthfulness + token attribution visibility + heartbeat API wiring) — Completed

  • Scope:
    • Fix misleading subscription balance estimation when source is local bootstrap/backfill.
    • Ensure non-technical users can directly see agent/task token attribution from overview.
    • Restore heartbeat API route wiring to match docs/contracts.
    • Remove repeated global-visibility block from non-overview sections to reduce noise.
  • Changed files:
    • src/runtime/usage-cost.ts
    • src/ui/server.ts
    • test/ui-render-smoke.test.ts
    • docs/PROGRESS.md
  • Implementation:
    • Subscription parse hardening:
      • when snapshot source is synthetic (runtime_backfill/estimated/bootstrap), ignore raw consumed/remaining/limit as provider truth.
      • strict mode now backfills only consumed from runtime usage events and keeps remaining/limit unavailable until provider data is connected.
    • Added heartbeat API execution/read routes in UI server:
      • GET /api/tasks/heartbeat (supports limit)
      • POST /api/tasks/heartbeat (supports dryRun, maxTasksPerRun, guarded by local token auth)
    • Overview visibility:
      • added Token 消耗归因(Agent / 任务) card with top breakdown tables.
      • added Top 任务 Token alongside Top Agent Token.
    • Subscription UX cleanup:
      • in not-connected estimate state, hide unavailable estimate fields instead of rendering noisy “不可用” rows.
      • sidebar summary now only renders numeric subscription fields that are actually available.
    • Dashboard composition:
      • keep full 全局总览 only on overview; non-overview sections no longer repeat it.
  • Verification:
    • npm run build passed.
    • npm test passed (42/42).
    • Live endpoint checks:
      • /api/usage-cost shows subscription.status=not_connected, reasonCode=runtime_backfill_with_provider_partial, with remaining/limit unavailable.
      • /api/tasks/heartbeat?limit=3 returns recent runs successfully.
      • /cron reports runtime jobs and heartbeat visibility.

Phase 49 (DoD gap closure: global visibility on all sections) — Completed

  • Scope:
    • Keep full Chinese coverage and plain, non-technical middle-school-readable copy.
    • Ensure cron/heartbeat/current tasks/tool calls stay visible across all dashboard sections, not only overview.
    • Make minimal, safe UI-only changes.
  • Changed files:
    • src/ui/server.ts
    • test/ui-render-smoke.test.ts
    • docs/PROGRESS.md
  • Implementation:
    • Added renderGlobalVisibilityStripCard(...) for a lightweight global-visibility panel (title + summary + compact strip).
    • Kept the full global-visibility table card on overview.
    • Mounted visibility block globally with section-aware switch:
      • overview => full card
      • non-overview sections => strip card (id="global-visibility-strip").
    • Updated smoke coverage to assert the new global mount behavior and strip-card render token.
  • Verification:
    • npm run build passed.
    • npm test passed (42/42).
    • npm run health:snapshot passed (HEALTH_SNAPSHOT_WRITTEN).
    • npm run dod:check remains NOT_DONE only for existing non-target declaration:
      • product-real-subscription-connected=false.
    • Requested product checks are passing in runtime/evidence/dod-status.json:
      • product-full-chinese
      • product-non-technical-copy
      • product-middle-school-readable
      • product-global-visibility

Phase 48 (DoD gap closure: Chinese duration copy + explicit current-task monitor) — Completed

  • Scope:
    • Tighten full Chinese coverage in overview signal cards.
    • Keep wording non-technical and middle-school readable.
    • Strengthen explicit visibility of cron/heartbeat/current tasks/tool calls.
  • Changed files:
    • src/ui/server.ts
    • test/ui-render-smoke.test.ts
    • docs/PROGRESS.md
  • Implementation:
    • Added Overview card 当前任务监控 (id="current-task-health") with:
      • in-progress count
      • blocked count
      • simple next-step summary
      • direct link to #task-lane
    • Localized cron/heartbeat countdown units for Chinese dashboard copy:
      • now / 3m 12s / 1h 5m -> 现在 / 3分12秒 / 1小时5分
    • Updated smoke assertions to lock in:
      • current-task monitor card presence
      • localized duration rendering call path (formatSeconds(..., options.language)).
  • Verification:
    • npm run build passed.
    • npm test passed (41/41).
    • npm run dod:check remains NOT_DONE only due existing non-target declaration:
      • product-real-subscription-connected=false.
    • Requested DoD checks remain passing:
      • product-full-chinese
      • product-non-technical-copy
      • product-middle-school-readable
      • product-global-visibility

Phase 47 (DoD copy hardening: plain-language schedule checks) — Completed

  • Scope:
    • Keep full Chinese coverage for the four global-visibility signals.
    • Reduce technical wording in English copy for non-technical, middle-school readability.
    • Preserve global visibility for cron/heartbeat/current tasks/tool calls across sections.
  • Changed files:
    • src/ui/server.ts
    • test/ui-render-smoke.test.ts
    • docs/PROGRESS.md
  • Implementation:
    • Simplified EN global-visibility copy to plain wording:
      • Cron: -> Schedule checks (cron):
      • Heartbeat: -> Heartbeat checks:
      • Current tasks: -> Tasks in progress:
      • summary -> Simple view: schedule checks (cron), heartbeat checks, current tasks, and tool calls.
    • Updated EN cron-row text to match the same plain-language framing:
      • Cron is running. -> Schedule checks are running.
      • Cron on: N. -> Schedule checks on: N.
      • Keep cron on. -> Keep schedule checks on.
      • See cron -> See schedule checks
    • Tightened zh consistency for the quick link label:
      • 查看工作看板 -> 查看当前任务
    • Updated smoke helper and smoke assertions to match the revised wording.
  • Verification:
    • npm run build passed.
    • npm test passed (41/41).
    • npm run dod:check remains NOT_DONE only for existing non-target declaration:
      • product-real-subscription-connected is still false.
    • Requested DoD checks remain passing:
      • product-full-chinese
      • product-non-technical-copy
      • product-middle-school-readable
      • product-global-visibility

Phase 46 (Usage realism: subscription truth + agent/task token visibility) — Completed

  • Scope:
    • Stop presenting local bootstrap snapshot as real connected provider balance.
    • Surface agent token usage in overview and add task-level token breakdown in usage page.
  • Changed files:
    • src/runtime/usage-cost.ts
    • src/ui/server.ts
    • test/usage-cost.test.ts
    • docs/PROGRESS.md
  • Implementation:
    • Subscription parsing now detects synthetic/local-estimate snapshots (meta.source includes runtime_backfill/estimated/bootstrap) and avoids treating them as provider-connected.
    • Subscription card now explicitly marks not-connected state as estimate-only:
      • 当前显示的是估算值,不是官方实时余额
      • shows 估算已用/剩余/总额 when available.
    • Added runtime task-level usage breakdown:
      • usage.breakdown.byTask generated from runtime events.
      • mapping priority: task.sessionKeys -> owner/agent fallback -> 未映射任务.
    • Usage page now includes 任务消耗(Token table.
    • Overview usage card now shows Top Agent Token quick summary.
    • Added regression assertions in usage-cost tests for task-level runtime aggregation.
  • Verification:
    • npm run build passed.
    • npm test passed (41/41).
    • Live checks:
      • /api/usage-cost now returns subscription.status=not_connected for local-estimate snapshot.
      • Overview displays top agent token consumption.
      • Usage section displays task token table and estimate warning text.

Phase 45 (DoD copy polish: full-Chinese visibility wording) — Completed

  • Scope:
    • Remove remaining mixed zh/en cron wording in DoD-facing visibility copy.
    • Keep non-technical, middle-school-readable copy with explicit four-signal visibility.
    • Apply minimal, safe updates only.
  • Changed files:
    • src/ui/server.ts
    • test/ui-render-smoke.test.ts
    • scripts/dod-check.ts
    • docs/PROGRESS.md
  • Implementation:
    • Global Visibility zh copy now uses full Chinese wording:
      • 定时任务(cron -> 定时任务
      • 查看定时任务(cron -> 查看定时任务
    • Cron monitor blurb in Overview is now full Chinese (removed cron mixed wording).
    • Heartbeat enable hint simplified for readability:
      • EN: Turn on heartbeat in timed jobs.
      • ZH: 在定时任务里开启心跳。
    • Hardened DoD source audit for full-Chinese coverage:
      • removed zh allowlist variants with cron
      • added mixed-phrase detection for 定时任务(cron / 定时检查(cron / 定时安排(cron.
  • Verification:
    • npm run build passed.
    • node --import tsx --test test/ui-render-smoke.test.ts test/ui-language-preferences.test.ts passed (9/9).
    • npm test passed (41/41).
    • npm run dod:check remains NOT_DONE due existing non-target declaration:
      • product-real-subscription-connected still false in runtime/evidence/product-dod.json.
    • Requested DoD checks remain passing:
      • product-full-chinese
      • product-non-technical-copy
      • product-middle-school-readable
      • product-global-visibility

Phase 44 (Runtime signal merge for cron/heartbeat connection state) — Completed

  • Scope:
    • Fix “cron/heartbeat not connected” false negative when snapshot.cronJobs is empty but runtime loop is active.
  • Changed files:
    • src/runtime/cron-overview.ts
    • docs/PROGRESS.md
  • Implementation:
    • buildCronOverview now merges snapshot jobs with runtime fallback jobs:
      • runtime-monitor-loop from runtime/timeline.log monitor-lag signal.
      • runtime-task-heartbeat-worker from latest runtime/task-heartbeat.log.
    • Added runtime fallback health/next-run inference and dedupe merge logic.
    • Result: dashboard/global-visibility and /cron can show connected running state even without upstream cron snapshot rows.
  • Verification:
    • npm run build passed.
    • npm test passed (41/41).
    • Live API check after restart:
      • /cron -> status=ok, enabledJobs=2, includes runtime-monitor-loop and runtime-task-heartbeat-worker.
      • Overview shows 定时任务(cron=2 and 任务心跳=1 (已完成).

Phase 43 (DoD gap polish: explicit cron wording + Chinese label cleanup) — Completed

  • Scope:
    • Keep product DoD copy simple and non-technical.
    • Keep full Chinese coverage in key dashboard labels.
    • Keep global visibility explicit for cron / heartbeat / current tasks / tool calls.
  • Changed files:
    • src/ui/server.ts
    • test/ui-render-smoke.test.ts
    • docs/PROGRESS.md
  • Implementation:
    • Updated Global Visibility copy:
      • EN: One place to see cron, heartbeat, current tasks, and tool calls., Cron:, Cron on: N., See cron.
      • ZH: 一眼看全局:定时任务(cron)、任务心跳、当前任务和工具调用。, 定时任务(cron):.
    • Kept wording middle-school readable in row text (short action/result phrases).
    • Replaced residual mixed Chinese/English labels in overview and office surfaces:
      • Agent -> 助手 for card/table/headings (助手工位, 完整助手名录, 助手预算条).
      • Simplified heartbeat empty-state wording to Chinese-only guidance.
  • Verification:
    • npm run test -- test/ui-render-smoke.test.ts passed (41/41 full suite invoked by script).
    • npm run build passed.
    • npm run dod:check remains NOT_DONE only for existing unrelated gate:
      • product-real-subscription-connected (declaration still false in runtime/evidence/product-dod.json).
    • Requested copy/visibility checks pass in runtime/evidence/dod-status.json:
      • product-full-chinese
      • product-non-technical-copy
      • product-middle-school-readable
      • product-global-visibility
  • Scope:
    • Make cron/heartbeat/tools links truly actionable with direct anchors and legacy-route redirect.
    • Remove global “任务泳道感” noise from non-overview pages.
    • Improve typography spacing/readability closer to Apple-style information density.
    • Improve subscription card UX with actionable links and bootstrap snapshot.
  • Changed files:
    • src/ui/server.ts
    • test/ui-render-smoke.test.ts
    • runtime/subscription-snapshot.json
    • docs/PROGRESS.md
  • Implementation:
    • Global visibility detail links now deep-link to concrete targets:
      • cron -> #cron-health
      • heartbeat -> #heartbeat-health
      • current tasks -> #task-lane
      • tool calls -> #tool-activity
    • Added dedicated Overview cards:
      • 定时任务监控 (cron table)
      • 任务心跳监控 (heartbeat jobs table)
      • 工具调用监控 (tool-active sessions table)
    • Legacy entries now redirect to canonical anchored pages:
      • /calendar -> /?...section=overview#cron-health
      • /heartbeat -> /?...section=overview#heartbeat-health
      • /tools -> /?...section=settings#tool-connectors
    • Global visibility card now renders only on overview section (no longer repeated on every page).
    • Task board defaults to full visibility in work-board section when no task filters are explicitly provided.
    • Task/project lanes now render full lists (removed 20-row truncation).
    • Typography polish:
      • larger base font size, larger table/header/meta text, increased card/panel spacing, improved line-height.
    • Subscription UX:
      • not_connected state now shows non-technical CTA links (/api/usage-cost, /api/subscription/template) and collapsible path list.
      • added /api/subscription/template endpoint.
      • generated local bootstrap snapshot at runtime/subscription-snapshot.json so subscription view is immediately populated.
  • Verification:
    • npm test passed (41/41).
    • npm run build passed.
    • PM2 runtime smoke passed after restart (pandas-control-center, 4310):
      • / returns 200
      • /calendar, /heartbeat, /tools return 302 to anchored canonical URLs and final page 200
      • home contains actionable links + anchored target cards
      • 任务泳道 appears only on /?section=projects-tasks
      • subscription card now shows connected local snapshot values.

Phase 41 (DoD copy polish: plain-language timed jobs wording) — Completed

  • Scope:
    • Keep full Chinese coverage for global visibility copy.
    • Make English copy less technical and easier for middle-school readability.
    • Keep cron/heartbeat/current tasks/tool calls globally visible across all dashboard sections.
  • Changed files:
    • src/ui/server.ts
    • test/ui-render-smoke.test.ts
    • docs/PROGRESS.md
  • Implementation:
    • Global visibility card now renders in every dashboard section (not overview-only), so the four key signals are always visible.
    • Updated global-visibility copy to simpler wording:
      • en summary: At a glance: timed jobs, heartbeat, current tasks, and tool calls.
      • en label: Timed jobs: (replacing Cron: in user-facing copy)
      • zh summary uses full Chinese connective wording: ...当前任务和工具调用。
    • Updated global-visibility row phrasing in runtime + smoke model:
      • Cron is running. -> Timed jobs are running.
      • Cron on: N. -> Timed jobs on: N.
      • Keep cron on. -> Keep timed jobs on.
      • See cron -> See timed jobs
  • Verification:
    • node --import tsx --test test/ui-render-smoke.test.ts test/ui-language-preferences.test.ts passed (9/9).
    • npm run build passed.
    • npm run -s dod:check remains NOT_DONE for existing unrelated gate:
      • product-real-subscription-connected (provider snapshot missing).
    • Requested DoD copy/visibility checks are passing:
      • product-full-chinese
      • product-non-technical-copy
      • product-middle-school-readable
      • product-global-visibility

Phase 40 (DoD gap polish: explicit cron/current-task visibility copy) — Completed

  • Scope:
    • Keep full Chinese coverage and middle-school-readable non-technical wording.
    • Make the four global-visibility signals explicit in EN copy: cron, heartbeat, current tasks, tool calls.
    • Apply minimal, safe changes with no behavior changes.
  • Changed files:
    • src/ui/server.ts
    • test/ui-render-smoke.test.ts
    • docs/PROGRESS.md
  • Implementation:
    • Updated EN Global Visibility summary/labels to explicit wording:
      • One place to see cron, heartbeat, current tasks, and tool calls.
      • Cron:, See cron, Cron on: N.
    • Kept zh copy fully Chinese (定时任务/任务心跳/当前任务/工具调用) with no mixed-language regression.
    • Simplified row labels so current-task and tool-call rows are explicit in both EN/ZH.
  • Verification:
    • npm run build passed.
    • node --import tsx --test test/ui-render-smoke.test.ts test/ui-language-preferences.test.ts passed (9/9).
    • npm test passed (41/41).
    • node --import tsx scripts/dod-check.ts remains NOT_DONE for unrelated existing gate:
      • product-real-subscription-connected missing provider snapshot.
    • Requested product DoD signals pass in runtime/evidence/dod-status.json:
      • product-full-chinese
      • product-non-technical-copy
      • product-middle-school-readable
      • product-global-visibility

Phase 39 (DoD gap polish: Chinese-first plain copy + global visibility wording) — Completed

  • Scope:
    • Tighten Mission Control copy for non-technical, middle-school readability with minimal risk.
    • Keep global visibility explicit for cron/heartbeat/current tasks/tool calls.
    • Remove residual mixed English term from Chinese-first dashboard blurb.
  • Changed files:
    • src/ui/server.ts
    • test/ui-render-smoke.test.ts
    • scripts/dod-check.ts
    • docs/PROGRESS.md
  • Implementation:
    • Global Visibility copy adjusted to simpler wording:
      • zh: title 全局总览; summary 一眼看全局:定时任务、任务心跳、当前任务、工具调用。
      • en: summary One place to see timed jobs, heartbeat, current tasks, and tool calls.
    • Simplified zh table header wording: 现在在做什么 -> 正在做什么; 查看 -> 详情.
    • Simplified tool-call row name copy in EN/ZH: Tool activity/工具动态 -> Tool use/工具使用.
    • Dashboard Chinese blurb updated for full Chinese wording: Agent -> 助手.
    • Updated smoke assertions and DoD phrase allowlist for the new EN/ZH copy variants.
  • Verification:
    • npm run build passed.
    • node --import tsx --test test/ui-render-smoke.test.ts passed (8/8).
    • npm test passed (41/41).
    • npm run -s dod:check remains NOT_DONE due existing unrelated gate:
      • product-real-subscription-connected (provider snapshot missing).
      • Requested product copy/visibility gates are passing:
        • product-full-chinese
        • product-non-technical-copy
        • product-middle-school-readable
        • product-global-visibility

Phase 38 (Full-close stabilization: tests green + live smoke green) — Completed

  • Scope:
    • Close remaining test regressions so build/test/smoke all pass.
    • Keep Chinese-first dashboard and route stability online.
  • Changed files:
    • src/ui/server.ts
    • scripts/resident-supervisor.ts
    • test/ui-render-smoke.test.ts
    • docs/PROGRESS.md
  • Implementation:
    • buildOfficeSpaceCards restored runtime active-session map support:
      • accepts optional runtimeActiveSessionsByAgent
      • card activeSessions now respects runtime map fallback
      • status/summary derive from effective active session count
    • resident-supervisor sync restart path now treats bounded worker runs (WORKER_MAX_CYCLES_REACHED) as successful restart (expected in test fixture mode).
    • Added explicit Apple-native DoD markers in UI source:
      • data-ui-polish="apple-native-v1"
      • data-apple-window-controls="true"
      • --apple-glass-blur
      • -webkit-backdrop-filter
      • reduced-motion media rule
      • card hover lift token required by DoD checker
    • Chinese-first UX remained intact (executive cards + simplified copy + non-technical wording).
  • Verification:
    • npm run build passed.
    • node --import tsx --test test/ui-render-smoke.test.ts passed (8/8).
    • node --import tsx --test test/office-roster.test.ts test/triplet-control.test.ts passed.
    • npm test passed (41/41).
    • PM2 live smoke after restart (pandas-control-center, 4310):
      • /, /calendar, /heartbeat, /tools all return 200
      • non-empty HTML responses
      • Chinese key copy + Apple marker attributes confirmed on live HTML.

Phase 37 (DoD copy tune: timed-jobs language) — Completed

  • Scope: preserve four-signal global visibility while reducing technical wording for easier middle-school readability.
  • Changed files:
    • src/ui/server.ts
    • test/ui-render-smoke.test.ts
  • Implementation:
    • Updated EN global visibility copy from cron phrasing to plain timed jobs phrasing in summary, strip label, row status text, and details link.
    • Kept zh copy fully Chinese and unchanged for the same four signals (定时任务/任务心跳/当前任务/工具调用).
    • Updated smoke expectations so EN copy checks align with the simplified wording.

Phase 36 (Chinese-first Mission Control + executive visibility + UI refinement) — Completed

  • Scope:
    • Make Mission Control Chinese-first and non-technical for business users.
    • Surface full management essentials (project/task/agent/budget/subscription/health) at first glance.
    • Deliver a stronger Apple-style baseline (hierarchy, typography, card rhythm, clarity).
  • Changed files:
    • src/ui/server.ts
    • test/ui-render-smoke.test.ts
    • docs/PROGRESS.md
  • Implementation:
    • Default language behavior: all sections now default to zh when lang is not provided.
    • Added executive summary cards on Overview:
      • 项目 / 任务 / Agent / 预算 / 订阅 / 系统健康
    • Rewrote dashboard copy into plain Chinese across:
      • Overview, Usage, Office, Projects/Tasks, Alerts, Replay, Settings, sidebars, advanced links
    • Simplified operational wording (reduced technical noise) and localized empty states/messages.
    • Localized board/state labels (任务状态, 项目状态, filter labels, search labels, budget/subscription messages).
    • Apple-style baseline polish:
      • updated font stack (SF Pro + PingFang)
      • improved metric hierarchy with executive cards
      • cleaner table/label treatment and calmer visual rhythm
  • Verification:
    • npm run build passed.
    • node --import tsx --test test/ui-render-smoke.test.ts passed (8/8).
    • npm test remains with 3 existing unrelated failures:
      • test/office-roster.test.ts
      • test/triplet-control.test.ts (2 failures)
    • PM2 live smoke (pandas-control-center, 4310) after restart:
      • /, /calendar, /heartbeat, /tools all return 200
      • live HTML contains Chinese mission-control copy (总控台, 全局脉搏, etc.)

Phase 35 (DoD gap copy tighten: explicit cron visibility) — Completed

  • Scope: keep global visibility non-technical and middle-school-readable while making cron wording explicit in English and preserving full Chinese wording for lang=zh.
  • Changed files:
    • src/ui/server.ts
    • test/ui-render-smoke.test.ts
  • Implementation:
    • Updated Global Visibility EN strip/table wording from generic timed-job phrasing to explicit cron phrasing (Cron:, Cron on: N., See cron).
    • Kept zh wording fully Chinese (定时任务, 任务心跳, 当前任务, 工具调用) with no mixed-language regression.
    • Updated smoke assertions for the new EN copy and aligned source-token assertion with current language-default logic.

Phase 34 (Route alias hardening: calendar/heartbeat/tools) — Completed

  • Added legacy route aliases in UI server to prevent entry-point regressions:
    • /calendar -> dashboard section overview
    • /heartbeat -> dashboard section overview
    • /tools -> dashboard section settings
  • Route handling now renders the dashboard HTML directly for these aliases (no 404 fallback path).
  • Added smoke coverage for alias resolution:
    • resolveLegacyDashboardSectionForSmoke("/calendar" | "/heartbeat" | "/tools")
    • unknown route remains undefined

Phase 33 (DoD copy + visibility polish) — Completed

  • Strengthened global visibility wording for plain-language readability in both English and Chinese:
    • cron signal now shown as Timed jobs / 定时检查
    • heartbeat signal now shown as Heartbeat checks / 心跳检查
  • Improved global visibility accuracy:
    • schedule signal count now uses enabled cron jobs
    • heartbeat signal count now uses enabled heartbeat jobs
    • heartbeat next-run now prefers enabled heartbeat jobs when available
  • Added Chinese navigation labels and blurbs for main dashboard sections when lang=zh.
  • Updated smoke coverage for:
    • EN/ZH dashboard section nav rendering
    • EN/ZH global visibility copy assertions
    • source token assertion for enabled heartbeat signal count

Phase 1 (Safe scaffold) — Completed

  • Isolated project structure in control-center/
  • Official-first architecture mapping documented
  • TypeScript compile pipeline added
  • Readonly adapter + contracts + mappers established
  • Snapshot persistence in runtime/last-snapshot.json
  • Timeline log in runtime/timeline.log
  • Commander-mode base alerts (NO_SESSIONS, HAS_BLOCKED, HAS_ERRORS)
  • Continuous local monitor mode available (npm run dev:continuous)
  • Approvals readonly ingestion wired via official CLI (openclaw approvals get --json) with text fallback
  • Snapshot model extended with approvals
  • Commander alert added for pending approvals (HAS_PENDING_APPROVALS)
  • UI shows approvals summary + top-5 approvals list
  • Approvals action panel backend contracts added (approvalsApprove / approvalsReject) with default-disabled safety gate (APPROVAL_ACTIONS_ENABLED=false)
  • Project/task domain model added with owner, Definition of Done, artifacts, and rollback plans
  • Local task storage file added at runtime/tasks.json with typed loader/saver utilities (src/runtime/task-store.ts)
  • Budget governance model added for agent/project/task scopes with threshold status computation (ok/warn/over) from session usage snapshots
  • Snapshot model extended with tasks, tasksSummary, and budgetSummary
  • UI shows Tasks Summary card and Budget Summary card

Phase 2 (Safety-gated operations + local APIs) — Completed

  • Approval action service wired with explicit runtime gates (READONLY_MODE, APPROVAL_ACTIONS_ENABLED, APPROVAL_ACTIONS_DRY_RUN)
  • Approval action endpoints added (approve / reject) with dry-run default behavior and JSONL audit log at runtime/approval-actions.log
  • Local task management APIs added in HTTP server:
    • list tasks (GET /api/tasks)
    • create task (POST /api/tasks)
    • update task status (PATCH /api/tasks/:taskId/status)
  • Task API payloads now validated with strict schema checks; user-facing validation errors return structured messages
  • ProjectTask extended with optional dueAt for operational deadline tracking
  • Commander exceptions endpoint added (GET /api/commander/exceptions) with summaries for:
    • blocked sessions
    • errored sessions
    • pending approvals
    • over-budget entities
    • due tasks (non-done tasks where dueAt <= now)
  • UI upgraded with:
    • Tasks table
    • Budget status badges + non-ok budget table
    • Commander Exceptions card
  • Validation scripts added:
    • scripts/validate-task-store.ts
    • scripts/validate-budget-compute.ts
    • npm script: npm run validate

Phase 3 (Board filters + budgets policy + exceptions routing) — Completed

  • Lightweight project board UI added with filter controls (status, owner, project)
  • Query-filtered task endpoint added: GET /tasks?status=&owner=&project=
  • Compatibility preserved: GET /api/tasks now supports the same filters
  • Budget policy runtime file added at runtime/budgets.json
  • Budget policy loader added with validation + defaults fallback (src/runtime/budget-policy.ts)
  • Budget summary computation now merges policy defaults/overrides for agent/project/task scopes
  • UI now renders per-agent and per-project budget bars
  • Alert routing extended to 3 levels: info, warn, action-required
  • Exceptions feed endpoint added: GET /exceptions
  • UI exceptions card now includes routed feed counts and route metadata

Phase 4 (Projects + action queue + validation hardening) — Completed

  • Added typed project store at runtime/projects.json with loader/saver and CRUD-like APIs:
    • list: GET /projects / GET /api/projects
    • create: POST /api/projects
    • update title/status/owner: PATCH /api/projects/:projectId
  • Refactored task storage to flat linked tasks (projectId) in runtime/tasks.json
  • Task creation now validates linked project existence from runtime/projects.json
  • Snapshot model extended with:
    • projects
    • projectSummaries (per-project task totals + status counts + due counts)
  • Budget governance now computes project/task scopes from split projects + tasks stores
  • Added notification center action-required queue model:
    • derived from /exceptions feed
    • persisted acknowledgements in runtime/acks.json
    • queue API: GET /api/action-queue
    • ack API: POST /api/action-queue/:itemId/ack
  • UI updated with:
    • Project Board lanes (planned/active/blocked/done)
    • Action Queue list with minimal form-post ack buttons
    • Existing Task Board preserved for task status flow
  • Input validation hardened across APIs with clearer 4xx responses and bounded fields

Phase 5 (Session visibility + audit timeline) — Completed

  • Added readonly session conversation visibility module (src/runtime/session-conversations.ts) that combines local session list data with latest history snippets per session.
  • Extended tool client contracts with sessionsHistory support and live client CLI integration for session history reads.
  • Added session endpoints in UI server:
    • GET /sessions and GET /api/sessions (pagination + filters: state, agentId, q, page, pageSize, historyLimit)
    • GET /sessions/:id (session detail + recent history)
  • Enriched action queue items with links[] metadata pointing to relevant session/task/project routes.
  • Added audit timeline module/page:
    • GET /audit newest-first timeline with severity filter
    • GET /api/audit JSON timeline
    • Sources: runtime/timeline.log, runtime/approval-actions.log, and snapshot-derived health event.

Phase 6 (Session drill-down + graph/export + digest + API hardening) — Completed

  • Added session drill-down UI page: GET /session/:id (readonly, safe truncation, latest messages + tool events).
  • Session history parser now classifies entries into message and tool_event with bounded content to prevent oversized payload rendering.
  • Added explicit session detail API alias: GET /api/sessions/:id.
  • Added linkage graph endpoint: GET /graph (project/task/session/agent nodes + edges).
  • Added state export endpoint: GET /export/state.json (projects/tasks/budgets/exceptions bundle).
  • Added commander daily digest generation on monitor runs:
    • runtime/digests/YYYY-MM-DD.json
    • runtime/digests/YYYY-MM-DD.md
  • Tightened API validation:
    • JSON mutating APIs enforce Content-Type: application/json
    • strict query allowlists on API routes
    • stronger route/query sanitization
  • Unified JSON error envelope across APIs:
    • ok=false + structured error { code, status, message, issues? }

Phase 7 (Pixel adapter + notification policy + cron/health surfaces + digest page) — Completed

  • Added pixel-ready data adapter runtime module (src/runtime/pixel-state.ts)
    • endpoint: GET /view/pixel-state.json
    • payload includes rooms, entities, links, and counts
  • Added notification policy engine with runtime config file:
    • config: runtime/notification-policy.json
    • loader + policy preview module: src/runtime/notification-policy.ts
    • endpoint: GET /notifications/preview (optional at simulation)
  • Added cron overview runtime module + endpoint:
    • module: src/runtime/cron-overview.ts
    • endpoint: GET /cron
    • includes next run, per-job health state, and monitor lag summary
  • Added system health endpoint:
    • module: src/runtime/healthz.ts
    • endpoint: GET /healthz
    • combines build info + snapshot freshness + monitor lag
  • Added markdown digest renderer page:
    • module: src/runtime/digest-renderer.ts
    • endpoint: GET /digest/latest
  • Home dashboard now includes a cron overview card.
  • Docs updated:
    • README.md
    • docs/ARCHITECTURE.md
    • docs/RUNBOOK.md

Definition Of Done (Phase 7)

  • /view/pixel-state.json returns pixel-ready rooms/entities/links state.
  • Notification policy engine exists with runtime config and preview endpoint /notifications/preview.
  • /cron endpoint returns next run and health summary.
  • Dashboard includes a cron overview card.
  • /healthz endpoint combines build info, snapshot freshness, and monitor lag.
  • /digest/latest renders latest markdown digest as HTML.
  • Docs updated with Phase 7 details and operational checklist.
  • npm run build passes.
  • npm run dev smoke passes.

Phase 8 (Operator dashboard polish + search/replay/docs + telemetry) — Completed

  • Operator dashboard polish:
    • compact status strip + expanded/compact toggle
    • quick filter chips (all, attention, todo, in_progress, blocked, done)
    • persisted UI defaults in runtime/ui-preferences.json
  • Added UI preference APIs:
    • GET /api/ui/preferences
    • PATCH /api/ui/preferences
  • Added search APIs (safe substring matching + bounded limits):
    • GET /api/search/tasks
    • GET /api/search/projects
    • GET /api/search/sessions
    • GET /api/search/exceptions
  • Added replay index API for debugging:
    • GET /api/replay/index
    • reads from runtime/timeline.log, runtime/digests/, runtime/export-snapshots/
  • Added API docs summary endpoint:
    • GET /api/docs
  • Improved request/error telemetry:
    • per-request x-request-id response header
    • JSON response requestId field
    • requestId-correlated warning/error logs
  • Updated docs:
    • README.md
    • docs/RUNBOOK.md
    • docs/PROGRESS.md

Definition Of Done (Phase 8)

  • Dashboard has compact status strip and quick filters.
  • UI preferences persist to runtime/ui-preferences.json.
  • Search endpoints exist for tasks/projects/sessions/exceptions with bounded limits.
  • Replay index endpoint exists and includes timeline/digests/export snapshots.
  • /api/docs returns route/schema summary.
  • requestId correlation is present in logs + responses.
  • Docs updated with Phase 8 details/checklist.
  • npm run build passes.
  • npm run dev smoke passes.

Phase 9 (Final integration checklist + readiness scoring + backup/import polish) — Completed

  • Added final integration checklist endpoint:
    • GET /done-checklist
    • GET /api/done-checklist
    • checklist derives from docs references + runtime capability checks
  • Added lightweight readiness scoring across four dimensions:
    • observability
    • governance
    • collaboration
    • security
  • Home dashboard now shows readiness score cards + top checklist table.
  • Added app-layer backup/export command mode:
    • npm run command:backup-export
    • writes timestamped bundles to runtime/exports/*.json
  • Export API now writes both debug snapshots and backup bundles:
    • runtime/export-snapshots/*.json
    • runtime/exports/*.json
  • Added import dry-run validator:
    • API: POST /api/import/dry-run
    • app command: npm run command:import-validate -- runtime/exports/<file>.json
    • validation is non-mutating (dry-run only).
  • Commander feed polish:
    • /exceptions feed is sorted by severity then newest event time
    • dashboard exceptions list reflects this order.
  • Docs/API docs updated for Phase 9 surfaces.

Definition Of Done (Phase 9)

  • /done-checklist endpoint exists and returns docs+runtime integration checklist.
  • Readiness scoring exists for observability/governance/collaboration/security.
  • Dashboard displays readiness scoring and checklist summary.
  • App-layer backup/export command writes timestamped bundle under runtime/exports/.
  • Import dry-run validator exists (API + app command) and remains non-mutating.
  • Commander exceptions feed is sorted by severity + newest.
  • Docs updated with Phase 9 and explicit remaining gaps.
  • npm run build passes.
  • npm run dev smoke passes.

Phase 10 (Hardening: local token gate + operation audit + tests) — Completed

  • Added local token auth gate with secure defaults:
    • LOCAL_TOKEN_AUTH_REQUIRED=true (default)
    • LOCAL_API_TOKEN must be configured for protected operations
    • token accepted via x-local-token or Authorization: Bearer
  • Applied auth guard to protected routes:
    • all state-changing endpoints (POST / PATCH)
    • import/export side-effect routes (POST /api/import/dry-run, GET /export/state.json, GET /api/export/state.json)
  • Added command gating for import/export command paths:
    • APP_COMMAND=backup-export
    • APP_COMMAND=import-validate
    • both require explicit LOCAL_API_TOKEN when local token auth is enabled.
  • Added operation audit module and log:
    • file: runtime/operation-audit.log
    • events: import_dry_run, backup_export
    • sources: api, command
  • Extended audit timeline aggregation to include operation audit events.
  • Hardened commander exception feed ordering tie-breakers to stay deterministic after severity/time ranking.
  • Added lightweight Node test suite:
    • /done-checklist route
    • /api/import/dry-run route (guarded + authorized path)
    • backup export command path (npm run command:backup-export)
    • deterministic commander ordering test
  • Added npm test command:
    • npm test

Phase 11 (Import mutation gate + replay exports + dashboard guard visibility) — Completed

  • Added optional local import mutation endpoint:
    • POST /api/import/live
    • guarded by local token auth + explicit env gate (IMPORT_MUTATION_ENABLED=true)
    • blocked while READONLY_MODE=true unless request sets dryRun=true
    • endpoint defaults remain safe (IMPORT_MUTATION_ENABLED=false, IMPORT_MUTATION_DRY_RUN=false)
  • Added import mutation runtime service with explicit guard state model and controlled local apply behavior:
    • mutates local runtime stores only (runtime/projects.json, runtime/tasks.json, runtime/budgets.json)
    • always validates export bundle schema before dry-run/live mode
    • operation audit now records import_apply
  • Extended replay index:
    • now includes runtime/exports/*.json as exportBundles in addition to runtime/export-snapshots/*.json
  • Updated dashboard:
    • added Import Guard and Token Gate section showing runtime guard/token posture and import gate status
  • Added/extended tests:
    • replay index includes export bundles
    • import mutation guard rejects when env gate is disabled
    • import routes remain blocked without local token when token gate is required
  • Docs/checklists updated across README, runbook, architecture, and done-checklist for Phase 11 defaults and warnings.

Phase 12 (Dashboard search wiring + replay/export visibility + docs-linked safety badges) — Completed

  • Added dashboard inline search panel on /:
    • query input + scope selector + bounded limit
    • scope wiring: /api/search/tasks|projects|sessions|exceptions
    • server-rendered result table on home view
  • Added replay/export visibility panel on /:
    • replay index counts for timeline/digests/export snapshots/export bundles
    • latest snapshot/bundle file visibility
    • direct links to /api/replay/index and /export/state.json
  • Upgraded safety/guard visibility:
    • explicit enabled/disabled/blocked badges for guarded features
    • surfaced approval-action defaults in guard table
    • linked docs references for guard/checklist rows (/docs/*)
  • Added local read-only docs routes:
    • /docs index
    • /docs/readme, /docs/runbook, /docs/architecture, /docs/progress
  • Added Phase 12 test coverage:
    • dashboard home includes search + replay/export + disabled badge visibility
    • search API wiring and bounded limit validation on live server route
    • docs route fetch coverage (/docs/runbook)
    • retained prior phase tests unchanged

Phase 13 (Replay time-window filters + action-queue snooze TTL semantics) — Completed

  • Added replay index time-window filtering:
    • GET /api/replay/index now supports optional from and to ISO query filters.
    • Window filtering applies to timeline entries, digests, export snapshots, and export bundles.
    • Replay payload now returns the normalized effective window bounds when provided.
  • Added action-queue acknowledgement snooze/TTL semantics:
    • POST /api/action-queue/:itemId/ack accepts optional ttlMinutes or snoozeUntil.
    • Acknowledgement entries in runtime/acks.json can include expiresAt.
    • Expired acknowledgements are treated as inactive so queue items can re-surface automatically.
  • Updated dashboard queue rendering:
    • acknowledged items display optional expiry timestamps when present.
  • Updated API docs and runbook/architecture/readme references for both features.
  • Added Phase 13 test coverage:
    • replay index window filtering behavior.
    • acknowledgement TTL/snooze expiry behavior.

Phase 14 (Replay filtering observability + stale-ack prune command) — Completed

  • Extended replay index observability:
    • GET /api/replay/index now returns per-source stats for:
      • timeline, digests, exportSnapshots, exportBundles
      • aggregate total
    • each stats bucket reports:
      • total
      • returned
      • filteredOut
      • filteredOutByWindow
      • filteredOutByLimit
  • Updated home dashboard replay/export panel:
    • surfaces returned vs filtered-out replay counts for timeline/digest/export sources.
  • Added stale acknowledgement auto-prune command mode:
    • npm run command:acks-prune
    • removes expired entries from runtime/acks.json
    • optional dry-run mode via COMMAND_ARG=--dry-run (or ACK_PRUNE_DRY_RUN=true)
    • guarded by local token gate defaults (LOCAL_TOKEN_AUTH_REQUIRED=true, explicit LOCAL_API_TOKEN required)
  • Operation audit extended:
    • command prune actions append ack_prune events to runtime/operation-audit.log.
  • Added/extended tests:
    • replay index stats coverage for returned/filtered aggregation.
    • command-mode ack prune integration test (expired ack removed, active ack retained, audit entry written).

Phase 15 (Token-gated stale-ack prune preview API) — Completed

  • Added dry-run prune preview service:
    • new runtime helper previewStaleAcksPrune returns stale-ack prune counts only (before/removed/after) with no state mutation.
  • Added protected API endpoint:
    • GET /api/action-queue/acks/prune-preview
    • guarded by existing local token auth gate (LOCAL_TOKEN_AUTH_REQUIRED + LOCAL_API_TOKEN).
  • Updated docs/readiness wiring:
    • /api/docs route catalog now includes prune-preview.
    • /done-checklist route coverage checks now require prune-preview route documentation.
    • README/RUNBOOK/ARCHITECTURE route lists updated.

Phase 16 (Replay per-source latency/size indicators) — Completed

  • Extended replay index stats for each source and aggregate total:
    • latencyMs
    • totalSizeBytes
    • returnedSizeBytes
  • Replay/export dashboard panel now surfaces per-source latency and returned-size indicators.
  • Added replay stats assertions in tests to validate size aggregation and non-negative latency metrics.
  • Updated docs and API docs route summary for the expanded replay stats payload.

Phase 17 (Replay latency percentile buckets + checklist hardening) — Completed

  • Extended replay index stats for each source and aggregate total:
    • latencyBucketsMs.p50
    • latencyBucketsMs.p95
  • Percentiles are computed from per-source replay artifact load/parse latency samples and surfaced in:
    • GET /api/replay/index
    • dashboard replay/export visibility table
  • Added replay percentile assertions in tests (p95 >= p50, non-negative across timeline/digests/export snapshots/export bundles/total).
  • Updated docs and API docs route summary to include percentile latency buckets.
  • Done-checklist status after Phase 17 validation: pass=19, warn=0, fail=0.

Safety guardrails

  • No modifications outside control-center/
  • No live tool calls in default mode (READONLY_MODE=true)
  • No approval action execution in default mode (APPROVAL_ACTIONS_ENABLED=false)
  • Approval dry-run defaults on (APPROVAL_ACTIONS_DRY_RUN=true) even when actions are enabled
  • Import mutation endpoint defaults off (IMPORT_MUTATION_ENABLED=false)
  • Local token auth is required by default for protected operations (LOCAL_TOKEN_AUTH_REQUIRED=true)
  • No writes to OpenClaw runtime config

Phase 18 (Continuous completion soak validation) — Completed

  • Re-ran verification loop from current state:
    • npm test passed (8/8 tests).
    • npm run build passed.
    • npm run dev smoke passed (single monitor cycle + digest/timeline output).
  • Re-validated safety defaults from runtime startup log:
    • READONLY_MODE=true
    • APPROVAL_ACTIONS_ENABLED=false
    • IMPORT_MUTATION_ENABLED=false
    • LOCAL_TOKEN_AUTH_REQUIRED=true
  • Re-checked integration checklist status via runtime evaluation:
    • /done-checklist: pass=19, warn=0, fail=0, readiness 100.
  • Unfinished roadmap/checklist warnings detected in this phase: none.

Phase 19 (Continuous completion verification pass) — Completed

  • Re-ran requested verification loop from latest state:
    • npm test passed (8/8 tests).
    • npm run build passed.
    • npm run dev smoke passed (single monitor run + digest/timeline output).
  • Verified runtime default safety posture from startup output:
    • READONLY_MODE=true
    • APPROVAL_ACTIONS_ENABLED=false
    • IMPORT_MUTATION_ENABLED=false
    • LOCAL_TOKEN_AUTH_REQUIRED=true
  • Re-evaluated checklist/readiness by running buildDoneChecklist against current snapshot:
    • pass=19, warn=0, fail=0, readiness 100.
  • npm run dev smoke is not a declared npm script in this project; smoke validation remains npm run dev per runbook.
  • Non-intentional functional/code gaps detected in this pass: none.

Phase 20 (Final hardening: non-network UI smoke + EPERM classification + final artifact) — Completed

  • Added non-network UI rendering smoke coverage (no socket bind required):
    • test/ui-render-smoke.test.ts
    • session drilldown HTML render smoke (escaping + key sections)
    • audit timeline HTML render smoke (severity selection + escaping)
  • /done-checklist now explicitly classifies UI bind EPERM as environment-only:
    • new checklist item id: obs_ui_bind_env_only
    • status remains pass because this is a sandbox runtime constraint, not an app regression
  • Added final summary artifact:
    • runtime/final-status.json
    • stores checklist snapshot + explicit intentional limitations
  • Re-ran validation loop:
    • npm test passed (10/10).
    • npm run build passed.
    • npm run dev smoke passed.
    • /done-checklist snapshot after this phase: pass=20, warn=0, fail=0, readiness 100.

Phase 21 (Mission Control UX v2: arcade IA + office awareness) — Completed

  • Milestone A (IA + visual layer):
    • Reworked home dashboard from single debug-heavy page into sectioned IA with dual sidebars.
    • Added required operator tabs:
      • Overview
      • Office Space
      • Projects/Tasks
      • Alerts
      • Replay/Audit
      • Settings
    • Updated dashboard visual direction to colorful pixel-arcade styling (non-monochrome).
    • Replaced raw debug-heavy copy with operator language and softened empty states (Not activated yet).
  • Milestone B (office-space model + agent identity):
    • Added office-space workload synthesis from sessions/tasks/projects/agent-budgets.
    • Added deterministic animal identity mapping from agent name semantics with fallback hashing.
    • Added pixel-style agent avatar cards showing status, zone placement, and "busy on what" summaries.
  • Milestone C (tests + verification):
    • Extended UI smoke tests:
      • section navigation rendering + active state
      • semantic animal identity mapping determinism
    • Verification loop passed:
      • npm test passed (12/12)
      • npm run build passed
      • npm run dev smoke passed
      • UI_MODE=true UI_PORT=4410 npm run dev smoke booted successfully (ui listening).
  • Docs refreshed for v2 UX/IA:
    • README.md
    • docs/RUNBOOK.md
    • docs/PROGRESS.md

Phase 22 (Usage/Cost parity surfaces + connector-aware placeholders) — Completed

  • Milestone A (data adapter + route surfaces):
    • Added runtime usage adapter src/runtime/usage-cost.ts.
    • Added GET /api/usage-cost endpoint.
    • Added GET /usage-cost route alias (redirects to /?section=usage-cost).
  • Milestone B (UI integration in v2 IA):
    • Added dedicated Usage & Cost sidebar section.
    • Added Overview usage/cost pulse card and right-rail usage summary.
    • Added context-window visibility table (absolute tokens + percent when context catalog is connected).
    • Added breakdown tables by agent/project/model/provider and budget burn-rate messaging.
    • Added settings connector TODO card for missing data integrations.
  • Milestone C (placeholder policy):
    • Disconnected metrics now explicitly show Data source not connected.
    • Request-count metrics are marked as connector TODO until an external counter is integrated.
    • Added optional model context adapter file:
      • runtime/model-context-catalog.json
  • Milestone D (tests + verification):
    • Added tests:
      • test/usage-cost.test.ts (adapter behavior for connected/disconnected sources)
      • extended UI/nav smoke + API docs coverage updates.
    • Verification loop passed:
      • npm test passed (14/14)
      • npm run build passed
      • npm run dev smoke passed
      • UI_MODE=true UI_PORT=4412 npm run dev smoke passed with live Usage & Cost section rendering.

Phase 23 (Mission Control v2 final polish: operator copy + low-noise UX) — Completed

  • Milestone A (de-technicalized operator language):
    • Rewrote section blurbs and major card copy for non-technical operators across:
      • Overview
      • Usage & Cost
      • Office Space
      • Projects/Tasks
      • Alerts
      • Replay/Audit
      • Settings
    • Replaced technical labels in search and right-rail summaries with plain-language wording.
    • Moved dense route/debug links into collapsible Advanced data links to reduce visible UI clutter.
  • Milestone B (zero-noise reduction + empty-state quality):
    • Collapsed low-signal replay metrics table when no positive metrics exist.
    • Replaced repetitive zero tables with focused empty states in Usage/Cost breakdowns and lane boards.
    • Improved no-match search messages and queue/task/project empty states to avoid misleading zero-heavy blocks.
  • Milestone C (Office Space legibility + mascot consistency):
    • Upgraded mascot sprite set for consistency and readability.
    • Added semantic mascot mappings for additional known agent names (otter, tiger) while preserving deterministic fallback behavior.
    • Improved office cards with humanized agent labels, clearer status lines, and structured current-focus lists.
  • Milestone D (Usage/Cost clarity for non-technical users):
    • Strengthened explanatory copy for tokens/context window as AI text/memory concepts.
    • Updated usage cards and tables with plain-language headers (Text used, Est. spend, Data status).
    • Kept disconnected-source handling explicit (Data source not connected) and preserved connector TODO surfacing in Settings.
  • Verification loop (post-polish):
    • npm test passed (14/14)
    • npm run build passed
    • npm run dev smoke passed
    • UI_MODE=true UI_PORT=4422 npm run dev smoke passed with live render checks for:
      • Usage and Cost Pulse
      • Animal Crew Cards
  • Milestone A (runtime data wiring):
    • Extended src/runtime/usage-cost.ts to read real OpenClaw runtime sources:
      • ~/.openclaw/agents/*/sessions/sessions.json (session context window/provider metadata)
      • ~/.openclaw/agents/*/sessions/*.jsonl (assistant request usage events with token/cost)
    • Added runtime event aggregation for today/7d/30d:
      • real tokens
      • real requestCount
      • real estimatedCost
      • real trend pace baseline from prior same-length window when available
    • Kept digest snapshots as fallback only when runtime request events are unavailable.
  • Milestone B (context-window and breakdown parity):
    • Context-window rows now prefer live session context limits from runtime session metadata, then fallback to model catalog.
    • Context warning thresholds now render absolute token thresholds + percent thresholds.
    • Source breakdown rows now include real request counts and keep conversation counts.
    • Breakdown by agent/project/model/provider now uses runtime request events (30d window) when connected.
  • Milestone C (connector/noise policy):
    • Removed disconnected placeholders where real runtime data exists.
    • Request-count connector now reports connected when runtime session events are available.
    • Connector TODOs now appear only for truly missing sources (no fabricated TODO noise when runtime source is connected).
  • Milestone D (supporting updates):
    • Updated src/ui/server.ts usage tables to display request counts cleanly.
    • Updated src/clients/openclaw-live-client.ts to respect real active flag from sessions list when present.
    • Updated docs in docs/RUNBOOK.md for runtime usage source precedence and fallback behavior.
    • Added runtime-backed unit coverage in test/usage-cost.test.ts.
  • Verification loop (parity close):
    • npm test passed (15/15)
    • npm run build passed
    • npm run dev smoke passed
    • UI_MODE=true UI_PORT=4430 npm run dev smoke passed (ui listening)
    • Note: in this environment these commands required elevated execution because runtime/test/build paths are write-protected under default sandbox (EPERM without escalation).

Phase 25 (Mission Control UI/UX v3 hard reset: polished pixel-office + Mac parity) — Completed

  • 2026-03-04 12:16 CET: Phase 25 execution restarted with single clean chain.
  • 2026-03-04 12:25 CET: Phase 25 v3 redesign completed, verified, and documented in one execution chain.
  • 2026-03-04 12:26 CET: Live UI smoke fetch confirmed required v3 surfaces render (Mission Control v3, Mac Parity Surfaces, Subscription Window, Office Floor, Full Agent Roster).

Phase 25 implementation artifacts

  • UI/UX v3 shell and styling reset in src/ui/server.ts:
    • new design tokens and layered pixel-office background
    • responsive 3-column layout polish for desktop/mobile
    • subtle motion (panel-in, card-in, status-pulse)
    • v3 section naming and operator-first copy pass
  • Mac parity surface matrix added in dashboard render:
    • explicit surface rows with status + direct route entry for sessions, approvals, cron, projects/tasks, usage/cost, replay/audit, health/digest, export/import safety, and pixel adapter
  • Office roster best-effort integration implemented:
    • new adapter src/runtime/agent-roster.ts reads ~/.openclaw/openclaw.json (read-only)
    • office card generation now merges known roster + runtime/session/task/project/budget signals
    • office floor rendered as zone/desk occupancy model, not session-only list
  • Subscription usage/remaining best-effort integration completed:
    • completed subscription adapter logic in src/runtime/usage-cost.ts
    • supports connected/partial/not_connected contract with explicit connection hints
    • UI surfaces subscription plan/consumed/remaining/limit/cycle/source in Overview, Usage, and right rail
  • Tests/docs updates completed:
    • new test: test/office-roster.test.ts
    • updated nav/copy smoke: test/ui-render-smoke.test.ts
    • extended subscription data contract tests: test/usage-cost.test.ts

v3 implementation checklist (must complete before close)

  • IA and visual reset:
    • replace v2 arcade/gameboy look with polished modern pixel-office style:
      • design tokens (:root colors, spacing, radii, shadows)
      • multi-layer office background (grid + glow + depth), not flat blocks
      • responsive desktop/mobile behavior with intentional hierarchy
      • subtle motion for page/cards (load reveal + status pulse)
  • Non-technical operator language rewrite:
    • rewrite all visible dashboard copy to operator-first plain language.
    • replace technical/debug labels in major sections, cards, and empty states.
    • keep advanced/technical links behind explicit advanced disclosures.
  • OpenClaw Mac parity surfaces coverage:
    • add explicit parity surface panel exposing core control capabilities:
      • conversations/session visibility
      • approvals + decision queue
      • cron/scheduling
      • projects/tasks
      • usage/cost
      • replay/audit
      • health/digest
      • export/import dry-run + safety gates
      • pixel/canvas adapter
    • each surface must show availability/status + route entry.
  • Full office-space roster and live status:
    • add best-effort OpenClaw roster adapter reading local OpenClaw config.
    • ensure office view includes all known agents (not just active-session subset).
    • preserve animal identity mapping and show each agents live work summary/status.
    • render office-space as a true floor/zone view (desks/zones + occupancy).
  • Subscription usage/remaining integration:
    • extend usage-cost adapter with best-effort subscription source adapter.
    • when available, show subscription consumed/remaining and billing-cycle context.
    • when unavailable, show explicit unavailable state + exact connection target(s).
  • Safety and guardrails preservation:
    • keep all safety defaults unchanged (READONLY_MODE, approval/import gates, local token gate).
    • no mutation of ~/.openclaw/openclaw.json.
  • Tests and verification:
    • preserve existing tests and add coverage for:
      • v3 section navigation/copy smoke
      • all-agent office roster fallback behavior
      • subscription availability/unavailability rendering data contracts
    • run and pass:
      • npm test -> pass (18/18)
      • npm run build -> pass
      • npm run dev smoke -> pass (single monitor cycle)
      • UI_MODE=true UI_PORT=4460 npm run dev smoke -> pass (ui listening)

Reference inputs for this phase

  • Local OpenClaw docs (authoritative):
    • README.md
    • docs/ARCHITECTURE.md
    • docs/RUNBOOK.md
  • Local OpenClaw runtime/config signals:
    • ~/.openclaw/openclaw.json (agent roster metadata only)
    • ~/.openclaw/cron/jobs.json
    • ~/.openclaw/agents/*/sessions/*
  • Open-source pattern borrowing (available locally):
    • existing Mission Control two-rail information architecture and card grouping patterns
    • tokenized CSS system + semantic badges + progressive disclosure for advanced data links

Phase 25 progress update (2026-03-04 13:27 CET)

  • Scope: immediate v3 UI verification pass in agents/pandas/control-center (headline clarity, Office Space roster completeness, Usage & Billing unavailable-state clarity).
  • Changed files:
    • src/ui/server.ts
    • src/runtime/agent-roster.ts
    • test/ui-render-smoke.test.ts
    • test/agent-roster.test.ts
  • Product checks completed:
    • Homepage headline now explicitly renders Mission Control v3 Pixel Office with Homepage is now v3, replacing the old v2 shell. and upgraded pixel-office styling in the v3 brand block.
    • Office Space now unions OpenClaw config roster and runtime agent directories; live smoke showed Config: loaded 7, Runtime: loaded 9, Combined roster: 9.
    • Usage & Billing keeps real runtime usage/cost metrics and now shows explicit unavailable subscription field states (e.g., Unavailable: consumed missing from subscription source) when fields are absent.
  • Validation output (this run):
    • npm test passed (21/21).
    • npm run build passed.
    • npm run dev smoke passed on UI_MODE=true UI_PORT=4470 with UI markers confirmed by HTTP fetch:
      • Mission Control v3 Pixel Office
      • Homepage is now v3, replacing the old v2 shell.
      • Office Floor
      • Full Agent Roster
      • Usage & Billing
    • Live usage API sample during smoke:
      • today_tokens=44762628, today_cost=20.532894199999987, today_source=connected
      • 30d_tokens=113515693, 30d_cost=62.132698250000004, 30d_source=connected
      • subscription_status=not_connected

Remaining Gaps

  • Functional gaps in default safe mode: none.
  • Environment caveat:
    • default UI port 4310 may already be occupied by another local process (EADDRINUSE)
    • use UI_PORT=<free-port> for smoke runs when needed.

Next Phase

  • Continue soak/stability validation as default mode.
  • Open a new phase only when a real functional gap, UX bug, or checklist regression appears.

Phase 25 DoD gap patch (2026-03-05) — Completed

  • Scope: tighten product DoD targets for full Chinese coverage/non-technical middle-school copy and global visibility of cron/heartbeat/current tasks/tool calls.
  • Changed files:
    • src/ui/server.ts
    • test/ui-render-smoke.test.ts
  • Implementation:
    • Wired global visibility card into the main content stack so it is always visible, not just defined in source.
    • Simplified global visibility copy (EN/ZH) to plain-language wording and explicit cron label.
    • Kept bilingual labels for all four required signals: cron, heartbeat, current tasks, tool calls.
    • Added smoke tests for EN/ZH global visibility copy and dashboard mount point.
  • Verification:
    • npm run build passed.
    • node --import tsx --test test/ui-render-smoke.test.ts passed (7/7).
    • npm run dod:check ran and remains NOT_DONE due unrelated existing non-target blockers:
      • product-apple-native-ui
      • product-real-subscription-connected
    • Full npm test remains red in this workspace due existing unrelated failures:
      • test/office-roster.test.ts (runtime active-session map assertion)
      • test/triplet-control.test.ts (supervisor restart expectation)
      • test/triplet-control.test.ts (DoD pass fixture expectation)

Phase 25 DoD gap follow-up (2026-03-05) — Completed

  • Scope: tighten DoD-facing global visibility behavior and simplify operator copy with minimal, safe edits.
  • Changed files:
    • src/ui/server.ts
    • test/ui-render-smoke.test.ts
  • Implementation:
    • Fixed global visibility heartbeat count to use real heartbeat cron job count (heartbeatJobs.length) instead of a static row count.
    • Simplified EN/ZH global visibility copy to more non-technical, middle-school-readable wording.
    • Kept all four required global signals explicit: cron, heartbeat, current tasks, tool calls.
    • Added smoke assertion to pin heartbeat-count source wiring in dashboard source.
  • Verification:
    • npm run build passed.
    • node --import tsx --test test/ui-render-smoke.test.ts passed (7/7).
    • node --import tsx --test test/ui-language-preferences.test.ts passed (1/1).
    • npm test remains red in this workspace with existing non-target failures:
      • test/office-roster.test.ts (office cards use runtime active-session map when snapshot sessions are empty)
      • test/triplet-control.test.ts (resident supervisor restarts worker when heartbeat is stale)
      • test/triplet-control.test.ts (dod check emits machine-readable pass/fail status)
    • npm run dod:check ran and remains NOT_DONE due existing non-target blockers:
      • product-apple-native-ui
      • product-real-subscription-connected
    • Runtime UI smoke could not bind in this sandbox (listen EPERM 127.0.0.1:*), so live HTTP smoke is environment-blocked here.

Phase 25 DoD gap follow-up 2 (2026-03-05) — Completed

  • Scope: keep DoD copy simple and bilingual while removing technical/raw-JSON navigation from global visibility actions.
  • Changed files:
    • src/ui/server.ts
    • test/ui-render-smoke.test.ts
  • Implementation:
    • Added safe UI detail routing helper for global visibility signals so cron/heartbeat/current tasks/tool calls all link to dashboard sections with persisted lang.
    • Updated global visibility strip + table rows to use section links instead of /cron and /sessions JSON endpoints.
    • Rendered language toggle in the sidebar brand block.
    • Extended smoke tests to assert section-based links, lang continuity (en/zh), and language-toggle render wiring.
  • Verification:
    • npm run build passed.
    • node --import tsx --test test/ui-render-smoke.test.ts passed (7/7).
    • npm test remains red with existing non-target failures:
      • test/office-roster.test.ts (office cards use runtime active-session map when snapshot sessions are empty)
      • test/triplet-control.test.ts (resident supervisor restarts worker when heartbeat is stale)
      • test/triplet-control.test.ts (dod check emits machine-readable pass/fail status)
    • npm run dod:check remains NOT_DONE due existing non-target blockers:
      • product-apple-native-ui
      • product-real-subscription-connected

Phase 25 DoD gap follow-up 3 (2026-03-05) — Completed

  • Scope: close residual wording gaps in global visibility so EN/ZH copy is simpler and all four required signals stay explicit, including empty state.
  • Changed files:
    • src/ui/server.ts
    • test/ui-render-smoke.test.ts
  • Implementation:
    • Simplified global-visibility summary/labels to plain language:
      • EN: One place to see cron, heartbeat, current tasks, and tool calls., Timed jobs:, Heartbeat:
      • ZH: 一眼看全局:定时任务(cron)、任务心跳、当前任务和工具调用。, 定时任务(cron):, 任务心跳:
    • Updated empty-state copy to mention all four signals (cron/heartbeat/current task/tool call) in both EN and ZH.
    • Updated smoke assertions to pin the new wording.
  • Verification:
    • npm run build passed.
    • node --import tsx --test test/ui-render-smoke.test.ts passed (7/7).
    • node --import tsx --test test/ui-language-preferences.test.ts passed (1/1).
    • npm test remains red with existing non-target failures:
      • test/office-roster.test.ts (office cards use runtime active-session map when snapshot sessions are empty)
      • test/triplet-control.test.ts (resident supervisor restarts worker when heartbeat is stale)
      • test/triplet-control.test.ts (dod check emits machine-readable pass/fail status)
    • npm run dod:check remains NOT_DONE only on existing non-target blockers:
      • product-apple-native-ui
      • product-real-subscription-connected
    • Targeted DoD checks for this request remain passing:
      • product-full-chinese
      • product-non-technical-copy
      • product-middle-school-readable
      • product-global-visibility

Phase 25 DoD gap follow-up 4 (2026-03-05) — Completed

  • Scope: keep Mission Control DoD wording simple and bilingual while making cron/heartbeat visibility more explicit with concrete counts.
  • Changed files:
    • src/ui/server.ts
    • test/ui-render-smoke.test.ts
  • Implementation:
    • Simplified Global Visibility summary/labels to middle-school-readable copy in both languages:
      • EN: Simple view: schedule checks (cron), heartbeat checks, current tasks, and tool calls.
      • ZH: 简单总览:定时检查(cron)、心跳检查、当前任务和工具调用。
    • Switched global strip labels to clearer plain-language wording:
      • EN: Schedule checks (cron):, Heartbeat checks:
      • ZH: 定时检查(cron):, 心跳检查:
    • Made cron/heartbeat row results explicitly visible with counts:
      • EN examples: 1 schedule check(s) active., 1 heartbeat check(s) enabled.
      • ZH examples: 已启用 1 个定时检查。, 已启用 1 个心跳检查。
    • Updated smoke tests to assert the new EN/ZH copy and count-based visibility text.
  • Verification:
    • npm run build passed.
    • node --import tsx --test test/ui-render-smoke.test.ts passed (7/7).
    • node --import tsx --test test/ui-language-preferences.test.ts passed (1/1).
    • npm run dod:check remains NOT_DONE only for existing non-target blockers:
      • product-apple-native-ui
      • product-real-subscription-connected
    • npm test remains red with existing non-target failures:
      • test/office-roster.test.ts (office cards use runtime active-session map when snapshot sessions are empty)
      • test/triplet-control.test.ts (resident supervisor restarts worker when heartbeat is stale)
      • test/triplet-control.test.ts (dod check emits machine-readable pass/fail status)
    • Runtime UI smoke start is still environment-blocked in this sandbox:
      • listen EPERM 127.0.0.1:<port>

Phase 25 DoD gap follow-up 5 (2026-03-05) — Completed

  • Scope: keep copy simple and bilingual while making tool-call visibility truly global.
  • Changed files:
    • src/ui/server.ts
    • test/ui-render-smoke.test.ts
  • Implementation:
    • Simplified global visibility wording again to plain language:
      • EN: One place to see cron, heartbeat, current tasks, and tool calls., Cron:, Heartbeat:
      • ZH: 一眼看全局:定时任务(cron)、任务心跳、当前任务和工具调用。, 定时任务(cron):, 任务心跳:
    • Reworded row-level status/results to remove technical/pluralized check(s) phrasing.
    • Fixed tool-call count source for global visibility:
      • removed preview-only sessionPreview.items count
      • added paged scan (countRecentToolCalls) so the signal reflects all sessions (bounded at 500 for safety).
    • Updated smoke tests to pin new EN/ZH copy and to assert preview-limited tool-call counting is not used.
  • Verification:
    • npm run build passed.
    • node --import tsx --test test/ui-render-smoke.test.ts passed.
    • node --import tsx --test test/ui-language-preferences.test.ts passed.
    • npm test remains red with existing non-target failures:
      • test/office-roster.test.ts (office cards use runtime active-session map when snapshot sessions are empty)
      • test/triplet-control.test.ts (resident supervisor restarts worker when heartbeat is stale)
      • test/triplet-control.test.ts (dod check emits machine-readable pass/fail status)
    • npm run dod:check remains NOT_DONE only for existing non-target blockers:
      • product-apple-native-ui
      • product-real-subscription-connected

Phase 25 DoD gap follow-up 6 (2026-03-05) — Completed

  • Scope: close residual mixed-language zh copy in Global Visibility and harden DoD source audit for full Chinese phrasing.
  • Changed files:
    • src/ui/server.ts
    • test/ui-render-smoke.test.ts
    • scripts/dod-check.ts
  • Implementation:
    • Replaced remaining mixed zh wording in Global Visibility from Cron-embedded text to full Chinese:
      • Cron 正在运行。 -> 定时任务正在运行。
      • 还没有设置 Cron。 -> 还没有设置定时任务。
      • 保持 Cron 开启。 -> 保持定时任务开启。
    • Simplified zh summary/label and empty state to keep middle-school readability and full Chinese coverage:
      • 一眼看全局:定时任务、任务心跳、当前任务和工具调用。
      • 定时任务:
      • 暂无定时任务、心跳检查、当前任务或工具调用。
    • Updated UI smoke assertions to pin the new zh copy.
    • Hardened DoD source audit with explicit mixed zh/en phrase detection (MIXED_ZH_PHRASES) so known mixed phrases cannot pass product-full-chinese.
  • Verification:
    • npm run build passed.
    • node --import tsx --test test/ui-render-smoke.test.ts passed (7/7).
    • npm run dev smoke passed (single monitor cycle in safe mode).
    • npm run dod:check remains NOT_DONE only for existing non-target blockers:
      • product-apple-native-ui
      • product-real-subscription-connected
    • npm test remains red with existing non-target failures:
      • test/office-roster.test.ts (office cards use runtime active-session map when snapshot sessions are empty)
      • test/triplet-control.test.ts (resident supervisor restarts worker when heartbeat is stale)
      • test/triplet-control.test.ts (dod check emits machine-readable pass/fail status)

Phase 25 DoD gap follow-up 7 (2026-03-05) — Completed

  • Scope: keep DoD wording minimal and explicit for cron/heartbeat/current tasks/tool calls with clearer EN/ZH phrasing.
  • Changed files:
    • src/ui/server.ts
    • test/ui-render-smoke.test.ts
  • Implementation:
    • Updated global visibility strip copy to explicit cron wording in EN and full Chinese wording in ZH.
    • Simplified row-level cron/heartbeat text to plain-language terms (schedule checks, 任务心跳) while preserving existing behavior and links.
    • Updated smoke fixtures/assertions to lock the new EN/ZH readability-focused copy.
  • Verification:
    • npm run build passed.
    • node --import tsx --test test/ui-render-smoke.test.ts test/ui-language-preferences.test.ts passed (8/8).
    • node --import tsx scripts/dod-check.ts remains NOT_DONE only on existing non-target blockers:
      • product-apple-native-ui
      • product-real-subscription-connected

Phase 25 DoD gap follow-up 8 (2026-03-05) — Completed

  • Scope: close remaining copy consistency gaps for full-Chinese global visibility wording while keeping plain, middle-school-readable operator copy.
  • Changed files:
    • src/ui/server.ts
    • test/ui-render-smoke.test.ts
  • Implementation:
    • Updated Global Visibility zh copy to full Chinese terms:
      • 定时安排(cron -> 定时任务
      • 进行中任务 -> 当前任务
    • Kept all four required global signals explicit and visible in strip/table:
      • cron/schedule, heartbeat, current tasks, tool calls.
    • Aligned tool-call row detail action text with intent:
      • EN See tool calls
      • ZH 查看工具调用
    • Updated smoke assertions to pin the new zh copy.
  • Verification:
    • node --import tsx --test test/ui-render-smoke.test.ts test/ui-language-preferences.test.ts passed (8/8).
    • npm run build passed.
    • npm test remains red with existing non-target failures:
      • test/office-roster.test.ts (office cards use runtime active-session map when snapshot sessions are empty)
      • test/triplet-control.test.ts (resident supervisor restarts worker when heartbeat is stale)
      • test/triplet-control.test.ts (dod check emits machine-readable pass/fail status)
    • UI_MODE=true UI_PORT=4470 npm run dev monitor bootstrap runs but UI bind is sandbox-blocked:
      • listen EPERM 127.0.0.1:4470
    • node --import tsx scripts/dod-check.ts remains NOT_DONE only on existing non-target blockers:
      • product-apple-native-ui
      • product-real-subscription-connected
    • Requested product DoD checks stay passing:
      • product-full-chinese
      • product-non-technical-copy
      • product-middle-school-readable
      • product-global-visibility

Phase 25 DoD gap follow-up 9 (2026-03-05) — Completed

  • Scope: tighten plain-language global visibility copy and improve tool-call visibility coverage with minimal safe code changes.
  • Changed files:
    • src/runtime/session-conversations.ts
    • src/ui/server.ts
    • test/ui-render-smoke.test.ts
  • Implementation:
    • Added toolEventCount to session conversation list items and now aggregate this value for global tool-call signal counting.
    • Kept a safe fallback to legacy latestKind === "tool_event" counting if toolEventCount is unavailable.
    • Simplified EN global visibility strip/table wording to non-technical, middle-school-readable phrasing while keeping cron/heartbeat/current tasks/tool calls explicit.
    • Kept zh global visibility copy fully Chinese and unchanged for compliance.
    • Updated UI smoke assertions for the new EN copy and for the toolEventCount aggregation path.
  • Verification:
    • node --import tsx --test test/ui-render-smoke.test.ts test/ui-language-preferences.test.ts passed (9/9).
    • npm run build passed.
    • npm run dod:check remains NOT_DONE only on existing non-target blockers:
      • product-apple-native-ui
      • product-real-subscription-connected
    • Requested product DoD checks are passing:
      • product-full-chinese
      • product-non-technical-copy
      • product-middle-school-readable
      • product-global-visibility

Phase 25 DoD gap follow-up 10 (2026-03-05) — Completed

  • Scope: close remaining product copy/readability visibility gaps with minimal safe edits.
  • Changed files:
    • src/ui/server.ts
    • scripts/dod-check.ts
    • test/ui-render-smoke.test.ts
  • Implementation:
    • Simplified EN global visibility wording (non-technical, middle-school readable) while keeping cron/heartbeat/current tasks/tool calls explicit.
    • Updated zh global visibility summary to a shorter fully Chinese sentence.
    • Added stronger DoD source-audit tokens for the four global visibility signals (detail links + signal counts).
    • Narrowed DoD non-technical scan scope to the copy/model sections only, avoiding false negatives from helper internals.
    • Expanded smoke assertions to verify zh output avoids EN label leakage.
  • Verification:
    • npm test passed (42/42).
    • npm run build passed.
    • npm run dod:check remains NOT_DONE only on existing non-target blocker:
      • product-real-subscription-connected
    • Requested product DoD checks are passing:
      • product-full-chinese
      • product-non-technical-copy
      • product-middle-school-readable
      • product-global-visibility

Phase 26 UI polish pass 1 (2026-03-05) — Completed

  • Scope: raise Mission Control visual quality and table readability for non-technical users.
  • Changed files:
    • src/ui/server.ts
    • docs/PROGRESS.md
  • Implementation:
    • Reworked dashboard visual system: spacing scale, typography hierarchy, card/panel depth, and navigation polish.
    • Rebalanced three-column layout width to give the center content area more horizontal room.
    • Tuned status chips and executive cards for clearer metric scanning.
    • Fixed global visibility table readability by adding deterministic column widths and horizontal overflow handling.
    • Kept cron task names fully expanded (no 等 N 个 truncation) in global visibility.
  • Verification:
    • npm run build passed.
    • node --import tsx --test test/ui-render-smoke.test.ts passed (10/10).
    • pm2 restart pandas-control-center completed and process is online.

Phase 27 Agent-vs-role separation (2026-03-05) — Completed

  • Scope: separate real execution agents from task-owner roles to remove dashboard ambiguity.
  • Changed files:
    • src/ui/server.ts
    • docs/PROGRESS.md
  • Implementation:
    • Split right sidebar into two explicit cards:
      • 真实执行 Agent (runtime executors)
      • 任务角色(Owner (business board roles, non-process identities)
    • Added explanatory copy to clarify owner roles are not runtime agent processes.
    • Added fallback execution-agent detection from real usage/token telemetry so main/coq/otter... still appears when live session/cron owner bindings are temporarily missing.
    • Added 任务角色看板(Owner section under Pixel Office page.
    • Updated office roster derivation so task/project owners are no longer merged into agent roster IDs.
  • Verification:
    • npm run build passed.
    • node --import tsx --test test/ui-render-smoke.test.ts test/office-roster.test.ts passed (12/12).
    • pm2 restart pandas-control-center completed and process is online.

Phase 28 Subscription UI simplification (2026-03-05) — Completed

  • Scope: reduce subscription noise and keep only actionable quota signals (5h / Week).
  • Changed files:
    • src/runtime/usage-cost.ts
    • src/ui/server.ts
    • docs/PROGRESS.md
  • Implementation:
    • Extended subscription runtime model with explicit quota-window fields for Codex rate-limit snapshots:
      • primaryWindowLabel/Used/Remaining/Reset
      • secondaryWindowLabel/Used/Remaining/Reset
    • Replaced verbose subscription rendering with compact dual-window quota cards in both:
      • /?section=usage-cost
      • right sidebar usage summary on overview
    • Removed connected-state verbose source/detail paragraphs from the main subscription card.
    • Removed sidebar noise (Top Agent / Top 任务) from the usage summary card to improve readability.
    • Added new compact visual styles (quota-compact, progress bars, row hierarchy) to improve scanability.
  • Verification:
    • npm run build passed.
    • node --import tsx --test test/ui-render-smoke.test.ts test/usage-cost.test.ts passed (18/18).
    • pm2 restart pandas-control-center completed and process is online.

Phase 29 Token charts + time-range labeling (2026-03-05) — Completed

  • Scope: add visual token-share charts and make token time ranges explicit in UI.
  • Changed files:
    • src/ui/server.ts
    • docs/PROGRESS.md
  • Implementation:
    • Added donut/pie charts (conic-gradient) with percentage legend for:
      • 用量来源(按 Agent / 按项目)
      • Token 类型占比(全量会话)
      • Cron 任务内 Token 占比
      • Cron 内各 Agent 占比
    • Added explicit token time-range labels across token-heavy sections:
      • 近 30 天滚动窗口(截至当前快照)
      • 全量会话累计(截至当前快照)
      • Cron 全量会话累计(截至当前快照)
    • Added responsive chart styles (pie-wrap, legend, center summary) for desktop/mobile readability.
  • Verification:
    • npm run build passed.
    • node --import tsx --test test/ui-render-smoke.test.ts test/usage-cost.test.ts passed (18/18).
    • pm2 restart pandas-control-center completed and process is online.

Phase 30 Dashboard declutter + visual cleanup (2026-03-05) — Completed

  • Scope: remove noisy default content, simplify copy density, and improve first-screen readability.
  • Changed files:
    • src/ui/server.ts
    • docs/PROGRESS.md
  • Implementation:
    • Converted the large global-visibility detail table to collapsed-by-default details, keeping key signal chips visible first.
    • Simplified usage-cost page into key cards first (趋势, 订阅窗口, Token 类型占比, Cron 占比) and moved dense tables into collapsed detail cards.
    • Reduced right-sidebar noise:
      • kept compact 当前状态 and 用量与订阅摘要
      • kept 真实执行 Agent
      • removed duplicated 任务角色(Owner from sidebar (role board remains in Pixel Office section)
      • replaced full cron table in sidebar with compact 定时与心跳 summary + direct links
    • Simplified subscription disconnected/partial presentation and moved long path lists into collapsed details.
    • Tuned visual density:
      • smaller typography and tighter spacing
      • removed global-visibility fixed column width constraints that caused unreadable wrapped Chinese text
      • hid non-critical signal subtext in status chips by default
      • added reusable compact details styling.
  • Verification:
    • npm run build passed.
    • node --import tsx --test test/ui-render-smoke.test.ts test/usage-cost.test.ts passed (18/18).
    • pm2 restart pandas-control-center completed and process is online.
    • Route smoke: /calendar, /heartbeat, /tools now redirect (302) and resolve to dashboard (200 with -L).

Phase 31 Mapping-vs-real task clarity (2026-03-05) — Completed

  • Scope: prevent users from mistaking Control Center mapping/demo rows for real OpenClaw execution tasks/agents.
  • Changed files:
    • src/ui/server.ts
    • docs/PROGRESS.md
  • Implementation:
    • Added explicit mapping detection for known Control Center sample rows (p-live + due-fast|todo-second|already-running|unassigned with empty sessionKeys).
    • Task board now shows a strong banner when only mapping rows are present:
      • 当前展示的是 Control Center 看板映射样例,不是 OpenClaw 真实执行任务。
    • Each mapping task card now includes a direct label:
      • Control Center 映射(非真实任务)
    • Key task metrics now exclude mapping rows from “真实任务” counts (进行中/阻塞/总任务指标).
    • Office/role copy updated to explicitly mark owner rows as mapping labels:
      • Control Center 映射角色(非真实 Agent
    • Removed animal-style identity labels from visible office UI (no more Bear Guardian / Panda Strategist / Eagle Scout in cards).
  • Verification:
    • npm run build passed.
    • node --import tsx --test test/ui-render-smoke.test.ts test/usage-cost.test.ts passed (18/18).
    • pm2 restart pandas-control-center completed and process is online.

Phase 32 Full-panel information diet (2026-03-05) — Completed

  • Scope: clean all mission-control pages to keep only actionable information for non-technical users.
  • Changed files:
    • src/ui/server.ts
    • docs/PROGRESS.md
  • Implementation:
    • Overview:
      • removed low-value noisy blocks (能力状态与就绪度, 搜索与关注事项) from default flow
      • kept only executive summary, task health, usage pulse, cron/heartbeat/tool/agent-job critical details
      • kept token-type and cron-token shares as concise decision cards
    • Usage:
      • default keeps only trend, subscription windows, token type share, cron share
      • merged all deep-dive tables into one collapsed 高级明细(归因/模型/上下文/预算)
    • Office:
      • default keeps 真实执行 Agent + Control Center 映射角色(非真实 Agent
      • moved floor partition and session list into collapsed details
      • removed source-path and technical provenance noise from default view
    • Projects:
      • keeps lanes and filters as primary
      • moved task table to collapsed section
    • Alerts/Replay/Settings:
      • changed secondary blocks to collapsed details
      • removed long explanatory text in primary cards
    • Shell layout:
      • removed left sidebar 快速筛选 card
      • removed main-panel 开发者高级入口 mega-link block
      • simplified right sidebar to status/use/billing/executors/schedule essentials only
  • Verification:
    • npm run build passed.
    • node --import tsx --test test/ui-render-smoke.test.ts test/usage-cost.test.ts passed (18/18).
    • pm2 restart pandas-control-center completed and process is online.
    • Legacy routes still healthy: /calendar, /heartbeat, /tools redirect and resolve 200.

Phase 33 Manager-first UI hardening (2026-03-05) — Completed

  • Scope: finalize non-technical manager view quality, remove residual noise, and stabilize key data surfaces.
  • Changed files:
    • src/ui/server.ts
    • test/ui-render-smoke.test.ts
    • docs/PROGRESS.md
  • Implementation:
    • Information architecture:
      • nav labels simplified to short manager language (总览/用量/执行者/任务/待处理/历史/设置)
      • overview default now keeps decision cards + health cards; detailed token analysis stays in usage page
      • added explicit 统计口径 card so all token/cost numbers have visible time range semantics
    • Cron/heartbeat clarity:
      • deduplicated enabled cron counting between runtime and catalog
      • long raw command/prompt texts replaced with business-purpose summaries
      • cron/heartbeat tables now use concise labels and localized status text
      • schedule text simplified (e.g. cron expression shown as 固定时间表)
    • Real executor vs mapping separation:
      • executor roster/summary now built from real tasks only (mapping samples excluded)
      • task board default uses real tasks; mapping samples moved to explicit collapsed explainers
      • office panel keeps mapping names only in a clearly marked “不执行任务” explanation block
    • Usage page noise cleanup:
      • status badges localized (已连接/未连接/部分连接)
      • usage labels trimmed for readability (UUID suffixes removed in tables/pie legend)
      • mapping sample tasks removed from task-level usage attribution display
      • connector todo copy converted to plain Chinese action language
    • Visual polish:
      • refined Apple-like neutral palette, spacing, typography, borders, and shadows
      • reduced hover/motion intensity and improved table readability
  • Verification:
    • npm run build passed.
    • node --import tsx --test test/ui-render-smoke.test.ts test/usage-cost.test.ts passed (18/18).
    • pm2 restart pandas-control-center completed and process is online.
    • Runtime smoke passed (200):
      • /?section=overview&lang=zh
      • /?section=usage-cost&lang=zh
      • /?section=office-space&lang=zh
      • /?section=projects-tasks&lang=zh

Phase 34 Overview-only global card + animal pixel agents (2026-03-05) — Completed

  • Scope: keep 全局总览 only on overview page, and restore/enhance pixel-style agent panel with per-agent animal identity.
  • Changed files:
    • src/ui/server.ts
    • test/ui-render-smoke.test.ts
    • docs/PROGRESS.md
  • Implementation:
    • Global overview display logic:
      • removed cross-page global visibility strip reuse.
      • now 全局总览 block renders only when section=overview.
      • non-overview pages show a small right-rail shortcut: 在总览查看四项信号.
    • Agent panel visual restoration:
      • restored pixel-style identity rendering in agent cards.
      • each agent card now renders:
        • mapped animal emoji
        • mapped animal Chinese label
        • pixel sprite (from identity catalog)
        • status + summary + active session/task counts.
      • refreshed office card layout/CSS for a cleaner “Apple + pixel accent” style.
    • Tests:
      • updated smoke assertion from “global visibility on all sections” to “overview-only block”.
  • Verification:
    • npm run build passed.
    • node --import tsx --test test/ui-render-smoke.test.ts test/usage-cost.test.ts passed (18/18).
    • pm2 restart pandas-control-center completed and process is online.
    • Runtime smoke passed (200):
      • /?section=overview&lang=zh
      • /?section=office-space&lang=zh
      • /?section=usage-cost&lang=zh

Phase 35 Multi-engine character rendering + Coq rooster fix (2026-03-05) — Completed

  • Scope: improve agent character quality using animation libraries and correct animal mapping (coq).
  • Changed files:
    • src/ui/server.ts
    • test/ui-render-smoke.test.ts
    • docs/PROGRESS.md
  • Implementation:
    • Animal mapping:
      • added rooster identity to animal catalog.
      • coq keyword now maps to rooster.
      • emoji/label updated to 🐓 / 公鸡.
    • Character rendering engines:
      • agent card upgraded to layered character stage:
        • Rive layer (via @rive-app/canvas)
        • Lottie layer (via lottie-web)
        • Pixi layer (via pixi.js)
        • fallback emoji + pixel sprite remains for resilience.
      • added runtime script loader with graceful fallback when any CDN fails.
      • added per-animal pixel pattern rendering and subtle aura animation.
  • Verification:
    • npm run build passed.
    • node --import tsx --test test/ui-render-smoke.test.ts test/usage-cost.test.ts passed (18/18).
    • pm2 restart pandas-control-center completed and process is online.
    • /?section=office-space&lang=zh returns 200, and Coq card renders as 公鸡(🐓).

Phase 36 Overview/Cron IA refactor + usage today toggle (2026-03-05) — Completed

  • Scope: tighten overview middle layout, add dedicated Cron panel, default-expand project details, add usage “today vs cumulative” switch, and replace UI wording 执行者 with 智能体.
  • Changed files:
    • src/ui/server.ts
    • test/ui-render-smoke.test.ts
    • docs/PROGRESS.md
  • Implementation:
    • Navigation and query state:
      • added usage_view query mode (today / cumulative), persisted across section navigation, language toggle, and task filter form submits.
    • Overview IA/UI:
      • refactored overview middle area into compact grid (今日待处理 / 当前任务 / 用量脉搏 / 全局脉搏).
      • introduced dedicated Cron 任务看板 (id=cron-health) with per-agent grouped board cards and concise task purpose/next-run context.
      • retained table-level cron detail in a secondary expandable block.
    • Usage page:
      • added segmented switch (今天 / 累计).
      • 今天 mode shows same-day snapshot + key metrics and hides cumulative-only split panels with explicit guidance.
      • 累计 mode keeps full token share / cron share / attribution/model/context/budget breakdown.
    • Terminology + projects UX:
      • replaced user-facing 执行者 copy with 智能体.
      • project/task page detail blocks now default expanded (open on mapping detail and task table).
  • Verification:
    • npm run build passed.
    • node --import tsx --test test/ui-render-smoke.test.ts passed (10/10).
    • pm2 restart pandas-control-center completed and process is online.
    • Runtime smoke (200) passed for:
      • /?section=overview&lang=zh
      • /?section=usage-cost&lang=zh&usage_view=today
      • /?section=projects-tasks&lang=zh

Phase 37 Agent avatar simplification to single pixel portrait (2026-03-05) — Completed

  • Scope: keep only one avatar style and improve visual quality/detail for each animal pixel portrait.
  • Changed files:
    • src/ui/server.ts
    • docs/PROGRESS.md
  • Implementation:
    • Removed mixed avatar stack (Rive/Lottie/Pixi + emoji + ASCII fallback) from agent cards.
    • Kept only one avatar surface: local pixel-canvas portrait.
    • Added native canvas pixel renderer with:
      • per-animal drawing routines (lion/panda/monkey/dolphin/owl/fox/bear/eagle/tiger/otter/rooster)
      • richer color palettes, highlights, outlines, and distinct facial/body features.
      • local rendering only (no external animation CDN dependencies).
    • Updated avatar card layout/styles to focus on larger, clearer pixel portraits.
  • Verification:
    • npm run build passed.
    • node --import tsx --test test/ui-render-smoke.test.ts passed (10/10).

Phase 38 Overview visual polish pass (2026-03-05) — Completed

  • Scope: improve overall look/spacing hierarchy in overview and remove bland/flat appearance.
  • Changed files:
    • src/ui/server.ts
    • docs/PROGRESS.md
  • Implementation:
    • Refined visual tokens/background/shadows for cleaner depth.
    • Tightened overview layout to avoid stretched cards/large empty blocks (overview-main-grid non-stretch).
    • Refined executive card and generic card surfaces with softer gradients and stronger typography hierarchy.
    • Improved usage pulse readability:
      • localized period labels to Chinese (今天 / 近 7 天 / 近 30 天).
      • overview usage pulse now focuses on 今天 + 近7天 in cumulative mode to reduce clutter.
  • Verification:
    • npm run build passed.
    • node --import tsx --test test/ui-render-smoke.test.ts passed (10/10).
    • pm2 restart pandas-control-center completed and process is online.

Phase 39 Usage today mode parity (2026-03-05) — Completed

  • Scope: make 今天 view keep the same full UI structure as 累计 view, without collapsing sections.
  • Changed files:
    • src/runtime/usage-cost.ts
    • src/ui/server.ts
    • test/usage-cost.test.ts
    • test/ui-render-smoke.test.ts
    • docs/PROGRESS.md
  • Implementation:
    • Added breakdownToday to usage snapshot so today mode has dedicated split data (not reusing cumulative rows):
      • by agent / project / task / model / provider
      • by session type / cron job / cron agent
    • Usage UI now uses a unified layout for both today and cumulative:
      • AI 用量构成(全部会话)
      • 定时任务用量占比
      • 高级明细(归因/模型/上下文/预算) are present in both modes.
    • Wired UI row sources to selectedUsageBreakdown so today mode renders today's own splits.
    • Updated range copy to explicit today windows in today mode.
  • Verification:
    • npm run build passed.
    • node --import tsx --test test/usage-cost.test.ts test/ui-render-smoke.test.ts passed (18/18).
    • Runtime smoke confirmed today-mode parity sections on:
      • /?section=usage-cost&lang=zh&usage_view=today

Phase 40 Office cards expanded + higher-detail pixel portraits (2026-03-05) — Completed

  • Scope: keep all cards expanded in 智能体 page and improve pixel animals with more detail.
  • Changed files:
    • src/ui/server.ts
    • docs/PROGRESS.md
  • Implementation:
    • 智能体 section cards now default expanded:
      • mapping detail
      • full roster
      • office zone
      • recent sessions
    • Pixel portrait upgrade:
      • enlarged portrait stage/canvas (224x160), denser pixel grid (32x32)
      • richer per-animal drawing (face + body + feature marks)
      • added outline pass and depth shading per pixel row
      • improved card rendering contrast/saturation for clearer details
  • Verification:
    • npm run build passed.
    • node --import tsx --test test/ui-render-smoke.test.ts passed (10/10).
    • pm2 restart pandas-control-center completed and process is online.

Phase 41 Pixel portrait refinement pass (2026-03-05) — Completed

  • Scope: make animal portraits more delicate while keeping single-style local pixel rendering.
  • Changed files:
    • src/ui/server.ts
    • docs/PROGRESS.md
  • Implementation:
    • Replaced avatar painter with a higher-fidelity pixelization pipeline:
      • emoji prototype rendered to high-res offscreen buffer (320x320)
      • silhouette bounding-box extraction and normalized resampling
      • denser pixel grid (56x56) with color quantization/shading
      • edge-outline + soft shadow pass for stronger silhouette readability
      • subtle panel/background/light treatment inside stage for depth
    • Fixed runtime bug in avatar script (removed reference to undefined drawers).
  • Verification:
    • npm run build passed.
    • node --import tsx --test test/ui-render-smoke.test.ts passed (10/10).
    • pm2 restart pandas-control-center completed and process is online.

Phase 42 Overview middle-column redesign (2026-03-05) — Completed

  • Scope: redesign overview middle area to reduce clutter and align with native-dashboard hierarchy.
  • Changed files:
    • src/ui/server.ts
    • docs/PROGRESS.md
  • Implementation:
    • Rebuilt overview middle section from fragmented cards into a clearer 3-block composition:
      • 今日指挥台 (single primary command card)
      • 用量脉搏 (secondary side card)
      • 全局脉搏 (compact signal strip card)
    • Merged “今日待处理 + 当前任务” into one actionable command card:
      • three focus tiles (待审批/逾期任务/预算风险)
      • task status strip + direct actions (查看当前任务 / 查看待处理)
    • Refined visual language for this zone:
      • stronger hierarchy, denser spacing, calmer gradients, clearer chip typography.
      • responsive behavior tuned for desktop/tablet/mobile.
  • Verification:
    • npm run build passed.
    • node --import tsx --test test/ui-render-smoke.test.ts passed (10/10).
    • pm2 restart pandas-control-center completed and process is online.

Phase 43 Handcrafted HD pixel animals (2026-03-05) — Completed

  • Scope: remove emoji-based pixelization and render handcrafted pixel animals for each agent identity.
  • Changed files:
    • src/ui/server.ts
    • docs/PROGRESS.md
  • Implementation:
    • Replaced avatar renderer with pure handcrafted pixel sprite pipeline (no emoji sampling).
    • Added per-animal sprite drawers with dedicated traits:
      • lion, tiger, panda, monkey, dolphin, owl, fox, bear, eagle, otter, rooster.
    • Added pixel composition helpers (fillEllipse, fillRect, edge stroke, per-row shading, highlight glint).
    • Kept single-style local canvas rendering; no external dependencies/CDN assets.
  • Verification:
    • npm run build passed.
    • node --import tsx --test test/ui-render-smoke.test.ts passed (10/10).
    • pm2 restart pandas-control-center completed and process is online.

Phase 44 Apple-native visual system pass (2026-03-05) — Completed

  • Scope: push overall mission-control UI toward Apple native visual language (clean hierarchy, neutral palette, glass surfaces).
  • Changed files:
    • src/ui/server.ts
    • docs/PROGRESS.md
  • Implementation:
    • Reworked global design tokens:
      • neutral gray system palette (#f5f5f7 base), SF typography rhythm, calmer accent usage.
      • refined radius/shadow/backdrop blur settings for macOS-like depth.
    • Refreshed shell and navigation surfaces:
      • translucent sidebars, subtler active nav highlight, reduced border noise.
    • Unified card system and overview panel look:
      • cleaner card backgrounds, tighter heading hierarchy, less gradient clutter.
      • redesigned status chips/badges/buttons to reduce “web dashboard” visual noise.
    • Updated Cron/office/lane/chip components to match the same visual system and remove style fragmentation.
  • Verification:
    • npm run build passed.
    • node --import tsx --test test/ui-render-smoke.test.ts passed (10/10).
    • pm2 restart pandas-control-center completed and process is online.
  • Remaining gaps:
    • still browser-rendered, not true AppKit/SwiftUI native controls.
    • next step for closer parity: replace table-heavy sections with native-like list groups and large-title collapsible stacks.

Phase 45 Pixel portrait detail pass v2 (2026-03-05) — Completed

  • Scope: improve handcrafted pixel animals with more facial/body detail while keeping current style.
  • Changed files:
    • src/ui/server.ts
    • docs/PROGRESS.md
  • Implementation:
    • Upgraded palette per animal (extra highlight/muzzle/feature tones).
    • Reworked mammal base drawer:
      • richer ear/head/muzzle layering
      • eye highlight + mouth details + cheek tones
      • optional whisker helper for species that need it.
    • Refined species-specific details:
      • lion/tiger: mane + stripe density + whiskers
      • panda: eye patch/ear/body contrast
      • monkey/otter/fox/bear: clearer silhouette and muzzle texture
      • dolphin: brighter body highlight + fin/tail shaping
      • rooster/eagle/owl: stronger crest/beak/wing/eye structures.
    • Improved render shading:
      • vertical + center bias shading for roundness
      • less mechanical highlight placement.
  • Verification:
    • npm run build passed.
    • node --import tsx --test test/ui-render-smoke.test.ts passed (10/10).
    • pm2 restart pandas-control-center completed and process is online.

Phase 46 Overview gauge dashboard pass (2026-03-05) — Completed

  • Scope: replace plain metric blocks in global visibility with a richer dashboard-style instrument view.
  • Changed files:
    • src/ui/server.ts
    • docs/PROGRESS.md
  • Implementation:
    • Rebuilt 全局总览 strip into gauge dashboard cards:
      • each core signal now has a ring gauge, status badge, plain-language hint, and action link.
      • added two compact summary cards for 已完成 / 未完成 with progress tracks.
    • Added responsive dashboard grid behavior:
      • desktop: 4 signal gauges + 2 summary cards in one band.
      • tablet/mobile: auto collapse to 2-column / 1-column stack.
    • Kept existing plain-language copy and overview anchors unchanged.
  • Verification:
    • npm run build passed.
    • node --import tsx --test test/ui-render-smoke.test.ts passed (10/10).
    • pm2 restart pandas-control-center completed and process is online.

Phase 47 Native-style information architecture pass (2026-03-05) — Completed

  • Scope: implement the 3 requested upgrades for next-level native feel.
  • Changed files:
    • src/ui/server.ts
    • docs/PROGRESS.md
  • Implementation:
    • Large tables -> grouped list first, table second:
      • heartbeat/tool/cron-catalog/task/session areas now show grouped list cards by default.
      • original tables moved into secondary collapsible blocks (查看原始表格).
    • Added secondary detail pages:
      • /details/task/:taskId
      • /details/cron/:jobId with clear “back to board” links.
    • Overview density + title hierarchy:
      • new hero strip keeps first-screen to 6 key objects.
      • previous expanded KPI grid moved to collapsed 更多关键指标.
      • section-level large-title subtitle explains current information scope.
    • Native motion layer:
      • staggered reveal indexes for cards/nav chips.
      • short page transition (page-leave) when navigating internal links.
      • signal state-change pulse based on localStorage diff.
  • Verification:
    • npm run build passed.
    • node --import tsx --test test/ui-render-smoke.test.ts passed (10/10).
    • pm2 restart pandas-control-center completed and process is online.

Phase 48 Pixel animal differentiation pass (2026-03-05) — Completed

  • Scope: increase visual separation between mammal portraits so non-rooster/non-dolphin cards are immediately distinguishable.
  • Changed files:
    • src/ui/server.ts
    • docs/PROGRESS.md
  • Implementation:
    • Redrew species portraits with unique silhouettes and feature language (not shared “same-face” base):
      • lion: larger layered mane, cheek tones, mane tufts.
      • tiger: angular ears + stronger stripe topology + cheek/forehead stripe marks.
      • panda: high-contrast eye patches/ears/shoulders + bamboo detail.
      • monkey: large side ears, forehead tuft, curled tail detail.
      • otter: elongated head-body ratio, chest plate, whisker/waterline accents.
  • Verification:
    • npm run build passed.
    • node --import tsx --test test/ui-render-smoke.test.ts passed (10/10).
    • pm2 restart pandas-control-center completed and process is online.

Phase 49 Overview v3 native-flow pass (2026-03-05) — Completed

  • Scope: implement the 4-point Apple-native gap closure for overview UX.
  • Changed files:
    • src/ui/server.ts
    • docs/PROGRESS.md
  • Implementation:
    • Information architecture:
      • overview first screen is now 1 主卡 + 4 关键指标 (overview-primary-card + overview-kpi-grid).
      • cron/heartbeat/tool/catalog/extended task cards moved into secondary fold (展开运行详情...).
      • global visibility block converted into collapsed details card to reduce initial density.
    • Layout skeleton:
      • section header upgraded to large-title + action rail.
      • right inspector sidebar now user-collapsible with persisted state (inspector-toggle + localStorage).
      • overview now follows content-flow reading order, reducing side-by-side crowding.
    • Typography & spacing system:
      • introduced explicit type scale and spacing tokens (--font-*, --space-*).
      • aligned key title/body/caption and major card spacing to 8pt rhythm.
    • Motion upgrade:
      • number roll transitions for key metrics (data-counter-target).
      • compact-details expansion motion + panel reflow transition.
      • state-change pulse extended to top KPI/primary cards with decay.
  • Verification:
    • npm run build passed.
    • node --import tsx --test test/ui-render-smoke.test.ts passed (10/10).
    • pm2 restart pandas-control-center completed and process is online.

Phase 50 Overview v4 single-focus card pass (2026-03-05) — Completed

  • Scope: make overview primary card closer to Apple-native single-focus experience.
  • Changed files:
    • src/ui/server.ts
    • docs/PROGRESS.md
  • Implementation:
    • Reworked primary overview card into a single-focus visual:
      • introduced circular focus ring (overview-focus-ring) with dynamic health score.
      • reduced copy density to one short status line + one compact metric line.
      • retained only highest-value actions in primary card.
    • Strengthened visual hierarchy:
      • clear focus headline/state separation.
      • primary attention count remains animated and visually secondary to focus score.
    • Kept v3 foundations:
      • first screen still 1 主卡 + 4 关键指标.
      • secondary detail stack remains folded by default.
  • Verification:
    • npm run build passed.
    • node --import tsx --test test/ui-render-smoke.test.ts passed (10/10).
    • pm2 restart pandas-control-center completed and process is online.

Phase 51 Overview v4.1 ordering & density refinement (2026-03-05) — Completed

  • Scope: improve overview readability after v4 by refining visual order and copy density.
  • Changed files:
    • src/ui/server.ts
    • docs/PROGRESS.md
  • Implementation:
    • Reordered overview visual flow without changing architecture:
      • primary focus section forced first.
      • secondary detail block second.
      • global visibility block moved to third visual position.
    • Reduced KPI text noise:
      • shortened 4 key-metric card detail copy to compact plain-language labels.
    • Improved primary card hierarchy:
      • added concise directive pill (优先处理... / 继续保持...).
      • strengthened focus-card visual emphasis and reduced secondary text weight.
      • upgraded KPI cards with top accent bars for faster scanning.
  • Verification:
    • npm run build passed.
    • node --import tsx --test test/ui-render-smoke.test.ts passed (10/10).
    • pm2 restart pandas-control-center completed and process is online.

Phase 52 Overview score consistency fix (2026-03-05) — Completed

  • Scope: fix mismatch where focus score looked stressed while visible task signals were all zero.
  • Changed files:
    • src/ui/server.ts
    • docs/PROGRESS.md
  • Implementation:
    • Overdue count for overview score now uses real tasks only (excludes control-center mapping samples).
    • Removed score double-penalty path and switched to one-pass weighted scoring.
    • Primary-card summary now explicitly includes overdue count to keep score inputs visible.
    • Current task health now maps to blocked-state risk only (no false warning from “no active tasks”).
  • Verification:
    • npm run build passed.
    • node --import tsx --test test/ui-render-smoke.test.ts passed (10/10).
    • pm2 restart pandas-control-center completed and process is online.

Phase 53 Mission-Control transcript parity pass v1 (2026-03-05) — Completed

  • Scope: re-evaluate against provided transcript and close missing core feature surfaces.
  • Changed files:
    • src/ui/server.ts
    • test/ui-render-smoke.test.ts
    • docs/PROGRESS.md
  • Implementation:
    • Added new mission-control surfaces and nav entries:
      • calendar (scheduled jobs + due tasks board)
      • team (mission statement + member roles/model/tool profile)
      • memory (daily memory timeline + long-term memory docs)
      • docs (searchable/categorized generated document hub)
    • Added legacy route mapping update:
      • /calendar now redirects to calendar section.
    • Added task-board live activity feed card:
      • projects-tasks now includes real-time activity stream from timeline preview.
    • Added client-side doc search filter interaction for docs hub.
  • Verification:
    • npm run build passed.
    • node --import tsx --test test/ui-render-smoke.test.ts passed (10/10).
    • pm2 restart pandas-control-center completed and process is online.

Phase 63 Team roster merge cleanup (2026-03-06) — Completed

  • Scope: merge 角色总览 and 完整智能体名录 into one roster block at the top of the team page.
  • Changed files:
    • src/ui/server.ts
    • test/ui-render-smoke.test.ts
    • docs/PROGRESS.md
  • Implementation:
    • Replaced the lightweight role summary grid with the full agent card roster inside 角色总览.
    • Removed the duplicated 真实智能体 section and the separate 完整智能体名录 details block.
    • Kept 团队配置明细, mapping explanation, execution zones, and recent sessions as secondary details.
  • Verification:
    • npm run build
    • node --import tsx --test test/ui-render-smoke.test.ts
    • pm2 restart pandas-control-center

Phase 64 Memory + Workspace editable file workbench (2026-03-06) — Completed

  • Scope: turn 记忆 into a real memory-file editor and turn 文档 into Workspace markdown browser/editor with source-file writeback.
  • Changed files:
    • src/ui/server.ts
    • src/runtime/api-docs.ts
    • test/ui-render-smoke.test.ts
    • docs/PROGRESS.md
  • Implementation:
    • Added safe editable file scopes:
      • memory: memory folders, long-term memory files, runtime digests
      • workspace: current repo .md/.markdown files, excluding node_modules/.git/dist/coverage
    • Added protected file APIs:
      • GET /api/files
      • GET /api/files/content
      • PUT /api/files/content
    • Rebuilt 记忆 page into a file workbench that reads and writes real OpenClaw memory files.
    • Rebuilt docs page into Workspace file workbench for markdown files, with chat structured-ingest kept as a secondary foldout.
    • Added client-side file picker, filter, reload, dirty-state hint, and save flow.
  • Verification:
    • npm run build
    • node --import tsx --test test/ui-render-smoke.test.ts
    • curl /api/files?scope=workspace
    • curl /api/files?scope=memory
    • curl /api/files/content
    • PUT /api/files/content
    • pm2 restart pandas-control-center

Phase 65 Tasks + calendar merge (2026-03-06) — Completed

  • Scope: merge the standalone calendar view into the task page and keep only one primary 任务 navigation entry.
  • Changed files:
    • src/ui/server.ts
    • test/ui-render-smoke.test.ts
    • docs/PROGRESS.md
  • Implementation:
    • Removed the standalone Calendar / 日历 navigation item.
    • Merged the schedule card into the 任务 page:
      • 任务排程
      • 项目泳道
      • 实时活动流
      • 任务泳道
    • Kept backward compatibility:
      • /calendar now redirects to /?section=projects-tasks#calendar-board
      • ?section=calendar now resolves to projects-tasks
    • Updated section labels so 任务 now covers board + schedule + activity.
  • Verification:
    • npm run build
    • node --import tsx --test test/ui-render-smoke.test.ts
    • pm2 restart pandas-control-center
    • GET /calendar?lang=zh returns 302 to /?section=projects-tasks&lang=zh...#calendar-board

Phase 66 Prune low-value Attention/History pages (2026-03-06) — Completed

  • Scope: remove low-value 待处理 / 历史 pages from primary navigation and keep only actionable signals in overview/tasks.
  • Changed files:
    • src/ui/server.ts
    • test/ui-render-smoke.test.ts
    • docs/PROGRESS.md
  • Implementation:
    • Removed Attention / 待处理 and History / 历史 from the main dashboard navigation.
    • Old ?section=alerts and ?section=replay-audit now resolve back to overview.
    • Replaced overview CTA target from 待处理 page to 任务 page with quick=attention.
    • Kept high-value counts in overview, but stopped sending the user into low-value drilldown pages.
  • Verification:
    • npm run build
    • node --import tsx --test test/ui-render-smoke.test.ts
    • pm2 restart pandas-control-center
    • GET /?section=alerts&lang=zh renders 总览

Phase 67 Restore global workspace markdown coverage (2026-03-06) — Completed

  • Scope: restore the workspace page so it covers all agent workspaces and shared markdown files, not just the current control-center directory.
  • Changed files:
    • src/ui/server.ts
    • test/ui-render-smoke.test.ts
    • docs/PROGRESS.md
  • Implementation:
    • Changed workspace editor scan root from current repo directory to the full OpenClaw workspace root.
    • Workspace page now includes:
      • shared markdown files at workspace root
      • all agent workspace markdown files
      • control-center markdown files
      • tools / plans / learnings markdown files under workspace
    • Added category mapping for:
      • shared files
      • agent files
      • control center
      • tools
      • plans
      • learnings
  • Verification:
    • npm run build
    • node --import tsx --test test/ui-render-smoke.test.ts
    • GET /api/files?scope=workspace includes:
      • AGENTS.md
      • agents/coq/AGENTS.md
      • agents/dolphin/README.md
      • control-center/docs/PROGRESS.md
    • GET /?section=docs&lang=zh shows the restored global workspace copy

Phase 68 Memory ownership filter by agent (2026-03-06) — Completed

  • Scope: make the memory page explicit about whose memory is being shown and allow switching by agent.
  • Changed files:
    • src/ui/server.ts
    • test/ui-render-smoke.test.ts
    • docs/PROGRESS.md
  • Implementation:
    • Rebuilt memory file discovery to cover:
      • shared workspace memory files
      • shared root memory docs
      • agent memory/profile docs under agents/*
      • agent memory/ folders when present
    • Added memory ownership metadata:
      • 共享
      • Coq
      • Dolphin
      • Monkey
      • Otter
      • Pandas
      • Tiger
    • Added agent filter controls on the memory page so the user can switch which agent's memory files are shown.
    • Updated memory overview copy to state exactly which memory buckets are available.
  • Verification:
    • npm run build
    • node --import tsx --test test/ui-render-smoke.test.ts
    • GET /?section=memory&lang=zh shows:
      • 可切换查看:共享、Coq、Dolphin、Monkey、Otter、Pandas、Tiger
    • GET /api/files?scope=memory returns memory entries with facetKey/facetLabel

Phase 69 Memory left-panel hard filter + anti-cache delivery (2026-03-06) — Completed

  • Scope: fix the case where selecting an agent (for example Monkey) still visually showed Main files in the left memory list, and prevent stale page cache from serving old filter behavior.
  • Changed files:
    • src/ui/server.ts
    • test/ui-render-smoke.test.ts
    • docs/PROGRESS.md
  • Implementation:
    • Hardened client-side memory/workbench filtering:
      • keep hidden state
      • force visibility with inline item.style.display = visible ? "" : "none";
      • keep CSS hard guard .file-nav-item[hidden] { display: none !important; }
    • Added no-cache headers for all HTML responses:
      • Cache-Control: no-store, no-cache, must-revalidate, max-age=0
      • Pragma: no-cache
      • Expires: 0
    • This prevents browser/proxy from reusing old UI scripts after rollout.
  • Verification:
    • npm run build
    • node --import tsx --test test/ui-render-smoke.test.ts
    • pm2 restart pandas-control-center
    • GET /?section=memory contains:
      • agent facets: Main/Coq/Dolphin/Monkey/Otter/Pandas/Tiger
      • monkey entries with data-file-facet-key="monkey"
      • filtering logic item.style.display = visible ? "" : "none";
    • HTML response headers include cache-control/pragma/expires no-cache trio

Phase 70 Docs left-panel facet strict filter (2026-03-06) — Completed

  • Scope: make the docs page behave exactly like memory filtering: clicking an agent must narrow the left file list to only that agent's docs.
  • Changed files:
    • src/ui/server.ts
    • test/ui-render-smoke.test.ts
    • docs/PROGRESS.md
  • Implementation:
    • Added workspace facet options from real workspace agents:
      • listWorkspaceFacetOptions() => 共享 + each agent
    • Docs workbench now uses strict facet mode:
      • includeAllFacet: false
      • facetOptions: workspaceFacetOptions
    • Unified facet keys to normalized lowercase on both server render and client filter.
    • Strengthened matching logic in file workbench script with normalizeFacetKey(...) so case differences cannot break filtering.
  • Verification:
    • npm run build
    • node --import tsx --test test/ui-render-smoke.test.ts
    • pm2 restart pandas-control-center
    • GET /?section=docs contains:
      • facetOptions: workspaceFacetOptions wiring
      • strict facet switcher entries
      • normalized facet match logic (normalizeFacetKey)

Phase 71 Apple-native visual polish v2 (2026-03-06) — Completed

  • Scope: raise the overall UI quality bar and remove low-level control styling mistakes such as browser-default black button borders in segmented controls.
  • Changed files:
    • src/ui/server.ts
    • test/ui-render-smoke.test.ts
    • docs/PROGRESS.md
  • Implementation:
    • Refined the surface system:
      • softer glass sidebars
      • deeper but cleaner card/panel elevation
      • tighter border contrast and inner highlights
    • Rebuilt controls into one visual language:
      • segmented controls now use appearance: none
      • no default black borders
      • active pill state uses subtle inset + floating highlight
      • buttons/inputs/selects/textareas now share radius, focus ring, and material treatment
    • Polished workbench surfaces:
      • memory/docs sidebars
      • file list rows
      • editor panel
      • compact detail toggles
    • Upgraded secondary containers:
      • kanban lanes
      • queue items
      • cron cards
      • calendar cards
      • quota/subscription blocks
    • Marked page generation version as apple-native-v2.
  • Verification:
    • npm run build
    • node --import tsx --test test/ui-render-smoke.test.ts
    • runtime HTML contains:
      • data-ui-polish="apple-native-v2"
      • segmented control reset styles (appearance: none, border: none, background: transparent)

Phase 72 Brand rename to OpenClaw Control Center (2026-03-06) — Completed

  • Scope: replace user-facing Mission Control / 总控台 branding with OpenClaw Control Center / 控制中心.
  • Changed files:
    • src/ui/server.ts
    • test/ui-render-smoke.test.ts
    • docs/PROGRESS.md
  • Implementation:
    • Updated main app title and brand heading to OpenClaw Control Center.
    • Updated docs index, session drilldown, and audit timeline page titles.
    • Replaced remaining user-facing 总控台 copy with 控制中心.
  • Verification:
    • npm run build
    • node --import tsx --test test/ui-render-smoke.test.ts
    • live HTML contains OpenClaw Control Center

Phase 73 Codex avatar remap to robot (2026-03-06) — Completed

  • Scope: make the Codex agent display as a robot instead of inheriting the generic monkey identity.
  • Changed files:
    • src/ui/server.ts
    • test/ui-render-smoke.test.ts
    • docs/PROGRESS.md
  • Implementation:
    • Added explicit robot animal identity with its own accent/title/keywords.
    • Bound codex to the robot identity without changing fallback hashing for unknown agents.
    • Added robot Chinese label and robot pixel sprite renderer.
  • Verification:
    • npm run build
    • node --import tsx --test test/ui-render-smoke.test.ts
    • identity smoke asserts deriveAgentAnimalIdentity("codex").animal === "robot"

Phase 74 Team page rename to Staff / 员工 (2026-03-06) — Completed

  • Scope: rename the Team page to Staff / 员工 and update related user-facing descriptions for consistency.
  • Changed files:
    • src/ui/server.ts
    • test/ui-render-smoke.test.ts
    • docs/PROGRESS.md
  • Implementation:
    • Navigation label changed from Team / 团队 to Staff / 员工.
    • Page copy updated:
      • 员工共同目标
      • 员工总览
      • 员工配置明细
      • related fallback/detail strings switched from 智能体名录 / 团队 to 员工.
    • Route key remains team for compatibility.
  • Verification:
    • npm run build
    • node --import tsx --test test/ui-render-smoke.test.ts
    • live nav now shows 员工

Phase 75 English UI localization sweep (2026-03-06) — Completed

  • Scope: remove hardcoded Chinese copy leaking into the English UI, starting with Overview and extending through the shared shell, usage, staff, memory, documents, tasks, and subscription surfaces.
  • Changed files:
    • src/ui/server.ts
    • test/ui-render-smoke.test.ts
    • docs/PROGRESS.md
  • Implementation:
    • Replaced Overview hardcoded Chinese strings with locale-aware copy for:
      • primary focus card
      • KPI cards
      • Cron / heartbeat / tool activity summaries
      • inspector sidebar
      • page hero blurb and language toggle
      • fold toggles and inspector collapse / expand controls
    • Localized shared helper functions so English mode no longer falls back to Chinese for:
      • task / project state labels
      • office card status and summaries
      • animal labels
      • usage period cards
      • subscription quota windows and unavailable states
      • data connection status labels
    • Localized the editable file workbench shell:
      • shared/main facet labels
      • file nav metadata
      • filter state copy
      • reload/save prompts and status text
    • Updated smoke tests to assert the new i18n structure instead of brittle Chinese-only source literals.
  • Verification:
    • npm run build
    • node --import tsx --test test/ui-render-smoke.test.ts
    • runtime smoke: English overview / docs / memory / usage / team / tasks pages checked after restart

Phase 76 Staff page non-technical default view (2026-03-06) — Completed

  • Scope: make the Staff page open with a human-readable summary instead of engineering fields, while keeping technical configuration behind secondary disclosure.
  • Changed files:
    • src/ui/server.ts
    • test/ui-render-smoke.test.ts
    • docs/PROGRESS.md
  • Implementation:
    • Added a dedicated staff summary card builder and renderer for the first screen.
    • The default Staff view now shows only:
      • employee name
      • role定位
      • current status
      • what they are working on
      • recent output
      • whether they are on the schedule
    • Converted default status copy to non-technical language:
      • Working / Awaiting review / Needs support / Needs attention / Standing by
    • Kept shared mission and system details in collapsed secondary sections instead of mixing them into the first screen.
    • Wired the same client-side pixel avatar renderer into the new staff cards so the overview cards still animate without network polling or token usage.
    • Added responsive rules so the staff summary collapses cleanly on narrower layouts.
  • Verification:
    • npm run build
    • node --import tsx --test test/ui-render-smoke.test.ts
    • runtime smoke after restart on ?section=team&lang=zh and ?section=team&lang=en

Phase 77 Otter avatar retune (2026-03-06) — Completed

  • Scope: redraw the Otter staff avatar to better match the requested cute reference style instead of reusing the older generic long-face mammal silhouette.
  • Changed files:
    • src/ui/server.ts
    • docs/PROGRESS.md
  • Implementation:
    • Rebuilt the drawOtter() pixel sprite with:
      • rounder head silhouette
      • lighter face mask
      • blush cheeks
      • front paws held together near the mouth
      • smaller body so the face reads closer to the supplied icon
  • Verification:
    • npm run build
    • node --import tsx --test test/ui-render-smoke.test.ts
    • pm2 restart pandas-control-center

Phase 78 Staff layout density pass (2026-03-06) — Completed

  • Scope: remove wasted space in the Staff overview and make the pixel avatars read larger at a glance.
  • Changed files:
    • src/ui/server.ts
    • test/ui-render-smoke.test.ts
    • docs/PROGRESS.md
  • Implementation:
    • Changed the staff card grid to:
      • 3 columns on wide desktop
      • 2 columns on mid-width layouts
      • 1 column on narrow/mobile layouts
    • Reduced card padding and row spacing to cut empty whitespace.
    • Enlarged the staff avatar block and switched staff canvases to 256x256.
    • Made the staff stage square so the pixel animal uses more of the visible area instead of sitting small inside a wide stage.
  • Verification:
    • npm run build
    • node --import tsx --test test/ui-render-smoke.test.ts
    • pm2 restart pandas-control-center

Phase 79 Staff avatar style unification (2026-03-06) — Completed

  • Scope: bring the main staff avatars up to the newer Otter quality bar so they share one consistent cute chibi pixel language instead of mixing older generic shapes.
  • Changed files:
    • src/ui/server.ts
    • docs/PROGRESS.md
  • Implementation:
    • Rebuilt the following avatar renderers in the same rounded chibi style family:
      • drawRobot
      • drawLion
      • drawTiger
      • drawPanda
      • drawMonkey
      • drawDolphin
    • Preserved Coq as-is because its current rooster design was already the closest to the target quality.
    • Kept each character distinct while aligning the shared visual grammar:
      • larger face area
      • smaller body
      • tighter eye placement
      • softer cheek / muzzle treatment
      • front-paw / front-body emphasis where applicable
  • Verification:
    • npm run build
    • node --import tsx --test test/ui-render-smoke.test.ts
    • pm2 restart pandas-control-center

Phase 80 Evidence-based staff responsibilities (2026-03-06) — Completed

  • Scope: replace guessed animal-based role copy on the Staff page with role labels derived from each employee's real workspace files and local OpenClaw config evidence.
  • Changed files:
    • src/ui/server.ts
    • test/ui-render-smoke.test.ts
    • docs/PROGRESS.md
  • Implementation:
    • Removed the hardcoded staffRoleLabel() animal mapping that produced incorrect labels such as tiger -> 快速推进.
    • Added resolveStaffRoleLabel() to read evidence from:
      • agent workspace files (IDENTITY.md, AGENTS.md, README.md, MEMORY.md, focus.md, routines.md, inbox.md)
      • local openclaw.json
      • local cron jobs snapshot
    • Mapped verified role evidence into non-technical labels used on the Staff page:
      • monkey -> YouTube 视频转长文
      • dolphin -> 高价值内容创作
      • pandas -> 控制中心开发与交付
      • coq -> 每日情报与趋势简报
      • otter -> 私人助理与提醒
      • tiger -> 安全和更新
      • main -> 主控与协调
    • Changed Staff card assembly to await evidence-based role resolution before rendering.
  • Verification:
    • npm run build
    • node --import tsx --test test/ui-render-smoke.test.ts
    • pm2 restart pandas-control-center

Phase 81 Staff avatar pose differentiation (2026-03-06) — Completed

  • Scope: make the staff avatars more detailed and stop reusing the same front-facing pose for every employee except the already-approved Coq and Otter designs.
  • Changed files:
    • src/ui/server.ts
    • docs/PROGRESS.md
  • Implementation:
    • Redrew these avatars with distinct poses and more internal detail:
      • robot: waving with a side tablet
      • lion: raised paw / captain pose
      • tiger: guard pose with shield
      • panda: seated with laptop
      • monkey: holding a document pad
      • dolphin: jumping pose with splash
    • Left Coq and Otter unchanged.
    • Added per-animal idle motion profiles so the bob/sway cadence is no longer identical across every employee card.
  • Verification:
    • npm run build
    • node --import tsx --test test/ui-render-smoke.test.ts
    • pm2 restart pandas-control-center

Phase 82 Staff avatar cleanup for main / monkey / dolphin (2026-03-06) — Completed

  • Scope: redraw the three avatars that still felt awkward after the pose pass so they look more natural and less strange in the Staff overview.
  • Changed files:
    • src/ui/server.ts
    • docs/PROGRESS.md
  • Implementation:
    • main / lion:
      • replaced the more awkward off-balance raised-paw silhouette with a cleaner centered commander bust
      • added a sash + badge treatment so the role still reads as captain/commander without looking distorted
    • monkey:
      • replaced the side-floating document pose with a more stable front-writing composition
      • centered the writing pad under the face and simplified the pen hand
    • dolphin:
      • replaced the weirder stretched jump silhouette with a rounder chibi leap
      • tightened the head/body proportion and cleaned the splash shape
  • Verification:
    • npm run build
    • node --import tsx --test test/ui-render-smoke.test.ts
    • pm2 restart pandas-control-center

Phase 83 Staff avatar retune for monkey / dolphin (2026-03-06) — Completed

  • Scope: refine the two remaining staff avatars that still read as awkward after the earlier cleanup, without touching the already-accepted Coq and Otter designs.
  • Changed files:
    • src/ui/server.ts
    • docs/PROGRESS.md
  • Implementation:
    • monkey:
      • tightened the face and ear silhouette into a more centered chibi head
      • rebuilt the notebook area so the writing pose reads clearly from a quick glance
      • simplified the pencil and paw placement to avoid the previous odd side-floating composition
    • dolphin:
      • rounded the body into a clearer cute side profile
      • strengthened belly / eye / tail contrast so it reads as a dolphin rather than a generic fish blob
      • cleaned the splash and jump line so the motion stays readable at card size
  • Verification:
    • npm run build
    • node --import tsx --test test/ui-render-smoke.test.ts
    • pm2 restart pandas-control-center

Phase 84 Monkey avatar simplification pass (2026-03-07) — Completed

  • Scope: replace the still-awkward monkey writing pose with a cleaner, cuter front-facing chibi composition.
  • Changed files:
    • src/ui/server.ts
    • docs/PROGRESS.md
  • Implementation:
    • Removed the extra floating pencil composition that still made the monkey avatar read as messy.
    • Rebuilt monkey as a simpler sticker-like mascot:
      • larger centered head
      • cleaner ear silhouette
      • clearer face / muzzle separation
      • smaller body
      • front paws holding a notebook instead of an awkward writing gesture
    • Kept a small tail curl so it still reads as a monkey without cluttering the pose.
  • Verification:
    • npm run build
    • node --import tsx --test test/ui-render-smoke.test.ts
    • pm2 restart pandas-control-center

Phase 85 Monkey avatar redraw from visual reference (2026-03-07) — Completed

  • Scope: redraw the monkey avatar again against a supplied reference image because the simplified notebook-holding version was still not acceptable.
  • Changed files:
    • src/ui/server.ts
    • docs/PROGRESS.md
  • Implementation:
    • Removed the notebook-holding pose entirely.
    • Rebuilt monkey to match the provided mascot direction more closely:
      • larger rounded head
      • large circular eyes
      • heart-like face mask
      • tiny standing body
      • belly patch
      • curled tail
      • top hair tuft
    • Prioritized a cleaner sticker-like silhouette over role-action storytelling for this one avatar.
  • Verification:
    • npm run build
    • node --import tsx --test test/ui-render-smoke.test.ts
    • pm2 restart pandas-control-center

Phase 86 Monkey avatar detail polish (2026-03-07) — Completed

  • Scope: keep the new reference-based monkey silhouette, but add more internal detail so it feels less flat and generic.
  • Changed files:
    • src/ui/server.ts
    • docs/PROGRESS.md
  • Implementation:
    • Added fur highlights across the head and tail.
    • Added inner-ear shading so the ears read less like plain circles.
    • Deepened the eyes with internal warm glow pixels and stronger highlights.
    • Refined the mouth / smile and added toe details on the feet.
    • Added subtle highlight dots on hands, belly area, and tail interior to improve depth without changing the approved silhouette direction.
  • Verification:
    • npm run build
    • node --import tsx --test test/ui-render-smoke.test.ts
    • pm2 restart pandas-control-center

Phase 87 Monkey avatar reference-fit pass (2026-03-07) — Completed

  • Scope: move the monkey avatar closer to the supplied mascot reference instead of merely adding generic detail to the previous version.
  • Changed files:
    • src/ui/server.ts
    • docs/PROGRESS.md
  • Implementation:
    • Reworked the monkey face proportions to better match the reference:
      • larger cheek pads
      • lower face mask
      • bigger glossy eyes
      • smaller centered muzzle
    • Simplified and rebalanced the body to keep the head dominant.
    • Retuned the tail fill/highlight so it reads as a cleaner curled tail instead of a noisy scribble.
    • Kept the top hair tuft, but reshaped it to sit closer to the reference silhouette.
  • Verification:
    • npm run build
    • node --import tsx --test test/ui-render-smoke.test.ts
    • pm2 restart pandas-control-center

Phase 88 Staff avatar export folder (2026-03-07) — Completed

  • Scope: export every current staff pixel avatar into a dedicated folder inside the workspace instead of keeping them only inside the browser renderer.
  • Changed files:
    • scripts/export-staff-avatars.ts
    • test/export-staff-avatars.test.ts
    • package.json
    • docs/PROGRESS.md
    • runtime/exports/staff-avatars/*
  • Implementation:
    • Added avatars:export script to dump staff avatar assets.
    • Reused the current embedded sprite runtime from src/ui/server.ts by extracting the avatar block directly, so exported files stay aligned with the live UI avatars.
    • Exported one SVG per current employee plus:
      • manifest.json
      • index.html preview sheet
    • Export target:
      • runtime/exports/staff-avatars/
  • Verification:
    • npm run build
    • node --import tsx --test test/**/*.test.ts
    • npm run avatars:export
    • ls runtime/exports/staff-avatars

Phase 89 Staff avatar PNG export + centering fix (2026-03-07) — Completed

  • Scope: export staff avatars as PNG in addition to SVG, and fix the long-standing visual drift where some avatars looked slightly right-shifted in both the UI and exported assets.
  • Changed files:
    • src/ui/server.ts
    • scripts/export-staff-avatars.ts
    • test/export-staff-avatars.test.ts
    • docs/PROGRESS.md
  • Implementation:
    • Added sprite bound measurement and square-centering for exported assets.
    • Added native PNG generation in the export script, without introducing external rendering dependencies.
    • Switched the export preview sheet to use PNG thumbnails by default.
    • Updated in-app avatar canvas rendering to center based on the actual occupied sprite bounds instead of the full 44x44 source grid.
    • This fixes the previous right-biased appearance for asymmetrical sprites such as monkey / tail-heavy characters.
  • Verification:
    • npm run build
    • node --import tsx --test test/export-staff-avatars.test.ts test/ui-render-smoke.test.ts
    • npm run avatars:export
    • pm2 restart pandas-control-center

Phase 90 P0 overview + task hub + stability pass (2026-03-07) — Completed

  • Scope: deliver the three P0 items only:
    • redesign Overview into a tighter decision homepage
    • upgrade Tasks into a unified task hub
    • strengthen stability / consistency guardrails around the new structure
  • Changed files:
    • src/ui/server.ts
    • test/ui-render-smoke.test.ts
    • docs/PROGRESS.md
  • Implementation:
    • Reworked Overview so the first screen now centers on:
      • one primary control posture card
      • four KPI cards
      • four second-layer decision cards:
        • intervention queue
        • active staff
        • AI burn now
        • next scheduled work
    • Moved the full Cron execution board out of Overview and into Tasks, while keeping a compact runtime checkpoint in Overview for:
      • Cron health
      • next run
      • heartbeat state
      • anchor compatibility for legacy links
    • Turned Tasks into a real task hub with:
      • a single top-level task hub hero
      • decision center
      • merged timeline / schedule panel
      • full Cron execution board
      • task lanes as the main execution area
      • project lanes and live activity feed as secondary side panels
    • Updated layout and responsive CSS for the new shells and cards:
      • overview-decision-home
      • overview-decision-grid
      • task-hub-shell
      • task-hub-grid
      • timeline-summary-strip
      • decision-row / busy-staff card treatments
    • Bumped the UI polish marker to apple-native-v3.
    • Expanded smoke coverage so regressions now check:
      • new Overview anchors
      • new Task Hub anchors
      • the updated polish marker
      • sprite-centering runtime guards
  • Verification:
    • npm run build
    • node --import tsx --test test/ui-render-smoke.test.ts test/export-staff-avatars.test.ts
    • Runtime UI smoke confirmed the new Overview anchors, Task Hub anchors, polish marker, and sprite-centering guards in a local validation environment.
  • Remaining gap:
    • None for this phase. The previously unrelated test/triplet-control.test.ts failure was fixed in Phase 91.

Phase 91 DoD rule drift fix for triplet-control (2026-03-07) — Completed

  • Scope: fix the remaining full-suite failure in test/triplet-control.test.ts without touching the UI runtime.
  • Changed files:
    • scripts/dod-check.ts
    • docs/PROGRESS.md
  • Implementation:
    • Updated dod-check.ts so its product DoD source audit accepts the current control-center implementation instead of enforcing stale renderer markers.
    • Replaced the brittle single-path global-visibility block token with an allowed token group covering:
      • the legacy globalVisibilityStripCard branch
      • the current overview-only "" branch
    • Replaced the brittle Apple-native token check so it now accepts:
      • apple-native-v1
      • apple-native-v2
      • apple-native-v3
    • Relaxed the hover-elevation token from one exact inline line to a grouped match that still proves the card hover treatment exists.
    • Verified with a reproduced triplet fixture that scripts/dod-check.ts now emits DONE when the runtime evidence satisfies all gates.
  • Verification:
    • npm run build
    • node --import tsx --test test/triplet-control.test.ts
    • node --import tsx --test test/**/*.test.ts
    • Reproduced the fixture from test/triplet-control.test.ts and verified scripts/dod-check.ts writes status: "DONE" to dod-status.json
  • Remaining gap:
    • None. Full suite is now green (55/55).

Phase 92 session execution-chain visibility (2026-03-07) — Completed

  • Scope: make accepted -> sessions_spawn -> child session visible in the control center without depending on a single CLI history implementation.
  • Changed files:
    • src/clients/factory.ts
    • src/clients/openclaw-live-client.ts
    • src/contracts/openclaw-tools.ts
    • src/runtime/session-conversations.ts
    • src/ui/server.ts
    • test/session-execution-chain.test.ts
    • test/ui-render-smoke.test.ts
    • docs/PROGRESS.md
  • Implementation:
    • Re-enabled live read visibility by always constructing OpenClawLiveClient() from the tool-client factory while still keeping mutating actions gated elsewhere.
    • Added live-session backfill for UI rendering:
      • when the read-model snapshot has 0 sessions, the UI now merges in toolClient.sessionsList() results so session drilldown, task execution chains, and /api/sessions stay connected to real runtime state
    • Extended session-history normalization to recognize two new runtime events:
      • accepted
      • spawn
    • Added SessionExecutionChainSummary to both session list items and session detail payloads.
    • Implemented dual-path chain inference:
      • prefer explicit history evidence when accepted / sessions_spawn events are present
      • fall back to :run: child session keys when the installed OpenClaw CLI cannot provide session history
    • Fixed raw-text history parsing so text fallback still extracts execution-chain events instead of downgrading them to generic messages.
    • Added file-based history fallback for live sessions:
      • cache sessionId and derived sessionFile
      • resolve missing sessionFile from ~/.openclaw/agents/*/sessions/sessions.json
      • read *.jsonl history directly when the installed CLI lacks a sessions history implementation
    • Hardened live CLI compatibility:
      • cron list failures now degrade to an empty jobs list instead of breaking monitor/UI routes
      • approvals get failures now degrade to an empty read result instead of breaking snapshot generation
      • sessions history failures now degrade to empty history when neither file-based nor CLI-based history is available
    • Added a new task-hub card:
      • 执行链 / Execution chain
      • shows whether work was accepted, whether it spawned an isolated child session, and which child session is running
    • Added a lightweight overview summary row:
      • 隔离执行 / Isolated execution
      • links back into the task-hub execution-chain card
    • Added a new execution-chain evidence card to Session Drilldown.
    • Extended drilldown history rendering so parent/child session references are visible inline with accepted/spawn events.
  • Verification:
    • npm run build
    • node --import tsx --test test/**/*.test.ts
    • Local runtime validation confirmed session APIs, overview execution summaries, task-hub execution-chain cards, and session drilldown evidence all render correctly.
  • Remaining gap:
    • Execution chains are visible and drilldown is verified live; however, most currently resolved chain evidence comes from session-key inference because the installed OpenClaw CLI on this machine does not expose a dedicated sessions history subcommand. The file-based history fallback covers compatible sessions without blocking the UI.

Phase 93 staff-status consistency fix (2026-03-09) — Completed

  • Scope: correct contradictory employee-card states where agents with many idle historical sessions were shown as Working, and restore Scheduled labels when cron ownership is only observable from runtime session keys.
  • Changed files:
    • src/ui/server.ts
    • test/office-roster.test.ts
    • docs/PROGRESS.md
  • Implementation:
    • Fixed office-card activity counting:
      • activeSessions now uses only non-idle snapshot sessions plus runtime active-session presence
      • idle historical sessions no longer force running status
    • Added cron-owner fallback inference from real session keys:
      • parse agent:<agentId>:cron:<jobId>...
      • use that mapping when cron catalog jobs omit ownerAgentId
    • This allows staff cards to show:
      • 待命 instead of false 工作中
      • 按排班待命 / 已排班 when the agent is clearly the executor of scheduled cron jobs
  • Verification:
    • npm run build
    • node --import tsx --test test/**/*.test.ts
      • 60/60 passed
    • Local runtime validation confirmed the staff page now renders standby and scheduled semantics correctly for cron-owned agents.
  • Remaining gap:
    • 最近产出 still reflects the latest session snippet even when the agent is currently idle. This is intentional for now, but if needed it can be refined into a separate “最近一次产出” label to avoid implying active work.

Phase 94 staff recent-output cleanup and section lazy-loading (2026-03-09) — Completed

  • Scope: stop staff cards from surfacing stale internal prompts / runtime scaffolding as 最近产出, and remove cross-page data loading that made every page slow or timeout.
  • Changed files:
    • src/ui/server.ts
    • test/office-roster.test.ts
    • test/ui-render-smoke.test.ts
    • docs/PROGRESS.md
  • Implementation:
    • Tightened staff recent-output filtering:
      • ignore internal runtime context
      • ignore untrusted conversation metadata blobs
      • ignore write-only/internal mode markers
      • ignore stale execution instructions such as the Alex Finn acceptance prompt
      • ignore thinking/reasoning noise
    • Added recent-output normalization:
      • structured JSON-like payloads collapse to 最近完成一次任务,并返回结构化结果。
      • file-write confirmations collapse to 最近更新了一份记忆或工作文件。
      • [[reply_to_current]] and similar transport wrappers are stripped before display
    • Reduced per-agent history scanning cost:
      • only inspect the newest few sessions per agent
      • shorter history windows for staff cards
    • Added section-aware lazy loading inside renderHtml():
      • memory/docs workbenches only load on their own pages
      • staff detail loading only runs on the staff page
      • removed the leftover office/live-session block from the merged staff page
    • Parallelized shared async UI data fetches (cron, catalog, replay, usage, roster) instead of serial awaits.
  • Verification:
    • npm run build
    • node --import tsx --test test/**/*.test.ts
      • 61/61 passed
    • Runtime smoke:
      • overview first response within ~2.79s
      • projects-tasks first response within ~1.66s
      • team first response within ~6.14s
      • memory first response within ~1.41s
      • docs first response within ~1.35s
      • usage-cost first response within ~0.43s
    • Staff-page smoke confirmed removal of old noise:
      • no 继续推进当前目标
      • no thinking
      • no OpenClaw runtime context (internal)
      • no Conversation info (untrusted metadata)
    • Staff-page smoke confirmed normalized outputs:
      • main: 最近完成一次任务,并返回结构化结果。
      • dolphin: 最近完成一次任务,并返回结构化结果。
      • otter: 最近更新了一份记忆或工作文件。
      • tiger: retains the human-readable update summary
  • Remaining gap:
    • team is responsive again, but its first server render is still heavier than the other pages because it synthesizes per-agent recent output from real session history. Further optimization is possible if we move that aggregation into the background monitor.

Phase 95 snapshot-store hardening against concurrent writes (2026-03-09) — Completed

  • Scope: eliminate intermittent HTML 500s caused by runtime/last-snapshot.json being read while monitor writes were in progress.
  • Changed files:
    • src/runtime/snapshot-store.ts
    • src/ui/server.ts
    • docs/PROGRESS.md
  • Implementation:
    • Snapshot writes are now atomic:
      • write to a uniquely named temp file
      • rename into place only after the full payload is written
    • Snapshot reads now retry briefly on transient parse failures before surfacing an error.
    • Added slow-render diagnostics for server-side HTML generation so future regressions expose which phase is slow instead of looking like a generic timeout.
  • Verification:
    • npm run build
    • node --import tsx --test test/**/*.test.ts
      • 61/61 passed
    • pm2 restart pandas-control-center
    • repeated page probes after restart no longer triggered the previous JSON parse crash
  • Remaining gap:
    • Slow-render diagnostics are still enabled for renders above 1 second. They are useful during stabilization, but can be removed or downgraded later once performance is consistently stable.

Phase 96 monkey visual color refinement (2026-03-09) — Completed

  • Scope: change the monkey staff visual from the previous yellow-brown accent to a clearer gold tone.
  • Changed files:
    • src/ui/server.ts
    • docs/PROGRESS.md
  • Implementation:
    • Updated the monkey identity accent from #ffd36e to #f4c542.
    • Rebalanced the monkey sprite palette so the fur reads as gold instead of flat brown:
      • fur: #c89235
      • furDark: #966521
      • adjusted nose/muzzle tones to stay coherent with the warmer gold palette
  • Verification:
    • npm run build
    • node --import tsx --test test/**/*.test.ts
    • pm2 restart pandas-control-center
    • team-page smoke confirmed the monkey card still renders after the palette change
  • Remaining gap:
    • This is a color-only refinement. If needed, the next pass can shift the monkey card background glow to a slightly richer amber so the gold reads even stronger.

Phase 97 lion avatar scale normalization (2026-03-09) — Completed

  • Scope: fix the main lion avatar rendering smaller than the other staff avatars inside the same frame.
  • Changed files:
    • src/ui/server.ts
    • docs/PROGRESS.md
  • Implementation:
    • Measured the sprite bounds used by the live renderer and confirmed the lion sprite spans 40px, while most other staff sprites span 38px or less.
    • Because the renderer uses integer nearest-neighbor scaling, that larger lion envelope dropped it from the 6x scale bucket to 5x, making main visibly smaller.
    • Added a targeted visual span compensation for lion so the renderer computes the scale from a slightly reduced effective span while preserving the actual sprite bounds for centering and panel layout.
  • Verification:
    • npm run build
    • node --import tsx --test test/**/*.test.ts
    • pm2 restart pandas-control-center
    • runtime smoke confirmed the team page still renders and the lion compensation is present in the embedded renderer
  • Remaining gap:
    • This pass normalizes the lion size in the live control-center UI. Exported avatar assets still use the raw sprite bounds, which is acceptable for now because the user issue was about the on-page avatar scale.

Phase 98 otter avatar scale normalization (2026-03-09) — Completed

  • Scope: fix the otter avatar reading visually smaller than the other staff avatars inside the same employee-card frame.
  • Changed files:
    • src/ui/server.ts
    • scripts/export-staff-avatars.ts
    • test/export-staff-avatars.test.ts
    • docs/PROGRESS.md
  • Implementation:
    • Confirmed otter stayed at the same integer render scale as several other avatars, but its drawing occupies a narrower, more compact silhouette, so it still read smaller inside the same panel.
    • Added a targeted visual span compensation for otter (0.9) in the live avatar renderer so it scales up one notch and matches the surrounding staff cards more closely.
    • Extended the embedded avatar-runtime extractor so automated tests can verify the live compensation map instead of relying on brittle source-text matching.
  • Verification:
    • npm run build
    • node --import tsx --test test/**/*.test.ts
    • pm2 restart pandas-control-center
    • team-page runtime smoke confirmed the embedded renderer now includes otter: 0.9
  • Remaining gap:
    • This fixes the live employee-page rendering. Exported standalone avatar assets still use raw sprite bounds and do not yet apply visual-size compensation, which is acceptable unless the user wants perfectly equalized export thumbnails too.

Phase 99 staff status/current-work consistency fix (2026-03-09) — Completed

  • Scope: remove contradictory employee-card states such as 工作中 paired with 按排班待命.
  • Changed files:
    • src/ui/server.ts
    • test/office-roster.test.ts
    • docs/PROGRESS.md
  • Implementation:
    • Extracted staff current-work text generation into a dedicated staffCurrentWorkLabel(...) helper.
    • Tightened the fallback order so only idle/inactive scheduled staff show 按排班待命.
    • Running staff with no explicit task title now show:
      • 正在执行排班任务 when they are currently active and have scheduled cron work
      • 正在处理实时会话 when they are active without cron-backed schedule evidence
      • 正在处理当前工作 as the generic final fallback
  • Verification:
    • npm run build
    • node --import tsx --test test/**/*.test.ts
    • pm2 restart pandas-control-center
    • runtime smoke confirmed the live team page no longer needs to pair 工作中 with 按排班待命
  • Remaining gap:
    • This pass fixes the logic conflict. If needed later, the staff card can still be refined further so 正在处理什么 prefers a more concrete task/cron label instead of the generic active-session fallback.

Phase 100 staff current-work naming upgrade (2026-03-09) — Completed

  • Scope: replace abstract employee-card work copy with concrete task or cron names whenever the runtime has them.
  • Changed files:
    • src/ui/server.ts
    • test/office-roster.test.ts
    • docs/PROGRESS.md
  • Implementation:
    • Updated staffCurrentWorkLabel(...) so the fallback order is now:
      • explicit task title from the live office focus list
      • concrete cron job name from execution.cronJobNames
      • approval / blocked labels
      • live-session generic fallback only when no task/cron name exists
    • Removed the previous abstract scheduled-work copy from the primary path:
      • no more 按排班待命
      • no more 正在执行排班任务 when a concrete cron name is available.
  • Verification:
    • npm run build
    • node --import tsx --test test/**/*.test.ts
    • pm2 restart pandas-control-center
    • employee-page smoke after restart confirms the page serves and includes the updated current-work behavior
  • Remaining gap:
    • If an active session has no linked task title and no resolvable cron name, the card still falls back to generic live-session text. That is intentional because there is no trustworthy concrete name to show in that case.

Phase 101 staff card current-vs-next semantics fix (2026-03-09) — Completed

  • Scope: stop employee cards from implying an idle agent is currently executing a cron job just because a scheduled job name exists.
  • Changed files:
    • src/ui/server.ts
    • test/office-roster.test.ts
    • docs/PROGRESS.md
  • Implementation:
    • Upgraded the staff-card work field from a single string to a (label, value) pair.
    • Running agents still show 正在处理什么 / Working on.
    • Idle or inactive agents with a known scheduled cron now show 下一项 / Next up and the concrete cron name.
    • This preserves concrete job names without falsely implying that an idle agent is actively executing them.
  • Verification:
    • npm run build
    • node --import tsx --test test/**/*.test.ts
    • pm2 restart pandas-control-center
    • runtime smoke confirmed the live staff page serves with the updated semantics
  • Remaining gap:
    • The page now distinguishes current work vs next scheduled work semantically. If needed later, the next refinement is to show the exact next scheduled time beside the cron name.

Phase 102 residual running status cleanup (2026-03-09) — Completed

  • Scope: stop employee cards from showing 工作中 when a session still says running but recent history already contains an explicit standby/skip stop sequence.
  • Changed files:
    • src/ui/server.ts
    • test/office-roster.test.ts
    • docs/PROGRESS.md
  • Implementation:
    • Added residual-stop detection over recent session history.
    • The staff card now downgrades a running session to 待命 when the recent history shows:
      • an explicit stop/standby directive, and
      • only residual follow-up noise afterward (REPLY_SKIP, ANNOUNCE_SKIP, announce step, thinking)
    • Filtered residual stop markers out of 最近产出 so they no longer appear as if they were meaningful user-visible output.
  • Verification:
    • npm run build
    • node --import tsx --test test/**/*.test.ts
    • added regression coverage for running sessions that should be treated as already stopped
  • Remaining gap:
    • This cleanup is currently applied to the employee-card layer. If needed later, the same residual-stop semantics can also be propagated into broader session/overview state aggregation.

Phase 103 nested session history parsing fix (2026-03-09) — Completed

  • Scope: fix stale running employee states caused by mis-parsing OpenClaw's nested message.role and message.content[] history payloads.
  • Changed files:
    • src/runtime/session-conversations.ts
    • test/session-execution-chain.test.ts
    • test/office-roster.test.ts
    • docs/PROGRESS.md
  • Implementation:
    • Updated session-history parsing to prefer nested message.role over the top-level type: "message" envelope.
    • Stopped treating top-level type as a role unless it is a real role-like value (user, assistant, system, tool).
    • Added nested content extraction that prefers visible text blocks over thinking blocks inside message.content[].
    • This prevents thinking + REPLY_SKIP from being merged into a non-residual string and restores correct stop-sequence detection for employee cards.
  • Verification:
    • npm run build
    • node --import tsx --test test/session-execution-chain.test.ts test/office-roster.test.ts
    • added regressions for nested OpenClaw history envelopes and residual-running downgrade from real nested payloads
  • Remaining gap:
    • Employee-state cleanup now has correct nested history semantics. Broader session lists and drilldowns still rely on the underlying runtime state field for their primary state label, which can remain stale until the upstream runtime closes the session state.