All notable changes to this project will be documented in this file.
Format follows Keep a Changelog. Versioning follows Semantic Versioning.
Comprehensive code quality, type safety, and security hardening pass driven by full deployment readiness audit.
- Parallel KB queries —
adjutant kb query-allqueries all registered KBs concurrently viaasyncio.gather(), reducing pulse time from ~7 min to ~80s with 6 KBs. Uses each KB'squery_hintfor targeted questions. (capabilities/kb/query.py,cli.py) - Cross-KB synthesis —
adjutant kb cross-query "question" --kbs a,bqueries multiple KBs in parallel, then synthesizes a unified cross-domain answer via a synthesis prompt. (capabilities/kb/query.py,cli.py) - Morning brief —
adjutant briefproactive daily summary combining KB status, deadlines, pending insights, and priority alignment. Designed for phone readability (<800 chars). (prompts/morning_brief.md,lifecycle/cron.py,cli.py) - Self-assessment —
adjutant self-assessweekly introspection evaluating notification effectiveness, priority alignment, and KB health. Proposes changes toinsights/pending/for user review — never modifies identity files directly. (prompts/self_assess.md,lifecycle/cron.py,cli.py) - Graduated autonomy config —
autonomysection inadjutant.yamlwith levels 1-4 (notify-only → fully autonomous),auto_approveandrequire_approvallists. (core/config.py) - Active operation tracking — pulse and review write
state/active_operation.jsonwhile running, allowing external clients to observe operation state without holding open connections. Staleness detection auto-cleans markers older than 30 minutes with dead PIDs. (core/lockfiles.py,lifecycle/cron.py) - Post-completion notifications — after a successful pulse or review, a Telegram notification is sent with a summary of KBs checked, issues found, and escalation status. Budget-guarded, best-effort. (
lifecycle/cron.py) - Active operation markers for Telegram
/pulseand/reflect→/confirmpaths (messaging/telegram/commands.py)
lifecycle/cron.py: replacedos.execvpwithsubprocess.runso Python keeps control for marker management and notification dispatch. Exit code propagated viasys.exit(). Newactionandsourcekwargs onrun_cron_prompt(),pulse_cron(),review_cron().
- Feature gate in dispatch now fails closed — rejects gated commands when config is unparseable
- Installer Python version check corrected from
>=3.9to>=3.11to matchpyproject.toml
- 4 real type bugs:
Pathpassed asintin search command,str/intmismatch in listener watchdog,Path/strvariable shadow in self-updater, nonexistentcwdkwarg in identity setup - Wrong function names in repair module (
get_status→listener_status,start_service→listener_start) - Wrong argument types in KB wizard (
strwherePathexpected)
- mypy --strict: 51 → 0 errors — full type annotations across all 72 source files
- ruff: 0 critical errors — 24 unused imports removed, 23 line-length violations fixed, import sorting,
Optional[X]→X | Nonemodernization - Removed dead
feedparseroptional dependency (declared but never imported) - Removed 5 vestigial
main_*CLI wrappers fromlifecycle/control.py - Renamed
_resolve_command→resolve_command(was private but imported publicly in CLI) - Refactored
control.pyto delegate PID/process operations tocore/process.py(eliminatedpgrepsubprocess duplication) - Annotated 36 silent exception swallows with
# noqa: BLE001and rationale comments - Added stderr fallback to
_adj_logwhen logging infrastructure itself fails - Fixed ambiguous variable names (
l→line/entryin list comprehensions)
- 1,289 tests passing (up from 1,257)
- 3 new tests for fail-closed feature gate behavior
- 12 new tests for active operation tracking (
test_lockfiles.py) - 12 new tests for cron notification and marker lifecycle (
test_cron.py)
- Updated deployment readiness evaluation prompt to reflect Python architecture
- Generated full deployment readiness assessment (
docs/reference/2026-03-16-deployment-readiness.md)
Complete rewrite from bash to Python. New architecture, new capabilities, comprehensive test suite.
- Full Python rewrite — all bash scripts replaced with
src/adjutant/Python modules - Hatchling build system, Python >=3.11, CLI via Click (
adjutantentrypoint) - Listener → dispatch → adaptor pipeline with full backend abstraction
- Pydantic-based configuration with typed models
- Structured logging via
adj_log() HttpClientwrapper around httpx for all HTTP calls- NDJSON result parsing for Claude sub-agent output
- Telegram adaptor:
send.py,listener.py,photos.py,commands.py,chat.py,notify.py - Backend-agnostic command dispatcher with sliding-window rate limiting
- Feature-gated commands (
/screenshot,/search) rejected at dispatch if disabled in config - Listener processes all updates in each poll batch sequentially — no dropped messages
- Natural language chat via Claude agent with in-flight job supersession
- Knowledge bases — sandboxed sub-agent workspaces (create, list, remove, info, query, write, run)
- Screenshots — Playwright screenshot with auto cookie-banner dismissal + vision caption
- Vision — LLM vision analysis of image files
- Search — web search via SearXNG
- Scheduling — cron-based job scheduling with KB operation support
- News — fetch → analyze → briefing pipeline with configurable feeds
- Scheduled autonomous pulse checks query all registered KBs on a configurable cron schedule
- Daily review synthesizes pulse findings and sends Telegram notifications for significant insights
- Machine-readable action ledger (
state/actions.jsonl) - Hard notification budget counter — date-scoped, independent of LLM
- Dry-run mode in all autonomous prompts
- Persistent long-term memory system — remember, recall, forget, digest
- Auto-classification of facts and patterns
- Memory digest for periodic consolidation
- Start, stop, restart, pause, resume, kill — full process lifecycle
- Self-update from GitHub releases with semver compare, backup, and SHA256 checksum verification
- Detached restart with proper
ADJUTANT_HOMEand cwd propagation - Symlink-safe CLI shim
- Interactive setup wizard with modular steps (identity, credentials, features, autonomy, service)
- Curl-style installer (
src/adjutant/setup/install.py) — prereq check, download, extract, wizard - Repair command for fixing broken installations
- macOS launchd service integration
adjutantentrypoint with subcommands:start,stop,restart,update,status,pause,resume,kill,notify,screenshot,search,news,rotate,kb,schedule,logs,doctor,setup,repair,uninstall,help
- Three-layer identity:
soul.md(stable values),heart.md(personality),registry.md(operational facts) - All identity files are user-specific and gitignored; example templates provided
- ~1160 tests across ~54 unit test files and integration tests
- Covers CLI, dispatch, all capabilities, lifecycle, setup, messaging, and config
- Prompt injection guard in agent system prompt, pulse, review, and escalation prompts
- Sender authorization via
msg_authorize()hook - Rate limiting: sliding-window counter, configurable via
adjutant.yaml - Credential isolation:
.envnever sourced directly; credentials extracted by key - SHA256 checksum verification for downloaded release tarballs
.github/workflows/release.yml— tag-triggered release workflow with tarball + checksumVERSIONfile as source of truth- Docusaurus documentation site (
site/)
install.sh: refactoredresolve_version()andprompt_install_dir()to use global variables instead of subshell capture, eliminating stdout pollution that corrupted the download URLinstall.sh/update.sh: corrected download URL fromapi.github.comtogithub.comreleases endpoint- Wizard: added top-level Telegram skip prompt in Step 4; answering
ndisables messaging setup entirely and setsWIZARD_TELEGRAM_ENABLED=false - Wizard: screenshot and vision features now auto-disabled (with explanation) when Telegram setup is skipped
- Wizard: added inline loading indicator before slow
npx playwright --versioncheck in Step 1 - Wizard dry-run: all prompt helpers now accept real user input in dry-run mode (previously auto-accepted defaults)
- Wizard: added news source configuration instructions shown immediately after enabling the news briefing feature
startup.sh: added post-startup PID sync block to recover missing lock/PID files after listener restarts
Initial release. Bash-based framework with Telegram messaging, knowledge base sub-agents, and basic lifecycle management.