- Make tool selection obvious (rename + collapse).
- Visualization on demand, never surprising.
- Session boundaries that don't leak between problems.
- Approval flow that works the same on every OS.
- Slimmer response payloads.
Breaking changes are accepted. v3.0.0 is a clean cut — no aliases for v2 tool names.
| Tool | Purpose |
|---|---|
AoT-fast |
Default reasoning. Depth 3. Auto-suggests conclusions. |
AoT-full |
Decomposition-contraction reasoning. Depth 5. |
atomcommands |
All lifecycle/meta ops: sessions, decomposition controls, export, approval polling. |
generate_visualization → folded into viz: true param on AoT-fast / AoT-full.
check_approval → folded into atomcommands as command: "check_approval".
export_graph → folded into atomcommands as command: "export".
Each phase is a self-contained PR. Land in order. Tests stay green at every phase boundary.
Files: src/tools.ts, src/index.ts, src/config.ts, tests/tools.test.ts, tests/integration.test.ts.
- Rename
AOT_LIGHT_TOOL→AOT_FAST_TOOL, name string"AoT-light"→"AoT-fast". - Rename
AOT_TOOL→AOT_FULL_TOOL, name string"AoT"→"AoT-full". - Tool descriptions rewritten to a single decision rule (see §"Tool descriptions" below).
- Delete
GENERATE_VISUALIZATION_TOOLandCHECK_APPROVAL_TOOLexports. - Delete
EXPORT_GRAPH_TOOLexport. - Add to
ATOM_COMMANDS_TOOLenum:"export","check_approval". getTools(config)returns at most 3 tools.index.tsdispatch: route renamed names; route folded subcommands throughatomcommands.- Update tests for new names + new dispatch. Old tool-name tests should fail clearly.
Acceptance: 3 tools registered. All renamed tests pass. No dangling references to AoT-light or generate_visualization in src/.
Files: src/tools.ts, src/atom-server.ts, src/atom-light-server.ts, src/config.ts, src/visualization.ts, tests/visualization.test.ts.
- Add
viz?: booleantoAoT-fastandAoT-fullinput schemas. - Server flag
--viz <auto|always|never>(defaultauto):auto: render only whenviz: truein the call.always: render on every atom call (override).never: ignoreviz: true, never render (CI/headless).
- Tool description guidance: "Set
viz: truewhen you're in planning mode or the user is reviewing your reasoning. Leave false during execution." - On render: write HTML to output dir, open in default browser, include
vizUrlin the response payload. - Drop
--no-viz/--no-approvalflags (replaced by--viz never). - Termination does not auto-render (per Decision A — explicit-only).
Acceptance: viz: true → HTML rendered + browser opens + path in response. --viz never suppresses everything. --viz always ignores the param. viz: false/omitted → no render.
Files: src/atom-server.ts, src/atom-light-server.ts, src/types.ts, src/tools.ts, src/index.ts, tests/atom-server.test.ts, tests/atom-light-server.test.ts.
- New
Sessiontype:{ id: string; atoms: Record<string, AtomData>; atomOrder: string[]; verifiedConclusions: string[]; decompositionStates: Record<string, DecompositionState>; status: 'active' | 'completed'; createdAt: number }. AtomOfThoughtsServerholdssessions: Record<string, Session>+activeSessionId: string(default"default").- All atom state moves from server fields to active session.
- AoT input schema gains optional
sessionId?: string. If provided and unknown, auto-create. If omitted, use active. atomcommandsgains:new_session(optionalsessionId; auto-generates if omitted; activates)switch_session(requiressessionId)list_sessions(returns all session IDs + status + atom counts)reset_session(optionalsessionId; defaults to active; wipes atoms)
- Auto-archive: when
shouldTerminate: truefires, set sessionstatus = 'completed'. Active session pointer stays put. - Auto-spawn: on the next atom call with
dependencies: []and no explicitsessionId, if the active session iscompleted, auto-createdefault-Nand activate.
Acceptance: Two sequential reasoning problems do not pollute each other's atoms. Explicit new_session works. Auto-spawn fires correctly after termination. list_sessions returns sane data.
Files: src/approval.ts (rewrite), src/visualization.ts, src/index.ts, src/config.ts, new src/approval-server.ts, tests/approval.test.ts.
- Rewrite
approval.ts. Remove~/Downloadspolling. - New
approval-server.ts: starts anhttplistener on127.0.0.1at a free port (use0and read assigned port). Endpoint:POST /approvalwith body{ sessionId, atomId, status: 'approved' | 'rejected', comment?: string, timestamp }. - Server holds
approvals: Map<sessionId, ApprovalRecord[]>in memory. visualization.ts: when generating HTML, embed the callback URL (http://127.0.0.1:<port>/approval) andsessionIdso the browser POSTs back automatically on approve/reject.atomcommands: {command: "check_approval", sessionId?}returns approvals for the given (or active) session.- Fallback: if
listen()fails (rare — locked corp machine), useenv-pathsto write to a per-platform cache dir:<cacheDir>/atom-of-thoughts/sessions/<sessionId>/approval.json.check_approvalreads from there if no HTTP server is up. Addenv-pathsto deps. - Browser HTML keeps the existing approve/reject UI + comment field; the JS just changes from "save JSON download" to "POST to callback URL, fall back to download if fetch fails".
Acceptance: Approve in browser → check_approval returns it without a filesystem hop. Multiple concurrent sessions stay separated. Falls back gracefully if port bind fails.
Files: src/atom-server.ts, src/atom-light-server.ts, tests/atom-server.test.ts.
In processAtom response payloads, omit fields when empty/null:
dependentAtoms— omit if[]conflictingAtoms— omit if[]currentDecomposition— omit ifnullbestConclusion— already conditional (keep)verifiedConclusions— omit if[]
Default response shrinks from ~12 fields to ~6 in the common case.
Acceptance: Snapshot tests updated; payload byte-size measurably smaller in benchmark fixture.
Files: README.md, CHANGELOG.md, CLAUDE.md, package.json.
package.json: bump to3.0.0.CHANGELOG.md: v3.0.0 entry. Breaking changes subsection lists every rename + every removed tool with the new equivalent.README.md: rewrite the Tools table; add a Sessions section; add a Visualization section that explains the planning-mode heuristic.CLAUDE.md: update tool list + atom commands enum; update~/.claude/CLAUDE.mdorchestrator section separately (out of repo) so themcp__atom-of-thoughts__*references match.- Add a
MIGRATION_v2_to_v3.mdshort doc with a table of old → new.
Acceptance: Fresh reader can pick the right tool from the README in under 30 seconds. CHANGELOG enumerates every breaking change. Out-of-repo orchestrator doc updated.
AoT-fast: Structured reasoning. Use for any problem that benefits from
explicit premise → reasoning → hypothesis → verification → conclusion
chains. Up to 5 atoms per session. Most tasks belong here.
Set viz:true when in planning mode or when the user is reviewing.
AoT-full: Same shape as AoT-fast but supports decomposition-contraction —
break atoms into sub-atoms, verify independently, contract back. Use only
when you'll need >5 atoms or multi-angle verification on the same hypothesis.
- Confidence calibration (kept as self-rated; revisit in v3.x).
- Benchmark harness (deferred per Decision 5).
- Persisted sessions across MCP process restarts (sessions are in-memory only).
- Multi-tenancy / remote MCP transport (stdio only).
- HTTP server in MCP process: adds a port. Mitigation: bind
127.0.0.1only, ephemeral port, document the behavior, keep filesystem fallback. - Auto-spawn session magic could surprise users. Mitigation: include the new sessionId in every response so it's always visible.
- Tool rename breaks existing skill files: my
~/.agents/orchestrator config + theaot-plan/aotskill files referencemcp__atom-of-thoughts__AoT-light. Phase 6 must catch these — grep before merging.
- Confidence: ground-truth via verification atom checks against external state (tests, docs, code).
- Persistence: optional SQLite-backed sessions for cross-process continuity.
- Benchmark suite: small custom eval against MMLU-hard / GPQA / curated real tickets.