Completed¶
| Phase | Description | Date |
|---|---|---|
| 0 | Repo setup from nanobot at b429bf9 |
2026-02-12 |
| 1 | Strip and simplify (8,500 → ~2,800 lines) | 2026-02-12 |
| 1.5 | Re-add cron service with heartbeat | 2026-02-12 |
| 2 | Progressive knowledge base | 2026-02-13 |
| 3 | Self-improvement skills (reflect, evaluate, improve) | 2026-02-13 |
| Post-3 | Streaming, observability, CLI, Firecrawl, TODO tracking | 2026-02-13 |
| 4 | Loop reliability (budget, error recovery, tracing, sessions) | 2026-02-21 |
| 5 | JSON channel (NDJSON stdin/stdout protocol) | 2026-02-21 |
| 6 | Foundation (daemon, browser, TUI dashboard, observability, depth tracking) | 2026-02-21 |
| 7 | Application skills (a11y, test automation, KB sync, web dashboard) | 2026-02-21 |
| 8 | Core extensibility (MCP, plugins, eval, token tracking, sub-agent supervision) | 2026-03-03 |
| 8.5 | System prompt consolidation + context quality | 2026-03-12 |
Phase 8.5 delivered: Collapsed SOUL.md/USER.md/IDENTITY.md/TOOLS.md into single AGENTS.md (SOUL+USER as sections, TOOLS replaced by dynamic builtin listing, IDENTITY always from inline fallback). Deleted dead workspace/memory/MEMORY.md artifact. Added workspace tree to system prompt (depth-2, cached per session, invalidated on file write). Added tool output offloading — exec/web_fetch results > 4k chars saved to tmp/ with read_file reference. Write policy simplified: only AGENTS.md protected. Project-local TODO.md guidance added. L1-L5+ER evals all 100%; L6-pipeline flaky (pre-existing: sub-agent PathGuard blocks absolute eval tmp paths).
Phase 8 delivered: MCP client with FastMCP (stdio + streamable HTTP, Claude Desktop-compatible config, tool allowlisting, description hashing), entry-point plugin discovery (picobot.tools), tool group registry with dynamic tool search, eval framework (26 tasks across 6 levels, 7 grader types, 100% pass rate), AgentResult with full token/cost metrics, sub-agent token tracking, sub-agent supervision model (stop hook, message queue, overdue nudges, enriched status checks, cancel, restrict tools, efficiency preamble), expected_duration/timeout on spawn. OTel and ToolRegistry composition deferred to Phase 9.
Upcoming¶
Phase 9: Capabilities¶
Features that build on Phase 8 infrastructure. Each is independent and can be done in any order.
-
Personal RPA skill — Thin orchestration layer on existing Playwright + cron + agent loop. "Explore-replay-heal" pattern: AI discovers workflow once, compiles to deterministic Playwright steps, re-invokes AI only when selectors break. Hybrid YAML workflow format with both selectors and natural language descriptions. Credentials via Python
keyring(OS-native). Position as "last resort when no API exists" — not a general automation platform. ~500-800 LOC. See research/personal-rpa. -
Channel integrations —
BaseChannelABC with Telegram and Slack implementations. In-process viaprocess_direct()(not NDJSON subprocess). Telegram:python-telegram-botwith long polling, streaming viasendMessageDraft(API 9.3). Slack:slack-boltSocket Mode, streaming viachat.startStream/appendStream/stopStream. Session keys:channel:chat_id. ~1,100-1,500 LOC total (350-450 per adapter + gateway + markdown conversion). See research/channel-integrations. -
MCP server mode (~300-500 LOC) — Expose picobot's unique tools (KB, sub-agents, cron) as MCP server via FastMCP. Stdio transport for Claude Desktop/VS Code integration, Streamable HTTP for remote access.
picobot serve-mcpCLI command. Fills a gap in the MCP ecosystem — no existing server offers progressive KB or sub-agent orchestration. See research/mcp-support.
Phase 10: Scale¶
Features with higher complexity or dependency cost. Build only when there's demonstrated need.
-
Semantic search — Three-retriever hybrid search: frontmatter tags (existing) + SQLite FTS5 BM25 in-memory + numpy vector search, fused via Reciprocal Rank Fusion. Nomic embeddings (
nomic-embed-text-v1.5, 768d, local+remote unified). HyPE (Hypothetical Question Embedding) at index time for intent-based agent queries (+42pp context precision). Embeddings cached in gitignored.npzsidecar.nomic[local]is a required dependency. Graduate to faiss-cpu at 5K docs, ChromaDB at 10K+. See research/kb-retrieval. -
Federated KB — Separate repos with virtual overlay (not git submodules). Priority resolution at application layer: local > project > org > community. Each remote is independent git repo cloned to cache dir with per-remote sync policy. Encryption:
agewith topic-level recipient lists, agebox-style explicit encrypt/decrypt on sync. Unified search spanning all remotes. See research/federated-kb. -
SwiftUI menubar app (optional, macOS) —
MenuBarExtra(.window style) with status popover. Thin client (~500-1000 lines Swift) consuming existing FastAPI server via SSE (real-time events) + REST (queries/commands). Native notifications viaUNUserNotificationCenterwith actionable buttons for sub-agent completion. Distribution: DMG + Sparkle auto-update + Homebrew cask. Skip App Sandbox (not needed outside App Store). See research/swiftui-menubar.
Decisions¶
Research conducted 2026-02-22. Full reports in docs/research/.
Framework adoption: Don't adopt, cherry-pick¶
Evaluated PydanticAI (v1.62.0), LangGraph, smolagents, OpenAI Agents SDK, CrewAI, Agno, Google ADK. No framework offers both PydanticAI-quality features AND the loop-level control picobot needs. PydanticAI's toolset composition (FilteredToolset, PreparedToolset, ApprovalRequired) is tightly coupled to RunContext — can't use without adopting the full agent loop. Picobot exists to study agent loop reliability; adopting a framework defeats the purpose.
Approach: Use FastMCP directly (independent package). Implement OTel natively (same GenAI Semantic Conventions). Port toolset design patterns onto ToolRegistry. Optionally evaluate PydanticAI Agent for sub-agents only later. Total custom code: ~750-1,150 LOC vs ~600-900 LOC savings from framework adoption — not worth the coupling. See research/framework-adoption.
Plugin system: Entry points + MCP, not a framework¶
MCP for external/third-party tools. Python entry points for picobot-native tool packages. No custom manifest (pyproject.toml is the manifest), no marketplace (PyPI is the registry), no plugin CLI (uv pip install suffices), no hook system (until demonstrated need). Phase B: local directory plugins + Tool Search for context management when > 20 tools. Phase C: hooks + settings overlay if community materializes. See research/plugin-system.
Semantic search: numpy brute-force, not ChromaDB¶
numpy brute-force + SQLite FTS5 in-memory is simpler and adequate at picobot's 100-1000 doc scale: <0.1ms vector query, ~26 MB memory, ~15 LOC for RRF fusion. Nomic at 768d (MTEB 62.28) as required dependency — the only viable model with unified local+remote API. ChromaDB is lighter than initially researched (~150 MB with ONNX, not 2.2 GB with PyTorch) but still unnecessary at this scale. Always-on embeddings — no optional/fallback pattern. Graduate to faiss-cpu at 5K docs, ChromaDB at 10K+. See research/kb-retrieval.
RPA: Build on existing stack, not external libraries¶
Skyvern (AGPL-3.0), Browser-Use, and similar tools add licensing constraints and dependency churn. Picobot already has Playwright + cron + agent loop — the RPA skill formalizes their combination. "Explore-replay-heal" pattern amortizes AI cost. Position as last-resort for sites without APIs (traditional RPA has 30-50% failure rate). See research/personal-rpa.