Ground truth: Phase 1a/1b/2 complete (E1–E8, E10–E12, E4.5, gh read ops, TOLE_* env). Replan 2026-08-27: chat-first direction per PRD v1.1 §0 Identity. Status sync 2026-09-18 (v0.3.0): Track A (A1–A2) and Track B (B1–B4) complete; MCP client shipped ahead of schedule (#74). Status sync 2026-10-05 (v0.5.0 on crates.io): Tracks C and D complete (E9 closed 2026-09-28; D1–D3 all shipped — D1 in v0.4.0, D2 2026-09-18, D3 2026-09-28). Post-D3 work is shipped too (see the Post-D3 section). 298/298 workspace tests, CI green. Code is authoritative over this doc. Status sync 2026-10-06 (pre-0.6.0): the 0.6.0 train (#168–#185) is fully merged to develop — see the Post-D3 section.
tole = a durable conversational harness — a personal-assistant chatbot
that can call tools, with persistent resumable sessions. Light coding via
tools (files + git + gh). Optional first-class integrations: uteke (memory,
documents), cora-code (code intel). Dynamic tools via a generic
approval-gated run_command — no config DSL.
E1 storage · E2 state machine · E3 mock provider · E4 cora search + real
provider · E4.5 native tool calling · E5 crash-resume · E6 approval gates ·
E7 tool suite · E8 MVP gate (real issue fixed, retro in docs/e8-retro.md)
· E10 loop guard · E11 secret redaction · E12 file CRUD (hash-anchored
edit) · gh read ops · TOLE_* env canonical.
- What:
--allow <risk>:<tool>(repeatable), e.g.--allow write:edit_file. Pre-authorizes specific Write tools for headless/CI runs. - Hard rule: Destructive is never allowlistable — structural enforcement stays (registry + AllowlistApprover deny on sight).
- Acceptance: headless run completes with edit_file pre-authorized while other Write tools still deny; Destructive attempt with allow flags still denied. Unit tests for the flag parser + approver wiring.
- Est: S
- What:
gitbuiltin:status,diff,add,commitops, argv whitelist discipline identical to gh.rs (validated per-op args, no free-form flags). Push stays manual. - Why: closes the last maintainer intervention in the coding-lite loop (branch/commit). Also the natural companion for the markdown→uteke document workflow (write_file → git commit → uteke_document).
- Acceptance: agent commits a change end-to-end in a sandbox repo;
injection attempts (
--upload-pack, leading-dash messages) rejected; fake-git e2e test (same pattern as fake-gh). - Est: M
- What: multi-turn REPL: prompt → agentic turn (durable, exactly like
run) → answer → next prompt.--resume <id>/--lastto continue. Explicit resume (no implicit auto-continue) — deliberate state transitions. Clean EOF//exit, Ctrl-C safe (resume-able mid-turn). - Acceptance: multi-turn conversation in one session; SIGKILL mid-chat
→
tole chat --resume <id>continues with full context;/exitleaves a cleanly closed session. - Est: M
- What: resolution
--systemflag >TOLE_SYSTEM_PROMPTenv > default. Persisted in the session header (once, not per-turn — token efficient, replay-accurate). Analysis note: persona must stay stable across resume; sessions recorded pre-B2 (no system prompt) must remain replayable (backward-compat test). - Acceptance: persona consistent across turns and resume; old session replay still green.
- Est: S–M
- What:
tole sessions list(id, age, turn count, last-message preview, usage) andtole sessions show <id>(timeline view). Branching deferred. - Acceptance: list + inspect without opening JSONL by hand.
- Est: S
- What:
run_commandbuiltin: input{ "command": "..." }→ shlex-parsed to argv (no shell), cwd-jail, subprocess timeout + output cap. Risk ceiling = Write (Destructive unreachable). Approval prompt shows the exact argv; headless via A1 pre-auth.- Startup probing: builtins whose binary is missing (gh/uteke/cora) are skipped with one warning line — no phantom tools burning turns.
- uteke first-class:
uteke_document(save markdown into a room), plus existing recall. Renamesuteke_search→uteke_recall(name/behavior consistency).
- Why: no TOML DSL (rejected — poor UX); any host CLI becomes usable with zero recompilation; uteke is the primary assistant integration.
- Acceptance: agent uses run_command to invoke a non-builtin binary
(e.g.
figlet) approval-gated; missing-binary builtin skipped with warning; uteke_document saves a markdown doc into a room (validated against the uteke CLI); rename with spec + tests updated. - Est: M–L
E9 hardening/OSS-prep (issue #9) complete: cross-build CI (#82), timeout/truncation fuzz-lite + panic-free corpus (perf PR), perf thresholds + docs/perf.md, LICENSE/README/SECURITY public-ready (#79, #91). MCP client shipped early (#74). Session branching stays deferred.
tole-core gains three hosts beyond the CLI, in build order (each reuses the previous layer):
Expose the registry's hardened tools via rmcp's server side. ReadOnly tools
always callable; Write needs --allow; Destructive structurally absent.
Est: S–M.
Editor integration (Zed et al.): ACP sessions ↔ JSONL sessions, ACP permission requests ↔ the approval gate, streaming turn events. Est: M.
Long-running daemon (uteke-serve pattern): thin REST (v1, #96) +
multi-session MCP over Streamable HTTP (--transport mcp, #137) —
one authenticated connection, N durable sessions, per-session jail
routing via session_id. Est: M–L.
Everything below is merged; CHANGELOG entries carry the detail.
- v0.4.0: harness memory loop (
--memory uteke/TOLE_MEMORY), cora MCP auto-preset (--no-auto-mcpopt-out), write_file wire-schema fix, 2026-09-18 CodeCora scan triage fixes, serve hardening Wave 2 (#136: connection cap, auth rate-limit, IO timeouts). - v0.5.0 (2026-10-02):
verify_package(#144, the slopsquatting defense), turn-end stop gates--on-turnend(#145), memory-loop decision typing (#143), multi-session MCP-over-HTTP (#137/#138), ACP scan minors (#156). - Post-0.5.0:
--trustpresets (#160), SKILL.md support (--skill+ discovery +load_skill, #161/#162). - 2026-10-05 sweep fixes (#163/#164): loud refusals for
client-session-only flags on the server faces;
--sessions-dirhonored by serve/acp;--workspacehonored byserve --transport mcp;--on-turnendwired into serve/acp; the #138 ambiguity refusal implemented; skills discovery defaults to cwd. - 2026-10-05 activation fix (#165/#166):
TOLE_TRUSTenv actually read (was documented but unimplemented). - 0.6.0 train (merged to develop 2026-10-05/06):
mcp-httpbecomes a defaulttole-clifeature (#168 — every documented face works on a plain install); thegiteatool (#169); the v0.5.0 Tier-2 baseline + HOME-scrubbing eval archiver (#170);systemone_decidetyped decisions (#172/#173); depth-1 child agentsagent_start/agent_poll(#171/#174); the no-mcp build gate fix (#175/#180); ACP native model picker + per-session approval controls (#176/#177/#179); ACPsession/cancel(#178/#184); project-sync board-sync fixes (#181/#182, #183); RESTPOST /sessions/{id}/cancel+ thetole_session_cancelMCP tool (#178/#185) — cooperative cancellation now exists on all three server faces (ACP, REST, MCP), spec-conformant (the receiver may ignore un-cancellable work; single-tool calls are not interrupted). - 0.7.0 Mission MVP (merged to develop 2026-10-06; identity
extended owner-approved — chat-first personal assistant WITH a
mission mode for autonomous work): durable task-list tools
todo_write/todo_read(#198/#205);tole missionbudgeted turn-chaining with--max-steps/--max-minutes/--max-tokens/--verifyand durable mission summaries (#199/#206); budget tiers + cost report (#201/#207); ACP intra-turn visibility + true text streaming (#196/#203/#204); ACP model picker auto-advertised from the provider/modelsendpoint (#195/#197); remote approvals via the serve face — queue, decisions, expiry, CLI consumer (#200/#214); run ergonomics--prompt-file/--name/--timeout(#216/#219); read-onlyweb_fetch/web_searchSSRF-guarded (#215/#221, three CodeCora review rounds); startup update notification +tole upgrade(#220/#222, fleet-parity with uteke/cora); the mobile-control guide (#202/#218) defines the 0.9.0 surface. - 0.7.1 Hardening patch (released 2026-10-08):
pre-tag rescan MAJORs #226–#235 and rescan-2 #276–#287 fixed (env
scrubbing, MCP approval-prompt sanitizing, redirect/NUL/argv hardening,
mailbox consume-once, perf-gate and tmpdir test fixes); follow-ups
#293 (no hardcoded
ghrepo), #294 (plan mode in the MCP server registry), #295 (one session-id rule), #299 (ACP session cap), #300 (agent_pollis Write); one crate-internal tool-call authorization gate used bydrive,resume_turnand the MCP server path (#303, PRs #304/#309/#312). Behavior changes:AllowlistApprover::new(_, Deny|Ask)ignores patterns (#283),agent_pollis Write (#300), embedder registries with pre-hooks are enforced on the MCP path (#303). - 0.7.2 Maintenance patch (released 2026-10-08):
scan backlog closed — systemone error bodies surfaced (#328),
write_fileandgit status/difflimitations documented accurately (#329), the bare--no-default-featurestole-cli profile compiles and is CI-checked (#330); Dependabot PRs no longer blocked by naming/description/CLA checks (#322 plus a ruleset context change); dependency bumps (rmcp 3.5.0, tokio 1.53.2, libc 0.2.190, uuid 1.27.0). No behavior changes. - 0.8.0 Project config
.tole/config.toml(#208) (released 2026-10-09): merged to develop 2026-10-09 (parts #342/#343/#345/#346). Strict TOML schema, content-bound trust store outside the repo, fail-closed gate on the protocol faces,tole config check|trust|untrust, precedence flag > env > config > default for every key (lists replaced wholesale, booleans only turned on by flags), and refusal of config-sourced hooks/skills/MCP servers on the faces that refuse the flags. - 0.8.1 Token-efficiency patch (#211) (released 2026-10-09): usage and per-step request-size report in
tole status/serve status (#356),read_file20,000-char cap withoffset/limitcontinuation (#357), wire-size reference missions with a CI bound (#358), two scan-found fixes (#360); scan backlog in #361. Deferred: lazy tool registration, history trimming, non-cached budget accounting.
A1 → A2 → B1 → B2 → B3 → B4 → Track C → D1 → D2 → D3 → Post-D3
↑ all tracks done; see the Post-D3 section
A-track first: small, closes the coding-lite promises and unblocks headless testing patterns reused by B4's run_command. B1 is the keystone; B2 touches the session header (do it before B3/B4 so the format migrates once).