You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Decide which changes need to be ported into this fork.
Track any fork-specific conflicts before merging or cherry-picking.
Upstream release notes
ductor v0.19.0
The biggest community release so far: Slack becomes ductor's third chat transport, reasoning effort gets a first-class /effort command, and a wave of contributor PRs makes background tasks, cron delivery, and Codex noticeably more reliable. Ten merged PRs, four squashed bugs — thank you all. 💜
TL;DR
Slack transport — run your agents from Slack (Socket Mode, wizard setup, native streaming, all 8 languages). Install with the slack extra.
/effort — set reasoning effort per chat/topic, now for Claude (--effort, including max) and Codex. Every topic keeps its own level.
Topic-scoped process kills — /model, /new, /reset, and error recovery no longer abort other topics' in-flight work or background tasks.
Background tasks hardened — completed results survive cancel races, resume can't overlap a live run, DUCTOR_TASK_ID finally reaches task subprocesses, and finished-task history prunes itself.
Cron delivery tracking — if Telegram is down when a cron result lands, you'll see it (last: success (delivery failed)) and the full result is preserved for resend instead of vanishing.
Codex prompts via stdin — no more Argument list too long, and prompts stay out of /proc and logs. Codex resumes also re-assert your selected model and effort now.
append_system_prompt_files — inject your own files (glossary, style guide, …) into the system prompt on every turn.
Selector polish — model and effort keyboards render two buttons per row instead of one unreadable line.
@victor-develop battle-tested this in a long-lived fork and backported it upstream: a full Slack transport speaking the same orchestrator as Telegram and Matrix — Socket Mode (no public webhook needed), onboarding wizard integration, thread-aware routing, media, and Slack-native streaming with graceful fallback. Config mirrors the Matrix pattern (pip install "ductor[slack]", then ductor onboarding). Closes PleasePrompto#165.
@ryuhaneul brought effort to parity with model selection: /effort (or the thinking-level step in /model) applies to the current chat or topic only, the main chat sets the global default, and /status shows the active level. Claude gains --effort support for the first time (low … max); Codex keeps -c model_reasoning_effort — now actually switchable at runtime.
Task history retention (fix(tasks): prune finished task history PleasePrompto/ductor#138, @attid) — tasks.json stops growing forever: finished tasks are pruned by age (finished_retention_hours, default 7 days) and count (finished_keep_last, default 100), running/waiting tasks are never touched.
Startup survives unreachable users — a configured user who never pressed /start ("chat not found") no longer crashes the boot notification path.
Codex
Prompts via stdin (fix(codex): pass prompts via stdin PleasePrompto/ductor#137, @attid) — ductor's composed prompts (hooks + memory + context) could exceed the OS argv limit; they now stream through stdin on all platforms, which also keeps them out of /proc/<pid>/cmdline. The streaming path feeds stdin concurrently, so >64 KiB prompts can't deadlock.
Upstream published a new release: v0.19.0.
Suggested follow-up
Upstream release notes
ductor v0.19.0
The biggest community release so far: Slack becomes ductor's third chat transport, reasoning effort gets a first-class
/effortcommand, and a wave of contributor PRs makes background tasks, cron delivery, and Codex noticeably more reliable. Ten merged PRs, four squashed bugs — thank you all. 💜TL;DR
slackextra./effort— set reasoning effort per chat/topic, now for Claude (--effort, includingmax) and Codex. Every topic keeps its own level./model,/new,/reset, and error recovery no longer abort other topics' in-flight work or background tasks.DUCTOR_TASK_IDfinally reaches task subprocesses, and finished-task history prunes itself.last: success (delivery failed)) and the full result is preserved for resend instead of vanishing.Argument list too long, and prompts stay out of/procand logs. Codex resumes also re-assert your selected model and effort now.append_system_prompt_files— inject your own files (glossary, style guide, …) into the system prompt on every turn.Slack transport (PleasePrompto#114)
@victor-develop battle-tested this in a long-lived fork and backported it upstream: a full Slack transport speaking the same orchestrator as Telegram and Matrix — Socket Mode (no public webhook needed), onboarding wizard integration, thread-aware routing, media, and Slack-native streaming with graceful fallback. Config mirrors the Matrix pattern (
pip install "ductor[slack]", thenductor onboarding). Closes PleasePrompto#165.Per-session reasoning effort (PleasePrompto#164)
@ryuhaneul brought effort to parity with model selection:
/effort(or the thinking-level step in/model) applies to the current chat or topic only, the main chat sets the global default, and/statusshows the active level. Claude gains--effortsupport for the first time (low…max); Codex keeps-c model_reasoning_effort— now actually switchable at runtime.Reliability
/stopalways promised.DUCTOR_TASK_ID(Background task ask_parent cannot see DUCTOR_TASK_ID in some runs PleasePrompto/ductor#159, reported by @Tony-ooo) —ask_parent.pyno longer dies with "DUCTOR_TASK_ID not set"; the id is derived from the task's process label and injected into the subprocess env (Docker included).cron_jobs.json; on delivery failure the original result text is kept so it can be resent without re-running the job.tasks.jsonstops growing forever: finished tasks are pruned by age (finished_retention_hours, default 7 days) and count (finished_keep_last, default 100), running/waiting tasks are never touched.Codex
/proc/<pid>/cmdline. The streaming path feeds stdin concurrently, so >64 KiB prompts can't deadlock./modelchanges now apply to already-running Codex sessions on resume instead of being silently ignored (verified against the realcodex exec resumegrammar).gpt-5.2-codexare gone.Also in this release
append_system_prompt_files(feat(config): inject configurable files into the system prompt PleasePrompto/ductor#157, @ryuhaneul) — workspace-relative files appended to the system prompt on every agent-driven turn (chat, named sessions, tasks, inter-agent); path-traversal safe, 256 KiB cap per file./modelpersists in fresh topics (fix: persist /model selection in topics whose session is missing or stale PleasePrompto/ductor#169, @ryuhaneul) — selecting a model in a topic without a live session no longer silently discards the choice; count-based staleness now resets only the affected provider bucket instead of wiping all bucket history.sudo) no longer crashes onloginctl enable-linger./modeland/effortkeyboards are readable on phones again.Merged PRs
And thanks to @Tony-ooo, @SpriteOvO, and @abhisheksoni27 for the sharp bug reports and the Slack nudge. 🙏
Verification
pytest -p xdist -n 8— full suite green (4,000+ tests, incl. the new Slack suite)ruff format --check .,ruff check .— cleanmypy ductor_bot— clean (251 files, strict)/model,/effort(flag verified in CLI argv), background task env, Codex stdin pathductor --version→ductor 0.19.0Full changelog: PleasePrompto/ductor@v0.18.2...v0.19.0