Ground truth: Phase 1a/1b/2 complete (E1–E8, E10–E12, E4.5, gh read ops, TOLE_* env). 114/114 tests, CI 12/12. 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) are complete — code is authoritative over this doc. Track C (E9) in progress; MCP client shipped ahead of schedule (#74).
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): cross-build CI (aarch64-android, aarch64-apple-ios), timeout/truncation fuzz-lite, perf doc, LICENSE/README publish. MCP client shipped (#74, closed 2026-09-12). Session branching still 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): MCP Streamable HTTP + thin REST, token auth, server-side durable sessions, per-session workspace jails. Est: M–L.
A1 → A2 → B1 → B2 → B3 → B4 → Track C → D1 → D2 → D3
↑ all of Track A/B done; C in progress
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).