# clisbot Backlog

## Purpose

This file is the project-management index for `docs/tasks/`.

Use it to track:

- status
- priority
- owning feature area
- the main task doc
- the latest note worth seeing at a glance

Do not turn this file into a full spec.

Subtasks, long notes, and detailed decisions belong in the linked task docs.

## Status Legend

- `Planned`
- `Ready`
- `In Progress`
- `Blocked`
- `Done`
- `Dropped`

## Priority Legend

- `P0`
- `P1`
- `P2`
- `P3`

## Active

| Status | Priority | Feature | Task | Main Doc | Updated | Notes |
| --- | --- | --- | --- | --- | --- | --- |
| In Progress | P0 | stability | runtime crash containment and service self-healing | [2026-04-15-runtime-crash-containment-and-service-self-healing.md](features/stability/2026-04-15-runtime-crash-containment-and-service-self-healing.md) | 2026-04-18 | Fatal-event guards, cleanup rejection containment, Telegram post-start failure reporting, and bounded monitor restart are shipped; remaining retry work is state-store hardening, startup blast-radius containment, and account-granular health truth. |
| In Progress | P0 | configuration | target config and CLI mental model migration | [2026-04-18-target-config-and-cli-mental-model-migration.md](features/configuration/2026-04-18-target-config-and-cli-mental-model-migration.md) | 2026-04-24 | Surface policy is now standardized on `directMessages` / `groups` with raw ids plus `*`, compatibility from released `0.1.43` is loader-backed, and the remaining sweep is mostly historical docs. |
| In Progress | P0 | channels | slack channel MVP validation and hardening | [2026-04-04-slack-channel-mvp-validation-and-hardening.md](features/channels/2026-04-04-slack-channel-mvp-validation-and-hardening.md) | 2026-04-05 | `SLACK_TEST_CHANNEL` mention flow, killed-session recovery, stored session-id resume, and natural no-mention continuation in channel threads are now proven after enabling Slack `message.channels`; remaining work is duplicate-event hardening, bot-traffic blocking verification, and response polish. |
| In Progress | P0 | agents | agents lifecycle and state model hardening | [2026-04-04-agents-lifecycle-and-state-model-hardening.md](features/agents/2026-04-04-agents-lifecycle-and-state-model-hardening.md) | 2026-04-05 | `sessionKey` to `sessionId` continuity, runner-loss recovery, and stale tmux cleanup are now implemented; reset policy and fuller health transitions remain open. |
| In Progress | P0 | runners | runner interface standardization and tmux runner hardening | [2026-04-04-runner-interface-standardization-and-tmux-runner-hardening.md](features/runners/2026-04-04-runner-interface-standardization-and-tmux-runner-hardening.md) | 2026-04-14 | tmux runner resume by stored session id and stale-session cleanup are working; normalized runner contract, reset policy, stronger delta or settled-state semantics, and nested shell or pager blocking cases like `vi`, `nano`, `less`, or `git diff` remain open. |
| In Progress | P0 | runners | Gemini CLI runner integration and auth gating | [2026-04-13-gemini-cli-runner-integration-and-auth-gating.md](features/runners/2026-04-13-gemini-cli-runner-integration-and-auth-gating.md) | 2026-04-13 | Gemini preset, session-id strategy, readiness gating, trust-folder dismissal, and clearer routed message-tool prompt wording are implemented; authenticated success-path end-to-end validation is still pending. |
| In Progress | P0 | channels | agent progress reply wrapper and prompt | [2026-04-09-agent-progress-reply-wrapper-and-prompt.md](features/channels/2026-04-09-agent-progress-reply-wrapper-and-prompt.md) | 2026-04-10 | Stable local reply commands now pair with `responseMode`, `additionalMessageMode`, `\q` or `\s`, and queue inspection or clear controls; remaining work is broader live validation. |
| In Progress | P0 | channels | channel plugin standardization | [2026-04-10-channel-plugin-standardization.md](features/channels/2026-04-10-channel-plugin-standardization.md) | 2026-04-10 | Slack and Telegram now share a first-class `ChannelPlugin` seam for runtime bootstrap, operator message commands, health summaries, and route-policy composition; live Slack validation remains. |
| In Progress | P0 | channels | loop slash command | [2026-04-12-loop-slash-command.md](features/channels/2026-04-12-loop-slash-command.md) | 2026-04-12 | Add `/loop` with managed interval loops, wall-clock schedules, bounded-times parsing, `LOOP.md` maintenance fallback, restart restore, status or cancel controls, and channel test coverage. |
| In Progress | P0 | stability | tmux submit truthfulness and Telegram send reliability | [2026-04-12-tmux-submit-truthfulness-and-telegram-send-reliability.md](features/stability/2026-04-12-tmux-submit-truthfulness-and-telegram-send-reliability.md) | 2026-05-03 | Post-`/status` first-prompt hardening, delayed trust-prompt acceptance before prompt submission, and bounded restart truthfulness are now shipped; remaining work is broader real-surface timing audit, not a release blocker for `0.1.50`. |

## Planned

| Status | Priority | Feature | Task | Main Doc | Updated | Notes |
| --- | --- | --- | --- | --- | --- | --- |
| Planned | P0 | stability | session runner state machine review | [2026-04-27-session-runner-state-machine-review.md](features/stability/2026-04-27-session-runner-state-machine-review.md) | 2026-04-27 | Review active-run, runner liveness, recovery exhaustion, final delivery, and stale persisted runtime transitions so status, queue, loop, and steering cannot drift. |
| Planned | P0 | stability | storage handle standardization and durable flush | [2026-05-01-storage-handle-standardization-and-durable-flush.md](features/stability/2026-05-01-storage-handle-standardization-and-durable-flush.md) | 2026-05-01 | Standardize atomic or queued document persistence plus bounded flush-on-stop across `clisbot.json`, `sessions.json`, processed events, runtime health, activity, surface directory, and runtime credentials. |
| Done | P0 | cross-cutting | session continuity boundary and runner-service leak cleanup | [2026-05-02-session-continuity-boundary-and-runner-service-leak-cleanup.md](2026-05-02-session-continuity-boundary-and-runner-service-leak-cleanup.md) | 2026-05-02 | Shipped `SessionMapping`, moved explicit-id minting and continuity writes out of runner-owned code, added `sessionId` persistence annotation to diagnostics, and stopped clearing stored session ids automatically on ambiguous resume or `/new` failures. |
| Done | P0 | control | scoped loops list | [2026-04-29-scoped-loops-list.md](features/control/2026-04-29-scoped-loops-list.md) | 2026-04-29 | Added scoped `clisbot loops list/status` filters using the existing routed `--channel/--target` shape. |
| Done | P0 | runners | Codex runner path drift and update-notice hardening | [2026-04-24-codex-runner-path-drift-and-update-notice-hardening.md](features/runners/2026-04-24-codex-runner-path-drift-and-update-notice-hardening.md) | 2026-05-09 | Shipped startup truthfulness for the real Codex update-menu path: clisbot auto-confirms the default update flow, tolerates the temporary runner exit, relaunches truthfully, and keeps trust/no-prompt startup coverage. Further path-selection audit can follow as a separate scope if needed. |
| Planned | P0 | control | chat channel runtime recovery controls | [2026-04-26-chat-channel-runtime-recovery-controls.md](features/control/2026-04-26-chat-channel-runtime-recovery-controls.md) | 2026-04-26 | Add authorized chat commands for current-session runner recovery first, then explicit broader restart scopes, so users are not forced back to server shell when a tmux runner is wedged. |
| Planned | P0 | dx | Codex model continuity and release-drift compatibility | [2026-04-24-codex-model-continuity-and-release-drift-compatibility.md](features/dx/2026-04-24-codex-model-continuity-and-release-drift-compatibility.md) | 2026-04-24 | Codex can warn when resuming a session recorded with one model under a newer model, so clisbot should preserve session model affinity and surface mismatch states before adopting new releases. |
| Planned | P1 | dx | clisbot repo operating skill from architecture docs | [2026-04-30-clisbot-repo-operating-skill-from-architecture-docs.md](features/dx/2026-04-30-clisbot-repo-operating-skill-from-architecture-docs.md) | 2026-04-30 | Turn the stable architecture and repo operating docs into a reusable AI skill so Codex or Claude can work inside the repo with less rediscovery and less architecture drift. |
| Planned | P1 | configuration | config downgrade and restore UX | [2026-04-25-config-downgrade-and-restore-ux.md](features/configuration/2026-04-25-config-downgrade-and-restore-ux.md) | 2026-04-25 | Automatic schema upgrade now backs up released `0.1.43` config first; add an explicit operator surface to list and restore backups before investing in full downgrade helpers. |
| Ready | P0 | runners | common CLI launch coverage and validation | [2026-04-13-common-cli-launch-coverage-and-validation.md](features/runners/2026-04-13-common-cli-launch-coverage-and-validation.md) | 2026-04-13 | Treat Claude, Codex, and Gemini as the first launch trio, with Gemini now wired through runner readiness and auth gating but still needing authenticated route-level launch evidence. |
| Ready | P0 | channels | chat-first streaming and transcript request commands | [2026-04-04-chat-first-streaming-and-transcript-request-commands.md](features/channels/2026-04-04-chat-first-streaming-and-transcript-request-commands.md) | 2026-04-04 | Make meaningful-only streaming the default Slack interaction model and support full session visibility only through explicit transcript request commands. |
| Planned | P0 | channels | Slack thread-scoped streaming overrides | [2026-04-16-slack-thread-scoped-streaming-overrides.md](features/channels/2026-04-16-slack-thread-scoped-streaming-overrides.md) | 2026-04-16 | Slack thread-level `/streaming` changes currently appear to leak to the whole parent channel; isolate persistence and lookup by routed thread target. |
| Planned | P1 | channels | channel processing indicator adapter standardization | [2026-05-09-channel-processing-indicator-adapter-standardization.md](features/channels/2026-05-09-channel-processing-indicator-adapter-standardization.md) | 2026-05-09 | Standardize the channel-facing processing indicator adapter contract across Slack, Telegram, and Zalo Bot first, but keep the first pass doc-driven to reduce runtime blast radius. |
| Planned | P1 | channels | channel behavior config target binding standardization | [2026-05-09-channel-behavior-config-target-binding-standardization.md](features/channels/2026-05-09-channel-behavior-config-target-binding-standardization.md) | 2026-05-09 | Standardize how channel identity binds to persisted route-level behavior config so follow-up, streaming, verbose, and later route toggles stop re-implementing near-duplicate Slack, Telegram, and Zalo Bot config-target resolution. |
| Planned | P2 | channels | channel closed-set dispatch readability and explicit branching cleanup | [2026-05-09-channel-closed-set-dispatch-readability-and-explicit-branching-cleanup.md](features/channels/2026-05-09-channel-closed-set-dispatch-readability-and-explicit-branching-cleanup.md) | 2026-05-09 | Replace hard-to-read closed-set ternaries and implicit else branches with explicit channel dispatch where that improves trust and reviewability without changing behavior. |
| Planned | P1 | channels | channel duplication and reuse audit for new integration slices | [2026-05-09-channel-duplication-and-reuse-audit-for-new-integration-slices.md](features/channels/2026-05-09-channel-duplication-and-reuse-audit-for-new-integration-slices.md) | 2026-05-09 | Audit where new channel work is still copying route config, pairing access, prompt, typing, and other provider slices instead of reusing a stable seam, then turn the findings into small standardization follow-ups. |
| Done | P1 | channels | zalo-bot target normalization and reply-target truthfulness | [2026-05-09-zalo-bot-target-normalization-and-reply-target-truthfulness.md](features/channels/2026-05-09-zalo-bot-target-normalization-and-reply-target-truthfulness.md) | 2026-05-15 | Zalo Bot route/send/reply, queue, and loop paths now share explicit DM target parsing; unsupported group targets fail before config or session persistence instead of drifting into wrong routes or sessions. |
| Planned | P1 | auth | pairing allowlist alias cleanup and canonical identity naming | [2026-05-09-pairing-allowlist-alias-cleanup-and-canonical-identity-naming.md](features/auth/2026-05-09-pairing-allowlist-alias-cleanup-and-canonical-identity-naming.md) | 2026-05-09 | Remove or deprecate low-value allowlist alias prefixes like `user:` and `zalo:` where they add ambiguity without clear operator benefit, then document one canonical naming rule per channel. |
| Planned | P1 | auth | pairing access matcher standardization across channels | [2026-05-09-pairing-access-matcher-standardization-across-channels.md](features/auth/2026-05-09-pairing-access-matcher-standardization-across-channels.md) | 2026-05-09 | Standardize allow/block matcher logic in the pairing access layer so new channels do not keep re-implementing near-duplicate `is*SenderAllowed` and `is*SenderBlocked` helpers. |
| Done | P0 | dx | CLI compatibility contract and DX surface | [2026-04-17-cli-compatibility-contract-and-dx-surface.md](features/dx/2026-04-17-cli-compatibility-contract-and-dx-surface.md) | 2026-04-17 | `dx` and `cli-compatibility` now exist as first-class docs with the v0 capability contract, CLI surface mapping, and launch-trio backend profiles. |
| Done | P0 | dx | real-CLI smoke surface and launch-trio compatibility summary | [2026-04-17-real-cli-smoke-surface-and-launch-trio-compatibility-summary.md](features/dx/2026-04-17-real-cli-smoke-surface-and-launch-trio-compatibility-summary.md) | 2026-04-17 | The real-CLI smoke surface is now specified with scenario scope, artifact bundle shape, failure taxonomy, and launch-trio roll-up expectations. |
| Done | P0 | dx | real-CLI smoke command contract | [2026-04-17-real-cli-smoke-command-contract.md](features/dx/2026-04-17-real-cli-smoke-command-contract.md) | 2026-04-17 | `runner smoke` now has a named flag set, exit-code contract, and JSON schemas for scenario, suite, and transition artifacts. |
| Done | P1 | control | runner debug watch CLI | [2026-04-18-runner-debug-watch-cli.md](features/control/2026-04-18-runner-debug-watch-cli.md) | 2026-04-18 | `clisbot runner list|inspect|watch` now gives operators a fast pane-debug surface, with `watch --latest` and `watch --next` ordered by admitted prompt flow instead of tmux create time. |
| Ready | P0 | security | group bot abuse and feedback-loop containment | [2026-04-17-group-bot-abuse-and-feedback-loop-containment.md](features/security/2026-04-17-group-bot-abuse-and-feedback-loop-containment.md) | 2026-04-17 | Define the shared-group security contract for human-first defaults, bot-origin trust, abuse resistance, and bot-to-bot spam containment. |
| Ready | P0 | security | prompt injection review | [2026-04-17-prompt-injection-review.md](features/security/2026-04-17-prompt-injection-review.md) | 2026-04-17 | Review prompt assembly boundaries, injection paths, and which protections still rely on model obedience instead of hard enforcement. |
| Ready | P0 | security | prompt access control review | [2026-04-17-prompt-access-control-review.md](features/security/2026-04-17-prompt-access-control-review.md) | 2026-04-17 | Review who may reach protected prompt layers and where prompt visibility drifts from the real auth and control model. |
| Ready | P0 | stability | bot feedback loops and duplicate ingress hardening | [2026-04-17-bot-feedback-loops-and-duplicate-ingress-hardening.md](features/stability/2026-04-17-bot-feedback-loops-and-duplicate-ingress-hardening.md) | 2026-04-17 | Define the runtime invariants for duplicate ingress, recurring loop overlap, echo suppression, and route quarantine or cool-off behavior. |
| Ready | P0 | stability | shell execution interactive command stall review | [2026-04-17-shell-execution-interactive-command-stall-review.md](features/stability/2026-04-17-shell-execution-interactive-command-stall-review.md) | 2026-04-17 | Review why `shellExecute` can stall on interactive terminal apps such as `vi`, `nano`, or `less`, then define truthful detection and recovery behavior. |
| Planned | P1 | agents | audio conversion and transcription CLI | [2026-04-28-audio-conversion-and-transcription-cli.md](features/agents/2026-04-28-audio-conversion-and-transcription-cli.md) | 2026-04-28 | Start with standalone `clisbot audio` STT/TTS conversion and macOS permission handling, then evaluate opt-in attachment transcription. |
| Planned | P1 | configuration | customer-support bot type and safe surface defaults | [2026-04-14-customer-support-bot-type-and-safe-surface-defaults.md](features/configuration/2026-04-14-customer-support-bot-type-and-safe-surface-defaults.md) | 2026-04-14 | Add a dedicated `customer-support` first-run type with safer surface defaults such as transcript visibility disabled unless the operator opts in. |
| Planned | P1 | channels | shared-surface pairing guidance for unpaired users | [2026-04-14-shared-surface-pairing-guidance-for-unpaired-users.md](features/channels/2026-04-14-shared-surface-pairing-guidance-for-unpaired-users.md) | 2026-04-14 | Reply with DM-first pairing guidance when an unpaired user mentions the bot in a Slack channel or Telegram group instead of failing silently. |
| Planned | P1 | configuration | start raw token warnings and runtime restart UX | [2026-04-14-start-raw-token-warnings-and-runtime-restart-ux.md](features/configuration/2026-04-14-start-raw-token-warnings-and-runtime-restart-ux.md) | 2026-04-14 | Review duplicate Slack literal-token warnings, clarify whether the warning is justified, and reduce restart friction when raw token input is used against a running runtime. |
| Planned | P1 | configuration | default DM agent CLI surface | [2026-04-19-default-dm-agent-cli-surface.md](features/configuration/2026-04-19-default-dm-agent-cli-surface.md) | 2026-04-24 | Add a bot-level CLI surface for defaults-layer `directMessages["*"]` agent overrides so operators do not need to materialize routes or edit config manually just to change Slack or Telegram DM fallback agent selection. |
| Ready | P1 | channels | prompt templates and overrides | [2026-04-13-prompt-templates-and-overrides.md](features/channels/2026-04-13-prompt-templates-and-overrides.md) | 2026-04-14 | Replace hardcoded user-message, steering, and loop prompt text with editable default templates plus per-agent overrides and clear runtime source reporting; include explicit review of queue and loop template wording. |
| Ready | P1 | channels | structured channel rendering and native surface capabilities | [2026-04-14-structured-channel-rendering-and-native-surface-capabilities.md](features/channels/2026-04-14-structured-channel-rendering-and-native-surface-capabilities.md) | 2026-04-14 | Add Slack Block Kit plus fallback text, Telegram safe HTML plus plain-text retry, preview-edit streaming, and explicit channel-native reply capabilities. |
| In Progress | P1 | auth | audience-scoped access and delegated specialist bots | [2026-04-21-audience-scoped-access-and-delegated-specialist-bots.md](features/auth/2026-04-21-audience-scoped-access-and-delegated-specialist-bots.md) | 2026-04-24 | Shared-route audience gating now includes silent `disabled`, deny-before-runner allowlist enforcement, and the standardized `directMessages` / `groups` surface model; remaining work is command-level auth and later delegated bot policy. |
| Planned | P1 | control | auth-aware CLI mutation enforcement and runner command guardrails | [2026-04-14-auth-aware-cli-mutation-enforcement-and-runner-command-guardrails.md](features/control/2026-04-14-auth-aware-cli-mutation-enforcement-and-runner-command-guardrails.md) | 2026-04-14 | Later enforce owner or admin checks for mutating `clisbot` CLI commands and evaluate second-layer runner guardrails beyond prompt guidance. |
| Planned | P1 | control | doctor CLI upgrade diagnostics and schema repair | [2026-04-18-doctor-cli-upgrade-diagnostics-and-schema-repair.md](features/control/2026-04-18-doctor-cli-upgrade-diagnostics-and-schema-repair.md) | 2026-04-18 | Add `clisbot doctor` to diagnose upgrade drift, schema or config failures, and stale runtime state, with dry-run plus bounded safe-fix support for recoverable cases. |
| Planned | P1 | cross-cutting | architecture boundary clarification for surfaces, auth, agents, and runners | [2026-04-13-architecture-boundary-clarification-for-surfaces-agents-and-runners.md](2026-04-13-architecture-boundary-clarification-for-surfaces-agents-and-runners.md) | 2026-04-14 | Clarify command lifecycle, permission ownership across auth or control or channels or configuration, follow-up ownership split, and canonical session continuity state across the six-system architecture. |
| Planned | P1 | configuration | multilingual user guide and app language | [2026-04-13-multilingual-user-guide-and-app-language.md](features/configuration/2026-04-13-multilingual-user-guide-and-app-language.md) | 2026-04-13 | Add `--lang vi|zh|ko|en`, localize clisbot-owned startup or help or status surfaces, and create multilingual user-guide entry points so the product reaches non-English-first users with less friction. |
| Planned | P0 | channels | Telegram capture-pane settlement stall | [2026-04-12-telegram-capture-pane-settlement-stall.md](features/channels/2026-04-12-telegram-capture-pane-settlement-stall.md) | 2026-04-12 | Investigate reports that Telegram topic routes switched to `capture-pane` may only show typing and then never deliver a visible reply. |
| Planned | P0 | channels | thread-scoped active-run isolation | [2026-04-12-thread-scoped-active-run-isolation.md](features/channels/2026-04-12-thread-scoped-active-run-isolation.md) | 2026-04-12 | Investigate reports that one thread can wrongly see `This session already has an active run` while another thread owns the live run. |
| Planned | P1 | channels | loop effective timezone truthfulness and operator visibility | [2026-04-24-loop-effective-timezone-truthfulness-and-operator-visibility.md](features/channels/2026-04-24-loop-effective-timezone-truthfulness-and-operator-visibility.md) | 2026-04-24 | Wall-clock loops already resolve timezone deterministically, but operators and AI can still get confused because the effective timezone is not surfaced clearly enough during create and status flows. |
| Planned | P0 | runners | AI CLI structured streaming and interrupt evaluation | [2026-04-05-ai-cli-structured-streaming-and-interrupt-evaluation.md](features/runners/2026-04-05-ai-cli-structured-streaming-and-interrupt-evaluation.md) | 2026-04-05 | Check whether native JSON output or JSON streaming, returned session ids, and ACP can improve UX versus pane scraping without losing tmux-style immediate steering and interrupt control. |
| Ready | P0 | agents | agent self-knowledge, runtime introspection, and work-management interface | [2026-04-17-agent-self-knowledge-runtime-introspection-and-work-management-interface.md](features/agents/2026-04-17-agent-self-knowledge-runtime-introspection-and-work-management-interface.md) | 2026-04-17 | Define the three agent growth tracks for self-knowledge, runtime self-management, and backend-agnostic work-item interfaces before any large implementation batch starts. |
| Planned | P0 | agents | conversation follow-up policy and runtime control api | [2026-04-05-conversation-follow-up-policy-and-runtime-control-api.md](features/agents/2026-04-05-conversation-follow-up-policy-and-runtime-control-api.md) | 2026-04-05 | Add configurable follow-up TTL, mention-only or paused follow-up modes, and an agent-callable runtime control API so Codex or Claude can change conversation behavior on request. |
| Planned | P0 | stability | tmux session drift detection and guardrails | [2026-04-10-tmux-session-drift-detection-and-guardrails.md](features/stability/2026-04-10-tmux-session-drift-detection-and-guardrails.md) | 2026-04-10 | Detect and surface when a reused Slack or Telegram session has been altered by direct tmux pane input outside clisbot’s routed channel path. |
| Planned | P1 | stability | tmux submit state model and input path separation | [2026-04-13-tmux-submit-state-model-and-input-path-separation.md](features/stability/2026-04-13-tmux-submit-state-model-and-input-path-separation.md) | 2026-04-13 | Follow the urgent submit-truthfulness fix by separating idle prompt submit, active steering submit, and handshake submits, then define stronger confirmation signals for multiline and longer prompt cases. |
| Ready | P1 | channels | Zalo Bot, Zalo OA, and Zalo Personal channel strategy | [2026-04-18-zalo-bot-oa-and-personal-channel-strategy.md](features/channels/2026-04-18-zalo-bot-oa-and-personal-channel-strategy.md) | 2026-04-18 | Treat Zalo as three distinct provider families, with `zalo-bot` first, `zalo-oa` second, and `zalo-personal` optional last. |
| Ready | P1 | channels | official Zalo Bot Platform channel MVP | [2026-04-18-zalo-bot-platform-channel-mvp.md](features/channels/2026-04-18-zalo-bot-platform-channel-mvp.md) | 2026-04-18 | Build the first official Zalo provider around polling-first Bot API delivery, DM routing, text plus photo send, and truthful runtime surfaces. |
| Planned | P1 | channels | Zalo Official Account channel contract and MVP | [2026-04-18-zalo-official-account-channel-contract-and-mvp.md](features/channels/2026-04-18-zalo-official-account-channel-contract-and-mvp.md) | 2026-04-18 | Lock the current OA contract first, then implement a separate official `zalo-oa` provider without guessing from `zalo-bot`. |
| Planned | P2 | channels | Zalo Personal free local adapter alpha | [2026-04-18-zalo-personal-free-local-adapter-alpha.md](features/channels/2026-04-18-zalo-personal-free-local-adapter-alpha.md) | 2026-04-18 | Ship `zalo-personal` only as an unofficial alpha behind a free local adapter seam, with no paid third-party dependency requirement. |
| Planned | P1 | agents | native slash command compatibility and overrides | [2026-04-13-native-slash-command-compatibility-and-overrides.md](features/agents/2026-04-13-native-slash-command-compatibility-and-overrides.md) | 2026-04-13 | Decide whether broader launch needs stronger native CLI slash-command compatibility, conflict handling, override surfaces, and prefix customization beyond the current pass-through fallback. |
| Planned | P1 | agents | separate active-run persistence from session continuity | [2026-04-08-observer-based-session-attach-detach-and-watch.md](2026-04-08-observer-based-session-attach-detach-and-watch.md) | 2026-04-13 | Runtime active-run state still lives in the session continuity record; split it into a dedicated supervision model with explicit restart or crash recovery semantics so tmux continuity and chat-level run ownership cannot drift apart. |
| Planned | P1 | channels | durable observer subscription policy for active runs | [2026-04-08-observer-based-session-attach-detach-and-watch.md](2026-04-08-observer-based-session-attach-detach-and-watch.md) | 2026-04-08 | Decide whether attach or watch observers should survive process restart or stay intentionally ephemeral, then implement and document that rule explicitly. |
| Planned | P1 | channels | DM-first pairing onboarding | [2026-04-10-dm-first-pairing-onboarding.md](features/channels/2026-04-10-dm-first-pairing-onboarding.md) | 2026-04-10 | Onboard new Slack and Telegram users through direct messages first so they see the pairing approval command earlier and reach a first successful conversation faster. |
| Planned | P1 | agents | openclaw session compatibility expansion | [2026-04-04-openclaw-session-compatibility-expansion.md](features/agents/2026-04-04-openclaw-session-compatibility-expansion.md) | 2026-04-04 | Add bindings, reset policy, and richer session metadata so OpenClaw users can transfer configuration and mental models with less friction. |
| Planned | P1 | runners | secondary CLI expansion prioritization | [2026-04-13-secondary-cli-expansion-prioritization.md](features/runners/2026-04-13-secondary-cli-expansion-prioritization.md) | 2026-04-13 | After the launch trio is solid, rank Cursor, Amp, OpenCode, Qwen, Kilo, Minimax, and other follow-up CLIs by real demand plus compatibility cost instead of intuition alone. |
| Planned | P1 | control | operator control surface and debuggability | [2026-04-04-operator-control-surface-and-debuggability.md](features/control/2026-04-04-operator-control-surface-and-debuggability.md) | 2026-04-04 | Turn inspect, attach, restart, stop, and health actions into a first-class control system. |
| Planned | P1 | configuration | configuration control-plane expansion | [2026-04-04-configuration-control-plane-expansion.md](features/configuration/2026-04-04-configuration-control-plane-expansion.md) | 2026-04-04 | Expand the local config so it truthfully expresses channels, Agents, runners, control, and policy. |
| Planned | P1 | auth | Slack tool interaction and permission boundary review | [2026-04-24-slack-tool-interaction-and-permission-boundary-review.md](features/auth/2026-04-24-slack-tool-interaction-and-permission-boundary-review.md) | 2026-04-24 | Slack now combines route admission, audience gating, slash-command handling, `/bash`, `/transcript`, and `message-tool`, but the operator permission story still deserves one explicit audit. |
| Planned | P1 | channels | post-MVP channel expansion wave | [2026-04-13-post-mvp-channel-expansion-wave.md](features/channels/2026-04-13-post-mvp-channel-expansion-wave.md) | 2026-04-13 | After Slack, Telegram, and the Vietnam Zalo package are settled, rank the next channel wave across Discord, WhatsApp, Google Workspace, and Microsoft Teams. |
| Planned | P2 | agents | multi-surface bash command addressing | [2026-04-04-multi-surface-bash-command-addressing.md](features/agents/2026-04-04-multi-surface-bash-command-addressing.md) | 2026-04-04 | Later support explicit shell targeting such as `!1:` or `!bash:` while keeping one reusable default shell per agent session today. |
| Planned | P2 | channels | api channel MVP | [2026-04-04-api-channel-mvp.md](features/channels/2026-04-04-api-channel-mvp.md) | 2026-04-04 | Add the OpenAI-compatible API surface as a channel rather than as a separate product system. |
| Planned | P2 | runtime-benchmarks | bun go rust benchmark harness | [2026-04-04-bun-go-rust-benchmark-harness.md](features/runtime-benchmarks/2026-04-04-bun-go-rust-benchmark-harness.md) | 2026-04-04 | Build the benchmark and soak-test layer for the later multi-language comparison. |

## Blocked

| Status | Priority | Feature | Task | Main Doc | Updated | Notes |
| --- | --- | --- | --- | --- | --- | --- |

## Dropped

| Status | Priority | Feature | Task | Main Doc | Updated | Notes |
| --- | --- | --- | --- | --- | --- | --- |
| Dropped | P1 | agents | live session id runtime truth and memory registry | [2026-05-02-live-session-id-runtime-truth-and-memory-registry.md](features/agents/2026-05-02-live-session-id-runtime-truth-and-memory-registry.md) | 2026-05-03 | The memory-first live-session-id registry idea is not needed for `0.1.50` release readiness; reopen only if real operator evidence shows persisted-first diagnostics are hiding known live truth. |

## Done

| Status | Priority | Feature | Task | Main Doc | Updated | Notes |
| --- | --- | --- | --- | --- | --- | --- |
| Done | P0 | cross-cutting | OpenClaw session and context analysis | [2026-04-04-openclaw-session-context-analysis.md](2026-04-04-openclaw-session-context-analysis.md) | 2026-04-04 | Captured the initial model for OpenClaw session state, workspace memory, transcript boundaries, and the main privacy questions `clisbot` still needs to answer. |
| Done | P1 | channels | prompt context sender and surface contract | [2026-04-27-prompt-context-sender-surface-contract.md](features/channels/2026-04-27-prompt-context-sender-surface-contract.md) | 2026-04-27 | Compact sender/surface prompt context, read-only auth get-permissions, queue start prompt rebuilds, loop sender persistence, and surface directory enrichment are shipped. |
| Done | P1 | channels | chat surface guidance and route-binding clarity | [2026-05-04-chat-surface-guidance-and-route-binding-clarity.md](features/channels/2026-05-04-chat-surface-guidance-and-route-binding-clarity.md) | 2026-05-04 | Clarified that `routes add ...` uses whichever agent is currently assigned to that bot by default, while `routes set-agent ...` is only for per-route override across Slack and Telegram chat guidance, runtime guidance, and shared-surface docs. |
| Done | P0 | agents | queue workflow and queues CLI | [2026-04-28-agent-managed-queue-workflow-and-queues-cli.md](features/agents/2026-04-28-agent-managed-queue-workflow-and-queues-cli.md) | 2026-04-29 | Durable session-scoped queue state, `clisbot queues`, chat `/queue` persistence, per-session pending limits, and runtime reconciliation are shipped without ambient `--current`. |
| Done | P1 | channels | Slack sender identity in prompt context | [2026-04-21-slack-sender-identity-in-prompt-context.md](features/channels/2026-04-21-slack-sender-identity-in-prompt-context.md) | 2026-04-27 | Slack prompt context and recent-message replay now carry sender display identity when Slack lookup can provide it, with id fallback when lookup or scope is unavailable. |
| Done | P1 | channels | prompt context truthfulness for sender and surface labels | [2026-04-24-prompt-context-truthfulness-for-sender-and-surface-labels.md](features/channels/2026-04-24-prompt-context-truthfulness-for-sender-and-surface-labels.md) | 2026-04-27 | Normal, steering, queue, and loop prompt paths now use compact sender/surface context with Slack, Telegram, and directory-backed display enrichment. |
| Done | P0 | channels | native channel message formatting and render fallbacks | [2026-04-17-native-channel-message-formatting-and-render-fallbacks.md](features/channels/2026-04-17-native-channel-message-formatting-and-render-fallbacks.md) | 2026-04-18 | The current native render contract is shipped: Markdown-like input now maps cleanly to channel-native output, with Telegram safe HTML and explicit Slack native rendering paths documented and aligned with the message CLI. |
| Done | P0 | channels | slack telegram message actions and bot routing | [2026-04-09-slack-telegram-message-actions-and-channel-accounts.md](features/channels/2026-04-09-slack-telegram-message-actions-and-channel-accounts.md) | 2026-04-18 | The `message` CLI and bot-aware Slack or Telegram routing are shipped; this historical task now maps to the official `bots` mental model. |
| Done | P0 | stability | detached runtime stop zombie truthfulness | [2026-04-13-detached-runtime-stop-zombie-truthfulness.md](features/stability/2026-04-13-detached-runtime-stop-zombie-truthfulness.md) | 2026-04-13 | `clisbot stop` now treats zombie or defunct detached runtime pids as exited, so stop or status no longer time out or misreport a runtime that is already down. |
| Done | P0 | stability | graceful stop clears active run state | [2026-04-13-graceful-stop-clears-active-run-state.md](features/stability/2026-04-13-graceful-stop-clears-active-run-state.md) | 2026-04-13 | Graceful runtime shutdown now marks persisted active runs back to `idle`, so `clisbot status` no longer shows stale active work after a normal stop. |
| Done | P0 | agents | agent workspace attachments | [2026-04-06-agent-workspace-attachments.md](features/agents/2026-04-06-agent-workspace-attachments.md) | 2026-04-18 | Slack and Telegram inbound attachments now download into workspace `.attachments`, prompt shaping injects only `@/absolute/path` mentions, and the MVP contract is covered by attachment storage or prompt regression tests. |
| Done | P0 | channels | processing indicator lifecycle and active-run truthfulness | [2026-04-14-processing-indicator-lifecycle-and-active-run-truthfulness.md](features/channels/2026-04-14-processing-indicator-lifecycle-and-active-run-truthfulness.md) | 2026-04-14 | Slack and Telegram indicators now wait on real active-run settlement or detach, so steer paths no longer clear typing or processing feedback too early. |
| Done | P0 | channels | Slack processing indicator regression | [2026-04-16-slack-processing-indicator-regression.md](features/channels/2026-04-16-slack-processing-indicator-regression.md) | 2026-04-16 | Slack processing decoration now keeps assistant thread status alive while the active-run lease is still owned by the runtime, so the indicator no longer flashes off mid-run. |
| Done | P0 | channels | streaming mode and message-tool draft preview handoff | [2026-04-14-streaming-mode-and-message-tool-draft-preview-handoff.md](features/channels/2026-04-14-streaming-mode-and-message-tool-draft-preview-handoff.md) | 2026-04-14 | `streaming` now drives live preview on both response modes, `/streaming` persists route updates, and `message-tool` uses one live draft preview with channel-capability-aware cleanup. |
| Done | P0 | channels | streaming-off truthfulness for queued and loop delivery | [2026-04-14-streaming-off-truthfulness-for-queued-and-loop-delivery.md](features/channels/2026-04-14-streaming-off-truthfulness-for-queued-and-loop-delivery.md) | 2026-04-14 | Delayed queue and loop paths now honor `streaming: "off"`, preserve queued prompt text, and rebuild managed-loop prompt instructions from persisted prompt text plus surface binding. |
| Done | P1 | channels | queued and loop running surface notifications | [2026-04-14-queued-and-loop-running-surface-notifications.md](features/channels/2026-04-14-queued-and-loop-running-surface-notifications.md) | 2026-04-15 | Queue start and scheduled loop-start notifications now ship with `brief` defaults, route-level config, persisted surface binding, and regression coverage. |
| Done | P1 | channels | transcript visibility and verbose levels | [2026-04-14-transcript-visibility-and-verbose-levels.md](features/channels/2026-04-14-transcript-visibility-and-verbose-levels.md) | 2026-04-15 | `/transcript` now follows route `verbose` with `minimal` as the default, while `/bash` follows resolved agent auth through `shellExecute`. |
| Done | P0 | stability | Claude tmux submit readiness and paste settlement | [2026-04-13-claude-tmux-submit-readiness-and-paste-settlement.md](features/stability/2026-04-13-claude-tmux-submit-readiness-and-paste-settlement.md) | 2026-04-13 | Fixed the traced Claude first-turn failures by recognizing the current trust prompt shape, waiting for multiline paste settlement before `Enter`, and revalidating on live Slack. |
| Done | P0 | cross-cutting | documentation system bootstrap | [2026-04-04-documentation-system-bootstrap.md](2026-04-04-documentation-system-bootstrap.md) | 2026-04-04 | Added the initial docs, architecture, features, tasks, and lessons scaffold, then refactored them toward the truthful system model. |
| Done | P0 | cross-cutting | clisbot product rename | [2026-04-10-clisbot-product-rename.md](2026-04-10-clisbot-product-rename.md) | 2026-04-10 | Directly renamed the product, CLI, package, runtime paths, config filename, env vars, docs, and GitHub repo from `muxbot` to `clisbot`, with `clis` as the short alias. |
| Done | P0 | cross-cutting | observer-based session attach, detach, and watch | [2026-04-08-observer-based-session-attach-detach-and-watch.md](2026-04-08-observer-based-session-attach-detach-and-watch.md) | 2026-04-11 | Active-run observers now support live, passive-final, and poll delivery with transport-failure containment so Slack or Telegram delivery faults do not terminate runner supervision. |
| Done | P0 | auth | app and agent authorization and owner claim | [2026-04-14-app-and-agent-authorization-and-owner-claim.md](features/auth/2026-04-14-app-and-agent-authorization-and-owner-claim.md) | 2026-04-15 | Phase-1 auth is complete: `app.auth` and `agents.<id>.auth` are live, `/bash` uses `shellExecute`, protected clisbot-control prompt rules apply across normal or queue or steer or loop delivery, pairing bypass works, `clisbot auth ...` is live, and first-owner auto-claim is shipped. |
| Done | P1 | cross-cutting | session runner boundary simplification and validation | [2026-04-15-session-runner-boundary-simplification-and-validation.md](2026-04-15-session-runner-boundary-simplification-and-validation.md) | 2026-05-02 | Naming and owner-map cleanup are complete, but the later continuity-boundary leak cleanup now lives in a separate follow-up task. |
| Done | P0 | configuration | privilege command route gating | [2026-04-07-sensitive-command-route-gating.md](features/configuration/2026-04-07-sensitive-command-route-gating.md) | 2026-04-15 | Historical pre-auth slice only; current runtime rejects `privilegeCommands`, uses route `verbose` for `/transcript`, and uses auth `shellExecute` for `/bash`. |
| Done | P0 | configuration | OpenClaw-style agent CLI and bootstrap | [2026-04-07-openclaw-style-agent-cli-and-bootstrap.md](features/configuration/2026-04-07-openclaw-style-agent-cli-and-bootstrap.md) | 2026-04-07 | Added OpenClaw-like `agents` control commands, explicit tool-aware agent creation, bootstrap seeding, bindings, and richer `start` or `status` summaries. |
| Done | P0 | configuration | start first-run bootstrap and token gating | [2026-04-07-start-first-run-bootstrap-and-token-gating.md](features/configuration/2026-04-07-start-first-run-bootstrap-and-token-gating.md) | 2026-04-07 | `start` now requires default Slack or Telegram tokens, bootstraps only available channels, and auto-creates the first default agent only when the CLI choice is unambiguous. |
| Done | P0 | configuration | channel fast start and credential persistence | [2026-04-13-telegram-fast-start-and-credential-persistence.md](features/configuration/2026-04-13-telegram-fast-start-and-credential-persistence.md) | 2026-04-13 | Explicit Slack and Telegram bootstrap now support inline or env-backed input, canonical credential files, mem or tokenFile source states, and persistence flows without storing raw secrets in config. |
| Done | P1 | configuration | bot type first-run flag and quick-start refresh | [2026-04-13-bot-type-first-run-flag-and-quick-start-refresh.md](features/configuration/2026-04-13-bot-type-first-run-flag-and-quick-start-refresh.md) | 2026-04-13 | Public first-run docs and help now use `--bot-type personal|team`, keep `--bootstrap` as a compatibility alias, and lead onboarding with Telegram-first quick start plus `--persist`. |

## Update Rules

- Add a task to `Active` only when someone is actually working it.
- If work pauses mid-batch, update the active row note with the real stop state.
- Keep `Planned` prioritized from most important to least important.
- Move blocked work to `Blocked` instead of hiding it in notes.
- Move intentionally abandoned or no-longer-needed work to `Dropped`; do not silently delete it.
- Move finished work to `Done`; do not delete it.
- Keep notes to one short sentence.
