v0.3.67
52 commits since v0.3.66. 104 files changed, +11090 / -3413 lines.
✨ Features
1df3c044Multilanguage prompt analyzer: shared PromptAnalyzer with soft-nudge on TUI and Telegram, 6 language packs (EN/ES/FR/ID/PT/RU) (#518, #538)7b7ea4d6Plan-state copy lock: F3 plan-state copy lock and /show-plan demotion (ADR 0005)ad3e04aeGoal chrome: F3 goal chrome with turn-local retention (ADR 0005)1ab25268Per-heading plan prose: F3 per-heading plan prose in flow chrome (ADR 0005)84b2ed5eArchive at turn settle: archive completed plan at turn settle, not mid-complete (ADR 0005)9ac48392Always-visible title: F2 always-visible title and full checklist chrome (ADR 0005)356e21baUncollapsed flow shell: F1 uncollapsed flow shell with merged footer (ADR 0005)797a6d6fWeb search retry: rotate User-Agent and retry DuckDuckGo 403s (#525)6c9b5084Telegram rate-limit retry: retry telegram_send on 429 rate limits (#524)14a1303dConfig reload feedback: surface silent config.toml hot-reload recovery to the user (#534)6ab209ceChannel context header: include chat_id/thread_id in the [Channel: ...] prompt header (#533)96648fb1Provider-aware narration cap: make folded-narration cap provider-aware (#532)9eab3285Approve/Discard flow: D3 Telegram Approve/Discard flow chrome and TUI plan overlay (#521)f25278c1Dual-track prompts: D2 dual-track prompts, state-branched compaction recovery (#521)93414269Design-track commands: D1 commands, Approve validator, seed turn, design-track soft-nudge (#521)756bdd05Plan tool contract: C3 plan tool contract, design/checklist tracks, goal wiring (#520)f457593dSession markdown mirror: C2 session markdown mirror and plan-file-changed reloads (#520)99bc0f8dTool-loop write gate: C1b tool-loop write/bash gate and Active .md freeze (#520)39641597Lifecycle engine core: C1a lifecycle engine core, Editing/Active status model with durable pre-init flag (#520)491c4d24Merged flow message: merge pre-flow into the flow message, flow chrome sections (#519)
🔧 Fixes
297bcb64task_type enum: document the full task_type enum and log the Other fallback18971beaNon-empty description: require a non-empty description on every task entry point675e4cf2Checklist validation: enforce required root title and description on checklist imported7476aaReact-only marker: keep react-only marker so claude-cli turn ends cleanly3baf00af/models provider: /models command shows session provider instead of globald8bd3de7React-only turn: surface a long no-tool react-only turn instead of silently dropping it (#546)a1f62fe7Goal cleanup: clear the session goal on plan discard19b11029Checklist defaults: assign order and default complexity on checklist import7e1021bcHeader-only cleanup: clean up the header-only flow block on a react-only turn (#544)b3c3eab7Design prose display: surface design prose in /show-plan and point chrome at itb606e7d6Plan keyboard re-attach: re-attach plan keyboard after flow restickcd178879Bot menu commands: register plan mode commands in bot menu (#537)ce3c008bShell escaping: context-aware shell escaping so double-quoted params are safe (#523)a327e1d9@bot mention strip: strip @bot only as a command suffix, preserve standalone mentions (#528)024e0cc2Reaction markers: accept keyword-less <> reaction markers35c5891fWorking header: show the 'Working on: ' header for claude-cli turns (#527)6926ba2bReaction terminators: accept and bare > as reaction-marker terminators08993632Session model/provider: resolve Runtime Info model/provider per session at prompt injectioncd0c4782Attachment handling: preserve attachment names, store directed files durably, organize channel_attachments by platform (#513)09ee09f0Double gear dedup: dedup the double gear when the live header status is the bare-tool fallback
📖 Documentation
e295b307Seed plan-mode umbrella SSOT, cluster ADRs and specs11b708f3Correct stale status and approved_at semantics in the live spec150a6572Fix self-contradiction on when the analyzer sets pre_init_editing1465fa39Drop phantom execution_history and reflection from the spec82c8e8e3Describe async project/profile-aware session dir resolution
🧹 Miscellaneous
12b6386dDrop deprecated task_manager from the tool catalog81496afdDrop orphaned plans/plan_tasks tables54611a75rustfmt the /execute BotCommand registration31ff3990Remove unused opencli skill pointing at unbundled binary (#536)87180a31Retire orphaned Plan/PlanTask row models, CHANGELOG for the lifecycle engine (#520)89ead77fResolve session dir async, project/profile-aware
📊 Stats
- 52 commits since v0.3.66
- 104 files changed, +11090 / -3413 lines
- 4938 tests (4938 passed, 0 failed, 29 ignored)
🗑️ Removed
openclibuilt-in skill (#536): dropped the skill whoseSKILL.mdadvertised 25+opencli-rsdynamic tools (hn_top,twitter_trending,google_news, and others) that require a separateopencli-rsbinary and a daemon on port 19825. Nothing shipped or provisioned that binary, so on a stock build the skill loaded a doc describing tools that were never registered. Usage history confirms zero successful executions of any opencli-rs tool. Removed theBUILTIN_SKILLSregistration, the template directory, and the README and BRAIN_CONSTITUTION references.
✨ Features
- Plan mode UX (#521): the user-visible product on top of the lifecycle engine.
/plan,/show-plan,/executeand/discardland on TUI and Telegram; the Approve validator scans the session.md(Context labels filled, at least one numbered step) and a passing/executesets Active, stampsapproved_at, and dispatches one visible seed turn that converts the numbered steps into the checklist and starts task 1. Approve and/executeare refused while a turn runs (never queued);/discardcancels the turn first. The shared soft-nudge swaps the plan hint to the design track and plan keywords durably enter Plan mode. Prompts now teach SESSION PLAN vs CHECKLIST with the locked track-selection table, every Editing turn pins the plan-mode rules, compaction recovery branches by plan state and the summary carries a harness-written PLAN STATE block, and the deprecatedtask_managertool left the preamble and catalog. On Telegram, Approve/Discard inline buttons (owner-only in groups,plan:callback prefix) plus Editing/Building-checklist chrome ride the latest flow message; on the TUI,/show-planopens a scrollable plan overlay with approve/discard keys, and the checklist strip shows Building checklist… or seed-error while the seed window is open. - Plan lifecycle engine (#520): plans live as NoPlan / Editing / Active. The seven-value status enum collapsed to Editing and Active with a legacy map on load (Completed archives silently under
agents/session/archive/, Cancelled deletes, old draft checklists stay executable), all plan IO goes through one shared store (src/utils/plan_files.rs), and a durablepre_init_editingsidecar survives restarts. A tool-loop gate enforces the Editing write policy: pre-init denies project writes but allows exploratory bash, post-init Editing denies all bash and allows writes only to the session plan.md(whose body mirrors into the JSONdescriptionon save), and Active freezes the design.md. The plan tool gainedmode(design or checklist),add_tasks(withadd_taskkept as an alias), Active-onlystart/completewith deterministic Editing refusals, import rules, archive-on-last-complete, and acceptance criteria that set the session goal while a task runs; auto-approve on firststartis gone, and the dormant SQLite plan path (PlanService,PlanRepository, row models) is retired. - Telegram flow chrome merge (#519): one live flow message per turn. The pre-flow status bubble is gone; thinking and Working-on previews ride the flow header from the first activity tick, all three renderers support header-only output (empty entries still emit the header), and no-tool long turns open and settle a header-only Processing log. The ctx footer moved off final answers onto the settled flow message, plan title, checklist progress (from the live session plan JSON), and the active goal one-liner render as always-visible flow sections via one shared section builder, and crash-recovery resume now shares the same open-early, live-duration, and settled-header path as live turns.
- Shared PromptAnalyzer soft-nudge on TUI and Telegram (#518): the keyword analyzer moved from
src/tui/prompt_analyzer.rsto the sharedsrc/utils/prompt_analyzer.rsand now runs on both surfaces. Plan hints teach the live tool contract (init,add_task,start) and explicitly reject the deadcreate/finalizeoperations. Hints are LLM-only (appended to the agent input, never to Telegramdisplay_textor TUI chat bubbles), and slash commands plus skill/user-command expansions are never analyzed on either surface.
Full Changelog: v0.3.66...v0.3.67