{
  "version": "1.0",
  "updated_at": "2026-02-24",
  "description": "Tracks the status of all Flynn plans and implementation phases",
  "plans": {
    "pi-embedded-manual-runtime-mode-control": {
      "status": "completed",
      "date": "2026-02-24",
      "updated": "2026-02-24",
      "summary": "Added persisted global runtime backend mode control for Pi rollout/deactivation via `/backend` command fast-path (`status`, `activate pi`, `deactivate pi`, `use config`), with `/runtime` now available as a dedicated alias to avoid TUI `/backend` ambiguity. This keeps Flynn's configured routing as default (`config_default`) while allowing manual Pi activation/deactivation without automatic global rollback.",
      "files_modified": [
        "src/commands/types.ts",
        "src/commands/builtin/index.ts",
        "src/commands/builtin/index.test.ts",
        "src/commands/index.ts",
        "src/preferences.ts",
        "src/preferences.test.ts",
        "src/daemon/index.ts",
        "src/daemon/routing.ts",
        "src/daemon/routing.test.ts",
        "README.md",
        "docs/architecture/AGENT_DIAGRAM.md",
        "docs/architecture/GATEWAY_SESSIONS_AND_QUEUE.md",
        "docs/api/PROTOCOL.md",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/commands/builtin/index.test.ts src/preferences.test.ts src/daemon/routing.test.ts + pnpm typecheck passing"
    },
    "tui-runtime-command-reservation": {
      "status": "completed",
      "date": "2026-02-24",
      "updated": "2026-02-24",
      "summary": "Reserved `/runtime` in minimal/fullscreen TUI command parsing so it no longer falls through to the model/tool loop. TUI now responds with explicit guidance that runtime backend mode control is available in daemon/channel sessions, preventing accidental tool execution when users run `/runtime status` in TUI.",
      "files_modified": [
        "src/frontends/tui/commands.ts",
        "src/frontends/tui/minimal.ts",
        "src/frontends/tui/components/App.tsx",
        "src/frontends/tui/commands.test.ts",
        "src/frontends/tui/minimal.test.ts",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/frontends/tui/commands.test.ts src/frontends/tui/minimal.test.ts + pnpm typecheck passing"
    },
    "runtime-backend-command-input-normalization": {
      "status": "completed",
      "date": "2026-02-24",
      "updated": "2026-02-24",
      "summary": "Hardened runtime backend mode command parsing to accept both subcommand input (`status`) and full-command input (`/runtime status`, `runtime status`, `/backend status`) so status/activation calls do not incorrectly fall back to usage text.",
      "files_modified": [
        "src/daemon/routing.ts",
        "src/daemon/routing.test.ts",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/daemon/routing.test.ts + pnpm typecheck passing"
    },
    "openclaw-gateway-first-tui-runtime-unification": {
      "status": "completed",
      "date": "2026-02-24",
      "updated": "2026-02-24",
      "summary": "Unified runtime backend mode control across channel router, gateway, and TUI by extracting a shared backend-mode command service, wiring gateway `agent.send` to that shared service, and forwarding minimal/fullscreen TUI `/runtime` through a gateway bridge. `flynn tui` now auto-attaches to gateway and auto-starts local daemon+gateway when unavailable while preserving TUI-local `/backend [provider]` switching.",
      "files_modified": [
        "src/commands/runtimeBackendMode.ts",
        "src/commands/index.ts",
        "src/daemon/routing.ts",
        "src/daemon/index.ts",
        "src/daemon/services.ts",
        "src/gateway/server.ts",
        "src/gateway/handlers/agent.ts",
        "src/gateway/handlers/agent.test.ts",
        "src/cli/tuiRuntimeGateway.ts",
        "src/cli/tuiRuntimeGateway.test.ts",
        "src/cli/tui.ts",
        "src/frontends/tui/fullscreen.ts",
        "src/frontends/tui/components/App.tsx",
        "src/frontends/tui/minimal.ts",
        "src/frontends/tui/minimal.test.ts",
        "src/frontends/tui/commands.ts",
        "README.md",
        "docs/architecture/AGENT_DIAGRAM.md",
        "docs/architecture/GATEWAY_SESSIONS_AND_QUEUE.md",
        "docs/api/PROTOCOL.md",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/cli/tuiRuntimeGateway.test.ts src/frontends/tui/commands.test.ts src/frontends/tui/minimal.test.ts src/gateway/handlers/agent.test.ts src/daemon/routing.test.ts src/commands/builtin/index.test.ts + pnpm typecheck passing"
    },
    "gateway-startup-eaddrinuse-hardening": {
      "status": "completed",
      "date": "2026-02-24",
      "updated": "2026-02-24",
      "summary": "Hardened gateway startup bind-failure handling so port collisions (`EADDRINUSE`) are rejected deterministically instead of surfacing as an unhandled WebSocketServer error event. Added clearer daemon startup error text, reordered startup to bind gateway before channel adapters (avoiding noisy channel teardown on bind failures), added bounded bind-retry logic for short restart races, made TUI auto-start treat `EADDRINUSE` as an attach race (retry connect) rather than immediate failure, and updated `make daemon-start`/`make daemon-restart` to rebuild before service start/restart so runtime fixes are always reflected in `dist`.",
      "files_modified": [
        "Makefile",
        "README.md",
        "src/gateway/server.ts",
        "src/gateway/server.test.ts",
        "src/daemon/services.ts",
        "src/daemon/startServices.test.ts",
        "src/cli/tuiRuntimeGateway.ts",
        "src/cli/tuiRuntimeGateway.test.ts",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/gateway/server.test.ts src/cli/tuiRuntimeGateway.test.ts src/daemon/startServices.test.ts src/daemon/services.test.ts src/daemon/routing.test.ts src/frontends/tui/minimal.test.ts + pnpm typecheck passing"
    },
    "pi-embedded-backend-canary-evaluation-phase": {
      "status": "completed",
      "date": "2026-02-24",
      "updated": "2026-02-24",
      "summary": "Completed formal Pi embedded canary evaluation with audit-log summaries, minimum-sample thresholds, and controlled guard-coverage probes. Final decision: `rollback` canary routing (no expansion) due to failed latency/fallback gates in Window A despite verified guard behavior in controlled probes. Operational config rollback was applied by switching `agent_configs.pi_canary.backend` to `native` in runtime config.",
      "files_modified": [
        "src/audit/backendCanarySummary.ts",
        "src/audit/backendCanarySummary.test.ts",
        "scripts/summarize-backend-canary.ts",
        "scripts/run-pi-canary-guard-probes.ts",
        "package.json",
        "README.md",
        "docs/plans/pi_embedded_evaluation.md",
        "docs/plans/artifacts/.gitkeep",
        "docs/plans/artifacts/pi_embedded_eval_window_a_2026-02-24.md",
        "docs/plans/artifacts/pi_embedded_eval_window_a_2026-02-24.json",
        "docs/plans/artifacts/pi_embedded_eval_window_b_2026-02-24_post_fallbacks.md",
        "docs/plans/artifacts/pi_embedded_eval_window_b_2026-02-24_post_fallbacks.json",
        "docs/plans/artifacts/pi_embedded_eval_window_c_2026-02-24_guard_preprobe.md",
        "docs/plans/artifacts/pi_embedded_eval_window_c_2026-02-24_guard_preprobe.json",
        "docs/plans/artifacts/pi_embedded_eval_window_c_guard_probes.jsonl",
        "docs/plans/artifacts/pi_embedded_eval_window_c_2026-02-24_guard_postprobe.md",
        "docs/plans/artifacts/pi_embedded_eval_window_c_2026-02-24_guard_postprobe.json",
        "docs/architecture/AGENT_DIAGRAM.md",
        "docs/architecture/GATEWAY_SESSIONS_AND_QUEUE.md",
        "docs/api/PROTOCOL.md",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/audit/backendCanarySummary.test.ts + pnpm typecheck + pnpm audit:backend-canary against ~/.local/share/flynn/audit.log (Window A/B/C-preprobe) + pnpm audit:backend-canary:probes + pnpm audit:backend-canary against generated probe log (Window C-postprobe) passing; pnpm lint unchanged warnings-only baseline"
    },
    "pi-embedded-backend-canary-spike": {
      "status": "completed",
      "date": "2026-02-24",
      "updated": "2026-02-24",
      "summary": "Implemented a Pi embedded canary spike with a new optional `pi_embedded` backend, guarded no-tools canary routing, backend success/fallback latency telemetry in audit logs, focused backend/schema/routing tests, and architecture/protocol documentation updates while keeping native orchestration as the default path.",
      "files_modified": [
        "src/backends/piEmbedded.ts",
        "src/backends/piEmbedded.test.ts",
        "src/backends/external.ts",
        "src/backends/index.ts",
        "src/daemon/index.ts",
        "src/daemon/routing.ts",
        "src/daemon/routing.test.ts",
        "src/config/schema.ts",
        "src/config/schema.test.ts",
        "src/agents/registry.ts",
        "src/audit/types.ts",
        "src/audit/logger.ts",
        "config/default.yaml",
        "README.md",
        "docs/architecture/AGENT_DIAGRAM.md",
        "docs/architecture/GATEWAY_SESSIONS_AND_QUEUE.md",
        "docs/api/PROTOCOL.md",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/backends/piEmbedded.test.ts src/config/schema.test.ts src/daemon/routing.test.ts + pnpm typecheck + pnpm lint (warnings only) passing"
    },
    "full-audit-hardening-and-config-consolidation": {
      "status": "completed",
      "date": "2026-02-24",
      "updated": "2026-02-24",
      "summary": "Completed a repo-wide audit and implemented hardening/refactors for Google OAuth token handling, router fallback correctness, config-profile consolidation, and audit logging path behavior. Added Google service coverage to `flynn doctor`, introduced a unified `flynn google-auth` command, aligned fallback-chain defaults with runtime semantics, expanded provider capability type coverage, produced operator/agent-facing documentation plus REPORT.md, and refreshed Mermaid architecture/protocol diagrams to match the new flows.",
      "files_modified": [
        "src/auth/google.ts",
        "src/google/oauth.ts",
        "src/tools/builtin/gmail.ts",
        "src/tools/builtin/gcal.ts",
        "src/tools/builtin/gdocs.ts",
        "src/tools/builtin/gdrive.ts",
        "src/tools/builtin/gtasks.ts",
        "src/automation/gmail.ts",
        "src/cli/google-auth.ts",
        "src/cli/doctor.ts",
        "src/models/router.ts",
        "src/models/openai.ts",
        "src/config/schema.ts",
        "config/profiles/paas.overlay.yaml",
        "scripts/generate-config-profiles.mjs",
        "src/audit/logger.ts",
        "README.md",
        "docs/operations/GOOGLE_AUTH.md",
        "docs/architecture/AGENT_REPO_MAP.md",
        "docs/architecture/AGENT_DIAGRAM.md",
        "docs/architecture/GATEWAY_SESSIONS_AND_QUEUE.md",
        "docs/api/PROTOCOL.md",
        "REPORT.md",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run (18 focused suites, 420 tests) + pnpm lint (0 errors) + pnpm typecheck + pnpm config:profiles:check passing"
    },
    "daily-briefing-google-scope-remediation": {
      "status": "completed",
      "date": "2026-02-24",
      "updated": "2026-02-24",
      "summary": "Improved Google Calendar and Google Tasks tool error handling so insufficient-scope failures now include explicit re-auth commands (`flynn gcal-auth` / `flynn gtasks-auth`) instead of vague permission errors. Added regression tests and operator runbook troubleshooting steps for daily briefing blockers.",
      "files_modified": [
        "src/tools/builtin/gcal.ts",
        "src/tools/builtin/gtasks.ts",
        "src/tools/builtin/gcal.test.ts",
        "src/tools/builtin/gtasks.test.ts",
        "docs/operations/OPERATOR_PACK.md",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/tools/builtin/gcal.test.ts src/tools/builtin/gtasks.test.ts src/tools/builtin/gmail.test.ts + pnpm typecheck passing"
    },
    "council-tool-timeout-override": {
      "status": "completed",
      "date": "2026-02-23",
      "updated": "2026-02-23",
      "summary": "Added optional per-tool timeout override support in ToolExecutor and set `council.run` to 180000ms so council orchestration in the native tool loop is no longer hard-capped by the global 30000ms tool timeout.",
      "files_modified": [
        "src/tools/types.ts",
        "src/tools/executor.ts",
        "src/tools/executor.test.ts",
        "src/tools/builtin/council-run.ts",
        "src/tools/builtin/council-run.test.ts",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/tools/executor.test.ts src/tools/builtin/council-run.test.ts + pnpm typecheck passing"
    },
    "gmail-filter-scope-correction": {
      "status": "completed",
      "date": "2026-02-23",
      "updated": "2026-02-23",
      "summary": "Corrected Gmail OAuth scopes for filter creation after validating that `mail.google.com` alone still produced `ACCESS_TOKEN_SCOPE_INSUFFICIENT` for `users.settings.filters.create` in live checks. `flynn gmail-auth` now explicitly requests `gmail.settings.basic` (plus `gmail.readonly`). Updated auth tests and operator docs/comments.",
      "files_modified": [
        "src/cli/gmail-auth.ts",
        "src/cli/gmail-auth.test.ts",
        "README.md",
        "config/default.yaml",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/cli/gmail-auth.test.ts + pnpm typecheck passing"
    },
    "minimal-tui-multiline-paste-mode": {
      "status": "completed",
      "date": "2026-02-23",
      "updated": "2026-02-23",
      "summary": "Added multiline compose support to minimal TUI via `/paste` (alias `/multiline`) so users can enter/paste multi-line prompts without truncation. The mode collects lines until a single `.` terminator and submits one combined message. Also added fullscreen-mode handling for the new command plus parser/help/tooltip coverage and multiline flow tests.",
      "files_modified": [
        "src/frontends/tui/commands.ts",
        "src/frontends/tui/minimal.ts",
        "src/frontends/tui/components/App.tsx",
        "src/frontends/tui/commands.test.ts",
        "src/frontends/tui/minimal.test.ts",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/frontends/tui/commands.test.ts src/frontends/tui/minimal.test.ts + pnpm typecheck passing"
    },
    "toolloop-execution-claim-recovery": {
      "status": "completed",
      "date": "2026-02-23",
      "updated": "2026-02-23",
      "summary": "Extended NativeAgent no-tool-call recovery to also catch execution-claim text that references known tools (for example `gmail.filter.create returns ...`) without an emitted tool call. Flynn now issues a one-time in-turn nudge and retries the same turn so tool execution or a concrete blocker is produced.",
      "files_modified": [
        "src/backends/native/agent.ts",
        "src/backends/native/agent.test.ts",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/backends/native/agent.test.ts + pnpm typecheck passing"
    },
    "toolloop-action-intent-recovery": {
      "status": "completed",
      "date": "2026-02-23",
      "updated": "2026-02-23",
      "summary": "Hardened NativeAgent tool-loop behavior when models narrate imminent actions without emitting tool calls. Added a one-time in-loop nudge for action-intent text with missing tool calls, so Flynn re-prompts the model to either execute the tool now or return an explicit blocker in the same turn.",
      "files_modified": [
        "src/backends/native/agent.ts",
        "src/backends/native/agent.test.ts",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/backends/native/agent.test.ts + pnpm typecheck passing"
    },
    "gmail-filter-full-scope-auth": {
      "status": "completed",
      "date": "2026-02-23",
      "updated": "2026-02-23",
      "summary": "Expanded `flynn gmail-auth` to request full Gmail OAuth scope (`https://mail.google.com/`) so Flynn tokens have complete Gmail filter permissions. Updated auth URL tests and operator docs/comments to reflect the broader scope and re-auth guidance.",
      "files_modified": [
        "src/cli/gmail-auth.ts",
        "src/cli/gmail-auth.test.ts",
        "README.md",
        "config/default.yaml",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/cli/gmail-auth.test.ts + pnpm typecheck passing"
    },
    "gmail-filter-creation-tooling": {
      "status": "completed",
      "date": "2026-02-23",
      "updated": "2026-02-23",
      "summary": "Added Gmail filter creation support via new `gmail.filter.create` tool with criteria/action validation and OAuth scope guidance. Updated tool policy allowlists/groups and expanded `flynn gmail-auth` scopes to include `gmail.settings.basic` so filter creation works with newly-issued tokens.",
      "files_modified": [
        "src/tools/builtin/gmail.ts",
        "src/tools/builtin/gmail.test.ts",
        "src/tools/policy.ts",
        "src/tools/policy.test.ts",
        "src/cli/gmail-auth.ts",
        "src/cli/gmail-auth.test.ts",
        "README.md",
        "config/default.yaml",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/tools/builtin/gmail.test.ts src/tools/policy.test.ts src/cli/gmail-auth.test.ts + pnpm typecheck passing"
    },
    "searxng-fallback-runtime-endpoint-doc-clarity": {
      "status": "completed",
      "date": "2026-02-23",
      "updated": "2026-02-23",
      "summary": "Clarified operator docs for local SearXNG with homelab fallback by documenting endpoint selection based on Flynn runtime location (Compose-internal service DNS vs host localhost port mapping) and adding an explicit host-run example.",
      "files_modified": [
        "README.md",
        "config/default.yaml",
        "docs/plans/state.json"
      ],
      "test_status": "docs/config comments update only; no runtime code changes"
    },
    "local-searxng-compose-with-fallback-endpoint": {
      "status": "completed",
      "date": "2026-02-23",
      "updated": "2026-02-23",
      "summary": "Added an optional local `searxng` Docker Compose dependency (search profile) and extended `web_search` config/tooling with `fallback_endpoint` so Flynn can query a local SearXNG first and automatically fail over to a homelab backup endpoint when the primary is unavailable.",
      "files_modified": [
        "docker-compose.yml",
        "src/tools/builtin/web-search.ts",
        "src/tools/builtin/web-search.test.ts",
        "src/config/schema.ts",
        "src/daemon/tools.ts",
        "src/gateway/handlers/services.ts",
        "src/gateway/handlers/dockerDependencies.ts",
        "src/gateway/handlers/dockerDependencies.test.ts",
        "README.md",
        "config/default.yaml",
        "docs/api/PROTOCOL.md",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/tools/builtin/web-search.test.ts src/gateway/handlers/services.test.ts src/config/schema.test.ts src/gateway/handlers/dockerDependencies.test.ts + pnpm typecheck passing"
    },
    "dashboard-observability-graphs-and-service-logs": {
      "status": "completed",
      "date": "2026-02-23",
      "updated": "2026-02-23",
      "summary": "Implemented focused observability upgrades in the web dashboard: sampled service health trend graphs for systemd/docker sources and core service log viewing with source selection, filters, and auto-refresh. Added new gateway RPCs (`system.observabilitySources`, `system.observabilitySeries`, `system.serviceLogs`) backed by a bounded observability collector and server-side secret masking on returned log lines.",
      "files_modified": [
        "src/gateway/handlers/observability.ts",
        "src/gateway/handlers/observability.test.ts",
        "src/gateway/handlers/system.ts",
        "src/gateway/handlers/handlers.test.ts",
        "src/gateway/server.ts",
        "src/gateway/ui/pages/dashboard.js",
        "src/gateway/ui/pages/dashboard.test.ts",
        "docs/api/PROTOCOL.md",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/gateway/handlers/observability.test.ts src/gateway/handlers/handlers.test.ts src/gateway/ui/pages/dashboard.test.ts + pnpm typecheck passing"
    },
    "dashboard-docker-dependency-discovery": {
      "status": "completed",
      "date": "2026-02-23",
      "updated": "2026-02-23",
      "summary": "Replaced whisper-only docker dependency handling with dynamic docker-compose discovery. Gateway now discovers profile-scoped services via `docker compose config --profiles` + `config --services` (with `ps --all` fallback) and returns status/control cards for all non-`flynn` compose dependencies (including `brave-search`). Docker dependency controls now operate generically on discovered service IDs.",
      "files_modified": [
        "src/gateway/handlers/dockerDependencies.ts",
        "src/gateway/handlers/dockerDependencies.test.ts",
        "src/gateway/ui/pages/dashboard.test.ts",
        "docs/api/PROTOCOL.md",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/gateway/handlers/dockerDependencies.test.ts src/gateway/handlers/handlers.test.ts src/gateway/ui/pages/dashboard.test.ts + pnpm typecheck passing"
    },
    "brave-search-tooling-docs": {
      "status": "completed",
      "date": "2026-02-23",
      "updated": "2026-02-23",
      "summary": "Documented Brave web-search tooling in operator-facing docs: added README guidance for `web.search`/`web.search.news` provider config (Brave + SearXNG), Brave-specific query parameters, and clarified how the optional `brave-search` compose container relates to built-in tools. Added matching commented config block in `config/default.yaml`.",
      "files_modified": [
        "README.md",
        "config/default.yaml",
        "docs/plans/state.json"
      ],
      "test_status": "docs/config comments update only; no runtime code changes"
    },
    "brave-search-toolset-expansion": {
      "status": "completed",
      "date": "2026-02-23",
      "updated": "2026-02-23",
      "summary": "Expanded Brave web tooling with richer query controls (`country`, `searchLang`, `safeSearch`, `freshness`) and added dedicated `web.search.news` mapped to Brave's news endpoint. Updated tool policy/profile allowlists and prompt-injection secret-arg safeguards so `web.search.*` inherits network secret protections.",
      "files_modified": [
        "src/tools/builtin/web-search.ts",
        "src/tools/builtin/web-search.test.ts",
        "src/tools/builtin/index.test.ts",
        "src/tools/builtin/index.ts",
        "src/tools/policy.ts",
        "src/tools/policy.test.ts",
        "src/tools/executor.ts",
        "src/tools/executor.test.ts",
        "docs/api/TOOLS.md",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/tools/builtin/index.test.ts src/tools/builtin/web-search.test.ts src/tools/policy.test.ts src/tools/executor.test.ts + pnpm typecheck passing"
    },
    "dashboard-docker-dependency-controls": {
      "status": "completed",
      "date": "2026-02-23",
      "updated": "2026-02-23",
      "summary": "Added daemon-style Start/Restart/Stop/Update controls for Docker Dependencies in Live Ops Dashboard. Introduced `system.dockerDependencyControl` RPC, docker compose control handlers for Whisper service lifecycle + image update, and dashboard action wiring with status feedback.",
      "files_modified": [
        "src/gateway/handlers/dockerDependencies.ts",
        "src/gateway/handlers/dockerDependencies.test.ts",
        "src/gateway/handlers/system.ts",
        "src/gateway/handlers/handlers.test.ts",
        "src/gateway/server.ts",
        "src/gateway/ui/pages/dashboard.js",
        "src/gateway/ui/pages/dashboard.test.ts",
        "docs/api/PROTOCOL.md",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/gateway/handlers/dockerDependencies.test.ts src/gateway/handlers/handlers.test.ts src/gateway/ui/pages/dashboard.test.ts + pnpm typecheck passing"
    },
    "dashboard-docker-dependencies-profile-aware-detection": {
      "status": "completed",
      "date": "2026-02-23",
      "updated": "2026-02-23",
      "summary": "Fixed false `not-found` Whisper status in dashboard docker dependency cards by querying docker compose with the `voice` profile enabled (`--profile voice`) for both `config --services` and `ps` probes.",
      "files_modified": [
        "src/gateway/handlers/dockerDependencies.ts",
        "src/gateway/handlers/dockerDependencies.test.ts",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/gateway/handlers/dockerDependencies.test.ts + pnpm typecheck passing"
    },
    "minimal-tui-submitted-line-dedupe": {
      "status": "completed",
      "date": "2026-02-23",
      "updated": "2026-02-23",
      "summary": "Fixed duplicate-looking user messages in minimal TUI by clearing the just-submitted readline prompt line before rendering the timestamped `You` block, so sent content is shown once in the conversation transcript.",
      "files_modified": [
        "src/frontends/tui/minimal.ts",
        "src/frontends/tui/minimal.test.ts",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/frontends/tui/minimal.test.ts passing"
    },
    "dashboard-docker-dependencies-whisper-status": {
      "status": "completed",
      "date": "2026-02-23",
      "updated": "2026-02-23",
      "summary": "Added docker-compose dependency visibility to gateway + dashboard with new `system.dockerDependencies` RPC and Whisper status cards in Live Ops Dashboard. Whisper compose service is now defined in `docker-compose.yml` behind a `voice` profile for optional local transcription runtime.",
      "files_modified": [
        "src/gateway/handlers/dockerDependencies.ts",
        "src/gateway/handlers/dockerDependencies.test.ts",
        "src/gateway/handlers/system.ts",
        "src/gateway/handlers/handlers.test.ts",
        "src/gateway/server.ts",
        "src/gateway/ui/pages/dashboard.js",
        "src/gateway/ui/pages/dashboard.test.ts",
        "docker-compose.yml",
        "README.md",
        "docs/api/PROTOCOL.md",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/gateway/handlers/dockerDependencies.test.ts src/gateway/handlers/handlers.test.ts src/gateway/ui/pages/dashboard.test.ts + pnpm typecheck passing"
    },
    "dashboard-local-backend-update-actions": {
      "status": "completed",
      "date": "2026-02-23",
      "updated": "2026-02-23",
      "summary": "Extended local backend controls with explicit `update` action support. `ollama` update now pulls configured local models, while `llamacpp` uses a safe restart fallback with clear operator messaging. Updated gateway validation, dashboard action wiring, and regression coverage.",
      "files_modified": [
        "src/gateway/handlers/localBackends.ts",
        "src/gateway/handlers/system.ts",
        "src/gateway/handlers/handlers.test.ts",
        "src/gateway/ui/pages/dashboard.js",
        "src/gateway/ui/pages/dashboard.test.ts",
        "docs/api/PROTOCOL.md",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/gateway/handlers/handlers.test.ts src/gateway/ui/pages/dashboard.test.ts + pnpm typecheck passing"
    },
    "dashboard-local-backend-daemon-controls": {
      "status": "completed",
      "date": "2026-02-23",
      "updated": "2026-02-23",
      "summary": "Added local LLM backend operations to gateway + dashboard: status visibility for user-level daemons and per-backend start/restart/stop controls via new `system.localBackends` and `system.localBackendControl` methods. Dashboard now shows daemon status cards and action feedback for local providers.",
      "files_modified": [
        "src/gateway/handlers/localBackends.ts",
        "src/gateway/handlers/system.ts",
        "src/gateway/server.ts",
        "src/gateway/handlers/handlers.test.ts",
        "src/gateway/ui/pages/dashboard.js",
        "src/gateway/ui/pages/dashboard.test.ts",
        "docs/api/PROTOCOL.md",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/gateway/handlers/handlers.test.ts src/gateway/ui/pages/dashboard.test.ts + pnpm typecheck passing"
    },
    "web-ui-form-wiring-regression-tests": {
      "status": "completed",
      "date": "2026-02-22",
      "updated": "2026-02-22",
      "summary": "Added page-level web UI regression coverage for interactive form/button wiring across dashboard, settings, sessions, usage, and chat pages, including assistant control draft-preservation under periodic refresh and key action dispatch paths (`config.patch`, `tools.invoke`, session actions, token usage refresh, chat send/cancel/search).",
      "files_modified": [
        "src/gateway/ui/pages/dashboard.test.ts",
        "src/gateway/ui/pages/settings.test.ts",
        "src/gateway/ui/pages/sessions.test.ts",
        "src/gateway/ui/pages/usage.test.ts",
        "src/gateway/ui/pages/chat.test.ts",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm typecheck + pnpm test:run src/gateway/ui/pages/dashboard.test.ts src/gateway/ui/pages/settings.test.ts src/gateway/ui/pages/sessions.test.ts src/gateway/ui/pages/usage.test.ts src/gateway/ui/pages/chat.test.ts passing"
    },
    "dashboard-assistant-controls-draft-preservation": {
      "status": "completed",
      "date": "2026-02-22",
      "updated": "2026-02-22",
      "summary": "Fixed dashboard assistant control state resets during periodic slow refreshes by preserving unsaved local input/select/checkbox draft values across re-renders (with TTL expiry), including council dropdowns and model-tier selectors.",
      "files_modified": [
        "src/gateway/ui/pages/dashboard.js",
        "src/gateway/ui/pages/dashboard.test.ts",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/gateway/ui/pages/dashboard.test.ts + pnpm typecheck passing"
    },
    "slash-command-parity-and-authoritative-tools": {
      "status": "completed",
      "date": "2026-02-21",
      "updated": "2026-02-21",
      "summary": "Unified slash command behavior across minimal and fullscreen TUI by adding `/tools`, `/research`, and `/council` command parity, wiring shared callbacks, and registering `council.run` in TUI startup when councils are enabled. Added deterministic capability-query handling so tool-inventory prompts return authoritative runtime tool lists instead of model-invented answers.",
      "files_modified": [
        "src/frontends/tui/commands.ts",
        "src/frontends/tui/commands.test.ts",
        "src/frontends/tui/minimal.ts",
        "src/frontends/tui/minimal.test.ts",
        "src/frontends/tui/fullscreen.ts",
        "src/frontends/tui/components/App.tsx",
        "src/commands/types.ts",
        "src/commands/builtin/index.ts",
        "src/commands/builtin/index.test.ts",
        "src/commands/index.ts",
        "src/daemon/routing.ts",
        "src/daemon/routing.test.ts",
        "src/cli/tui.ts",
        "src/backends/native/agent.ts",
        "README.md",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/commands/builtin/index.test.ts src/daemon/routing.test.ts src/frontends/tui/commands.test.ts src/frontends/tui/minimal.test.ts + pnpm typecheck passing"
    },
    "faster-inflight-cancel-propagation": {
      "status": "completed",
      "date": "2026-02-19",
      "updated": "2026-02-19",
      "summary": "Reduced cancellation latency by wiring a run-level AbortSignal from NativeAgent into model and tool execution. `agent.cancel`/`/stop` now abort in-flight model/tool awaits immediately for signal-aware providers/tools instead of waiting for timeout/safe-point boundaries.",
      "files_modified": [
        "src/backends/native/agent.ts",
        "src/tools/executor.ts",
        "src/models/types.ts",
        "src/models/openai.ts",
        "src/models/github.ts",
        "src/models/anthropic.ts",
        "src/models/bedrock.ts",
        "src/models/local/llamacpp.ts",
        "src/backends/native/agent.test.ts",
        "docs/api/PROTOCOL.md",
        "docs/api/TOOLS.md",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/backends/native/agent.test.ts src/tools/executor.test.ts src/models/router.test.ts src/gateway/handlers/agent.test.ts + pnpm typecheck passing"
    },
    "makefile-skills-convenience-targets": {
      "status": "completed",
      "date": "2026-02-17",
      "updated": "2026-02-17",
      "summary": "Added non-interactive Makefile convenience targets for skills workflows (`skills-list`, `skills-info`, `skills-install`, `skills-uninstall`, `skills-refresh`) with explicit argument validation for `SKILL`/`SKILL_PATH` so they are shell- and CI-friendly.",
      "files_modified": [
        "Makefile",
        "docs/plans/state.json"
      ],
      "test_status": "make help lists new skills targets"
    },
    "setup-research-agent-enablement": {
      "status": "completed",
      "date": "2026-02-17",
      "updated": "2026-02-17",
      "summary": "Extended setup Security flow to provision a dedicated research sub-agent (`agent_configs.research`) with selectable tier, so `/research` and research-prefix auto-routing work immediately after setup. Added builder/test coverage and documented optional explicit intents routing example in default config.",
      "files_modified": [
        "src/cli/setup/config.ts",
        "src/cli/setup/security.ts",
        "src/cli/setup/config.test.ts",
        "src/cli/setup/sections.test.ts",
        "config/default.yaml",
        "README.md",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/cli/setup/config.test.ts src/cli/setup/sections.test.ts passing + pnpm typecheck passing"
    },
    "research-prefix-auto-routing": {
      "status": "completed",
      "date": "2026-02-17",
      "updated": "2026-02-17",
      "summary": "Added automatic research routing: when intents are disabled but a `research` agent exists, messages prefixed with `research ...` or `look up ...` now route to the research agent and strip the prefix before processing. Added routing regression tests and README usage examples.",
      "files_modified": [
        "src/daemon/routing.ts",
        "src/daemon/routing.test.ts",
        "README.md",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/daemon/routing.test.ts passing"
    },
    "research-agent-command-quickstart": {
      "status": "completed",
      "date": "2026-02-17",
      "updated": "2026-02-17",
      "summary": "Implemented a first-class `/research` chat command that delegates to `agent_configs.research` through the command fast-path service layer, with clear fallback messages when the research agent is missing. Added README quickstart guidance and aligned default config examples for a safe research profile.",
      "files_modified": [
        "src/commands/types.ts",
        "src/commands/builtin/index.ts",
        "src/commands/builtin/index.test.ts",
        "src/daemon/routing.ts",
        "README.md",
        "config/default.yaml",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/commands/builtin/index.test.ts passing"
    },
    "verbose-only-tool-inventory-output": {
      "status": "completed",
      "date": "2026-02-17",
      "updated": "2026-02-17",
      "summary": "Removed continuous debug inventory emissions (`[Agent] tool-inventory` and `[Routing] tool-policy`) from agent/routing so tool inventory output appears only when requested via `/verbose` toggle-on in TUI.",
      "files_modified": [
        "src/backends/native/agent.ts",
        "src/daemon/routing.ts",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm typecheck passing"
    },
    "verbose-tool-inventory-snapshot": {
      "status": "completed",
      "date": "2026-02-17",
      "updated": "2026-02-17",
      "summary": "Extended `/verbose` in both minimal and fullscreen TUI to emit an immediate tool inventory snapshot from the active agent, including internal/exposed counts and browser tool subsets. Added `NativeAgent.getToolInventorySnapshot()` to expose context-aware filtered tool inventory for diagnostics.",
      "files_modified": [
        "src/backends/native/agent.ts",
        "src/frontends/tui/minimal.ts",
        "src/frontends/tui/components/App.tsx",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/frontends/tui/minimal.test.ts + pnpm typecheck passing"
    },
    "tui-auto-tool-discovery-shared-init": {
      "status": "completed",
      "date": "2026-02-17",
      "updated": "2026-02-17",
      "summary": "Refactored `flynn tui` to use shared daemon tool initialization (`initTools`) instead of hand-maintained core tool registration. This keeps tool discovery for TUI agents in sync with daemon behavior (including browser/web/process/audio policy wiring) across both minimal and fullscreen modes.",
      "files_modified": [
        "src/cli/tui.ts",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm typecheck passing"
    },
    "tui-browser-tool-registration-parity": {
      "status": "completed",
      "date": "2026-02-17",
      "updated": "2026-02-17",
      "summary": "Fixed a registry parity gap in `flynn tui`: the TUI command path now initializes BrowserManager and registers `browser.*` tools when `browser.enabled` is true, matching daemon behavior. Added BrowserManager shutdown to TUI cleanup.",
      "files_modified": [
        "src/cli/tui.ts",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm typecheck passing"
    },
    "tool-policy-context-debug-logging": {
      "status": "completed",
      "date": "2026-02-17",
      "updated": "2026-02-17",
      "summary": "Added debug-level diagnostics for session tool filtering: routing now logs per-session tool-policy context and resolved browser tool allowlist, and NativeAgent now logs both internal dotted tool inventory and model-exposed underscore inventory (including browser subsets). This makes context-specific tool omissions immediately traceable.",
      "files_modified": [
        "src/daemon/routing.ts",
        "src/backends/native/agent.ts",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm typecheck passing"
    },
    "fullscreen-slash-command-parity": {
      "status": "completed",
      "date": "2026-02-17",
      "updated": "2026-02-17",
      "summary": "Expanded fullscreen TUI slash-command support to match minimal mode for `/backend`, `/pair`, and `/elevate`, and added fullscreen `/login` handling for OAuth-based providers (GitHub/OpenAI) with clear guidance for key-entry providers. Wired fullscreen runtime config with pairing/local-provider context so these commands execute with the same session state as minimal mode.",
      "files_modified": [
        "src/frontends/tui/components/App.tsx",
        "src/frontends/tui/fullscreen.ts",
        "src/cli/tui.ts",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm typecheck passing"
    },
    "browser-tools-startup-availability-logging": {
      "status": "completed",
      "date": "2026-02-17",
      "updated": "2026-02-17",
      "summary": "Improved browser tool diagnostics by logging the final policy-allowed `browser.*` tool set at daemon startup whenever browser support is enabled, making it immediately clear why browser tools are or are not visible in a session.",
      "files_modified": [
        "src/daemon/tools.ts",
        "README.md",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm typecheck passing"
    },
    "browser-evaluate-alias-compatibility": {
      "status": "completed",
      "date": "2026-02-17",
      "updated": "2026-02-17",
      "summary": "Added `browser.evaluate` as a compatibility alias for `browser.eval`, updated tool policy/group coverage so the alias is available under `coding`/`group:web`, extended browser registration diagnostics to include the alias, and updated browser docs/tests accordingly.",
      "files_modified": [
        "src/tools/builtin/browser/tools.ts",
        "src/tools/builtin/browser/tools.test.ts",
        "src/tools/policy.ts",
        "src/daemon/tools.ts",
        "config/default.yaml",
        "README.md",
        "docs/api/TOOLS.md",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/tools/builtin/browser/tools.test.ts src/tools/policy.test.ts passing"
    },
    "onboard-command-alias-for-setup-wizard": {
      "status": "completed",
      "date": "2026-02-17",
      "updated": "2026-02-17",
      "summary": "Added a first-class `flynn onboard` CLI entrypoint as an explicit guided-onboarding alias to the setup wizard (`runSetup`), improving onboarding discoverability and OpenClaw-style command-surface parity without changing setup behavior.",
      "files_modified": [
        "src/cli/index.ts",
        "src/cli/index.test.ts",
        "README.md"
      ],
      "test_status": "pnpm test:run src/cli/index.test.ts + pnpm typecheck passing"
    },
    "onboard-command-tests-and-start-guidance": {
      "status": "completed",
      "date": "2026-02-17",
      "updated": "2026-02-17",
      "summary": "Added dedicated onboarding command behavior tests (default + explicit config path) and updated `flynn start` missing-config guidance to suggest `flynn onboard` as the primary guided entrypoint while retaining `flynn setup` compatibility.",
      "files_modified": [
        "src/cli/onboard.test.ts",
        "src/cli/start.ts",
        "src/cli/start.test.ts",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/cli/onboard.test.ts src/cli/start.test.ts src/cli/index.test.ts + pnpm typecheck passing"
    },
    "companion-runtime-client-canvas-rpc-wrappers": {
      "status": "completed",
      "date": "2026-02-17",
      "updated": "2026-02-17",
      "summary": "Extended companion runtime APIs with typed `canvas.*` RPC wrappers (`put/get/list/delete/clear`) and surfaced them through platform companion clients, with integration coverage against live gateway handlers and updated protocol/runtime documentation references.",
      "files_modified": [
        "src/companion/runtimeClient.ts",
        "src/companion/runtimeClient.test.ts",
        "src/companion/platformClients.ts",
        "src/companion/platformClients.test.ts",
        "src/companion/index.ts",
        "README.md",
        "docs/api/PROTOCOL.md",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/companion/runtimeClient.test.ts src/companion/platformClients.test.ts src/companion/platformClients.integration.test.ts + pnpm typecheck passing"
    },
    "companion-platform-bootstrap-helper": {
      "status": "completed",
      "date": "2026-02-17",
      "updated": "2026-02-17",
      "summary": "Added a `bootstrap()` helper to macOS/iOS/Android companion platform clients to standardize startup handshake (node registration followed by capability fetch), with unit and integration coverage.",
      "files_modified": [
        "src/companion/platformClients.ts",
        "src/companion/platformClients.test.ts",
        "src/companion/platformClients.integration.test.ts",
        "src/companion/index.ts",
        "README.md",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/companion/platformClients.test.ts src/companion/platformClients.integration.test.ts + pnpm typecheck passing"
    },
    "companion-platform-heartbeat-helper": {
      "status": "completed",
      "date": "2026-02-17",
      "updated": "2026-02-17",
      "summary": "Added `publishHeartbeat()` convenience methods across platform companion clients to standardize periodic status reporting with safe defaults (`statusText: heartbeat`, `powerSource: unknown`), plus test and docs updates.",
      "files_modified": [
        "src/companion/platformClients.ts",
        "src/companion/platformClients.test.ts",
        "src/companion/platformClients.integration.test.ts",
        "src/companion/index.ts",
        "README.md",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/companion/platformClients.test.ts src/companion/platformClients.integration.test.ts + pnpm typecheck passing"
    },
    "companion-runtime-client-autoconnect": {
      "status": "completed",
      "date": "2026-02-17",
      "updated": "2026-02-17",
      "summary": "Added optional `autoConnect` support to `CompanionRuntimeClient` so RPC calls can establish connections on demand, including connect de-duplication to avoid concurrent open races, plus integration coverage.",
      "files_modified": [
        "src/companion/runtimeClient.ts",
        "src/companion/runtimeClient.test.ts",
        "README.md",
        "docs/api/PROTOCOL.md",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/companion/runtimeClient.test.ts src/companion/platformClients.test.ts src/companion/platformClients.integration.test.ts + pnpm typecheck passing"
    },
    "companion-platform-canvas-integration-coverage": {
      "status": "completed",
      "date": "2026-02-17",
      "updated": "2026-02-17",
      "summary": "Extended live integration coverage for `MacOSCompanionClient` to validate canvas artifact lifecycle (`put/get/list/delete/clear`) through platform wrappers against gateway handlers.",
      "files_modified": [
        "src/companion/platformClients.integration.test.ts",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/companion/platformClients.integration.test.ts src/companion/runtimeClient.test.ts src/companion/platformClients.test.ts + pnpm typecheck passing"
    },
    "companion-heartbeat-loop-utility": {
      "status": "completed",
      "date": "2026-02-17",
      "updated": "2026-02-17",
      "summary": "Added `CompanionHeartbeatLoop`, a reusable periodic heartbeat scheduler for companion runtimes that invokes `publishHeartbeat` with optional payload builders, idempotent start/stop behavior, and error hooks.",
      "files_modified": [
        "src/companion/heartbeatLoop.ts",
        "src/companion/heartbeatLoop.test.ts",
        "src/companion/index.ts",
        "README.md",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/companion/heartbeatLoop.test.ts src/companion/platformClients.test.ts + pnpm typecheck passing"
    },
    "companion-platform-default-canvas-session": {
      "status": "completed",
      "date": "2026-02-17",
      "updated": "2026-02-17",
      "summary": "Added optional `defaultSessionId` to platform companion clients so canvas helper methods can omit per-call session IDs, while preserving explicit-session overrides and clear validation errors when no session is available.",
      "files_modified": [
        "src/companion/platformClients.ts",
        "src/companion/platformClients.test.ts",
        "src/companion/platformClients.integration.test.ts",
        "src/companion/index.ts",
        "README.md",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/companion/platformClients.test.ts src/companion/platformClients.integration.test.ts + pnpm typecheck passing"
    },
    "companion-heartbeat-loop-failure-threshold": {
      "status": "completed",
      "date": "2026-02-17",
      "updated": "2026-02-17",
      "summary": "Extended `CompanionHeartbeatLoop` with failure-threshold controls (`maxConsecutiveFailures`) and `onFailureLimitReached` callback support so companion runtimes can auto-stop noisy loops after repeated heartbeat failures.",
      "files_modified": [
        "src/companion/heartbeatLoop.ts",
        "src/companion/heartbeatLoop.test.ts",
        "README.md",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/companion/heartbeatLoop.test.ts src/companion/platformClients.test.ts + pnpm typecheck passing"
    },
    "companion-runtime-event-subscriptions": {
      "status": "completed",
      "date": "2026-02-17",
      "updated": "2026-02-17",
      "summary": "Added event subscription support to `CompanionRuntimeClient` via `subscribeEvents()` so companion runtimes can receive gateway stream events with safe callback isolation and explicit unsubscribe flow.",
      "files_modified": [
        "src/companion/runtimeClient.ts",
        "src/companion/runtimeClient.test.ts",
        "src/companion/index.ts",
        "README.md",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/companion/runtimeClient.test.ts src/companion/platformClients.test.ts src/companion/platformClients.integration.test.ts + pnpm typecheck passing"
    },
    "companion-runtime-filtered-event-helper": {
      "status": "completed",
      "date": "2026-02-17",
      "updated": "2026-02-17",
      "summary": "Added typed `subscribeEvent(eventName, handler)` helper to `CompanionRuntimeClient` for filtered event consumption on top of generic `subscribeEvents`, including unsubscribe behavior tests.",
      "files_modified": [
        "src/companion/runtimeClient.ts",
        "src/companion/runtimeClient.test.ts",
        "src/companion/index.ts",
        "README.md",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/companion/runtimeClient.test.ts src/companion/platformClients.test.ts src/companion/platformClients.integration.test.ts src/companion/heartbeatLoop.test.ts + pnpm typecheck passing"
    },
    "companion-runtime-wait-for-event-helper": {
      "status": "completed",
      "date": "2026-02-17",
      "updated": "2026-02-17",
      "summary": "Added `waitForEvent()` helper to `CompanionRuntimeClient` for promise-based event awaiting with timeout and optional payload predicate filtering.",
      "files_modified": [
        "src/companion/runtimeClient.ts",
        "src/companion/runtimeClient.test.ts",
        "src/companion/index.ts",
        "README.md",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/companion/runtimeClient.test.ts src/companion/platformClients.test.ts src/companion/platformClients.integration.test.ts src/companion/heartbeatLoop.test.ts + pnpm typecheck passing"
    },
    "companion-runtime-bootstrap-helper": {
      "status": "completed",
      "date": "2026-02-17",
      "updated": "2026-02-17",
      "summary": "Added `bootstrapNode()` to `CompanionRuntimeClient` to perform register + capability negotiation in one call with optional `system.capabilities` inclusion.",
      "files_modified": [
        "src/companion/runtimeClient.ts",
        "src/companion/runtimeClient.test.ts",
        "src/companion/index.ts",
        "README.md",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/companion/runtimeClient.test.ts src/companion/platformClients.test.ts src/companion/platformClients.integration.test.ts src/companion/heartbeatLoop.test.ts + pnpm typecheck passing"
    },
    "companion-heartbeat-loop-manual-tick": {
      "status": "completed",
      "date": "2026-02-17",
      "updated": "2026-02-17",
      "summary": "Added `tickNow()` on `CompanionHeartbeatLoop` to allow explicit immediate heartbeat sends independent of the periodic scheduler lifecycle.",
      "files_modified": [
        "src/companion/heartbeatLoop.ts",
        "src/companion/heartbeatLoop.test.ts",
        "README.md",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/companion/heartbeatLoop.test.ts src/companion/runtimeClient.test.ts src/companion/platformClients.test.ts src/companion/platformClients.integration.test.ts + pnpm typecheck passing"
    },
    "companion-runtime-and-loop-option-validation": {
      "status": "completed",
      "date": "2026-02-17",
      "updated": "2026-02-17",
      "summary": "Added constructor option validation guards for companion runtime utilities (`requestTimeoutMs > 0`, `intervalMs > 0`, and valid `maxConsecutiveFailures` bounds) with regression tests.",
      "files_modified": [
        "src/companion/runtimeClient.ts",
        "src/companion/runtimeClient.test.ts",
        "src/companion/heartbeatLoop.ts",
        "src/companion/heartbeatLoop.test.ts",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/companion/runtimeClient.test.ts src/companion/heartbeatLoop.test.ts src/companion/platformClients.test.ts src/companion/platformClients.integration.test.ts + pnpm typecheck passing"
    },
    "companion-platform-heartbeat-loop-factory": {
      "status": "completed",
      "date": "2026-02-17",
      "updated": "2026-02-17",
      "summary": "Added `createHeartbeatLoop()` to macOS/iOS/Android platform clients, returning a client-bound `CompanionHeartbeatLoop` for minimal heartbeat wiring in companion app runtimes.",
      "files_modified": [
        "src/companion/platformClients.ts",
        "src/companion/platformClients.test.ts",
        "README.md",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/companion/platformClients.test.ts src/companion/heartbeatLoop.test.ts src/companion/runtimeClient.test.ts src/companion/platformClients.integration.test.ts + pnpm typecheck passing"
    },
    "companion-runtime-clear-event-subscriptions": {
      "status": "completed",
      "date": "2026-02-17",
      "updated": "2026-02-17",
      "summary": "Added `clearEventSubscriptions()` to `CompanionRuntimeClient` for explicit teardown of all registered event handlers, with test coverage for generic + filtered subscriptions.",
      "files_modified": [
        "src/companion/runtimeClient.ts",
        "src/companion/runtimeClient.test.ts",
        "README.md",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/companion/runtimeClient.test.ts src/companion/platformClients.test.ts src/companion/platformClients.integration.test.ts src/companion/heartbeatLoop.test.ts + pnpm typecheck passing"
    },
    "companion-heartbeat-loop-jitter": {
      "status": "completed",
      "date": "2026-02-17",
      "updated": "2026-02-17",
      "summary": "Added optional heartbeat interval jitter controls (`jitterRatio`) to `CompanionHeartbeatLoop` so large companion fleets can spread heartbeat load over time.",
      "files_modified": [
        "src/companion/heartbeatLoop.ts",
        "src/companion/heartbeatLoop.test.ts",
        "README.md",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/companion/heartbeatLoop.test.ts src/companion/runtimeClient.test.ts src/companion/platformClients.test.ts src/companion/platformClients.integration.test.ts + pnpm typecheck passing"
    },
    "companion-runtime-wait-for-event-abort-signal": {
      "status": "completed",
      "date": "2026-02-17",
      "updated": "2026-02-17",
      "summary": "Extended `waitForEvent()` with `AbortSignal` support so companion runtimes can cancel pending event waits deterministically (in addition to timeout-based cancellation).",
      "files_modified": [
        "src/companion/runtimeClient.ts",
        "src/companion/runtimeClient.test.ts",
        "README.md",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/companion/runtimeClient.test.ts src/companion/heartbeatLoop.test.ts src/companion/platformClients.test.ts src/companion/platformClients.integration.test.ts + pnpm typecheck passing"
    },
    "companion-heartbeat-loop-observability-counters": {
      "status": "completed",
      "date": "2026-02-17",
      "updated": "2026-02-17",
      "summary": "Added heartbeat loop observability counters (`failureCount`, `lastFailure`) so companion runtimes can introspect heartbeat health state between retries and recovery.",
      "files_modified": [
        "src/companion/heartbeatLoop.ts",
        "src/companion/heartbeatLoop.test.ts",
        "README.md",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/companion/heartbeatLoop.test.ts src/companion/runtimeClient.test.ts src/companion/platformClients.test.ts src/companion/platformClients.integration.test.ts + pnpm typecheck passing"
    },
    "companion-runtime-dispose-helper": {
      "status": "completed",
      "date": "2026-02-17",
      "updated": "2026-02-17",
      "summary": "Added `dispose()` to `CompanionRuntimeClient` as a lifecycle teardown helper that disconnects WebSocket state and clears all registered event subscriptions.",
      "files_modified": [
        "src/companion/runtimeClient.ts",
        "src/companion/runtimeClient.test.ts",
        "README.md",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/companion/runtimeClient.test.ts src/companion/heartbeatLoop.test.ts src/companion/platformClients.test.ts src/companion/platformClients.integration.test.ts + pnpm typecheck passing"
    },
    "companion-platform-dispose-helper": {
      "status": "completed",
      "date": "2026-02-17",
      "updated": "2026-02-17",
      "summary": "Added `dispose()` lifecycle passthrough on platform clients (macOS/iOS/Android) for unified companion runtime teardown handling.",
      "files_modified": [
        "src/companion/platformClients.ts",
        "src/companion/platformClients.test.ts",
        "README.md",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/companion/platformClients.test.ts src/companion/runtimeClient.test.ts src/companion/heartbeatLoop.test.ts src/companion/platformClients.integration.test.ts + pnpm typecheck passing"
    },
    "companion-runtime-typed-stream-subscriptions": {
      "status": "completed",
      "date": "2026-02-17",
      "updated": "2026-02-17",
      "summary": "Added typed stream-event convenience subscriptions on `CompanionRuntimeClient` (`subscribeAgentStream`, `subscribeAgentTyping`) and exported canonical event-name constants.",
      "files_modified": [
        "src/companion/runtimeClient.ts",
        "src/companion/runtimeClient.test.ts",
        "src/companion/index.ts",
        "README.md",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/companion/runtimeClient.test.ts src/companion/platformClients.test.ts src/companion/heartbeatLoop.test.ts src/companion/platformClients.integration.test.ts + pnpm typecheck passing"
    },
    "companion-heartbeat-loop-success-hook": {
      "status": "completed",
      "date": "2026-02-17",
      "updated": "2026-02-17",
      "summary": "Added `onSuccess` callback support to `CompanionHeartbeatLoop` so callers can observe successful heartbeat responses for telemetry and health instrumentation.",
      "files_modified": [
        "src/companion/heartbeatLoop.ts",
        "src/companion/heartbeatLoop.test.ts",
        "README.md",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/companion/heartbeatLoop.test.ts src/companion/runtimeClient.test.ts src/companion/platformClients.test.ts src/companion/platformClients.integration.test.ts + pnpm typecheck passing"
    },
    "companion-platform-bootstrap-system-capabilities-option": {
      "status": "completed",
      "date": "2026-02-17",
      "updated": "2026-02-17",
      "summary": "Extended platform client `bootstrap()` to delegate to `runtime.bootstrapNode()` and optionally include `system.capabilities` in bootstrap responses.",
      "files_modified": [
        "src/companion/platformClients.ts",
        "src/companion/platformClients.test.ts",
        "src/companion/index.ts",
        "README.md",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/companion/platformClients.test.ts src/companion/runtimeClient.test.ts src/companion/heartbeatLoop.test.ts src/companion/platformClients.integration.test.ts + pnpm typecheck passing"
    },
    "companion-runtime-typed-wait-stream-helpers": {
      "status": "completed",
      "date": "2026-02-17",
      "updated": "2026-02-17",
      "summary": "Added typed stream wait helpers on `CompanionRuntimeClient` (`waitForAgentStream`, `waitForAgentTyping`) built on `waitForEvent` for common companion synchronization flows.",
      "files_modified": [
        "src/companion/runtimeClient.ts",
        "src/companion/runtimeClient.test.ts",
        "README.md",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/companion/runtimeClient.test.ts src/companion/platformClients.test.ts src/companion/heartbeatLoop.test.ts src/companion/platformClients.integration.test.ts + pnpm typecheck passing"
    },
    "companion-runtime-context-warning-helpers": {
      "status": "completed",
      "date": "2026-02-17",
      "updated": "2026-02-17",
      "summary": "Added dedicated context-warning event helpers on `CompanionRuntimeClient` (`subscribeContextWarning`, `waitForContextWarning`) for proactive context-pressure handling flows.",
      "files_modified": [
        "src/companion/runtimeClient.ts",
        "src/companion/runtimeClient.test.ts",
        "README.md",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/companion/runtimeClient.test.ts src/companion/platformClients.test.ts src/companion/heartbeatLoop.test.ts src/companion/platformClients.integration.test.ts + pnpm typecheck passing"
    },
    "companion-heartbeat-loop-state-snapshot": {
      "status": "completed",
      "date": "2026-02-17",
      "updated": "2026-02-17",
      "summary": "Added `getState()` snapshot helper on `CompanionHeartbeatLoop` to expose consolidated runtime state (`running`, `failureCount`, `lastFailure`) for companion observability surfaces.",
      "files_modified": [
        "src/companion/heartbeatLoop.ts",
        "src/companion/heartbeatLoop.test.ts",
        "src/companion/index.ts",
        "README.md",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/companion/heartbeatLoop.test.ts src/companion/runtimeClient.test.ts src/companion/platformClients.test.ts src/companion/platformClients.integration.test.ts + pnpm typecheck passing"
    },
    "companion-platform-stream-helper-passthrough": {
      "status": "completed",
      "date": "2026-02-17",
      "updated": "2026-02-17",
      "summary": "Added platform-wrapper passthrough helpers for agent stream flows (`subscribeAgentStream`, `waitForAgentStream`) so companion apps can stay on platform clients instead of dropping to raw runtime APIs.",
      "files_modified": [
        "src/companion/platformClients.ts",
        "src/companion/platformClients.test.ts",
        "README.md",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/companion/platformClients.test.ts src/companion/runtimeClient.test.ts src/companion/heartbeatLoop.test.ts src/companion/platformClients.integration.test.ts + pnpm typecheck passing"
    },
    "companion-platform-stream-helper-parity": {
      "status": "completed",
      "date": "2026-02-17",
      "updated": "2026-02-17",
      "summary": "Extended platform wrapper event parity by adding passthroughs for typing/context warning stream subscriptions and wait helpers alongside existing stream-token helpers.",
      "files_modified": [
        "src/companion/platformClients.ts",
        "src/companion/platformClients.test.ts",
        "README.md",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/companion/platformClients.test.ts src/companion/runtimeClient.test.ts src/companion/heartbeatLoop.test.ts src/companion/platformClients.integration.test.ts + pnpm typecheck passing"
    },
    "companion-runtime-waiter-teardown-rejection": {
      "status": "completed",
      "date": "2026-02-17",
      "updated": "2026-02-17",
      "summary": "Hardened `waitForEvent()` lifecycle semantics by rejecting pending waiters immediately on teardown paths (`disconnect`, `dispose`, `clearEventSubscriptions`) instead of waiting for timeout.",
      "files_modified": [
        "src/companion/runtimeClient.ts",
        "src/companion/runtimeClient.test.ts",
        "README.md",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/companion/runtimeClient.test.ts src/companion/platformClients.test.ts src/companion/heartbeatLoop.test.ts src/companion/platformClients.integration.test.ts + pnpm typecheck passing"
    },
    "companion-runtime-wait-for-any-event-helper": {
      "status": "completed",
      "date": "2026-02-17",
      "updated": "2026-02-17",
      "summary": "Added `waitForAnyEvent()` on `CompanionRuntimeClient` to await the first matching event from a set of event names with timeout/predicate/abort support and typed event envelopes.",
      "files_modified": [
        "src/companion/runtimeClient.ts",
        "src/companion/runtimeClient.test.ts",
        "src/companion/index.ts",
        "README.md",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/companion/runtimeClient.test.ts src/companion/platformClients.test.ts src/companion/heartbeatLoop.test.ts src/companion/platformClients.integration.test.ts + pnpm typecheck passing"
    },
    "companion-platform-generic-event-passthrough": {
      "status": "completed",
      "date": "2026-02-17",
      "updated": "2026-02-17",
      "summary": "Added generic event passthroughs on platform clients (`subscribeEvents`, `waitForAnyEvent`) to match runtime event API coverage at the platform wrapper layer.",
      "files_modified": [
        "src/companion/platformClients.ts",
        "src/companion/platformClients.test.ts",
        "README.md",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/companion/platformClients.test.ts src/companion/runtimeClient.test.ts src/companion/heartbeatLoop.test.ts src/companion/platformClients.integration.test.ts + pnpm typecheck passing"
    },
    "companion-platform-event-subscription-teardown": {
      "status": "completed",
      "date": "2026-02-17",
      "updated": "2026-02-17",
      "summary": "Added `clearEventSubscriptions()` passthrough to platform clients so event handler teardown can be managed directly at the platform wrapper layer.",
      "files_modified": [
        "src/companion/platformClients.ts",
        "src/companion/platformClients.test.ts",
        "README.md",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/companion/platformClients.test.ts src/companion/runtimeClient.test.ts src/companion/heartbeatLoop.test.ts src/companion/platformClients.integration.test.ts + pnpm typecheck passing"
    },
    "companion-runtime-known-event-names": {
      "status": "completed",
      "date": "2026-02-17",
      "updated": "2026-02-17",
      "summary": "Added typed companion event-name contract (`CompanionEventName`) and `listKnownEventNames()` helper for discoverable event surfaces in companion clients.",
      "files_modified": [
        "src/companion/runtimeClient.ts",
        "src/companion/runtimeClient.test.ts",
        "src/companion/index.ts",
        "README.md",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/companion/runtimeClient.test.ts src/companion/platformClients.test.ts src/companion/heartbeatLoop.test.ts src/companion/platformClients.integration.test.ts + pnpm typecheck passing"
    },
    "companion-platform-known-event-names-passthrough": {
      "status": "completed",
      "date": "2026-02-17",
      "updated": "2026-02-17",
      "summary": "Added `listKnownEventNames()` passthrough on platform clients so wrappers can expose the runtime event contract directly.",
      "files_modified": [
        "src/companion/platformClients.ts",
        "src/companion/platformClients.test.ts",
        "README.md",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/companion/platformClients.test.ts src/companion/runtimeClient.test.ts src/companion/heartbeatLoop.test.ts src/companion/platformClients.integration.test.ts + pnpm typecheck passing"
    },
    "companion-runtime-event-subscription-count": {
      "status": "completed",
      "date": "2026-02-17",
      "updated": "2026-02-17",
      "summary": "Added `eventSubscriptionCount` on `CompanionRuntimeClient` to expose active event-listener cardinality for runtime observability and debugging.",
      "files_modified": [
        "src/companion/runtimeClient.ts",
        "src/companion/runtimeClient.test.ts",
        "README.md",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/companion/runtimeClient.test.ts src/companion/platformClients.test.ts src/companion/heartbeatLoop.test.ts src/companion/platformClients.integration.test.ts + pnpm typecheck passing"
    },
    "companion-platform-event-subscription-count-passthrough": {
      "status": "completed",
      "date": "2026-02-17",
      "updated": "2026-02-17",
      "summary": "Added `eventSubscriptionCount` passthrough on platform companion clients so wrappers expose active runtime event-listener cardinality for observability and debugging.",
      "files_modified": [
        "src/companion/platformClients.ts",
        "src/companion/platformClients.test.ts",
        "README.md",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/companion/platformClients.test.ts src/companion/runtimeClient.test.ts src/companion/heartbeatLoop.test.ts src/companion/platformClients.integration.test.ts + pnpm typecheck passing"
    },
    "companion-platform-single-event-passthrough": {
      "status": "completed",
      "date": "2026-02-17",
      "updated": "2026-02-17",
      "summary": "Added `subscribeEvent()` and `waitForEvent()` passthroughs on platform companion clients so wrappers expose full single-event subscription and waiting semantics from the runtime client.",
      "files_modified": [
        "src/companion/platformClients.ts",
        "src/companion/platformClients.test.ts",
        "README.md",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/companion/platformClients.test.ts src/companion/runtimeClient.test.ts src/companion/heartbeatLoop.test.ts src/companion/platformClients.integration.test.ts + pnpm typecheck passing"
    },
    "companion-platform-connected-state-passthrough": {
      "status": "completed",
      "date": "2026-02-17",
      "updated": "2026-02-17",
      "summary": "Added `connected` passthrough getters on platform companion clients so wrappers expose runtime WebSocket connectivity state for lightweight health checks and flow guards.",
      "files_modified": [
        "src/companion/platformClients.ts",
        "src/companion/platformClients.test.ts",
        "README.md",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/companion/platformClients.test.ts src/companion/runtimeClient.test.ts src/companion/heartbeatLoop.test.ts src/companion/platformClients.integration.test.ts + pnpm typecheck passing"
    },
    "companion-platform-dispose-close-params": {
      "status": "completed",
      "date": "2026-02-17",
      "updated": "2026-02-17",
      "summary": "Extended platform client `dispose()` to accept optional WebSocket close `code`/`reason` and forward them to runtime disposal for explicit teardown signaling.",
      "files_modified": [
        "src/companion/platformClients.ts",
        "src/companion/platformClients.test.ts",
        "README.md",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/companion/platformClients.test.ts src/companion/runtimeClient.test.ts src/companion/heartbeatLoop.test.ts src/companion/platformClients.integration.test.ts + pnpm typecheck passing"
    },
    "companion-heartbeat-loop-success-observability": {
      "status": "completed",
      "date": "2026-02-17",
      "updated": "2026-02-17",
      "summary": "Extended `CompanionHeartbeatLoop` state observability with success metrics (`successCount`, `lastSuccessAt`) so callers can track successful heartbeat progression in addition to failure state.",
      "files_modified": [
        "src/companion/heartbeatLoop.ts",
        "src/companion/heartbeatLoop.test.ts",
        "README.md",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/companion/heartbeatLoop.test.ts src/companion/platformClients.test.ts src/companion/runtimeClient.test.ts src/companion/platformClients.integration.test.ts + pnpm typecheck passing"
    },
    "companion-platform-wait-for-any-event-typed-names": {
      "status": "completed",
      "date": "2026-02-17",
      "updated": "2026-02-17",
      "summary": "Aligned platform `waitForAnyEvent()` signatures with runtime typing so event-name arrays accept typed companion event names (`CompanionEventName`) in addition to arbitrary strings.",
      "files_modified": [
        "src/companion/platformClients.ts",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/companion/platformClients.test.ts src/companion/runtimeClient.test.ts src/companion/heartbeatLoop.test.ts src/companion/platformClients.integration.test.ts + pnpm typecheck passing"
    },
    "companion-platform-connected-integration-coverage": {
      "status": "completed",
      "date": "2026-02-17",
      "updated": "2026-02-17",
      "summary": "Added live gateway integration coverage to verify platform `connected` passthrough tracks runtime WebSocket connect/disconnect lifecycle.",
      "files_modified": [
        "src/companion/platformClients.integration.test.ts",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/companion/platformClients.integration.test.ts src/companion/platformClients.test.ts src/companion/runtimeClient.test.ts src/companion/heartbeatLoop.test.ts + pnpm typecheck passing"
    },
    "companion-heartbeat-loop-timer-dedup": {
      "status": "completed",
      "date": "2026-02-17",
      "updated": "2026-02-17",
      "summary": "Prevented duplicate pending timers in `CompanionHeartbeatLoop` by clearing any existing scheduled timeout before re-scheduling, with regression coverage for `tickNow()` during active loops.",
      "files_modified": [
        "src/companion/heartbeatLoop.ts",
        "src/companion/heartbeatLoop.test.ts",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/companion/heartbeatLoop.test.ts src/companion/platformClients.test.ts src/companion/runtimeClient.test.ts src/companion/platformClients.integration.test.ts + pnpm typecheck passing"
    },
    "companion-platform-event-subscription-observability-integration": {
      "status": "completed",
      "date": "2026-02-17",
      "updated": "2026-02-17",
      "summary": "Added integration coverage for platform event subscription observability lifecycle, verifying `eventSubscriptionCount` behavior across subscribe, unsubscribe, and `clearEventSubscriptions()` operations.",
      "files_modified": [
        "src/companion/platformClients.integration.test.ts",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/companion/platformClients.integration.test.ts src/companion/platformClients.test.ts src/companion/runtimeClient.test.ts src/companion/heartbeatLoop.test.ts + pnpm typecheck passing"
    },
    "companion-runtime-socket-close-waiter-rejection": {
      "status": "completed",
      "date": "2026-02-17",
      "updated": "2026-02-17",
      "summary": "Hardened runtime close-path behavior so unexpected WebSocket closure clears stale socket references and rejects pending event waiters with a deterministic `WebSocket closed` error.",
      "files_modified": [
        "src/companion/runtimeClient.ts",
        "src/companion/runtimeClient.test.ts",
        "README.md",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/companion/runtimeClient.test.ts src/companion/platformClients.test.ts src/companion/heartbeatLoop.test.ts src/companion/platformClients.integration.test.ts + pnpm typecheck passing"
    },
    "companion-runtime-wait-for-any-close-rejection-coverage": {
      "status": "completed",
      "date": "2026-02-17",
      "updated": "2026-02-17",
      "summary": "Added regression coverage proving `waitForAnyEvent()` rejects with `WebSocket closed` when the runtime socket closes unexpectedly.",
      "files_modified": [
        "src/companion/runtimeClient.test.ts",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/companion/runtimeClient.test.ts src/companion/platformClients.test.ts src/companion/heartbeatLoop.test.ts src/companion/platformClients.integration.test.ts + pnpm typecheck passing"
    },
    "companion-runtime-event-name-input-validation": {
      "status": "completed",
      "date": "2026-02-17",
      "updated": "2026-02-17",
      "summary": "Added runtime input validation for event wait helpers so `waitForEvent()` rejects empty event names and `waitForAnyEvent()` rejects lists containing empty names.",
      "files_modified": [
        "src/companion/runtimeClient.ts",
        "src/companion/runtimeClient.test.ts",
        "README.md",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/companion/runtimeClient.test.ts src/companion/platformClients.test.ts src/companion/heartbeatLoop.test.ts src/companion/platformClients.integration.test.ts + pnpm typecheck passing"
    },
    "companion-runtime-event-name-type-guard": {
      "status": "completed",
      "date": "2026-02-17",
      "updated": "2026-02-17",
      "summary": "Hardened runtime event-name validation with explicit string type guards so `waitForEvent()`/`waitForAnyEvent()` reject non-string inputs deterministically.",
      "files_modified": [
        "src/companion/runtimeClient.ts",
        "src/companion/runtimeClient.test.ts",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/companion/runtimeClient.test.ts src/companion/platformClients.test.ts src/companion/heartbeatLoop.test.ts src/companion/platformClients.integration.test.ts + pnpm typecheck passing"
    },
    "companion-heartbeat-loop-restart-state-reset-coverage": {
      "status": "completed",
      "date": "2026-02-17",
      "updated": "2026-02-17",
      "summary": "Added restart regression coverage for `CompanionHeartbeatLoop` to verify success/failure counters and timestamps are reset deterministically on restart.",
      "files_modified": [
        "src/companion/heartbeatLoop.test.ts",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/companion/heartbeatLoop.test.ts src/companion/platformClients.test.ts src/companion/runtimeClient.test.ts src/companion/platformClients.integration.test.ts + pnpm typecheck passing"
    },
    "companion-runtime-pending-request-observability": {
      "status": "completed",
      "date": "2026-02-17",
      "updated": "2026-02-17",
      "summary": "Added runtime `pendingRequestCount` observability and platform passthrough getters so companion runtimes can inspect in-flight RPC request cardinality.",
      "files_modified": [
        "src/companion/runtimeClient.ts",
        "src/companion/runtimeClient.test.ts",
        "src/companion/platformClients.ts",
        "src/companion/platformClients.test.ts",
        "README.md",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/companion/runtimeClient.test.ts src/companion/platformClients.test.ts src/companion/heartbeatLoop.test.ts src/companion/platformClients.integration.test.ts + pnpm typecheck passing"
    },
    "companion-runtime-pending-event-wait-observability": {
      "status": "completed",
      "date": "2026-02-17",
      "updated": "2026-02-17",
      "summary": "Added runtime `pendingEventWaitCount` observability and platform passthrough getters so companion runtimes can inspect active waiter cardinality for `waitFor*` event flows.",
      "files_modified": [
        "src/companion/runtimeClient.ts",
        "src/companion/runtimeClient.test.ts",
        "src/companion/platformClients.ts",
        "src/companion/platformClients.test.ts",
        "README.md",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/companion/runtimeClient.test.ts src/companion/platformClients.test.ts src/companion/heartbeatLoop.test.ts src/companion/platformClients.integration.test.ts + pnpm typecheck passing"
    },
    "companion-pending-event-wait-count-lifecycle-coverage": {
      "status": "completed",
      "date": "2026-02-17",
      "updated": "2026-02-17",
      "summary": "Added lifecycle coverage for `pendingEventWaitCount` across runtime and platform wait flows, including `waitForAnyEvent()` increment/decrement and clear-subscription rejection teardown.",
      "files_modified": [
        "src/companion/runtimeClient.test.ts",
        "src/companion/platformClients.integration.test.ts",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/companion/runtimeClient.test.ts src/companion/platformClients.test.ts src/companion/heartbeatLoop.test.ts src/companion/platformClients.integration.test.ts + pnpm typecheck passing"
    },
    "companion-runtime-has-pending-work-observability": {
      "status": "completed",
      "date": "2026-02-17",
      "updated": "2026-02-17",
      "summary": "Added runtime `hasPendingWork` convenience getter (derived from pending RPC + event waits) and platform passthrough getters for lightweight busy-state checks.",
      "files_modified": [
        "src/companion/runtimeClient.ts",
        "src/companion/runtimeClient.test.ts",
        "src/companion/platformClients.ts",
        "src/companion/platformClients.test.ts",
        "README.md",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/companion/runtimeClient.test.ts src/companion/platformClients.test.ts src/companion/heartbeatLoop.test.ts src/companion/platformClients.integration.test.ts + pnpm typecheck passing"
    },
    "companion-runtime-wait-for-idle-helper": {
      "status": "completed",
      "date": "2026-02-17",
      "updated": "2026-02-17",
      "summary": "Added runtime `waitForIdle()` helper (timeout/poll/abort aware) to await drain of pending RPC/event wait work, with platform passthrough methods and validation/lifecycle tests.",
      "files_modified": [
        "src/companion/runtimeClient.ts",
        "src/companion/runtimeClient.test.ts",
        "src/companion/platformClients.ts",
        "src/companion/platformClients.test.ts",
        "src/companion/index.ts",
        "README.md",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/companion/runtimeClient.test.ts src/companion/platformClients.test.ts src/companion/heartbeatLoop.test.ts src/companion/platformClients.integration.test.ts + pnpm typecheck passing"
    },
    "companion-platform-wait-for-idle-integration-coverage": {
      "status": "completed",
      "date": "2026-02-17",
      "updated": "2026-02-17",
      "summary": "Added platform integration coverage for `waitForIdle()` to verify idle-drain synchronization resolves after pending event waiters are cleared via platform wrapper APIs.",
      "files_modified": [
        "src/companion/platformClients.integration.test.ts",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/companion/platformClients.integration.test.ts src/companion/platformClients.test.ts src/companion/runtimeClient.test.ts src/companion/heartbeatLoop.test.ts + pnpm typecheck passing"
    },
    "companion-runtime-wait-for-idle-abort-coverage": {
      "status": "completed",
      "date": "2026-02-17",
      "updated": "2026-02-17",
      "summary": "Added abort-signal regression coverage for runtime `waitForIdle()` so pending idle waits cancel deterministically with explicit abort errors.",
      "files_modified": [
        "src/companion/runtimeClient.test.ts",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/companion/runtimeClient.test.ts src/companion/platformClients.test.ts src/companion/heartbeatLoop.test.ts src/companion/platformClients.integration.test.ts + pnpm typecheck passing"
    },
    "companion-runtime-wait-for-idle-timeout-validation": {
      "status": "completed",
      "date": "2026-02-17",
      "updated": "2026-02-17",
      "summary": "Added `waitForIdle()` timeout validation guardrails (`timeoutMs > 0`) with regression tests for deterministic option validation behavior.",
      "files_modified": [
        "src/companion/runtimeClient.ts",
        "src/companion/runtimeClient.test.ts",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/companion/runtimeClient.test.ts src/companion/platformClients.test.ts src/companion/heartbeatLoop.test.ts src/companion/platformClients.integration.test.ts + pnpm typecheck passing"
    },
    "companion-heartbeat-loop-jitter-sample-normalization": {
      "status": "completed",
      "date": "2026-02-17",
      "updated": "2026-02-17",
      "summary": "Hardened heartbeat jitter scheduling by normalizing invalid `randomFn` samples (NaN/out-of-range) before delay calculation, with regression coverage for clamped/fallback behavior.",
      "files_modified": [
        "src/companion/heartbeatLoop.ts",
        "src/companion/heartbeatLoop.test.ts",
        "README.md",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/companion/heartbeatLoop.test.ts src/companion/platformClients.test.ts src/companion/runtimeClient.test.ts src/companion/platformClients.integration.test.ts + pnpm typecheck passing"
    },
    "companion-runtime-pending-work-snapshot-helper": {
      "status": "completed",
      "date": "2026-02-17",
      "updated": "2026-02-17",
      "summary": "Added runtime `getPendingWorkSnapshot()` helper and platform passthroughs for single-call pending-work state inspection (`pendingRequestCount`, `pendingEventWaitCount`, `hasPendingWork`).",
      "files_modified": [
        "src/companion/runtimeClient.ts",
        "src/companion/runtimeClient.test.ts",
        "src/companion/platformClients.ts",
        "src/companion/platformClients.test.ts",
        "src/companion/index.ts",
        "README.md",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/companion/runtimeClient.test.ts src/companion/platformClients.test.ts src/companion/heartbeatLoop.test.ts src/companion/platformClients.integration.test.ts + pnpm typecheck passing"
    },
    "companion-platform-pending-work-snapshot-integration-coverage": {
      "status": "completed",
      "date": "2026-02-17",
      "updated": "2026-02-17",
      "summary": "Added platform integration coverage for `getPendingWorkSnapshot()` across active waiter and teardown lifecycle transitions.",
      "files_modified": [
        "src/companion/platformClients.integration.test.ts",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/companion/platformClients.integration.test.ts src/companion/platformClients.test.ts src/companion/runtimeClient.test.ts src/companion/heartbeatLoop.test.ts + pnpm typecheck passing"
    },
    "companion-runtime-wait-for-idle-pending-rpc-coverage": {
      "status": "completed",
      "date": "2026-02-17",
      "updated": "2026-02-17",
      "summary": "Added runtime regression coverage for `waitForIdle()` pending-RPC behavior, verifying idle resolution after pending requests are rejected on teardown.",
      "files_modified": [
        "src/companion/runtimeClient.test.ts",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/companion/runtimeClient.test.ts src/companion/platformClients.test.ts src/companion/heartbeatLoop.test.ts src/companion/platformClients.integration.test.ts + pnpm typecheck passing"
    },
    "companion-runtime-wait-for-idle-preaborted-signal-coverage": {
      "status": "completed",
      "date": "2026-02-17",
      "updated": "2026-02-17",
      "summary": "Added regression coverage for `waitForIdle()` with pre-aborted signals to ensure immediate, deterministic cancellation behavior when pending work exists.",
      "files_modified": [
        "src/companion/runtimeClient.test.ts",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/companion/runtimeClient.test.ts src/companion/platformClients.test.ts src/companion/heartbeatLoop.test.ts src/companion/platformClients.integration.test.ts + pnpm typecheck passing"
    },
    "companion-runtime-idle-alias-observability": {
      "status": "completed",
      "date": "2026-02-17",
      "updated": "2026-02-17",
      "summary": "Added runtime `idle` convenience alias (`!hasPendingWork`) with platform passthrough getters for clearer readiness checks in companion app code.",
      "files_modified": [
        "src/companion/runtimeClient.ts",
        "src/companion/runtimeClient.test.ts",
        "src/companion/platformClients.ts",
        "src/companion/platformClients.test.ts",
        "README.md",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/companion/runtimeClient.test.ts src/companion/platformClients.test.ts src/companion/heartbeatLoop.test.ts src/companion/platformClients.integration.test.ts + pnpm typecheck passing"
    },
    "companion-runtime-event-timeout-validation": {
      "status": "completed",
      "date": "2026-02-17",
      "updated": "2026-02-17",
      "summary": "Added explicit `timeoutMs` validation (`> 0`) for `waitForEvent()` and `waitForAnyEvent()` to ensure deterministic option guardrails across runtime event wait helpers.",
      "files_modified": [
        "src/companion/runtimeClient.ts",
        "src/companion/runtimeClient.test.ts",
        "README.md",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/companion/runtimeClient.test.ts src/companion/platformClients.test.ts src/companion/heartbeatLoop.test.ts src/companion/platformClients.integration.test.ts + pnpm typecheck passing"
    },
    "companion-runtime-event-surface-snapshot-helper": {
      "status": "completed",
      "date": "2026-02-17",
      "updated": "2026-02-17",
      "summary": "Added `getEventSurfaceSnapshot()` on runtime and platform wrappers for one-call event-surface inspection (`knownEventNames`, `eventSubscriptionCount`, `pendingEventWaitCount`).",
      "files_modified": [
        "src/companion/runtimeClient.ts",
        "src/companion/runtimeClient.test.ts",
        "src/companion/platformClients.ts",
        "src/companion/platformClients.test.ts",
        "src/companion/index.ts",
        "README.md",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/companion/runtimeClient.test.ts src/companion/platformClients.test.ts src/companion/heartbeatLoop.test.ts src/companion/platformClients.integration.test.ts + pnpm typecheck passing"
    },
    "companion-runtime-connection-snapshot-helper": {
      "status": "completed",
      "date": "2026-02-17",
      "updated": "2026-02-17",
      "summary": "Added `getConnectionSnapshot()` on runtime and platform wrappers for one-call connection/activity snapshot (`connected`, pending counts, subscription counts, idle/busy flags).",
      "files_modified": [
        "src/companion/runtimeClient.ts",
        "src/companion/runtimeClient.test.ts",
        "src/companion/platformClients.ts",
        "src/companion/platformClients.test.ts",
        "src/companion/index.ts",
        "README.md",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/companion/runtimeClient.test.ts src/companion/platformClients.test.ts src/companion/heartbeatLoop.test.ts src/companion/platformClients.integration.test.ts + pnpm typecheck passing"
    },
    "companion-clear-event-subscriptions-count-return": {
      "status": "completed",
      "date": "2026-02-17",
      "updated": "2026-02-17",
      "summary": "Extended `clearEventSubscriptions()` to return `clearedSubscriptions`/`cancelledWaits` counts on runtime and platform wrappers for explicit teardown observability.",
      "files_modified": [
        "src/companion/runtimeClient.ts",
        "src/companion/runtimeClient.test.ts",
        "src/companion/platformClients.ts",
        "src/companion/platformClients.test.ts",
        "src/companion/index.ts",
        "README.md",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/companion/runtimeClient.test.ts src/companion/platformClients.test.ts src/companion/heartbeatLoop.test.ts src/companion/platformClients.integration.test.ts + pnpm typecheck passing"
    },
    "companion-runtime-cancel-pending-event-waits": {
      "status": "completed",
      "date": "2026-02-17",
      "updated": "2026-02-17",
      "summary": "Added `cancelPendingEventWaits()` on runtime and platform wrappers so pending waiters can be cancelled without clearing active event subscriptions.",
      "files_modified": [
        "src/companion/runtimeClient.ts",
        "src/companion/runtimeClient.test.ts",
        "src/companion/platformClients.ts",
        "src/companion/platformClients.test.ts",
        "README.md",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/companion/runtimeClient.test.ts src/companion/platformClients.test.ts src/companion/heartbeatLoop.test.ts src/companion/platformClients.integration.test.ts + pnpm typecheck passing"
    },
    "companion-platform-cancel-pending-waits-integration-coverage": {
      "status": "completed",
      "date": "2026-02-17",
      "updated": "2026-02-17",
      "summary": "Added platform integration coverage for `cancelPendingEventWaits()` to verify pending wait cancellation with custom reasons while preserving existing event subscriptions.",
      "files_modified": [
        "src/companion/platformClients.integration.test.ts",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/companion/platformClients.integration.test.ts src/companion/platformClients.test.ts src/companion/runtimeClient.test.ts src/companion/heartbeatLoop.test.ts + pnpm typecheck passing"
    },
    "companion-cancel-pending-waits-count-return": {
      "status": "completed",
      "date": "2026-02-17",
      "updated": "2026-02-17",
      "summary": "Extended `cancelPendingEventWaits()` to return cancelled waiter count on runtime and platform wrappers for explicit cancellation observability.",
      "files_modified": [
        "src/companion/runtimeClient.ts",
        "src/companion/runtimeClient.test.ts",
        "src/companion/platformClients.ts",
        "src/companion/platformClients.test.ts",
        "README.md",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/companion/runtimeClient.test.ts src/companion/platformClients.test.ts src/companion/heartbeatLoop.test.ts src/companion/platformClients.integration.test.ts + pnpm typecheck passing"
    },
    "companion-cancel-pending-waits-count-integration-coverage": {
      "status": "completed",
      "date": "2026-02-17",
      "updated": "2026-02-17",
      "summary": "Added platform integration assertions for `cancelPendingEventWaits()` count-return semantics (`1` for active waiters, `0` after drain).",
      "files_modified": [
        "src/companion/platformClients.integration.test.ts",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/companion/platformClients.integration.test.ts src/companion/platformClients.test.ts src/companion/runtimeClient.test.ts src/companion/heartbeatLoop.test.ts + pnpm typecheck passing"
    },
    "companion-platform-event-surface-snapshot-integration-coverage": {
      "status": "completed",
      "date": "2026-02-17",
      "updated": "2026-02-17",
      "summary": "Added platform integration coverage for `getEventSurfaceSnapshot()` across active subscription/waiter and teardown states.",
      "files_modified": [
        "src/companion/platformClients.integration.test.ts",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/companion/platformClients.integration.test.ts src/companion/platformClients.test.ts src/companion/runtimeClient.test.ts src/companion/heartbeatLoop.test.ts + pnpm typecheck passing"
    },
    "companion-platform-connection-snapshot-integration-coverage": {
      "status": "completed",
      "date": "2026-02-17",
      "updated": "2026-02-17",
      "summary": "Added platform integration coverage for `getConnectionSnapshot()` across idle, active waiter/subscription, and cleared-teardown states.",
      "files_modified": [
        "src/companion/platformClients.integration.test.ts",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/companion/platformClients.integration.test.ts src/companion/platformClients.test.ts src/companion/runtimeClient.test.ts src/companion/heartbeatLoop.test.ts + pnpm typecheck passing"
    },
    "companion-platform-clear-event-subscriptions-count-integration": {
      "status": "completed",
      "date": "2026-02-17",
      "updated": "2026-02-17",
      "summary": "Added platform integration assertions for `clearEventSubscriptions()` count-return semantics (`clearedSubscriptions`, `cancelledWaits`) during active waiter/subscription teardown.",
      "files_modified": [
        "src/companion/platformClients.integration.test.ts",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/companion/platformClients.integration.test.ts src/companion/platformClients.test.ts src/companion/runtimeClient.test.ts src/companion/heartbeatLoop.test.ts + pnpm typecheck passing"
    },
    "companion-runtime-cancel-waits-snapshot-coverage": {
      "status": "completed",
      "date": "2026-02-17",
      "updated": "2026-02-17",
      "summary": "Added runtime regression coverage proving `cancelPendingEventWaits()` immediately updates pending-work snapshots (`pendingEventWaitCount`, `hasPendingWork`).",
      "files_modified": [
        "src/companion/runtimeClient.test.ts",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/companion/runtimeClient.test.ts src/companion/platformClients.test.ts src/companion/heartbeatLoop.test.ts src/companion/platformClients.integration.test.ts + pnpm typecheck passing"
    },
    "companion-runtime-wait-for-idle-nonfinite-validation-coverage": {
      "status": "completed",
      "date": "2026-02-17",
      "updated": "2026-02-17",
      "summary": "Extended `waitForIdle()` option-validation coverage to include non-finite `timeoutMs`/`pollIntervalMs` values (`NaN`, `Infinity`) for deterministic guardrail behavior.",
      "files_modified": [
        "src/companion/runtimeClient.test.ts",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/companion/runtimeClient.test.ts src/companion/platformClients.test.ts src/companion/heartbeatLoop.test.ts src/companion/platformClients.integration.test.ts + pnpm typecheck passing"
    },
    "companion-runtime-connection-snapshot-disconnect-metadata": {
      "status": "completed",
      "date": "2026-02-17",
      "updated": "2026-02-17",
      "summary": "Extended runtime/platform connection snapshots with disconnect metadata (`lastDisconnectCode`, `lastDisconnectReason`) captured on both manual `disconnect()` and transport close events for clearer companion lifecycle diagnostics.",
      "files_modified": [
        "src/companion/runtimeClient.ts",
        "src/companion/runtimeClient.test.ts",
        "src/companion/platformClients.test.ts",
        "src/companion/platformClients.integration.test.ts",
        "README.md",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/companion/runtimeClient.test.ts src/companion/platformClients.test.ts src/companion/platformClients.integration.test.ts src/companion/heartbeatLoop.test.ts + pnpm typecheck passing"
    },
    "companion-platform-disconnect-params-parity": {
      "status": "completed",
      "date": "2026-02-17",
      "updated": "2026-02-17",
      "summary": "Aligned platform wrappers with runtime lifecycle API by extending `disconnect()` to accept optional `code`/`reason` parameters, with unit/integration assertions confirming passthrough and snapshot metadata updates.",
      "files_modified": [
        "src/companion/platformClients.ts",
        "src/companion/platformClients.test.ts",
        "src/companion/platformClients.integration.test.ts",
        "README.md",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/companion/runtimeClient.test.ts src/companion/platformClients.test.ts src/companion/platformClients.integration.test.ts src/companion/heartbeatLoop.test.ts + pnpm typecheck passing"
    },
    "companion-runtime-disconnect-metadata-clobber-guard": {
      "status": "completed",
      "date": "2026-02-17",
      "updated": "2026-02-17",
      "summary": "Prevented manual disconnect metadata (`code`/`reason`) from being overwritten by the subsequent local socket `close` callback by only applying transport close metadata for active connections (`this.ws === ws`), with regression coverage.",
      "files_modified": [
        "src/companion/runtimeClient.ts",
        "src/companion/runtimeClient.test.ts",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/companion/runtimeClient.test.ts src/companion/platformClients.test.ts src/companion/platformClients.integration.test.ts src/companion/heartbeatLoop.test.ts + pnpm typecheck passing"
    },
    "companion-runtime-disconnect-metadata-direct-getters": {
      "status": "completed",
      "date": "2026-02-17",
      "updated": "2026-02-17",
      "summary": "Added direct runtime/platform observability getters for disconnect metadata (`lastDisconnectCode`, `lastDisconnectReason`) so companion callers can read lifecycle teardown details without building full connection snapshots.",
      "files_modified": [
        "src/companion/runtimeClient.ts",
        "src/companion/runtimeClient.test.ts",
        "src/companion/platformClients.ts",
        "src/companion/platformClients.test.ts",
        "src/companion/platformClients.integration.test.ts",
        "README.md",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/companion/runtimeClient.test.ts src/companion/platformClients.test.ts src/companion/platformClients.integration.test.ts src/companion/heartbeatLoop.test.ts + pnpm typecheck passing"
    },
    "companion-runtime-reconnect-clears-disconnect-metadata": {
      "status": "completed",
      "date": "2026-02-17",
      "updated": "2026-02-17",
      "summary": "Cleared stale disconnect metadata on successful reconnect (`connect`) so `lastDisconnectCode`/`lastDisconnectReason` reflect only the latest completed disconnection lifecycle.",
      "files_modified": [
        "src/companion/runtimeClient.ts",
        "src/companion/runtimeClient.test.ts",
        "README.md",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/companion/runtimeClient.test.ts src/companion/platformClients.test.ts src/companion/platformClients.integration.test.ts src/companion/heartbeatLoop.test.ts + pnpm typecheck passing"
    },
    "browser-tools-activation-clarity": {
      "status": "completed",
      "date": "2026-02-17",
      "updated": "2026-02-17",
      "summary": "Clarified browser automation availability and activation path: documented the full six browser tools (`browser.navigate`, `browser.screenshot`, `browser.click`, `browser.type`, `browser.content`, `browser.eval`), added default config guidance for enabling browser support, added startup diagnostics when browser tools are disabled or blocked by tool policy, and added config schema coverage for browser defaults/overrides.",
      "files_modified": [
        "src/daemon/tools.ts",
        "src/config/schema.test.ts",
        "config/default.yaml",
        "README.md",
        "docs/api/TOOLS.md",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/config/schema.test.ts + pnpm typecheck passing"
    },
    "automation-daily-briefing-and-cron-backup-scheduling": {
      "status": "completed",
      "date": "2026-02-16",
      "updated": "2026-02-16",
      "summary": "Added first-class automation presets and scheduling upgrades: `automation.daily_briefing` now auto-registers an opinionated cron job for morning briefings, and backup scheduling now supports cron expressions via `backup.schedule` plus optional `backup.run_on_start` while preserving interval fallback. Added `BackupScheduler` with `backup.notify` channel alerts, configurable `backup.failure_threshold`, and recovery notifications (`backup.notify_recovery`) so backup failures/recoveries proactively notify operators. Extended heartbeat monitoring with `process_memory`, `backup`, and `provider_errors` checks (with thresholds) so high RSS usage, backup failure streaks, and model-provider error spikes proactively trigger health alerts. Added timezone-safe daily briefing dedupe via `automation.daily_briefing.dedupe_per_local_day` and cron-level `once_per_local_day` so morning briefings do not send twice on the same local day. Added `minio.share` tool to upload local artifacts and return temporary MinIO share links using existing backup MinIO credentials. Added `system.sessionAnalytics` RPC with SQLite-backed aggregates including daily sessions/messages, average messages per session, top active sessions, most-used tools, and common topics for operator usage tracking.",
      "files_modified": [
        "src/config/schema.ts",
        "src/config/schema.test.ts",
        "src/automation/index.ts",
        "src/automation/presets.ts",
        "src/automation/presets.test.ts",
        "src/automation/cron.ts",
        "src/automation/cron.test.ts",
        "src/automation/heartbeat.ts",
        "src/automation/heartbeat.test.ts",
        "src/backup/index.ts",
        "src/backup/scheduler.ts",
        "src/backup/scheduler.test.ts",
        "src/backup/status.ts",
        "src/backup/status.test.ts",
        "src/tools/builtin/minio-share.ts",
        "src/tools/builtin/minio-share.test.ts",
        "src/tools/builtin/index.ts",
        "src/tools/index.ts",
        "src/tools/policy.ts",
        "src/session/store.ts",
        "src/session/store.test.ts",
        "src/session/manager.ts",
        "src/session/index.ts",
        "src/tools/executor.ts",
        "src/tools/executor.test.ts",
        "src/gateway/handlers/system.ts",
        "src/gateway/handlers/handlers.test.ts",
        "src/gateway/server.ts",
        "src/daemon/channels.ts",
        "src/daemon/channels.test.ts",
        "src/daemon/index.ts",
        "src/daemon/services.ts",
        "src/gateway/handlers/services.ts",
        "src/gateway/handlers/services.test.ts",
        "src/tools/builtin/cron.ts",
        "docs/api/PROTOCOL.md",
        "config/default.yaml",
        "README.md"
      ],
      "test_status": "pnpm test:run src/automation/presets.test.ts src/automation/cron.test.ts src/automation/heartbeat.test.ts src/backup/scheduler.test.ts src/backup/status.test.ts src/tools/builtin/minio-share.test.ts src/tools/policy.test.ts src/config/schema.test.ts src/daemon/channels.test.ts src/gateway/handlers/services.test.ts src/session/store.test.ts src/tools/executor.test.ts src/gateway/handlers/handlers.test.ts + pnpm typecheck passing"
    },
    "dashboard-session-analytics-panel": {
      "status": "completed",
      "date": "2026-02-16",
      "updated": "2026-02-16",
      "summary": "Extended the web UI dashboard with a Session Analytics panel backed by `system.sessionAnalytics`, including window summary cards, top tools/topics, top sessions, and daily trend tables refreshed alongside health/services.",
      "files_modified": [
        "src/gateway/ui/pages/dashboard.js",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm eslint src/gateway/ui/pages/dashboard.js + pnpm typecheck passing; full pnpm lint currently fails due pre-existing unrelated repo lint errors"
    },
    "minio-knowledge-ingestion-tool": {
      "status": "completed",
      "date": "2026-02-16",
      "updated": "2026-02-16",
      "summary": "Added `minio.ingest` tool to import text-like objects from MinIO into memory namespaces (`append`/`replace`) with extension/content safety checks, truncation controls, and force override. Wired tool registration when MinIO + memory are enabled, updated tool policy/groups/docs, and added focused tests.",
      "files_modified": [
        "src/tools/builtin/minio-ingest.ts",
        "src/tools/builtin/minio-ingest.test.ts",
        "src/tools/builtin/index.ts",
        "src/tools/index.ts",
        "src/daemon/index.ts",
        "src/tools/policy.ts",
        "src/tools/policy.test.ts",
        "README.md",
        "docs/api/TOOLS.md",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/tools/builtin/minio-ingest.test.ts src/tools/policy.test.ts + pnpm typecheck passing"
    },
    "minio-prefix-sync-tool": {
      "status": "completed",
      "date": "2026-02-16",
      "updated": "2026-02-16",
      "summary": "Added `minio.sync` tool to recursively ingest MinIO prefixes into nested memory namespaces with per-run object limits, per-object content limits, extension/content safety checks, and summary output. Registered tool with MinIO+memory runtime, expanded `group:minio` policy coverage, and updated docs/tests.",
      "files_modified": [
        "src/tools/builtin/minio-sync.ts",
        "src/tools/builtin/minio-sync.test.ts",
        "src/tools/builtin/index.ts",
        "src/tools/index.ts",
        "src/daemon/index.ts",
        "src/tools/policy.ts",
        "src/tools/policy.test.ts",
        "README.md",
        "docs/api/TOOLS.md",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/tools/builtin/minio-sync.test.ts src/tools/policy.test.ts + pnpm typecheck passing"
    },
    "automation-scheduled-minio-sync": {
      "status": "completed",
      "date": "2026-02-16",
      "updated": "2026-02-16",
      "summary": "Added daemon-side scheduled MinIO sync automation (`automation.minio_sync`) with interval execution, optional startup run, multiple prefix tasks, and optional notification routing on failures/success. Wired scheduler lifecycle into service startup/shutdown and updated config/docs/tests.",
      "files_modified": [
        "src/automation/minioSync.ts",
        "src/automation/minioSync.test.ts",
        "src/automation/index.ts",
        "src/config/schema.ts",
        "src/config/schema.test.ts",
        "src/daemon/services.ts",
        "src/daemon/index.ts",
        "config/default.yaml",
        "README.md",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/automation/minioSync.test.ts src/config/schema.test.ts + pnpm typecheck passing"
    },
    "k8s-homelab-awareness-tools": {
      "status": "completed",
      "date": "2026-02-16",
      "updated": "2026-02-16",
      "summary": "Added optional Kubernetes homelab-awareness tools (`k8s.pods`, `k8s.deployments`, `k8s.logs`) with `k8s.enabled` config gating, default/allowed namespace constraints, daemon registration, tool-policy group support (`group:k8s`), docs, and tests.",
      "files_modified": [
        "src/tools/builtin/k8s.ts",
        "src/tools/builtin/k8s.test.ts",
        "src/tools/builtin/index.ts",
        "src/tools/index.ts",
        "src/daemon/index.ts",
        "src/config/schema.ts",
        "src/config/schema.test.ts",
        "src/config/index.ts",
        "src/tools/policy.ts",
        "src/tools/policy.test.ts",
        "config/default.yaml",
        "README.md",
        "docs/api/TOOLS.md",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/tools/builtin/k8s.test.ts src/tools/policy.test.ts src/config/schema.test.ts + pnpm typecheck passing"
    },
    "minio-pdf-ingestion-support": {
      "status": "completed",
      "date": "2026-02-16",
      "updated": "2026-02-16",
      "summary": "Extended MinIO knowledge ingestion to support PDF documents via `pdftotext` extraction in both `minio.ingest` and `minio.sync` paths (when available), while preserving text-safety checks for other binary formats. Updated tests and docs accordingly.",
      "files_modified": [
        "src/tools/builtin/minio-ingest.ts",
        "src/tools/builtin/minio-sync.ts",
        "src/tools/builtin/minio-ingest.test.ts",
        "src/tools/builtin/minio-sync.test.ts",
        "README.md",
        "docs/api/TOOLS.md",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/tools/builtin/minio-ingest.test.ts src/tools/builtin/minio-sync.test.ts + pnpm typecheck passing"
    },
    "minio-docx-ingestion-support": {
      "status": "completed",
      "date": "2026-02-16",
      "updated": "2026-02-16",
      "summary": "Extended MinIO knowledge ingestion/sync to support DOCX extraction with fallback chain (`pandoc` then `docx2txt`) in both `minio.ingest` and `minio.sync` paths, plus tests/docs updates.",
      "files_modified": [
        "src/tools/builtin/minio-ingest.ts",
        "src/tools/builtin/minio-ingest.test.ts",
        "src/tools/builtin/minio-sync.test.ts",
        "README.md",
        "docs/api/TOOLS.md",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/tools/builtin/minio-ingest.test.ts src/tools/builtin/minio-sync.test.ts + pnpm typecheck passing"
    },
    "minio-ingestion-extractor-requirements-setup-and-doctor": {
      "status": "completed",
      "date": "2026-02-16",
      "updated": "2026-02-16",
      "summary": "Documented MinIO ingestion runtime extractor requirements (PDF: `pdftotext`, DOCX: `pandoc` or `docx2txt`) and added shared dependency checks in setup + doctor flows. `flynn setup` now reports extractor readiness after config save when MinIO is enabled and includes OS-aware package install hints when missing; `flynn doctor` now includes a `MinIO ingest extractors` check with matching install guidance.",
      "files_modified": [
        "src/cli/minioExtractors.ts",
        "src/cli/minioExtractors.test.ts",
        "src/cli/setup.ts",
        "src/cli/doctor.ts",
        "src/cli/doctor.test.ts",
        "README.md",
        "docs/api/TOOLS.md",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/cli/minioExtractors.test.ts src/cli/doctor.test.ts + pnpm typecheck passing"
    },
    "operator-pack-heartbeat-throttle-and-doctor-strict": {
      "status": "completed",
      "date": "2026-02-16",
      "updated": "2026-02-16",
      "summary": "Implemented operator-focused hardening and onboarding polish: added setup Operator Pack flows in both Automation menu and first-run wizard to preconfigure scheduled backups, heartbeat alerts, daily briefing, and default MinIO sync; added operator-pack prompts for output channel/peer routing with redundant prompt skip when already configured; added a compact Operator Pack status line in setup menu output; added heartbeat notification throttling via `automation.heartbeat.notify_cooldown` (with invalid-value fallback handling); and added `flynn doctor --strict` to treat warnings as failures. Added docs/changelog updates, including a dedicated Operator Pack operations runbook, and a consolidated regression run record.",
      "files_modified": [
        "CHANGELOG.md",
        "src/cli/setup/config.ts",
        "src/cli/setup/config.test.ts",
        "src/cli/setup/automation.test.ts",
        "src/cli/setup/automation.ts",
        "src/cli/setup/orchestrator.ts",
        "src/cli/setup/integration.test.ts",
        "src/cli/setup/summary.ts",
        "src/cli/setup/summary.test.ts",
        "src/cli/index.test.ts",
        "src/automation/heartbeat.ts",
        "src/automation/heartbeat.test.ts",
        "src/config/schema.ts",
        "src/config/schema.test.ts",
        "src/cli/doctor.ts",
        "src/cli/doctor.test.ts",
        "config/default.yaml",
        "README.md",
        "docs/README.md",
        "docs/operations/OPERATOR_PACK.md",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/cli/setup/summary.test.ts src/cli/setup/orchestrator.test.ts src/cli/setup/automation.test.ts src/cli/setup/integration.test.ts + pnpm typecheck passing"
    },
    "backup-session-summary-audit-trail": {
      "status": "completed",
      "date": "2026-02-16",
      "updated": "2026-02-16",
      "summary": "Implemented operator resilience features: backup snapshots with MinIO upload support (`flynn backup` + optional daemon scheduler), optional end-of-session summarization for WebSocket sessions with memory persistence, and explicit `user.action` audit events across channel and gateway message entry points.",
      "files_modified": [
        "src/config/schema.ts",
        "src/config/schema.test.ts",
        "src/config/index.ts",
        "src/daemon/index.ts",
        "src/daemon/routing.ts",
        "src/daemon/routing.test.ts",
        "src/gateway/session-bridge.ts",
        "src/gateway/session-bridge.test.ts",
        "src/gateway/handlers/agent.ts",
        "src/gateway/handlers/agent.test.ts",
        "src/audit/types.ts",
        "src/audit/logger.ts",
        "src/session/index.ts",
        "src/session/endSummary.ts",
        "src/session/endSummary.test.ts",
        "src/backup/run.ts",
        "src/backup/run.test.ts",
        "src/backup/index.ts",
        "src/cli/backup.ts",
        "src/cli/index.ts",
        "src/cli/index.test.ts",
        "config/default.yaml",
        "README.md",
        "scripts/backup-to-minio.sh"
      ],
      "test_status": "pnpm test:run src/backup/run.test.ts src/session/endSummary.test.ts src/config/schema.test.ts src/gateway/session-bridge.test.ts src/gateway/handlers/agent.test.ts src/daemon/routing.test.ts src/cli/index.test.ts + pnpm typecheck passing"
    },
    "docs-agent-oriented-diagrams-pass": {
      "status": "completed",
      "date": "2026-02-15",
      "summary": "Docs gap pass: added docs/README.md as a start-here index and expanded docs/api/PROTOCOL.md with a precise Mermaid diagram explaining per-session lane queueing and cancellation semantics for agent.send/agent.cancel."
    },
    "docs-gateway-sessions-and-queue": {
      "status": "completed",
      "date": "2026-02-15",
      "summary": "Added docs/architecture/GATEWAY_SESSIONS_AND_QUEUE.md to document how gateway connectionIds map to durable sessionIds, how per-session FIFO lane queueing works, and how agent.cancel behaves."
    },
    "gateway-lane-queue-policy-phase1": {
      "status": "completed",
      "date": "2026-02-16",
      "updated": "2026-02-16",
      "summary": "Added configurable gateway lane queue policy (`server.queue`) with mode (`collect|steer|interrupt`), per-lane cap, overflow behavior (`drop_old|drop_new`), and per-channel/per-session overrides. Wired through daemon -> gateway runtime, applied override resolution in `agent.send`, expanded queue + handler tests, and documented config usage in README + default config.",
      "files_modified": [
        "src/gateway/lane-queue.ts",
        "src/gateway/lane-queue.test.ts",
        "src/gateway/server.ts",
        "src/daemon/services.ts",
        "src/config/schema.ts",
        "src/config/schema.test.ts",
        "config/default.yaml",
        "README.md",
        "src/gateway/handlers/agent.ts",
        "src/gateway/handlers/agent.test.ts"
      ],
      "test_status": "pnpm test:run src/gateway/lane-queue.test.ts src/gateway/handlers/agent.test.ts src/config/schema.test.ts + pnpm typecheck passing"
    },
    "openclaw-gap-next-steps-3phase": {
      "status": "completed",
      "date": "2026-02-16",
      "updated": "2026-02-16",
      "summary": "Completed the 3-phase implementation plan for remaining high-impact OpenClaw parity gaps: queue policy parity v2, Mattermost channel expansion, and companion-node capability negotiation foundation.",
      "file": "2026-02-16-openclaw-gap-next-steps-3phase.md"
    },
    "openclaw-gap-phase1-queue-parity-v2": {
      "status": "completed",
      "date": "2026-02-16",
      "updated": "2026-02-16",
      "summary": "Completed queue parity v2: added followup/steer_backlog semantics, lane debounce, overflow summarization metadata, runtime session queue controls (`/queue` show/set/reset), queue config patch keys, and docs/protocol updates.",
      "files_modified": [
        "src/gateway/lane-queue.ts",
        "src/gateway/lane-queue.test.ts",
        "src/gateway/handlers/agent.ts",
        "src/gateway/handlers/agent.test.ts",
        "src/gateway/server.ts",
        "src/gateway/protocol.ts",
        "src/gateway/handlers/config.ts",
        "src/gateway/handlers/handlers.test.ts",
        "src/commands/types.ts",
        "src/commands/builtin/index.ts",
        "src/commands/builtin/index.test.ts",
        "src/commands/index.ts",
        "src/config/schema.ts",
        "src/config/schema.test.ts",
        "src/daemon/services.ts",
        "config/default.yaml",
        "README.md",
        "docs/api/PROTOCOL.md"
      ],
      "test_status": "pnpm test:run src/gateway/lane-queue.test.ts src/gateway/handlers/agent.test.ts src/gateway/handlers/handlers.test.ts src/commands/builtin/index.test.ts src/config/schema.test.ts + pnpm typecheck + pnpm build passing"
    },
    "openclaw-gap-phase2-mattermost-channel": {
      "status": "completed",
      "date": "2026-02-16",
      "updated": "2026-02-16",
      "summary": "Completed Phase 2 channel expansion with a first Mattermost adapter: polling-based inbound, outbound post send path, mention/allowlist/pairing gating, daemon wiring, schema + redaction + services discovery updates, and docs.",
      "files_created": [
        "src/channels/mattermost/adapter.ts",
        "src/channels/mattermost/adapter.test.ts",
        "src/channels/mattermost/index.ts",
        "src/daemon/channels.test.ts"
      ],
      "files_modified": [
        "src/channels/index.ts",
        "src/daemon/channels.ts",
        "src/config/schema.ts",
        "src/config/schema.test.ts",
        "src/gateway/handlers/config.ts",
        "src/gateway/handlers/handlers.test.ts",
        "src/gateway/handlers/services.ts",
        "src/gateway/handlers/services.test.ts",
        "config/default.yaml",
        "README.md",
        "docs/architecture/CONTRIBUTOR_MAP.md"
      ],
      "test_status": "pnpm test:run src/channels/mattermost/adapter.test.ts src/daemon/channels.test.ts src/config/schema.test.ts src/gateway/handlers/services.test.ts src/gateway/handlers/handlers.test.ts + pnpm typecheck + pnpm build passing"
    },
    "openclaw-gap-phase3-node-capability-foundation": {
      "status": "completed",
      "date": "2026-02-16",
      "updated": "2026-02-16",
      "summary": "Completed companion-node foundation: protocol payload typing + parsing, node registration/capability handlers (`node.register`, `node.capabilities.get`, `system.capabilities`), connection-level node state tracking, scoped node RPC authorization, node policy config (`server.nodes.*`), docs, and tests.",
      "files_created": [
        "src/gateway/handlers/node.ts",
        "src/gateway/handlers/node.test.ts"
      ],
      "files_modified": [
        "src/gateway/protocol.ts",
        "src/gateway/protocol.test.ts",
        "src/gateway/auth.ts",
        "src/gateway/auth.test.ts",
        "src/gateway/handlers/index.ts",
        "src/gateway/router.ts",
        "src/gateway/server.ts",
        "src/gateway/server.test.ts",
        "src/config/schema.ts",
        "src/config/schema.test.ts",
        "src/daemon/services.ts",
        "config/default.yaml",
        "README.md",
        "docs/api/PROTOCOL.md"
      ],
      "test_status": "pnpm test:run src/gateway/protocol.test.ts src/gateway/auth.test.ts src/gateway/handlers/node.test.ts src/gateway/server.test.ts src/config/schema.test.ts + pnpm typecheck + pnpm build passing"
    },
    "docs-gateway-auth-config-keys": {
      "status": "completed",
      "date": "2026-02-15",
      "summary": "Docs fix: updated docs/api/PROTOCOL.md and docs/deployment/PRODUCTION.md to use the current config schema keys for gateway auth (server.token/server.tailscale_identity/server.auth_http) and added a short safe-defaults snippet (pairing/tools.profile/sandbox)."
    },
    "docs-production-guide-reality-check": {
      "status": "completed",
      "date": "2026-02-15",
      "summary": "Docs fix: updated docs/deployment/PRODUCTION.md to match the repo's actual Dockerfile (pnpm/corepack) and docker-compose.yml, and corrected the config YAML snippet to use models.default.provider/model/api_key per the current config schema."
    },
    "docs-protocol-tailscale-auth-wording": {
      "status": "completed",
      "date": "2026-02-15",
      "summary": "Docs fix: clarified the Tailscale auth note in docs/api/PROTOCOL.md to reference server.tailscale_identity."
    },
    "todo-config-default-server-schema-mismatch": {
      "status": "completed",
      "date": "2026-02-16",
      "updated": "2026-02-16",
      "summary": "Reconciled config/default.yaml with src/config/schema.ts by replacing deprecated server.tailscale_only with server.tailscale.*. Added a doctor warning for deprecated keys and a regression test to prevent future drift.",
      "files_modified": [
        "config/default.yaml",
        "src/cli/doctor.ts",
        "src/cli/doctor.test.ts",
        "src/config/defaultYaml.test.ts"
      ],
      "test_status": "pnpm test:run + pnpm typecheck passing"
    },
    "memory-auto-extract-config-wiring": {
      "status": "completed",
      "date": "2026-02-16",
      "updated": "2026-02-16",
      "summary": "Wired `memory.auto_extract` through orchestrator construction so automatic fact extraction during compaction can be explicitly enabled/disabled (instead of always-on when compaction runs). Added compaction tests for default auto-extraction and disabled mode, and clarified docs/planning language to describe memory as hybrid manual + automatic.",
      "files_modified": [
        "src/backends/native/orchestrator.ts",
        "src/daemon/routing.ts",
        "src/gateway/session-bridge.ts",
        "src/context/compaction.test.ts",
        "README.md",
        ".planning/PROJECT.md",
        ".planning/STATE.md"
      ],
      "test_status": "pnpm test:run src/context/compaction.test.ts src/backends/native/orchestrator.test.ts src/gateway/session-bridge.test.ts src/daemon/routing.test.ts + pnpm typecheck passing"
    },
    "zai-auth-resolution-and-401-hints": {
      "status": "completed",
      "date": "2026-02-16",
      "updated": "2026-02-16",
      "summary": "Unified Z.AI credential resolution so zhipuai model switches resolve credentials from config, env (including ZAI_API_KEY), and auth store regardless of use_oauth flag. Added clearer Z.AI-specific 401 diagnostics when API auth fails (including missing model.request scope hint), including textual 401 errors where the SDK does not expose status.",
      "files_modified": [
        "src/daemon/models.ts",
        "src/models/openai.ts",
        "src/daemon/clientFactory.test.ts",
        "src/models/openai.test.ts"
      ],
      "test_status": "pnpm test:run src/daemon/clientFactory.test.ts src/models/openai.test.ts + pnpm typecheck passing (updated to cover textual 401 without status field)"
    },
    "tui-model-provider-switch-activates-tier": {
      "status": "completed",
      "date": "2026-02-16",
      "updated": "2026-02-16",
      "summary": "Fixed minimal TUI /model <tier> <provider/model> behavior to also activate the selected tier and sync agent tier immediately. This prevents confusing cases where provider/model changes are applied to one tier while prompts still run on another tier.",
      "files_modified": [
        "src/frontends/tui/minimal.ts",
        "src/frontends/tui/minimal.test.ts"
      ],
      "test_status": "pnpm test:run src/frontends/tui/minimal.test.ts src/models/openai.test.ts src/daemon/clientFactory.test.ts + pnpm typecheck passing"
    },
    "zai-auth-reauthenticate-confirmation": {
      "status": "completed",
      "date": "2026-02-16",
      "updated": "2026-02-16",
      "summary": "Improved `zai-auth` UX: when a stored credential already exists, prompt for confirmation (`Re-authenticate and replace it? (y/N)`) instead of requiring manual auth.json edits. Added command tests for both cancel and replace flows.",
      "files_modified": [
        "src/cli/zai-auth.ts",
        "src/cli/zai-auth.test.ts"
      ],
      "test_status": "pnpm test:run src/cli/zai-auth.test.ts + pnpm typecheck passing"
    },
    "auth-commands-reauthenticate-confirmation": {
      "status": "completed",
      "date": "2026-02-16",
      "updated": "2026-02-16",
      "summary": "Extended re-auth confirmation dialog (`Re-authenticate and replace it? (y/N)`) to other auth providers/commands: openai-key, openai-auth, and anthropic-auth (API key + --token). Added tests for cancel and proceed flows across all commands.",
      "files_modified": [
        "src/cli/openai-key.ts",
        "src/cli/openai-auth.ts",
        "src/cli/anthropic-auth.ts",
        "src/cli/openai-key.test.ts",
        "src/cli/openai-auth.test.ts",
        "src/cli/anthropic-auth.test.ts"
      ],
      "test_status": "pnpm test:run src/cli/openai-key.test.ts src/cli/anthropic-auth.test.ts src/cli/openai-auth.test.ts src/cli/zai-auth.test.ts + pnpm typecheck passing"
    },
    "cli-suppress-punycode-deprecation-warning": {
      "status": "completed",
      "date": "2026-02-16",
      "updated": "2026-02-16",
      "summary": "Added a CLI bootstrap warning filter to suppress Node DEP0040 (`punycode` deprecation) noise from transitive dependencies while preserving all other warnings. Loaded filter at CLI startup and added matcher tests.",
      "files_modified": [
        "src/cli/index.ts",
        "src/cli/suppressNodeWarnings.ts",
        "src/cli/suppressNodeWarnings.test.ts"
      ],
      "test_status": "pnpm test:run src/cli/suppressNodeWarnings.test.ts src/cli/index.test.ts + pnpm typecheck + pnpm build passing"
    },
    "zai-auth-mode-selection-api-vs-plan": {
      "status": "completed",
      "date": "2026-02-16",
      "updated": "2026-02-16",
      "summary": "Added explicit Z.AI mode selection (API vs Coding Plan) to both `zai-auth` CLI and TUI `/login zai` flow. CLI now supports `--mode api|plan` for non-interactive use and prompts when omitted. Post-auth guidance now shows the mode-specific endpoint directly.",
      "files_modified": [
        "src/cli/zai-auth.ts",
        "src/cli/zai-auth.test.ts",
        "src/frontends/tui/minimal.ts"
      ],
      "test_status": "pnpm test:run src/cli/zai-auth.test.ts src/frontends/tui/minimal.test.ts + pnpm typecheck passing"
    },
    "tui-login-reauth-confirmation-all-providers": {
      "status": "completed",
      "date": "2026-02-16",
      "updated": "2026-02-16",
      "summary": "Updated minimal TUI `/login` flows to prompt `Re-authenticate and replace it? (y/N)` when credentials already exist, instead of requiring manual auth.json deletion. Applied to OpenAI (OAuth + API key), Anthropic (API key + auth token), and Z.AI.",
      "files_modified": [
        "src/frontends/tui/minimal.ts",
        "src/frontends/tui/minimal.login.test.ts"
      ],
      "test_status": "pnpm test:run src/frontends/tui/minimal.login.test.ts src/frontends/tui/minimal.test.ts + pnpm typecheck passing"
    },
    "anthropic-auth-mode-flag": {
      "status": "completed",
      "date": "2026-02-16",
      "updated": "2026-02-16",
      "summary": "Added `--mode api|token` to `anthropic-auth` for parity with explicit mode-based auth commands, while keeping `--token` backward compatible. Includes conflict validation for `--token --mode api`.",
      "files_modified": [
        "src/cli/anthropic-auth.ts",
        "src/cli/anthropic-auth.test.ts"
      ],
      "test_status": "pnpm test:run src/cli/anthropic-auth.test.ts src/cli/index.test.ts + pnpm typecheck passing"
    },
    "deployment-port-env-override": {
      "status": "completed",
      "date": "2026-02-16",
      "updated": "2026-02-16",
      "summary": "Added PORT environment variable override support so PaaS deployments can bind the gateway to the platform-assigned port without requiring config changes.",
      "files_modified": [
        "src/config/loader.ts",
        "src/config/loader.test.ts"
      ],
      "test_status": "pnpm test:run + pnpm typecheck passing"
    },
    "deployment-targets-nix": {
      "file": "2026-02-16-deployment-targets.md",
      "status": "completed",
      "date": "2026-02-16",
      "updated": "2026-02-16",
      "summary": "Added a Nix flake/package that builds dist/ (including dist/gateway/ui adjacency) and an optional NixOS module (services.flynn) for systemd deployment. Follow-up fixes switched package build from unavailable buildPnpmPackage to fetchPnpmDeps + stdenv.mkDerivation, migrated to pnpmConfigHook for current nixpkgs, added flake.lock, pinned dependency hash, and ensured pnpm is in nativeBuildInputs for hook execution.",
      "files_created": [
        "flake.nix",
        "nix/package.nix",
        "nix/module.nix",
        "docs/deployment/NIX.md"
      ],
      "files_modified": [
        "docs/deployment/PRODUCTION.md",
        "flake.lock",
        "nix/package.nix"
      ],
      "test_status": "nix build dependency hash resolved (fetchPnpmDeps hash pinned from build output); run nix build .#flynn to verify end-to-end in host environment"
    },
    "deployment-targets-paas": {
      "file": "2026-02-16-deployment-targets.md",
      "status": "completed",
      "date": "2026-02-16",
      "updated": "2026-02-16",
      "summary": "Added PaaS deployment templates and docs for Fly.io / Railway / Render, plus a PaaS-friendly config template (server.localhost: false) and a Docker image default /config/config.yaml for easier platform deployment.",
      "files_created": [
        "docs/plans/2026-02-16-deployment-targets.md",
        "docs/deployment/PAAS.md",
        "config/paas.yaml",
        "deploy/flyio/fly.toml",
        "deploy/railway/railway.toml",
        "deploy/render/render.yaml"
      ],
      "files_modified": [
        "Dockerfile",
        "README.md",
        "docs/deployment/PRODUCTION.md"
      ],
      "test_status": "pnpm typecheck passing (no runtime code changes)"
    },
    "openclaw-gap-roadmap": {
      "file": "2026-02-15-openclaw-gap-roadmap.md",
      "status": "completed",
      "date": "2026-02-15",
      "updated": "2026-02-16",
      "summary": "Completed roadmap closure for the six prioritized OpenClaw gaps: per-tier credential system v2 (API + OAuth/token), Vercel AI Gateway provider, skill safety scanner, elevated mode, Matrix adapter, and deployment targets (Nix + PaaS)."
    },
    "clawhub-registry": {
      "file": "2026-02-16-clawhub-registry-checklist.md",
      "status": "completed",
      "date": "2026-02-16",
      "updated": "2026-02-16",
      "summary": "Completed ClawHub registry milestone end-to-end across four phases: validated registry loader, CLI discovery (`registry list/show` with filters and JSON), install-by-registry-id with local/git/archive resolution + confirmation/audit gates, config-backed registry source and doctor diagnostics, plus docs for usage and trust model. Also fixed WhatsApp adapter inbound dispatch timing so full test suite validation is stable.",
      "files_created": [
        "docs/plans/2026-02-16-clawhub-registry-checklist.md",
        "src/skills/registrySource.ts",
        "src/skills/registrySource.test.ts"
      ],
      "files_modified": [
        "src/skills/index.ts",
        "src/cli/skills.ts",
        "src/cli/skills.test.ts",
        "src/audit/types.ts",
        "src/audit/logger.ts",
        "src/cli/doctor.ts",
        "src/cli/doctor.test.ts",
        "src/config/schema.ts",
        "src/config/schema.test.ts",
        "src/channels/whatsapp/adapter.ts",
        "README.md",
        "docs/security/SAFE_PERSONAL_AGENT.md",
        "config/default.yaml",
        "docs/plans/2026-02-16-clawhub-registry-checklist.md",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/skills/registrySource.test.ts src/cli/skills.test.ts src/cli/doctor.test.ts src/config/schema.test.ts src/channels/whatsapp/adapter.test.ts + pnpm typecheck + full pnpm test:run all passing"
    },
    "credential-system-v2-api-and-oauth": {
      "file": "2026-02-15-credential-system-v2-api-and-oauth-checklist.md",
      "status": "completed",
      "date": "2026-02-15",
      "updated": "2026-02-15",
      "summary": "Implemented per-tier auth_mode (auto/api_key/oauth) with deterministic credential resolution (config/env/store), added OpenAI API-key storage and Anthropic auth-token storage to auth.json, extended CLI + TUI login UX, enforced auth_mode in the model factory, and improved doctor output to show credential availability without leaking secrets.",
      "files_created": [
        "src/cli/openai-key.ts"
      ],
      "files_modified": [
        "src/config/schema.ts",
        "src/config/schema.test.ts",
        "README.md",
        "config/default.yaml",
        "src/auth/openai.ts",
        "src/auth/openai.test.ts",
        "src/auth/anthropic.ts",
        "src/auth/anthropic.test.ts",
        "src/auth/index.ts",
        "src/cli/anthropic-auth.ts",
        "src/cli/index.ts",
        "src/cli/index.test.ts",
        "src/frontends/tui/minimal.ts",
        "src/frontends/tui/commands.ts",
        "src/daemon/models.ts",
        "src/daemon/clientFactory.test.ts",
        "src/cli/doctor.ts",
        "src/cli/doctor.test.ts"
      ],
      "test_status": "pnpm typecheck + pnpm test:run (targeted suites + full passing locally)"
    },
    "vercel-ai-gateway-provider": {
      "file": "2026-02-15-vercel-ai-gateway-provider-checklist.md",
      "status": "completed",
      "date": "2026-02-15",
      "updated": "2026-02-15",
      "summary": "Added first-class Vercel AI Gateway model provider (OpenAI-compatible baseURL) with schema registration, model factory wiring via OpenAIClient, setup wizard + doctor guidance for AI_GATEWAY_API_KEY, and tests.",
      "files_created": [
        "src/models/openai.baseurl.test.ts"
      ],
      "files_modified": [
        "src/config/schema.ts",
        "src/config/schema.test.ts",
        "src/daemon/models.ts",
        "src/daemon/clientFactory.test.ts",
        "src/cli/setup/providers.ts",
        "src/cli/setup/providers.test.ts",
        "src/cli/doctor.ts",
        "src/cli/doctor.test.ts",
        "README.md"
      ],
      "test_status": "pnpm typecheck + pnpm test:run passing"
    },
    "minimax-moonshot-provider": {
      "file": "2026-02-16-minimax-moonshot-provider-checklist.md",
      "status": "completed",
      "date": "2026-02-16",
      "updated": "2026-02-16",
      "summary": "Added first-class MiniMax and Moonshot model providers (OpenAI-compatible) with config schema support, model factory wiring, setup wizard options, doctor key checks, tests, and README updates.",
      "files_created": [
        "docs/plans/2026-02-16-minimax-moonshot-provider-checklist.md"
      ],
      "files_modified": [
        "src/config/schema.ts",
        "src/config/schema.test.ts",
        "src/daemon/models.ts",
        "src/daemon/clientFactory.test.ts",
        "src/cli/doctor.ts",
        "src/cli/doctor.test.ts",
        "src/cli/setup/providers.ts",
        "src/cli/setup/providers.test.ts",
        "README.md"
      ],
      "test_status": "pnpm test:run src/config/schema.test.ts src/daemon/clientFactory.test.ts src/cli/setup/providers.test.ts src/cli/doctor.test.ts + pnpm typecheck passing"
    },
    "announce-delivery-mode": {
      "file": "2026-02-16-announce-delivery-mode-checklist.md",
      "status": "completed",
      "date": "2026-02-16",
      "updated": "2026-02-16",
      "summary": "Implemented automation delivery mode with isolated job sessions for cron/webhooks (`automation.delivery_mode=isolated_job`) while preserving outbound routing via metadata reply peer IDs.",
      "files_created": [
        "docs/plans/2026-02-16-announce-delivery-mode-checklist.md"
      ],
      "files_modified": [
        "src/config/schema.ts",
        "src/config/schema.test.ts",
        "src/channels/registry.ts",
        "src/channels/registry.test.ts",
        "src/automation/cron.ts",
        "src/automation/cron.test.ts",
        "src/automation/webhooks.ts",
        "src/automation/webhooks.test.ts",
        "src/daemon/channels.ts",
        "README.md",
        "config/default.yaml"
      ],
      "test_status": "pnpm test:run src/channels/registry.test.ts src/automation/cron.test.ts src/automation/webhooks.test.ts src/config/schema.test.ts + pnpm typecheck passing"
    },
    "presence-tracking": {
      "file": "2026-02-16-presence-tracking-checklist.md",
      "status": "completed",
      "date": "2026-02-16",
      "updated": "2026-02-16",
      "summary": "Implemented sender presence tracking (online/offline inferred from recent activity) in ChannelRegistry and exposed it via new gateway method `system.presence` for operations visibility.",
      "files_created": [
        "docs/plans/2026-02-16-presence-tracking-checklist.md"
      ],
      "files_modified": [
        "src/channels/registry.ts",
        "src/channels/registry.test.ts",
        "src/gateway/handlers/system.ts",
        "src/gateway/handlers/handlers.test.ts",
        "src/gateway/server.ts",
        "README.md",
        "docs/api/PROTOCOL.md"
      ],
      "test_status": "pnpm test:run src/channels/registry.test.ts src/gateway/handlers/handlers.test.ts + pnpm typecheck passing"
    },
    "location-access": {
      "file": "2026-02-16-location-access-checklist.md",
      "status": "completed",
      "date": "2026-02-16",
      "updated": "2026-02-16",
      "summary": "Implemented node-scoped location access on top of gateway node capability negotiation: added `node.location.set/get` RPCs, operator `system.location` visibility, config gate `server.nodes.location.enabled` (default false), runtime config patch support, tests, and docs updates.",
      "files_created": [
        "docs/plans/2026-02-16-location-access-checklist.md"
      ],
      "files_modified": [
        "src/gateway/protocol.ts",
        "src/gateway/protocol.test.ts",
        "src/gateway/handlers/node.ts",
        "src/gateway/handlers/node.test.ts",
        "src/gateway/handlers/system.ts",
        "src/gateway/handlers/handlers.test.ts",
        "src/gateway/handlers/config.ts",
        "src/gateway/server.ts",
        "src/gateway/server.test.ts",
        "src/gateway/auth.test.ts",
        "src/daemon/services.ts",
        "src/config/schema.ts",
        "src/config/schema.test.ts",
        "config/default.yaml",
        "README.md",
        "docs/api/PROTOCOL.md"
      ],
      "test_status": "pnpm test:run src/gateway/protocol.test.ts src/gateway/auth.test.ts src/gateway/handlers/node.test.ts src/gateway/handlers/handlers.test.ts src/gateway/server.test.ts src/config/schema.test.ts + pnpm typecheck + pnpm build passing"
    },
    "canvas-a2ui-foundation": {
      "file": "2026-02-16-canvas-a2ui-foundation-checklist.md",
      "status": "completed",
      "date": "2026-02-16",
      "updated": "2026-02-16",
      "summary": "Implemented Canvas/A2UI gateway foundation with session-scoped artifact RPCs (`canvas.put/get/list/delete/clear`), in-memory artifact storage, handler/server wiring, and docs/tests.",
      "files_created": [
        "docs/plans/2026-02-16-canvas-a2ui-foundation-checklist.md",
        "src/gateway/canvas-store.ts",
        "src/gateway/canvas-store.test.ts",
        "src/gateway/handlers/canvas.ts"
      ],
      "files_modified": [
        "src/gateway/handlers/index.ts",
        "src/gateway/handlers/handlers.test.ts",
        "src/gateway/server.ts",
        "src/gateway/server.test.ts",
        "README.md",
        "docs/api/PROTOCOL.md"
      ],
      "test_status": "pnpm test:run src/gateway/canvas-store.test.ts src/gateway/handlers/handlers.test.ts src/gateway/server.test.ts + pnpm typecheck + pnpm build passing"
    },
    "macos-menu-bar-companion-foundation": {
      "file": "2026-02-16-macos-menu-bar-companion-foundation-checklist.md",
      "status": "completed",
      "date": "2026-02-16",
      "updated": "2026-02-16",
      "summary": "Implemented macOS companion foundation on gateway node RPC: added `node.status.set` for companion heartbeat/status metadata and `system.nodes` for operator visibility of registered node snapshots (role/capabilities/identity/location/status), with role-scope auth enforcement and tests/docs.",
      "files_created": [
        "docs/plans/2026-02-16-macos-menu-bar-companion-foundation-checklist.md"
      ],
      "files_modified": [
        "src/gateway/protocol.ts",
        "src/gateway/protocol.test.ts",
        "src/gateway/handlers/node.ts",
        "src/gateway/handlers/node.test.ts",
        "src/gateway/handlers/system.ts",
        "src/gateway/handlers/handlers.test.ts",
        "src/gateway/handlers/index.ts",
        "src/gateway/server.ts",
        "src/gateway/server.test.ts",
        "src/gateway/auth.test.ts",
        "README.md",
        "docs/api/PROTOCOL.md"
      ],
      "test_status": "pnpm test:run src/gateway/protocol.test.ts src/gateway/auth.test.ts src/gateway/handlers/node.test.ts src/gateway/handlers/handlers.test.ts src/gateway/server.test.ts + pnpm typecheck + pnpm build passing"
    },
    "ios-node-foundation": {
      "file": "2026-02-16-ios-node-foundation-checklist.md",
      "status": "completed",
      "date": "2026-02-16",
      "updated": "2026-02-16",
      "summary": "Implemented iOS node companion foundation by adding APNs push-token registration (`node.push_token.set`) behind `server.nodes.push.enabled`, plus masked push readiness visibility in `system.nodes` and node capability snapshots.",
      "files_created": [
        "docs/plans/2026-02-16-ios-node-foundation-checklist.md"
      ],
      "files_modified": [
        "src/gateway/protocol.ts",
        "src/gateway/protocol.test.ts",
        "src/gateway/handlers/node.ts",
        "src/gateway/handlers/node.test.ts",
        "src/gateway/handlers/system.ts",
        "src/gateway/handlers/index.ts",
        "src/gateway/handlers/config.ts",
        "src/gateway/handlers/handlers.test.ts",
        "src/gateway/server.ts",
        "src/gateway/server.test.ts",
        "src/gateway/auth.test.ts",
        "src/config/schema.ts",
        "src/config/schema.test.ts",
        "src/daemon/services.ts",
        "config/default.yaml",
        "README.md",
        "docs/api/PROTOCOL.md"
      ],
      "test_status": "pnpm test:run src/gateway/protocol.test.ts src/gateway/auth.test.ts src/gateway/handlers/node.test.ts src/gateway/handlers/handlers.test.ts src/gateway/server.test.ts src/config/schema.test.ts + pnpm typecheck + pnpm build passing"
    },
    "android-node-foundation": {
      "file": "2026-02-16-android-node-foundation-checklist.md",
      "status": "completed",
      "date": "2026-02-16",
      "updated": "2026-02-16",
      "summary": "Implemented Android node companion foundation by extending `node.push_token.set` to accept FCM tokens in addition to APNs, with masked operator visibility in `system.nodes` and existing node push policy/scope controls preserved.",
      "files_created": [
        "docs/plans/2026-02-16-android-node-foundation-checklist.md"
      ],
      "files_modified": [
        "src/gateway/protocol.ts",
        "src/gateway/protocol.test.ts",
        "src/gateway/handlers/node.ts",
        "src/gateway/handlers/node.test.ts",
        "src/gateway/handlers/system.ts",
        "src/gateway/server.ts",
        "src/gateway/server.test.ts",
        "README.md",
        "docs/api/PROTOCOL.md"
      ],
      "test_status": "pnpm test:run src/gateway/protocol.test.ts src/gateway/handlers/node.test.ts src/gateway/server.test.ts src/gateway/auth.test.ts src/gateway/handlers/handlers.test.ts src/config/schema.test.ts + pnpm typecheck + pnpm build passing"
    },
    "line-channel-adapter": {
      "file": "2026-02-16-line-channel-adapter-checklist.md",
      "status": "completed",
      "date": "2026-02-16",
      "updated": "2026-02-16",
      "summary": "Implemented LINE channel adapter with webhook ingress (`/line/events`), HMAC signature validation, mention/allowlist gating, outbound push messaging, daemon registration/wiring, and services discovery visibility.",
      "files_created": [
        "docs/plans/2026-02-16-line-channel-adapter-checklist.md",
        "src/channels/line/adapter.ts",
        "src/channels/line/adapter.test.ts",
        "src/channels/line/index.ts"
      ],
      "files_modified": [
        "src/channels/index.ts",
        "src/daemon/channels.ts",
        "src/daemon/channels.test.ts",
        "src/config/schema.ts",
        "src/config/schema.test.ts",
        "src/gateway/server.ts",
        "src/gateway/handlers/services.ts",
        "src/gateway/handlers/services.test.ts",
        "README.md",
        "config/default.yaml"
      ],
      "test_status": "pnpm test:run src/channels/line/adapter.test.ts src/daemon/channels.test.ts src/config/schema.test.ts src/gateway/handlers/services.test.ts + pnpm typecheck + pnpm build passing"
    },
    "feishu-channel-adapter": {
      "file": "2026-02-16-feishu-channel-adapter-checklist.md",
      "status": "completed",
      "date": "2026-02-16",
      "updated": "2026-02-16",
      "summary": "Implemented Feishu/Lark channel adapter with webhook ingress (`/feishu/events`), URL verification challenge handling, webhook token validation, mention/allowlist gating, outbound IM send path via tenant access token, daemon/gateway wiring, and services visibility.",
      "files_created": [
        "docs/plans/2026-02-16-feishu-channel-adapter-checklist.md",
        "src/channels/feishu/adapter.ts",
        "src/channels/feishu/adapter.test.ts",
        "src/channels/feishu/index.ts"
      ],
      "files_modified": [
        "src/channels/index.ts",
        "src/daemon/channels.ts",
        "src/daemon/channels.test.ts",
        "src/config/schema.ts",
        "src/config/schema.test.ts",
        "src/gateway/server.ts",
        "src/gateway/handlers/services.ts",
        "src/gateway/handlers/services.test.ts",
        "README.md",
        "config/default.yaml",
        "docs/architecture/CONTRIBUTOR_MAP.md"
      ],
      "test_status": "pnpm test:run src/channels/feishu/adapter.test.ts src/daemon/channels.test.ts src/config/schema.test.ts src/gateway/handlers/services.test.ts + pnpm typecheck + pnpm build passing"
    },
    "zalo-channel-adapter": {
      "file": "2026-02-16-zalo-channel-adapter-checklist.md",
      "status": "completed",
      "date": "2026-02-16",
      "updated": "2026-02-16",
      "summary": "Implemented Zalo OA channel adapter with webhook ingress (`/zalo/events`), optional webhook token validation, mention/allowlist gating, outbound OA message send path, daemon/gateway wiring, and service discovery visibility.",
      "files_created": [
        "docs/plans/2026-02-16-zalo-channel-adapter-checklist.md",
        "src/channels/zalo/adapter.ts",
        "src/channels/zalo/adapter.test.ts",
        "src/channels/zalo/index.ts"
      ],
      "files_modified": [
        "src/channels/index.ts",
        "src/daemon/channels.ts",
        "src/daemon/channels.test.ts",
        "src/config/schema.ts",
        "src/config/schema.test.ts",
        "src/gateway/server.ts",
        "src/gateway/handlers/services.ts",
        "src/gateway/handlers/services.test.ts",
        "README.md",
        "config/default.yaml",
        "docs/architecture/CONTRIBUTOR_MAP.md"
      ],
      "test_status": "pnpm test:run src/channels/zalo/adapter.test.ts src/daemon/channels.test.ts src/config/schema.test.ts src/gateway/handlers/services.test.ts + pnpm typecheck + pnpm build passing"
    },
    "companion-runtime-client-foundation": {
      "file": "2026-02-16-companion-runtime-client-foundation-checklist.md",
      "status": "completed",
      "date": "2026-02-16",
      "updated": "2026-02-16",
      "summary": "Added a reusable companion runtime gateway client (`CompanionRuntimeClient`) for Node/WebSocket JSON-RPC with typed wrappers for node registration/capability/status/location/push and operator system capability/node listing methods, including RPC error-code mapping and integration tests.",
      "files_created": [
        "docs/plans/2026-02-16-companion-runtime-client-foundation-checklist.md",
        "src/companion/runtimeClient.ts",
        "src/companion/runtimeClient.test.ts",
        "src/companion/index.ts"
      ],
      "files_modified": [
        "README.md",
        "docs/api/PROTOCOL.md",
        "docs/architecture/CONTRIBUTOR_MAP.md"
      ],
      "test_status": "pnpm test:run src/companion/runtimeClient.test.ts + pnpm typecheck + pnpm build passing"
    },
    "companion-platform-clients-foundation": {
      "file": "2026-02-16-companion-platform-clients-foundation-checklist.md",
      "status": "completed",
      "date": "2026-02-16",
      "updated": "2026-02-16",
      "summary": "Added platform-focused companion wrappers (`MacOSCompanionClient`, `IOSCompanionClient`, `AndroidCompanionClient`) on top of `CompanionRuntimeClient`, including platform-pinned status updates, push registration semantics (APNs/FCM), node registration/capability helpers, and platform-filtered node listing APIs.",
      "files_created": [
        "docs/plans/2026-02-16-companion-platform-clients-foundation-checklist.md",
        "src/companion/platformClients.ts",
        "src/companion/platformClients.test.ts"
      ],
      "files_modified": [
        "src/companion/index.ts",
        "README.md",
        "docs/api/PROTOCOL.md"
      ],
      "test_status": "pnpm test:run src/companion/platformClients.test.ts + pnpm typecheck + pnpm build passing"
    },
    "companion-platform-clients-integration-coverage": {
      "file": "2026-02-16-companion-platform-clients-integration-coverage-checklist.md",
      "status": "completed",
      "date": "2026-02-16",
      "updated": "2026-02-16",
      "summary": "Added live gateway integration coverage for companion platform wrappers, validating end-to-end registration/status/push flows for macOS, iOS, and Android against real JSON-RPC gateway handlers.",
      "files_created": [
        "docs/plans/2026-02-16-companion-platform-clients-integration-coverage-checklist.md",
        "src/companion/platformClients.integration.test.ts"
      ],
      "files_modified": [],
      "test_status": "pnpm test:run src/companion/platformClients.integration.test.ts src/companion/platformClients.test.ts src/companion/runtimeClient.test.ts + pnpm typecheck + pnpm build passing"
    },
    "qmd-backend": {
      "file": "2026-02-16-qmd-backend-checklist.md",
      "status": "completed",
      "date": "2026-02-16",
      "updated": "2026-02-16",
      "summary": "Added an experimental markdown-native QMD backend for memory.search with config-driven backend selection (hybrid embeddings -> QMD -> keyword fallback), tests, and docs updates.",
      "files_created": [
        "docs/plans/2026-02-16-qmd-backend-checklist.md",
        "src/memory/qmd-search.ts",
        "src/memory/qmd-search.test.ts"
      ],
      "files_modified": [
        "src/config/schema.ts",
        "src/config/schema.test.ts",
        "src/daemon/memory.ts",
        "src/memory/hybrid-search.ts",
        "src/memory/index.ts",
        "src/tools/builtin/index.ts",
        "src/tools/builtin/memory-search.ts",
        "README.md",
        "docs/plans/2026-02-06-openclaw-feature-gap-analysis.md",
        "docs/plans/2026-02-15-openclaw-gap-roadmap.md"
      ],
      "test_status": "pnpm test:run src/config/schema.test.ts src/memory/qmd-search.test.ts + pnpm typecheck passing"
    },
    "bonjour-mdns-discovery": {
      "file": "2026-02-16-bonjour-mdns-discovery-checklist.md",
      "status": "completed",
      "date": "2026-02-16",
      "updated": "2026-02-16",
      "summary": "Implemented optional LAN Bonjour/mDNS discovery for gateway advertisement via host tools (`avahi-publish-service` with `dns-sd` fallback), including safe default-off config (`server.discovery.*`), lifecycle start/stop wiring, loopback guardrails, docs, and tests.",
      "files_created": [
        "docs/plans/2026-02-16-bonjour-mdns-discovery-checklist.md",
        "src/gateway/discovery.ts",
        "src/gateway/discovery.test.ts",
        "src/gateway/server.discovery.test.ts"
      ],
      "files_modified": [
        "src/config/schema.ts",
        "src/config/schema.test.ts",
        "src/daemon/services.ts",
        "src/gateway/server.ts",
        "config/default.yaml",
        "README.md"
      ],
      "test_status": "pnpm test:run src/config/schema.test.ts src/gateway/discovery.test.ts src/gateway/server.discovery.test.ts + pnpm typecheck passing"
    },
    "skill-safety-scanner": {
      "file": "2026-02-15-skill-safety-scanner-checklist.md",
      "status": "completed",
      "date": "2026-02-15",
      "updated": "2026-02-15",
      "summary": "Implemented a static skill safety scanner that runs on skill load and install, blocking symlinks/oversized files/binary blobs and prompt-injection markers in SKILL.md, validating manifest.json structure, emitting audit events for scan pass/fail, and preventing routing into unavailable skills.",
      "files_created": [
        "src/skills/scanner.ts"
      ],
      "files_modified": [
        "src/skills/loader.ts",
        "src/skills/loader.test.ts",
        "src/skills/installer.ts",
        "src/skills/installer.test.ts",
        "src/audit/types.ts",
        "src/audit/logger.ts",
        "src/daemon/routing.ts"
      ],
      "test_status": "pnpm typecheck + pnpm test:run passing"
    },
    "elevated-mode": {
      "status": "completed",
      "date": "2026-02-16",
      "updated": "2026-02-16",
      "summary": "Implemented time-bounded elevated host mode (break-glass) via /elevate, with explicit confirmation flags, automatic expiry, audit events, and runtime enforcement in ToolExecutor (including sandbox vs host dispatch for sandboxed skill contexts).",
      "files_modified": [
        "src/commands/types.ts",
        "src/commands/builtin/index.ts",
        "src/commands/builtin/index.test.ts",
        "src/daemon/routing.ts",
        "src/gateway/handlers/agent.ts",
        "src/backends/native/agent.ts",
        "src/tools/policy.ts",
        "src/tools/executor.ts",
        "src/tools/executor.test.ts",
        "src/audit/types.ts",
        "src/audit/logger.ts",
        "src/daemon/index.ts"
      ],
      "test_status": "pnpm typecheck + pnpm test:run passing"
    },
    "matrix-channel-adapter": {
      "file": "2026-02-15-matrix-channel-adapter.md",
      "status": "completed",
      "date": "2026-02-16",
      "updated": "2026-02-16",
      "summary": "Added a Matrix channel adapter using the Matrix Client-Server API v3 (/sync long-poll + /send), with config schema support, daemon registration, services dashboard reporting, and secret redaction.",
      "files_created": [
        "docs/plans/2026-02-15-matrix-channel-adapter.md",
        "src/channels/matrix/adapter.ts",
        "src/channels/matrix/adapter.test.ts",
        "src/channels/matrix/index.ts"
      ],
      "files_modified": [
        "README.md",
        "src/config/schema.ts",
        "src/config/schema.test.ts",
        "src/channels/index.ts",
        "src/daemon/channels.ts",
        "src/gateway/handlers/services.ts",
        "src/gateway/handlers/services.test.ts",
        "src/gateway/handlers/config.ts",
        "src/gateway/handlers/handlers.test.ts",
        "src/cli/shared.ts",
        "src/cli/shared.test.ts"
      ],
      "test_status": "pnpm typecheck + pnpm test:run (1689 tests) passing"
    },
    "signal-channel-adapter": {
      "file": "2026-02-16-signal-channel-adapter-checklist.md",
      "status": "completed",
      "date": "2026-02-16",
      "updated": "2026-02-16",
      "summary": "Added a first-class Signal channel adapter backed by `signal-cli` with outbound send (DM + groups), inbound polling, allowlist/pairing gating, group mention checks, config schema + daemon wiring, service discovery integration, tests, and docs.",
      "files_created": [
        "docs/plans/2026-02-16-signal-channel-adapter-checklist.md",
        "src/channels/signal/adapter.ts",
        "src/channels/signal/adapter.test.ts",
        "src/channels/signal/index.ts"
      ],
      "files_modified": [
        "src/config/schema.ts",
        "src/config/schema.test.ts",
        "src/daemon/channels.ts",
        "src/channels/index.ts",
        "src/gateway/handlers/services.ts",
        "src/gateway/handlers/services.test.ts",
        "README.md",
        "config/default.yaml"
      ],
      "test_status": "pnpm test:run src/channels/signal/adapter.test.ts src/config/schema.test.ts src/gateway/handlers/services.test.ts + pnpm typecheck passing"
    },
    "microsoft-teams-channel-adapter": {
      "file": "2026-02-16-microsoft-teams-channel-adapter-checklist.md",
      "status": "completed",
      "date": "2026-02-16",
      "updated": "2026-02-16",
      "summary": "Added a first-class Microsoft Teams adapter using Bot Framework activity webhooks and OAuth client-credential outbound send flow, including mention-aware group gating, conversation allowlist support, gateway route wiring (`POST /teams/events`), docs, and tests.",
      "files_created": [
        "docs/plans/2026-02-16-microsoft-teams-channel-adapter-checklist.md",
        "src/channels/teams/adapter.ts",
        "src/channels/teams/adapter.test.ts",
        "src/channels/teams/index.ts"
      ],
      "files_modified": [
        "src/config/schema.ts",
        "src/config/schema.test.ts",
        "src/daemon/channels.ts",
        "src/channels/index.ts",
        "src/gateway/server.ts",
        "src/gateway/handlers/services.ts",
        "src/gateway/handlers/services.test.ts",
        "src/cli/shared.ts",
        "src/cli/shared.test.ts",
        "README.md",
        "config/default.yaml",
        "docs/api/PROTOCOL.md"
      ],
      "test_status": "pnpm test:run src/channels/teams/adapter.test.ts src/config/schema.test.ts src/gateway/handlers/services.test.ts src/cli/shared.test.ts + pnpm typecheck passing"
    },
    "google-chat-channel-adapter": {
      "file": "2026-02-16-google-chat-channel-adapter-checklist.md",
      "status": "completed",
      "date": "2026-02-16",
      "updated": "2026-02-16",
      "summary": "Added a first-class Google Chat adapter with inbound event webhook handling (`POST /google-chat/events`), optional webhook token validation, mention-aware room gating, space allowlist filtering, and outbound Chat API replies via service-account OAuth token flow.",
      "files_created": [
        "docs/plans/2026-02-16-google-chat-channel-adapter-checklist.md",
        "src/channels/googleChat/adapter.ts",
        "src/channels/googleChat/adapter.test.ts",
        "src/channels/googleChat/index.ts"
      ],
      "files_modified": [
        "src/config/schema.ts",
        "src/config/schema.test.ts",
        "src/daemon/channels.ts",
        "src/channels/index.ts",
        "src/gateway/server.ts",
        "src/gateway/handlers/services.ts",
        "src/gateway/handlers/services.test.ts",
        "src/cli/shared.ts",
        "src/cli/shared.test.ts",
        "README.md",
        "config/default.yaml",
        "docs/api/PROTOCOL.md"
      ],
      "test_status": "pnpm test:run src/channels/googleChat/adapter.test.ts src/config/schema.test.ts src/gateway/handlers/services.test.ts src/cli/shared.test.ts + pnpm typecheck passing"
    },
    "imessage-bluebubbles-channel-adapter": {
      "file": "2026-02-16-imessage-bluebubbles-channel-adapter-checklist.md",
      "status": "completed",
      "date": "2026-02-16",
      "updated": "2026-02-16",
      "summary": "Added a first-class iMessage channel via BlueBubbles with inbound webhook handling (`POST /bluebubbles/events`), optional webhook token validation, chat GUID allowlist/mention gating, outbound BlueBubbles REST send, gateway wiring, docs, and tests.",
      "files_created": [
        "docs/plans/2026-02-16-imessage-bluebubbles-channel-adapter-checklist.md",
        "src/channels/bluebubbles/adapter.ts",
        "src/channels/bluebubbles/adapter.test.ts",
        "src/channels/bluebubbles/index.ts"
      ],
      "files_modified": [
        "src/config/schema.ts",
        "src/config/schema.test.ts",
        "src/daemon/channels.ts",
        "src/channels/index.ts",
        "src/gateway/server.ts",
        "src/gateway/handlers/services.ts",
        "src/gateway/handlers/services.test.ts",
        "README.md",
        "config/default.yaml",
        "docs/api/PROTOCOL.md"
      ],
      "test_status": "pnpm test:run src/channels/bluebubbles/adapter.test.ts src/config/schema.test.ts src/gateway/handlers/services.test.ts + pnpm typecheck passing"
    },
    "voice-wake-talk-mode": {
      "file": "2026-02-16-voice-wake-and-capture-checklist.md",
      "status": "completed",
      "date": "2026-02-16",
      "updated": "2026-02-16",
      "summary": "Added configurable wake-phrase talk mode (`audio.talk_mode`) with timed listen windows and `/talk on|off|status` controls in the message router.",
      "files_modified": [
        "src/config/schema.ts",
        "src/config/schema.test.ts",
        "src/daemon/routing.ts",
        "src/daemon/routing.test.ts",
        "README.md",
        "config/default.yaml"
      ],
      "test_status": "pnpm test:run src/daemon/routing.test.ts src/config/schema.test.ts + pnpm typecheck passing"
    },
    "camera-screen-capture": {
      "file": "2026-02-16-voice-wake-and-capture-checklist.md",
      "status": "completed",
      "date": "2026-02-16",
      "updated": "2026-02-16",
      "summary": "Added host capture tools (`screen.capture`, `camera.capture`) with platform command wrappers and base64 image payload output for camera/screen workflows.",
      "files_created": [
        "src/tools/builtin/capture.ts",
        "src/tools/builtin/capture.test.ts"
      ],
      "files_modified": [
        "src/tools/builtin/index.ts",
        "src/tools/policy.ts",
        "README.md"
      ],
      "test_status": "pnpm test:run src/tools/builtin/capture.test.ts src/tools/policy.test.ts + pnpm typecheck passing"
    },
    "openclaw-style-personal-agent-without-openclaw-risks": {
      "file": "2026-02-14-openclaw-style-personal-agent-without-openclaw-risks-plan.md",
      "status": "completed",
      "date": "2026-02-14",
      "updated": "2026-02-14",
      "summary": "Implemented safe-by-default personal-agent hardening: capability-declared skills enforced via ToolPolicy + ToolExecutor, skill intent routing with sandbox-by-default for high-risk tools, prompt-injection provenance tags + tool-call guard, secret-scope gating for credentialed tools, and audit log hardening (redaction + correlation IDs).",
      "files_modified": [
        "README.md",
        "config/default.yaml",
        "docs/api/TOOLS.md",
        "docs/plans/2026-02-14-openclaw-safe-agent-implementation.md",
        "src/skills/types.ts",
        "src/skills/loader.ts",
        "src/tools/types.ts",
        "src/tools/policy.ts",
        "src/tools/executor.ts",
        "src/backends/native/agent.ts",
        "src/daemon/routing.ts",
        "src/daemon/index.ts",
        "src/daemon/services.ts",
        "src/cli/skills.ts",
        "src/cli/setup/security.ts",
        "src/gateway/handlers/services.ts",
        "src/audit/types.ts",
        "src/audit/logger.ts"
      ],
      "files_created": [
        "docs/security/SAFE_PERSONAL_AGENT.md",
        "src/audit/redact.ts"
      ],
      "test_status": "pnpm test:run + pnpm typecheck passing"
    },
    "openclaw-feature-gap-analysis": {
      "file": "2026-02-06-openclaw-feature-gap-analysis.md",
      "status": "completed",
      "date": "2026-02-06",
      "updated": "2026-02-07",
      "summary": "Comprehensive comparison of Flynn vs OpenClaw. 116 features compared: 75 match (65%), 2 partial (2%), 38 missing (33%). Updated 2026-02-07 after full codebase audit revealed 33+ features previously marked MISSING were actually implemented."
    },
    "tui-model-switch-strict-tier-fix": {
      "status": "completed",
      "date": "2026-02-13",
      "summary": "Fixed minimal TUI model switching for provider/model overrides by reusing provider credentials, syncing agent tier with router tier, enabling strict-tier mode for explicit overrides so fallback chains do not silently route requests to local models, and adding Zhipu OAuth token credential support (auth_token + ZHIPUAI_AUTH_TOKEN).",
      "files_modified": [
        "src/frontends/tui/minimal.ts",
        "src/frontends/tui/minimal.test.ts",
        "src/frontends/tui/fullscreen.ts",
        "src/frontends/tui/components/App.tsx",
        "src/cli/tui.ts",
        "src/daemon/models.ts",
        "src/daemon/clientFactory.test.ts",
        "src/models/router.ts",
        "src/models/router.test.ts",
        "src/models/openai.ts",
        "src/models/openai.test.ts",
        "src/models/retry.ts",
        "src/models/retry.test.ts",
        "src/hooks/engine.ts",
        "src/hooks/engine.test.ts",
        "src/cli/shared.ts",
        "src/cli/shared.test.ts",
        "src/models/local/llamacpp.ts",
        "src/models/local/llamacpp.test.ts"
      ],
      "test_status": "pnpm test:run (targeted suites) + pnpm typecheck passing"
    },
    "voice-message-transcription-fastpath": {
      "status": "completed",
      "date": "2026-02-14",
      "summary": "When a non-audio-capable model receives a voice attachment but audio transcription is not configured, route replies via a deterministic fast-path config help message instead of invoking the LLM (which cannot safely consume the audio).",
      "files_modified": [
        "src/daemon/routing.ts",
        "src/daemon/routing.test.ts"
      ],
      "test_status": "pnpm test:run src/daemon/routing.test.ts + pnpm typecheck passing (full pnpm test:run fails in this sandbox due to EPERM listen/spawn)"
    },
    "context-overflow-recovery": {
      "status": "completed",
      "date": "2026-02-14",
      "summary": "Hardened voice-message and fallback behavior by using tier-specific model identity (modelName/contextWindow) for compaction heuristics and by intercepting tool-loop provider errors to rollback history, hard-trim on detected context overflows, and retry once with a clean, user-friendly failure message on repeated errors.",
      "files_modified": [
        "src/daemon/routing.ts",
        "src/backends/native/orchestrator.ts",
        "src/backends/native/orchestrator.test.ts"
      ],
      "test_status": "pnpm test:run src/backends/native/orchestrator.test.ts src/daemon/routing.test.ts + pnpm typecheck passing"
    },
    "gateway-services-dashboard": {
      "status": "completed",
      "date": "2026-02-14",
      "summary": "Added a system.services RPC that returns a unified list of channel adapters plus automation + tooling subsystems (configured vs connected), including audio transcription and web search, and updated the web UI dashboard/settings to render these as a Services grid.",
      "files_modified": [
        "src/gateway/handlers/services.ts",
        "src/gateway/handlers/services.test.ts",
        "src/gateway/handlers/system.ts",
        "src/gateway/handlers/index.ts",
        "src/gateway/handlers/handlers.test.ts",
        "src/gateway/server.ts",
        "src/gateway/ui/pages/dashboard.js",
        "src/gateway/ui/pages/settings.js",
        "src/gateway/ui/style.css"
      ],
      "test_status": "pnpm test:run src/gateway/handlers/services.test.ts src/gateway/handlers/handlers.test.ts + pnpm typecheck passing"
    },
    "anthropic-auth-cli": {
      "status": "completed",
      "date": "2026-02-14",
      "summary": "Added `flynn anthropic-auth` to securely store an Anthropic API key in ~/.config/flynn/auth.json and wired model client creation to use ANTHROPIC_API_KEY or stored credentials when config omits api_key.",
      "files_modified": [
        "src/auth/anthropic.ts",
        "src/auth/anthropic.test.ts",
        "src/auth/index.ts",
        "src/cli/anthropic-auth.ts",
        "src/cli/index.ts",
        "src/daemon/models.ts"
      ],
      "test_status": "pnpm test:run src/auth/anthropic.test.ts + pnpm typecheck passing"
    },
    "openai-oauth-and-audio-capability-tweaks": {
      "status": "completed",
      "date": "2026-02-14",
      "summary": "Fixed OpenAI OAuth (Codex) message shaping by using output_text for assistant turns, and made native-audio detection conservative via a model allowlist so Flynn does not attempt to send raw audio to models that cannot consume it.",
      "files_modified": [
        "src/models/openai.ts",
        "src/models/capabilities.ts"
      ],
      "test_status": "pnpm typecheck passing (no new tests added in this change)"
    },
    "synthetic-model-provider": {
      "status": "completed",
      "date": "2026-02-14",
      "summary": "Added a local-only `synthetic` model provider for offline development and deterministic tests. Supports echo/fixed/error modes and a dev `@tool <name> <json>` directive to emit tool calls.",
      "files_created": [
        "src/models/synthetic.ts",
        "src/models/synthetic.test.ts"
      ],
      "files_modified": [
        "src/config/schema.ts",
        "src/models/index.ts",
        "src/daemon/models.ts"
      ],
      "test_status": "pnpm test:run src/models/synthetic.test.ts + pnpm typecheck passing"
    },
    "p0-p1-implementation-plan": {
      "file": "2026-02-06-p0-p1-implementation-plan.md",
      "status": "completed",
      "date": "2026-02-06",
      "summary": "7 features across 7 phases (0-6). Estimated 15-22 days total.",
      "phases": {
        "phase_0_multi_model_delegation": {
          "priority": "P0",
          "status": "completed",
          "description": "AgentOrchestrator with sub-agent delegation to different model tiers",
          "files_created": [
            "src/backends/native/orchestrator.ts",
            "src/backends/native/orchestrator.test.ts",
            "src/backends/native/prompts.ts"
          ],
          "files_modified": [
            "src/daemon/index.ts",
            "src/config/schema.ts"
          ],
          "test_status": "20/20 passing"
        },
        "phase_1_context_compaction": {
          "priority": "P0",
          "status": "completed",
          "description": "Token estimation, auto-compaction, /compact command, SQLite history replacement",
          "files_created": [
            "src/context/tokens.ts",
            "src/context/tokens.test.ts",
            "src/context/compaction.ts",
            "src/context/compaction.test.ts",
            "src/context/index.ts"
          ],
          "files_modified": [
            "src/backends/native/orchestrator.ts",
            "src/session/manager.ts",
            "src/session/store.ts",
            "src/config/schema.ts",
            "src/daemon/index.ts",
            "src/frontends/tui/commands.ts"
          ],
          "test_status": "21/21 passing"
        },
        "phase_2_memory_system": {
          "priority": "P0",
          "status": "completed",
          "description": "Persistent memory with file-based storage, memory tools, auto-extraction after compaction",
          "depends_on": [
            "phase_0",
            "phase_1"
          ],
          "files_created": [
            "src/memory/store.ts",
            "src/memory/store.test.ts",
            "src/memory/index.ts",
            "src/tools/builtin/memory-read.ts",
            "src/tools/builtin/memory-write.ts",
            "src/tools/builtin/memory-search.ts"
          ],
          "files_modified": [
            "src/tools/builtin/index.ts",
            "src/config/schema.ts",
            "src/backends/native/agent.ts",
            "src/backends/native/orchestrator.ts",
            "src/context/compaction.ts",
            "src/daemon/index.ts"
          ],
          "test_status": "17/17 passing"
        },
        "phase_3_messaging_channels": {
          "priority": "P1",
          "status": "completed",
          "description": "Discord, Slack, WhatsApp channel adapters",
          "sub_phases": {
            "3a_discord": {
              "status": "completed",
              "effort": "1-2 days",
              "files_created": [
                "src/channels/discord/adapter.ts",
                "src/channels/discord/adapter.test.ts",
                "src/channels/discord/index.ts"
              ],
              "files_modified": [
                "src/config/schema.ts",
                "src/channels/index.ts",
                "src/daemon/index.ts"
              ],
              "test_status": "22/22 passing"
            },
            "3b_slack": {
              "status": "completed",
              "effort": "1 day",
              "files_created": [
                "src/channels/slack/adapter.ts",
                "src/channels/slack/adapter.test.ts",
                "src/channels/slack/index.ts"
              ],
              "files_modified": [
                "src/config/schema.ts",
                "src/channels/index.ts",
                "src/daemon/index.ts",
                "package.json"
              ],
              "new_dependencies": [
                "@slack/bolt"
              ],
              "test_status": "22/22 passing",
              "notes": "Socket Mode only (HTTP fallback deferred). Slash commands deferred. User ID used as senderName (display name resolution is a follow-up)."
            },
            "3c_whatsapp": {
              "status": "completed",
              "effort": "2-3 days",
              "files_created": [
                "src/channels/whatsapp/adapter.ts",
                "src/channels/whatsapp/adapter.test.ts",
                "src/channels/whatsapp/index.ts"
              ],
              "files_modified": [
                "src/config/schema.ts",
                "src/channels/index.ts",
                "src/daemon/index.ts",
                "package.json"
              ],
              "new_dependencies": [
                "whatsapp-web.js"
              ],
              "test_status": "25/25 passing",
              "notes": "QR code auth via LocalAuth. Session persistence via data_dir. Group messages filtered (DM only). Phone number allowlist. Headless Chrome with Puppeteer."
            }
          },
          "planned_files": [
            "src/channels/discord/adapter.ts",
            "src/channels/discord/index.ts",
            "src/channels/slack/adapter.ts",
            "src/channels/slack/index.ts",
            "src/channels/whatsapp/adapter.ts",
            "src/channels/whatsapp/index.ts",
            "src/channels/utils/chunking.ts",
            "src/channels/utils/auth.ts",
            "src/channels/utils/markdown.ts"
          ]
        },
        "phase_4_web_search": {
          "priority": "P1",
          "status": "completed",
          "description": "Web search tool (Brave Search API + SearXNG fallback)",
          "effort": "0.5 day",
          "files_created": [
            "src/tools/builtin/web-search.ts",
            "src/tools/builtin/web-search.test.ts"
          ],
          "files_modified": [
            "src/config/schema.ts",
            "src/tools/builtin/index.ts",
            "src/tools/index.ts",
            "src/daemon/index.ts"
          ],
          "test_status": "14/14 passing"
        },
        "phase_5_background_exec": {
          "priority": "P1",
          "status": "completed",
          "description": "Background process management tools (start, status, output, kill, list)",
          "effort": "1-2 days",
          "files_created": [
            "src/tools/builtin/process/manager.ts",
            "src/tools/builtin/process/start.ts",
            "src/tools/builtin/process/status.ts",
            "src/tools/builtin/process/output.ts",
            "src/tools/builtin/process/kill.ts",
            "src/tools/builtin/process/list.ts",
            "src/tools/builtin/process/index.ts",
            "src/tools/builtin/process/manager.test.ts"
          ],
          "files_modified": [
            "src/config/schema.ts",
            "src/tools/builtin/index.ts",
            "src/tools/index.ts",
            "src/daemon/index.ts"
          ],
          "test_status": "28/28 passing"
        },
        "phase_6_enhanced_web_fetch": {
          "priority": "P1",
          "status": "completed",
          "description": "HTML-to-markdown extraction, format parameter, response caching",
          "effort": "1 day",
          "files_modified": [
            "src/tools/builtin/web-fetch.ts",
            "src/tools/builtin/web-fetch.test.ts"
          ],
          "new_dependencies": [
            "turndown",
            "linkedom",
            "@mozilla/readability",
            "@types/turndown"
          ],
          "test_status": "10/10 passing"
        }
      }
    },
    "p2-implementation": {
      "status": "completed",
      "date": "2026-02-06",
      "summary": "7 P2 features: tech debt cleanup, retry policy, system prompt templating, usage tracking, tool allow/deny profiles, Docker sandboxing, multi-agent routing",
      "phases": {
        "tech_debt_cleanup": {
          "priority": "P2",
          "status": "completed",
          "description": "Extract shared splitMessage() from 4 adapters into channels/utils.ts; fix Slack senderName with users.info API + caching",
          "files_created": [
            "src/channels/utils.ts",
            "src/channels/utils.test.ts"
          ],
          "files_modified": [
            "src/channels/telegram/adapter.ts",
            "src/channels/discord/adapter.ts",
            "src/channels/slack/adapter.ts",
            "src/channels/whatsapp/adapter.ts",
            "src/channels/index.ts"
          ],
          "test_status": "10/10 passing"
        },
        "retry_policy": {
          "priority": "P2",
          "status": "completed",
          "description": "withRetry() with exponential backoff + jitter, isRetryable() filter, wired into ModelRouter.chat() (non-streaming)",
          "files_created": [
            "src/models/retry.ts",
            "src/models/retry.test.ts"
          ],
          "files_modified": [
            "src/config/schema.ts",
            "src/models/router.ts",
            "src/models/index.ts",
            "src/daemon/index.ts"
          ],
          "test_status": "18/18 passing"
        },
        "system_prompt_templating": {
          "priority": "P2",
          "status": "completed",
          "description": "assembleSystemPrompt() multi-file template system (SOUL/AGENTS/IDENTITY/USER/TOOLS.md) with configurable search dirs and extra sections",
          "files_created": [
            "src/prompt/template.ts",
            "src/prompt/template.test.ts",
            "src/prompt/index.ts"
          ],
          "files_modified": [
            "src/config/schema.ts",
            "src/daemon/index.ts"
          ],
          "test_status": "12/12 passing"
        },
        "usage_tracking": {
          "priority": "P2",
          "status": "completed",
          "description": "Usage accumulators in NativeAgent + AgentOrchestrator, estimateCost() with model pricing, /usage TUI command",
          "files_created": [
            "src/models/costs.ts",
            "src/models/costs.test.ts"
          ],
          "files_modified": [
            "src/backends/native/agent.ts",
            "src/backends/native/orchestrator.ts",
            "src/backends/native/index.ts",
            "src/backends/index.ts",
            "src/frontends/tui/commands.ts",
            "src/frontends/tui/commands.test.ts",
            "src/daemon/index.ts"
          ],
          "test_status": "11/11 passing (9 costs + 2 commands)"
        },
        "tool_allow_deny_profiles": {
          "priority": "P2",
          "status": "completed",
          "description": "Configurable tool filtering with 4 built-in profiles (minimal/messaging/coding/full), global and per-agent/per-provider allow/deny lists with glob patterns, defense-in-depth enforcement at listing and execution",
          "files_created": [
            "src/tools/policy.ts",
            "src/tools/policy.test.ts"
          ],
          "files_modified": [
            "src/config/schema.ts",
            "src/config/index.ts",
            "src/tools/registry.ts",
            "src/tools/executor.ts",
            "src/tools/index.ts",
            "src/backends/native/agent.ts",
            "src/backends/native/orchestrator.ts",
            "src/daemon/index.ts",
            "src/gateway/handlers/tools.ts",
            "src/gateway/handlers/handlers.test.ts",
            "src/gateway/server.test.ts"
          ],
          "test_status": "37/37 passing"
        },
        "docker_sandboxing": {
          "priority": "P2",
          "status": "completed",
          "description": "Docker-based tool sandboxing: DockerSandbox container lifecycle, SandboxManager per-session containers, sandboxed shell.exec/process.start tool wrappers, ToolRegistry.clone()/replace(), lazy container creation, daemon wiring with shutdown cleanup",
          "files_created": [
            "src/sandbox/docker.ts",
            "src/sandbox/docker.test.ts",
            "src/sandbox/manager.ts",
            "src/sandbox/manager.test.ts",
            "src/sandbox/tools.ts",
            "src/sandbox/tools.test.ts",
            "src/sandbox/index.ts"
          ],
          "files_modified": [
            "src/config/schema.ts",
            "src/config/index.ts",
            "src/tools/registry.ts",
            "src/tools/registry.test.ts",
            "src/daemon/index.ts"
          ],
          "test_status": "31/31 passing (10 docker + 6 manager + 8 tools + 5 registry + 2 integration)"
        },
        "multi_agent_routing": {
          "priority": "P2",
          "status": "completed",
          "description": "Config-driven agent routing: AgentConfigRegistry for named agent configs (system_prompt, model_tier, tool_profile, sandbox), AgentRouter with sender→channel→default resolution (glob patterns), per-agent tool registry cloning with sandboxed overrides, daemon wiring",
          "files_created": [
            "src/agents/registry.ts",
            "src/agents/registry.test.ts",
            "src/agents/router.ts",
            "src/agents/router.test.ts",
            "src/agents/index.ts",
            "src/daemon/routing.test.ts"
          ],
          "files_modified": [
            "src/config/schema.ts",
            "src/config/index.ts",
            "src/daemon/index.ts"
          ],
          "test_status": "14/14 passing (5 registry + 7 router + 2 integration)"
        }
      }
    },
    "p4-media-pipeline": {
      "status": "completed",
      "date": "2026-02-06",
      "summary": "Multimodal media pipeline: receive images from channel adapters and pass through to vision-capable models (Anthropic, OpenAI, Gemini, Bedrock)",
      "phases": {
        "type_widening": {
          "priority": "P4",
          "status": "completed",
          "description": "Widen Message.content from string to string | MessageContentPart[], add Attachment type to channel layer, add ImageSource/MessageContentPart types",
          "files_created": [
            "src/models/media.ts",
            "src/models/media.test.ts"
          ],
          "files_modified": [
            "src/models/types.ts",
            "src/models/index.ts",
            "src/channels/types.ts",
            "src/channels/index.ts"
          ],
          "test_status": "25/25 passing"
        },
        "model_client_multimodal": {
          "priority": "P4",
          "status": "completed",
          "description": "Update all model clients to convert MessageContentPart[] to provider-specific image formats (Anthropic base64, OpenAI data URI, Gemini inlineData, Bedrock image bytes)",
          "files_modified": [
            "src/models/anthropic.ts",
            "src/models/openai.ts",
            "src/models/gemini.ts",
            "src/models/bedrock.ts",
            "src/models/local/llamacpp.ts",
            "src/models/local/ollama.ts"
          ]
        },
        "agent_attachment_passthrough": {
          "priority": "P4",
          "status": "completed",
          "description": "Wire attachments through NativeAgent.process() and AgentOrchestrator.process() to daemon message handler",
          "files_modified": [
            "src/backends/native/agent.ts",
            "src/backends/native/orchestrator.ts",
            "src/daemon/index.ts"
          ]
        },
        "downstream_type_fixes": {
          "priority": "P4",
          "status": "completed",
          "description": "Fix all consumers of Message.content to use getMessageText() helper: token estimation, compaction, TUI rendering",
          "files_modified": [
            "src/context/tokens.ts",
            "src/context/compaction.ts",
            "src/frontends/tui/components/MessageList.tsx"
          ]
        },
        "channel_adapter_extraction": {
          "priority": "P4",
          "status": "completed",
          "description": "Extract images from platform messages in all channel adapters",
          "sub_phases": {
            "telegram": {
              "status": "completed",
              "description": "Handle message:photo (largest size, download via getFile API, base64) and image message:document events with caption text",
              "files_modified": [
                "src/channels/telegram/adapter.ts"
              ]
            },
            "discord": {
              "status": "completed",
              "description": "Extract image attachments from message.attachments Collection, pass Discord CDN URLs directly",
              "files_modified": [
                "src/channels/discord/adapter.ts"
              ]
            },
            "slack": {
              "status": "completed",
              "description": "Download image files via url_private_download with bot token auth, base64 encode",
              "files_modified": [
                "src/channels/slack/adapter.ts"
              ]
            },
            "whatsapp": {
              "status": "completed",
              "description": "Use downloadMedia() from whatsapp-web.js (returns base64 natively)",
              "files_modified": [
                "src/channels/whatsapp/adapter.ts"
              ]
            },
            "webchat": {
              "status": "completed",
              "description": "Webchat UI can send image attachments via gateway agent.send attachments parameter; agent handler accepts attachment-only messages",
              "files_modified": [
                "src/gateway/ui/pages/chat.js",
                "src/gateway/ui/chat.html",
                "src/gateway/ui/style.css",
                "src/gateway/handlers/agent.ts",
                "src/gateway/handlers/handlers.test.ts"
              ]
            }
          }
        }
      }
    },
    "p5-github-copilot-provider": {
      "status": "completed",
      "date": "2026-02-06",
      "summary": "GitHub Copilot as a model provider with OAuth device flow and auto-login on first use",
      "phases": {
        "copilot_client": {
          "priority": "P5",
          "status": "completed",
          "description": "GitHubModelsClient using OpenAI SDK against api.githubcopilot.com with Copilot-specific headers, multimodal support, streaming, tool calls",
          "files_created": [
            "src/models/github.ts",
            "src/auth/github.ts",
            "src/auth/index.ts"
          ],
          "files_modified": [
            "src/config/schema.ts",
            "src/models/index.ts",
            "src/models/costs.ts",
            "src/daemon/index.ts",
            "src/cli/tui.ts"
          ]
        },
        "oauth_device_flow": {
          "priority": "P5",
          "status": "completed",
          "description": "Interactive OAuth device flow via /login github command, token stored at ~/.config/flynn/auth.json with chmod 0600",
          "files_modified": [
            "src/frontends/tui/minimal.ts",
            "src/frontends/tui/commands.ts"
          ]
        },
        "auto_login": {
          "priority": "P5",
          "status": "completed",
          "description": "Lazy token resolution with onLoginRequired callback — triggers OAuth device flow automatically on first API call when no token is available",
          "files_modified": [
            "src/models/github.ts",
            "src/daemon/index.ts",
            "src/cli/tui.ts"
          ]
        }
      }
    },
    "p6-enhanced-media-pipeline": {
      "status": "completed",
      "date": "2026-02-07",
      "summary": "Enhanced media pipeline: image analysis tool, outbound attachments, gateway protocol attachments, audio transcription for voice messages across all channels",
      "phases": {
        "6a_image_analyze_tool": {
          "priority": "P6",
          "status": "completed",
          "description": "Factory createImageAnalyzeTool(modelClient) that sends images to a vision-capable model and returns textual analysis",
          "files_created": [
            "src/tools/builtin/image-analyze.ts",
            "src/tools/builtin/image-analyze.test.ts"
          ],
          "files_modified": [
            "src/tools/builtin/index.ts"
          ],
          "test_status": "15/15 passing"
        },
        "6b_outbound_attachments": {
          "priority": "P6",
          "status": "completed",
          "description": "OutboundAttachment type, OutboundAttachmentCollector (push/drain pattern), media.send tool for queuing outbound files, channel adapter send support (Telegram, Discord, Slack, WhatsApp)",
          "files_created": [
            "src/backends/native/attachments.ts",
            "src/backends/native/attachments.test.ts",
            "src/tools/builtin/media-send.ts",
            "src/tools/builtin/media-send.test.ts"
          ],
          "files_modified": [
            "src/channels/types.ts",
            "src/channels/index.ts",
            "src/backends/native/agent.ts",
            "src/backends/native/index.ts",
            "src/backends/native/orchestrator.ts",
            "src/channels/telegram/adapter.ts",
            "src/channels/discord/adapter.ts",
            "src/channels/slack/adapter.ts",
            "src/channels/whatsapp/adapter.ts",
            "src/tools/builtin/index.ts",
            "src/tools/index.ts",
            "src/daemon/index.ts"
          ],
          "test_status": "15/15 passing (7 collector + 8 tool)"
        },
        "6c_gateway_protocol_attachments": {
          "priority": "P6",
          "status": "completed",
          "description": "GatewayAttachment type, attachment event type, agent.send handler accepts optional attachments parameter and converts for agent pipeline",
          "files_modified": [
            "src/gateway/protocol.ts",
            "src/gateway/protocol.test.ts",
            "src/gateway/handlers/agent.ts",
            "src/gateway/handlers/handlers.test.ts",
            "src/gateway/index.ts"
          ],
          "test_status": "5 new tests passing"
        },
        "6d_audio_transcription": {
          "priority": "P6",
          "status": "completed",
          "description": "Whisper-compatible audio transcription via configurable endpoint. Functions: isSupportedAudio(), mimeToExtension(), transcribeAudio(), buildUserMessageWithAudio(). Config schema audio section. Daemon wires transcription into message router. All channel adapters extract audio (Telegram voice+audio, Discord audio/*, Slack audio/*, WhatsApp ptt+audio)",
          "files_modified": [
            "src/models/media.ts",
            "src/models/media.test.ts",
            "src/config/schema.ts",
            "src/daemon/index.ts"
          ],
          "test_status": "57/57 passing (was 25, +32 audio tests)"
        }
      }
    },
    "p7-web-ui-dashboard": {
      "file": "2026-02-07-web-ui-dashboard.md",
      "status": "completed",
      "date": "2026-02-07",
      "summary": "Full SPA control dashboard: Dashboard (health, channels, auto-refresh), Chat (session selector, tool events, markdown), Sessions (list, history, delete), Settings (hook editor, tools, config viewer)",
      "phases": {
        "phase_1_backend_enhancements": {
          "priority": "P7",
          "status": "completed",
          "description": "New gateway handlers (sessions.delete, sessions.switch, system.channels, system.usage), channelRegistry wiring, static file content types",
          "files_modified": [
            "src/gateway/handlers/sessions.ts",
            "src/gateway/handlers/system.ts",
            "src/gateway/server.ts",
            "src/gateway/static.ts",
            "src/daemon/index.ts"
          ]
        },
        "phase_2_spa_shell": {
          "priority": "P7",
          "status": "completed",
          "description": "SPA shell with hash-based router, sidebar nav, WebSocket RPC client with auto-reconnect, connection status indicator",
          "files_created": [
            "src/gateway/ui/app.js",
            "src/gateway/ui/lib/ws-client.js"
          ],
          "files_modified": [
            "src/gateway/ui/index.html",
            "src/gateway/ui/style.css"
          ]
        },
        "phase_3_dashboard": {
          "priority": "P7",
          "status": "completed",
          "description": "Dashboard page with health stats cards, channel status grid, usage summary, 10s auto-refresh",
          "files_created": [
            "src/gateway/ui/pages/dashboard.js"
          ]
        },
        "phase_4_chat": {
          "priority": "P7",
          "status": "completed",
          "description": "Chat page with session selector, new session, streaming tool events (collapsible), markdown rendering with syntax highlighting",
          "files_created": [
            "src/gateway/ui/pages/chat.js"
          ]
        },
        "phase_5_sessions": {
          "priority": "P7",
          "status": "completed",
          "description": "Sessions browser with list table, history viewer, delete with confirmation",
          "files_created": [
            "src/gateway/ui/pages/sessions.js"
          ]
        },
        "phase_6_settings": {
          "priority": "P7",
          "status": "completed",
          "description": "Settings page with hook pattern editor (save via config.patch), tool list, channel grid, redacted config viewer",
          "files_created": [
            "src/gateway/ui/pages/settings.js"
          ]
        }
      }
    },
    "p8-agent-tools": {
      "status": "completed",
      "date": "2026-02-07",
      "summary": "8 new agent-callable tools exposing existing internal APIs, plus gap analysis audit update (25% → 65% match rate)",
      "phases": {
        "sessions_tools": {
          "priority": "P8",
          "status": "completed",
          "description": "sessions.list, sessions.history, sessions.create, sessions.delete tools wrapping SessionManager",
          "files_created": [
            "src/tools/builtin/sessions.ts"
          ],
          "files_modified": [
            "src/tools/builtin/index.ts",
            "src/tools/index.ts",
            "src/daemon/index.ts"
          ]
        },
        "agents_list_tool": {
          "priority": "P8",
          "status": "completed",
          "description": "agents.list tool wrapping AgentConfigRegistry.list()",
          "files_created": [
            "src/tools/builtin/agents-list.ts"
          ]
        },
        "message_send_tool": {
          "priority": "P8",
          "status": "completed",
          "description": "message.send tool wrapping ChannelRegistry for cross-channel messaging",
          "files_created": [
            "src/tools/builtin/message-send.ts"
          ]
        },
        "cron_tools": {
          "priority": "P8",
          "status": "completed",
          "description": "cron.list, cron.trigger tools wrapping CronScheduler",
          "files_created": [
            "src/tools/builtin/cron.ts"
          ]
        },
        "gap_analysis_update": {
          "priority": "P8",
          "status": "completed",
          "description": "Full codebase audit and gap analysis document update. 33+ features previously marked MISSING corrected to MATCH. Scorecard: 75/116 match (65%), 2 partial, 38 missing",
          "files_modified": [
            "docs/plans/2026-02-06-openclaw-feature-gap-analysis.md"
          ]
        }
      }
    },
    "tier3-file-patch-and-gmail": {
      "status": "completed",
      "date": "2026-02-07",
      "summary": "2 features from Tier 3 gap analysis: file.patch multi-hunk tool and Gmail Pub/Sub watcher",
      "phases": {
        "file_patch_tool": {
          "priority": "Tier3",
          "status": "completed",
          "description": "file.patch tool for multi-hunk structured patches — apply multiple line-based edits (replacements, insertions, deletions) across one or more files in a single tool call. Hunks applied bottom-up to preserve line numbers.",
          "files_created": [
            "src/tools/builtin/file-patch.ts",
            "src/tools/builtin/file-patch.test.ts"
          ],
          "files_modified": [
            "src/tools/builtin/index.ts",
            "src/tools/policy.ts"
          ],
          "test_status": "10/10 passing"
        },
        "gmail_pubsub_watcher": {
          "priority": "Tier3",
          "status": "completed",
          "description": "Gmail Pub/Sub watcher ChannelAdapter — monitors Gmail via Google Cloud Pub/Sub push notifications with polling fallback. OAuth2 auth, configurable watch labels, template rendering with email metadata placeholders. Wired into daemon lifecycle and gateway (POST /gmail/push endpoint).",
          "files_created": [
            "src/automation/gmail.ts",
            "src/automation/gmail.test.ts"
          ],
          "files_modified": [
            "src/automation/index.ts",
            "src/config/schema.ts",
            "src/gateway/server.ts",
            "src/daemon/index.ts",
            "package.json"
          ],
          "new_dependencies": [
            "googleapis"
          ],
          "test_status": "16/16 passing"
        }
      }
    },
    "gmail-push-revisit": {
      "status": "completed",
      "date": "2026-02-13",
      "summary": "Hardened Gmail watcher operational model: explicit push disable flag, added Pub/Sub pull subscription support (no inbound webhook), improved watch error hints, enhanced doctor diagnostics (mode detection + push viability warning for Tailnet-only), and updated docs/examples.",
      "files_created": [
        "docs/plans/2026-02-13-gmail-push-revisit-implementation-plan.md",
        "docs/plans/2026-02-13-gmail-push-revisit-summary.md",
        "docs/plans/2026-02-13-gmail-deployment-patterns.md",
        "docs/plans/2026-02-13-gmail-quick-reference.md"
      ],
      "files_modified": [
        "src/config/schema.ts",
        "src/automation/gmail.ts",
        "src/automation/gmail.test.ts",
        "src/cli/doctor.ts",
        "src/cli/doctor.test.ts",
        "src/tools/builtin/gmail.test.ts",
        "README.md",
        "config/default.yaml",
        "package.json",
        "pnpm-lock.yaml"
      ],
      "new_dependencies": [
        "@google-cloud/pubsub"
      ],
      "test_status": "pnpm typecheck + pnpm test:run passing"
    },
    "openai-oauth-codex": {
      "status": "completed",
      "date": "2026-02-13",
      "summary": "Added OpenAI OAuth (ChatGPT Plus/Pro) device-flow auth and Codex backend support for the OpenAI provider (SSE-based /backend-api/codex/responses). Supports `flynn openai-auth`, `use_oauth: true` in model config, and `/login openai` in the minimal TUI.",
      "files_created": [
        "src/auth/openai.ts",
        "src/auth/openai.test.ts",
        "src/cli/openai-auth.ts",
        "src/models/openai.oauth.test.ts"
      ],
      "files_modified": [
        "src/auth/index.ts",
        "src/models/openai.ts",
        "src/daemon/models.ts",
        "src/config/schema.ts",
        "src/cli/index.ts",
        "src/cli/doctor.ts",
        "src/frontends/tui/minimal.ts",
        "src/frontends/tui/commands.ts"
      ],
      "test_status": "pnpm typecheck + pnpm test:run passing"
    },
    "zai-glm-4.7-credential-integration": {
      "status": "completed",
      "date": "2026-02-13",
      "summary": "Added first-class Z.AI (GLM) credential storage and setup flow. Z.AI authenticates via API keys (HTTP Bearer), so Flynn now supports `flynn zai-auth` to store the key in ~/.config/flynn/auth.json, `/login zai` in the minimal TUI, and `use_oauth: true` for the zhipuai provider to resolve credentials from the auth store (or env) without embedding secrets in config.",
      "files_created": [
        "src/auth/zai.ts",
        "src/cli/zai-auth.ts"
      ],
      "files_modified": [
        "src/auth/index.ts",
        "src/cli/index.ts",
        "src/cli/setup/providers.ts",
        "src/daemon/models.ts",
        "src/daemon/clientFactory.test.ts",
        "src/frontends/tui/minimal.ts",
        "src/frontends/tui/commands.ts"
      ],
      "test_status": "pnpm build + pnpm typecheck + pnpm test:run passing"
    },
    "runtime-context-awareness": {
      "status": "completed",
      "date": "2026-02-07",
      "summary": "Runtime context: system.info tool + automatic date/time injection in system prompt",
      "phases": {
        "system_prompt_date_injection": {
          "status": "completed",
          "description": "assembleSystemPrompt() now unconditionally appends a '# Runtime Context' section with current date and time",
          "files_modified": [
            "src/prompt/template.ts",
            "src/prompt/template.test.ts"
          ],
          "test_status": "13/13 passing"
        },
        "system_info_tool": {
          "status": "completed",
          "description": "New system.info tool providing date, time, hostname, platform, architecture, OS release, uptime, Node.js version, memory usage, working directory. Added to all tool profiles (minimal/messaging/coding).",
          "files_created": [
            "src/tools/builtin/system-info.ts",
            "src/tools/builtin/system-info.test.ts"
          ],
          "files_modified": [
            "src/tools/builtin/index.ts",
            "src/tools/policy.ts",
            "src/tools/index.ts",
            "SOUL.md"
          ],
          "test_status": "6/6 passing"
        }
      }
    },
    "local-model-tool-calling": {
      "status": "completed",
      "date": "2026-02-07",
      "summary": "Add tool calling support to both local model backends (Ollama and llama.cpp), plus thinking/reasoning field handling for Ollama",
      "phases": {
        "ollama_tool_calling": {
          "status": "completed",
          "description": "Pass tools to Ollama API in correct format, parse tool_calls from responses with generated IDs, set stopReason to 'tool_use'. Handle thinking field from reasoning models (deepseek-r1, glm-4.7-flash) — use as content fallback and expose via thinkingContent. Streaming support for both tool calls and thinking.",
          "files_modified": [
            "src/models/local/ollama.ts",
            "src/models/local/ollama.test.ts"
          ],
          "test_status": "8/8 passing (was 1)"
        },
        "llamacpp_tool_calling": {
          "status": "completed",
          "description": "Pass tools via OpenAI-compatible /v1/chat/completions endpoint, parse tool_calls from responses, accumulate streaming tool call deltas across incremental chunks. Set stopReason to 'tool_use' when tool calls present.",
          "files_modified": [
            "src/models/local/llamacpp.ts",
            "src/models/local/llamacpp.test.ts"
          ],
          "test_status": "8/8 passing (was 3)"
        }
      }
    },
    "tier3-remaining-features": {
      "status": "completed",
      "date": "2026-02-09",
      "summary": "5 Tier 3 features from gap analysis: Lane Queue, credential redaction, Web UI token dashboard, xAI (Grok) provider, Voyage AI embeddings",
      "phases": {
        "lane_queue": {
          "priority": "Tier3",
          "status": "completed",
          "description": "Per-session FIFO queue in gateway — serializes concurrent requests instead of rejecting. LaneQueue class with enqueue/cancel/queueLength methods.",
          "files_created": [
            "src/gateway/lane-queue.ts",
            "src/gateway/lane-queue.test.ts"
          ],
          "files_modified": [
            "src/gateway/handlers/agent.ts",
            "src/gateway/server.ts",
            "src/gateway/index.ts"
          ],
          "test_status": "9/9 passing"
        },
        "credential_redaction": {
          "priority": "Tier3",
          "status": "completed",
          "description": "Expanded redactConfig() from 2 secret locations to 18+ secret fields — telegram, discord, slack tokens; server.token; all model tier api_key/auth_token; web_search, audio, memory embedding api_keys; webhook secrets; gmail credentials; MCP server env vars.",
          "files_modified": [
            "src/gateway/handlers/config.ts",
            "src/gateway/handlers/handlers.test.ts"
          ],
          "test_status": "16/16 passing"
        },
        "web_ui_token_dashboard": {
          "priority": "Tier3",
          "status": "completed",
          "description": "system.tokenUsage gateway endpoint + Usage page in web dashboard SPA with summary cards, per-session table, and auto-refresh.",
          "files_created": [
            "src/gateway/ui/pages/usage.js"
          ],
          "files_modified": [
            "src/gateway/handlers/system.ts",
            "src/gateway/session-bridge.ts",
            "src/daemon/index.ts",
            "src/gateway/ui/index.html",
            "src/gateway/ui/style.css"
          ]
        },
        "xai_grok_provider": {
          "priority": "Tier3",
          "status": "completed",
          "description": "xAI as OpenAI-compatible model provider — reuses OpenAIClient with baseURL https://api.x.ai/v1, XAI_API_KEY env var fallback, pricing for grok-3/grok-3-mini/grok-2/grok-2-mini/grok-3-fast.",
          "files_modified": [
            "src/config/schema.ts",
            "src/daemon/index.ts",
            "src/models/costs.ts"
          ]
        },
        "voyage_ai_embeddings": {
          "priority": "Tier3",
          "status": "completed",
          "description": "Voyage AI embedding provider for memory/vector search — OpenAI SDK with baseURL https://api.voyageai.com/v1, defaults to 1024 dimensions, VOYAGE_API_KEY env var.",
          "files_modified": [
            "src/config/schema.ts",
            "src/memory/embeddings.ts",
            "src/memory/embeddings.test.ts"
          ],
          "test_status": "5/5 passing"
        }
      }
    },
    "tier4-features": {
      "status": "completed",
      "date": "2026-02-09",
      "summary": "4 Tier 4 features from gap analysis: Gateway lock (single-client mode), shell completion (bash/zsh/fish), Tailscale Serve/Funnel, DM pairing codes (PairingManager + channel adapters + gateway handlers + TUI command)",
      "phases": {
        "gateway_lock": {
          "priority": "Tier4",
          "status": "completed",
          "description": "Single-client gateway mode — if lock=true and a client is connected, reject new connections with code 4003. UI detects locked state.",
          "files_modified": [
            "src/config/schema.ts",
            "src/gateway/server.ts",
            "src/gateway/server.test.ts",
            "src/gateway/ui/lib/ws-client.js",
            "src/daemon/index.ts"
          ],
          "test_status": "4/4 passing"
        },
        "shell_completion": {
          "priority": "Tier4",
          "status": "completed",
          "description": "Generate shell completions for bash, zsh, and fish. --install flag writes to appropriate rc file.",
          "files_created": [
            "src/cli/completion.ts",
            "src/cli/completion.test.ts"
          ],
          "files_modified": [
            "src/cli/index.ts"
          ],
          "test_status": "11/11 passing"
        },
        "tailscale_serve": {
          "priority": "Tier4",
          "status": "completed",
          "description": "Auto-start tailscale serve on gateway start, auto-stop on shutdown. isTailscaleAvailable() check, doctor integration.",
          "files_created": [
            "src/gateway/tailscale.ts",
            "src/gateway/tailscale.test.ts"
          ],
          "files_modified": [
            "src/gateway/index.ts",
            "src/daemon/index.ts",
            "src/cli/doctor.ts"
          ],
          "test_status": "6/6 passing"
        },
        "dm_pairing_codes": {
          "priority": "Tier4",
          "status": "completed",
          "description": "PairingManager with TTL codes, channel adapter integration (Telegram, Discord, Slack, WhatsApp), gateway pairing handlers (generate/list/revoke), TUI /pair command execution, daemon wiring, SQLite persistence via PairingStore interface.",
          "files_created": [
            "src/channels/pairing.ts",
            "src/channels/pairing.test.ts",
            "src/gateway/handlers/pairing.ts"
          ],
          "files_modified": [
            "src/channels/index.ts",
            "src/channels/telegram/adapter.ts",
            "src/channels/discord/adapter.ts",
            "src/channels/slack/adapter.ts",
            "src/channels/whatsapp/adapter.ts",
            "src/config/schema.ts",
            "src/gateway/handlers/index.ts",
            "src/gateway/handlers/handlers.test.ts",
            "src/gateway/server.ts",
            "src/daemon/index.ts",
            "src/daemon/services.ts",
            "src/session/store.ts",
            "src/frontends/tui/commands.ts",
            "src/frontends/tui/commands.test.ts",
            "src/frontends/tui/minimal.ts",
            "src/cli/tui.ts"
          ],
          "test_status": "35/35 passing (20 pairing + 6 handlers + 4 store + 5 commands)"
        }
      }
    },
    "setup-wizard": {
      "file": "2026-02-10-setup-wizard-implementation.md",
      "status": "completed",
      "date": "2026-02-10",
      "design": "2026-02-10-setup-wizard-design.md",
      "summary": "Interactive setup wizard for Flynn. Two entry points: auto-trigger on first run (flynn start with no config) and explicit flynn setup command. Minimal-first flow (provider + channel) then menu-driven reconfiguration (6 sections: models, channels, memory, automation, security, gateway). Made telegram optional in config schema.",
      "files_created": [
        "src/cli/setup.ts",
        "src/cli/setup/prompts.ts",
        "src/cli/setup/prompts.test.ts",
        "src/cli/setup/config.ts",
        "src/cli/setup/config.test.ts",
        "src/cli/setup/summary.ts",
        "src/cli/setup/providers.ts",
        "src/cli/setup/providers.test.ts",
        "src/cli/setup/channels.ts",
        "src/cli/setup/channels.test.ts",
        "src/cli/setup/memory.ts",
        "src/cli/setup/automation.ts",
        "src/cli/setup/security.ts",
        "src/cli/setup/gateway.ts",
        "src/cli/setup/orchestrator.ts",
        "src/cli/setup/orchestrator.test.ts",
        "src/cli/setup/sections.test.ts",
        "src/cli/setup/integration.test.ts"
      ],
      "files_modified": [
        "src/config/schema.ts",
        "src/cli/start.ts",
        "src/cli/index.ts",
        "src/cli/completion.ts",
        "src/daemon/channels.ts",
        "src/cli/tui.ts",
        "src/cli/doctor.ts"
      ],
      "test_status": "31/31 passing"
    },
    "log-level-system": {
      "status": "completed",
      "date": "2026-02-09",
      "summary": "Configurable log-level system to suppress noisy fallback debug output in TUI. Replaces console.debug/log/warn with structured logger respecting config log_level (default: info).",
      "files_created": [
        "src/logger.ts"
      ],
      "files_modified": [
        "src/models/router.ts",
        "src/models/retry.ts",
        "src/daemon/models.ts",
        "src/config/schema.ts",
        "src/daemon/index.ts",
        "src/cli/tui.ts",
        "config/default.yaml"
      ]
    },
    "gmail-html-sanitization": {
      "status": "completed",
      "date": "2026-02-10",
      "summary": "Sanitize HTML entities and tags in Gmail tool output. Gmail API returns snippets with HTML entities (&amp;, &#39;, <br>, etc.) that leaked into LLM responses. Added shared sanitizeHtml() utility and applied to both gmail tool and gmail watcher.",
      "files_created": [
        "src/utils/html.ts",
        "src/utils/html.test.ts"
      ],
      "files_modified": [
        "src/tools/builtin/gmail.ts",
        "src/tools/builtin/gmail.test.ts",
        "src/automation/gmail.ts"
      ],
      "test_status": "21/21 passing (html.test) + 18/18 passing (gmail.test) + 16/16 passing (automation/gmail.test)"
    },
    "webchat-slash-commands": {
      "status": "completed",
      "date": "2026-02-10",
      "summary": "Slash commands, autocomplete popup, web search button, and message action buttons (copy/edit) for the webchat SPA. 6 commands: /help, /reset, /compact, /usage, /status, /model. Search button toggles web search mode. Copy button on all messages, edit button on user messages populates input.",
      "phases": {
        "backend_command_handling": {
          "status": "completed",
          "description": "Extended agent.send RPC handler to accept optional metadata (isCommand, command). /reset handled server-side via agent.reset().",
          "files_modified": [
            "src/gateway/handlers/agent.ts"
          ]
        },
        "frontend_slash_commands": {
          "status": "completed",
          "description": "Slash command parsing, autocomplete popup (arrow keys, Enter/Tab/Escape), search button toggle, system messages, /help /reset /compact /usage /status /model handlers",
          "files_modified": [
            "src/gateway/ui/pages/chat.js"
          ]
        },
        "css_styling": {
          "status": "completed",
          "description": "Styles for .chat-actions, .btn-action, .slash-popup, .slash-popup-item, .message.system, .chat-input-wrapper, plus responsive breakpoints for 600px and 768px",
          "files_modified": [
            "src/gateway/ui/style.css"
          ]
        },
        "message_action_buttons": {
          "status": "completed",
          "description": "Discrete copy and edit buttons on messages. Copy on all messages (clipboard API with checkmark feedback), edit on user messages (populates input textarea). Hidden until hover on desktop, always visible on mobile.",
          "files_modified": [
            "src/gateway/ui/pages/chat.js",
            "src/gateway/ui/style.css"
          ]
        }
      }
    },
    "tui-fullscreen-improvements": {
      "status": "completed",
      "date": "2026-02-10",
      "summary": "ASCII art banner, fullscreen tool access via NativeAgent, Ink-compatible tool use display, proper /reset with agent state cleanup",
      "phases": {
        "ascii_banner": {
          "status": "completed",
          "description": "Shared banner module with FLYNN ASCII art, colored ANSI output for minimal mode, plain lines for Ink/React fullscreen mode",
          "files_created": [
            "src/frontends/tui/banner.ts"
          ],
          "files_modified": [
            "src/frontends/tui/minimal.ts",
            "src/frontends/tui/components/MessageList.tsx",
            "src/frontends/tui/index.ts"
          ]
        },
        "fullscreen_tool_access": {
          "status": "completed",
          "description": "Fullscreen TUI now uses NativeAgent.process() for full tool loop instead of direct model client calls. Agent passed through from CLI to App component.",
          "files_modified": [
            "src/frontends/tui/fullscreen.ts",
            "src/frontends/tui/components/App.tsx",
            "src/cli/tui.ts"
          ]
        },
        "fullscreen_tool_display": {
          "status": "completed",
          "description": "Replaced process.stdout.write-based onToolUse callback with React state-driven display. Tool names, args, and completion status shown in streaming content area during agent processing.",
          "files_modified": [
            "src/frontends/tui/components/App.tsx"
          ]
        },
        "fullscreen_reset_fix": {
          "status": "completed",
          "description": "The /reset command now calls agent.reset() which clears session, history, tool fingerprint, and usage counters together.",
          "files_modified": [
            "src/frontends/tui/components/App.tsx"
          ]
        }
      }
    },
    "remaining-phases-phase1-pr1-context-levels": {
      "file": "phase1-pr1-context-level-checklist.md",
      "status": "completed",
      "date": "2026-02-12",
      "summary": "Added prompt context levels (minimal/normal/detailed/debug) with config schema support, prompt assembly behavior changes, daemon wiring, and coverage for parsing plus level-specific prompt output.",
      "files_modified": [
        "src/config/schema.ts",
        "src/config/schema.test.ts",
        "src/prompt/template.ts",
        "src/prompt/template.test.ts",
        "src/daemon/services.ts",
        "config/default.yaml"
      ],
      "test_status": "typecheck + targeted template tests + full test suite + build passing; lint currently fails due pre-existing unrelated repo issues"
    },
    "remaining-phases-phase1-pr2-command-registry": {
      "file": "phase1-pr2-command-registry-checklist.md",
      "status": "completed",
      "date": "2026-02-12",
      "summary": "Added a deterministic fast-path CommandRegistry with built-in slash commands and integrated it into channel routing and gateway agent handling so known commands execute before orchestrator message processing.",
      "files_created": [
        "src/commands/types.ts",
        "src/commands/registry.ts",
        "src/commands/builtin/index.ts",
        "src/commands/index.ts",
        "src/commands/registry.test.ts",
        "src/gateway/handlers/agent.test.ts"
      ],
      "files_modified": [
        "src/daemon/index.ts",
        "src/daemon/routing.ts",
        "src/daemon/routing.test.ts",
        "src/daemon/services.ts",
        "src/gateway/server.ts",
        "src/gateway/handlers/agent.ts"
      ],
      "test_status": "typecheck + targeted command/routing/gateway tests + full test suite + build passing; lint currently fails due pre-existing unrelated repo issues"
    },
    "remaining-phases-phase1-pr3-memory-structure": {
      "file": "phase1-pr3-memory-structure-checklist.md",
      "status": "completed",
      "date": "2026-02-12",
      "summary": "Added structured memory categories (facts/preferences/decisions/projects) with backward-compatible MemoryStore category APIs, optional category-aware search filters, prompt-context category inclusion, and updated memory tool namespace docs.",
      "files_created": [
        "src/memory/categories.ts",
        "src/memory/categories.test.ts"
      ],
      "files_modified": [
        "src/memory/store.ts",
        "src/memory/store.test.ts",
        "src/memory/index.ts",
        "src/tools/builtin/memory-read.ts",
        "src/tools/builtin/memory-write.ts",
        "src/tools/builtin/memory-search.ts"
      ],
      "test_status": "typecheck + targeted categories/store tests + full test suite + build passing; lint currently fails due pre-existing unrelated repo issues"
    },
    "remaining-phases-phase2-pr1-component-registry": {
      "file": "phase2-pr1-component-registry-checklist.md",
      "status": "completed",
      "date": "2026-02-12",
      "summary": "Added intent/component registry routing with configurable match rules and deterministic resolution, integrated opt-in intent-based agent override in daemon routing, and exposed gateway inspection endpoints (`intents.list`, `intents.match`).",
      "files_created": [
        "src/intents/registry.ts",
        "src/intents/index.ts",
        "src/intents/registry.test.ts",
        "src/gateway/handlers/intents.ts"
      ],
      "files_modified": [
        "src/config/schema.ts",
        "src/config/schema.test.ts",
        "src/daemon/index.ts",
        "src/daemon/routing.ts",
        "src/daemon/routing.test.ts",
        "src/daemon/services.ts",
        "src/gateway/server.ts",
        "src/gateway/handlers/index.ts",
        "src/gateway/handlers/handlers.test.ts"
      ],
      "test_status": "typecheck + targeted intents/routing/handlers tests + full test suite + build passing; lint currently fails due pre-existing unrelated repo issues"
    },
    "remaining-phases-phase2-pr2-confidence-routing": {
      "file": "phase2-pr2-confidence-routing-checklist.md",
      "status": "completed",
      "date": "2026-02-12",
      "summary": "Added confidence-based routing policy with configurable thresholds to choose fast-path intent routing versus standard LLM orchestration, and exposed routing decision inspection via gateway.",
      "files_created": [
        "src/routing/policy.ts",
        "src/routing/index.ts",
        "src/routing/policy.test.ts",
        "src/gateway/handlers/routing.ts"
      ],
      "files_modified": [
        "src/config/schema.ts",
        "src/config/schema.test.ts",
        "src/intents/registry.test.ts",
        "src/daemon/index.ts",
        "src/daemon/routing.ts",
        "src/daemon/routing.test.ts",
        "src/daemon/services.ts",
        "src/gateway/server.ts",
        "src/gateway/handlers/index.ts",
        "src/gateway/handlers/handlers.test.ts"
      ],
      "test_status": "typecheck + targeted policy/intents/routing tests + full test suite + build passing; lint currently fails due pre-existing unrelated repo issues"
    },
    "remaining-phases-phase2-pr3-history-index": {
      "file": "phase2-pr3-history-index-checklist.md",
      "status": "completed",
      "date": "2026-02-13",
      "summary": "Added lightweight session history indexing and topic search with migration-safe metadata persistence, ranked keyword search + recency scoring, gateway search/reindex handlers, and optional routing confidence boost from historical overlap.",
      "files_created": [
        "src/session/indexer.ts",
        "src/session/search.ts",
        "src/session/indexer.test.ts",
        "src/session/search.test.ts",
        "src/gateway/handlers/history.ts"
      ],
      "files_modified": [
        "src/config/schema.ts",
        "src/config/schema.test.ts",
        "src/session/store.ts",
        "src/session/store.test.ts",
        "src/session/manager.ts",
        "src/session/manager.test.ts",
        "src/session/index.ts",
        "src/daemon/index.ts",
        "src/daemon/routing.ts",
        "src/daemon/routing.test.ts",
        "src/gateway/handlers/index.ts",
        "src/gateway/handlers/handlers.test.ts",
        "src/gateway/server.ts"
      ],
      "test_status": "pnpm typecheck + pnpm test:run (1593/1593) + pnpm build passing"
    },
    "remaining-phases-phase3-pr1-adaptive-memory-compaction": {
      "file": "phase3-pr1-adaptive-memory-compaction-checklist.md",
      "status": "completed",
      "date": "2026-02-12",
      "summary": "Added configurable memory injection strategies (all/recent/adaptive) with adaptive relevance scoring and budget clipping, plus weighted compaction that can preserve high-importance turns while keeping default behavior when thresholds remain at defaults.",
      "files_created": [
        "src/memory/adaptive.ts",
        "src/memory/adaptive.test.ts",
        "src/context/weighting.ts",
        "src/context/weighting.test.ts"
      ],
      "files_modified": [
        "src/config/schema.ts",
        "src/config/schema.test.ts",
        "src/memory/store.ts",
        "src/memory/index.ts",
        "src/backends/native/orchestrator.ts",
        "src/backends/native/orchestrator.test.ts",
        "src/context/compaction.ts",
        "src/context/compaction.test.ts",
        "src/daemon/routing.ts",
        "src/gateway/session-bridge.ts"
      ],
      "test_status": "typecheck + targeted adaptive/weighting/compaction/orchestrator tests + full test suite + build passing; lint currently fails due pre-existing unrelated repo issues"
    },
    "remaining-phases-phase3-pr2-policy-autonomy-hardening": {
      "file": "phase3-pr2-policy-autonomy-hardening-checklist.md",
      "status": "completed",
      "date": "2026-02-12",
      "summary": "Added runtime-enforceable truthfulness guardrails (strict/standard/relaxed modes injected into system prompts) and autonomy-aware tool execution controls (conservative/standard/autonomous levels with per-tool danger classification and override logic). Both configs default to 'standard' for safe behavior.",
      "files_created": [
        "src/backends/native/guardrails.ts",
        "src/backends/native/guardrails.test.ts",
        "src/hooks/autonomy.ts",
        "src/hooks/autonomy.test.ts"
      ],
      "files_modified": [
        "src/config/schema.ts",
        "src/tools/policy.ts",
        "src/tools/executor.ts",
        "src/audit/types.ts",
        "src/prompt/template.ts",
        "src/daemon/services.ts",
        "src/daemon/routing.ts",
        "src/gateway/session-bridge.ts",
        "src/tools/integration.test.ts"
      ],
      "test_status": "typecheck + targeted guardrails/autonomy/executor/engine/schema/template tests + full suite passing (1490/1490); lint passing baseline (394 warnings, 0 errors); build passing"
    },
    "model-persistence-per-session": {
      "file": "2026-02-11-model-persistence-per-session.md",
      "status": "completed",
      "date": "2026-02-13",
      "summary": "Implemented per-session model tier persistence across routing, gateway, and Telegram by adding SQLite session config storage and wiring /model and /reset command fast-paths to persist/clear model overrides.",
      "files_modified": [
        "src/session/store.ts",
        "src/session/store.test.ts",
        "src/session/manager.ts",
        "src/session/manager.test.ts",
        "src/session/index.ts",
        "src/daemon/routing.ts",
        "src/daemon/routing.test.ts",
        "src/gateway/session-bridge.ts",
        "src/gateway/session-bridge.test.ts",
        "src/gateway/handlers/agent.ts",
        "src/gateway/handlers/agent.test.ts",
        "src/gateway/server.ts",
        "src/gateway/handlers/index.ts",
        "src/channels/telegram/adapter.ts",
        "src/daemon/index.ts",
        "src/daemon/services.ts",
        "src/config/schema.ts",
        "src/config/schema.test.ts",
        "src/backends/native/orchestrator.ts",
        "src/backends/native/orchestrator.test.ts",
        "src/context/compaction.ts",
        "src/context/compaction.test.ts",
        "src/memory/store.ts",
        "src/memory/store.test.ts",
        "src/memory/index.ts",
        "src/tools/builtin/memory-read.ts",
        "src/tools/builtin/memory-search.ts",
        "src/tools/builtin/memory-write.ts",
        "src/models/capabilities.ts",
        "src/automation/cron.ts",
        "src/automation/heartbeat.ts",
        "src/cli/tui.ts",
        "src/audit/types.ts",
        "src/audit/logger.ts",
        "src/audit/rotation.ts",
        "config/default.yaml"
      ],
      "test_status": "pnpm typecheck + pnpm test:run (1586/1586) + pnpm build passing"
    },
    "gateway-agent-cancel-runtime": {
      "status": "completed",
      "date": "2026-02-13",
      "summary": "Implemented real runtime cancellation wiring for `agent.cancel`: active requests are now cancellable at safe points in `NativeAgent`, queued lane work is cleared, and gateway/session bridge cancellation paths return explicit status messages.",
      "files_modified": [
        "src/backends/native/agent.ts",
        "src/backends/native/agent.test.ts",
        "src/backends/native/orchestrator.ts",
        "src/gateway/session-bridge.ts",
        "src/gateway/session-bridge.test.ts",
        "src/gateway/handlers/agent.ts",
        "src/gateway/handlers/handlers.test.ts"
      ],
      "test_status": "pnpm typecheck + pnpm test:run (1597/1597) + pnpm build passing"
    },
    "skills_infrastructure": {
      "file": "2026-02-11-skills-infrastructure-plan.md",
      "status": "completed",
      "date": "2026-02-11",
      "summary": "Three-phase plan to improve skills system: Command Dispatch (P0), Skills Watcher (P1), Installer Specs (P1). Infrastructure-first approach before integrating ClawHub skills. Estimated 8-11 hours total. Model strategy: glm-4.7-flash for mechanical tasks, glm-4.7 for complex/orchestration tasks.",
      "phases": {
        "phase_1_command_dispatch": {
          "priority": "P0",
          "status": "completed",
          "description": "flynn skills CLI commands (list/info/install/uninstall/refresh) with doctor enhancement",
          "effort": "2-3 hours",
          "sub_slices": {
            "skills_list_command": {
              "status": "completed",
              "description": "Added `flynn skills list` command dispatch with table/JSON output and CLI registration",
              "files_created": [
                "src/cli/skills.ts",
                "src/cli/skills.test.ts"
              ],
              "files_modified": [
                "src/cli/index.ts",
                "src/cli/index.test.ts"
              ],
              "test_status": "typecheck + targeted skills/index CLI tests + full test suite + lint (warnings only, 0 errors) + build passing"
            },
            "skills_info_command": {
              "status": "completed",
              "description": "Added `flynn skills info <name>` command dispatch with human-readable and JSON output for discovered skills",
              "files_modified": [
                "src/cli/skills.ts",
                "src/cli/skills.test.ts"
              ],
              "test_status": "typecheck + targeted skills CLI tests + full test suite + lint (warnings only, 0 errors) + build passing"
            },
            "skills_install_command_local": {
              "status": "completed",
              "description": "Added `flynn skills install <path>` local-directory command dispatch using SkillInstaller with config-aware managed_dir resolution",
              "files_modified": [
                "src/cli/skills.ts",
                "src/cli/skills.test.ts"
              ],
              "test_status": "typecheck + targeted skills CLI tests + full test suite + lint (warnings only, 0 errors) + build passing"
            },
            "skills_uninstall_command": {
              "status": "completed",
              "description": "Added `flynn skills uninstall <name>` command dispatch with --yes confirmation guard and managed-tier uninstall protection",
              "files_modified": [
                "src/cli/skills.ts",
                "src/cli/skills.test.ts"
              ],
              "test_status": "typecheck + targeted skills CLI tests + full test suite + lint (warnings only, 0 errors) + build passing"
            },
            "skills_refresh_command": {
              "status": "completed",
              "description": "Added `flynn skills refresh` command dispatch with human-readable and JSON summary output for current skill discovery",
              "files_modified": [
                "src/cli/skills.ts",
                "src/cli/skills.test.ts"
              ],
              "test_status": "typecheck + targeted skills CLI tests + full test suite + lint (warnings only, 0 errors) + build passing"
            },
            "doctor_skills_diagnostics": {
              "status": "completed",
              "description": "Enhanced `flynn doctor` skills diagnostics to report availability counts and warn on missing configured skill directories",
              "files_modified": [
                "src/cli/doctor.ts",
                "src/cli/doctor.test.ts"
              ],
              "test_status": "typecheck + targeted doctor tests + full test suite + lint (warnings only, 0 errors) + build passing"
            }
          }
        },
        "phase_2_skills_watcher": {
          "priority": "P1",
          "status": "completed",
          "description": "Auto-reload skills with chokidar file watcher, configurable debounce",
          "effort": "3-4 hours",
          "sub_slices": {
            "watcher_bootstrap": {
              "status": "completed",
              "description": "Added core `SkillsWatcher` class with debounced change batching, lifecycle controls, and foundational tests",
              "files_created": [
                "src/skills/watcher.ts",
                "src/skills/watcher.test.ts"
              ],
              "files_modified": [
                "src/skills/index.ts"
              ],
              "test_status": "typecheck + targeted watcher tests + full test suite + lint (warnings only, 0 errors) + build passing"
            },
            "watcher_daemon_wiring": {
              "status": "completed",
              "description": "Wired SkillsWatcher into daemon skills initialization and shutdown lifecycle behind config toggle with debounce settings",
              "files_created": [
                "src/daemon/services.test.ts"
              ],
              "files_modified": [
                "src/config/schema.ts",
                "src/config/schema.test.ts",
                "src/daemon/services.ts",
                "src/daemon/index.ts",
                "src/skills/index.ts"
              ],
              "test_status": "typecheck + targeted schema/services tests + full test suite + lint (warnings only, 0 errors) + build passing"
            },
            "watcher_callback_full_reload": {
              "status": "completed",
              "description": "Implemented watcher callback behavior to fully reload skills from disk and repopulate SkillRegistry on debounced change events",
              "files_modified": [
                "src/daemon/services.ts",
                "src/daemon/services.test.ts",
                "src/skills/registry.ts",
                "src/skills/registry.test.ts"
              ],
              "test_status": "pnpm typecheck + pnpm test:run src/daemon/services.test.ts src/skills/registry.test.ts + pnpm test:run + pnpm lint (warnings only, 0 errors) + pnpm build passing"
            },
            "watcher_targeted_skill_updates": {
              "status": "completed",
              "description": "Optimized watcher callback to perform targeted skill add/update/remove by mapped path, with safe fallback to full reload for ambiguous paths",
              "files_modified": [
                "src/daemon/services.ts",
                "src/daemon/services.test.ts"
              ],
              "test_status": "pnpm typecheck + pnpm test:run src/daemon/services.test.ts + pnpm test:run + pnpm lint (warnings only, 0 errors) + pnpm build passing"
            },
            "watcher_observability_polish": {
              "status": "completed",
              "description": "Improved watcher event logs with explicit mode/reason and per-event counters for upsert/remove/shadowed updates versus fallback reloads",
              "files_modified": [
                "src/daemon/services.ts",
                "src/daemon/services.test.ts"
              ],
              "test_status": "pnpm typecheck + pnpm test:run src/daemon/services.test.ts + pnpm test:run + pnpm lint (warnings only, 0 errors) + pnpm build passing"
            }
          }
        },
        "phase_3_installer_specs": {
          "priority": "P1",
          "status": "completed",
          "description": "Auto-install dependencies (brew/node/go/download) with package manager detection",
          "effort": "3-4 hours",
          "sub_slices": {
            "manifest_installers_type_validation": {
              "status": "completed",
              "description": "Added manifest installers type definitions and loader validation for brew/node/go/download installer specs with focused tests",
              "files_modified": [
                "src/skills/types.ts",
                "src/skills/index.ts",
                "src/skills/loader.ts",
                "src/skills/loader.test.ts"
              ],
              "test_status": "pnpm typecheck + pnpm test:run src/skills/loader.test.ts + pnpm test:run + pnpm lint (warnings only, 0 errors) + pnpm build passing"
            },
            "installer_dry_run_planning_surface": {
              "status": "completed",
              "description": "Added dry-run installer planning with package-manager selection rules and surfaced planned/skipped installer steps in skills info output",
              "files_created": [
                "src/skills/planner.ts",
                "src/skills/planner.test.ts"
              ],
              "files_modified": [
                "src/skills/index.ts",
                "src/cli/skills.ts",
                "src/cli/skills.test.ts"
              ],
              "test_status": "pnpm typecheck + pnpm test:run src/skills/planner.test.ts src/cli/skills.test.ts + pnpm test:run + pnpm lint (warnings only, 0 errors) + pnpm build passing"
            },
            "installer_plan_command_json_output": {
              "status": "completed",
              "description": "Added dedicated skills plan command surface with reusable installer plan view and JSON/text rendering helpers for automation consumption",
              "files_modified": [
                "src/cli/skills.ts",
                "src/cli/skills.test.ts"
              ],
              "test_status": "pnpm typecheck + pnpm test:run src/cli/skills.test.ts + pnpm test:run + pnpm lint (warnings only, 0 errors) + pnpm build passing"
            },
            "installer_preflight_preview_in_install": {
              "status": "completed",
              "description": "Wired dry-run installer preflight preview into skills install flow with optional JSON output for automation clients",
              "files_modified": [
                "src/cli/skills.ts",
                "src/cli/skills.test.ts"
              ],
              "test_status": "pnpm typecheck + pnpm test:run src/cli/skills.test.ts + pnpm test:run + pnpm lint (warnings only, 0 errors) + pnpm build passing"
            },
            "install_preflight_only_mode": {
              "status": "completed",
              "description": "Added --preflight-only mode to skills install for plan-only previews without performing installation, including JSON output path",
              "files_modified": [
                "src/cli/skills.ts",
                "src/cli/skills.test.ts"
              ],
              "test_status": "pnpm typecheck + pnpm test:run src/cli/skills.test.ts + pnpm test:run + pnpm lint (warnings only, 0 errors) + pnpm build passing"
            },
            "installer_execution_stub_command": {
              "status": "completed",
              "description": "Added skills execute command that consumes installer plans and reports stub execution output without running package-manager commands",
              "files_modified": [
                "src/cli/skills.ts",
                "src/cli/skills.test.ts"
              ],
              "test_status": "pnpm typecheck + pnpm test:run src/cli/skills.test.ts + pnpm test:run + pnpm lint (warnings only, 0 errors) + pnpm build passing"
            },
            "shared_install_action_modes": {
              "status": "completed",
              "description": "Centralized install action handling into shared plan-only/stub/install modes and wired install command options through the shared flow while keeping real installer execution disabled",
              "files_modified": [
                "src/cli/skills.ts",
                "src/cli/skills.test.ts"
              ],
              "test_status": "pnpm typecheck + pnpm test:run src/cli/skills.test.ts + pnpm test:run + pnpm lint (warnings only, 0 errors) + pnpm build passing"
            },
            "installer_safety_confirmation_receipts": {
              "status": "completed",
              "description": "Added explicit --confirm semantics and stable no-op execution receipt fields for plan-only/stub/install JSON outputs while keeping installer command execution disabled",
              "files_modified": [
                "src/cli/skills.ts",
                "src/cli/skills.test.ts"
              ],
              "test_status": "pnpm typecheck + pnpm test:run src/cli/skills.test.ts + pnpm test:run + pnpm lint (warnings only, 0 errors) + pnpm build passing"
            },
            "installer_execution_policy_gate_checks": {
              "status": "completed",
              "description": "Added explicit execution policy gate evaluation for install/stub modes and surfaced policy reasons (including confirmation_required) in no-op execution receipts while preserving disabled command execution",
              "files_modified": [
                "src/cli/skills.ts",
                "src/cli/skills.test.ts"
              ],
              "test_status": "pnpm typecheck + pnpm test:run src/cli/skills.test.ts + pnpm test:run + pnpm lint (warnings only, 0 errors) + pnpm build passing"
            },
            "installer_runner_interface_noop": {
              "status": "completed",
              "description": "Added a pluggable installer command runner interface with policy-gated dispatch and a default no-op runner, preserving execution-disabled behavior while preparing a future real runner",
              "files_modified": [
                "src/cli/skills.ts",
                "src/cli/skills.test.ts"
              ],
              "test_status": "pnpm typecheck + pnpm test:run src/cli/skills.test.ts + pnpm test:run + pnpm lint (warnings only, 0 errors) + pnpm build passing"
            },
            "installer_step_execution_envelopes_noop": {
              "status": "completed",
              "description": "Added structured per-step execution envelopes (`attempted` + `results`) to install/plan/stub JSON receipts with policy-derived blocked/skipped statuses while keeping command execution disabled",
              "files_modified": [
                "src/cli/skills.ts",
                "src/cli/skills.test.ts"
              ],
              "test_status": "pnpm typecheck + pnpm test:run src/cli/skills.test.ts + pnpm test:run + pnpm lint (warnings only, 0 errors) + pnpm build passing"
            },
            "installer_runner_terminal_status_mapping": {
              "status": "completed",
              "description": "Extended step result envelopes to support real-runner terminal statuses (`succeeded`/`failed`) and added runner-to-envelope mapping helpers while retaining execution-disabled defaults",
              "files_modified": [
                "src/cli/skills.ts",
                "src/cli/skills.test.ts"
              ],
              "test_status": "pnpm typecheck + pnpm test:run src/cli/skills.test.ts + pnpm test:run + pnpm lint (warnings only, 0 errors) + pnpm build passing"
            },
            "installer_optional_shell_runner": {
              "status": "completed",
              "description": "Added an optional concrete shell-based installer command runner that emits structured succeeded/failed command results with machine-readable reasons, while default flow remains policy-gated and no-op",
              "files_modified": [
                "src/cli/skills.ts",
                "src/cli/skills.test.ts"
              ],
              "test_status": "pnpm typecheck + pnpm test:run src/cli/skills.test.ts + pnpm test:run + pnpm lint (warnings only, 0 errors) + pnpm build passing"
            },
            "installer_cli_runner_opt_in_wiring": {
              "status": "completed",
              "description": "Added explicit install CLI opt-in wiring for execution (`--execute`) and runner selection (`--runner noop|shell`) with strict confirmation gating, preserving execution-disabled defaults unless explicitly requested",
              "files_modified": [
                "src/cli/skills.ts",
                "src/cli/skills.test.ts"
              ],
              "test_status": "pnpm typecheck + pnpm test:run src/cli/skills.test.ts + pnpm test:run + pnpm lint (warnings only, 0 errors) + pnpm build passing"
            },
            "skills_execute_opt_in_runner_wiring": {
              "status": "completed",
              "description": "Extended `skills execute <name>` with explicit execution opt-in and runner selection (`--execute`, `--runner noop|shell`), wired through shared policy/result envelope logic with safe defaults and confirmation gating",
              "files_modified": [
                "src/cli/skills.ts",
                "src/cli/skills.test.ts"
              ],
              "test_status": "pnpm typecheck + pnpm test:run src/cli/skills.test.ts + pnpm test:run + pnpm lint (warnings only, 0 errors) + pnpm build passing"
            },
            "skills_cli_option_parsing_integration_tests": {
              "status": "completed",
              "description": "Added CLI-level integration tests for `skills install`/`skills execute` option parsing and failure modes around `--execute`, `--runner`, and `--confirm`, validating command wiring through commander actions",
              "files_modified": [
                "src/cli/skills.test.ts"
              ],
              "test_status": "pnpm typecheck + pnpm test:run src/cli/skills.test.ts + pnpm test:run + pnpm lint (warnings only, 0 errors) + pnpm build passing"
            },
            "skills_execute_without_confirm_guardrails": {
              "status": "completed",
              "description": "Added explicit user-facing CLI guardrails for invalid execution opt-in (`--execute` without `--confirm`) on both install and execute commands, with deterministic error messaging and exit status coverage",
              "files_modified": [
                "src/cli/skills.ts",
                "src/cli/skills.test.ts"
              ],
              "test_status": "pnpm typecheck + pnpm test:run src/cli/skills.test.ts + pnpm test:run + pnpm lint (warnings only, 0 errors) + pnpm build passing"
            },
            "installer_receipt_edge_case_tests": {
              "status": "completed",
              "description": "Added edge-case coverage for execution receipt mapping: partial/empty runner results, deterministic fallback reasons, and commander-path JSON fallback statuses for install/execute flows",
              "files_modified": [
                "src/cli/skills.test.ts"
              ],
              "test_status": "pnpm typecheck + pnpm test:run src/cli/skills.test.ts + pnpm test:run + pnpm lint (warnings only, 0 errors) + pnpm build passing"
            },
            "installer_execution_global_policy_gate": {
              "status": "completed",
              "description": "Added a global skills execution policy gate (`skills.installation_execution`) with default disabled behavior, wiring install/execute CLI flows to return deterministic `execution_policy_disabled` receipts unless config explicitly enables execution",
              "files_modified": [
                "src/config/schema.ts",
                "src/config/schema.test.ts",
                "src/cli/skills.ts",
                "src/cli/skills.test.ts",
                "config/default.yaml"
              ],
              "test_status": "pnpm typecheck + pnpm test:run src/config/schema.test.ts src/cli/skills.test.ts + pnpm test:run + pnpm lint (warnings only, 0 errors) + pnpm build passing"
            },
            "installer_execution_policy_help_text": {
              "status": "completed",
              "description": "Improved user-facing execution guidance by documenting config gate requirements in CLI option help text and adding explicit render output when policy blocks installer execution",
              "files_modified": [
                "src/cli/skills.ts",
                "src/cli/skills.test.ts"
              ],
              "test_status": "pnpm typecheck + pnpm test:run src/cli/skills.test.ts + pnpm test:run + pnpm lint (warnings only, 0 errors) + pnpm build passing"
            },
            "shell_runner_rollout_controls": {
              "status": "completed",
              "description": "Added explicit config-gated rollout control for shell runner usage (`skills.allow_shell_runner` default false), with deterministic CLI guard errors for install/execute when `--runner shell` is requested without policy enablement",
              "files_modified": [
                "src/config/schema.ts",
                "src/config/schema.test.ts",
                "src/cli/skills.ts",
                "src/cli/skills.test.ts",
                "config/default.yaml"
              ],
              "test_status": "pnpm typecheck + pnpm test:run src/config/schema.test.ts src/cli/skills.test.ts + pnpm test:run + pnpm lint (warnings only, 0 errors) + pnpm build passing"
            },
            "shell_runner_command_allowlist": {
              "status": "completed",
              "description": "Added command-level shell runner allowlisting via `skills.shell_runner_allowlist` patterns, wiring install/execute shell runs to block non-matching commands with deterministic `allowlist_blocked` receipt reasons",
              "files_modified": [
                "src/config/schema.ts",
                "src/config/schema.test.ts",
                "src/cli/skills.ts",
                "src/cli/skills.test.ts",
                "config/default.yaml"
              ],
              "test_status": "pnpm typecheck + pnpm test:run src/config/schema.test.ts src/cli/skills.test.ts + pnpm test:run + pnpm lint (warnings only, 0 errors) + pnpm build passing"
            },
            "shell_runner_audit_telemetry": {
              "status": "completed",
              "description": "Added deterministic shell-runner audit telemetry hooks using existing audit tool events, emitting policy denials and per-command outcomes for install/execute shell flows via `emitShellRunnerAuditEvents(...)`",
              "files_modified": [
                "src/cli/skills.ts",
                "src/cli/skills.test.ts"
              ],
              "test_status": "pnpm typecheck + pnpm test:run src/config/schema.test.ts src/cli/skills.test.ts + pnpm test:run + pnpm lint (warnings only, 0 errors) + pnpm build passing"
            },
            "skills_installer_dedicated_audit_events": {
              "status": "completed",
              "description": "Added dedicated audit event types (`skills.installer.execution_blocked`, `skills.installer.command_result`) and migrated shell-runner telemetry emission from generic tool events to richer skills installer event contracts",
              "files_modified": [
                "src/audit/types.ts",
                "src/audit/logger.ts",
                "src/cli/skills.ts",
                "src/cli/skills.test.ts"
              ],
              "test_status": "pnpm typecheck + pnpm test:run src/cli/skills.test.ts + pnpm test:run + pnpm lint (warnings only, 0 errors) + pnpm build passing"
            },
            "skills_installer_audit_command_redaction_hashing": {
              "status": "completed",
              "description": "Hardened skills installer audit payload safety by hashing command strings and sanitizing potentially sensitive spawn-error reason details before emitting shell-runner command-result telemetry",
              "files_modified": [
                "src/cli/skills.ts",
                "src/cli/skills.test.ts"
              ],
              "test_status": "pnpm typecheck + pnpm test:run src/cli/skills.test.ts + pnpm test:run + pnpm lint + pnpm build passing"
            },
            "shell_runner_rollout_status_and_guardrails": {
              "status": "completed",
              "description": "Added `skills rollout-status` with phased recommendation output (`locked|guarded_observe|guarded_review|expand_candidate`), guardrail checks for execution/audit/allowlist posture, and audit-window telemetry summary including hashed-command coverage",
              "files_modified": [
                "src/cli/skills.ts",
                "src/cli/skills.test.ts"
              ],
              "test_status": "pnpm typecheck + pnpm test:run src/cli/skills.test.ts + pnpm test:run + pnpm lint + pnpm build passing"
            },
            "shell_runner_governance_workflow_operationalization": {
              "status": "completed",
              "description": "Operationalized shell-runner allowlist governance by adding explicit config-backed ownership/review/promotion criteria (`skills.shell_runner_governance`) and wiring `skills rollout-status` to enforce owner presence when shell runner is enabled",
              "files_modified": [
                "src/config/schema.ts",
                "src/config/schema.test.ts",
                "config/default.yaml",
                "src/cli/skills.ts",
                "src/cli/skills.test.ts"
              ],
              "test_status": "pnpm typecheck + pnpm test:run src/config/schema.test.ts src/cli/skills.test.ts + pnpm test:run + pnpm lint (warnings only, 0 errors) + pnpm build passing"
            },
            "shell_runner_rollout_status_export_output": {
              "status": "completed",
              "description": "Extended `skills rollout-status` with `--out <path>` export support so governance and recommendation payloads can be saved as machine-readable JSON artifacts for review workflows",
              "files_modified": [
                "src/cli/skills.ts",
                "src/cli/skills.test.ts"
              ],
              "test_status": "pnpm typecheck + pnpm test:run src/cli/skills.test.ts + pnpm test:run + pnpm lint (warnings only, 0 errors) + pnpm build passing"
            },
            "shell_runner_rollout_trend_snapshot": {
              "status": "completed",
              "description": "Added historical trend snapshots to `skills rollout-status` by comparing current and previous equal-duration windows, including deltas for failures, allowlist blocks, and hashed-command coverage in both console and JSON payloads",
              "files_modified": [
                "src/cli/skills.ts",
                "src/cli/skills.test.ts"
              ],
              "test_status": "pnpm typecheck + pnpm test:run src/cli/skills.test.ts + pnpm test:run + pnpm lint (warnings only, 0 errors) + pnpm build passing"
            },
            "shell_runner_rollout_promotion_policy_checks": {
              "status": "completed",
              "description": "Added promotion-policy evaluation to `skills rollout-status` using governance thresholds (`review_cadence_days`, `promotion_min_success_rate`) and trend deltas, with structured blockers/recommendation in JSON and console output",
              "files_modified": [
                "src/cli/skills.ts",
                "src/cli/skills.test.ts"
              ],
              "test_status": "pnpm typecheck + pnpm test:run src/cli/skills.test.ts + pnpm test:run + pnpm lint (warnings only, 0 errors) + pnpm build passing"
            },
            "shell_runner_promotion_contract_output": {
              "status": "completed",
              "description": "Added dedicated machine-readable promotion contract output for `skills rollout-status` (`--contract`) with stable schema, CI-friendly gate/exit code semantics, and optional `--out` export support",
              "files_modified": [
                "src/cli/skills.ts",
                "src/cli/skills.test.ts"
              ],
              "test_status": "pnpm test:run src/cli/skills.test.ts + pnpm typecheck + pnpm build passing"
            }
          }
        }
      }
    },
    "earlier_plans": {
      "status": "archived",
      "date": "2026-02-05",
      "updated": "2026-02-18",
      "summary": "Historical index of early implementation plan documents. This list is archival metadata and not independently evidence-backed in state.json with per-file completion mappings.",
      "plans": [
        {
          "file": "2026-02-02-flynn-design.md",
          "status": "completed"
        },
        {
          "file": "2026-02-02-flynn-phase1-implementation.md",
          "status": "completed"
        },
        {
          "file": "2026-02-02-flynn-phase2-implementation.md",
          "status": "completed"
        },
        {
          "file": "2026-02-05-flynn-phase3-implementation.md",
          "status": "completed"
        },
        {
          "file": "2026-02-05-tui-redesign.md",
          "status": "completed"
        },
        {
          "file": "2026-02-05-tui-redesign-implementation.md",
          "status": "completed"
        },
        {
          "file": "2026-02-05-llamacpp-integration-design.md",
          "status": "completed"
        },
        {
          "file": "2026-02-05-llamacpp-implementation.md",
          "status": "completed"
        },
        {
          "file": "2026-02-05-backend-switch-design.md",
          "status": "completed"
        },
        {
          "file": "2026-02-05-backend-switch-implementation.md",
          "status": "completed"
        },
        {
          "file": "2026-02-05-openclaw-parity-design.md",
          "status": "completed"
        },
        {
          "file": "2026-02-05-phase1-tool-framework.md",
          "status": "completed"
        },
        {
          "file": "2026-02-05-phase2-websocket-gateway.md",
          "status": "completed"
        },
        {
          "file": "2026-02-05-phase3-channel-adapters.md",
          "status": "completed"
        },
        {
          "file": "2026-02-05-phase5-cli-cron-doctor-design.md",
          "status": "completed"
        },
        {
          "file": "2026-02-05-phase5a-implementation.md",
          "status": "completed"
        }
      ]
    },
    "audit-hardening-xss-body-limits-timeout-leak": {
      "status": "completed",
      "date": "2026-02-16",
      "updated": "2026-02-16",
      "summary": "Addressed high-priority codebase audit findings by hardening gateway chat markdown rendering (sanitization before DOM insertion), adding configurable inbound HTTP body-size limits for gateway/webhooks with 413 responses, centralizing body parsing utility, and fixing ToolExecutor timeout timer cleanup to avoid orphaned timers.",
      "files_created": [
        "src/gateway/ui/lib/markdown.js",
        "src/gateway/ui/lib/markdown.test.ts",
        "src/utils/httpBody.ts",
        "src/utils/httpBody.test.ts"
      ],
      "files_modified": [
        "src/gateway/ui/pages/chat.js",
        "src/gateway/ui/chat.html",
        "src/gateway/server.ts",
        "src/gateway/server.test.ts",
        "src/automation/webhooks.ts",
        "src/automation/webhooks.test.ts",
        "src/config/schema.ts",
        "src/config/schema.test.ts",
        "config/default.yaml",
        "src/daemon/services.ts",
        "src/daemon/channels.ts",
        "src/tools/executor.ts",
        "src/tools/executor.test.ts",
        "README.md",
        "docs/deployment/PRODUCTION.md"
      ],
      "test_status": "targeted: pnpm test:run src/gateway/server.test.ts src/automation/webhooks.test.ts src/tools/executor.test.ts src/config/schema.test.ts src/gateway/ui/lib/markdown.test.ts src/utils/httpBody.test.ts + pnpm typecheck"
    },
    "audit-followup-lint-compaction-nudge": {
      "status": "completed",
      "date": "2026-02-16",
      "updated": "2026-02-16",
      "summary": "Second audit remediation batch: fixed ESLint browser globals mismatch for FileReader, corrected compaction audit event message-count fields, and replaced invalid synthetic tool_result nudge IDs with plain-text nudge guidance in NativeAgent tool loop.",
      "files_modified": [
        "eslint.config.js",
        "src/backends/native/orchestrator.ts",
        "src/backends/native/orchestrator.test.ts",
        "src/backends/native/agent.ts",
        "src/backends/native/agent.test.ts",
        "docs/plans/analysis/2026-02-16-codebase-audit-report.md"
      ],
      "test_status": "pnpm test:run src/backends/native/agent.test.ts src/backends/native/orchestrator.test.ts + pnpm typecheck passing"
    },
    "audit-followup-ws-rate-limiting": {
      "status": "completed",
      "date": "2026-02-16",
      "updated": "2026-02-16",
      "summary": "Implemented gateway WebSocket ingress rate limiting (token bucket per connection) with deterministic throttle errors and close-on-repeated-violation enforcement; added schema/config wiring and tests.",
      "files_modified": [
        "src/gateway/server.ts",
        "src/gateway/server.test.ts",
        "src/config/schema.ts",
        "src/config/schema.test.ts",
        "src/daemon/services.ts",
        "config/default.yaml",
        "README.md",
        "docs/deployment/PRODUCTION.md",
        "docs/plans/analysis/2026-02-16-codebase-audit-report.md"
      ],
      "test_status": "pnpm test:run src/gateway/server.test.ts src/config/schema.test.ts + pnpm typecheck passing"
    },
    "audit-followup-whatsapp-sandbox-default": {
      "status": "completed",
      "date": "2026-02-16",
      "updated": "2026-02-16",
      "summary": "Hardened WhatsApp adapter Chromium launch defaults: sandbox enabled by default, with explicit opt-in no-sandbox mode via whatsapp.no_sandbox. Added adapter and schema regression tests.",
      "files_modified": [
        "src/channels/whatsapp/adapter.ts",
        "src/channels/whatsapp/adapter.test.ts",
        "src/config/schema.ts",
        "src/config/schema.test.ts",
        "src/daemon/channels.ts",
        "README.md",
        "docs/plans/analysis/2026-02-16-codebase-audit-report.md"
      ],
      "test_status": "pnpm test:run src/channels/whatsapp/adapter.test.ts src/config/schema.test.ts + pnpm typecheck passing"
    },
    "audit-followup-modelrouter-listeners": {
      "status": "completed",
      "date": "2026-02-16",
      "updated": "2026-02-16",
      "summary": "Removed ModelRouter tier-change listener setter footgun: setOnTierChange now appends instead of replacing existing listeners, with regression test coverage.",
      "files_modified": [
        "src/models/router.ts",
        "src/models/router.test.ts",
        "docs/plans/analysis/2026-02-16-codebase-audit-report.md"
      ],
      "test_status": "pnpm test:run src/models/router.test.ts + pnpm typecheck passing"
    },
    "audit-followup-config-patch-persistence": {
      "status": "completed",
      "date": "2026-02-16",
      "updated": "2026-02-16",
      "summary": "Implemented durable config.patch persistence when config path is known: patches are applied to a draft, atomically written to disk with .bak backup, then committed to runtime config only on successful persist. Added persisted/persistError response fields and settings UI messaging for runtime-only saves.",
      "files_created": [
        "src/config/persistence.ts",
        "src/config/persistence.test.ts"
      ],
      "files_modified": [
        "src/config/index.ts",
        "src/gateway/handlers/config.ts",
        "src/gateway/handlers/handlers.test.ts",
        "src/gateway/server.ts",
        "src/daemon/services.ts",
        "src/daemon/index.ts",
        "src/cli/start.ts",
        "src/cli/setup.ts",
        "src/gateway/ui/pages/settings.js",
        "docs/plans/analysis/2026-02-16-codebase-audit-report.md"
      ],
      "test_status": "pnpm test:run src/gateway/handlers/handlers.test.ts src/config/persistence.test.ts + pnpm typecheck passing"
    },
    "audit-followup-tool-timeout-cancellation-contract": {
      "status": "completed",
      "date": "2026-02-16",
      "updated": "2026-02-16",
      "summary": "Completed timeout-cancellation hardening: executor AbortSignal propagation reaches process.start, browser tools (navigate/screenshot/click/type/content/eval), and web tools (fetch/search); added pre-abort tests and timeout regression coverage that verifies cancellable tools do not apply side effects after timeout.",
      "files_modified": [
        "src/tools/types.ts",
        "src/tools/executor.ts",
        "src/tools/executor.test.ts",
        "src/tools/builtin/shell.ts",
        "src/tools/builtin/browser/tools.ts",
        "src/tools/builtin/browser/tools.test.ts",
        "src/tools/builtin/web-fetch.ts",
        "src/tools/builtin/web-fetch.test.ts",
        "src/tools/builtin/web-search.ts",
        "src/tools/builtin/web-search.test.ts",
        "src/tools/builtin/process/start.ts",
        "src/tools/builtin/process/manager.test.ts",
        "src/sandbox/docker.ts",
        "src/sandbox/tools.ts",
        "docs/api/TOOLS.md",
        "docs/architecture/CONTRIBUTOR_MAP.md",
        "docs/plans/analysis/2026-02-16-codebase-audit-report.md"
      ],
      "test_status": "pnpm test:run src/tools/executor.test.ts src/tools/builtin/browser/tools.test.ts src/tools/builtin/web-fetch.test.ts src/tools/builtin/web-search.test.ts src/tools/builtin/process/manager.test.ts + pnpm typecheck passing"
    },
    "audit-followup-retry-timeout-defaults": {
      "status": "completed",
      "date": "2026-02-16",
      "updated": "2026-02-16",
      "summary": "Adjusted retry defaults so timeout-style errors are treated as retryable by default, improving resilience for transient provider/network timeouts.",
      "files_modified": [
        "src/models/retry.ts",
        "src/models/retry.test.ts",
        "docs/plans/analysis/2026-02-16-codebase-audit-report.md"
      ],
      "test_status": "pnpm test:run src/models/retry.test.ts + pnpm typecheck passing"
    },
    "audit-followup-slack-username-cache-bounds": {
      "status": "completed",
      "date": "2026-02-16",
      "updated": "2026-02-16",
      "summary": "Added bounded Slack user-name caching with TTL expiry and LRU eviction to prevent unbounded cache growth in long-running deployments.",
      "files_modified": [
        "src/channels/slack/adapter.ts",
        "src/channels/slack/adapter.test.ts",
        "docs/plans/analysis/2026-02-16-codebase-audit-report.md"
      ],
      "test_status": "pnpm test:run src/channels/slack/adapter.test.ts + pnpm typecheck passing"
    },
    "audit-followup-channel-reset-command-dedup": {
      "status": "completed",
      "date": "2026-02-16",
      "updated": "2026-02-16",
      "summary": "Completed broader channel adapter dedup by extracting shared adapter utilities for allowlist gating, mention gating, and pairing access flow. Migrated Discord/Slack/WhatsApp to shared reset normalization + reset message builder + shared gating helpers while preserving channel-specific behavior.",
      "files_modified": [
        "src/channels/utils.ts",
        "src/channels/utils.test.ts",
        "src/channels/discord/adapter.ts",
        "src/channels/slack/adapter.ts",
        "src/channels/whatsapp/adapter.ts",
        "docs/plans/analysis/2026-02-16-codebase-audit-report.md"
      ],
      "test_status": "pnpm test:run src/channels/utils.test.ts src/channels/discord/adapter.test.ts src/channels/slack/adapter.test.ts src/channels/whatsapp/adapter.test.ts + pnpm lint passing (0 errors, warning debt remains)"
    },
    "audit-followup-lint-error-baseline": {
      "status": "completed",
      "date": "2026-02-16",
      "updated": "2026-02-16",
      "summary": "Completed stage-1 lint recovery by clearing all error-level ESLint violations in high-error files (`daemon/models.ts`, `cli/tui.ts`, `daemon/routing.ts`, `gateway/ui/pages/settings.js`) and adjacent return-await/no-useless-return issues so `pnpm lint` now passes with warnings only.",
      "files_modified": [
        "src/daemon/models.ts",
        "src/cli/tui.ts",
        "src/daemon/routing.ts",
        "src/gateway/ui/pages/settings.js",
        "src/backends/native/orchestrator.ts",
        "src/frontends/tui/components/App.tsx",
        "src/gateway/server.test.ts",
        "src/hooks/engine.ts",
        "src/tools/executor.test.ts",
        "docs/plans/analysis/2026-02-16-codebase-audit-report.md"
      ],
      "test_status": "pnpm test:run src/gateway/server.test.ts src/tools/executor.test.ts src/backends/native/orchestrator.test.ts src/daemon/routing.test.ts + pnpm typecheck + pnpm lint passing (0 errors, warnings remain)"
    },
    "audit-followup-lint-warning-reduction-pass-1": {
      "status": "completed",
      "date": "2026-02-16",
      "updated": "2026-02-16",
      "summary": "Continued stage-2 lint warning reduction with hotspot-focused cleanup in `gateway/handlers/handlers.test.ts`, `daemon/routing.test.ts`, `frontends/tui/minimal.test.ts`, `gateway/tailscale.test.ts`, `automation/webhooks.test.ts`, `automation/cron.test.ts`, `automation/heartbeat.test.ts`, `frontends/tui/minimal.login.test.ts`, `daemon/clientFactory.test.ts`, `gateway/handlers/services.test.ts`, `models/local/llamacpp.test.ts`, `models/local/ollama.test.ts`, and `tools/builtin/image-analyze.test.ts`. Replaced broad `any` casts with typed helper casts/unknown-path accessors and removed non-null assertions in high-warning tests. Warning count reduced from 466 to 203 (263 warnings burned down) with lint/test suites still green.",
      "files_modified": [
        "src/tools/builtin/browser/tools.test.ts",
        "src/channels/telegram/adapter.test.ts",
        "src/tools/builtin/system-info.test.ts",
        "src/mcp/manager.test.ts",
        "src/skills/loader.test.ts",
        "src/gateway/handlers/handlers.test.ts",
        "src/daemon/routing.test.ts",
        "src/frontends/tui/minimal.test.ts",
        "src/gateway/tailscale.test.ts",
        "src/automation/webhooks.test.ts",
        "src/automation/cron.test.ts",
        "src/automation/heartbeat.test.ts",
        "src/frontends/tui/minimal.login.test.ts",
        "src/daemon/clientFactory.test.ts",
        "src/gateway/handlers/services.test.ts",
        "src/models/local/llamacpp.test.ts",
        "src/models/local/ollama.test.ts",
        "src/tools/builtin/image-analyze.test.ts",
        "docs/plans/analysis/2026-02-16-codebase-audit-report.md"
      ],
      "test_status": "pnpm test:run src/channels/utils.test.ts src/channels/discord/adapter.test.ts src/channels/slack/adapter.test.ts src/channels/whatsapp/adapter.test.ts src/daemon/routing.test.ts src/gateway/handlers/handlers.test.ts src/frontends/tui/minimal.test.ts src/gateway/tailscale.test.ts src/automation/webhooks.test.ts src/automation/cron.test.ts src/automation/heartbeat.test.ts src/frontends/tui/minimal.login.test.ts src/daemon/clientFactory.test.ts src/gateway/handlers/services.test.ts src/models/local/llamacpp.test.ts src/models/local/ollama.test.ts src/tools/builtin/image-analyze.test.ts + pnpm lint passing (0 errors, 203 warnings)"
    },
    "audit-followup-lint-warning-reduction-pass-2": {
      "status": "completed",
      "date": "2026-02-16",
      "updated": "2026-02-16",
      "summary": "Completed warning burn-down by removing non-null assertions and broad `any` usage, tightening adapter/client typing, and cleaning unused imports/params across orchestrator/model/channel/gateway/TUI/setup/skills/tools files and tests. Warning count reduced from 203 to 0 (203 warnings burned down) with lint fully clean.",
      "files_modified": [
        "src/backends/native/agent.ts",
        "src/backends/native/orchestrator.test.ts",
        "src/channels/discord/adapter.ts",
        "src/channels/whatsapp/adapter.ts",
        "src/cli/doctor.ts",
        "src/cli/setup/providers.test.ts",
        "src/frontends/tui/minimal.ts",
        "src/gateway/server.ts",
        "src/gateway/session-bridge.test.ts",
        "src/memory/hybrid-search.test.ts",
        "src/models/anthropic.ts",
        "src/models/local/ollama.ts",
        "src/models/openai.oauth.test.ts",
        "src/models/openai.ts",
        "src/models/router.test.ts",
        "src/skills/installer.test.ts"
      ],
      "test_status": "pnpm exec eslint on edited files + pnpm lint passing (0 errors, 0 warnings)"
    },
    "audit-followup-typecheck-strict-burndown": {
      "status": "completed",
      "date": "2026-02-16",
      "updated": "2026-02-16",
      "summary": "Closed strict TypeScript fallout after lint cleanup by typing setup wizard config output (`SetupConfig`), tightening optional field handling in setup summary/tests, updating routing/tailscale/tool policy test mocks for strict compatibility, and fixing narrow production strictness in OpenAI/GitHub image URL mapping and file.list glob filtering.",
      "files_modified": [
        "src/cli/setup/channels.test.ts",
        "src/cli/setup/config.test.ts",
        "src/cli/setup/config.ts",
        "src/cli/setup/integration.test.ts",
        "src/cli/setup/sections.test.ts",
        "src/cli/setup/summary.ts",
        "src/daemon/routing.test.ts",
        "src/gateway/handlers/services.test.ts",
        "src/gateway/tailscale.test.ts",
        "src/models/github.ts",
        "src/models/local/llamacpp.test.ts",
        "src/models/local/ollama.test.ts",
        "src/models/openai.baseurl.test.ts",
        "src/models/openai.ts",
        "src/tools/builtin/file-list.ts",
        "src/tools/executor.test.ts",
        "src/tools/registry.test.ts",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm typecheck + pnpm test:run src/cli/setup/channels.test.ts src/cli/setup/config.test.ts src/cli/setup/integration.test.ts src/cli/setup/sections.test.ts src/daemon/routing.test.ts src/gateway/handlers/services.test.ts src/gateway/tailscale.test.ts src/models/local/llamacpp.test.ts src/models/local/ollama.test.ts src/models/openai.baseurl.test.ts src/tools/executor.test.ts src/tools/registry.test.ts passing"
    },
    "proactive-context-usage-and-compaction-signals": {
      "status": "completed",
      "date": "2026-02-16",
      "updated": "2026-02-17",
      "summary": "Implemented proactive context-window management end-to-end: orchestrator now exposes estimated context budget, emits staged context alerts, writes checkpoint summaries to memory near threshold, and can auto-compact proactively. Gateway now emits `context_warning` stream events during `agent.send`, serves `system.contextUsage` snapshots, and dashboard usage UI includes context budget visibility. Added config schema support under `compaction.proactive`, mapped runtime wiring in both WS SessionBridge and channel routing paths, and updated protocol/docs/default config examples with focused tests. Follow-up added `/context` command fast-path visibility, TUI parser/help/autocomplete + handler parity for `/context`, dedicated audit events for proactive checkpoint writes and proactive auto-compaction, configurable `/context` threshold display wired from runtime `compaction.threshold_pct`, and operator/docs references for those events.",
      "files_modified": [
        "src/context/compaction.ts",
        "src/backends/native/prompts.ts",
        "src/backends/native/orchestrator.ts",
        "src/backends/native/orchestrator.test.ts",
        "src/config/schema.ts",
        "src/config/schema.test.ts",
        "src/gateway/session-bridge.ts",
        "src/daemon/routing.ts",
        "src/gateway/protocol.ts",
        "src/gateway/protocol.test.ts",
        "src/gateway/handlers/agent.ts",
        "src/gateway/handlers/agent.test.ts",
        "src/gateway/handlers/system.ts",
        "src/gateway/handlers/handlers.test.ts",
        "src/gateway/server.ts",
        "src/daemon/services.ts",
        "src/gateway/ui/pages/chat.js",
        "src/gateway/ui/pages/usage.js",
        "src/gateway/ui/pages/dashboard.js",
        "src/frontends/tui/commands.ts",
        "src/frontends/tui/commands.test.ts",
        "src/frontends/tui/minimal.ts",
        "src/frontends/tui/minimal.test.ts",
        "src/frontends/tui/components/App.tsx",
        "src/commands/builtin/index.ts",
        "src/commands/types.ts",
        "src/commands/index.ts",
        "src/commands/builtin/index.test.ts",
        "src/audit/types.ts",
        "src/audit/logger.ts",
        "docs/api/PROTOCOL.md",
        "README.md",
        "docs/operations/OPERATOR_PACK.md",
        "docs/performance/TUNING.md",
        "config/default.yaml",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/backends/native/orchestrator.test.ts src/config/schema.test.ts src/gateway/handlers/agent.test.ts src/gateway/handlers/handlers.test.ts src/gateway/protocol.test.ts src/commands/builtin/index.test.ts src/frontends/tui/commands.test.ts src/frontends/tui/minimal.test.ts + pnpm typecheck passing"
    },
    "line-zalo-outbound-attachment-forwarding": {
      "status": "completed",
      "date": "2026-02-17",
      "updated": "2026-02-17",
      "summary": "Updated LINE and Zalo adapters to preserve attachment-only outbound sends, forward URL attachments as chat lines, and emit explicit warnings for binary payloads that still require provider-specific upload implementations.",
      "files_modified": [
        "src/channels/line/adapter.ts",
        "src/channels/line/adapter.test.ts",
        "src/channels/zalo/adapter.ts",
        "src/channels/zalo/adapter.test.ts",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/channels/line/adapter.test.ts src/channels/zalo/adapter.test.ts + pnpm typecheck passing"
    },
    "external-backend-codex-gemini-routing": {
      "status": "completed",
      "date": "2026-02-17",
      "updated": "2026-02-17",
      "summary": "Added external CLI backend support for `codex` and `gemini` (alongside `claude_code`/`opencode`) with configurable command args/timeouts, daemon wiring, per-agent backend selection, `/status` backend visibility, and native fallback when external execution fails.",
      "files_modified": [
        "src/backends/external.ts",
        "src/backends/index.ts",
        "src/config/schema.ts",
        "src/config/schema.test.ts",
        "src/agents/registry.ts",
        "src/agents/registry.test.ts",
        "src/daemon/index.ts",
        "src/daemon/routing.ts",
        "src/daemon/routing.test.ts",
        "config/default.yaml",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/agents/registry.test.ts src/config/schema.test.ts src/daemon/routing.test.ts + pnpm typecheck passing"
    },
    "installer-download-plan-command-remediation": {
      "status": "completed",
      "date": "2026-02-17",
      "updated": "2026-02-17",
      "summary": "Replaced fake download planner output (`download url -> dest`) with executable curl command planning and added explicit skip behavior when destination is missing, including regression coverage.",
      "files_modified": [
        "src/skills/planner.ts",
        "src/skills/planner.test.ts",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/skills/planner.test.ts + pnpm typecheck passing"
    },
    "matrix-signal-mattermost-binary-attachments": {
      "status": "completed",
      "date": "2026-02-17",
      "updated": "2026-02-17",
      "summary": "Implemented binary outbound attachment handling for Matrix (media upload + m.image/m.file send), Signal (temp-file `signal-cli --attachment` flow), and Mattermost (`/api/v4/files` upload + post `file_ids`) with adapter regression tests.",
      "files_modified": [
        "src/channels/matrix/adapter.ts",
        "src/channels/matrix/adapter.test.ts",
        "src/channels/signal/adapter.ts",
        "src/channels/signal/adapter.test.ts",
        "src/channels/mattermost/adapter.ts",
        "src/channels/mattermost/adapter.test.ts",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/channels/matrix/adapter.test.ts src/channels/signal/adapter.test.ts src/channels/mattermost/adapter.test.ts + pnpm typecheck passing"
    },
    "skills-installer-comment-clarification": {
      "status": "completed",
      "date": "2026-02-17",
      "updated": "2026-02-17",
      "summary": "Updated `SkillManifest.installers` type comment to reflect current behavior (installer planning/execution) instead of future-tense wording.",
      "files_modified": [
        "src/skills/types.ts",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm typecheck passing"
    },
    "installer-planner-cli-curl-reconciliation": {
      "status": "completed",
      "date": "2026-02-17",
      "updated": "2026-02-17",
      "summary": "Reconciled installer planning and CLI output/tests to use executable curl-based download commands (`curl -fsSL -o <dest> <url>` and `curl -fsSL <url>` when destination is omitted), replacing legacy placeholder command strings while preserving install/execute flow semantics.",
      "files_modified": [
        "src/skills/planner.ts",
        "src/skills/planner.test.ts",
        "src/cli/skills.test.ts",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/skills/planner.test.ts src/cli/skills.test.ts + pnpm typecheck passing"
    },
    "line-zalo-binary-fallback-notices": {
      "status": "completed",
      "date": "2026-02-17",
      "updated": "2026-02-17",
      "summary": "Improved LINE/Zalo binary attachment handling by emitting recipient-visible fallback messages whenever raw binary upload is unavailable, preventing silent loss while preserving warning logs.",
      "files_modified": [
        "src/channels/line/adapter.ts",
        "src/channels/line/adapter.test.ts",
        "src/channels/zalo/adapter.ts",
        "src/channels/zalo/adapter.test.ts",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/channels/line/adapter.test.ts src/channels/zalo/adapter.test.ts + pnpm typecheck passing"
    },
    "model-for-tier-routing-consumption": {
      "status": "completed",
      "date": "2026-02-17",
      "updated": "2026-02-17",
      "summary": "Implemented runtime consumption of `models.*.for` via `metadata.modelFor` tier selection in channel routing (including audio capability resolution path), and added routing precedence/behavior regression coverage.",
      "files_modified": [
        "src/daemon/routing.ts",
        "src/daemon/routing.test.ts",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/daemon/routing.test.ts + pnpm typecheck passing"
    },
    "auto-escalate-native-retry-path": {
      "status": "completed",
      "date": "2026-02-17",
      "updated": "2026-02-17",
      "summary": "Implemented `agents.auto_escalate` runtime behavior in channel routing: on primary-tier processing failure, Flynn now escalates to `complex` tier once and retries before surfacing an error. Added regression coverage for retry success path.",
      "files_modified": [
        "src/daemon/routing.ts",
        "src/daemon/routing.test.ts",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/daemon/routing.test.ts + pnpm typecheck passing"
    },
    "external-backend-runner-test-coverage": {
      "status": "completed",
      "date": "2026-02-17",
      "updated": "2026-02-17",
      "summary": "Added unit coverage for external CLI backend execution contract (argument inference, `{prompt}` substitution, empty-output failure path, and backend constructor defaults) across codex/claude_code/opencode/gemini adapters.",
      "files_modified": [
        "src/backends/external.test.ts",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/backends/external.test.ts + pnpm typecheck passing"
    },
    "line-zalo-minio-binary-sharing": {
      "status": "completed",
      "date": "2026-02-17",
      "updated": "2026-02-17",
      "summary": "Implemented MinIO-backed binary attachment sharing for LINE and Zalo channels: when `backup.minio` is enabled, binary payloads are uploaded via `mc` and returned as share URLs to recipients; if unavailable, adapters keep explicit in-chat fallback notices.",
      "files_modified": [
        "src/channels/line/adapter.ts",
        "src/channels/line/adapter.test.ts",
        "src/channels/zalo/adapter.ts",
        "src/channels/zalo/adapter.test.ts",
        "src/daemon/channels.ts",
        "README.md",
        "config/default.yaml",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/channels/line/adapter.test.ts src/channels/zalo/adapter.test.ts src/daemon/channels.test.ts + pnpm typecheck passing"
    },
    "line-zalo-minio-failure-fallback-coverage": {
      "status": "completed",
      "date": "2026-02-17",
      "updated": "2026-02-17",
      "summary": "Added regression coverage for LINE/Zalo MinIO upload failure behavior to ensure adapters emit warning logs and still send explicit in-chat binary fallback notices when `mc` share operations fail.",
      "files_modified": [
        "src/channels/line/adapter.test.ts",
        "src/channels/zalo/adapter.test.ts",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/channels/line/adapter.test.ts src/channels/zalo/adapter.test.ts + pnpm typecheck passing"
    },
    "line-zalo-channel-minio-overrides": {
      "status": "completed",
      "date": "2026-02-17",
      "updated": "2026-02-17",
      "summary": "Added channel-specific MinIO override configuration for LINE and Zalo (`line.minio`, `zalo.minio`) with fallback inheritance from `backup.minio`, enabling per-channel endpoint/credential/bucket/prefix control while preserving legacy shared-prefix behavior.",
      "files_modified": [
        "src/config/schema.ts",
        "src/config/schema.test.ts",
        "src/daemon/channels.ts",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/config/schema.test.ts src/daemon/channels.test.ts src/channels/line/adapter.test.ts src/channels/zalo/adapter.test.ts + pnpm typecheck passing"
    },
    "tui-verbose-transfer-and-gemini-url-image-fetch": {
      "status": "completed",
      "date": "2026-02-17",
      "updated": "2026-02-17",
      "summary": "Implemented remaining TUI/media gaps by making `/verbose` functional (tool activity now conditionally rendered), enabling `/transfer` in fullscreen TUI via shared callback wiring, and upgrading Gemini URL-image handling to fetch/encode remote images as inlineData with safe text fallback on fetch failure.",
      "files_modified": [
        "src/frontends/tui/components/App.tsx",
        "src/frontends/tui/fullscreen.ts",
        "src/frontends/tui/minimal.ts",
        "src/frontends/tui/minimal.test.ts",
        "src/cli/tui.ts",
        "src/models/gemini.ts",
        "src/models/gemini.test.ts",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/frontends/tui/minimal.test.ts src/models/gemini.test.ts + pnpm typecheck passing"
    },
    "tui-agent-delegate-registration": {
      "status": "completed",
      "date": "2026-02-17",
      "updated": "2026-02-17",
      "summary": "Wired minimal/fullscreen TUI tool registry to register `agents.list` and `agent.delegate` when `agent_configs` exist. Added a TUI delegation bridge that executes delegated single-turn tasks through `ModelRouter` while preserving per-agent tier/system prompt behavior and keeping existing TUI `NativeAgent` flow unchanged.",
      "files_modified": [
        "src/cli/tui.ts",
        "src/tools/builtin/agent-delegate.ts",
        "src/tools/builtin/agent-delegate.test.ts",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/tools/builtin/agent-delegate.test.ts + pnpm typecheck passing"
    },
    "post-parity-ops-ux-reliability-capability-sessions-surface": {
      "status": "completed",
      "date": "2026-02-18",
      "updated": "2026-02-18",
      "summary": "Delivered a post-parity 3-track slice in one sessions-focused release: operator UX polish (dashboard Sessions page now shows frontend/model/queue/last-activity with frontend filter + inactive toggle), reliability hardening (`sessions.list`/`sessions.history` now validate and bound pagination/filter params), and capability expansion (`sessions.list` now supports persisted inclusion, frontend filtering, total counts, and per-session config snapshot metadata for model/queue/elevation visibility).",
      "files_modified": [
        "src/session/manager.ts",
        "src/session/manager.test.ts",
        "src/gateway/handlers/sessions.ts",
        "src/gateway/handlers/handlers.test.ts",
        "src/gateway/ui/pages/sessions.js",
        "docs/api/PROTOCOL.md",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/session/manager.test.ts src/gateway/handlers/handlers.test.ts + pnpm typecheck passing"
    },
    "sensitive-tool-gating-with-elevation": {
      "status": "completed",
      "date": "2026-02-18",
      "updated": "2026-02-18",
      "summary": "Implemented fail-closed sensitive tool gating for unrestricted deployments by adding `agents.sensitive_mode` and `agents.immutable_denylist`, enforcing immutable deny rules in `ToolExecutor`, requiring `/elevate` before host execution of sensitive tools in deny mode, and preserving explicit per-call confirmation during elevation. Added schema and executor regression coverage and documented operator configuration.",
      "files_modified": [
        "src/config/schema.ts",
        "src/config/schema.test.ts",
        "src/tools/policy.ts",
        "src/tools/executor.ts",
        "src/tools/executor.test.ts",
        "src/daemon/tools.ts",
        "src/daemon/routing.ts",
        "src/gateway/session-bridge.ts",
        "README.md",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/tools/executor.test.ts src/config/schema.test.ts + pnpm typecheck passing"
    },
    "native-agent-model-timeout-hardening": {
      "status": "completed",
      "date": "2026-02-18",
      "updated": "2026-02-18",
      "summary": "Added hard per-request model timeouts in `NativeAgent` (`modelTimeoutMs`, default 120000ms) to fail fast when providers hang, covering both single-turn and tool-loop model calls. Also added empty-final-response normalization to avoid silent blank replies and added regression tests for timeout and empty-response cases.",
      "files_modified": [
        "src/backends/native/agent.ts",
        "src/backends/native/agent.test.ts",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/backends/native/agent.test.ts passing"
    },
    "bidirectional-frontend-transfer-command": {
      "status": "completed",
      "date": "2026-02-18",
      "updated": "2026-02-18",
      "summary": "Promoted `/transfer` to a first-class command-registry command and implemented bidirectional `telegram <-> tui` session transfer semantics across channel and TUI paths. Added Telegram `/transfer` command ingestion (including `/transfer@bot ...` parsing), transfer fast-path handling in daemon routing, improved TUI transfer usage/no-op messaging, and expanded regression coverage.",
      "files_modified": [
        "src/commands/types.ts",
        "src/commands/index.ts",
        "src/commands/builtin/index.ts",
        "src/commands/builtin/index.test.ts",
        "src/daemon/routing.ts",
        "src/daemon/routing.test.ts",
        "src/channels/telegram/adapter.ts",
        "src/channels/telegram/adapter.test.ts",
        "src/frontends/tui/commands.ts",
        "src/frontends/tui/commands.test.ts",
        "src/cli/tui.ts",
        "README.md",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/commands/builtin/index.test.ts src/daemon/routing.test.ts src/channels/telegram/adapter.test.ts src/frontends/tui/commands.test.ts passing + pnpm typecheck passing"
    },
    "plans-checklist-archive-hygiene": {
      "status": "completed",
      "date": "2026-02-18",
      "updated": "2026-02-18",
      "summary": "Marked legacy checklist/phase plan docs with an explicit archival banner clarifying that `docs/plans/state.json` is the canonical status source and unchecked boxes in historical docs are not active backlog unless re-opened.",
      "files_modified": [
        "docs/plans/openai-oauth-checklist.md",
        "docs/plans/2026-02-15-credential-system-v2-api-and-oauth-checklist.md",
        "docs/plans/2026-02-15-skill-safety-scanner-checklist.md",
        "docs/plans/2026-02-15-vercel-ai-gateway-provider-checklist.md",
        "docs/plans/2026-02-13-gmail-push-revisit-implementation-plan.md",
        "docs/plans/phase1-pr3-memory-categories-checklist.md",
        "docs/plans/2026-02-05-flynn-phase3-implementation.md",
        "docs/plans/2026-02-02-flynn-phase1-implementation.md",
        "docs/plans/2026-02-02-flynn-phase2-implementation.md",
        "docs/plans/state.json"
      ],
      "test_status": "Docs-only change (no code paths affected)"
    },
    "openclaw-strategic-analysis-2026-02-18": {
      "status": "completed",
      "date": "2026-02-18",
      "updated": "2026-02-18",
      "summary": "Expanded the OpenClaw strategic analysis into a Phase-2 synthesis document that explicitly complements the canonical weighted comparison, captures eight documented OpenClaw efficiency mechanisms, and adds code-validated Flynn findings (companion protocol readiness, queue interrupt semantics gap, memory cadence gap, auth-profile rotation gap) with a concrete Tier A/B/C roadmap and file-level implementation anchors.",
      "files_modified": [
        "docs/plans/2026-02-18-openclaw-analysis.md",
        "docs/plans/state.json"
      ],
      "test_status": "Docs-only change (no code paths affected)"
    },
    "queue-interrupt-active-cancel": {
      "status": "completed",
      "date": "2026-02-18",
      "updated": "2026-02-18",
      "summary": "Implemented Tier A queue-interrupt semantics hardening in gateway routing: interrupt mode now requests cancellation of active session work when a newer request arrives, while preserving best-effort safe-point cancellation. Added session-level cancellation API, handler integration, regression tests, and docs updates.",
      "files_modified": [
        "src/gateway/session-bridge.ts",
        "src/gateway/session-bridge.test.ts",
        "src/gateway/handlers/agent.ts",
        "src/gateway/handlers/agent.test.ts",
        "README.md",
        "docs/api/PROTOCOL.md",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/gateway/session-bridge.test.ts src/gateway/handlers/agent.test.ts + pnpm typecheck passing"
    },
    "memory-daily-log-and-proactive-extraction": {
      "status": "completed",
      "date": "2026-02-18",
      "updated": "2026-02-18",
      "summary": "Implemented Tier A2 memory cadence improvements: optional per-turn proactive extraction (tool-call threshold + target namespace) and optional append-only daily memory logs. Wired config through routing/session-bridge to orchestrator, added schema/docs updates, and expanded regression coverage.",
      "files_modified": [
        "src/backends/native/orchestrator.ts",
        "src/backends/native/orchestrator.test.ts",
        "src/config/schema.ts",
        "src/config/schema.test.ts",
        "src/daemon/routing.ts",
        "src/gateway/session-bridge.ts",
        "README.md",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/backends/native/orchestrator.test.ts src/config/schema.test.ts src/gateway/session-bridge.test.ts src/gateway/handlers/agent.test.ts + pnpm typecheck passing"
    },
    "automation-announce-delivery-mode": {
      "status": "completed",
      "date": "2026-02-18",
      "updated": "2026-02-18",
      "summary": "Implemented Tier A3 proactive announce delivery mode as a first-class automation option (`automation.delivery_mode: announce`) for cron/webhooks. Added explicit announce-mode sender/metadata wiring, schema/docs/default-config updates, and regression tests.",
      "files_modified": [
        "src/config/schema.ts",
        "src/config/schema.test.ts",
        "src/automation/cron.ts",
        "src/automation/cron.test.ts",
        "src/automation/webhooks.ts",
        "src/automation/webhooks.test.ts",
        "README.md",
        "config/default.yaml",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/automation/cron.test.ts src/automation/webhooks.test.ts src/config/schema.test.ts + pnpm typecheck passing"
    },
    "openclaw-analysis-refinement-2026-02-18": {
      "status": "completed",
      "date": "2026-02-18",
      "updated": "2026-02-18",
      "summary": "Refined the OpenClaw Phase-2 strategy document by condensing the generic mechanism section, adding an explicit reactions/event-trigger automation gap and roadmap item, and introducing a quantified score-adjustment section with assumptions and caveats.",
      "files_modified": [
        "docs/plans/2026-02-18-openclaw-analysis.md",
        "docs/plans/state.json"
      ],
      "test_status": "Docs-only change (no code paths affected)"
    },
    "tts-voice-output-tier-a4": {
      "status": "completed",
      "date": "2026-02-18",
      "updated": "2026-02-18",
      "summary": "Implemented Tier A4 voice output: added configurable OpenAI-compatible TTS (`tts.*`) and integrated channel-gated synthesized reply attachments in daemon routing for both native and external backend responses, with unit/integration tests and docs updates.",
      "files_modified": [
        "src/models/tts.ts",
        "src/models/tts.test.ts",
        "src/models/index.ts",
        "src/config/schema.ts",
        "src/config/index.ts",
        "src/config/schema.test.ts",
        "src/daemon/routing.ts",
        "src/daemon/routing.test.ts",
        "README.md",
        "config/default.yaml",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/models/tts.test.ts src/config/schema.test.ts src/daemon/routing.test.ts + pnpm typecheck passing"
    },
    "reactions-event-trigger-layer-tier-a": {
      "status": "completed",
      "date": "2026-02-18",
      "updated": "2026-02-18",
      "summary": "Implemented a config-driven reactions/event-trigger layer (`automation.reactions`) with channel/text/metadata matching and templated run prompts, integrated into daemon message routing for automation and chat events, with matcher + routing + schema tests and documentation updates.",
      "files_modified": [
        "src/config/schema.ts",
        "src/config/schema.test.ts",
        "src/automation/reactions.ts",
        "src/automation/reactions.test.ts",
        "src/automation/index.ts",
        "src/daemon/routing.ts",
        "src/daemon/routing.test.ts",
        "README.md",
        "config/default.yaml",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/automation/reactions.test.ts src/config/schema.test.ts src/daemon/routing.test.ts + pnpm typecheck passing"
    },
    "model-auth-profile-rotation-tier-a5": {
      "status": "completed",
      "date": "2026-02-18",
      "updated": "2026-02-18",
      "summary": "Implemented Tier A5 auth-profile rotation with optional `api_keys` pools on model tiers/providers. Added rotating sticky-success client behavior (`RotatingModelClient`) and wired multi-key fallback for Anthropic/OpenAI/OpenRouter/xAI/MiniMax/Moonshot client creation, with schema/factory/model tests and docs updates.",
      "files_modified": [
        "src/models/rotating.ts",
        "src/models/rotating.test.ts",
        "src/models/index.ts",
        "src/config/schema.ts",
        "src/config/schema.test.ts",
        "src/daemon/models.ts",
        "src/daemon/clientFactory.test.ts",
        "README.md",
        "config/default.yaml",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/models/rotating.test.ts src/daemon/clientFactory.test.ts src/config/schema.test.ts + pnpm typecheck passing"
    },
    "workflow-approval-gates-tier-b2": {
      "status": "completed",
      "date": "2026-02-18",
      "updated": "2026-02-18",
      "summary": "Implemented cross-channel workflow approval gates with session-scoped pending confirmations and explicit `/approvals`, `/approve`, `/deny` commands. HookEngine now stores request context (session/channel/sender), ToolExecutor propagates context for confirm hooks, and router command fast-path can list/resolve approvals for the active session.",
      "files_modified": [
        "src/hooks/types.ts",
        "src/hooks/engine.ts",
        "src/hooks/engine.test.ts",
        "src/tools/executor.ts",
        "src/commands/types.ts",
        "src/commands/builtin/index.ts",
        "src/commands/builtin/index.test.ts",
        "src/commands/index.ts",
        "src/daemon/routing.ts",
        "src/daemon/routing.test.ts",
        "src/daemon/index.ts",
        "README.md",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/hooks/engine.test.ts src/commands/builtin/index.test.ts src/daemon/routing.test.ts src/tools/executor.test.ts + pnpm typecheck passing"
    },
    "skill-discovery-in-chat-tier-b4": {
      "status": "completed",
      "date": "2026-02-18",
      "updated": "2026-02-18",
      "summary": "Completed Tier B4 in-chat discovery/install surface by adding `/skill` command (`list|search|install`) through command fast-path. Reused existing registry source/catalog infrastructure and managed-skill installer, with local registry-source install support and explicit remote-source fallback guidance to CLI.",
      "files_modified": [
        "src/commands/types.ts",
        "src/commands/builtin/index.ts",
        "src/commands/builtin/index.test.ts",
        "src/commands/index.ts",
        "src/daemon/routing.ts",
        "src/daemon/routing.test.ts",
        "src/daemon/index.ts",
        "README.md",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/commands/builtin/index.test.ts src/daemon/routing.test.ts + pnpm typecheck passing"
    },
    "webchat-pwa-push-subscriptions-tier-b3": {
      "status": "completed",
      "date": "2026-02-18",
      "updated": "2026-02-18",
      "summary": "Implemented Tier B3 WebChat PWA baseline with service worker + manifest, browser push enable/disable controls in WebChat settings, and authenticated gateway subscription endpoints (`/webchat/push/*`) for storing/removing browser push subscriptions with VAPID public-key discovery.",
      "files_modified": [
        "src/config/schema.ts",
        "src/config/schema.test.ts",
        "src/daemon/services.ts",
        "src/gateway/server.ts",
        "src/gateway/server.test.ts",
        "src/gateway/static.ts",
        "src/gateway/ui/index.html",
        "src/gateway/ui/app.js",
        "src/gateway/ui/sw.js",
        "src/gateway/ui/manifest.webmanifest",
        "src/gateway/ui/flynn-icon.svg",
        "src/gateway/ui/lib/pwa.js",
        "src/gateway/ui/pages/settings.js",
        "config/default.yaml",
        "README.md",
        "docs/api/PROTOCOL.md",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/gateway/server.test.ts src/config/schema.test.ts + pnpm typecheck passing"
    },
    "guided-onboarding-channel-verification-tier-b1": {
      "status": "completed",
      "date": "2026-02-18",
      "updated": "2026-02-18",
      "summary": "Improved Tier B1 onboarding speed by adding a post-save quick-start verification checklist to `flynn setup`/`flynn onboard`, including start command, WebChat URL, `/status` smoke test, and channel-specific validation hints for configured messaging adapters.",
      "files_modified": [
        "src/cli/setup.ts",
        "src/cli/setup/summary.ts",
        "src/cli/setup/summary.test.ts",
        "README.md",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/cli/setup/summary.test.ts src/cli/setup/channels.test.ts src/cli/setup/integration.test.ts + pnpm typecheck passing"
    },
    "streaming-chunking-quality-tier-b5": {
      "status": "completed",
      "date": "2026-02-18",
      "updated": "2026-02-18",
      "summary": "Implemented Tier B5 chunking-quality improvements by upgrading shared channel message splitting to prefer natural boundaries (paragraph/newline/sentence/space), while preserving markdown code-fence integrity across multi-part chunks. Added regression coverage for sentence-boundary preference and code-fence balancing.",
      "files_modified": [
        "src/channels/utils.ts",
        "src/channels/utils.test.ts",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/channels/utils.test.ts src/channels/telegram/adapter.test.ts src/channels/discord/adapter.test.ts src/channels/slack/adapter.test.ts src/channels/whatsapp/adapter.test.ts + pnpm typecheck passing"
    },
    "minimal-companion-client-tier-b2": {
      "status": "completed",
      "date": "2026-02-18",
      "updated": "2026-02-18",
      "summary": "Implemented Tier B2 minimal companion client via new `flynn companion` CLI command. The command connects to gateway node RPC, registers a companion node, publishes heartbeats, streams agent typing/content events, supports config-derived URL/token defaults, and includes one-shot mode for smoke testing.",
      "files_modified": [
        "src/cli/companion.ts",
        "src/cli/companion.test.ts",
        "src/cli/index.ts",
        "src/cli/index.test.ts",
        "README.md",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/cli/companion.test.ts src/cli/index.test.ts + pnpm typecheck passing"
    },
    "full-access-hooks-guard-defaults": {
      "status": "completed",
      "date": "2026-02-18",
      "updated": "2026-02-18",
      "summary": "Aligned default behavior to full-access-with-hooks: setup now defaults to `tools.profile: full`, sensitive host operations default to `agents.sensitive_mode: confirm_without_elevation`, and default hook confirmations were expanded to cover high-impact actions (shell/process/browser/message send/cron mutations/file writes). This removes mandatory `/elevate` for standard operation while keeping explicit confirmation gates.",
      "files_modified": [
        "src/config/schema.ts",
        "src/config/schema.test.ts",
        "src/cli/setup/config.ts",
        "src/cli/setup/config.test.ts",
        "src/cli/setup/security.ts",
        "src/cli/setup/sections.test.ts",
        "config/default.yaml",
        "README.md",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/config/schema.test.ts src/cli/setup/config.test.ts src/cli/setup/sections.test.ts + pnpm typecheck passing"
    },
    "model-retry-cancel-abort-immediacy": {
      "status": "completed",
      "date": "2026-02-18",
      "updated": "2026-02-18",
      "summary": "Fixed cancellation responsiveness for model retries: `/cancel` now aborts model-router retry backoff loops immediately via abort-aware retry execution and router abort signaling, preventing long waits through remaining retries/fallback steps.",
      "files_modified": [
        "src/models/retry.ts",
        "src/models/retry.test.ts",
        "src/models/router.ts",
        "src/models/router.test.ts",
        "src/backends/native/agent.ts",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/models/retry.test.ts src/models/router.test.ts src/backends/native/agent.test.ts + pnpm typecheck passing"
    },
    "graceful-shutdown-awaits-session-end-memory": {
      "status": "completed",
      "date": "2026-02-18",
      "updated": "2026-02-18",
      "summary": "Improved Ctrl+C/SIGTERM shutdown reliability: daemon now performs bounded graceful signal shutdown with force-exit fallback, gateway now awaits async session disconnect so session-end summaries/memory writes finish before process exit, and TUI signal cleanup now awaits lifecycle shutdown before closing storage.",
      "files_modified": [
        "src/daemon/services.ts",
        "src/gateway/session-bridge.ts",
        "src/gateway/server.ts",
        "src/gateway/session-bridge.test.ts",
        "src/cli/tui.ts",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/gateway/session-bridge.test.ts src/gateway/server.test.ts src/models/router.test.ts src/models/retry.test.ts + pnpm typecheck passing"
    },
    "tui-double-ctrlc-exit-single-ctrlc-clear": {
      "status": "completed",
      "date": "2026-02-18",
      "updated": "2026-02-18",
      "summary": "Adjusted TUI keyboard behavior to keep /quit while making Ctrl+C safer: in minimal mode first Ctrl+C clears input and second quick Ctrl+C exits; fullscreen mode mirrors double-press Ctrl+C exit semantics while preserving Esc cancellation. Updated docs and regression tests.",
      "files_modified": [
        "src/frontends/tui/minimal.ts",
        "src/frontends/tui/minimal.test.ts",
        "src/frontends/tui/components/App.tsx",
        "src/cli/tui.ts",
        "README.md",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/frontends/tui/minimal.test.ts src/frontends/tui/commands.test.ts + pnpm typecheck passing"
    },
    "webchat-settings-personal-assistant-mode-controls": {
      "status": "completed",
      "date": "2026-02-18",
      "updated": "2026-02-18",
      "summary": "Productized the dashboard/settings surface with a new Personal Assistant Mode control block and runtime-safe patching for assistant-feel toggles (announce delivery, daily briefing, memory daily/proactive extraction cadence, and TTS channel gating). Extended config.patch allowlist and handler tests accordingly.",
      "files_modified": [
        "src/gateway/ui/pages/settings.js",
        "src/gateway/ui/style.css",
        "src/gateway/handlers/config.ts",
        "src/gateway/handlers/handlers.test.ts",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/gateway/handlers/handlers.test.ts + pnpm typecheck passing"
    },
    "dashboard-assistant-health-quick-actions": {
      "status": "completed",
      "date": "2026-02-18",
      "updated": "2026-02-18",
      "summary": "Extended Live Ops Dashboard with an Assistant Health section that surfaces product-feel runtime state (announce mode, daily briefing, memory cadence, TTS) and adds one-click quick actions that apply safe runtime config.patch updates and refresh status immediately.",
      "files_modified": [
        "src/gateway/ui/pages/dashboard.js",
        "src/gateway/ui/style.css",
        "README.md",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm typecheck passing"
    },
    "dashboard-morning-brief-preview-test-send": {
      "status": "completed",
      "date": "2026-02-18",
      "updated": "2026-02-18",
      "summary": "Extended Dashboard Assistant Health with a Morning Brief Preview panel (prompt/schedule/tier/output metadata) and a one-click Test Briefing action that triggers the configured daily briefing via cron.trigger through gateway tools.invoke, including inline save/trigger status feedback.",
      "files_modified": [
        "src/gateway/ui/pages/dashboard.js",
        "src/gateway/ui/style.css",
        "README.md",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm typecheck passing"
    },
    "dashboard-assistant-playbooks-with-rollback": {
      "status": "completed",
      "date": "2026-02-18",
      "updated": "2026-02-18",
      "summary": "Added one-click Assistant Playbooks to Live Ops Dashboard (Executive, Operator, Focus) with safe runtime config.patch bundles and an Undo Last Playbook rollback action. Playbooks tune delivery mode, briefing/memory cadence, TTS, and queue mode for distinct assistant behaviors.",
      "files_modified": [
        "src/gateway/ui/pages/dashboard.js",
        "src/gateway/ui/style.css",
        "README.md",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm typecheck passing"
    },
    "assistant-activation-checklist-and-setup-defaults": {
      "status": "completed",
      "date": "2026-02-18",
      "updated": "2026-02-18",
      "summary": "Completed assistant productization pass: Dashboard now includes a 3-step activation checklist with briefing output save controls, playbook/test-send integration, and persisted assistant status cues; runtime config.patch now supports daily briefing output/schedule/prompt/tier updates; setup/operator-pack defaults now enable announce delivery plus memory daily/proactive extraction cadence for assistant-first behavior out of the box.",
      "files_modified": [
        "src/gateway/ui/pages/dashboard.js",
        "src/gateway/ui/style.css",
        "src/gateway/ui/pages/settings.js",
        "src/gateway/handlers/config.ts",
        "src/gateway/handlers/handlers.test.ts",
        "src/cli/setup/config.ts",
        "src/cli/setup/config.test.ts",
        "src/cli/setup/automation.test.ts",
        "README.md",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/gateway/handlers/handlers.test.ts src/cli/setup/config.test.ts src/cli/setup/automation.test.ts + pnpm typecheck passing"
    },
    "telegram-reliability-hardening-diagnostics": {
      "status": "completed",
      "date": "2026-02-18",
      "updated": "2026-02-18",
      "summary": "Hardened Telegram channel reliability: default group behavior now responds without mention gating, adapter now records error metadata, retries transient Telegram API failures, and schedules reconnect attempts after polling/runtime faults. Surfaced adapter error diagnostics through gateway services/channels, dashboard service cards, and doctor Telegram status detail.",
      "files_modified": [
        "src/channels/telegram/adapter.ts",
        "src/channels/telegram/adapter.test.ts",
        "src/channels/types.ts",
        "src/config/schema.ts",
        "src/config/schema.test.ts",
        "src/gateway/server.ts",
        "src/gateway/handlers/system.ts",
        "src/gateway/handlers/services.ts",
        "src/gateway/handlers/services.test.ts",
        "src/gateway/ui/pages/dashboard.js",
        "src/cli/doctor.ts",
        "config/default.yaml",
        "README.md",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/channels/telegram/adapter.test.ts src/config/schema.test.ts src/gateway/handlers/services.test.ts src/cli/doctor.test.ts + pnpm typecheck passing"
    },
    "webchat-slash-command-agent-fastpath-fix": {
      "status": "completed",
      "date": "2026-02-19",
      "updated": "2026-02-19",
      "summary": "Fixed WebChat slash command reliability by routing /reset, /compact, /usage, /status, and /model through agent.send command metadata fast-path instead of mixed local RPC shortcuts. This resolves /model returning unknown and keeps command behavior aligned with backend command registry.",
      "files_modified": [
        "src/gateway/ui/pages/chat.js",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm typecheck + pnpm test:run src/commands/registry.test.ts src/commands/builtin/index.test.ts passing"
    },
    "webchat-gateway-model-switch-support": {
      "status": "completed",
      "date": "2026-02-19",
      "updated": "2026-02-19",
      "summary": "Extended gateway command fast-path to support full /model syntax in WebChat sessions: /model <tier>, /model <tier> <provider/model>, and /model <tier> reset. Gateway now wires ModelRouter/runtime config into agent handlers so provider/model switching and strict-mode toggles match channel behavior.",
      "files_modified": [
        "src/gateway/handlers/agent.ts",
        "src/gateway/server.ts",
        "src/gateway/handlers/agent.test.ts",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/gateway/handlers/agent.test.ts src/gateway/server.test.ts + pnpm typecheck passing"
    },
    "webchat-human-readable-message-timestamps": {
      "status": "completed",
      "date": "2026-02-19",
      "updated": "2026-02-19",
      "summary": "Added per-message human-readable timestamps in WebChat for live messages and loaded history, with same-day time formatting and date+time for older messages. Updated message actions to target message bodies via stable selectors so copy/edit remain correct with timestamp rows.",
      "files_modified": [
        "src/gateway/ui/pages/chat.js",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm typecheck passing"
    },
    "tui-noninteractive-confirmation-mode": {
      "status": "completed",
      "date": "2026-02-19",
      "updated": "2026-02-19",
      "summary": "Changed minimal TUI confirmation behavior to non-interactive auto-approval for hook confirmations, removing inline confirmation prompts that blocked local flows while keeping hook and audit paths active.",
      "files_modified": [
        "src/frontends/tui/minimal.ts",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm typecheck passing"
    },
    "guarded-confirmation-parity-webchat-tui": {
      "status": "completed",
      "date": "2026-02-19",
      "updated": "2026-02-19",
      "summary": "Implemented guarded-action confirmation parity across WebChat and TUI: gateway command services now expose approval operations (`/approvals`, `/approve`, `/deny`) for WebChat sessions, WebChat UI surfaces these slash commands, and fullscreen TUI now uses non-interactive auto-approval (matching minimal mode) so local runs do not stall on confirmation prompts.",
      "files_modified": [
        "src/gateway/handlers/agent.ts",
        "src/gateway/handlers/agent.test.ts",
        "src/gateway/server.ts",
        "src/gateway/ui/pages/chat.js",
        "src/daemon/services.ts",
        "src/daemon/index.ts",
        "src/frontends/tui/components/App.tsx",
        "src/frontends/tui/commands.ts",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/gateway/handlers/agent.test.ts + pnpm typecheck passing"
    },
    "system-info-disk-usage-reporting": {
      "status": "completed",
      "date": "2026-02-19",
      "updated": "2026-02-19",
      "summary": "Extended `system.info` tool output to include disk usage metrics (path, total/free/used, and used percentage) so machine health summaries include storage headroom in addition to memory.",
      "files_modified": [
        "src/tools/builtin/system-info.ts",
        "src/tools/builtin/system-info.test.ts",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/tools/builtin/system-info.test.ts + pnpm typecheck passing"
    },
    "system-info-human-readable-formatting": {
      "status": "completed",
      "date": "2026-02-19",
      "updated": "2026-02-19",
      "summary": "Refined `system.info` output into a human-readable structured snapshot with Host/Resources/Time/Process sections, clearer labels, memory+disk usage percentages, and a compact health summary.",
      "files_modified": [
        "src/tools/builtin/system-info.ts",
        "src/tools/builtin/system-info.test.ts",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/tools/builtin/system-info.test.ts + pnpm typecheck passing"
    },
    "webchat-session-header-sorting": {
      "status": "completed",
      "date": "2026-02-19",
      "updated": "2026-02-19",
      "summary": "Added session sorting controls in WebChat header with modes for Recent activity, Most messages, and Name. Session titles in the selector were upgraded to include message count and last-active timestamp for faster scanning.",
      "files_modified": [
        "src/gateway/ui/pages/chat.js",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm typecheck passing"
    },
    "dashboard-assistant-health-save-reliability": {
      "status": "completed",
      "date": "2026-02-19",
      "updated": "2026-02-19",
      "summary": "Hardened dashboard slow-refresh behavior so Assistant Health config state still updates when non-config slow endpoints fail. `fetchSlow` now uses per-call settlement and partial updates, preventing toggle saves from appearing unsaved due to unrelated fetch failures.",
      "files_modified": [
        "src/gateway/ui/pages/dashboard.js",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm typecheck passing"
    },
    "dashboard-assistant-health-persistence-indicator": {
      "status": "completed",
      "date": "2026-02-19",
      "updated": "2026-02-19",
      "summary": "Added a persistent Assistant Health save-state indicator that survives rerenders and explicitly reports whether updates were saved runtime-only or persisted to config file, with timestamped status messages.",
      "files_modified": [
        "src/gateway/ui/pages/dashboard.js",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm typecheck passing"
    },
    "overlay-aware-runtime-config-persistence": {
      "status": "completed",
      "date": "2026-02-19",
      "updated": "2026-02-19",
      "summary": "Made runtime config persistence overlay-aware: when `FLYNN_ENV` overlay file is active, daemon/gateway config.patch now persists to the effective overlay config path instead of always writing base config.yaml.",
      "files_modified": [
        "src/cli/shared.ts",
        "src/cli/start.ts",
        "src/cli/setup.ts",
        "src/daemon/index.ts",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm typecheck passing"
    },
    "dashboard-assistant-health-readback-verification": {
      "status": "completed",
      "date": "2026-02-19",
      "updated": "2026-02-19",
      "summary": "Added read-after-write verification to Assistant Health saves. After `config.patch`, dashboard now performs `config.get` and confirms each patched key/value actually stuck; mismatches are surfaced as explicit errors instead of false green success.",
      "files_modified": [
        "src/gateway/ui/pages/dashboard.js",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm typecheck passing"
    },
    "dashboard-global-tier-provider-model-catalog": {
      "status": "completed",
      "date": "2026-02-19",
      "updated": "2026-02-19",
      "summary": "Extended Assistant Health dashboard model defaults with global per-tier provider/model selectors (default/fast/complex/local), added gateway system.modelCatalog to populate provider model options from official provider APIs with config fallback/caching, and wired runtime config.patch support for models.<tier>.provider/model with live model-router refresh.",
      "files_modified": [
        "src/gateway/modelCatalog.ts",
        "src/gateway/handlers/system.ts",
        "src/gateway/server.ts",
        "src/gateway/handlers/config.ts",
        "src/gateway/ui/pages/dashboard.js",
        "src/gateway/handlers/handlers.test.ts",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/gateway/handlers/handlers.test.ts + pnpm typecheck passing"
    },
    "dashboard-model-defaults-draft-preservation": {
      "status": "completed",
      "date": "2026-02-19",
      "updated": "2026-02-19",
      "summary": "Fixed Model Tier Defaults dropdown reset during periodic dashboard refresh by preserving unsaved form draft state (tiers, delegation, and background override settings) across Assistant Health rerenders until saved.",
      "files_modified": [
        "src/gateway/ui/pages/dashboard.js",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm typecheck passing"
    },
    "default-config-heartbeat-enabled": {
      "status": "completed",
      "date": "2026-02-19",
      "updated": "2026-02-19",
      "summary": "Enabled automation heartbeat monitoring in default config with standard 5-minute cadence and full check set (gateway/model/channels/memory/disk/process memory/backup/provider errors).",
      "files_modified": [
        "config/default.yaml",
        "docs/plans/state.json"
      ],
      "test_status": "configuration-only change"
    },
    "dashboard-service-card-config-modal": {
      "status": "completed",
      "date": "2026-02-19",
      "updated": "2026-02-19",
      "summary": "Made Services cards clickable in Live Ops Dashboard and added an inline configuration modal with quick controls for service enablement and heartbeat settings, plus advanced JSON patch support for per-service config updates via config.patch.",
      "files_modified": [
        "src/gateway/ui/pages/dashboard.js",
        "src/gateway/handlers/config.ts",
        "src/gateway/handlers/handlers.test.ts",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/gateway/handlers/handlers.test.ts + pnpm typecheck passing"
    },
    "minimal-tui-busy-status-indicator": {
      "status": "completed",
      "date": "2026-02-19",
      "updated": "2026-02-19",
      "summary": "Added an explicit busy status indicator in minimal TUI while Flynn is processing requests, including a spinner and cancel hint, with safe teardown before streamed output/tool logs so the terminal no longer appears frozen between prompt submit and response.",
      "files_modified": [
        "src/frontends/tui/minimal.ts",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/frontends/tui/minimal.test.ts passing"
    },
    "elevation-hardening-unification": {
      "status": "completed",
      "date": "2026-02-19",
      "updated": "2026-02-19",
      "summary": "Unified elevated mode behavior into a shared `src/security/elevation.ts` module and refactored daemon, gateway, native agent, and TUI surfaces to use it. This removes duplicated TTL/expiry parsing and keeps `/elevate` semantics/auditing consistent across execution paths.",
      "files_modified": [
        "src/security/elevation.ts",
        "src/security/elevation.test.ts",
        "src/daemon/routing.ts",
        "src/gateway/handlers/agent.ts",
        "src/backends/native/agent.ts",
        "src/frontends/tui/minimal.ts",
        "src/frontends/tui/components/App.tsx",
        "docs/security/SAFE_PERSONAL_AGENT.md",
        "docs/plans/2026-02-15-openclaw-gap-roadmap.md",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/security/elevation.test.ts src/gateway/handlers/agent.test.ts src/frontends/tui/minimal.test.ts src/backends/native/agent.test.ts src/daemon/routing.test.ts src/commands/builtin/index.test.ts + pnpm typecheck passing"
    },
    "auth-profile-cooldown-for-key-pools": {
      "status": "completed",
      "date": "2026-02-19",
      "updated": "2026-02-19",
      "summary": "Added per-tier/profile cooldown support for rotated API-key auth pools via `auth_profile_cooldown_ms`. `RotatingModelClient` now applies temporary backoff to failing profiles while preserving sticky-success behavior, and model client factory wiring now passes cooldown for providers using `api_keys` pools.",
      "files_modified": [
        "src/models/rotating.ts",
        "src/models/rotating.test.ts",
        "src/daemon/models.ts",
        "src/daemon/clientFactory.test.ts",
        "src/config/schema.ts",
        "src/config/schema.test.ts",
        "README.md",
        "docs/plans/2026-02-15-openclaw-gap-roadmap.md",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/models/rotating.test.ts src/daemon/clientFactory.test.ts src/config/schema.test.ts + pnpm typecheck passing"
    },
    "queue-interrupt-preemption-telemetry": {
      "status": "completed",
      "date": "2026-02-19",
      "updated": "2026-02-19",
      "summary": "Hardened interrupt queue mode visibility by emitting `queue.preempt` audit events when a newer request preempts an active run, and by sending a requester-facing content notice indicating that the previous in-flight run was cancelled before processing the latest message.",
      "files_modified": [
        "src/audit/types.ts",
        "src/audit/logger.ts",
        "src/gateway/handlers/agent.ts",
        "src/gateway/handlers/agent.test.ts",
        "README.md",
        "docs/api/PROTOCOL.md",
        "docs/plans/2026-02-15-openclaw-gap-roadmap.md",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/gateway/handlers/agent.test.ts src/models/rotating.test.ts src/daemon/clientFactory.test.ts src/config/schema.test.ts + pnpm typecheck passing"
    },
    "daily-memory-log-continuity-controls": {
      "status": "completed",
      "date": "2026-02-19",
      "updated": "2026-02-19",
      "summary": "Extended `memory.daily_log` with continuity-oriented controls: optional session metadata headers plus configurable per-turn truncation caps for user/assistant text. Wired these settings through daemon and gateway orchestrator construction paths and added regression coverage for metadata/tailoring behavior.",
      "files_modified": [
        "src/config/schema.ts",
        "src/config/schema.test.ts",
        "src/backends/native/orchestrator.ts",
        "src/backends/native/orchestrator.test.ts",
        "src/daemon/routing.ts",
        "src/gateway/session-bridge.ts",
        "README.md",
        "docs/plans/2026-02-15-openclaw-gap-roadmap.md",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/backends/native/orchestrator.test.ts src/config/schema.test.ts + pnpm typecheck passing"
    },
    "soul-clarify-ambiguity-directive": {
      "status": "completed",
      "date": "2026-02-19",
      "updated": "2026-02-19",
      "summary": "Updated SOUL.md core principles to add an explicit directive to clarify ambiguous or unfamiliar questions before acting, to reduce confident-but-wrong execution paths.",
      "files_modified": [
        "SOUL.md",
        "docs/plans/state.json"
      ],
      "test_status": "docs-only change"
    },
    "minio-mc-path-and-enoent-hardening": {
      "status": "completed",
      "date": "2026-02-19",
      "updated": "2026-02-19",
      "summary": "Added backup-level MinIO CLI path override (`backup.minio.mc_path`) and wired it through MinIO backup upload + `minio.share`/`minio.ingest`/`minio.sync`. Added consistent ENOENT guidance so missing `mc` now returns actionable setup errors instead of raw spawn failures.",
      "files_modified": [
        "src/config/schema.ts",
        "src/config/schema.test.ts",
        "src/backup/run.ts",
        "src/backup/run.test.ts",
        "src/tools/builtin/minio-share.ts",
        "src/tools/builtin/minio-share.test.ts",
        "src/tools/builtin/minio-ingest.ts",
        "src/tools/builtin/minio-ingest.test.ts",
        "src/tools/builtin/minio-sync.ts",
        "src/tools/builtin/minio-sync.test.ts",
        "README.md",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/config/schema.test.ts src/tools/builtin/minio-sync.test.ts src/tools/builtin/minio-ingest.test.ts src/tools/builtin/minio-share.test.ts src/backup/run.test.ts + pnpm typecheck passing"
    },
    "minio-sync-keep-marker-and-race-hardening": {
      "status": "completed",
      "date": "2026-02-19",
      "updated": "2026-02-19",
      "summary": "Hardened `minio.sync` against noisy object listings and race conditions by skipping `.keep` marker objects and treating missing-object read errors (objects deleted after listing) as per-object skips instead of failing the entire sync task.",
      "files_modified": [
        "src/tools/builtin/minio-sync.ts",
        "src/tools/builtin/minio-sync.test.ts",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/tools/builtin/minio-sync.test.ts + pnpm typecheck passing"
    },
    "councils-dual-group-orchestrator": {
      "status": "completed",
      "date": "2026-02-21",
      "updated": "2026-02-21",
      "summary": "Implemented deterministic dual-council orchestration (D/P) with strict JSON artifacts, bridge-only exchange, deterministic ID allocation and canonical hashing, code-side brief diffs, bridge cap enforcement, and deterministic meta merge constraints. Added council.run tool + /council command wiring, config schema/defaults, docs, and focused test coverage (including leakage and bridge fail-closed paths).",
      "files_modified": [
        "src/councils/canonical.ts",
        "src/councils/types.ts",
        "src/councils/orchestrator.ts",
        "src/councils/index.ts",
        "src/tools/builtin/council-run.ts",
        "src/tools/builtin/council-run.test.ts",
        "src/tools/builtin/index.ts",
        "src/tools/index.ts",
        "src/tools/policy.ts",
        "src/commands/types.ts",
        "src/commands/builtin/index.ts",
        "src/commands/builtin/index.test.ts",
        "src/config/schema.ts",
        "src/config/schema.test.ts",
        "src/config/index.ts",
        "src/daemon/routing.ts",
        "config/default.yaml",
        "README.md",
        "docs/api/COUNCILS.md",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/councils/orchestrator.test.ts src/tools/builtin/council-run.test.ts src/commands/builtin/index.test.ts src/config/schema.test.ts src/daemon/routing.test.ts src/tools/policy.test.ts + pnpm typecheck passing"
    },
    "audit-followup-audio-transcribe-arg-hardening": {
      "status": "completed",
      "date": "2026-02-23",
      "updated": "2026-02-23",
      "summary": "Hardened audio.transcribe argument hydration for Telegram voice flows by prioritizing trusted latest-turn/persisted audio bytes, validating model-supplied audio signatures, broadening transcription response parsing, and adding audit observability via tool.args_rewritten.",
      "files_modified": [
        "src/backends/native/agent.ts",
        "src/backends/native/agent.test.ts",
        "src/daemon/routing.ts",
        "src/daemon/routing.test.ts",
        "src/tools/builtin/audio-transcribe.ts",
        "src/tools/builtin/audio-transcribe.test.ts",
        "src/tools/executor.ts",
        "src/tools/executor.test.ts",
        "src/audit/types.ts",
        "src/audit/logger.ts",
        "README.md",
        "docs/runbooks/VOICE_TRANSCRIPTION_DEBUG.md"
      ],
      "test_status": "pnpm test:run src/backends/native/agent.test.ts src/daemon/routing.test.ts src/tools/builtin/audio-transcribe.test.ts src/tools/executor.test.ts; pnpm typecheck; pnpm build"
    },
    "audit-followup-audio-cache-clear-procedure": {
      "status": "completed",
      "date": "2026-02-23",
      "updated": "2026-02-23",
      "summary": "Documented deterministic per-session cached audio cleanup procedure so Flynn can clear one session cached lastAudioAttachment safely on request.",
      "files_modified": [
        "TOOLS.md",
        "README.md",
        "docs/runbooks/VOICE_TRANSCRIPTION_DEBUG.md"
      ],
      "test_status": "docs-only update; no runtime code changes"
    },
    "audit-followup-sqlite-quick-reference-runbook": {
      "status": "completed",
      "date": "2026-02-23",
      "updated": "2026-02-23",
      "summary": "Added a SQLite quick-reference runbook with high-utility operational queries for session history, session_config, tool execution diagnostics, pairing approvals, and safe backup/cleanup workflows.",
      "files_modified": [
        "docs/runbooks/SQLITE_QUICK_REFERENCE.md",
        "docs/runbooks/VOICE_TRANSCRIPTION_DEBUG.md",
        "README.md"
      ],
      "test_status": "docs-only update; no runtime code changes"
    },
    "audio-transcription-fetch-retry-hardening": {
      "status": "completed",
      "date": "2026-02-23",
      "updated": "2026-02-23",
      "summary": "Added retry+timeout hardening for transient `fetch failed` errors in both pre-transcription (`models/media`) and `audio.transcribe`, with focused regression tests and runbook updates for timestamp correlation and endpoint diagnostics.",
      "files_modified": [
        "src/models/media.ts",
        "src/models/media.test.ts",
        "src/tools/builtin/audio-transcribe.ts",
        "src/tools/builtin/audio-transcribe.test.ts",
        "docs/runbooks/VOICE_TRANSCRIPTION_DEBUG.md",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/tools/builtin/audio-transcribe.test.ts src/models/media.test.ts"
    },
    "audio-transcription-localhost-ipv4-fallback": {
      "status": "completed",
      "date": "2026-02-23",
      "updated": "2026-02-23",
      "summary": "Added automatic fallback from `localhost` to `127.0.0.1` for transient transcription fetch failures and clarified connectivity-oriented error text so assistants do not misdiagnose endpoint outages as missing audio payloads.",
      "files_modified": [
        "src/models/media.ts",
        "src/models/media.test.ts",
        "src/tools/builtin/audio-transcribe.ts",
        "src/tools/builtin/audio-transcribe.test.ts",
        "docs/runbooks/VOICE_TRANSCRIPTION_DEBUG.md",
        "docs/plans/state.json"
      ],
      "test_status": "pnpm test:run src/tools/builtin/audio-transcribe.test.ts src/models/media.test.ts"
    },
    "whisper-compose-entrypoint-args-fix": {
      "status": "completed",
      "date": "2026-02-23",
      "updated": "2026-02-23",
      "summary": "Fixed docker-compose whisper-server startup to override image entrypoint and pass host/port/inference args correctly. This resolves host-side `localhost:18801` connection resets caused by whisper-server binding to loopback inside the container.",
      "files_modified": [
        "docker-compose.yml",
        "docs/runbooks/VOICE_TRANSCRIPTION_DEBUG.md",
        "docs/plans/state.json"
      ],
      "test_status": "runtime validation: docker compose recreate + curl 127.0.0.1:18801 + POST /v1/audio/transcriptions returned HTTP response"
    }
  },
  "overall_progress": {
    "total_test_count": 2009,
    "all_tests_passing": true,
    "p0_completion": "3/3 (100%)",
    "p1_completion": "4/4 (100%)",
    "p2_completion": "7/7 (100%)",
    "p3_completion": "completed (group chat, gateway auth, Gemini, OpenRouter, Bedrock, browser control)",
    "p4_completion": "1/1 (100%) — multimodal media pipeline",
    "p5_completion": "1/1 (100%) — GitHub Copilot provider with auto-login",
    "p6_completion": "4/4 (100%) — enhanced media pipeline (image.analyze, outbound attachments, gateway attachments, audio transcription)",
    "p7_completion": "6/6 (100%) — web UI dashboard SPA (dashboard, chat, sessions, settings)",
    "p8_completion": "8/8 (100%) — agent tools (sessions.list/history/create/delete, agents.list, message.send, cron.list/trigger) + gap analysis audit",
    "tier1_completion": "5/5 (100%) — !!think prefix, /verbose command, typing indicators (Discord/WhatsApp), session pruning (TTL), tool groups",
    "tier2_completion": "4/4 (100%) — inbound webhooks, vector memory search, Dockerfile, heartbeat monitor",
    "tier3_completion": "5/5 (100%) — lane queue, credential redaction, web UI token dashboard, xAI (Grok) provider, Voyage AI embeddings",
    "tier4_completion": "4/4 (100%) — gateway lock, shell completion, Tailscale Serve/Funnel, DM pairing codes",
    "feature_gap_scorecard": "128/128 match (100%), 0 partial (0%), 0 missing (0%)",
    "operator_dx_milestone": "Phase 3 (Live Ops Dashboard): 2/2 plans complete — milestone done",
    "dashboard_observability": "completed — service health graphs + core service log viewer added to web UI via observability RPCs and bounded backend sampling",
    "gmail_auth_cli": "flynn gmail-auth command implemented with OAuth2 flow, doctor check, config routed to Telegram",
    "gmail_filter_creation": "completed — gmail.filter.create tool added with criteria/action validation; gmail-auth requests explicit gmail.settings.basic + gmail.readonly scopes for filter creation and inbox reads",
    "toolloop_action_intent_recovery": "completed — when a model claims it will execute a tool but emits no tool call, NativeAgent now issues one internal nudge and continues the same turn to execute tools or produce a concrete blocker",
    "toolloop_execution_claim_recovery": "completed — when a model claims a known tool already succeeded/failed without emitting a tool call, NativeAgent now nudges once and retries the same turn before returning text",
    "daily_briefing_google_scope_remediation": "completed — calendar.* and tasks.* now append explicit re-auth guidance (`flynn gcal-auth` / `flynn gtasks-auth`) for insufficient-scope errors, and operator runbook includes remediation steps",
    "council_tool_timeout_override": "completed — ToolExecutor supports per-tool timeout overrides and council.run now uses a 180s timeout to avoid false 30s council timeouts in the tool loop",
    "minimal_tui_multiline_paste_mode": "completed — minimal TUI now supports `/paste`/`/multiline` multiline compose mode ending with single '.' line, preventing newline truncation for pasted prompts",
    "config_profile_consolidation": "completed — config/paas.yaml is now generated from canonical config/default.yaml + config/profiles/paas.overlay.yaml with CI-checkable drift detection",
    "google_auth_hardening": "completed — shared Google OAuth runtime helper + auth store (auth.json), legacy token-file migration, refresh persistence, service-wide doctor checks, and unified `flynn google-auth` command",
    "model_router_correctness": "completed — fallback paths now avoid duplicate clients, apply retry policy consistently, and reject unsupported OpenAI OAuth tool requests early",
    "native_audio_support": "completed — smart routing for native audio (Gemini/OpenAI/GitHub) vs Whisper transcription fallback, plus 2026-02-23 arg hydration hardening, tool.args_rewritten audit metric, transient fetch retry/timeout hardening, localhost->127.0.0.1 fallback for transcription endpoint connectivity, and whisper docker-compose entrypoint arg fix for port 18801",
    "remaining_phases_completion": "Phase 1: 3/3 (100%) — context levels, command registry, memory structure. Phase 2: 3/3 (100%) — component registry, confidence routing, history index. Phase 3: 2/2 (100%) — adaptive memory/compaction, truthfulness/autonomy hardening",
    "next_up": "Track OpenClaw evolution regularly for inspiration and feature ideas",
    "pi_embedded_canary_spike": "completed — added optional pi_embedded backend adapter, canary-safe no-tools routing guard, backend success/fallback latency audit events, and docs/diagram updates while native remains default",
    "pi_embedded_evaluation_phase": "completed — final decision rollback (applied in runtime config): Window A failed latency/fallback gates (p50 +259ms, p95 +5695ms, fallback 25%, categories: pi_module_interface/empty_assistant_text); Window B remained sample-insufficient; controlled probes verified guard coverage (pi_no_tools_mode/capability_query/attachments_present each hit once)",
    "pi_embedded_manual_mode": "completed — added persisted runtime backend controls for manual Pi activation/deactivation (`/runtime` preferred, `/backend` alias; `status`, `activate pi`, `deactivate pi`, `use config`) while keeping config-driven default routing",
    "openclaw_gateway_first_tui_runtime_unification": "completed — shared `/runtime` backend-mode command service across channel router + gateway, plus TUI `/runtime` forwarding through a gateway bridge with daemon/gateway auto-start attach",
    "gateway_startup_eaddrinuse_hardening": "completed — gateway bind collisions now fail deterministically with explicit error handling and TUI auto-start treats EADDRINUSE as attach race with connect retry"
  },
  "soul_md_and_cron_create": {
    "date": "2026-02-11",
    "summary": "SOUL.md updated with comprehensive tool listing (web.search, memory.*, cron.*, process.*) and stronger 'act don't narrate' guidance. Added cron.create and cron.delete tools for runtime cron job management. Updated tool policy profiles (messaging/coding) and group:cron. Fixed issue where Flynn would narrate intended actions without calling tools.",
    "files_modified": [
      "SOUL.md",
      "src/tools/builtin/cron.ts",
      "src/automation/cron.ts",
      "src/tools/policy.ts"
    ]
  },
  "local-model-message-normalization": {
    "date": "2026-02-11",
    "summary": "Ollama & llama.cpp tool calling message normalization — normalizeMessagesForOllama() converts tool_use/tool_result content blocks to Ollama's native role:tool format, normalizeMessagesForLlamaCpp() converts to OpenAI-style tool_calls arrays with hybrid fallback for GGUF templates that drop role:tool messages.",
    "files_modified": [
      "src/models/local/ollama.ts",
      "src/models/local/ollama.test.ts",
      "src/models/local/llamacpp.ts",
      "src/models/local/llamacpp.test.ts"
    ]
  },
  "agent-loop-resilience": {
    "date": "2026-02-11",
    "summary": "Agent loop same-tool nudging (after 4 consecutive identical tool calls, inject a nudge message) and try-catch error handling around individual tool executions to prevent daemon crashes.",
    "files_modified": [
      "src/backends/native/agent.ts",
      "src/backends/native/agent.test.ts"
    ]
  },
  "native-audio-support": {
    "status": "completed",
    "date": "2026-02-11",
    "summary": "Native audio input support — voice messages passed directly to audio-capable models (Gemini, OpenAI, GitHub) instead of always transcribing via Whisper. Smart routing decides per-model whether to pass raw audio or transcribe first.",
    "phases": {
      "audio_transcribe_tool": {
        "status": "completed",
        "description": "audio.transcribe tool with Whisper-compatible API support",
        "files_created": [
          "src/tools/builtin/audio-transcribe.ts"
        ]
      },
      "type_system_and_clients": {
        "status": "completed",
        "description": "AudioSource type, audio content part handling in all model clients (Gemini inlineData, OpenAI input_audio, GitHub input_audio = native; Anthropic, Bedrock = text fallback)",
        "files_modified": [
          "src/models/types.ts",
          "src/models/gemini.ts",
          "src/models/openai.ts",
          "src/models/github.ts",
          "src/models/anthropic.ts",
          "src/models/bedrock.ts",
          "src/models/media.ts"
        ]
      },
      "capabilities_and_routing": {
        "status": "completed",
        "description": "supportsAudioInput() capability check, smart routing in daemon that transcribes for non-audio models and passes raw audio for capable ones, supports_audio config override",
        "files_created": [
          "src/models/capabilities.ts",
          "src/models/capabilities.test.ts"
        ],
        "files_modified": [
          "src/daemon/routing.ts",
          "src/config/schema.ts"
        ],
        "test_status": "18/18 passing"
      },
      "tests_and_token_estimation": {
        "status": "completed",
        "description": "Audio tests for media helpers, audio token estimation (base64→bytes→duration→tokens at 32 tokens/sec), supports_audio config override wiring",
        "files_modified": [
          "src/models/media.test.ts",
          "src/context/tokens.ts",
          "src/context/tokens.test.ts"
        ],
        "test_status": "20/20 tokens tests, 87/87 media tests"
      }
    }
  },
  "stopreason-normalization": {
    "date": "2026-02-11",
    "summary": "Normalize OpenAI/GitHub finish_reason to Flynn stopReason conventions. OpenAI 'stop' → 'end_turn', 'length' → 'max_tokens', 'tool_calls' with tools → 'tool_use', 'tool_calls' without tools → 'end_turn'. Fixes premature agent loop exit when falling back to GitHub Copilot (Anthropic API quota exhausted). Agent loop now accepts both 'tool_use' and 'tool_calls' as belt-and-suspenders.",
    "files_modified": [
      "src/models/openai.ts",
      "src/models/openai.test.ts",
      "src/models/github.ts",
      "src/backends/native/agent.ts"
    ],
    "test_status": "4/4 passing"
  },
  "dashboard-model-defaults-and-stop-controls": {
    "date": "2026-02-19",
    "summary": "Added dashboard controls for persistent model tier defaults (`agents.primary_tier`, `agents.delegation.*`) and background provider/model overrides with fallback tier (`agents.background_models.*`). Added command-registry `/stop` (alias `/cancel`), wired channel/gateway cancellation services, implemented web chat send-button stop state + `agent.cancel` wiring, and added Telegram `/stop` + `/cancel` command forwarding.",
    "files_modified": [
      "src/config/schema.ts",
      "src/gateway/handlers/config.ts",
      "src/backends/native/orchestrator.ts",
      "src/context/compaction.ts",
      "src/daemon/routing.ts",
      "src/gateway/session-bridge.ts",
      "src/commands/types.ts",
      "src/commands/builtin/index.ts",
      "src/commands/index.ts",
      "src/gateway/handlers/agent.ts",
      "src/gateway/ui/pages/chat.js",
      "src/gateway/ui/pages/dashboard.js",
      "src/channels/telegram/adapter.ts",
      "src/channels/telegram/adapter.test.ts",
      "src/commands/builtin/index.test.ts",
      "src/gateway/handlers/agent.test.ts",
      "docs/api/PROTOCOL.md"
    ],
    "test_status": "pnpm test:run src/commands/builtin/index.test.ts src/channels/telegram/adapter.test.ts src/gateway/handlers/agent.test.ts src/gateway/session-bridge.test.ts src/daemon/routing.test.ts src/config/schema.test.ts src/gateway/handlers/handlers.test.ts + pnpm typecheck passing"
  }
}
