Changelog
What shipped, what changed, version history.
Changelog
All notable changes to the Soma agent are documented here.
Format follows Keep a Changelog. Versioning follows Semantic Versioning.
[Unreleased]
[0.21.0] — 2026-04-22 — Cache Economics + Discoverability + Self-Knowledge
Added
- suppress preventive OAuth-billing warning at boot (SX-566)
- test-audit command + hygiene rule engine (SX-564)
- swap Pi’s π terminal-title glyph for Soma’s σ
- Agent Notes relocation + preload ancestry + v0.21.0
- Terminal tab title now shows
σ - <session> - <cwd>— build-time patch to Pi’sinteractive-mode.jsswaps theπbrand glyph for Soma’sσ. Display-only, zero cache/payload impact. Closes the last Pi brand leak in the TUI chrome. - Declarative migration replay via map frontmatter (SX-562) —
soma doctoris now data-driven. Migration maps can declarereplay-until: <version>in frontmatter + a## Doctor ActionsJSON block in the body (schema:settings-defaults,settings-subkeys,scaffold-files). While the running agent is belowreplay-until, doctor re-evaluates that map on every invocation and applies its actions idempotently. Once agent catches up, the map retires from the replay pass automatically. Future backfill-class migrations don’t need CLI code changes — they just add the block to their map. Session-start boot path untouched; only explicitsoma doctorruns the replay. - Agent Notes relocated out of
body/ecosystem.md(SX-547, v0.21.0) — the rolling session-observation log now lives atmemory/notes/soma-log.md(bundled template seeds at init, doctor tier-1 soft-check backfills for upgrades viawriteIfMissing).body/ecosystem.mdshrank from 33KB/322 lines to 10KB/174 lines and is nowlazy: trueso its content no longer hits the cached prefix on every boot. Expected cacheWrite savings: ~5.5K tokens/boot (~25%). - Recent Ancestry auto-injected into preload (SX-549) — last N entries from
memory/notes/soma-log.mdinject as## Recent Ancestryin the preload user-message on fresh boot. Configured viasettings.preload.recentNotesCount(default 3; set 0 to disable). User-message injection only; does not affect the cached system prompt. Graceful no-op ifmemory/notes/soma-log.mdis missing. - Children monitor promoted to bundled scripts (SX-557 follow-up) —
soma children list/tail/kill/focus/watch+ newsoma children spawn <role> "<task>"now ship viarepos/agent/scripts/(was workspace-only). Shell-spawned children register themselves in~/.soma/state/children.jsonso the shippedchildrenPi tool and the CLI dashboard share the same registry. Hex IDs (child-xxxxxx) match the SX-553 shape. tmux default driver, cmux optional when available. - Doctor tier-1 soft-check for v0.21.0 structural pieces — pre-0.21.0 users never received the backfilled migration chain, so
addIfMissing+ a newscaffoldMemoryNotescheck run on every boot. Missingmemory/notes/soma-log.mdgets scaffolded from the bundled template (writeIfMissing, never clobbers). Tier-2 (agent-driven) handlesbody/_memory.mdcustomization review via the migration map’sagent-prompt. - Crystallize Phase A:
soma new muscle/soma new protocol+ templates (SX-559) — lowers the friction of creating new muscles or protocols. Scaffolds the file at the right location (.soma/amps/muscles/<name>.mdor--globalfor~/.soma/...) from a canonical template with frontmatter pre-filled (created date, session origin, author, description, triggers). Idempotent — re-running on an existing name opens it in$EDITORinstead of clobbering. Templates live attemplates/default/_muscle-template.md+_protocol-template.mdas single source of truth for frontmatter conventions. Addresses the “she’ll see patterns but won’t crystallize them because the ceremony is too high” gap. Phase B (thecrystallizePi tool) + Phase C (idempotent update semantics) scoped inreleases/v0.20.x/plans/crystallize/README.md. - Discoverability:
soma toolCLI +capabilitiesPi tool (SX-558) — two surfaces to introspect Soma’s tool registry without re-reading the whole system prompt.soma tool(no args) lists every registered tool with a one-liner;soma tool <name>prints the full authored guidance (description, promptSnippet, promptGuidelines, parameters). Runs offline via static parse ofextensions/*.ts— no session needed. For the runtime view (post-_tools.mdoverrides), a newcapabilitiesPi tool withop:'list'andop:'detail'does the same thing from inside a session. Closes the “soma delegate --helpdoes nothing” gap. Bundled docs atdocs/tools.md#discovering-whats-registeredanddocs/commands.md. - Lazy-loaded body files (SX-548) — body files with
lazy: truein frontmatter now contribute only theirdescriptionfield to the cached system prompt. Full content loaded on demand via thereadtool. Opt-in per file; missing flag preserves existing behavior. Enables Tier 2 loading for volatile files (ecosystem.md Agent Notes, journal.md index) with a one-line config change. Expected cacheWrite savings: ~5K tokens per boot when applied to ecosystem + journal. - Project
core_rules.mdadditions (SX-555) — projects can now place abody/core_rules.mdin their.soma/directory; content is appended after the agent-shippedsystem-core.mdrather than replacing it. Shipped rules cannot be accidentally removed by a project override. Missing file = identical behavior to pre-0.20.4. delegate(background:true)+childrentool (SX-553 Phase A) —delegatenow acceptsbackground:trueto spawn a child soma in a new cmux pane and return a handle immediately ({childId, pane, surface, status}) instead of blocking. NewchildrenPi tool withop:"list"reads~/.soma/state/children.jsonand formats a status table (id, role, model, status, cost, runtime, pane). Atomic-rename IO helpers (appendChild,updateChild,readChildrenJson,writeChildrenJson). Backward-compat: omittingbackgroundpreserves existing synchronous behavior. Phase B (tail/steer/kill/harvest) + Phase C (ghostty/tmux drivers) pending.cache.retentionsetting (SX-544 Phase A) — new settings schemacache: { retention: 'long' | 'short' | 'none' | null }. When set to"long", soma-boot injectsPI_CACHE_RETENTION=longfor Pi’s provider layer, enabling 1-hour Anthropic prompt cache TTL (2× write cost, break-even at one re-hit within 60m). Defaultnull= inherit shell env or Pi default (5m). Doctor migration adds the key to existingsettings.json. No behavior change until user opts in. Phase B (validation) + Phase C (keepalive coupling) still pending.- soma-deploy.sh — thin wrapper on Dokploy API
- browserCdpHost + browserCdpUrl — browser can live anywhere
- browser profile tokenization — userDataDir + profileDirectory
- Endpoint resolver (SX-513, s01-6d05dd) — single source of truth for every URL the agent touches. Tier 2 extensions (
bridge-connect,workspace-tools) + dev scripts (launch-browser) now route through_shared/env.ts(Node side) +soma-env.sh(bash side). Mode taxonomy:local/cloud/pro/enterprise/auto. User defaultcloud; our dev defaultauto(probes localhost:18800, falls back to cloud). Config lives underenvironmentinsettings.jsonand is only read by the dev extension — prod has endpoints baked at build time. bridge-connect-dev.ts— dev-only sibling of the shippedbridge-connect.ts. Readsenvironment.mode+ overrides live, exposes a newenv_statustool for runtime diagnostics. Installed viasoma-dev symlink extensions --dev.soma-env.sh— pure-bash resolver helper (no node dep, no cold start). Mirrors env.ts’s defaults table. Parity guarded bytest-env-resolver-parity.shso the two implementations can’t drift.environmentblock inSomaSettingsinterface (core/settings.ts) — typed config for future agent-sidesoma envCLI; dev extensions read it today, prod extensions ignore it.- Three new test suites (
tests/test-env-resolver.sh,test-env-resolver-parity.sh,test-no-hardcoded-endpoints.sh) — 25 + 24 + 4 assertions covering resolver behavior, shell/TS parity, and a golden-rule guard that catches any regression back to literal endpoints in migrated Tier 2 files. SOMA_PROJECT_DIRenv var exported to discovered scripts (SX-555) — whensoma <cmd>dispatches to a discovered script (bundled / project / global), it now walks up from$PWDto find the nearest.soma/directory and exports the path asSOMA_PROJECT_DIR. Scripts can trust the env var instead of recomputing from$0(which breaks for bundled scripts living far from the user’s project). Paired with theresolve_soma_dirhelpers insoma-refactor.sh/soma-seam.sh.soma update --yes/-y— skip the Y/N confirmation prompt in scripted upgrades. Closes the documented one-linernpm install -g meetsoma@latest && soma update --yes. Surfaced during the s01-c6944c CLI audit (post-v0.20.3 follow-up).
Fixed
- ship .py helpers + _lib/ alongside .sh scripts
- comprehensive settings backfill + Pro auth scaffold + upgrade test
- add digest blocks to 3 bundled muscles (SX-563)
- run tier-1 soft-check unconditionally
- resolve soma_dir correctly + bash 3.2 compat + honest stable error
soma refactor/soma seamnow resolve the right project directory when run outside cwd (SX-555) — both scripts previously computedSOMA_DIRrelative to their own install location, which broke for users whose project.soma/wasn’t a sibling of the script. Addedresolve_soma_dirhelper that prefers$SOMA_PROJECT_DIR, then walks up from$PWD, then falls back to the legacy relative path. Also handles SIGPIPE gracefully (was killing piped output).soma plansbash 3.2 compat restored (SX-555) — theoverlapcommand useddeclare -A(associative arrays), which macOS bash 3.2 doesn’t support. Rewrote to emit topic/path tuples to a tempfile, sort, and group — portable across bash versions.get_fieldnow returns|| trueso missing frontmatter fields don’t trippipefail.soma-install.sh stablegives an honest error (SX-555) —repos/agent-stablewas retired s01-419457 in favor of git tags. Stable mode now prints an explanation and points to the tag-based-install plan instead of failing silently.- extractTldr no longer truncates multi-line TL;DRs
symlink-extensions.shused stale post-restructure path — was pointing atsomaverse/extensions/(moved tosomaverse/builds/local/extensions/in s01-efe898). Updated + added--devflag that swaps the bridge-connect symlink to the dev variant.build.shauth-gate temp files broke relative imports — temps were written to/tmp/so esbuild couldn’t resolve./_shared/env.js. Moved temps next to sources.
[0.20.3] — 2026-04-20
Patch release. Cache-stickiness: /reload no longer invalidates the
Anthropic prompt cache. The compiled system prompt is persisted to
.soma/state/.session-prompt-cache.json and restored across
reload/resume/fork. A new /rebuild command forces explicit recompile
when body edits should be picked up.
Added
/rebuildcommand (SX-495) — forces recompile of the system prompt and deletes the disk cache. Optional — only run it if you’ve editedbody/*.mdmid-session AND you want the change to apply right now. Otherwise/reloadkeeps the prompt sticky and body edits land naturally on your next session.- Disk-backed prompt cache (SX-495) —
.soma/state/.session-prompt-cache.jsonwritten on first compile, restored on subsequent reloads. Eliminates the ~$1 cache-invalidation cost per/reload. - Severity-aware change indicator on statusline line 3 — replaced the intrusive “Changes detected” toast with a subtle third-line tag. Labels:
🔄 /reload(extensions/.ts + core/.ts; picked up by jiti re-import — confirmed in Pi’sextensions.md),📝 /rebuild?(body/.md — the?denotes optional),⚠ relaunch(dist/ or core/*.js — Pi’s static imports are frozen at process boot,/reloadcan’t help;/exitand runsomaagain). Signal writer + reader updated; legacyseverity: restartstill read for back-compat. Parser handles both YAML and JSON payloads (SX-497 will unify writers). - Commands doc — Reload & Rebuild section (
docs/commands.md) — explains the two commands, when to use each, and what the statusline indicators mean.
Fixed
-
Tier 2 extension build path updated for somaverse restructure —
build-extensions/build.shSOMAVERSE_EXT now points tosomaverse/builds/local/extensions/(moved s01-efe898). Unblocked v0.20.3 dry-run. -
soma focusrestored. Was silently broken since the Pro-scripts refactor movedsoma-seam.shintoscripts/_pro/(and released form renamed to.js).soma-focus.shonly looked forscripts/soma-seam.shand always errored. Now searchesscripts/,scripts/_pro/,$SOMA_DIR/amps/scripts/,~/.soma/amps/scripts/and dispatchesnodefor.js/bashfor.sh. End-to-end verified. -
docs/focus.mdaccuracy. Scoring table, force-include threshold, and heat formula were all out of date. Corrected to matchcore/muscles.ts:matchMusclesToFocus— trigger/keywords/topic list match (10), name (3), digest (2); force-include at>= 8; heat =score + 2; tags don’t participate. -
soma-dev sync-docswalks subdirs.docs/guides/was missing from the website; bash 3.2-compatible explicit loop added. -
/reloadno longer invalidates Anthropic prompt cache (SX-495) — previously, re-importingsoma-bootresetcompiledSystemPromptto null; next turn recompiled from disk and re-sealed a fresh cache, forcing a miss. NowtryRestoreCompiledPrompt()rehydrates from disk whensession_start.reason ∈ {reload, resume, fork}. Fresh launches (reason=startup|new) still compile from scratch.invalidateCompiledPrompt()also unlinks the cache file (called by/pinand/kill).
Plan
.soma/releases/v0.20.x/plans/cache-stickiness.md— full audit + fix spec + acceptance criteria.
[0.20.2.1] — 2026-04-19
Patch release. Closes the _mind.md template orphan, adds the Soma tool
registry with _tools.md configuration, documents tools + extension
plumbing, softens the restart alert. Three Soma tools added (context_status,
file_outline, search). Four script-UX no-flag fixes. CLI version label
corrected in dev mode.
Added
- Soma tool registry (
core/tool-registry.ts) withsomaRegisterTool()helper — the man-in-the-middle between extension-defined tools and Pi’s registry. PreservespromptSnippet+promptGuidelinesin the compiled system prompt (Pi’sToolInfostrips them). _tools.mdconfiguration (project → parent → global body chain). Sections: Disabled (opt-out list), Overrides (per-tool field tweaks), Custom (parsed; registration lands v0.20.3). Hardwired set (delegate) cannot be disabled.context_statustool — returns{percent, tokens, contextWindow}so the agent can ground its runway decisions instead of estimating.file_outlinetool — markdown/text headings with line numbers. 10–15× cheaper than full-file reads for orientation.searchtool (MVP) — unified search with pluggable backends. Default: ripgrep over cwd, respects.gitignore.scope="api"uses Brave Search whenBRAVE_API_KEYorSOMA_SEARCH_API_KEYis set.scope="semantic"deferred to v0.20.3.1.docs/tools.md(new) — Soma tools reference: three registration routes,_tools.mdformat, sub-agent scoping, bundled set, invocation vs prompt registries.docs/extending.mdadditions:pi.registerTool+pi.getActiveTools+pi.getAllToolsin API table; hot-reload notes; “Modifying the System Prompt” section; full Soma Tools section (writing a tool withsomaRegisterTool, comparison table vspi.registerTool); External tool → Soma bridge (the inbox) section documenting the drop-in CLI integration (token, allowlist, JSON format).body/_tools.mdseeded in meetsoma + bundledtemplates/default/_tools.md.- Refactor breadcrumbs at top of
extensions/soma-boot.ts— clean-break candidates noted (~3700 LOC file) for a future refactor session.
Fixed
-
Tool-registry timing fix (
37106e0) —_tools.mddisable/override rules now apply at extension-load time. Pi loads extensions (callingsomaRegisterTool) BEFORE firingsession_start, so the previoussetToolConfigChain()call ran too late. Fix: lazy chain self-discovery ingetToolConfig()— walks up fromprocess.cwd()if no explicit chain is set. 6 new timing tests added (62/62 total passing, was 56). -
_mind.mdwas orphaned since Phase 1c.1 (s01-a1a6aa). The Pi-native shortcut returnedevent.systemPromptunchanged whenSYSTEM.md+APPEND_SYSTEM.mdexisted, bypassing the template compiler. User customizations tobody/_mind.mdhad no effect. The shortcut is removed.compileFullSystemPrompt(template-driven viacompileWithTemplate) is now the single path.SYSTEM.md/APPEND_SYSTEM.mdwrites redirect to.soma/state/as introspection artifacts; Pi no longer auto-discovers them. -
soma --versionin dev mode showed runtime v0.20.2 instead of CLI v0.3.5.npm/thin-cli.jsread__dirname/../package.json, which resolved to agent’s package.json in dev-symlink installs. Esbuild--define:__CLI_VERSION__+build-dist.mjsstring-substitution now inject the correct literal. -
Restart alert too aggressive. Pi
/reloadhot-reloads extensions viajiti.import(mtime-keyed cache) —extensions/*.tsedits don’t need a full process restart..git-hooks/post-commitnow classifies changed files:extensions/*.tsandcore/*.ts→severity=reload;core/*.jsanddist/*→severity=restart.soma-statuslinereads severity and shows the matching message. -
Script no-flag UX (SX-490):
soma-loginno longer starts OAuth without an explicitstartsubcommand.soma-snapshotno longer snapshots CWD without an explicit path — bare invocation prints help + recent snapshots.soma-themenow prints help when executed directly (still sources cleanly).git-identity-hookunchanged (silent exit-0 is correct for a git hook).
Changed
somaRegisterToolreplacespi.registerToolacross all Soma bundled tool files (soma-delegate,soma-code-tools,soma-context,soma-search). Third-party extensions usingpi.registerTooldirectly still work; tools just render with description-only (no per-toolpromptSnippet/promptGuidelines).buildToolSectionaccepts an optionalsomaToolsregistry. When present, rendered output includes per-tool guideline bullets prefixed[tool_name]..git-hooks/now tracked in git (was gitignored under a non-existent “generator”). Install path unchanged:git config core.hooksPath .git-hooks.
Docs
- New
docs/tools.md. - Substantial
docs/extending.mdexpansion (tools, inbox, system-prompt hook, hot-reload).
Deferred / parked for v0.20.3
- Full deletion of
compileFullSystemPrompt+extractSections+buildToolSectionlegacy helpers (reversed this session — the compiler is staying;_mind.mddrives the prompt). - Custom markdown-defined tools (
_tools.mdCustom section) — shell execution + security model. - Multi-provider search backends (tavily, exa, perplexity).
- Local-semantic search backend +
soma indexcommand. - Audit-token release tool.
- Upstream ask to Mario re: exposing
promptSnippet/promptGuidelinesonToolInfo.
[0.20.2] — 2026-04-18
The v0.20.3 prompt refactor arc. Moves Soma from “replace Pi’s prompt wholesale” (compileFullSystemPrompt rebuild path) to “let Pi compile; we augment” (SYSTEM.md
- APPEND_SYSTEM.md via Pi’s native auto-discovery). Option B from the REFACTOR-PLAN. Also: 5 script-backed Pi tools, a pretest CLI, and two version-check bug fixes.
Pi-native mode is now DEFAULT when SYSTEM.md + APPEND_SYSTEM.md exist. Escape
hatch: SOMA_LEGACY_PROMPT=1 forces the old full-replacement path. Kept alive
until Phase 1c.2 (planned deletion of ~300 LOC rebuild path).
Added
- smarter randomizer + version-aware skeletons + CLI integration
- three-layer version snapshot + update check (SX-489)
Phase 1a/1b — SYSTEM.md + APPEND_SYSTEM.md auto-discovery pipeline:
compileSystemMd(options)+writeSystemMd(options)incore/prompt.ts. Compiles identity-only content (soul + voice + body + ecosystem + core_rules) to<somaPath>/SYSTEM.md. Pi auto-discovers viaresource-loader.js:660 discoverSystemPromptFile()and uses ascustomPrompt.compileAppendSystemMd(options)+writeAppendSystemMd(options)incore/prompt.ts. Compiles AMPS + tools + guard + docs to<somaPath>/APPEND_SYSTEM.md. Pi auto-discovers viaresource-loader.js:671 discoverAppendSystemPromptFile()and uses asappendSystemPrompt.- Writers wired in
extensions/soma-boot.ts:writeSystemMdatsession_start,writeAppendSystemMdatbefore_agent_start(eagerly, before path split, so both Pi-native and legacy paths keep APPEND current). SYSTEM_MD_FALLBACKSconstant: minimum-viable Soma-voice prose for empty soul/voice/body/ core_rules. Keeps SYSTEM.md coherent in fresh-install directories.
Phase 1c.1 — Pi-native as default:
before_agent_startnow defaults to Pi-native when SYSTEM.md + APPEND_SYSTEM.md exist.- Legacy opt-out via
SOMA_LEGACY_PROMPT=1. First-run safety: missing files → legacy path runs, seeds files for session N+1.
Phase 1d — XML tag experiment (Anthropic-style adherence aid):
<rules>tag around core_rules in SYSTEM.md output (first behavioral tag in our compiled prompt — previously we had only Pi’s native<available_skills>).<behavioral_rules>+<tool_guidance>tags in APPEND_SYSTEM.md. Matches Anthropic’s own prompt conventions (Sonnet 4.5 → 4.6 doubled tag count; we were at 1).
Phase 2 — 5 script-backed Pi tools (extensions/soma-code-tools.ts):
code_find— grep with file:line:match output, respects .gitignore (cap 500)code_map— function/class/method index for a filecode_refs— symbol references classified as DEF / USE / IMP (run before renaming)code_structure— directory tree with file sizes, max depth 3code_blast— blast radius: all files touching a symbol with severity (run before deleting)- All
executionMode: "parallel"(read-only, safe concurrent), ANSI colors stripped, output capped with helpful refinement hints when truncated. promptSnippet+promptGuidelinespopulated on all 5 so Pi surfaces them in the “Available tools:” / “Guidelines:” prose (first effect visible post Phase 1c.1).
soma preview — pretest CLI (scripts/soma-preview.{sh,ts}):
- Compiles SYSTEM.md + APPEND_SYSTEM.md from live body files without a sandbox restart.
- Flags:
--out <dir>,--system-only,--append-only,--quiet,--diff,--help. --diffcompares fresh compile against on-disk files with byte deltas and staleness.- Runs outside the TUI. No API cost.
- Distinct from
scripts/prompt-preview.ts(fixtures-based scenarios for testing).
Fixed
-
cap items per version (highlights only, not full changelog)
-
pi-agent keyword false-positive on public package
-
auto-advance workspace marker when no migration is pending
-
soma updatefalse positive on dev versions. The CLI update check used string comparison (latest > VERSION) which made"0.3.4" > "0.20.1.1"true ('3' > '2'lexically). Dev users on 0.20.x were told to “update” to stable 0.3.x — which is older. Fix: usesemverCmp()(already defined in the module, just not called here). Applied to bothrepos/agent/npm/thin-cli.jsandrepos/agent-2x/npm/thin-cli.js. -
npm install -g meetsomaEEXIST on dev installs. Whensomabin is a manual symlink torepos/agent/dist/cli.js(typical dev setup viasoma-install.sh dev), npm refuses to overwrite the unowned file. Fix:detectDevInstall()reads the bin’s symlink target and, when it’s not an npm-managed path, guides tosoma-install.sh stablefirst beforenpm install -g meetsoma. -
delegatetool invisible in Pi’s “Available tools:” prose. Pi intentionally omits custom tools whenpromptSnippetis absent (perToolDefinitioncontract attypes.d.ts:289). AddedpromptSnippet+promptGuidelinestosoma-delegate.ts. Previously unobservable because our rebuild path stripped the section entirely; became visible after Phase 1c.1 landed. -
APPEND_SYSTEM.md went stale between sessions. Was only refreshed inside the legacy branch — Pi-native sessions never rewrote it even when body files or heat changed. Moved
writeAppendSystemMdto run BEFORE the path split so both paths keep APPEND current.
Changed
before_agent_startrestructured: APPEND refresh happens eagerly, path selection (Pi-native vs legacy) happens after. Escape hatch env var renamed fromSOMA_PI_NATIVE_PROMPT(opt-in gate, Phase 1b Commit 3) toSOMA_LEGACY_PROMPT(opt-out gate, Phase 1c.1) as the default flipped.compileSystemMdsource comment stamp bumped:Phase 1a→Phase 1d(tag adoption).compileAppendSystemMdsource comment stamp bumped:Phase 1b→Phase 1d.
Notes
- Sandbox verified end-to-end (session
s01-5c01df): Pi-native path active, APPEND content visible in system prompt including Behavioral Rules, Muscle Memory, Tools section with all 6 tools (read, bash, edit, write, code_find, code_map, code_refs, code_structure, code_blast, delegate), and Tool Guidelines. Model naturally preferredcode_findoverbash('soma code find ...')— typed-tool adherence signal positive. - Phase 1c.2 deliberately deferred. Deleting ~300 LOC of
compileFullSystemPromptextractSections+buildToolSection+BUILTIN_TOOL_DESCRIPTIONS+ helpers is the next step after one real session of Pi-native-default observation. Bisectable single commit when it lands.
- Tag experiment signal pending.
_mind.mdtags affect the legacy path (still reachable viaSOMA_LEGACY_PROMPT=1). New-path tags are in place. The real adherence delta measurement requires parent meetsoma session-level observation.
Refs: .soma/releases/v0.20.x/plans/v0.20.3-prompt-refactor.md (living plan, all phases + progress),
.soma/releases/v0.20.x/plans/v0.20.4-tool-audit.md (next arc, seeded).
[0.20.1.1] — 2026-04-18
Role expansion + curator polish. Closes the Phase-2 delegation arc: the curator can now run apply inline (opt-in), pending gaps flow to a human-editable scratchpad, and roles can declare where their canonical file lives (source-of-truth) + where artifacts go (paths block).
Added
- Three more roles:
planner(writes plan files,[read, bash, write]),doc_writer(markdown-only edits,[read, edit, write]),reflector(journal entries undermemory/journal/,[read, write]). 7 roles total. Researcher deferred to v0.20.2 pending search integration. source-of-truthfrontmatter field on roles. Project-root-relative or absolute path to the canonical role file. When set,discoverRolere-reads from there andapplywrites amendments there — fixes the runtime-copy vs git-source drift v0.20.1 highlighted. Missing file → stderr warning + fallback to chain-walked copy.paths:frontmatter block on roles. Per-role artifact paths (invocations,proposals,proposalsApplied,scratchpad) with{role}templating. Absent block = hardcoded defaults (zero migration). All paths live undermemory/so writes stay cache-safe.--auto-applyflag onsoma-dev children curate. When set, auto-apply-class proposals apply inline during curate (one command for the round trip). Default OFF — proposals stay inproposals/for human review.- Scratchpad (
memory/children/<role>/scratchpad.md). When--auto-applyis off, auto-apply-class findings still write proposals AND append dated sections to the scratchpad so pending gaps are visible at a glance. Append-only; human-editable. applyProposalexported fromcore/delegate-core.tsas a library function. CLI stub is a thin wrapper now.curateRolecalls it directly under--auto-apply. Returns structuredApplyProposalResultwith 8 reason codes.resolveRolePaths(role, somaDir, roleDef?)— single source of truth for per-role artifact paths. Threaded throughlogInvocation,scanMLRQueue,writeProposal,hasProposalBeenApplied, andapplyProposal.
Fixed
- Classifier false-positive on
what_workedentries. An MLR observation likewhat_worked: ['Task completed within budget']matched the config-keyword regex forbudgetand produced a bogus propose-class amendment.inferAmendmentSectionnow short-circuits onsourceField === 'what_worked'and routes toaccumulated_knowledgeunconditionally — success reports are observations, not config changes.
Changed
curateRolesignature extends withopts?: { autoApply?: boolean }(back-compat default false). Returns extendedCurateResultwithappliedarray andscratchpadAppendedcount.buildProposalnow acceptsroleDefto avoid redundantdiscoverRoleI/O.
Cache-safety confirmed
core/body.ts:628-648 iterates readdirSync(bodyDir) filtering .endsWith(".md") — directories (incl. body/children/) are skipped. Role edits don’t invalidate parent cache. All new artifacts (scratchpad, proposals, invocations) live under memory/ which is likewise not walked. Verified empirically: source-of-truth writes to canonical body/children/verifier.md completed without cache storm.
[0.20.0.1] — 2026-04-18
Delegation hardening. v0.20.0 shipped the MVP; v0.20.0.1 makes it production-shaped:
model fallback chain (free-tier friendly), per-invocation health cache + cooldown,
MLR parsed into structured objects, cost/token tracking, and CLI paths (children run,
children health) for driving delegations outside the TUI.
Added
- Structured model chain in role frontmatter (
model-chain:list of entries withid,class,cooldown-on-rate-limit). Scalardefault-model: <id>still works (1-entry chain back-compat). - Model policies (
model-policy:—order|free-only|paid-only|prefer-free). Runtime walks the chain per-policy, skipping unavailable or cooldown’d models. - Health cache + cooldown at
.soma/state/model-health.json. Rate-limited or dead models get marked and skipped for a TTL (default 1h). Survives across sessions. - MLR (Memory-Lane-Reflection) yaml parsing on child final messages. Observations flow to
inv.mlr.{what_worked, what_struggled, missing_capability, suggested_amendments, map_issues}inmemory/children/<role>/invocations.jsonl. Foundation for v0.20.1’s curator loop. - Cost + token tracking per attempt (
inv.cost_usd,inv.tokens_input,inv.tokens_output). Attempts array records each model tried in the chain. soma-dev children run <role> "<task>"— CLI stub that invokesrunDelegationoutside the TUI. Useful for dev regression + batch testing.soma-dev children health <role>— shows chain with per-model class, resolvable state, cooldown, filtered (per policy). Diagnostic for “why is my child using sonnet when I declared a chain?”
Changed
extensions/soma-delegate.tsrefactored to thin wrapper (~50 lines) overcore/delegate-core.ts(~800 lines at v0.20.0.1). Logic lives in core; extension just registers the Pi tool. Enables CLI stubs to callrunDelegationwithout Pi’s extension harness.loadAgentClassis now async (dual-strategy:createRequirefor CJS, dynamicimport()for ESM). Callers mustawait.
Fixed
- Free-tier rate limits (429/503) on
openrouter/*:freemodels. v0.20.0’s hardcoded Haiku default was a workaround; v0.20.0.1’s chain-walking is the real fix. Role can declare a free-first chain and fall through to paid-cheap on rate limit.
Sandbox-verified (5 cases)
T1 scalar back-compat, T3 chain gemma→qwen→haiku fall-through, T4 cooldown skip, T6 MLR parsed into structured object, T7 cost $0.0044 / 2819+313 tokens.
[0.20.0] — 2026-04-18
Delegation MVP. Team Soma begins. The delegate Pi tool spawns an in-process child agent via pi-agent-core.Agent, running a role-tuned system prompt while inheriting parent soul/voice/ecosystem. Foundation for everything in v0.20.x.
Added
delegatetool (registered viaextensions/soma-delegate.ts). Called asdelegate(task, role?, model?). Spawnspi-agent-core.Agentin-process, tool budget enforced (max-tool-calls), returns summary + cost + MLR.- Role files in
body/children/:_child.md(sub-compiler template),_child-template.md(scaffold for new roles),general.md(starter role: Sonnet, full tools, budget 25/$0.25). - Role discovery via body chain.
discoverRolewalksbody/children/<role>.mdacross the soma chain (project → parent → global) so a workspace can ship roles its child projects inherit. - Prompt compilation for children. Compact soul (1500 chars) + voice (1000) + ecosystem (2000) + role identity + role accumulated knowledge + task. Haiku by default so cost stays tight.
soma-dev childrenCLI (new subcommand group).list/show/add/edit/stats/tail/validatefor inspecting + managing roles and their invocation logs.- Invocation log at
memory/children/<role>/invocations.jsonl. Append-only JSONL per role: timestamp, model, tool calls, duration, cost, summary. pi-agent-coreadded as direct dependency (was transitive). Uses itsAgentclass as the child-spawning primitive.- Sandbox architecture — persistent
~/soma-2x-sandbox/folder (her filesystem) + dedicated~/.soma-2x/agent/install (runtime symlinks torepos/agent-2x/, auth/settings shared from main install). Keeps parent session’s~/.soma/agent/untouched during iteration. soma-2x-cmux.shlauncher. Opens a cmux workspace with Sonnet parent + invocation-monitor pane.--focus/--close/--restartflags for iteration cycle.
Fixed (during MVP verification, same release cycle)
pi-agent-core.AgentviacreateRequirebypass. Pi’s extension loader aliases@mariozechner/pi-agent-coreand can resolve to wrong package under jiti. Switched tocreateRequire(import.meta.url)for that one import — native Node resolution bypasses jiti.pi-ai+pi-coding-agentstay ESM-only (static imports at module top).- Inline flow YAML arrays.
inherits: []was parsed as the string"[]"; parser now detects and splits[a, b, c]inline. - Inline YAML comments.
default-model: claude-sonnet-4-5 # commentpreviously included the comment in the value.stripCommenthandles this now (respects#inside quoted strings). getModelreturningundefined(not throwing) when a model id was unknown. Now surfaces as a typed error the chain walker can react to.- OpenRouter Claude models — wired provider + normalized id forms;
openrouter/google/gemma-4-31b-it:freeresolves correctly now.
Notes
- Not tagged as a discrete release; delegation MVP was sandbox-internal on
dev-2xand consolidated under the v0.20.1 tag when the curator loop landed. This entry backfills the history.
[0.20.1] — 2026-04-18
Curator loop + specialized child roles (verifier, builder, curator). Closes the self-improvement cycle: delegation observations (MLR) → classifier → proposal files → human-apply → role.md amended.
Shipped on
dev-2xbranch. Merged todevat tag time. Follows v0.20.0 (delegation MVP) + v0.20.0.1 (delegation hardening).
Added
- Three role files in
body/children/:verifier.md(read-only,read + bash, PASS/FAIL + evidence),builder.md(write-capable,read + bash + edit + write, bounded edits with verify-after),curator.md(meta-role,read + write, proposes amendments). All bound toclaude-haiku-4-5by default with per-role budgets. - MLR queue reader
scanMLRQueue(role, somaDir, sinceTs?)incore/delegate-core.ts. Scansmemory/children/<role>/invocations.jsonl, flattensmlr.{what_worked, what_struggled, missing_capability, suggested_amendments}into structured amendment candidates. - Amendment classifier
classifyAmendment(entry, evidence)returnsauto-apply|propose|human-only|skip. Auto-apply requiresaccumulated_knowledgesection + ≥2 distinct invocations + text < 200 chars.default-tools/budget/success_criteria→propose. Identity/soul/voice/inherits →human-only. - Proposal writer
writeProposalemitsmemory/children/<role>/proposals/<id>.mdwith frontmatter (id, role, class, section, evidence) + body (amendment, reason, apply command). soma-dev children mlr [<role>]— scan MLR queue, table output (ts, source, section, text).soma-dev children curate [<role>]— classify queue → write proposals. Summary by class (auto-apply / propose / human-only).soma-dev children apply <proposal-id> [--force]— append amendment to role.md section, archive toproposals/_applied/. Auto-apply default;--forcefor propose-class (v0.20.1 still gates non-accumulated_knowledgesections).- Chain-walk in
children.sh(SX-482). Port ofcore/discovery.ts:getSomaChainto bash. Shell subcommands now resolve roles across the full soma chain (project → parent → global~/.soma), matching runtime behavior. Adds per-rolesourcecolumn inlist(project/parent/global) and--soma=<path>pin flag. - Dedup in curator flow (SX-481 fixup).
hasAmendmentInRole+hasProposalBeenAppliedhelpers prevent duplicate bullets when curator runs on different days (slug-based dedup includes date, so same text on new day previously slipped through). Applied at bothbuildProposal(skip before write) andapply-proposal(skip + archive-only, defense in depth). resolveToolshonorsbashin read-only roles (s01-b420d5 fix).createReadOnlyTools()upstream returns[Read, Grep, Find, Ls]with no Bash;resolveToolswas dropping thebashdeclaration for any role without edit/write. Now rebuilt declaratively from 7 individual constructors so[read, bash]resolves correctly.
Changed
buildProposalsignature: optionalcwd+somaDirPathparams so library callers can thread the caller’s chain into role discovery (instead of relying onprocess.cwd()).curateRolesignature: optionalcwdparam threaded tobuildProposal.children listoutput includes aSOURCEcolumn (project/parent/global).
Deferred to v0.20.1.1 / v0.20.2
- Remaining 4 roles: planner, doc_writer, researcher, reflector.
- Path-gated
edittool for curator (direct role.md edits without proposal round-trip). - Direct auto-apply during curator run (today: curator writes proposals, human runs
apply). source-of-truthfrontmatter field — route amendments to git-canonical path, not chain-walk result (SX-483, v0.20.2).soma-dev children audit— diff runtime copies vs git source, merge in either direction (SX-484, v0.20.2).
[0.12.4] — 2026-04-18
Follow-up to v0.12.3 shipping integrity. Pi runtime bump, thin-CLI UX cleanup, release-flow parity (dev ↔ main auto-sync), and a script pipefail fix.
Changed
- Pi runtime 0.67.6 → 0.67.68 — 2 upstream releases. Network connection retry (#3317), stable date format in system prompts (#2814), scoped-models Alt+Up/Down fix (#3331),
afterToolCallerror forwarding (#3051, #3084), git update notification reliability (#3027). New: Bedrock bearer-token auth, prompt templateargument-hintfrontmatter,after_provider_responseextension hook, OSC 8 hyperlink rendering. - Release script auto-syncs
agent-stable/main.soma-release.shnow squash-mergesdev → agent-stable/mainafter building soma-beta and tags both branches. Prevents the drift where agent-stable fell a full release behind dev (the v0.12.2 → v0.12.3 gap that this release closes).
Fixed
- Thin-CLI
update/check-updates/statusnow guard onisInstalled(). Previously these commands assumed~/.soma/agent/existed and crashed unhelpfully on a fresh global install beforesoma init. Now they show a clear “not installed — runsoma init” message. - Thin-CLI header text —
Status→Updateon the update subcommand (matches what the command actually does). - Thin-CLI help text —
postInstallCmdsexpanded from 8 to 16 commands, coversupdate,check-updates,status,doctor,health,focus,model,exhale, etc. - Pre-versioning project guidance — correct instructions for projects that pre-date
soma init(no version file, but.soma/exists). - Stale
soma init→soma updatereferences inthin-cli.js,docs/updating.md, anddocs/troubleshooting.md. Missed during the v0.12.3 command reshuffle. check-phases.shpipefail crash on clean working tree.grep -vreturns 1 on empty input, which underset -o pipefailkilled the script mid-run. Same bug class assoma-plans.shbash 3.2 issues. Script now runs all 10 phases to completion.
Internal
- Dropped the B2 patch attempt (
settings-manager.jsenabledModels sync). Pi #3331 fixes the upstream symptom, and the target function is minified to.n()in 0.67.68 — patching by name would silently fail. See.soma/releases/v0.12.x/model-resolution-audit.md. UPSTREAM-NOTES.mdscratchpad added tosoma-dev/for tracking changelog-worthy upstream items between Pi bumps.
[0.12.3] — 2026-04-17
Shipping integrity release. Fixes a critical bug where npm install -g meetsoma@0.3.3 produced a broken install (missing internal imports), and makes the update flow actually work. If you’ve been stuck on an older Pi runtime despite cutting newer Soma versions, this is why.
Fixed
meetsoma@0.3.3broken npm install. The published tarball imported from./lib/and./welcome/paths that weren’t included, so every freshnpm install -g meetsomafailed withERR_MODULE_NOT_FOUNDon first run. Fixed by bundlingthin-cli.jswith esbuild into a single self-contained file before publish. Has been broken since thenpm/reorg — unnoticed because existing users had working installs from before.- TUI leakage from extensions.
soma-route.tshadconsole.errorcalls that leaked into the input buffer on shutdown and during security rejects.hub-connect.ts(somaverse) had WebSocket handshake logs that appeared mid-keystroke in the prompt. Both silenced — matchesbridge-connect.ts’s silent pattern. - Silent Pi staleness in dev.
soma-dev statusnow comparesdist/vsnode_modules/Pi versions and flags drift (was the root cause of the “opus-4-7 missing” bug several users hit).
Changed
soma initno longer updates the runtime. Previously, typingsoma initin an already-initialized project silently ran a runtime update instead of doing project work — the confusing overload is removed.soma initnow always means “set up this project.”soma updatenow actually updates. Was previously status-only (told you to runsoma init). Now it performs the update:git pull --ff-onlyin~/.soma/agent/+npm install --omit=devif dependencies changed.- Pi runtime is now locked to Soma version.
soma-beta/package.jsonpins Pi exact (was^0.67.6, now0.67.6).soma-betanow ships apackage-lock.jsontoo — users get the exact Pi dependency tree we tested against. Pi updates only when Soma cuts a new release. soma doctor/soma statusnow shows installed Pi runtime version and flags drift between declared and installed. Catches the class of bug wherenpm installhadn’t been re-run after a Pi bump.soma check-updatespreserves the old “report-only” behavior thatsoma updateused to have, for when you just want to see what’s available without updating.
Added
- Periodic update check inside the agent.
soma-statusline.tsruns a silentgit fetchevery 30 minutes while the agent is running. If behind, shows⬆ updatein the statusline and writes to~/.soma/config.jsonso the nextsomaboot prints a one-line notice. Zero network latency at CLI launch. - Pre-publish smoke test.
soma-npm-publish.shnow packs the tarball, extracts it to a clean temp dir, and runsnode dist/thin-cli.js --versionbefore allowing npm publish. Aborts if the tarball has broken imports or contains forbidden content (dist/core/,.ts,node_modules/, etc.). Also integrated intosoma-dev pipelineso dev cycles catch breakage early. - Docker e2e sandbox (
soma-sandbox-docker.sh local) now reliably tests our local bundle. Previous Dockerfile had a brokenCOPY ... local-pkg*glob that created a file literally namedlocal-pkg*, so the sandbox was silently falling through to the registry version. Fixed — 24/24 tests pass in cleannode:22-slimcontainer.
Internal
repos/agent/scripts/_dev/patches/unchanged — onlyerror-sanitizerremains. An attempt to add asettings-manager-enabled-modelspatch was rolled back when it turned out not to be necessary (speculation from an inbox report; the actual user bug was update-flow staleness, not Ctrl+P cycling).- New muscles:
inbox-handling.md(inbox letters are diagnoses, not FYIs),tui-safe-logging.md(no bareconsole.*in extensions). - New soma-dev-map phase entry: Phase 0 orient now checks Pi drift (
soma-dev status) and scans inbox as part of orientation.
[0.12.2] — 2026-04-17
Added
soma modelcommand — Switch your default model from the CLI. Fuzzy matching (soma model opus), interactive selection when multiple matches, persistent save to settings. Subcommands:soma model <pattern> set(save without starting),soma model <pattern> start(save + start session),soma model --list [search](browse models).- Claude Opus 4.7 support — Available via
/modelin-session orsoma model opus-4-7 setfrom CLI. Includes adaptive thinking support. soma-dev check-upstream— Detect and audit Pi runtime updates. Checks changelog, extension surface, provider diffs, patch compatibility. Supports--audit(full analysis) and--json(machine-readable).soma-dev check-docs— Stale reference sweep across docs and website. Catches old version numbers, deprecated APIs, provider count mismatches.soma-dev check-phases— Verify dev cycle phase completion before release. Checks artifacts across all 10 phases. Supports--patchfor reduced requirements.--no-context-files/-ncflag — Skip AGENTS.md and CLAUDE.md loading for clean sessions without project context injection.after_provider_responseextension hook — Extensions can inspect provider HTTP status and headers after each response.
Changed
- CLI help reorganized — Session flags (
--model,--provider,--thinking) now grouped under “Session Options (apply to this session only)” to distinguish from persistent project commands (soma model,soma focus). - Prompt caching improved — Tool schemas now cached independently from the system prompt. Adding/removing tools no longer invalidates your entire system prompt cache (reduces cost when workspace tools connect/disconnect).
- Fresh boot greeting — When a preload exists but wasn’t loaded (plain
somavssoma inhale), the greeting now says so explicitly and suggests/inhale. Prevents the agent from reading stale preloads on clean starts.
Fixed
greptool performance — No longer stalls on broad searches withcontext=0.findtool gitignore — Nested.gitignorerules no longer leak across sibling directories.- Type safety — Fixed
breathe.preloadStaleThresholdtype cast for Pi 0.67.6 compatibility. - Preload validator — Section header matching is now fuzzy — accepts
## Next Session,## Next Session: Priorities,## Next Session: [Task Name], etc. - Protocol warm fallback — Protocols with
descriptionin frontmatter now use it for warm-tier display whenbreadcrumbis absent. Most protocols already usedescription— this fix makes them visible at warm tier. - Template sync — Shipped improved
_memory.mdtemplate to all users (Traps section, phase breadcrumbs, warning-task binding guidance). - 4 missing providers — Kimi Coding, Minimax, Z.ai, and Vercel AI Gateway added to docs. Provider count updated from 17 to 23.
Upgraded
- Pi runtime 0.67.1 → 0.67.6 (5 releases, 15+ fixes)
[0.12.1] — 2026-04-15
Fixed
- Image budget auto-compact loop —
checkImageBudget()runs on a 5-second timer butctx.compact()is async. The image counter wasn’t reset untilonComplete, so the next timer tick re-fired the warning and compact attempt, looping 6+ times. AddedimageCompactInFlightguard flag.
[0.12.0] — 2026-04-15 — Somaverse Edition
Soma meets the Somaverse. Your agent can now connect to somaverse.ai, control your workspace remotely, and pair with your browser — all through a secure relay. Data stays on your machine. The shard is just the pipe.
Added
soma login— Pair your agent with Somaverse. Creates a pairing code, opens your browser, and saves your device key. One command to connect.- Hub-connect extension — Connects your agent to the Somaverse hub as a provider. Your browser pairs with it automatically. Works alongside bridge-connect (local + cloud simultaneously).
- Workspace proxy — All 28 workspace + browser tools work through the hub relay. Your agent controls the workspace even from a remote machine.
- Device-key auth — Workspace tools auto-detect hub mode when
~/.soma/device-keyexists. Routes to hub URL with Bearer auth instead of localhost. - 28 agent tools — 10 workspace, 10 browser, 5 AI, 2 plugin state, 1 browser_links (new).
Architecture
- Reverse proxy model — The Somaverse hub relays WebSocket messages between your browser and your agent. It never stores your data — everything flows through to your machine.
- Per-user isolation — Device keys are Argon2-hashed. Each user’s workspace connection is paired by user_id. No cross-user access possible.
- Modular extensions — bridge-connect (local), hub-connect (cloud). Both run simultaneously with dedup. Add a service, add an extension.
Security
- Device keys: 192-bit random, Argon2 hashed in DB
- Transport: WSS via Traefik + Let’s Encrypt
- Hub proxy: Bearer device_key + JWT cookie auth on every request
- CORS: restricted to somaverse.ai, somaverse.space, dev.somaverse.ai
Fixed
- Breathe stale warning — disabled by default. Was firing every turn in long sessions (“28 tool calls since preload”). Now fires at most once, configurable via
breathe.preloadStaleThresholdin settings.
[0.11.4] — 2026-04-14
Fixed
- Script root-finding —
_find_root()in 10 dev scripts now checksrepos/agent/package.jsonto distinguishmeetsoma/fromrepos/agent/(both had.soma/andrepos/dirs). - sync-docs.sh — prefers
agent/(dev) overagent-stable/(main) for Phase 5 doc sync.
Added
- Image budget — auto-compact when screenshots accumulate. Soft notify at 8 images, hard auto-compact at 10. Counts all image sources (browser_screenshot, Read tool, user-pasted). Counter resets on compact. Visible in
/status. imageBudgetsettings —softAtandhardAtconfigurable viasettings.json. SethardAt: 0to disable.breathe.maxTokenssetting — caps the effective context window for breathe threshold calculations. Fixes breathe being dormant on 1M-context models where 50% = 500K tokens.- Sandbox source flags —
soma-sandbox.sh --devbuilds and tests from dev branch.--maintests agent-stable.--beta(default) tests soma-beta. API tests default to claude-haiku-4-5. - 14 new settings tests — covers removed fields, new fields, multi-level inheritance, array replacement.
Changed
- Settings cleanup — removed 3 never-implemented settings:
memory.flowUp,sessions.overwriteGuard,checkpoints.project.workingBranch. Default version updated 0.6.4 → 0.11.3.
[0.11.3] — 2026-04-14
Fixed
- Script description parser —
getScriptMeta()was parsing YAML frontmatter delimiters (---) as the script description. Every frontmatter-using script showed ”---” in the system prompt. Parser now skips frontmatter blocks, extracts# description:fields, skips decorative lines, and scans 30 lines instead of 15.
Changed
- Docs version sweep — 6 docs updated: stale version refs (v0.9.0→v0.11.2, v0.2.0→v0.3.3), extension table 4→8, scripts.md restructured into Bundled/Advanced/Hub sections.
[0.11.2] — 2026-04-14
Fixed
- soma-install.sh paths — updated
products/soma→meetsoma/reposreferences. - Duplicate session files in rotation boot — rotation path embedded file hints in both greeting AND session_files template variable. Now greeting is narrative only, session_files handled by template (matching normal boot pattern from 4d8331f).
- Triple error cascade on API failure — three independent handlers fired on single error. Added errorHandled flag, else-if chain, gated fatal-session check.
- False-positive billing detection removed —
err.includes("extra usage")matched Claude consumer error text, not actual billing issues. Pi shows raw API errors natively. Removed our pattern matching entirely. - Doctor fallback version — hardcoded 0.10.0 → 0.11.1.
- Build pipeline —
build-dist.mjswas reading Pi 0.64.0 from stalerepos/cli/dist. Now reads from npm (Pi 0.67.1). Root cause of months of invisible dist/ drift. - Release script — removed stale
CLI_DISTreference; Soma brand themes were being overwritten by Pi defaults. - Dev-mode theme crash — Pi’s config.js resolves to
src/when it exists. Added symlinks for theme, export-html, and assets paths. - Stale docs —
repos/cliref in install-architecture.md.
Changed
- Pi runtime 0.64.0 → 0.67.1 — dist/ was stuck at Pi 0.64.0 despite package.json claiming ^0.66.1. Synced from npm. Gets stack overflow fix for long sessions (#2651), subscription auth warning, queued message flush fix.
- Pi telemetry disabled — set PI_TELEMETRY=0 in cli.js to prevent install ping added in Pi 0.67.1.
- Rotation boot aligned with decomposition — greeting no longer embeds session file hints. Consistent with normal boot path pattern.
- Error handling — auth-aware (OAuth vs API key). Account rate limits (real plan limit) handled separately from extra-usage classification errors (often transient). OAuth: progressive retry → warn → pause at 4th. API key: pause immediately.
- Error display — build-time error-sanitizer patch converts raw JSON API errors to human-readable messages. Billing errors show progressive messages. Retryable errors (overloaded, 500) pass through untouched.
Added
soma-dev verify upstream— detects dist/ vs node_modules/ drift by fingerprinting key runtime files. Prevents the 0.64→0.66 invisible drift.- Runtime integrity tests — test-hygiene.sh now checks telemetry disable, boot decomposition, billing removal, error cascade flag, verify-upstream existence.
- Release pipeline gate —
soma-release.shnow blocks on dist/ upstream drift detection before building. - Error-sanitizer — build-time patch to Pi’s display layer. Progressive billing messages, auth/model rewrites. Zero cache impact.
- Patch manifest —
scripts/_dev/patches/manifest.jsontracks applied dist/ patches. - CLI repo archived — content merged to agent README.
meetsoma/cliarchived on GitHub.
[0.11.1] — 2026-04-13
Fixed
- Cache invalidation from image stripping — removed progressive image stripping from
before_provider_requestin soma-guard. Each new screenshot changed the strip set, invalidating the entire cache ($2-3 per invalidation, $152/day on Apr 12). Image management now handled by capture-time optimization + future auto-compact. - Zombie sessions — idle shutdown timer now runs independently of keepalive. Post-exhale shutdown (15 min) + absolute timeout (30 min). Previously, disabling keepalive also disabled the shutdown check.
- Boot resume cache waste — silent resume when no .soma files changed. Was injecting “Nothing changed” message that cost ~$1.78 in cache rewrite with zero value.
- Keepalive on fatal errors — kill keepalive on first-turn API failures to prevent infinite retry loops.
- Billing notice handling — separate billing notices from error-pause logic so keepalive isn’t killed on credit warnings.
- Pipeline — remove
streamingBehavior(not in Pi types), fixfocus --helpwithout seam.
Added
- Cache health tracking — statusline tracks cacheRead, cacheWrite, cost per session. Alerts on cache invalidations (>50K token writes). Footer shows ✓cache / Ninv indicator.
- Idle session detection — auto-shutdown after configurable idle period with no user input.
Changed
- Cache health indicator moved to statusline line 2 (line 1 was crowded).
[0.11.0] — 2026-04-12
Identity overhaul + first-run experience. soul.md replaces SOMA.md as default. Minimal boot for new projects. 11 bundled scripts. Critical doctor fix.
Added
soma session— session maintenance tool.strip-imagesremoves base64 image data from JSONL (16MB → 2.6MB),listshows all sessions with sizes,statsanalyzes image payload.- test-install-flows.sh — 36-assertion E2E test suite covering fresh init, v0.6→current upgrade, edge cases (corrupt settings, missing version, empty body/).
- Discovery marker:
body—findSomaDir()now detects projects with onlybody/soul.md(no SOMA.md). - User extension preservation — reinstall preserves user-installed extensions (bridge-connect.ts, workspace-tools.ts) alongside auth.json and models.json.
- Extension allowlist — configure approved extensions in settings.json,
/soma doctorreports unlisted extensions. - Image payload guard —
before_provider_requeststrips old images when >15 accumulate in conversation. Prevents Anthropic many-image 2000px limit.
Changed
- Identity: soul.md is primary —
initSomacreatesbody/soul.mdinstead ofSOMA.md.ensureGlobalSomacreatesbody/soul.mdat~/.soma/. SOMA.md and identity.md still work as fallbacks. All docs, templates, tree diagrams updated (30+ files). - autoInject default: false — new projects use
soma inhalefor intentional preload loading. Existing settings preserved on upgrade. - First-run minimal boot — first session skips hot protocol/muscle injection into system prompt. Agent discovers through use.
- Pi 0.65 migration —
session_switch/session_fork→session_startwithevent.reason. - Protocol heat-defaults reclassified — only
breath-cycleandworking-stylestart warm. All others cold. - 11 bundled scripts (was 6) — added soma-body, soma-refactor, soma-reflect, soma-plans, soma-session.
- Template single source —
body/_public/deleted, templates read fromtemplates/default/. - Hub template install — fetches soul.md → SOMA.md → identity.md, writes to body/soul.md for new projects.
Fixed
- Critical: semver comparison in thin-cli.js — doctor used JS string comparison (
"0.6.2" > "0.10.0"), so upgrades NEVER ran for any project. AddedsemverCmp()for proper numeric comparison. - CLI UX —
soma help,soma versionnow work (bare words).soma initwhen .soma/ exists routes to doctor instead of broken TUI. - Image payload guard — strips old images from conversation history, pauses keepalive on 400/invalid_request errors (was only 429). Prevents infinite retry deadlock.
- Parent chain detection — init.ts walker now checks
body/soul.mdandsettings.json, not justSOMA.md/identity.md. - soma verify crash —
${*}withset -ucaused unbound variable when called without args. - Stale refs sweep — 30+ files across docs, core, templates, scripts, community.
identity.md→body/soul.mdin all user-facing strings. - Script path leaks — soma-health, soma-verify, soma-seam, soma-refactor guarded behind path existence checks.
- Sandbox — was creating
identity.md(deprecated), now createsbody/soul.md.
[0.10.0] — 2026-04-10
Restructure release. AMPS consolidated, CLI script routing, Pi runtime bumped, 25 commits since v0.9.0.
Added
- v0.8.1→v0.9.0 migration map — settings additions (inherit, keepalive, heat.autoDetectBump), script routing syntax, AMPS consolidation notes. Chains with existing migration maps.
- soma-health.sh — project health dashboard script.
- Docker sandbox —
soma-sandbox.shcan now use Docker for isolated E2E testing (21/21 tests pass). - test-hygiene.sh — repo cleanliness checks (secrets, sessions, dev artifacts).
- verify-amps command — CWD path resolution, community protocol source validation.
- 3 scripts promoted to bundled — soma-verify.sh, soma-refactor.sh, soma-browser.sh moved from dev to discoverable.
Changed
- Pi runtime 0.64.0 → 0.66.1 — 2 minor versions, bug fixes, no breaking changes.
- Docs: CLI syntax — all 8 doc files updated from
soma-code.shtosoma codesyntax. Website synced. - Scripts reorganized — 39 dev scripts moved to
_dev/, 3 promoted to bundled, redundant scripts archived. - CWD safety audit — dev-path guards on Tier 2 scripts, soma-query demoted to
_dev/.
Fixed
- soma-guard: orphaned tool_result sanitizer —
before_provider_requesthandler removes orphaned tool_result blocks before API call. Prevents 400 errors from upstream Pi bug. - soma-statusline: auto-pause keepalive on rate limit — detects 429/rate_limit errors, auto-disables keepalive. Prevented 67+ wasted requests per rate-limit window.
- soma-doctor.sh: follow core/ symlink — was reading stale
~/.soma/agent/package.json(v0.6.0) instead of following symlink to dev repo. Now resolves through readlink. - init.ts: read version from package.json — was hardcoded to 0.6.2, now reads dynamically.
- Sandbox: deterministic prompt template test — replaced LLM-dependent test with file-read verification.
- Sandbox: extension/protocol count comparison — use
>=instead of==for forward compatibility. - soma-boot: streamingBehavior on all sendUserMessage calls — 10 calls patched, prevents runtime errors.
- Keepalive infinite loop —
keepaliveInFlightflag prevents auto-exhale from re-triggering keepalive. - CI: npm ci + tsx PATH — added to all test suites for clean CI runs.
[0.9.0] — 2026-04-04
Added
{{inbox_summary}}template variable — scans.soma/inbox/at boot, injects unread message summary into system prompt. File-based async messaging between agents.{{scripts_table}}in default_mind.md— agents can now see their discovered scripts in the system prompt.preload.autoInjectsetting — auto-inject most recent preload on fresh boot (default: true). No longer requiressoma inhaleCLI command for preload loading.- 7 new documentation pages —
inbox.md,doctor.md,hub.md,troubleshooting.md,guides/daily-workflow.md,guides/customization.md,guides/first-protocol.md. Total: 33 pages (~36K words). inter-agent-inboxcommunity protocol — published to community hub. Formal spec for file-based inter-agent messaging.- Script drift detection —
soma-verify.sh driftnow checks scripts across agent repo → working copies → global.
Changed
- Digest → TL;DR migration complete — 96 files converted from
<!-- digest:start/end -->to## TL;DR. Both formats still accepted,## TL;DRis the standard going forward. - Docs accuracy overhaul — 13 existing pages updated:
autoInjectmental model, version refs,breadcrumb→description,maxTokensdefault, session log naming format, identity.md deprecated.
Fixed
- Keepalive limit not enforcing — keepalive-triggered turns reset the ping counter, making keepalives infinite. Now tracks
keepaliveInFlightflag to skip reset on self-initiated turns. - Changelog hook targets [0.12.2] — 2026-04-17 only — old hook appended to first
### Added/### Fixedglobally, which could hit released versions. - Test suite — added
tsxto devDependencies (baretsxcalls failed), fixed 10 stale test paths (body/public→body/_public,identity.md→SOMA.md). - Stale
body/publicreferences — updated tobody/_publicacross comments, docs, templates, and scripts (6 files).
[0.8.1] — 2026-04-02
Added
- Unified warm content format —
## TL;DRreplaces<!-- digest:start/end -->across all AMPS. Protocols, muscles, and automations all use the same format. Code accepts both during transition. extractTldr()— shared utility for extracting TL;DR sections, used by protocols, muscles, and automations.- MAP = automation alias —
mapaccepted as type alias in/hub install,/hub fork,/hub share. MAPs are a type of automation. - Discovery unification —
discoverMaps()now scansamps/automations/root alongsidemaps/subdirectories. Installed hub automations are visible as MAPs. - Keepalive limits — 5 pings per idle period (configurable 0–5), countdown in notification (
♥ Keepalive 3/5), resets on user message. - Auto-exhale on idle — when keepalive lives are exhausted and context exceeds 75k tokens, the agent automatically writes a preload. Configurable via
keepalive.autoExhaleandkeepalive.autoExhaleMinTokens. - Migration phase
v0.8.0→v0.8.1— Tier 1 auto-converts muscle digest blocks to TL;DR format, adds keepalive settings.
Changed
soma-doctor.sh— reads agent version frompackage.jsoninstead of hardcoded string.- Hub validator — accepts
description/triggers/tags, prefers## TL;DRover<!-- digest -->, warns on legacy format.
[0.8.0] — 2026-04-02
Added
soma doctor— project health check and migration from CLI. Tier 1 auto-fixes (settings, body, protocols) run silently on every boot. TUI/soma doctorprovides interactive Tier 2+ migration withcompareTemplates()analysis.soma status/soma health— quick project health check (renamed from oldsoma doctor).soma --version— shows both agent and CLI versions.soma --help— delegates to core agent for full branded help output.- Migration phase system —
cycle.md+ 9 phase files covering v0.6.1 → v0.8.0. Each phase is self-contained with from/to versions, actions, and what changed. Complete chain with no gaps. _doctor-update.md+_doctor-pending.md— boot templates for agent-assisted migration. Pending template injected into followUp when updates available.compareTemplates()— three-category file diff (content files, metadata, runtime) for doctor analysis.findChildSomaDirs()— walks filesystem to discover child.soma/directories for multi-project support.doctor.autoUpdate+declinedVersion— per-project settings controlling update notification behavior.- Warm AMPS — skill loader shows full TL;DR or digest for warm content, short description for cold. All AMPS types unified.
- Body templates — improved starters for soul.md, voice.md, journal.md, pulse.md, body.md. DNA.md rewrite with self-awareness, owner’s manual, and deep reference links.
_first-breath.md— context-aware first-run template with conditional blocks for monorepos, blank projects, code projects, global/inherited.soma/.- Test suites —
test-doctor.sh(46 tests),test-migrations.sh(48 tests) covering all doctor features and migration chain integrity. - Docs —
updating.md(migration guide),install-architecture.md(CLI → agent flow),body.md(full body architecture reference with variables, templates, chain, lifecycle).
Changed
- CLI routing overhaul —
doctor,status,health,update,versionall route through thin-cli.--helpdelegates to core when agent is installed. - Starter content — code fallbacks synced to
_public/templates, HTML comments stripped from shipped content. - Bundled scripts —
soma-theme.shseeds on init, breadcrumbs added to all bundled scripts for docs and community references. _first-breath.md— added self-exploration guidance (agent reads its own docs), breath cycle explanation, learn-the-user prompts._memory.md— added Step 1.5 (update living docs), Before You Start (conditional loading), corrections emphasis.
Fixed
- CHANGELOG auto-append bug — post-commit hook was appending to every section, not just [0.12.2] — 2026-04-17. Rewrote hook, cleaned 172 duplicate entries.
- Boot version-bump race — version was bumped before notification, causing re-check loops. Now bumps after Tier 1 fixes complete.
- CLI help header — shows “CLI v0.2.0” instead of bare version number.
- Dev mode health check — no longer reports false “git repo has issues” in development.
- Tier 1 body scaffold — adds missing body files to existing
body/directory (was only creating on fresh init).
[0.7.1] — 2026-04-01
Added
- rewrite DNA.md — self-awareness, owner’s manual, link to docs for deep reference
soma --helprewrite — Soma-branded help with session commands, project commands, options, and TUI slash commands. Replaces generic Pi help output.soma --help scripts— show installed scripts with descriptions. Works from CLI and inside sessions.soma --help commands— full command reference organized by category (CLI, session, heat, hub, info).soma-theme.shbundled — shared script theming now seeds on init (was a missing dependency for 3 bundled scripts).
Fixed
- help header shows ‘CLI v…’ not bare version
- help rewrite, script theme crash, focus session, postinstall, docs
- Scripts crash on fresh projects —
source soma-theme.shwithset -ecaused fatal exit when theme file wasn’t present. Fixed withif [ -f ]; then source; fipattern across all 8 scripts. soma focus <keyword>didn’t start session —main()call wasn’t awaited,process.exit(0)ran before session could start.postinstall.jsmissing from builds — deleted during Pi 0.64.0 dist sync, restored to CLI repo. Added toOUR_DIST_FILESand release script.- Docs:
/inhalevssoma inhaleconfusion — commands.md and getting-started.md now clearly distinguish CLI commands (shell) from TUI slash commands, with comparison table.
[0.7.0] — 2026-04-01
Added
- rewrite DNA.md — self-awareness, owner’s manual, link to docs for deep reference
- /inhale guard — warns when no preload exists (suggests
/exhale), warns when preload is stale (>5 tool calls since write). Use/inhale --forceto override. - Slash command usage hints — 10 commands now include
Usage:patterns in their descriptions:/pin,/kill,/auto-commit,/inhale,/install,/auto-breathe,/hub,/scratch,/keepalive,/soul-space,/soma. - Hub: 5 new scripts — soma-seam, soma-reflect, soma-query, soma-focus, soma-plans. All with coaching-voice digests.
- Hub: soma-code v2.0.0 — added
blast(blast radius analysis),tsc-errors(TypeScript errors with context), improvedrefs(DEF/IMP/USE), improvedfind(extension filter). - Scripts docs —
scripts.mdrewritten with hub links for each script.
Changed
- Upstream sync R4 — Pi 0.63.1 → 0.64.0. New APIs:
setHiddenThinkingLabel,signal/getSignal,prepareArguments, asyncgetArgumentCompletions. - Core scripts trimmed — init seeds 5 core scripts (soma-code, soma-seam, soma-focus, soma-update-check, validate-content). Others available via
soma hub install script <name>. - Semver discipline — feature releases now bump minor version (0.X.0). Patch (0.x.Y) reserved for bug-fix-only releases.
Fixed
- help header shows ‘CLI v…’ not bare version
- help rewrite, script theme crash, focus session, postinstall, docs
- Changelog hook —
soma-dev.shpost-commit hook now targets only the first### Added/### Fixedsection (was appending to all version sections). - Hub table rendering — markdown tables in hub detail pages now render with proper
<table>/<thead>/<tbody>structure. - Community CI clean — 21 frontmatter fixes across protocols and muscles (missing breadcrumb, tier, license, author, version fields).
- Script drift — 7 scripts synced from working copies to agent repo (soma-code v1→v2, soma-reflect, soma-seam, soma-scrape, soma-spell, soma-plans, soma-query).
- Hub scripts sanitized — private paths (Gravicity, vault) stripped from soma-seam.sh.
[0.6.7] — 2026-03-30
Added
- rewrite DNA.md — self-awareness, owner’s manual, link to docs for deep reference
/soma doctor— migration command. Detects version mismatch on boot, prompts to run migration script with confirmation, shows output, reloads settings. Post-migration guidance for body file review.- Boot migration check — notifies when project
.soma/version is behind agent version. - Global vs parent detection —
detectProjectContext()distinguishes~/.soma/(global runtime) from real parent workspaces. Init prompt has three-way messaging: real parent choice, global fallback, or no soma. - Monorepo-aware first breath — detects multi-repo projects, lists sub-projects with detected stacks. Points agent to
soma-code.sh structurefor orientation. - First-breath tool hints — all first-breath messages include
soma-code.shandsoma-seam.shusage examples. - Body template scaffolding —
body.md(Project, Structure, Workflow, Current Focus sections) andvoice.md(Delivery, Tone, Rhythm sections) ship with header scaffolding and comment breadcrumbs. - Richer
_memory.md— preload template now includes Weather, Who You Were, Orient From, Do NOT Re-Read sections. - Stash checkpoint style —
checkpoints.project.style: "stash"now wired. Usesgit stash push --include-untrackedwith session ID. - Migration system —
v0.6.6-to-v0.6.7.mdmap +migrate-0.6.6-to-0.6.7.shscript. Handles settings, body templates, protocols. Backs up before replacing, skips customized files.
Changed
- System prompt budget — default
systemPrompt.maxTokensraised from 4000 to 10000. Anthropic’s system prompt is ~25k; ours at ~5k was triggering false warnings.
Fixed
- help header shows ‘CLI v…’ not bare version
- help rewrite, script theme crash, focus session, postinstall, docs
- Preload resume false-positive —
soma -cno longer falsely detects preloads from previous rotations as “written this session.” Uses mtime check (2-min threshold). - Body template instructions — moved from frontmatter
description:(invisible to agent) to HTML comment breadcrumbs in file body (visible, replaceable). - Migration script path resolution — resolves bundled templates relative to script location, works in sandbox/dev/installed contexts.
[0.6.6] — 2026-03-29
Added
- rewrite DNA.md — self-awareness, owner’s manual, link to docs for deep reference
- /inhale guard + stale warning, slash command usage hints
- Init UX — prompt before auto-scaffolding (
ctx.ui.confirm), parent .soma/ inheritance when user declines,scaffoldBodytemplateDir priority chain. (SX-164, SX-165, SX-241) - Command provenance —
/soma statusshows which extension registered each command via Pi’ssourceInfo. (SX-233) - cli.js tracked source —
src/cli.jsin agent repo is source of truth.sync-to-cli.shandsoma-release.shuse it. (SX-252) - Protocol coaching voice — 14/17 protocol TL;DRs rewritten from spec/documentation voice to coaching voice. (SX-109)
Changed
- Upstream sync R3 — Pi 0.61.1 → 0.63.1 (71 commits, 3 releases). SourceInfo provenance, built-in tools as extensions, multi-edit, sessionDir, compaction fixes. 0 breaking changes on our imports. (SX-230)
- Stale branches cleaned — deleted
feat/docs-system,feat/runtime(archived to patches),protocol-quality-pass,feature/ship-breath-cycle. Agent repo: dev + main + backup only. - scaffoldBody priority chain: templateDir → bundled
_public/→ bundledbody/.
Fixed
- help header shows ‘CLI v…’ not bare version
- help rewrite, script theme crash, focus session, postinstall, docs
- restore walk-up, keep .soma-only + runtime-home skip
- findSomaDir checks current dir only, no walk-up
- only .soma/ is a valid soma root, not .claude/ or .cursor/
- skip global runtime home in findSomaDir walk-up
/soma promptdiagnostic checked for “Learned Patterns” but actual heading is “Muscle Memory”.
[0.6.5] — 2026-03-28
Added
- rewrite DNA.md — self-awareness, owner’s manual, link to docs for deep reference
- /inhale guard + stale warning, slash command usage hints
soma inhale --list— show available preloads with age and staleness markers from CLI.soma inhale <name>— partial name match. Load a specific preload by date, session ID, or any substring. Ambiguous matches show alternatives.soma inhale --load <path>— load any file as a preload by absolute or relative path.soma map <name>— top-level subcommand replacing--mapflag. Runs a MAP with prompt-config and targeted preload.soma map --list— show available MAPs with status and description from CLI./soma preload(in-session) — enhanced to list all preloads + inject by partial name match.listPreloads()+findPreloadByName()incore/preload.ts— preload discovery and partial name matching.- Settings-driven heat overrides (
settings.heat.overrides) — per-project AMPS heat control. Values act as both seed and decay floor. Plan/MAP overrides take priority. (31e1383) inherit.automations— separate from tools inheritance, allows projects to opt out of parent MAPs independently. (3f01343)- Statusline preload indicator — shows preload status in footer. Smart
/exhaledetects edit vs write mode. (76cd246) - Auto-archive stale preloads after exhale —
archiveStalePreloads()moves old preloads to_archive/. (7f2f086) - Restart signal — auto-create
.restart-requiredon extension/core file changes, check across full soma chain. Signal moved to~/.soma/(global). (14d0253,635d36e,e252a63)
Changed
--preloadflag deprecated — shows warning pointing tosoma inhaleorsoma map. Still works for backward compat.- Boot greeting decomposed — session ID and file paths now separate template variables. (
4d8331f)
Fixed
- help header shows ‘CLI v…’ not bare version
- help rewrite, script theme crash, focus session, postinstall, docs
- restore walk-up, keep .soma-only + runtime-home skip
- findSomaDir checks current dir only, no walk-up
- only .soma/ is a valid soma root, not .claude/ or .cursor/
- skip global runtime home in findSomaDir walk-up
- Crash on partial settings —
settings.heat.overridesaccess without optional chaining crashed whenheatsection missing. Now defensive. (b837a37) - Breathe graceSeconds mismatch — runtime fallback was 60s, settings default was 30s. Aligned to 30s. (
b837a37) - 5 auto-breathe UX gaps — smart context warnings, resume awareness, write heuristic for preload detection. (
0f86bec)
[0.6.4] — 2026-03-23
Added
- rewrite DNA.md — self-awareness, owner’s manual, link to docs for deep reference
- /inhale guard + stale warning, slash command usage hints
- prompt before auto-init + parent inheritance (SX-164, SX-165, SX-241)
- show command provenance in /soma status (SX-233)
- track cli.js as source in agent repo (SX-252)
- Body architecture — structured identity system.
.soma/body/with content files (soul.md→{{soul}},voice.md→{{voice}},body.md→{{body}}) and templates (_mind.md,_memory.md,_boot.md). Content files become template variables. Templates control system prompt and preload structure. - Template engine (
core/body.ts) —{{variable}}interpolation with 5 modifiers (|tldr,|section:Name,|lines:N,|last:N,|ref), conditional blocks ({{#var}}...{{/var}}), graceful degradation for missing vars. - AMPS Skill Loader (
core/skill-loader.ts) — unified content scanner. All AMPS classified by heat: hot (8+) = full body in prompt, warm (3-7) =<available_skills>XML (agent reads on demand), cold (0-2) = hidden. Claude’s native skill format. /bodycommand — template inspector with 4 subcommands:check(health report),vars(all variables by category),map(template structure),render(full compiled system prompt, fresh from disk).- Variable registry — 50+ template variables categorized (context, identity, section, boot, session, focus, metadata, preload-tpl, deprecated) with essential flags and descriptions.
SOMA.mdreplacesidentity.mdas canonical identity file. Resolution:body/soul.md→SOMA.md→identity.md(legacy fallback).body.md— project-shaped working context variable ({{body}}). Changes per project, placed anywhere in_mind.md.- First-breath template — conditional blocks (
{{#has_code}},{{#is_blank}}) for first-run experience. /exitcommand — save state and quit cleanly.- Boot greetings rewritten — “You woke up” not “You’ve booted into a session.”
- Header bar shows soul/body status indicators.
soma-verify.sh drift—_public/sync check across protocols, muscles, body files, community repo, and agent repo.systemPrompt.maxTokenswired as soft warning — notification when compiled prompt exceeds budget.- Muscle heat bumps on load — muscles that stay relevant gain heat naturally (+1 per boot). Previously only bumped when explicitly read.
- Body file inheritance — content files and templates walk the soma chain (project → parent → global). Child wins on collision.
user.name,user.stylesettings with{{user_name}},{{user_style}}variables.
Changed
- System prompt driven by
body/_mind.mdtemplate when present. Users control structure, sections, custom text. Falls back to built-in compiler. - Warm AMPS appear as
<available_skills>XML alongside Pi native skills — Claude’s trained format for lazy-loaded content. prompts/system-core.md— removed explicit context percentages (50/70/80/85%). Auto-breathe handles thresholds; agent shouldn’t guess.- AMPS cleanup — 44 → 34 active muscles (10 archived), 9 → 2 high-overlap triggers (16 cleaned), 34/34 have descriptions.
- Docs sweep — 9 pages updated for body architecture, SOMA.md, skill loader, template engine, removed gendered pronouns.
sync-docs.shmanifest expanded — 10 new docs added (focus, maps, sessions, prompts, skills, settings, themes, keybindings, models, terminal-setup).- Protocol test accepts
description:alongsidebreadcrumb:(migration compat). - Sandbox test updated for 8 extensions, 19 protocols, SOMA.md init.
Fixed
- help header shows ‘CLI v…’ not bare version
- help rewrite, script theme crash, focus session, postinstall, docs
- restore walk-up, keep .soma-only + runtime-home skip
- findSomaDir checks current dir only, no walk-up
- only .soma/ is a valid soma root, not .claude/ or .cursor/
- skip global runtime home in findSomaDir walk-up
- defensive settings.heat access + stale test mocks — 567/567 pass
- 5 UX gaps — smart warnings, resume awareness, write heuristic
- Conversation tail injection removed — was scanning stale Pi JSONL sessions from wrong runtime, sidetracking agent with old conversations.
- Soul frontmatter leaking into rendered system prompt —
loadIdentity()now strips YAML frontmatter. - Duplicate
# Identityheading —buildLayeredIdentity()no longer hardcodes heading; template handles it. _public/drift — 22 files synced across community + agent repos. Drift detection tool built.- Boot message duplication — stripped content already in system prompt from boot followUp.
/body rendercompiles fresh from disk each time (was using stale boot cache).
Internal
VARIABLE_REGISTRYincore/body.ts— complete registry of all template variables with categories, essential flags, descriptions.core/skill-loader.ts—LoadableContentinterface,loadAllContent(),formatAsSkillsXml().compileWithTemplate()— template path incompileFullSystemPrompt(), shared section builders.getDefaultMindTemplate(),getDefaultBootTemplate()— built-in fallback templates.loadFirstBreath()— conditional first-run template with chain inheritance.- 52 block variables tested (77/77 body tests + 19 E2E).
- Frontmatter-kit — 9 scripts for bulk AMPS frontmatter operations (extract, writeback, sort, migrate, audit).
preload.lastMessagessetting removed (conversation tail scanner was the only consumer).
[0.6.3] — 2026-03-22
Added
- rewrite DNA.md — self-awareness, owner’s manual, link to docs for deep reference
- /inhale guard + stale warning, slash command usage hints
- prompt before auto-init + parent inheritance (SX-164, SX-165, SX-241)
- show command provenance in /soma status (SX-233)
- track cli.js as source in agent repo (SX-252)
- settings-driven heat overrides — per-project AMPS control
- inherit.automations — separate from tools inheritance
- statusline preload indicator + smart /exhale (edit vs write)
- auto-archive stale preloads after exhale + archiveStalePreloads()
/hubcommand — unified hub interface for community content. Install, fork, share, find, list, status. Replaces old/installand/listcommands (kept as backward compat aliases).- Smart sharing (
/hub share) — quality scoring (0-100%), privacy auto-fix with_public/staging, README generation that captures--helpoutput and extracts functions, dependency resolution. - Drop-in commands — scripts in
.soma/amps/scripts/commands/become/soma <name>commands. Hot-loadable, no restart needed. Tab completions included. scope: coreprotocols — documentation protocols whose behavior is coded in TypeScript. Never loaded into prompt (saves ~2000 tokens). Discoverable, readable on demand via docs section./pinand/killblock with explanation.- 5 core protocols — breath-cycle, heat-tracking, session-checkpoints, git-identity, hub-sharing.
automationcontent type — MAPs are now installable hub content. 3 published: debug, refactor, visual-gap-analysis.- Dependency resolution —
requires:in frontmatter auto-installs dependencies (scripts, protocols, muscles) alongside content. gitIdentity.emailarray support — multiple valid emails for multi-account users.- Default preload template — Weather (emotional tone) + Warnings (traps for next session) sections.
- Preload template on community hub — customizable preload format.
- Regression test suite — test-hub.sh (25 tests) + test-commands.sh (26 tests). Side-effect testing for
-pmode.
Changed
- Hub: 40 items across 5 content types (17 protocols, 8 muscles, 3 scripts, 3 automations, 9 templates).
/soma promptshows core protocols with 📄 icon instead of misleading heat display.- Bundled protocols updated with shipped tool references (soma-code, soma-scrape, soma-spell).
- Community CI — validate-frontmatter accepts
triggers(replacestopic+keywords),descriptionORbreadcrumb. Format-check supportsscope: core. Attribution allows org identity for owners. Actions upgraded to v6 (Node 22).
Fixed
- help header shows ‘CLI v…’ not bare version
- help rewrite, script theme crash, focus session, postinstall, docs
- restore walk-up, keep .soma-only + runtime-home skip
- findSomaDir checks current dir only, no walk-up
- only .soma/ is a valid soma root, not .claude/ or .cursor/
- skip global runtime home in findSomaDir walk-up
- defensive settings.heat access + stale test mocks — 567/567 pass
- 5 UX gaps — smart warnings, resume awareness, write heuristic
/hub list --remote— flag was parsed as type filter, returning 0 results.- Drop-in command output — ANSI escape codes stripped (sendUserMessage renders markdown, not terminal).
- Stale git-identity heat rule removed from HEAT_RULES (protocol was archived).
- soma-refactor.sh scan — string references now exclude node_modules/dist/.git.
Security
- soma-beta —
.mapfiles (128) and.d.tsfiles (64) stripped from dist. Source maps contained fullsourcesContent. - soma-beta — orphan history on every release. Old commits can’t recover source code.
Internal
- 7-phase dev cycle MAP (soma-dev/cycle.md with phase files)
- Blog content cycle MAP (blog/cycle.md with phase files)
- SVG blog diagrams muscle (Soma palette, transparent bg, rsvg-convert pipeline)
- Migration v0.6.2→v0.6.3 updated for scope:core + git-identity restore
- FRONTMATTER.md rewritten, CONTRIBUTING.md updated
- 185 unit test assertions (was 162), 51 regression tests
[0.6.2] — 2026-03-21
Added
- rewrite DNA.md — self-awareness, owner’s manual, link to docs for deep reference
- /inhale guard + stale warning, slash command usage hints
- prompt before auto-init + parent inheritance (SX-164, SX-165, SX-241)
- show command provenance in /soma status (SX-233)
- track cli.js as source in agent repo (SX-252)
- settings-driven heat overrides — per-project AMPS control
- inherit.automations — separate from tools inheritance
- statusline preload indicator + smart /exhale (edit vs write)
- auto-archive stale preloads after exhale + archiveStalePreloads()
- Natural muscle heat detection — muscles now heat-bump from natural use, not just focus. Script execution matches against
tools:field. File edits match path segments againsttriggers. Zero configuration needed. - Migration system —
versionfield in settings.json.core/migrations.tsdiscovers and chains migration maps.soma doctorchecks workspace health.soma doctor --fixauto-repairs.soma doctor --migratespawns agent for complex fixes. - Community template sync — boot fetches latest protocols from community repo. Bundled protocols serve as offline fallback. Add content to community → add name to template → all new users get it.
tools:field in muscle frontmatter — declares which scripts a muscle references. Parsed and used for natural heat detection.
Changed
- Triggers consolidation —
triggers+keywords+topicmerged into singletriggerslist at parse time.tagsstays for categorization only. Old format works indefinitely (backwards compat). - Muscle interface simplified — one activation list instead of four redundant fields with different score weights.
- Personality engine — welcome flow is honest about being templates, not the agent.
Fixed
- help header shows ‘CLI v…’ not bare version
- help rewrite, script theme crash, focus session, postinstall, docs
- restore walk-up, keep .soma-only + runtime-home skip
- findSomaDir checks current dir only, no walk-up
- only .soma/ is a valid soma root, not .claude/ or .cursor/
- skip global runtime home in findSomaDir walk-up
- defensive settings.heat access + stale test mocks — 567/567 pass
- 5 UX gaps — smart warnings, resume awareness, write heuristic
- Runtime delegation — soma-beta now includes cli.js and Pi runtime files. Previously thin-cli fell through to raw Pi (no version skip, no auto-rotate, “Update Available” banner).
- Fresh installs now include version field in settings.json.
- Stale test assertions — test suite checked for removed frontmatter fields and nonexistent commands.
Internal
- soma-theme.sh, soma-rebrand.sh, soma-switch.sh dev mode, soma-doctor.sh
- script-polish + github-theming muscles
- 7 repo READMEs refreshed, post-release MAP created
- License date corrected to 2027-09-18, contact standardised to meetsoma@gravicity.ai
- Dangerous CI disabled (release-publish.yml shipped full source on v* tags)
[0.6.1] — 2026-03-20
Changed
- Pi runtime upgraded 0.61.0 → 0.61.1 — Release Round 3 (#3cbf2bc)
- Keybinding eviction fix (stop removing unrelated defaults)
- agentDir respected for SDK session paths
- Suspend/resume stability (Ctrl+Z/fg)
- ToolCallEventResult exported
Fixed
- help header shows ‘CLI v…’ not bare version
- help rewrite, script theme crash, focus session, postinstall, docs
- restore walk-up, keep .soma-only + runtime-home skip
- findSomaDir checks current dir only, no walk-up
- only .soma/ is a valid soma root, not .claude/ or .cursor/
- skip global runtime home in findSomaDir walk-up
- defensive settings.heat access + stale test mocks — 567/567 pass
- 5 UX gaps — smart warnings, resume awareness, write heuristic
- CLI dist synced from pi-mono 0.61.1 —
getEditorKeybindings→getKeybindingscrash resolved - Stale
content-cli.jsimport removed (Pi 0.61.0 moved install/list/content to main.js) --helpfixed —printGumHelpremoved in 0.61.0, replaced withprintHelp- Heat system docs:
.protocol-state.json→state.jsonacross 6 files, 3 repos - Protocols page: collapsed 60-line heat duplication to reference, renamed “Protocols & Heat” → “Protocols”
soma-verify.sh self-analysis: script search recurses into subdirectories, skips archived.soma/- 7 muscles: missing
topic:/keywords:frontmatter restored .protocol-state.jsondeleted (dead since March 13)
Docs
- 27 pages across 5 sections (was 24 across 5 disorganised sections)
- New:
amps.md(four-layer overview),migrating.md(from CLAUDE.md/.cursorrules),troubleshooting.md - Collapsible sidebar with section icons
- Roadmap curated for all 7 versions, “Next” section added
/betaredesigned: “Private Beta” → “Source Access” with tier cards and Known Gaps
Blog
- “Three Files” — solo, on identity and architecture
- “The Ratio” — solo, on code vs behavior growth
- “The Operating System We Didn’t Plan” — solo, on AMPS as dev process
- Interlinks across all 8 published posts + doc page SEO links
Internal
soma-devCLI: doctor, fix, sync-dist, reinstall commandssystem-audit+audit-preflightMAPs — truth-check any subsystemrelease-trackingprotocol +release-cycleMAP- Release folder structure:
v0.6.0/(archived) +v0.6.x/(living) - AMPS organised:
_public/staging for hub, consistent across protocols/muscles/scripts amps-interconnectMAP restored from archivesolo-editorialmuscle for agent-authored blog posts
[0.6.0] — 2026-03-20
Added
- rewrite DNA.md — self-awareness, owner’s manual, link to docs for deep reference
- /inhale guard + stale warning, slash command usage hints
- prompt before auto-init + parent inheritance (SX-164, SX-165, SX-241)
- show command provenance in /soma status (SX-233)
- track cli.js as source in agent repo (SX-252)
- settings-driven heat overrides — per-project AMPS control
- inherit.automations — separate from tools inheritance
- statusline preload indicator + smart /exhale (edit vs write)
- auto-archive stale preloads after exhale + archiveStalePreloads()
MAP System — Plan-Driven Agent Orchestration
maps.ts— MAP discovery + prompt-config YAML parser (#1039512)PlanPromptConfig— plan-driven system prompt overrides: heat overrides, force-include/exclude, section toggles, budget overrides, supplementary identity (#28d71fe)soma --map <name>— MAP targeting via.boot-targetsignal file. Loads prompt-config, targeted preload, and MAP content as navigation context (#a12709e)- 18 tests for MAP parser + plan override compilation (#df835cb)
Focus Targeting — Seam-Traced Boot
soma-focus.sh— pre-model seam-traced boot priming. Traces keyword through memory, scores relevance, generates.boot-targetwith heat overrides (#116c4bb)- Focus handler in
soma-boot.ts—type: "focus".boot-target support. Loads focus preload, related MAPs (max 3), focus summary (#2f7d302) - Muscle trigger engine —
triggers:frontmatter parsed and matched at boot. Muscles auto-activate when focus keyword matches their tags, keywords, topics, or explicit triggers (#1bc1c57) matchMusclesToFocus()— TypeScript-native muscle matching with scored relevance (10=trigger, 5=tag/keyword, 4=topic, 3=name, 2=digest) (#1bc1c57)trackMapRun()— programmatic MAP usage tracking. Auto-incrementsruns:and updateslast-run:in frontmatter when MAP loads via .boot-target (#893f176)
Scripts — Agent Tools That Ship
- 5 Tier 1 scripts now ship with Soma and are seeded on
soma init(#116c4bb):soma-code.sh— multi-language codebase navigator (map, find, refs, replace, structure, tsc-errors)soma-seam.sh— trace concepts through memory, code, and sessionssoma-focus.sh— seam-traced boot primingsoma-reflect.sh— parse session logs for patterns and observationssoma-plans.sh— plan lifecycle management
scaffoldScripts()ininit.ts— copies bundled scripts to.soma/amps/scripts/on init (#116c4bb)ensureGlobalSoma()— bootstraps~/.soma/with AMPS layout on first boot. Seeds scripts, creates global identity template. Idempotent. (#47422e8)- Protocol scope fix — 5 protocols changed from hub/internal to bundled for proper CLI distribution (#47422e8)
- Recursive AMPS discovery — muscles, protocols, scripts, MAPs now scan subdirectories (max 2 levels). Directories with
_or.prefix are skipped. Enables organized layouts:muscles/ui/,scripts/dev/,maps/runtime/(#c36dcd0) - Identity template enhanced — 5 working patterns (read-before-write, scripts-first, verify-before-claiming, corrections-as-signal, log-your-work) in both built-in and smart templates (#98035e9)
soma-pr.shmoved to_dev/— requires GitHub App secrets users don’t have (#98035e9)soma-scrape.sh— intelligent doc discovery + scraping (resolve, pull, search, discover). Requires gh, curl, jq (#18e5bde)soma-query.sh— unified search replacing soma-scan + soma-search. Commands: find, list, search, sessions, related, impact (#5604f2a)/scan-logs --sendflag — injects search results into agent conversation (#1f891a5)
Guard & Safety
- Worktree boundary enforcement — hard-block writes outside allowed worktree path (#961f2bc)
- Soul-space command gated behind
.gate.mdfile (#2b0d819)
Agent Infrastructure
- PR template, agent contribution standards for GitHub App bot PRs (#743b48d)
- Soul-space mode —
/soul-space onreplaces keepalive with MLR prompts (#caea905) - TypeScript type checking (
npm run check) + biome linting (npm run lint) (#20ab881)
Identity & Protocols
- Identity bootstrap with 4 sections: This Project, Voice, How I Work, Review & Evolve (#c5086ea)
response-styleprotocol — set voice, length, emoji, and format preferences (#50aee8a)- Dignity clause in
correction-capture— acknowledge without over-apologizing (#50aee8a) mapsprotocol — teaches MAP system: check before tasks, build after repeated processes (#4a85b53)plan-hygieneprotocol — plan lifecycle: status tracking, ≤12 active budget, verify before claiming (#4a85b53)soma inhaleCLI subcommand — fresh session with preload from last session (#f61064f)soma(no args) now starts clean — no preload injection (#f61064f)- User interrupt detection during auto-breathe — 1st interrupt resets timer, 2nd cancels (#d530af8)
- Gum-formatted
--helpoutput with tables and styled header (cli)
Changed
- Pi runtime upgraded 0.60.0 → 0.61.0 — full upstream sync (Release Round 2), 76 upstream commits (#de7bd1c)
PI_PACKAGE_DIR+SOMA_CODING_AGENT_DIRenv vars — correct path delegation for .soma/ project dirs (#5c9ba4d, #f5818a6)system-core.mdupdated — scripts-first workflow, tool-building guidance, session logging format, preload coaching, verify-before-claiming (#116c4bb)tool-discipline.mdv3.0.0 — script-first workflow, when to build scripts, script standards (#116c4bb)soma-breathe.tsextracted fromsoma-boot.ts— cleaner separation of concerns (#aa4ae19)- Protocol quality-standards expanded — close-the-loop, tests-match-code, conventional commits (#d2dc95d)
- Preload quality added to breath-cycle TL;DR (#0632fad)
- Author attribution + CC BY 4.0 license footers on protocols (#0a2e0ac)
Fixed
- help header shows ‘CLI v…’ not bare version
- help rewrite, script theme crash, focus session, postinstall, docs
- restore walk-up, keep .soma-only + runtime-home skip
- findSomaDir checks current dir only, no walk-up
- only .soma/ is a valid soma root, not .claude/ or .cursor/
- skip global runtime home in findSomaDir walk-up
- defensive settings.heat access + stale test mocks — 567/567 pass
- 5 UX gaps — smart warnings, resume awareness, write heuristic
- Edit tool detection in preload + overwrite-safe breathe instructions (#9e7684f)
- Auto-breathe graceSeconds consistency + DRY path helpers (#ec857f8)
- Auto-breathe timeout + session log
-2suffix bugs (#baaf51b) - Session ID extraction from Pi entry format (#7b3931e)
- Reuse session ID on resume — no more orphan logs (#01bc3b7)
- Guard session_start against Pi cache re-fire (#04571ed)
- All 10 pre-existing TypeScript errors resolved — 0 type errors (#13bfaf9)
/auto-breathe offnow cancels in-flight rotation (#2bdcf99)- Stray ‘t’ in boot causing “Failed to load extension: t is not defined” (#be18665)
findSomaDirreturns SomaDir object — use.pathfor join() (#73eca3b)- Settings test allows partial override files (guard-only) (#d372373)
- Maps test output format matches
Results:pattern for soma-ship (#45017ce) /scraperoute.provide moved inside handler scope (#cf0170d)- Warm protocol TL;DRs shortened from 400-555 to ~150 chars — saves ~1500 tokens per boot (#9008d43)
pre-flightheat lowered from 8 (hot) to 5 (warm) — too heavy for empty repos (#9008d43)scaffoldProtocols()now copies ALL bundled protocols on init, not just breath-cycle (#9008d43)- Auto-breathe grace period is now time-based (30s default) instead of turn-based (#8ca5e52)
- Preload trust hierarchy — boot instructions explicitly require stating resume point (#dfb5ca9)
- Hub protocol TL;DRs tightened (git-identity, session-checkpoints, tool-discipline) (#dd8c4cf)
- Breadcrumbs synced from community — consistent cross-repo references (#9461185)
- All 14 bundled protocols synced to workspace — zero drift. 7 had diverged since v0.5.2 (#d49d9c7)
soma-focus.shunbound variable fix when no.soma/exists (#d49d9c7)soma-focus.shregex updated for recursive AMPS paths (subdirectory muscles/protocols/MAPs) (#6f7549f)- MAP discovery now scans
projects/*/phases/*/map.md— phase MAPs co-located with project specs (#9f9cca7) findMap()falls back to full discovery when direct path lookup fails (#9f9cca7)- MAP scope: 8 root MAPs changed from
internaltopublic(build-muscle, build-script, debug, plan-to-maps, refactor, soma-focus, plan-validation, sdk-research) - MAP test uses temp fixture instead of hardcoded workspace path (#bd53f45)
- Focus fast mode for common keywords — skip seam trace when 50+ matches, scan frontmatter directly (#027fc87)
- Focus heat scoring fixed —
score * 2reaches HOT tier (wasscore + 2, max WARM). Force-include at score 5+ (was 8+) (#5d572d6) - Focus MAP prompt-config merging — related MAPs’ heat overrides and force-includes merge into focus session (#5d572d6)
ensureGlobalSoma()now seeds bundled protocols — existing users get new protocols on upgrade (#fe29c0e)- Tests updated for soma-query consolidation, maps protocol frontmatter fixed (#29687e7)
- Removed dead
getScriptDescription()function (#6ddc8f7) - Maps protocol TL;DR updated with
soma focus+ tracking mention (#a4e8413) scaffoldScriptsnow seeds all 10 shipped scripts (was 8) (#2757bdb)- All directory trees in docs aligned with amps/ layout (#705e089)
- Stale memory/muscles paths fixed → amps/muscles (#ba5c5ca)
Docs
- New page:
models.md— comprehensive Models & Providers guide: 17+ providers, API key storage, custom providers (#1781d24) - New page:
keybindings.md— keyboard shortcuts and customisation (#56ab090) - New page:
themes.md— built-in and custom themes (#56ab090) - New page:
settings.md— engine settings reference (#56ab090) - New page:
terminal-setup.md— terminal recommendations and tmux (#56ab090) - New page:
sessions.md— session tree, fork, compaction, branch summarisation (#cdb7cd1) - New page:
prompts.md— prompt template format and usage (#cdb7cd1) - New page:
skills.md— SKILL.md format and skill authoring (#cdb7cd1) getting-started.mdupdated — “Set Up a Provider” section, model switching (#1781d24)commands.mdupdated — Model Commands section, CLI model flags (#1781d24)extending.mdupdated — custom model providers section (#b99902a)- Pi doc parity: 23/23 docs covered (was 15/23)
- New page:
maps.md— MAP system guide: creation, prompt-config, loading, tracking (#14744fb) - New page:
focus.md— seam-traced boot priming: usage, matching scores, triggers (#14744fb) scripts.mdrewritten — 6→14 scripts documented, core/utility sections, “Building Your Own” guide (#14744fb)how-it-works.md— added MAPs + Focus sections, fixed duplicated paragraph, context scaling note (#14744fb)configuration.md— added Custom Content Paths, Script Discovery, Global Config (~/.soma/) sections (#6ddc8f7)muscles.md— added tags, triggers, tools frontmatter fields (#14744fb)protocols.md— 4→16 protocol table with all shipped protocols (#14744fb)- Commands page: add /code, /scrape, /scan-logs, fix auto-continue→rotate, add —orphan (#5629dd3)
- Guard: add cross-references to related muscles, MAPs, scripts (#dd1a117)
- How-it-works: add router and CLI rotation to auto-breathe section (#35c939e)
- Add /route command and soma-route.ts extension docs (#668b23f)
- Scripts: add soma-scan and soma-search, fix usage paths for npm users (#e791660)
- Fix preload naming convention docs (#2b1be52)
- Reality check — remove stale scripts, fix AMPS layout, update commands (#dfce881)
Protection & Distribution
- BSL 1.1 license deployed to all repos (agent, cli, community, core)
- All GitHub repos → private (soma-agent, cli, community, core)
- npm: 6/7 versions unpublished, v0.1.0 deprecated
- Beta signup: Vercel serverless API → GitHub Issue via soma-agent[bot]
- beta-testers GitHub team created (read access to soma-agent)
- esbuild obfuscation pipeline —
scripts/build-dist.mjscompiles 7 extensions + core to 140KB minified+mangled JS (#ef86ff5) - Distribution verification —
scripts/verify-dist.mjswith 23 checks (#8962681) npm run build:dist— clean + compile + verify in one command- Protocols ship as readable .md in
dist/content/
Thin CLI (repos/cli)
- Thin CLI wrapper — 37KB total, zero dependencies, pure Node built-ins
- Personality engine (
personality.js) — 12 skeleton intents, 46 variants, 9 spintax topics, 14 paragraph templates - Interactive Q&A — press
?to ask about 9 topics with keyword matching (50+ triggers) - Typing animation —
typeOut()with punctuation pauses, random jitter, ANSI-aware soma init— GitHub CLI auth:gh→ team membership (with repo access fallback) → clone dev → npm installsoma doctor— 11 health checks with personality engine summarysoma update— npm CLI + core git versions (fetch-first)soma status— version, home, install state, beta access, core branch@hashsoma about— full explainer with generated pitch footer- No-compaction topic — key differentiator messaging
- Daily rotating concepts (8 topics) on welcome screen
- Beta access cached with 1-hour TTL
- Delegation:
PI_CODING_AGENT_DIRenv var → Pi discovers Soma extensions (#8598c56) - Smart command detection — post-install commands show “requires runtime”
PI_PACKAGE_DIRdelegation — thin-cli.js resolves piConfig from soma-beta package.json, all project paths →.soma/(#5c9ba4d)SOMA_CODING_AGENT_DIR— both PI_ and SOMA_ env vars set for delegation regardless of piConfig load order (#f5818a6)- User extension discovery —
.soma/extensions/passed via-eflags to Pi runtime - soma-beta v0.6.0-rc.6 — self-contained: thin-cli + personality + extensions + core + themes + export-html + protocols (680KB)
soma-release.sh— reads Pi dep versions dynamically from agent package.json, bundles thin-cli.js + personality.js, piConfig verification gate
Testing
soma-sandbox.sh— 30 automated E2E tests: branding (5), paths (3), infra (7), bundled CLI (5), models (3), identity (1), path resolution (3), tools (3), extensions (1), features (2)soma-seam.sh audit upstream— cross-references upstream Pi changes against our imports, flags breaking changes, maps API usage frequency- Test suite overhaul — 7/13 suites execute real TypeScript via tsx (487+ total assertions)
test-settings.sh— 21 executed tests: defaults, cascade, malformed JSON, path resolution (#c13a7d3)test-identity.sh— 13 executed tests: hasIdentity, loadIdentity, buildLayeredIdentity (#c13a7d3)test-preload.sh— 15 executed tests: findPreload, hasPreload, filenames, instructions (#c13a7d3)test-protocols.sh— +11 executed: detectProjectSignals, protocolMatchesSignals (#5dcc324)test-utils.sh— 26 executed: every exported function tested (#5dcc324)test-muscles.sh— enforces triggers, applies-to, frontmatter integrity (#db5c5a4)
AMPS Hygiene
- 33 muscles patched — all active muscles have
triggers:andapplies-to: - 2 corrupted frontmatter fixes + 31 YAML merge artifacts fixed
- e2e-flow-testing muscle — test in isolation pattern
- Visual gap analysis MAP expanded (9 steps, 7 patterns, E2E test phase)
- 5 MAPs updated with test quality info
- release-cycle MAP: +Phase 5 (changelog sync) +Phase 6 (E2E verification)
Internal
- Pi constraints documented — discovery.ts untestable outside Pi runtime, piConfig package-scoped, no programmatic extension registration, APP_NAME defaults to “pi”
- Ignore per-worktree
.pi/and.soma/settings.jsonin git (#d6778a2)
[0.5.2] — 2026-03-15
Added
- rewrite DNA.md — self-awareness, owner’s manual, link to docs for deep reference
- /inhale guard + stale warning, slash command usage hints
- prompt before auto-init + parent inheritance (SX-164, SX-165, SX-241)
- show command provenance in /soma status (SX-233)
- track cli.js as source in agent repo (SX-252)
- settings-driven heat overrides — per-project AMPS control
- inherit.automations — separate from tools inheritance
- statusline preload indicator + smart /exhale (edit vs write)
- auto-archive stale preloads after exhale + archiveStalePreloads()
/scan-logscommand — search previous tool calls + results across sessions (#31a7e17)/scrapecommand +scrape:buildrouter capability — intelligent doc discovery (#c950f2b)- Boot session warnings injection — tool usage stats from previous session (#0cda314)
- Boot last conversation context — inject last N messages on fresh boot (#f1d7f3d)
- Periodic auto-commit for crash resilience (#c6caccc)
graceTurnssetting — configurable grace period before auto-breathe rotation (#c9ab5a8)- Guard v2: tool→muscle gating — require reading muscles before dangerous commands (#1c6b725)
- Protocol TL;DR extraction —
protocolSummary()prefers## TL;DRbody section (#83ec9ee) - Scratch lifecycle: session IDs, date sections, note management, auto-inject (#fd0bda2, #0d364f2)
- Combined session ID format (
sNN-<hex>) — sequential for order, hex for uniqueness (#e7c4057) - Statusline session ID display (#d474cbf)
- Polyglot script discovery — .sh, .py, .ts, .js, .mjs (#1acb8c2)
- Session log nudge with template at trigger point (#eb8acc8)
- Identity layer in pattern-evolution, tool-awareness in working-style (#5e4219d)
- Post-commit auto-changelog + pre-push docs-drift nudge hooks (#cc2ef55)
Changed
- System prompt trimmed ~19% — remove duplication and stale content (#de9c517)
- Self-awareness protocols rewritten — 5 redundant protocols → configuration guides (#b70ca44)
- Config-first script extensions via
settings.scripts.extensions(#dadb78e) - Unified rotation through
/inhale, removed/auto-continue(#7b7ba52) - Migrated
globalThis.__somaKeepaliveto router (#e919481)
Fixed
- help header shows ‘CLI v…’ not bare version
- help rewrite, script theme crash, focus session, postinstall, docs
- restore walk-up, keep .soma-only + runtime-home skip
- findSomaDir checks current dir only, no walk-up
- only .soma/ is a valid soma root, not .claude/ or .cursor/
- skip global runtime home in findSomaDir walk-up
- defensive settings.heat access + stale test mocks — 567/567 pass
- 5 UX gaps — smart warnings, resume awareness, write heuristic
- Boot: clean up muscle/protocol/automation formatting (#38a643f)
- Boot: resume without fingerprint sends minimal boot, not full redundant injection (#7fd064b)
- Boot: grace countdown skips tool turns during auto-breathe (#53bd421)
- Boot: preload filename overwrites + rotation when preload pre-exists (#378a1b1)
- Boot: auto-init
.soma/.gitwhen autoCommit is true (#276f6f2) - Boot: clear restart signal at factory load time (#0bddce2, #bb8350c)
- Muscles/automations: filter archived status + README in discovery (#5f5ccae, #e42da9b)
- Protocols: clean stale references, fix broken frontmatter (#7087d6a)
- Protocols: correct attribution — Curtis Mercier only on personal/protocols-derived (#5d8fb83)
- Heat: dynamic muscle read + script execution detection (#99a7663)
- Extensions: soma-route.ts import path — use pi-coding-agent not claude-code (#49454ea)
- Scripts: stop shipping dev-only scripts to users (#2c8db4a)
- Scripts: sync paths after _dev/ move, AGENT_DIR resolution (#46615ef, #a520c13)
- Statusline: restart detection, fs/path imports, signal path fixes (#f845894, #926fd4a, #18eba69)
- Auto-breathe: reduce triple notifications, preload-as-signal rotation (#927bd74)
[0.5.1] — 2026-03-14
Added
-
rewrite DNA.md — self-awareness, owner’s manual, link to docs for deep reference
-
/inhale guard + stale warning, slash command usage hints
-
prompt before auto-init + parent inheritance (SX-164, SX-165, SX-241)
-
show command provenance in /soma status (SX-233)
-
track cli.js as source in agent repo (SX-252)
-
settings-driven heat overrides — per-project AMPS control
-
inherit.automations — separate from tools inheritance
-
statusline preload indicator + smart /exhale (edit vs write)
-
auto-archive stale preloads after exhale + archiveStalePreloads()
-
Capability router for inter-extension communication (
soma-route.ts) — provides/gets capabilities, emits/listens signals. ReplacesglobalThishacks (#94576f3, #e919481) -
CLI-based session rotation via
.rotate-signalfile — auto-breathe can now rotate without command context (#2da3155) -
Per-session log files with auto-incrementing names (
YYYY-MM-DD-sNN.md) — prevents overwrites across rotations (#d776dd6) -
Session log and preload paths surfaced in boot message (#d934799)
-
Resume boot diffing —
soma -cskips redundant preload injection (#de39fd1) -
Restart-required detection — signal file, cmux notification, and statusline indicator when core/extension files change (#9f2a103, #f845894, #926fd4a, #18eba69)
-
soma-changelog.sh— generate categorized changelog entries from conventional commits with[cl:tag]consolidation -
soma-changelog-json.sh— parse CHANGELOG.md into JSON for website consumption -
ChangelogIsland.tsx + RoadmapTimeline.tsx — Preact islands for
/changelog/and/roadmap/pages -
soma-threads.sh— chain-of-thought tracing tool for blog seeds across session logs -
soma-verify.sh self-analysis— muscle health, cross-location divergence, orphan detection -
Protocol TL;DR extraction —
protocolSummary()prefers## TL;DRbody section over breadcrumb (#83ec9ee) -
Combined session ID format (
sNN-<hex>) — sequential for human scanning, hex for collision safety (#e7c4057, #618cd9f) -
commit-msggit hook — validates conventional commit format +[cl:tag]syntax -
guard.toolGatessetting — require reading muscles before dangerous bash commands (#1c6b725) -
breathe.graceTurnssetting — configurable auto-breathe grace period, replaces hardcoded 6-turn limit (#c9ab5a8) -
Session log nudge with template at breathe trigger point (#eb8acc8)
-
Periodic auto-commit every 5th turn for crash resilience (#c6caccc)
-
Scratch note lifecycle — session IDs, date sections, active/done/parked status, router capabilities, auto-inject (#0d364f2)
-
Statusline shows session ID on line 2 (#d474cbf)
-
Polyglot script discovery —
.sh,.py,.ts,.js,.mjs(#1acb8c2)
Changed
- Auto-breathe rotation now writes
.rotate-signaland callsctx.shutdown()immediately when preload already exists — no more waiting forturn_endthat may not fire (#378a1b1) - Preload filenames use
sNNiterating pattern (was static session ID suffix) to prevent overwrites within a session (#378a1b1) - Self-awareness protocols consolidated — 5 redundant protocols became configuration guides (#b70ca44)
/scratchextracted to standalonesoma-scratch.tsextension (#932f446)- Shared helpers extracted to
utils.ts— deduplication across core modules (#2dbea9a, #3d8467e) - Unified rotation through
/inhale, removed/auto-continue(#7b7ba52) - Changelog pipeline switched to Ghostty-style commit-driven entries (#ec27a11)
pattern-evolutionprotocol updated with identity maturation layer;working-stylewith tool-awareness (#5e4219d)- Dev hooks generated locally by
soma-dev.sh, not committed to repo (#efc6ed4)
Fixed
-
help header shows ‘CLI v…’ not bare version
-
help rewrite, script theme crash, focus session, postinstall, docs
-
restore walk-up, keep .soma-only + runtime-home skip
-
findSomaDir checks current dir only, no walk-up
-
only .soma/ is a valid soma root, not .claude/ or .cursor/
-
skip global runtime home in findSomaDir walk-up
-
defensive settings.heat access + stale test mocks — 567/567 pass
-
5 UX gaps — smart warnings, resume awareness, write heuristic
-
Muscle and automation discovery — filter archived status and README files (#e42da9b, #5f5ccae)
-
Scratch completions — remove PRO commands from free completions list (#fd0bda2)
-
Auto-breathe race condition —
sendUserMessagefrombefore_agent_startraced with Pi’s prompt processing, now deferred toagent_endvia pending message queue (#2823ee9, #927bd74) -
Auto-breathe phase 1 ignored by agent — wrap-up trigger now sends a followUp user message, not just system prompt + UI toast (#9d09dd5)
-
Auto-breathe triple notification spam reduced (#927bd74)
-
Session management —
/inhalereset, heat dedup on rotation (#044fb2c) -
Dev-only scripts no longer shipped to users (#2c8db4a)
-
Restart signal cleared at factory load time, not
session_start(#0bddce2) -
Dynamic muscle read and script execution detection for heat tracking (#99a7663)
-
soma-route.tsimport path — uses@mariozechner/pi-coding-agent, not@anthropic-ai/claude-code(#49454ea) -
Internal protocols (
content-triage,community-safe) removed from bundled set (#3ad0884) -
Auto-init
.soma/.gitwhenautoCommitis true (#276f6f2) -
Missing TL;DRs on 4 self-awareness protocols (#c457752)
-
sync-to-clipath after_dev/directory move (#46615ef) -
Grace countdown skips tool turns during auto-breathe — tool-call turns no longer count toward 6-turn limit (#53bd421)
-
Resume without fingerprint sends minimal boot instead of full redundant injection — saves ~4-6k tokens (#7fd064b)
-
Preload overwrite guard + auto-breathe rotation fix when preload pre-exists (#378a1b1)
-
All doc paths updated to
amps/layout —.soma/amps/protocols/,.soma/amps/muscles/, etc. (#420f19b) -
Memory layout docs rewritten — core structure is amps/, memory/, projects/, skills/ (#b35c2be)
[0.5.0] — 2026-03-12
Added
-
rewrite DNA.md — self-awareness, owner’s manual, link to docs for deep reference
-
/inhale guard + stale warning, slash command usage hints
-
prompt before auto-init + parent inheritance (SX-164, SX-165, SX-241)
-
show command provenance in /soma status (SX-233)
-
track cli.js as source in agent repo (SX-252)
-
settings-driven heat overrides — per-project AMPS control
-
inherit.automations — separate from tools inheritance
-
statusline preload indicator + smart /exhale (edit vs write)
-
auto-archive stale preloads after exhale + archiveStalePreloads()
-
Auto-breathe mode — proactive context management that triggers wrap-up at configurable %, auto-rotates at higher %. Safety net at 85% always on. Opt-in via
breathe.autoin settings (#1d533bf) -
/auto-breathecommand — runtime toggle (on|off|status), persists to settings.json -
Smarter
/breathe— context-aware instructions (light/full/urgent), handles preload-already-written and timeout edge cases -
Cold-start muscle boost — muscles created <48h get +3 effective heat for at least 2 sessions
-
Orient-from preloads — preload template includes
## Orient Frompointing to files next session should read first -
soma:recallevent signal — extensions can listen for context pressure events (steno integration) -
/auto-commitcommand — toggle.soma/auto-commit on exhale/breathe (on|off|status) -
Auto-commit
.soma/state — changes committed to local git on every exhale/breathe viacheckpoints.soma.autoCommit -
/pinand/killinvalidate prompt cache — heat changes take effect next turn, not next session -
/soma promptdiagnostic — shows compiled sections, identity status, heat levels, context %, runtime state -
sync-to-cli.shandsync-to-website.sh— one-command repo sync scripts -
soma-compat.sh— detect protocol/muscle overlap, redundancy, directive conflicts -
soma-update-check.sh— compare local protocol/muscle versions against hub -
/scratchcommand — quick notes to.soma/scratchpad.md, append-only, agent doesn’t see unless/scratch read -
guard.bashCommandssetting —allow/warn/blockfor dangerous bash command prompts -
Automations system —
.soma/automations/for step-by-step procedural flows -
Polyglot script discovery — boot discovers
.sh,.py,.ts,.js,.mjsscripts with auto-extracted descriptions -
soma init --orphan—--orphan/-oflag for clean child projects with zero parent inheritance -
Git hooks:
post-commitauto-changelog +pre-pushdocs-drift nudge -
Bundled protocols:
correction-capture+detection-triggers— learning-agent protocols
Changed
- Config-first script extensions —
settings.scripts.extensionscontrols which file types are discovered - Command cleanup — removed
/flush, folded/preloadinto/soma preloadand/debuginto/soma debug - CI improvements — PR check and release workflows now run all test suites
Fixed
-
help header shows ‘CLI v…’ not bare version
-
help rewrite, script theme crash, focus session, postinstall, docs
-
restore walk-up, keep .soma-only + runtime-home skip
-
findSomaDir checks current dir only, no walk-up
-
only .soma/ is a valid soma root, not .claude/ or .cursor/
-
skip global runtime home in findSomaDir walk-up
-
defensive settings.heat access + stale test mocks — 567/567 pass
-
5 UX gaps — smart warnings, resume awareness, write heuristic
-
System prompt dropped after turn 1 — Pi resets each
before_agent_start, now caches compiled prompt -
Identity never in compiled prompt —
isPiDefaultPrompt()checked wrong string -
Context warnings never fired —
getContextUsage()returns undefined on turn 1, handled gracefully -
Identity lost after
/auto-continueor/breathe—session_switchnow rebuilds from chain -
Guard false positive on
2>/dev/null— stderr redirects no longer trigger write warnings -
Bash guard false positive on
>>— append redirects no longer trigger dangerous redirect guard -
Preload auto-injected on continue/resume —
soma -candsoma -rno longer inject stale preloads -
/soma promptcrash —getProtocolHeatimport missing -
Audit false positives — all 11 audit scripts improved across the board
[0.4.0] — 2026-03-11
Added
-
rewrite DNA.md — self-awareness, owner’s manual, link to docs for deep reference
-
/inhale guard + stale warning, slash command usage hints
-
prompt before auto-init + parent inheritance (SX-164, SX-165, SX-241)
-
show command provenance in /soma status (SX-233)
-
track cli.js as source in agent repo (SX-252)
-
settings-driven heat overrides — per-project AMPS control
-
inherit.automations — separate from tools inheritance
-
statusline preload indicator + smart /exhale (edit vs write)
-
auto-archive stale preloads after exhale + archiveStalePreloads()
-
Compiled system prompt (“Frontal Cortex”) —
core/prompt.tsassembles complete system prompt from identity chain, protocol summaries, muscle digests, dynamic tool section -
Session-scoped preloads —
preload-<sessionId>.mdprevents multi-terminal conflicts -
Identity in system prompt — moved from boot user message for better token caching
-
Parent-child inheritance —
inherit: { identity, protocols, muscles, tools }in settings -
Persona support —
persona: { name, emoji, icon }for named agent instances -
Smart init —
detectProjectContext()scans for parent.soma/,CLAUDE.md, project signals -
systemPromptsettings — toggle docs, guard, CLAUDE.md awareness in system prompt assembly -
prompts/system-core.md— static behavioral DNA skeleton -
Debug mode —
.soma/debug/logging,/soma debug on|off -
Protocol graduation — heat decay floor, frontmatter enforcement, preload quality validation
-
Configurable boot sequence —
settings.boot.stepsarray -
Git context on boot —
git-contextstep injects recent commits and changed files -
Configurable context warnings —
settings.contextthresholds
Changed
- Extension ownership refactor —
soma-boot.tsowns lifecycle + commands,soma-statusline.tsowns rendering + keepalive - Boot user message trimmed — identity, protocol breadcrumbs, and muscle digests moved to system prompt
- CLAUDE.md awareness, not adoption — system prompt notes existence but doesn’t inject content
Fixed
-
help header shows ‘CLI v…’ not bare version
-
help rewrite, script theme crash, focus session, postinstall, docs
-
restore walk-up, keep .soma-only + runtime-home skip
-
findSomaDir checks current dir only, no walk-up
-
only .soma/ is a valid soma root, not .claude/ or .cursor/
-
skip global runtime home in findSomaDir walk-up
-
defensive settings.heat access + stale test mocks — 567/567 pass
-
5 UX gaps — smart warnings, resume awareness, write heuristic
-
Print-mode race condition —
ctx.hasUIguard onsendUserMessageinsession_start -
Skip scaffolding core extensions into project
.soma/extensions/ -
Template placeholder substitution on install
[0.3.0] — 2026-03-10
Added
-
rewrite DNA.md — self-awareness, owner’s manual, link to docs for deep reference
-
/inhale guard + stale warning, slash command usage hints
-
prompt before auto-init + parent inheritance (SX-164, SX-165, SX-241)
-
show command provenance in /soma status (SX-233)
-
track cli.js as source in agent repo (SX-252)
-
settings-driven heat overrides — per-project AMPS control
-
inherit.automations — separate from tools inheritance
-
statusline preload indicator + smart /exhale (edit vs write)
-
auto-archive stale preloads after exhale + archiveStalePreloads()
-
AMPS content type system — 4 shareable types: Automations, Muscles, Protocols, Skills.
scopefield controls distribution -
Hub commands —
/install <type> <name>,/list local|remotewith dependency resolution -
core/content-cli.ts— non-interactive content commands for CLI wiring -
core/install.ts— hub content installation with dependency resolution -
core/prompt.ts— compiled system prompt assembly (12th core module) -
soma-guard.tsextension — safe file operation enforcement with/guard-statuscommand -
soma-audit.sh— ecosystem health check orchestrating 11 focused audits -
/restcommand — disable cache keepalive + exhale -
/keepalivecommand — toggle cache keepalive on/off/status -
Cache keepalive system — 300s TTL, 45s threshold, 30s cooldown
-
Session checkpoints —
.soma/committed every exhale (local git) -
10 test suites with 255 passing tests
-
Workspace scripts —
soma-scan.sh,soma-search.sh,soma-snapshot.sh,soma-tldr.sh
Changed
- Bundled protocols slimmed from all to 4 core (breath-cycle, heat-tracking, session-checkpoints, pattern-evolution)
Fixed
-
help header shows ‘CLI v…’ not bare version
-
help rewrite, script theme crash, focus session, postinstall, docs
-
restore walk-up, keep .soma-only + runtime-home skip
-
findSomaDir checks current dir only, no walk-up
-
only .soma/ is a valid soma root, not .claude/ or .cursor/
-
skip global runtime home in findSomaDir walk-up
-
defensive settings.heat access + stale test mocks — 567/567 pass
-
5 UX gaps — smart warnings, resume awareness, write heuristic
-
PII scrubbed from git history across all repos
-
CLI stripped to distribution only — agent is source of truth
[0.2.0] — 2026-03-09
Added
-
rewrite DNA.md — self-awareness, owner’s manual, link to docs for deep reference
-
/inhale guard + stale warning, slash command usage hints
-
prompt before auto-init + parent inheritance (SX-164, SX-165, SX-241)
-
show command provenance in /soma status (SX-233)
-
track cli.js as source in agent repo (SX-252)
-
settings-driven heat overrides — per-project AMPS control
-
inherit.automations — separate from tools inheritance
-
statusline preload indicator + smart /exhale (edit vs write)
-
auto-archive stale preloads after exhale + archiveStalePreloads()
-
Protocols and Heat System — behavioral rules loaded by temperature, heat rises through use, decays through neglect
-
Muscle loading at boot — sorted by heat, loaded within configurable token budget
-
Settings chain —
settings.jsonwith resolution: project → parent → global -
Mid-session heat tracking — auto-detects protocol usage from tool results
-
Domain scoping —
applies-tofrontmatter +detectProjectSignals() -
Breath cycle commands —
/exhale,/inhale,/pin,/kill -
Script awareness — boot surfaces
.soma/scripts/inventory -
9 core modules — discovery, identity, protocols, muscles, settings, init, preload, utils, index
Fixed
-
help header shows ‘CLI v…’ not bare version
-
help rewrite, script theme crash, focus session, postinstall, docs
-
restore walk-up, keep .soma-only + runtime-home skip
-
findSomaDir checks current dir only, no walk-up
-
only .soma/ is a valid soma root, not .claude/ or .cursor/
-
skip global runtime home in findSomaDir walk-up
-
defensive settings.heat access + stale test mocks — 567/567 pass
-
5 UX gaps — smart warnings, resume awareness, write heuristic
-
Extensions load correctly
-
Skills install to correct path
[0.1.0] — 2026-03-08
Born
- σῶμα (sōma) — Greek for “body.” The vessel that grows around you.
- Built on Pi with
piConfig.configDir: ".soma" - Identity system:
.soma/identity.md— discovered, not configured - Memory structure:
.soma/memory/— muscles, sessions, preloads - Breath cycle concept: sessions exhale what was learned, next session inhales it
- 9 core modules, 4 extensions, logo through 36 SVG iterations