Changelog
What shipped, what changed — the full version history of Soma.
[Unreleased]
[0.27.6] — 2026-05-28
Added
- shared preload lifecycle state machine —
_shared/preload-lifecycle.tsmodule unifies preload tracking across breathe, boot, and statusline extensions. Single source of truth replaces 7 independentletflags. (Cycle 29) - route capabilities for lifecycle access —
preload:lifecycle(read state),preload:transition(write transitions),preload:reset(fresh session),preload:noteToolCall(track work after save). (Cycle 29) - three-state auto-breath config —
breathe.autonow accepts"on"(proactive),"auto"(adaptive),"off"(passive). Backward-compat with boolean and"global"values. (Cycle 28) - sandbox
--dummymode — simulated API responses, no API key needed. Runs all 10 API-dependent tests offline. (Cycle 28) - sandbox
--briefmode — compact dot-progress output, details on failures only. Clean CI logs. - wire kanban search/related/similar caps — Cycle 27
- dev-sync dist provenance indicator —
.dev-syncedmarker written bysoma-dev sync dev; statusline shows(main +dev)when running dev-synced dist on main branch. Marker cleared bysoma-dev switch main/rollback. - tiered progressive-disclosure format for soma(op=‘list’)
Fixed
- 85% safety net no longer overrides manual
/exhaleor keepalive auto-exhale — safety net checks shared lifecycle state before acting. If preload is alreadyREQUESTED(by/exhaleor keepalive), it notifies instead of initiating a competing breathe or rotating immediately. (Cycle 29) /exhaleat high context no longer triggers immediate rotation without preload update — exhaleHandler callspreloadLifecycle.transition("requested", { source: "manual" })before the followUp, so the safety net sees state=REQUESTEDand waits for the preload write. Stale-preload immediate rotation case fixed. (Cycle 29)- keepalive auto-exhale no longer double-requests preload — gated on lifecycle state: skips if already
REQUESTEDorSAVED. (Cycle 29) - preload now loads after auto-rotate —
.rotate-signalwas cleaned at extension load beforesession_startcould read it. Deferred cleanup to startup handler, which detects rotation and injects preload. (Cycle 28) - sandbox help text test —
rc --helptriggered Pi model resolution, polluting stdout. Changed tothin-cli.js --helpwhich bypasses Pi init. (Cycle 28 carry) - sandbox license header test in
--mainmode — source worktree lacks release-injected headers; skip like--localmode. Updated checked path todist/extensions/for shipped builds. - sandbox
--devtimeout —soma-release.sh --dry-runrannpm test(55 scripts × 2 passes). AddedSKIP_TESTS=1to release dry-run in dev sandbox mode. - restore protocol paths after repos/agent/.soma/ skeleton removal
Test
- rotate-signal continuity — 14 assertions verifying
.rotate-signalnot cleared at extension load, read at session_start, cleaned after consumption. (Cycle 28) - tri-state string value normalization — 4 tests for
"on","auto","global"legacy compat,defaultfallback.
[0.27.5] — 2026-05-26
Added
- ancestor .soma/ walk-up + example extensions seeding + inherit gating
- SX-763 — OpenRouter session_id in request body
Fixed
- scan and load extension files instead of directory path for —extension flag
- show model.name instead of model.id + Free for $0 cost models
- strip injected resource paths from inhale nameArg extraction
- revert models.generated.js patch — use models.json instead
- obfuscation coverage tightened — addons + _shared correctly scoped
- obfuscation pipeline hardened — blanket coverage for core, extensions, addons, _shared
- —skip-tests flag for soma-release.sh, wired into ship script
Removed
- stale repos/agent/.soma/ directory — dead skeleton, gitignore blanket
[0.27.4] — 2026-05-22
Fixed
- SX-762 — argv.push instead of splice(2,0) for user-global paths
- repair doctor —help assertions + github runtime test script path
- SX-762 — defense-in-depth: env override + existence guard + build gate
- SX-762 — call soma-code.sh directly via execFile, not ‘soma code’ CLI
- bump obfuscator string-array-threshold 0.8→1.0
- harden blacklist — dual-signal + obfuscation pipeline
- harden blacklist — dual-signal + obfuscation pipeline
[0.27.3] — 2026-05-14
Added
soma:seam.*addon family — concept archaeology caps (s01-345201, SX-744). Eight new caps + 2 docs caps wire the existing shell archaeology tools into the cap surface so the agent reaches for them under context pressure.soma:seam.trace(free tier — wrapsamps/scripts/soma-trace.sh),soma:seam.ancestors(PRO — vault agents + Pi/Claude sessions w/ attribution),soma:seam.timeline(PRO — chronological evolution),soma:seam.sessions(dev tree — search.soma/memory/sessions/+ Pi JSONLs),soma:seam.seeds(PRO),soma:seam.gaps(PRO — orphan docs),soma:seam.web(PRO — persistent markdown trace written to.soma/memory/webs/),soma:seam.stats(dev tree — Pi JSONL analytics). Plussoma:docs.related+soma:docs.impact(dev tree — frontmatter graph walk). Caps degrade gracefully when underlying scripts aren’t present (PRO/dev message). Honors Recall’s “mind of the place” lineage. New fileextensions/_shared/script-resolver.tsextracts the shared shell-out + path-resolution helper. Closure test (passing):soma:seam.ancestors "breathe"returnsZenith (openclaw-dev) — dev lead, vault refactorer, soma's daddy. 10/10 smoke tests green intests/test-seam-caps.sh. Plan:.soma/releases/v0.27.x/plans/seam-addon-family.md.
Fixed
- exclude tincture/_generated from path scan
0.27.2 (2026-05-10)
Features
- meta-tools: family-summary view for op=‘list’ (action-oriented cheat sheet) (8a0aee0)
Documentation
- catch up whats-new + skills_block transplant + auto-breathe variants + delegate cycle workflow (88afed8)
0.27.1 (2026-05-10)
Added
- Model-aware breathe thresholds (cycle 16, s01-7b287c). New tri-state
breathe.auto:"off"/"global"/"model-aware"(boolean still parsed for back-compat via migrationbreathe-tri-state-v0.27.0). Newbreathe.thresholdsmap with glob patterns (e.g."*sonnet*") selects per-modelwarnRange/exhaleRangepercentages fromctx.model.id. Sonnet’s empiricalextra usage required for long contextwall (~48% on default-tier accounts) now triggers warn at 28-33% and auto-exhale at 34-50% — well before the wall, instead of the old fixed 50/70 thresholds that fired AFTER the wall hit. Opus uses 60-74 / 75-90; default fallback uses 50-64 / 65-85. Default install shipsauto: "model-aware"./auto-breatheacceptsoff|global|model-aware|statussubcommands. 76 tests pass (was 47/55 before, +21 new tests for tri-state + per-model resolution + migration). Closes the wall-before-threshold bug that crashed s01-8b3cb3 mid-pipeline. soma-dev delegate cycle <brief>workflow (cycle 17, s01-7b287c). Full implementation pipeline for any markdown brief (cycle.md, inbox/.md, plans/.md). Composesintern(investigate, 80-call budget) →intern(build, 80-call budget) →verifier(test, 25 calls) →pr_author(description, 30 calls). Total ~215 tool calls / ~$2.50 per cycle. Outputs/tmp/soma-cycle-investigation.md,/tmp/soma-cycle-impl-summary.md,/tmp/soma-pr-description.md. Flags:--no-pr,--no-verify. Built because singlebuilder(25-call budget) was too small for multi-step cycles like cycle 16 (9 steps, ~80+ tool calls).
Fixed
/inhaleno longer double-injects preload after rotation (cycle 17 bug #1, s01-7b287c). Empirically verified across 10 sessions in the last 14 days: every/inhale-triggered rotation produced TWO preload-injection messages in the new session — one from soma-boot’ssession_start“new” branch ([Soma Boot — rotated session], ~16K chars), one from/inhale’s post-awaitsend()([Soma Inhale — Loading Preload], ~16K chars). ~8K tokens duplicated per/inhale. Fix: soma-boot now exposesroute.provide("preload:wasInjected", ...);/inhalequeries this afterawait ctx.newSession({})and skips its own send ifsession_startalready injected. Print-mode safety preserved (whenctx.hasUI=falsethe session_start branch skips, flag stays false,/inhalefalls back to direct send)./inhalecatch-fallback race (cycle 17 bug #2, s01-7b287c). The catch block atsoma-boot.ts:3007-3020previously fired its fallback preload-send unconditionally on anynewSession()throw. If the throw came AFTERsession_starthad emitted (e.g.apply()/setup()/finishSessionReplacement()failure post-runtime-creation), the fallback would TRIPLE-stack with both the session_start injector and the happy-path injector. Samepreload:wasInjectedflag now discriminates: catch only sends if session_start hadn’t already.session_start“new” branch fallback when boot template missing (cycle 17, s01-7b287c). Previously, ifloadBootMessage()returned null (boot template not found), the rotation message was silently skipped — the new session had no preload injection, and/inhale’s old post-await send was the only thing carrying it. After bug #1 fix, that path no longer exists, so session_start now falls back to a minimal## Preload (from last session)\n\n${preload.content}message when the template is missing.- Honest auto-breathe notification text (cycle 17 bug #3, s01-7b287c). The
🪵 Auto-breathe: rotating at N%notification fired when the threshold was hit, but actual rotation only happens later inturn_endafter the agent writes the preload (withingraceSeconds, default 30s). New text:🪵 Preload requested at N% — rotating after agent writes it. The other branch (preload-already-written, immediate.rotate-signal) keeps its honest “Rotating — preload already written” text.
Documentation
- Auto-rotation Path A vs Path B clarification (cycle 17 bug #5 audit, s01-7b287c). Per Pi types (
pi-coding-agent/dist/core/extensions/types.d.ts),newSessionlives onExtensionCommandContext, not on the baseExtensionContextevent handlers receive. Auto-breathe’sperformRotationfalling back to.rotate-signal+ process re-exec (Path A) is correct by design — Pi treats process re-exec as the safer auto-rotation route. In-processroute.get("session:new")(Path B) is a happy-path optimization available only after a user has invoked/breathe//inhale//auto-breathein the current session. Comment block added tosoma-breathe.ts:performRotationdocumenting this; notify text changed to🪵 Rotating session (process re-exec)....
[0.27.0] — 2026-05-09
Added
-
Pi upstream monitor — live version gap in every session (s01-8b3cb3). GitHub Actions workflow (
.github/workflows/upstream-monitor.yml) watchesbadlogic/pi-mono(source of@mariozechner/pi-coding-agent) every 6 hours. WritesPI_UPSTREAM.mdto the agent root with: current pinned version, latest npm version, releases behind count, and flagged commits relevant to Soma (covers all 33 Pi API usages:registerTool,registerCommand,sendUserMessage, 11 event hooks, 7 patch targets). New{{pi_gap}}body var inresolveBlockVariablesreadsPI_UPSTREAM.mdat session start and injects live gap into the system prompt.soma-dev statussurfaces flagged ⚠️ items in yellow. Eliminates manually tracking Pi version drift. -
Autonomous CI loop — nightly tests + issue filing + fix pipeline (s01-8b3cb3, smoke-validated s01-ae942e). Three-layer self-healing CI: (1)
.github/workflows/test-nightly.ymlruns 25 portable tests on schedule (4am UTC) and on push to dev/main; on failure, auto-files a structured GitHub issue taggednightly-failurewith failing tests, error excerpts, Pi version, last 5 commits, and a fix brief for the next agent. Dedupe gate skips filing when an open issue already exists for the same failure. (2)dev:issue.create+dev:issue.listaddon caps for agent-filed issues from within sessions. (3)soma-dev delegate ci-fix <url>orchestrates:issue_investigator→builder→verifier. 18 tests gainedCI=trueskip guards (workspace/dist-dependent tests self-skip).pr-check.ymlhardened: tsc typecheck job + changelog blocking + conventional-commit format validation. End-to-end smoke s01-ae942e drove a deliberate test failure through nightly→issue→dedupe→revert→green. -
Autonomous PR workflow —
soma-dev delegate pr(s01-8b3cb3). Full pipeline from commits to complete PR:soma-pr-brief.shgenerates structured brief (git-cliff CHANGELOG, affected files, semver bump type, docs to update, roadmap entry suggestion);changelog_curatorwrites rich[Unreleased]narrative;pr_authorwrites PR description;doc_writerupdates flagged docs;verifierconfirms tests pass.cliff.tomladded — git-cliff configured for Keep-A-Changelog format from conventional commits (feat→Added, fix→Fixed, ci/chore/test filtered).release-pleasemanifest updated from stale 0.22.1 → 0.26.2; auto-trigger enabled on push to dev. -
soma-dev delegate— multi-agent workflow orchestrator (s01-8b3cb3). New command composes child agents into named end-to-end pipelines:pr/pr-brief/ci-fix <url>/changelog/doc-update/audit. Wired intosoma-devassoma-dev delegate | soma-dev workflow. Eliminates manually orchestrating multiplesoma-dev children runcalls. -
3 new child role bodies (s01-ae942e).
body/children/issue_investigator.md(read-mostly root-cause tracer for nightly failures — writes/tmp/fix-brief.md),body/children/pr_author.md(writes rich PR descriptions from a brief, voice-hygiene + solo-editorial inherited),body/children/changelog_curator.md(curates[Unreleased]narratives from git-cliff output, replaces auto-appended bullet noise). Past-self in s01-8b3cb3 declared the roles indelegate.sh+ CHANGELOG narratives but the body files were never written — everysoma-dev delegate ci-fixcall would have failed at phase 1 withrole 'X' not found in body/children/.... Surfaced via the s01-ae942e smoke; fixed in the same session. -
tests/test-children-roles-exist.sh(s01-ae942e). Drift-prevention regression test: extracts every_run_rolereference fromdelegate.sh, asserts a matchingbody/children/<role>.mdexists, plus validates required frontmatter fields. Catches the s01-8b3cb3 class of “declared role, missing body” drift before it ships. -
soma-dev check-phasespre-release gate (s01-8b3cb3). 30-second sanity check (upstream sync + tests + tsc) before running the full 5-minutesoma-release-prepare.shorchestrator. Exits non-zero if any of the three signals is off, saving the cost of a full prepare run that would fail.
Changed
-
Pi runtime:
0.72.1→0.73.1(s01-8b3cb3, commit42ef127). All 4 pi-* packages bumped together (pi-coding-agent,pi-ai,pi-agent-core,pi-tui) per the lockstep rule — mismatched bumps cause silent API mismatches (e.g.cleanupSessionResourcesin pi-ai@0.73.1 not found if pi-ai stayed at 0.72.1). All 7 runtime patches apply cleanly against new upstream; CI green. -
docs/anthropic-long-context.md— long-context wall claim corrected (s01-ae942e). Previous prose asserted the long-context tier triggers at “~200K” of context, presented as Anthropic-published behavior. That number wasn’t sourced; empirical evidence on Curtis’s Claude Max plan shows the wall hits at ≈40-48% of Sonnet 4-6’s reported 1M context window (~400-480K tokens) — substantially higher than the doc claimed. Three prose blocks + the per-model behavior table updated with hedge language naming the empirical observation; users probe their own account threshold via theextra usage required for long context429.
Fixed
-
Release flow consolidation (s01-8b3cb3).
soma-ship.sh(both inrepos/agent/scripts/_dev/and.soma/amps/scripts/internal/) archived to_archive/pre-orchestrator-v0.22.x/— it referencedrepos/agent-stable(dead since SX-652 worktree topology) and a 10-phase spiral that no longer exists.soma-dev shipreplaced with cleangit push meetsoma dev(branch guard + unpushed count).soma-dev releasenow routes toprepare/ship/betasubcommands. -
3 stale model-ID references (s01-ae942e). Test fixture in
scripts/_dev/tests/test-children-list.shreferencedclaude-sonnet-4-5; verify scriptscripts/_dev/soma-verify.shreferencedclaude-3-5-haiku-latest(a generation-old alias);scripts/soma-model-sync.sherror-message hint suggested retired IDs. All bumped to current available IDs. Behavior defaults intentionally NOT changed:core/delegate/models.tsMODEL_ALIASES still pin sonnet/haiku/opus to 4-5 (default-tier safety — bumping aliases would silently force users onto 1M-context variants and their long-context billing tier). -
Premature v0.26.3 roadmap entry removed from website (s01-ae942e). Past-self in s01-8b3cb3 drafted a v0.26.3 entry covering the autonomous CI/CD work but the version was never released (
npm view meetsoma version= 0.26.2). Entry deleted; this work surfaces under v0.27.0.
[0.26.2] — 2026-05-07
Added
extraUsageRecoverysetting (default"auto", s01-c62a62, cycle 13 successor). Narrow-scoped recovery for the boot-turn-after-/inhalevariant of Anthropic’sextra usage400 error. When/inhalerotates the session and the first API call returns Anthropic’s"You're out of extra usage. Add more at claude.ai/settings/usage and keep going.", Soma surfaces a single notice and auto-injects.after a 1s debounce so the conversation advances and subsequent turns can run cleanly. Three modes:"auto"(default — notify + auto-.),"notify"(notice only; user sends any message to continue),"off"(silent — Pi’s raw error display passes through). Hard fence: only fires when error contains literal"extra usage"ANDturnCount <= 2AND no keepalive fired. Auto-injection is 1 char (.) — no full-context resend, no 2× billing amplifier (the SX-709 failure mode that killed the original auto-retry stays killed). Migration phase doc:migrations/phases/v0.26.1-to-v0.26.2.md. Plan:.soma/cycles/audit-fix/13-startup-only-retry-redesign/cycle.md.
[0.26.1] — 2026-05-07
Fixed
-
Cycle 21 —
test-release-completeness.shSection 4 in-flight aware (s01-c62a62). The npm/package.json drift gate now respects the existingIN_FLIGHT_VERSIONguard (same pattern as Section 2 dev↔main parity andtest-version-truth.shcycle 18). During the release ship window,npm testran in orchestrator Step 4 (preflight) was reporting a real drift that resolved moments later when Step 5 (soma-npm-publish.sh) bumped + committed npm/package.json. Now skips cleanly with a SKIP not FAIL during ship. Re-run post-ship for verification. -
Cycle 22 —
soma:github.local_*runtime ship gap (s01-c62a62, commit005005e). The 8 local-mode caps shipped in v0.24.0 (local_path/local_map/local_find/local_refs/local_blast/local_structure/cache_list/cache_clean) registered cleanly on the route bus but failed at runtime in every install with"ERROR: soma-github-cache.sh not found at /var/folders/.../T/"becausecompile-pro-scripts.shPRO_SCRIPTS list bundledsoma-githubwithout its companion cache helper. Static-onlytest-namespaced-caps.shnever invoked the caps so the gap was invisible. Fix (Option A — inline w/ clean-extraction markers): refactoredsoma-github-cache.shcase-dispatcher into named_cache_*functions wrapped in{{INLINE-LIFT-START / END}}markers;soma-github.shgot{{INLINE-START / END}}markers + a comment block explaining the rationale + clean-extraction pattern (so cache can later be promoted to a separate Pro tool); newlift-cache-helper.shbuild gate (idempotent, hooked intocompile-pro-scripts.sh) regenerates the inline block from canonical before b64-encode. Plus 1 sub-bug fix:cache_infodispatcher branch now passes$REPO(was empty$@). New runtime regression testtests/test-soma-github-local-runtime.shdrives the shippedsomabinary through all 8 caps + a regression guard for the exact “not found” string — 10/10 pass. v0.24.0 marketing/docs surfaces (docs/_dev/github-scanner.md,docs/whats-new.md,docs/tools.md, website mirrors) described correct behavior all along; the fix makes those descriptions true at runtime.
[0.26.0] — 2026-05-07
Added
-
Cycle 10 —
_tool-template.tsmodern shape + Pi tool runner runtime guard (s01-a6b91e). Replaces broken canonical example (2-arg execute, bare-string return) with the contract Pi’s runtime actually expects: 5-arg(toolCallId, params, signal, onUpdate, ctx) => Promise<AgentToolResult>, including requiredlabelfield. Adds Site G defensive wrap inpi-agent-core/agent-loop.js executePreparedToolCallso any tool returning a string OR an object with undefined.contentgets lifted into the canonical{content: [{type:"text", text}], details}envelope before persistence. Closes the bare-string-return bug class that was producing malformed toolResult records (no.contentkey) and crashing downstream consumers (renderer, compaction, anthropic provider). Verified all 7 runtime patches still needed against upstream Pi 0.73.0 main — audit recorded in.soma/cycles/audit-fix/10-pi-tool-result-shape-mismatch/VERIFY.md. -
Cycle 10 — 6 defensive runtime guards against malformed
ToolResult.content(s01-a6b91e). Added Sites A-F across 4 files:render-utils.getTextOutput,tool-execution.maybeConvertImagesForKitty,tool-execution.updateDisplay,compaction.estimateTokens,pi-ai/anthropic.convertContentBlocks, pluspi-tui/terminal.startprocess-exit cleanup (CSI-u + bracketed-paste + modifyOtherKeys + raw-mode restoration so terminal doesn’t leak escape sequences into shell after TUI crash). Defense-in-depth: Site G prevents the malformation upstream; Sites A-F catch anything that slips past. -
Cycle 12 — Preload notify state machine (s01-a6b91e).
extensions/soma-breathe.tsreplaces the every-turn-end ”🟢 Preload saved…” notify with a transition-only state machine ('none' | 'saved' | 'stale'). Adds yellow stale notify (🟡 Preload now stale (N tool calls...)) and green refresh notify (🟢 Preload refreshed) on STALE→SAVED. Single source of truth for the stale threshold (PRELOAD_STALE_TOOL_COUNT = 5);breathe:detailroute cap exposesisStale/staleThreshold/notifyStatefor downstream consumers (statusline + soma-boot). Removes dead opt-inbreathe.preloadStaleThresholdsetting (was default 0 = disabled). -
Cycle 14 — Regression tests for runtime patches (s01-a6b91e). 27 new gates across 3 test scripts (
test-tool-result-content-guard.sh,test-pi-ai-anthropic-content-guard.sh,test-pi-tui-exit-cleanup.sh) lock Sites A-G against regression. Plustest-preload-notify-state-machine.sh(15 gates) for cycle 12. Total: 42 new test gates, 100% passing. -
Cycle 03-meta — META_CYCLE.md adoption (s01-a6b91e). New
releases/META_CYCLE.mdumbrella dashboard (live state + cycles index + routing + cross-cycle artifact pointers + pattern + changelog). Pattern adopted from arzadon-fitness s01-ddcd84 v0.1.0; meetsoma is domain #2 of the validation arc her muscle’s “Strengthen” phase needs. -
Three new disciplines locked as muscles (s01-a6b91e):
amps/muscles/meta-cycle-pattern.md— single SoT per cycle; umbrella META_CYCLE.md dashboard; persistent service artifacts at<umbrella>/<service>/.amps/muscles/verify-patch-against-upstream.md—git show upstream/main:<path>from your local pi-mono clone BEFORE adding anyapply-patches.shentry. Don’t patch what upstream already fixed.amps/muscles/blast-radius-before-change.md—soma:code.blast+ regression test BEFORE claiming a fix shipped. No claim-shipped without a test.
-
docs/extending.md§ Cache-safe registration vs hot-reload — four-concept table (cache-safe registration / module hot-reload / prompt rebuild / subprocess pickup) with explicit “don’t conflate the four” rule. Cited authority:agent-session.js:1894,loader.js:271, soma-boot cache-stickiness, Pi changelog 0.56.0 (#1720),meta-tool-factory.ts:96-130,soma-addons/code.ts:38. Decision matrix: per-edit-class × cache-impact × what-to-run. -
docs/commands.md§/reload— row clarified to cover bothpi.registerToolandroute.provideregistration shapes. Pair-with-/rebuildguidance for prompt-visible field edits. -
body/body.mdBefore Doing X table — added 4 new routing rows (verify-patch-against-upstream, blast-radius-before-change, meta-cycle-pattern, runtime-patch entry). -
5 queued cycles for follow-up work filed in
.soma/cycles/:audit-fix/11-soma-inhale-double-preload-load— deep code trace done, hypothesis space narrowed (H-A/H-B/H-C), smoke recipe ready for runtime repro.audit-fix/13-startup-only-retry-redesign— Pi 0.73 retry regex audited; gap = DNS/TLS/handshake errors; needs Curtis’s actual error class to scope.audit-fix/15-stale-test-cleanup-sx727-sx734— deletes stale tests asserting reverted features.
Fixed
-
cycle 15 — delete stale SX-727/SX-734 tests + replacement upstream-tracking gate (s01-a6b91e)
-
CHANGELOG entries from s01-a54f21 reflect what was originally shipped, not what’s currently on
main. Two entries below describe features that were subsequently REVERSED or further GUTTED in the same session and not back-propagated to this changelog:- SX-727 (
context-1m-2025-08-07beta header patch) — REVERSED in commitda6b971(s01-a54f21). Always-on header rejected requests on accounts without long-context billing (Curtis’s case). Patch is DISABLED inapply-patches.sh; manifest entry marked"removed": "2026-05-04". To re-enable as opt-in, see SX-741 (auto-apply on settings flip). Original CHANGELOG entry retained below for ancestry; reality is the patch does NOT ship. - SX-734 (billing-retry gate) — FULLY GUTTED in commit
7109ce1(s01-a54f21). TheautoRetryBillingsetting gate landed (commit 54f7ef5), then SX-738 fixed undefined-settings ref (commit e403fab), then the entire layer was REMOVED — letting Pi handle billing errors natively (its_isRetryableErrorcorrectly excludesextra usage). Existingtests/test-billing-retry-disabled.shis now stale and fails; cycle 15 plans cleanup.
Both entries above need cleanup before this changelog is promoted to a versioned section. Cycle 15 (
audit-fix/15-stale-test-cleanup-sx727-sx734) deletes the stale tests; the CHANGELOG entries themselves should be either removed or rewritten as REVERSED markers. - SX-727 (
Original (stale) entries — retained for ancestry, do NOT promote as-is
- SX-737 stable-v0.25.0 fallback branch + generic switch ref
- Pi 0.72.1 bump (SX-732). Updates
pi-ai,pi-coding-agent,pi-tui,pi-agent-corefrom 0.71.0 to 0.72.1. UnlocksshouldStopAfterTurnagent loop callback (Pi 0.72.0+) — documented use case: “request a graceful stop after the current turn, e.g. before context gets too full” — the canonical mechanism for the upcoming v0.27 auto-breathe redesign. Pi’s internal API rename (compat.reasoningEffortMap→thinkingLevelMap) audited clean: zero usage in Soma extensions. Removed providers (Gemini CLI / Antigravity) we don’t reference.npm audit: 0 vulnerabilities post-bump. Anthropic(SX-727) — REVERSED s01-a54f21 commitcontext-1m-2025-08-07beta header patchda6b971. See “Fixed” section above for full context. Original entry: Soma now addscontext-1m-2025-08-07to Anthropic’s OAuthanthropic-betaheader viascripts/_dev/patches/apply-patches.sh. Without this opt-in, Sonnet 4.6 hits the long-context billing tier (“extra usage” wall) at ~400K tokens.- Doctor migration:
## Next Session→## Start Herein active preloads (SX-733). Closes the SX-729 loop for existing user preloads. Sentinel-gatedapplyOnce("memory-section-rename-v0.26.0")in BOTH Tier 1 sites (extensions/soma-boot.ts+npm/thin-cli.js). Strict heading-only regex;_archive/untouched (provenance). New regression test:tests/test-memory-section-rename-migration.sh(7 scenarios). Billing-error auto-retry disabled by default(SX-734) — GATE GUTTED s01-a54f21 commit7109ce1. See “Fixed” section above for full context. Original entry: Fix: gate auto-retry behindsettings.errors.autoRetryBilling(defaultfalse). […] New regression test:tests/test-billing-retry-disabled.sh(6 gates). Reality: the autoRetryBilling gate AND the entire Soma billing-retry layer are now removed; Pi handles billing errors natively.
[0.25.0] — 2026-05-04
Added
- Preflight update prompt (s01-86b0fd). Cached
~/.soma/config.json:updateAvailable(set bysoma-statuslinebackground check) now surfaces an interactive prompt at startup:(c)ontinue / (u)pdate now / (s)kip this version. Skip persists viaskipUpdateUntilTsmatched againstupdateCheckTs— new commits arrive, prompt re-fires. Zero network at boot. Replaces the misfiring Pi-cruft deprecation prompt that nagged on every startup. Seedocs/troubleshooting.md § Startup Prompts. tests/test-shipped-templates-clean.shregression. Locks the shippedtemplates/default/_mind.mdAND the in-codegetDefaultMindTemplate()fallback against re-introducing redundant{{protocol_summaries}}/{{muscle_digests}}/{{scripts_table}}interpolations. Four gates: source clean, dist mirrors source, warning comment present, fallback string clean.tests/test-stale-ctx-after-rotation.shregression. Static-scan + Pirunner.js invalidate(...)snapshot. Catches the SX-713 family (Pi 0.71.0 expanded the stale-ctx guard frompi.Xto also coverctx.X).tests/test-mind-prepend-cleanup-migration.sh+tests/test-preflight-prompt.sh— fixture-based migration tests for v0.25.0 changes.- Migration map
migrations/phases/v0.24.1-to-v0.25.0.mddocumenting the body/_mind.md cleanup migration + always-run sentinel pattern + preflight prompt.
Changed
- Migrations now run UNCONDITIONALLY (s01-86b0fd). Previously gated behind
if (status.needsMigration)(project version < agent version), missing users on current version with no sentinel — e.g. fresh init at current version, or manual settings.json edit. NowapplyOnce()migrations run on every boot/doctor invocation; sentinels make them O(1) idempotent. Affects bothextensions/soma-boot.tsTier 1 andnpm/thin-cli.jsdoctor mirror. - Doc updates:
docs/troubleshooting.mdgains a## Startup Promptssection.docs/getting-started.mdmentions the preflight prompt at first run.docs/body.mdandbody/DNA.mdupdated with the rationale for why{{protocol_summaries}} / {{muscle_digests}} / {{scripts_table}}are NOT in the shipped_mind.mdtemplate (compileFrontalCortex prepends them). amps/muscles/internal/route-plumbing-first.md: TL;DR + symptom table now coverctx.Xaccess post-rotation (waspi.Xonly). Pi 0.71.0 expanded the guard.
Fixed
/inhalestale-ctx after Pi 0.71.0 guard expansion (s01-86b0fd).extensions/soma-boot.ts/inhalehandler made 3ctx.ui.notifycalls AFTERawait ctx.newSession({}), which Pi 0.71.0’s expandedrunner.js invalidate()guard now flags as stale. Fix: drop 2 redundant success notifies, route the degraded-state warning throughgetRoute()?.get("ui:notify"). Same family as SX-713 (pi.sendUserMessagepost-rotation); muscle updated.getDefaultMindTemplate()inline fallback cleaned (s01-86b0fd). The fallback string atcore/body.ts:925(used in test environments //soma debugoutput when no shipped template is present) still interpolated{{protocol_summaries}}\n\n{{muscle_digests}}— inconsistent with the shipped template sincefcd32bd. Fixed; locked by the newtest-shipped-templates-clean.sh.- Pi-cruft startup warnings removed (s01-86b0fd).
npm/migrations.jscheckDeprecatedExtensionDirs(Pi-inherited via SX-391 absorption) was warning users with.soma/tools/(Python scripts),.soma/hooks/, or.soma/commands/directories — none of which are Soma conventions. The Pi-rename history (Pi’s oldtools/→extensions/migration) doesn’t apply to Soma. Function preserved as a no-op stub for future Soma-specific deprecations; warnings no longer fire.
[0.24.1] — 2026-05-03
Fixed
- SX-722 — release-ship Step 7 silently swallowed pull failures (
dcf8a3c).soma-release-ship.shwas(cd ~/.soma/agent && git pull ... || true)and printed✓ runtime updatedregardless of outcome. v0.24.0 shipped with the runtime worktree silently stuck at v0.23.0 because of this. Now:git pull --ff-only, then verifypackage.jsonversion matchesNEW_VERSIONpost-pull; on mismatch print full diagnostic + manual fix path and exit 1. - scrape:
mkdir -pdest before writing llms.txt (1ad8469). Silent failure when_website/wasn’t created — previously lost a fetched llms.txt this way (2026-04-27, lightpanda). Found as uncommitted edit on the runtime worktree during the s01-f1230f cycle pass; lifted to dev. (scripts/_pro/*is gitignored from soma-beta release — dev/main only.) - tsconfig hygiene (
9f6b091). Addedextensions/_archive/**totsconfig.jsonexclude. Cleared 15 TS7006 errors from_archive/sx594-flat-wrappers/thatnpm run checkwas reporting. Archived code shouldn’t be type-checked.
Added
tests/test-release-completeness.shregression (9f6b091). Asserts CHANGELOG ↔ git tag parity, dev ↔ main ff-merge reachability,dist/manifest.json↔package.json,npm/package.json↔package.json(SX-659 collapsed train). Wired into orchestrator Phase 1 (tests gate) automatically becausesoma-release-prepare.shiteratestests/test-*.sh. If a previous release was incomplete (main behind), the next prepare fails CONFLICT-HARD before any new bump — the proactive layer of the SX-722 prevention rule.tests/test-namespaced-caps.shregression (9f6b091). Static-analysis floor for the cap-bus surface (~92 registered caps): per-family minimum thresholds, v0.24.0 named-cap presence (18 specific caps from CHANGELOG), duplicate-registration detection, namespace hygiene. Catches accidental cap deletion or rename across all addons before runtime.
[0.24.0] — 2026-05-01
Fixed
- add required Actions section to v0.23.0-to-v0.23.1.md
- bump pi- to 0.71.0 — clears CVE-2026-41686 (GHSA-p7fg-763f-g4gf)*
- Bump pi- deps 0.71.0 + clear CVE-2026-41686 (GHSA-p7fg-763f-g4gf)* — upgraded
@mariozechner/pi-{ai,coding-agent,tui,agent-core}from^0.69.0to^0.71.0. Clears@anthropic-ai/sdkadvisory (affects>=0.79.0 <0.91.1). Also picks up: cache-control model-compat awareness, fine-grained tool streaming beta, empty tools array fix, stream truncation detection. fast-xml-parser (AWS Bedrock SDK transitive) remains at moderate — not reachable through soma’s Anthropic provider path.
Added
- soma:github. v2 (SX-720)* — 21 caps total. API-mode (metadata; 13 caps including new audit/releases/diff/compare/file_diff parity wires) + new local-mode (tarball + soma-code shim; 8 caps):
local_path,local_map,local_find,local_refs,local_blast,local_structure,cache_list,cache_clean. Treat any GitHub repo as local: fetch tarball ~1–5s to~/.soma/cache/gh/<owner>--<repo>--<sha>/, then run soma-code (12 langs, full ripgrep regex, DEF/IMP/USE refs, blast radius). Architectural pivot from “per-file API” to “fetch-once-then-local-toolchain.” Plan:releases/v0.23.x/plans/github-tool-10x.md. Commits:e7ff177,907013a,96a511c. Guide:docs/_dev/github-scanner.md. - dev:kanban. (SX-720)* — dev-only ticket audit caps.
dev:kanban.audit({ticket}),dev:kanban.audit_batch({tickets|all_open|all, mode?}),dev:kanban.audit_open(). Triangulates kanban + git log + soma:code.* + sessions/preloads + cross-project trees (somaverse/somadian/website). Verdicts: SHIPPED / STALE / STALE-CROSS-PROJECT / STILL-VALID / NEEDS-REPRO / UNCLEAR. Used to close SX-588/SX-589/SX-642 in same session. Build-excluded from npm tarball. Commit:4d667a3. Guide:docs/_dev/kanban-audit.md. - soma:docs. upgrade (SX-720)* — 5 caps total. New:
whats_new({version?, limit?: 3})readsdocs/whats-new.md(agent-facing changelog);guide({name})resolvesguides/then_dev/. Improved:listis now recursive (catchesguides/and_dev/), groups by section, extracts TL;DR per entry;showaccepts subdir paths. Newdocs/whats-new.mdpopulated with v0.23.1 + v0.23.0 sections (action-oriented invocation hints). Newdocs/_dev/subdir convention (build-excluded; gated by filesystem presence). Commits:75b78f9,a7fe2f8. - Heat-system docs: cold-start boost (SX-708) — added
## New Muscle Visibility (cold-start boost)section todocs/heat-system.md(formula, code excerpt fromcore/utils.ts:215-225, scope, budget-overflow detail, verifying checklist). Mirrored todocs/muscles.md## Heat & Loading Tiers. Commit:e4fdbe2. - v3.1 — Tier 1 wins from ripgrep study (0be844f)
- v3 agent-first redesign — never hangs, self-correcting, auto-detects (28a5850)
- add Phase 5.6 version-truth gate (5798e66)
- add Phase 5.5 website-readiness gate (6478fc3)
Changed
- breathe.auto now opt-in by default (SX-718) — proactive auto-rotation at
rotateAt%(default 70%) wipes user input mid-compose with no warning. Existing users withbreathe.auto: trueare flipped once via Tier 1 migrationbreathe-auto-off-v0.23.1; sentinel recorded insettings.migrations[]so re-enable is respected. Migration map:migrations/phases/v0.23.0-to-v0.23.1.md. Also introduces the reusableapplyOnce(id, fn)pattern +settings.migrations[]tracker for future one-time semantic migrations beyondaddIfMissing. - Phase 5.5 calls test-release-surfaces.sh (closes SX-510) (a6302c1)
- meetsoma@0.23.0 (18f9c1d)
Fixed
- soma-github: follow 301 redirects on moved repos (curl -sL) (
96a511c) - SX-713 inhale stale-after-reload — consume message:send via route (cf18064)
- SX-717 default path + clarify legacy soma:code.find description (2a313fc)
- SX-716 walk up looking for agent package.json on fallback A (17b9f1e)
- SX-715 auto-detect github.com remote name + surface fetch errors (53cbed7)
- SX-714 persist version bump in no-fixes branch (86213f2)
- rewrite CHANGELOG promotion regex for our actual format (2034516)
- manually promote [Unreleased] → [0.23.0] (orchestrator regex bug) (2b578f4)
[0.23.0] — 2026-04-27
Added
- tree-hygiene gate (Phase 0.5, SX-712) —
soma-release-prepare.shhalts ifrepos/agent/has uncommitted files other thanM CHANGELOG.md. Closes the agent-spawned-files-leaking-into-soma-beta hole observed s01-030d41. Override with--skip-tree-hygiene(writes audit trail)..releaseignorewidened to cover.soma/,.husky/,node_modules/. soma:agent.listrole filter (SX-701) — pass{role: 'librarian'}(or any role string) to filter children by role. Stacks with existingactive_only/all/cleanupfilters. Useful when a parent has spawned multiple roles and wants to inspect just one cohort.- somadian drift discipline — verify + lift + pre-commit gate (SOMADIAN-002, s01-ef2bdc) — three scripts that enforce byte-identical shared code across the 4 somadian bins (cloud / enterprise / local / sidecar):
somadian-verifydetects drift,somadian-mirrorlifts a canonical bin to the others, andinstall-hooks.shwires a pre-commit gate that blocks divergent commits. Closes the silent-drift hole. - namespace-rooted workspace target path (s01-ef2bdc) —
soma-workspace-migrate-legacy.shnow writes to~/.soma/<namespace>/workspaces/__legacy__/...(was~/.soma/workspaces/...). Aligns with first-name-wins namespace shape (SOMAVERSE-019). - soma-workspace-migrate-legacy.sh — lazy migration W2 of plan 02 (s01-680a9c, preload #3) — walks
~/.soma/plugins/<type>/state.jsonand copies each into~/.soma/workspaces/__legacy__/<type>/<type>-1.json+ registers in~/.soma/workspaces/__legacy__/panes.json. Idempotent (re-run skips already-registered instances). Skips leading-underscore types (_test,_regression_test) by default. Preserves old paths for one release cycle as fallback. Per02-workspace-pane-config.md § Migration W2 (lazy)and~/.soma/workspaces/README.md. Smoke-verified end-to-end against a tmp clone of~/.soma/plugins/: 8 panes migrated, registry built with types/paths/timestamps/provenance markers, re-run skipped all 8. - soma-somaverse-deploy.sh — closes the build-vs-stamp race for somaverse (s01-680a9c, SOMAVERSE-009) — mirrors
soma-somadian-deploy.shfor the somaverse side. Enforces commit → build → deploy → verify ordering. The somaverse build embedsgit rev-parse HEADas the cache-buster (main.js?v=<sha>); building with uncommitted changes makes the deployed bundle report an older sha than its actual contents. Caught s01-680a9c cycle 10 mid-deploy. Builds:local(build-only),enterprise(→ arzadon.somaverse.ai),vps(→ somaverse.ai). End-to-end smoke verified live on enterprise build. - soma-somadian-deploy.sh — closes the build-vs-rsync race (s01-1bf0bb Cycle 15) — enforces commit→rsync→build→deploy→verify order. Includes
rollbackcommand. Future deploys won’t have stamp-vs-source mismatch. The Cycle 13 build had this race (binary had Cycle 13.5 fix but git_sha stamp was Cycle 13 commit). - soma-voice-switch.sh — voice backend mutex orchestrator (s01-1bf0bb W-3c) — top-level orchestrator wraps the 3 individual lifecycle scripts and applies the mutex matrix (
use voxtralkills openvoice + tts-server, starts voxtral; etc.). Used bysomaverse/.../server/bridge.tsPOST /voice/use-backend(pane wiring) ANDsomaverse-addons/voice.tscap (agent surface) — single source of truth.statusreturns JSON for machine consumption. - voice-backend lifecycle scripts (s01-1bf0bb) — 3 dev:* scripts in
scripts/_dev/:soma-voxtral.sh— local mlx Voxtral TTS (port 18795). macOS arm64 only; sweeps orphan procs.soma-openvoice.sh— OpenVoice V2 voice-clone server (port 18793). Mirrors soma-racecar pattern.soma-tts-server.sh— soma-voice/server/tts-server.py (port 18790, edge-tts + clone routing). All 3 build-excluded from npm tarball. Companion: somaversesomaverse-addons/voice.tsmutex cap. Plan:.soma/releases/sidecar/consolidated-plan/07-smallest-wedge.md§ W-2.
dev:*namespace foundation (SX-694) — new top-level meta-tool family for dev-only operations (dev:hub.*,dev:release.*,dev:audit.*,dev:lint.*). Stripped from end-user beta builds viasoma-release.shStep 3; verified byverify-bootstrap-clean.shTest 5 (NEW). Dogfood works locally; end users never seedev:*.dev:hub.*x5 caps (SX-695, SX-696) — read-only audit-grade introspection of community-tier content:dev:hub.list(items by type),dev:hub.read(raw markdown),dev:hub.canonical(paths),dev:hub.diff(vs workspace/fallback),dev:hub.audit(drift report). Replaces 5-step shell pipelines with a single cap call.dev:audit.deps+dev:audit.cicaps — dependency + CI-config audits surfaced as caps under the newdev:*namespace.soma:code.historycap (SX-700) —git logfor a file as a structured cap (sha + date + author + subject). Replaces 6 rawgit log --formatshell calls observed in a single session. Cap-only addition; zero cache-bust cost.- 3 missing roles synced + 3 drift fixes — community-tier
body/children/<role>.mdcontent reconciled against canonical: 3 roles re-synced and 3 drifted definitions corrected. soma-dev switchrewritten for worktree-on-main (SX-686) — the legacysoma-switch.shmanaged symlinks pre-SX-652. Replaced with a worktree-awaresoma-dev switch [dev|main|help]: flips~/.soma/agentbetween branches (detached HEAD on dev since it’s checked out inrepos/agent), rebuildsdist/, ff-pulls main.paths.shnow exportsAGENT_RUNTIME(canonical);AGENT_STABLEretained as deprecated alias.- frozen-protocols fallback warning (SX-691) — stepping stone before SX-691-full removal: when
build-dist.mjsfalls back torepos/agent/.soma/protocols/(frozen at v0.6.6), it now logs a triple-warning and labels the sourceagent .soma/ (FROZEN v0.6.6)so anyone hitting the fallback sees they’re shipping stale content. Fully removed in the SX-691 fix below. - release-please proposer workflow + config (SX-667) —
.github/workflows/release-please.ymlopens release PRs from conventional commits. Manual-trigger only (workflow_dispatch) until first proposer-output validation. Activates on default branch after next release sync. gh release createas Step 6.5 ofsoma-release-ship.sh(S4, SX-667) — auto-publishes a GitHub Release with generated notes on every release. Idempotent + non-fatal.- Full Step 4 log on failure (S2, SX-667) —
soma-release-ship.shnow captures fullsoma-release.shoutput to/tmp/soma-release-step4-v$VERSION.logand dumps the entire log on failure (wastail -10).
Fixed
body/STATE.mdnow scaffolds on fresh init (SX-669 follow-through) — SX-669 (s01-88d4bd) retired the root.soma/STATE.mdscaffold and declaredbody/STATE.mdthe canonical state slot. The migration comment incore/init.ts:608saidbody/STATE.mdwould be created bytemplates/default/body/STATE.md(handled byscaffoldBody) — but noSTATE.mdwas ever added totemplates/default/. Result: fresh init never createdSTATE.mdanywhere, but the_memory.mdpreload template still told users to “Update STATE.md if branches, versions, or known bugs changed.” Latent for ~6 weeks. Caught by sandbox smoke-test s01-b97ce5. Now ships a generic skeleton (Versions / Services / Tools / Known bugs / Recent shifts).soma-release-prepare.shcommit-msg-lint regex synced with.git-hooks/commit-msg(SX-702 follow-through) — SX-702 fixed the hook to allow.in scope ([a-z0-9_.-]+) so dotted cap-name scopes likeagent.listandcode.historywould pass. The companion regex in the orchestrator atsoma-release-prepare.sh:281was missed and still rejected dots. Result: every dotted-scope commit was flagged NEEDS-REVIEW by the orchestrator even though the hook accepted it. Synced.soma-sandbox.sh --mainworktree-aware (s01-b97ce5) — pre-SX-652 the main branch lived at$MEETSOMA/repos/agent-stable. Post-SX-652 it lives at$HOME/.soma/agent(worktree-on-main). The--mainsource path was never updated and silently failed (agent-stable not found). Now points at the canonical runtime worktree.soma-dev sandboxwrapper repaired (s01-b97ce5) — the wrapper atscripts/_dev/soma-dev/commands/sandbox.shredirected to$SOMA_DIR/amps/scripts/internal/soma-sandbox.sh, a path that moved during s01-c6944c consolidation. Wrapper was missed;soma-dev sandboxwas silently broken for ~5 weeks. Now forwards toscripts/_dev/sandbox/soma-sandbox.sh(canonical kit).soma-newno longer pollutes agent install with spawned content (SX-710) —resolve_soma_dir()walks up from$PWDlooking for any.soma/; when invoked from inside~/.soma/agent/, it would resolve to the install’s own dogfood.soma/(source-controlled, not a valid user-content target). Anysoma:new.muscle/soma:new.protocol/soma:new.childcall from inside the install would write into~/.soma/agent/.soma/amps/.... Fix: skip~/.soma/agent/.soma(symlink-safe viapwd -P) and continue the walk-up. Latent bug — no pollution found today, but the class is now closed.build-dist.mjsremoves v0.6.6 protocols fallback entirely (SX-691 full) — the fallback silently shipped frozen v0.6.6 protocols whenrepos/community/wasn’t cloned alongsiderepos/agent/. 5 core protocols had drifted between canonical and frozen (verified bydev:hub.audit). Build now exits 1 with a clear pointer (gh repo clone meetsoma/community) instead of shipping stale.- commit-msg lint allows
.in scope (SX-702) — conventional-commit scope regex was[a-z0-9_-]+, rejecting dotted scopes likeagent.listandcode.history(which match cap names). Caught whenfeat(agent.list): ...was silently rejected andgit pushsaid “Everything up-to-date” — cost ~2 min to diagnose. Fix: add.to the scope class. - commit-msg lint accepts
reverttype — was missing fromVALID_TYPES; needed forgit revertcommits to pass the gate. - GitHub repo URL reverted to canonical
meetsoma/soma-agent(SX-704) — a prior “canonicalization” (71c2c62) flipped the URL the wrong direction.gh apiconfirmed the canonical name ISmeetsoma/soma-agent. Both URLs resolve via GitHub redirect, but if the redirect ever drops, the previous direction would break. Reverted in 6 source files + 4.soma/files + 2 git remotes. soma-channel-guardhook resolves through symlinks (SX-693) — the hook is symlinked into each public repo’s.git/hooks/pre-push.dirname $0resolved to.git/hooks/, which broke the relativesource _lib/find-root.sh. Fix: walk throughreadlinkuntil$0is no longer a symlink. Affects all 6 public repos using the hook.test-doctorversion-equality assertion inverted (SX-659 align) — the test assertedagent_version != cli_version; SX-659 (v0.22.1) collapsed the two version trains so they’re intentionally equal now. Test was failing because reality finally matched the spec. Inverted: pass when versions match, fail on drift.soma-release-ship.shStep 6 (main-sync) hardened (SX-685) — dropped three buggy operations silently misbehaving under SX-652 worktree-on-main:git push origin v$VERSION(nooriginremote, onlymeetsoma),git branch -f main(fatal under worktree-on-main),git push --force-with-lease meetsoma main:main(would silently rewind remote main from a stale local ref). Step 6 is now just the agent-repo tag push; main sync is owned bysoma-release.shStep 6.soma-release-ship.shStep 7 worktree detection —-d "$HOME/.soma/agent/.git"was wrong under worktree-on-main (worktrees use a gitfile, not a directory). Silently skipped runtime-pull on every release. Fixed to-e(matches dir / file / symlink).
Changed
(no other behavior changes this release — see Added/Fixed.)
[0.22.1] — 2026-04-25
Added
- soma-workspace-migrate-legacy.sh — lazy migration W2 of plan 02 (s01-680a9c, preload #3) — walks
~/.soma/plugins/<type>/state.jsonand copies each into~/.soma/workspaces/__legacy__/<type>/<type>-1.json+ registers in~/.soma/workspaces/__legacy__/panes.json. Idempotent (re-run skips already-registered instances). Skips leading-underscore types (_test,_regression_test) by default. Preserves old paths for one release cycle as fallback. Per02-workspace-pane-config.md § Migration W2 (lazy)and~/.soma/workspaces/README.md. Smoke-verified end-to-end against a tmp clone of~/.soma/plugins/: 8 panes migrated, registry built with types/paths/timestamps/provenance markers, re-run skipped all 8. - soma:new.child cap + bundled _child-template.md (SX-663)
- progressive teach + child monitor improvements (SX-665, SX-666)
- cache-TTL rollback on aborted/errored turns (SX-660)
- add Phase 1.5 commit-message lint (G1, SX-667)
- delegate progressive teaching (SX-665) —
soma:agent.delegatebare call (or{help: true}) returns a structured help payload: roles available (auto-discovered frombody/children/*.md), models, recent children, examples, and a notice that async children don’t yet ping on completion (see SX-664). Tool teaches itself; saves a tool round-trip when the parent doesn’t remember the surface. - child monitor improvements (SX-666) —
soma:agent.listnow defaults to last-7-days (registry can grow long); accepts{active_only: true}to filter to running/spawning/completed-not-harvested; accepts{cleanup: true}to remove aborted/completed entries >24h old. Pass{all: true}to override the 7-day default. soma:new.childcap (SX-663) — scaffold a new child role at.soma/body/children/<name>.mdfrom_child-template.md, matchingsoma:new.muscle/soma:new.protocolpattern. Then edit the scaffold (set summary, default-model, inherits, guidelines), thendelegate({role:'<name>', task:'...'}). Bundled_child-template.mdships withsoma init.keepalive.rollbackOnAbortsetting (SX-660, opt-in) — whentrue,lastActivityTsrolls back on aborted/errored turns so the cache-TTL counter doesn’t overstate after a Curtis-aborted long-running tool call. Defaultfalse(no behavior change). Empirical evidence: aborted assistant messages have zero usage — API request never round-trips, so cache wasn’t actually refreshed at the optimistic turn_start reset. Opt in via.soma/settings.jsonkeepalive.rollbackOnAbort: true. Seereleases/plans/active/agent-infra/README.md§ SX-660.- Pi auto-fix loop on isolated worktree (SX-654)
- prepare + ship orchestrator with checklog pattern (SX-653)
- collapse agent + thin-CLI version trains (SX-659)
- Pi changelog parser utility (Bucket 2 / SX-653 dep)
- version-aware path interpolation (SX-656) — 5 new template vars (
current_version,current_series,active_plans_dir,active_index,active_release_dir) derived from agent_version orsettings.releases.activeSeriesoverride. New# Active Releaseblock inbody/_mind.md. Eliminates the stale-reference drift on version bumps. - externalize overlay manifest + bootstrap-clean verifier (Bucket 2 G+J / SX-653 deps)
Fixed
- cleanup mode prunes all finished entries, no time gate (SX-666 amend)
- triage 6 pre-existing test failures (32 assertions)
- count cache TTL from turn_start, not turn_end —
state.lastActivityTswas reset atturn_end, makingcacheRemaining()overstate by however long the turn took. Anthropic’s prompt-cache TTL counts from cache write (= turn_start). Validated against session JSONL: two invalidations both fell within the 300s window measured from turn_end but BOTH past 300s when measured from turn_start. BumpedkeepaliveThresholdSeconds45 → 90 as safety margin. - migrate to unscoped ‘typebox’ package (SX-655) — Pi 0.69.0 renamed
@sinclair/typebox0.34.x →typebox1.x. Migrated 6 imports and added'typebox'to all three external arrays inscripts/build-dist.mjs(was missed; build size doubled to 611 KB before the fix, recovered to 286.4 KB).
[0.22.0] — 2026-04-24 — Namespaced meta-tools end-to-end + bridge CLI + init hardening
Fixed
- harden pairing flow — secret in header, umask,
curl --fail, device-key shape-check (SX-audit, s01-d7bdf0) SOMAVERSE_DIRconsumers usebuilds/local/extensions(SX-616)- stale-ctx guard on footer render; no more pi-tui crashes post-
/reload(SX-633) - wire
soma-addons/+_shared/end-to-end; Tier 2 addon-ship through release script (SX-594 Phase 3 / gap-addon-ship.md, SX-610) AGENT_VERSIONreadsdist/manifest.jsonnotpackage.json(SX-624 revises SX-619)- refresh
docs/guides/code-navigator.mdexample + cap inventory (pre-release audit stale-ref sweep, s01-e3e1ed) - always stamp
AGENT_VERSIONin settings.json even when user template provides version field (SX-620) - copy
package.jsonintodist/soAGENT_VERSIONstamps correctly (SX-619, superseded by SX-624 for runtime path) - backport v0.21 cache economics to bundled defaults (SX-600)
- health check reads Pi version from
dist/manifest.json(authoritative) instead ofCORE_DIR/node_modules(stale-prone) (SX-622) - ship
templates/todist/sobody/scaffolds fully (SX-594) - smart partial-state handling + rootName + doctor bail on
soma init(SX-592)
Added
- soma-workspace-migrate-legacy.sh — lazy migration W2 of plan 02 (s01-680a9c, preload #3) — walks
~/.soma/plugins/<type>/state.jsonand copies each into~/.soma/workspaces/__legacy__/<type>/<type>-1.json+ registers in~/.soma/workspaces/__legacy__/panes.json. Idempotent (re-run skips already-registered instances). Skips leading-underscore types (_test,_regression_test) by default. Preserves old paths for one release cycle as fallback. Per02-workspace-pane-config.md § Migration W2 (lazy)and~/.soma/workspaces/README.md. Smoke-verified end-to-end against a tmp clone of~/.soma/plugins/: 8 panes migrated, registry built with types/paths/timestamps/provenance markers, re-run skipped all 8. soma bridgeCLI —start/stop/restart/status/logs/config/setup(SX-522) — first-class bridge daemon lifecycle. Works standalone without Somaverse; mirrored bysomaverse:bridge.*(7 caps) +somaverse:auth.*(3 caps) for agent-side automation.soma:agent.*meta-tool —delegate/childrencollapsed (SX-609) — 7 caps:delegate,list,tail,steer,kill,harvest,focus(focus op recovered from original plan). Extension shrank 606→330 lines.soma:focus.*/soma:new.*/soma:terminals.*— 11 new caps wrapping bundled CLIs. Also fixedsoma focusdispatcher’s inverted discovery order.soma-install.sh devcross-repo extension union +node_modulessymlink (SX-629) — reproducible end-to-end; fixed a latent Pi 0.66.1→0.69.0 drift.soma:docs.*for bundled docs search + retrieval (SX-594 Phase 3 Step C + SX-588 + SX-596)- progressive-awareness entry point for meta-tools (SX-594) — bare-prefix family discovery +
op='help'block for every meta-tool. soma:body.*(slots/cost/audit) fromdev:body.*move (SX-594 Phase 3 Step B)- family-level capability discovery via bare-prefix call (SX-594)
- register
soma:*meta-tool +soma:browser.*(17 caps, SX-594 Phase 2 Step C) — direct-CDP default; bridge required only for advanced ops (evaluate, styles, emulate, performance). - v0.22.0 version infrastructure +
soma-release --vbump/--vaudit+ dev-install package.json symlink (SX-622) - hash-based bundled template drift refresh (SX-621) — doctor auto-refreshes pristine-older body templates to current bundled; warns with diff path for customized files. Keyed off
migrations/template-hashes.jsonshipped with the agent. - Pi runtime upgrade 0.67.68 → 0.69.0 (SX-623) — 42 upstream commits (17 coding-agent fixes, 4 new features, 5 ai fixes, 2 tui fixes). Non-breaking: tool registration + extension API unchanged. Internal refactor: cwd-singleton tool filtering replaced by name-based allowlists (same behavior for extensions that register unique names). Notable improvements: symlink session resolution, skills dedup, xterm uppercase input, shell-path uses session cwd, OpenAI-compatible prompt caching (anthropic-style cache_control).
- teach
verify+symlinkcommands aboutsomaverse-tools+ addons (SX-613) - progressive-awareness retrofit across 4 commands (SX-590) —
soma body,soma tool,soma concepts,soma-dev statusnow emit a curatedWhat next:block after every state. Bare command ==--help. Suppressed when piped (isatty check). Helpersoma_next_stepsadded toscripts/soma-theme.sh; parallelnext_stepsinscripts/_dev/soma-dev/lib/colors.sh. Muscle:amps/muscles/cli-progressive-awareness.md(heat 3). dev:cli.*addon — 17 soma-shell capabilities (SX-585) — wrapssoma plans/reflect/trace/concepts/threads/blog-audit/blog-graph/body/protocol-audit/compat+ pro (refactor/github/scrape/seam) + dev (dev/deploy) +cli.rawescape. Agents see the CLI surface viadev(op='list', prefix='dev:cli.'). Zero cache bust (addon lives outside cached prefix).docs/amps.md+docs/migrating.mdseeded from website (SX-586) — the two website-only docs now have agent-side sources. Nextsync-to-website.shrun is a no-op (zero byte drift verified). Future edits happen agent-side.
Changed
- SX-594 wrapper sweep — archived deprecation shims (SX-601) —
workspace_*,plugin_state_*, flatbrowser_*,code_*,dev:ai.*,dev:body.*,file_outlineno longer register at boot. The cached prompt no longer carries the double surface. Wrappers moved to_archive/sx594-flat-wrappers/in both agent + somaverse repos. - Tier C stale-reference sweep across muscles / docs / MAPs (SX-628) — remaining references to archived flat tool names cleaned up.
Changed
ai_*→dev:ai.*addon extraction (SX-591 Phase A) — 5 flat Pi-registered tools (ai_status,ai_load,ai_index,ai_search,ai_embed) removed from the cached prompt surface; same capabilities behind thedevmeta-tool. Call viadev(op='call', cap='dev:ai.search', args={...}). ~3KB reduction incache_creation_input_tokensper session on cold boot. Pilot for the v0.22.x namespaced-meta-tools arc (SX-594).
[0.21.1.1] — 2026-04-22 — Same-cycle audit patches
Micro-release caught during a post-ship audit of v0.21.0..HEAD. Three
findings with real code impact; two dead-code + hygiene tidy-ups.
Added
-
soma-workspace-migrate-legacy.sh — lazy migration W2 of plan 02 (s01-680a9c, preload #3) — walks
~/.soma/plugins/<type>/state.jsonand copies each into~/.soma/workspaces/__legacy__/<type>/<type>-1.json+ registers in~/.soma/workspaces/__legacy__/panes.json. Idempotent (re-run skips already-registered instances). Skips leading-underscore types (_test,_regression_test) by default. Preserves old paths for one release cycle as fallback. Per02-workspace-pane-config.md § Migration W2 (lazy)and~/.soma/workspaces/README.md. Smoke-verified end-to-end against a tmp clone of~/.soma/plugins/: 8 panes migrated, registry built with types/paths/timestamps/provenance markers, re-run skipped all 8. -
soma model-sync— audit + setdefaultModelacross all scopes. New bundled scriptscripts/soma-model-sync.sh. Audits global (~/.soma/settings.json) + project (<cwd>/.soma/settings.json) + any.soma/dirs under$HOME(with--crawl).--set <id>writes everywhere;--yesskips confirmation; idempotent. Bundled default isclaude-opus-4-7(the latest Opus on Claude Max plans). Createssettings.jsonwhere missing; preserves all unrelated keys in files that are already populated. Closes the “keep every project on the current model without hand-editing” gap. 23-assertion test suite attests/test-model-sync.sh. Guide:docs/guides/sane-defaults.md.
Fixed
-
TmuxDriver shell-quoting.
tmuxExecusedJSON.stringifyper-arg, which wraps in double quotes — bash double-quotes let$(...)+ backticks +$VARexpand on the parent shell before tmux sees them. A task like"list files in $(pwd)/logs"would arrive at the child with$(pwd)already substituted for the parent’s cwd. Switched to single-quote wrapping with the classic'\''escape for embedded quotes. Verified against 7 edge cases (plain, single + double quotes, backticks,$(), paths, semicolons — all round-trip literal).Not a security bug (self-injection only; same user), but a correctness bug that landed in v0.21.1 and would surface the first time a user wrote a task with shell metacharacters.
-
soma-model-syncshell-to-python interpolation.read/write_default_modelbuilt python-csource via$varinterpolation. A model id with a single quote character (or shell metacharacter) would break the-cblock. Moved path + model to env vars (SOMA_MS_PATH,SOMA_MS_MODEL); python source is now static. -
.gitignore:__pycache__/+*.pyc. An accidentally-trackedscripts/__pycache__/soma-children.cpython-313.pyclanded in the v0.21.1 agent dev commits. Confirmed it did NOT ship to soma-beta (.releaseignorefiltered it), so no user runtime impact. Cleaned up + prevented future recurrence. -
Dead code removed.
shEscapehelper incore/terminal-drivers/tmux.tswas orphaned after the signature changed during the driver refactor. -
Import order.
biome --write --unsafeoncore/terminal-drivers/index.tsextensions/soma-delegate.tsto match the project’s import conventions.
[0.21.1] — 2026-04-22 — Children control panel + tmux baseline
Patch release. Three themes woven together: complete the background-
delegation surface (Phase B ops), ship background delegation to npm users
(tmux driver), and fix a months-old dead branch in the boot resume path
so the delta-diff and /reload signal can actually fire.
Added
-
soma-workspace-migrate-legacy.sh — lazy migration W2 of plan 02 (s01-680a9c, preload #3) — walks
~/.soma/plugins/<type>/state.jsonand copies each into~/.soma/workspaces/__legacy__/<type>/<type>-1.json+ registers in~/.soma/workspaces/__legacy__/panes.json. Idempotent (re-run skips already-registered instances). Skips leading-underscore types (_test,_regression_test) by default. Preserves old paths for one release cycle as fallback. Per02-workspace-pane-config.md § Migration W2 (lazy)and~/.soma/workspaces/README.md. Smoke-verified end-to-end against a tmp clone of~/.soma/plugins/: 8 panes migrated, registry built with types/paths/timestamps/provenance markers, re-run skipped all 8. -
childrentool — Phase B ops (SX-553) —tail/steer/kill/harveston top oflist.tailuses the driver’s capture;steersends a chat message (blocked on non-running);killcloses the driver container + marks aborted;harvestreturns the MLR placeholder + removes the entry from the registry.findChild(id)accepts either the child id or the driver handle id (e.g.surface:8,soma-child-abc). -
TerminalDriver interface + TmuxDriver baseline (SX-580 Phase C.1–C.2) — new
core/terminal-drivers/package with a unified driver interface. Two implementations:TmuxDriver(ships to npm — detached tmux sessions, attach-on-demand viatmux attach -t soma-child-<id>, works on any Unix with tmux installed, no TTY issues, CI-compatible) andCmuxDriver(dev- mode only, existing logic refactored with zero behavior change). Auto- pick preferstmux > cmux.delegategains optionalterminal:'tmux'|'cmux'param.ChildEntryschema gainsdriver,handle_id,attach_hint; legacypane/surfacekept for pre-refactor entries.children listtable gains a driver column. First timedelegate(background:true)works for a non-cmux user in any Soma release. -
soma terminalsCLI + persistent driver preference (SX-580 Phase C.3–C.4) — new bundledscripts/soma-terminals.shmodeled on soma-blog’s self-describing pattern. Subcommands:list,detect(list + recommendation),status(current configured driver),prefer <driver>(persist to~/.soma/settings.jsondelegate.terminal),setup [<driver>](install walkthrough),doctor [<driver>](diagnose why a driver isn’t working).pickDriver()consults settings before auto-pick. Precedence: per-callterminal:param → settings → auto-pick. Agent can runsoma terminals setupand walk a user through install whendelegate(background:true)fails with no-driver-available. -
/reloaddistinguished from resume in boot message —soma-bootnow stampsprocess.pidon every fingerprint entry. On resume, if the most recent entry’s PID matchesprocess.pid, the extension re-activated in- process (= user ran/reload) and the boot message becomes[Soma Boot — /reloaded]with the explicit signalany 'needs /reload' work from the last turn is now live. Prompt cache is already busted by/reloadso emitting a message here costs nothing. Distinguishes from: ctrl-C restart (new PID, resumed session) and periodic checkpoints (not a boot at all). -
Background-delegation guide — new
docs/guides/background-delegation.mdwith the sync-vs-background decision tree, tmux install hints, mental model, attach-on-demand pattern, full children-ops examples, kill-vs-harvest semantics, the MLR-writing gap stated honestly, troubleshooting entries for the two surfaced bugs, and a pointer for authoring new drivers.docs/tools.md+docs/commands.mdgain cross-links and CLI table rows. -
Upstream Pi patches shipped as dist overlays:
- pi-tui inline image height cap (SX-579) — tall clipboard screenshots
no longer take over the terminal. Capped at a readable row count via
PI_TUI_MAX_IMAGE_ROWS(default 80% ofprocess.stdout.rows, min 20). Patch is PR-shaped (opt-in, backward-compatible) pending the upstreamCONTRIBUTING.mdflow. - Compaction ephemeral-path filter (SX-569) —
extractFileOpsFromMessagein Pi’s compaction util was collecting everyread/write/editpath into<read-files>/<modified-files>XML blocks. macOS clipboard paste-temp files (/var/folders/.../T/clipboard-*.jpeg) +/tmp/*.{png,jpg,…}screenshots accumulated across compactions. AddedisEphemeralPath(p)guard. Zero payload mutation.
- pi-tui inline image height cap (SX-579) — tall clipboard screenshots
no longer take over the terminal. Capped at a readable row count via
Fixed
- Boot resume fingerprint reader was reading the wrong field — filter
code read
entry.content?.fingerprint, but Pi’sSessionManager.appendEntrystores payloads underentry.data. The delta-diff branch had been silently dead since it was written; every resume fell through to the “no fingerprint” fallback. Fixed — delta-diff resume now actually fires when heat or muscles changed. delegate(background:true)was broken since Phase A shipped —CMUX_SCRIPTpath resolution used an unset env var + a dev-install symlink that doesn’t coverscripts/. Every call hit “install cmux” even when cmux was running. New resolution walksSOMA_CMUX_SCRIPTenv →SOMA_CODING_AGENT_DIR→ cwd-relative → walk-up → dev-symlink → PATH. Uncovered by end-to-end exercise.- Model alias leakage to children —
spawnBackgroundpassed bare aliases (haiku,sonnet,opus) straight tosoma --model, and Pi’s model registry picked the wrong provider (us.anthropic.haiku-4-5= bedrock) in the child’s environment. Child died on missing bedrock creds.MODEL_ALIASESnow exported fromcore/delegate-core.ts; aliases are pre-resolved to fully-qualified ids (claude-haiku-4-5) before building the boot command. - Registry stayed
runningafter a child’s container closed — no auto status-transition on pane death. NewreconcileChildStatuses()pass runs at the start ofchildren(op:'list'): any registry entry whose driver container is gone auto-flips tocompletedwithended_at. - Channel guard false-positive on
SOMA_PROJECT_DIR— thesoma_prokeyword in the guard’s pattern matchedSOMA_PROJECT_DIRenv mentions in benign output. Narrowed the pattern.
Verified end-to-end (s01-b1b654)
delegate(background:true, terminal:'tmux', model:'haiku') → children(op:'list')
→ tail → steer → kill → harvest against a real tmux-spawned child.
Child booted in a detached tmux session, executed the task, responded to
steer, kill cleanly closed the session (tmux ls confirmed: no server),
harvest returned the summary and removed the registry entry. Model resolved
to claude-haiku-4-5 end-to-end. Same flow also verified against a
cmux-spawned child earlier in the same session — both drivers work.
Release notes: .soma/releases/v0.20.x/v0.21.1/release-notes.md.
[0.21.0] — 2026-04-22 — Cache Economics + Discoverability + Self-Knowledge
Added
- soma-workspace-migrate-legacy.sh — lazy migration W2 of plan 02 (s01-680a9c, preload #3) — walks
~/.soma/plugins/<type>/state.jsonand copies each into~/.soma/workspaces/__legacy__/<type>/<type>-1.json+ registers in~/.soma/workspaces/__legacy__/panes.json. Idempotent (re-run skips already-registered instances). Skips leading-underscore types (_test,_regression_test) by default. Preserves old paths for one release cycle as fallback. Per02-workspace-pane-config.md § Migration W2 (lazy)and~/.soma/workspaces/README.md. Smoke-verified end-to-end against a tmp clone of~/.soma/plugins/: 8 panes migrated, registry built with types/paths/timestamps/provenance markers, re-run skipped all 8. - 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
- soma-workspace-migrate-legacy.sh — lazy migration W2 of plan 02 (s01-680a9c, preload #3) — walks
~/.soma/plugins/<type>/state.jsonand copies each into~/.soma/workspaces/__legacy__/<type>/<type>-1.json+ registers in~/.soma/workspaces/__legacy__/panes.json. Idempotent (re-run skips already-registered instances). Skips leading-underscore types (_test,_regression_test) by default. Preserves old paths for one release cycle as fallback. Per02-workspace-pane-config.md § Migration W2 (lazy)and~/.soma/workspaces/README.md. Smoke-verified end-to-end against a tmp clone of~/.soma/plugins/: 8 panes migrated, registry built with types/paths/timestamps/provenance markers, re-run skipped all 8. /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-workspace-migrate-legacy.sh — lazy migration W2 of plan 02 (s01-680a9c, preload #3) — walks
~/.soma/plugins/<type>/state.jsonand copies each into~/.soma/workspaces/__legacy__/<type>/<type>-1.json+ registers in~/.soma/workspaces/__legacy__/panes.json. Idempotent (re-run skips already-registered instances). Skips leading-underscore types (_test,_regression_test) by default. Preserves old paths for one release cycle as fallback. Per02-workspace-pane-config.md § Migration W2 (lazy)and~/.soma/workspaces/README.md. Smoke-verified end-to-end against a tmp clone of~/.soma/plugins/: 8 panes migrated, registry built with types/paths/timestamps/provenance markers, re-run skipped all 8. - 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
- soma-workspace-migrate-legacy.sh — lazy migration W2 of plan 02 (s01-680a9c, preload #3) — walks
~/.soma/plugins/<type>/state.jsonand copies each into~/.soma/workspaces/__legacy__/<type>/<type>-1.json+ registers in~/.soma/workspaces/__legacy__/panes.json. Idempotent (re-run skips already-registered instances). Skips leading-underscore types (_test,_regression_test) by default. Preserves old paths for one release cycle as fallback. Per02-workspace-pane-config.md § Migration W2 (lazy)and~/.soma/workspaces/README.md. Smoke-verified end-to-end against a tmp clone of~/.soma/plugins/: 8 panes migrated, registry built with types/paths/timestamps/provenance markers, re-run skipped all 8. - 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
- soma-workspace-migrate-legacy.sh — lazy migration W2 of plan 02 (s01-680a9c, preload #3) — walks
~/.soma/plugins/<type>/state.jsonand copies each into~/.soma/workspaces/__legacy__/<type>/<type>-1.json+ registers in~/.soma/workspaces/__legacy__/panes.json. Idempotent (re-run skips already-registered instances). Skips leading-underscore types (_test,_regression_test) by default. Preserves old paths for one release cycle as fallback. Per02-workspace-pane-config.md § Migration W2 (lazy)and~/.soma/workspaces/README.md. Smoke-verified end-to-end against a tmp clone of~/.soma/plugins/: 8 panes migrated, registry built with types/paths/timestamps/provenance markers, re-run skipped all 8. - 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
- soma-workspace-migrate-legacy.sh — lazy migration W2 of plan 02 (s01-680a9c, preload #3) — walks
~/.soma/plugins/<type>/state.jsonand copies each into~/.soma/workspaces/__legacy__/<type>/<type>-1.json+ registers in~/.soma/workspaces/__legacy__/panes.json. Idempotent (re-run skips already-registered instances). Skips leading-underscore types (_test,_regression_test) by default. Preserves old paths for one release cycle as fallback. Per02-workspace-pane-config.md § Migration W2 (lazy)and~/.soma/workspaces/README.md. Smoke-verified end-to-end against a tmp clone of~/.soma/plugins/: 8 panes migrated, registry built with types/paths/timestamps/provenance markers, re-run skipped all 8. - 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
- soma-workspace-migrate-legacy.sh — lazy migration W2 of plan 02 (s01-680a9c, preload #3) — walks
~/.soma/plugins/<type>/state.jsonand copies each into~/.soma/workspaces/__legacy__/<type>/<type>-1.json+ registers in~/.soma/workspaces/__legacy__/panes.json. Idempotent (re-run skips already-registered instances). Skips leading-underscore types (_test,_regression_test) by default. Preserves old paths for one release cycle as fallback. Per02-workspace-pane-config.md § Migration W2 (lazy)and~/.soma/workspaces/README.md. Smoke-verified end-to-end against a tmp clone of~/.soma/plugins/: 8 panes migrated, registry built with types/paths/timestamps/provenance markers, re-run skipped all 8. 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
- soma-workspace-migrate-legacy.sh — lazy migration W2 of plan 02 (s01-680a9c, preload #3) — walks
~/.soma/plugins/<type>/state.jsonand copies each into~/.soma/workspaces/__legacy__/<type>/<type>-1.json+ registers in~/.soma/workspaces/__legacy__/panes.json. Idempotent (re-run skips already-registered instances). Skips leading-underscore types (_test,_regression_test) by default. Preserves old paths for one release cycle as fallback. Per02-workspace-pane-config.md § Migration W2 (lazy)and~/.soma/workspaces/README.md. Smoke-verified end-to-end against a tmp clone of~/.soma/plugins/: 8 panes migrated, registry built with types/paths/timestamps/provenance markers, re-run skipped all 8. - 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
- soma-workspace-migrate-legacy.sh — lazy migration W2 of plan 02 (s01-680a9c, preload #3) — walks
~/.soma/plugins/<type>/state.jsonand copies each into~/.soma/workspaces/__legacy__/<type>/<type>-1.json+ registers in~/.soma/workspaces/__legacy__/panes.json. Idempotent (re-run skips already-registered instances). Skips leading-underscore types (_test,_regression_test) by default. Preserves old paths for one release cycle as fallback. Per02-workspace-pane-config.md § Migration W2 (lazy)and~/.soma/workspaces/README.md. Smoke-verified end-to-end against a tmp clone of~/.soma/plugins/: 8 panes migrated, registry built with types/paths/timestamps/provenance markers, re-run skipped all 8. - 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-workspace-migrate-legacy.sh — lazy migration W2 of plan 02 (s01-680a9c, preload #3) — walks
~/.soma/plugins/<type>/state.jsonand copies each into~/.soma/workspaces/__legacy__/<type>/<type>-1.json+ registers in~/.soma/workspaces/__legacy__/panes.json. Idempotent (re-run skips already-registered instances). Skips leading-underscore types (_test,_regression_test) by default. Preserves old paths for one release cycle as fallback. Per02-workspace-pane-config.md § Migration W2 (lazy)and~/.soma/workspaces/README.md. Smoke-verified end-to-end against a tmp clone of~/.soma/plugins/: 8 panes migrated, registry built with types/paths/timestamps/provenance markers, re-run skipped all 8. 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-workspace-migrate-legacy.sh — lazy migration W2 of plan 02 (s01-680a9c, preload #3) — walks
~/.soma/plugins/<type>/state.jsonand copies each into~/.soma/workspaces/__legacy__/<type>/<type>-1.json+ registers in~/.soma/workspaces/__legacy__/panes.json. Idempotent (re-run skips already-registered instances). Skips leading-underscore types (_test,_regression_test) by default. Preserves old paths for one release cycle as fallback. Per02-workspace-pane-config.md § Migration W2 (lazy)and~/.soma/workspaces/README.md. Smoke-verified end-to-end against a tmp clone of~/.soma/plugins/: 8 panes migrated, registry built with types/paths/timestamps/provenance markers, re-run skipped all 8. 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
- soma-workspace-migrate-legacy.sh — lazy migration W2 of plan 02 (s01-680a9c, preload #3) — walks
~/.soma/plugins/<type>/state.jsonand copies each into~/.soma/workspaces/__legacy__/<type>/<type>-1.json+ registers in~/.soma/workspaces/__legacy__/panes.json. Idempotent (re-run skips already-registered instances). Skips leading-underscore types (_test,_regression_test) by default. Preserves old paths for one release cycle as fallback. Per02-workspace-pane-config.md § Migration W2 (lazy)and~/.soma/workspaces/README.md. Smoke-verified end-to-end against a tmp clone of~/.soma/plugins/: 8 panes migrated, registry built with types/paths/timestamps/provenance markers, re-run skipped all 8. - 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-workspace-migrate-legacy.sh — lazy migration W2 of plan 02 (s01-680a9c, preload #3) — walks
~/.soma/plugins/<type>/state.jsonand copies each into~/.soma/workspaces/__legacy__/<type>/<type>-1.json+ registers in~/.soma/workspaces/__legacy__/panes.json. Idempotent (re-run skips already-registered instances). Skips leading-underscore types (_test,_regression_test) by default. Preserves old paths for one release cycle as fallback. Per02-workspace-pane-config.md § Migration W2 (lazy)and~/.soma/workspaces/README.md. Smoke-verified end-to-end against a tmp clone of~/.soma/plugins/: 8 panes migrated, registry built with types/paths/timestamps/provenance markers, re-run skipped all 8. 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
- soma-workspace-migrate-legacy.sh — lazy migration W2 of plan 02 (s01-680a9c, preload #3) — walks
~/.soma/plugins/<type>/state.jsonand copies each into~/.soma/workspaces/__legacy__/<type>/<type>-1.json+ registers in~/.soma/workspaces/__legacy__/panes.json. Idempotent (re-run skips already-registered instances). Skips leading-underscore types (_test,_regression_test) by default. Preserves old paths for one release cycle as fallback. Per02-workspace-pane-config.md § Migration W2 (lazy)and~/.soma/workspaces/README.md. Smoke-verified end-to-end against a tmp clone of~/.soma/plugins/: 8 panes migrated, registry built with types/paths/timestamps/provenance markers, re-run skipped all 8. - 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-workspace-migrate-legacy.sh — lazy migration W2 of plan 02 (s01-680a9c, preload #3) — walks
~/.soma/plugins/<type>/state.jsonand copies each into~/.soma/workspaces/__legacy__/<type>/<type>-1.json+ registers in~/.soma/workspaces/__legacy__/panes.json. Idempotent (re-run skips already-registered instances). Skips leading-underscore types (_test,_regression_test) by default. Preserves old paths for one release cycle as fallback. Per02-workspace-pane-config.md § Migration W2 (lazy)and~/.soma/workspaces/README.md. Smoke-verified end-to-end against a tmp clone of~/.soma/plugins/: 8 panes migrated, registry built with types/paths/timestamps/provenance markers, re-run skipped all 8. 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
- soma-workspace-migrate-legacy.sh — lazy migration W2 of plan 02 (s01-680a9c, preload #3) — walks
~/.soma/plugins/<type>/state.jsonand copies each into~/.soma/workspaces/__legacy__/<type>/<type>-1.json+ registers in~/.soma/workspaces/__legacy__/panes.json. Idempotent (re-run skips already-registered instances). Skips leading-underscore types (_test,_regression_test) by default. Preserves old paths for one release cycle as fallback. Per02-workspace-pane-config.md § Migration W2 (lazy)and~/.soma/workspaces/README.md. Smoke-verified end-to-end against a tmp clone of~/.soma/plugins/: 8 panes migrated, registry built with types/paths/timestamps/provenance markers, re-run skipped all 8. - 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
- soma-workspace-migrate-legacy.sh — lazy migration W2 of plan 02 (s01-680a9c, preload #3) — walks
~/.soma/plugins/<type>/state.jsonand copies each into~/.soma/workspaces/__legacy__/<type>/<type>-1.json+ registers in~/.soma/workspaces/__legacy__/panes.json. Idempotent (re-run skips already-registered instances). Skips leading-underscore types (_test,_regression_test) by default. Preserves old paths for one release cycle as fallback. Per02-workspace-pane-config.md § Migration W2 (lazy)and~/.soma/workspaces/README.md. Smoke-verified end-to-end against a tmp clone of~/.soma/plugins/: 8 panes migrated, registry built with types/paths/timestamps/provenance markers, re-run skipped all 8. {{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
- soma-workspace-migrate-legacy.sh — lazy migration W2 of plan 02 (s01-680a9c, preload #3) — walks
~/.soma/plugins/<type>/state.jsonand copies each into~/.soma/workspaces/__legacy__/<type>/<type>-1.json+ registers in~/.soma/workspaces/__legacy__/panes.json. Idempotent (re-run skips already-registered instances). Skips leading-underscore types (_test,_regression_test) by default. Preserves old paths for one release cycle as fallback. Per02-workspace-pane-config.md § Migration W2 (lazy)and~/.soma/workspaces/README.md. Smoke-verified end-to-end against a tmp clone of~/.soma/plugins/: 8 panes migrated, registry built with types/paths/timestamps/provenance markers, re-run skipped all 8. - 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-workspace-migrate-legacy.sh — lazy migration W2 of plan 02 (s01-680a9c, preload #3) — walks
~/.soma/plugins/<type>/state.jsonand copies each into~/.soma/workspaces/__legacy__/<type>/<type>-1.json+ registers in~/.soma/workspaces/__legacy__/panes.json. Idempotent (re-run skips already-registered instances). Skips leading-underscore types (_test,_regression_test) by default. Preserves old paths for one release cycle as fallback. Per02-workspace-pane-config.md § Migration W2 (lazy)and~/.soma/workspaces/README.md. Smoke-verified end-to-end against a tmp clone of~/.soma/plugins/: 8 panes migrated, registry built with types/paths/timestamps/provenance markers, re-run skipped all 8. 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
- soma-workspace-migrate-legacy.sh — lazy migration W2 of plan 02 (s01-680a9c, preload #3) — walks
~/.soma/plugins/<type>/state.jsonand copies each into~/.soma/workspaces/__legacy__/<type>/<type>-1.json+ registers in~/.soma/workspaces/__legacy__/panes.json. Idempotent (re-run skips already-registered instances). Skips leading-underscore types (_test,_regression_test) by default. Preserves old paths for one release cycle as fallback. Per02-workspace-pane-config.md § Migration W2 (lazy)and~/.soma/workspaces/README.md. Smoke-verified end-to-end against a tmp clone of~/.soma/plugins/: 8 panes migrated, registry built with types/paths/timestamps/provenance markers, re-run skipped all 8. - 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
- soma-workspace-migrate-legacy.sh — lazy migration W2 of plan 02 (s01-680a9c, preload #3) — walks
~/.soma/plugins/<type>/state.jsonand copies each into~/.soma/workspaces/__legacy__/<type>/<type>-1.json+ registers in~/.soma/workspaces/__legacy__/panes.json. Idempotent (re-run skips already-registered instances). Skips leading-underscore types (_test,_regression_test) by default. Preserves old paths for one release cycle as fallback. Per02-workspace-pane-config.md § Migration W2 (lazy)and~/.soma/workspaces/README.md. Smoke-verified end-to-end against a tmp clone of~/.soma/plugins/: 8 panes migrated, registry built with types/paths/timestamps/provenance markers, re-run skipped all 8. - 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
- soma-workspace-migrate-legacy.sh — lazy migration W2 of plan 02 (s01-680a9c, preload #3) — walks
~/.soma/plugins/<type>/state.jsonand copies each into~/.soma/workspaces/__legacy__/<type>/<type>-1.json+ registers in~/.soma/workspaces/__legacy__/panes.json. Idempotent (re-run skips already-registered instances). Skips leading-underscore types (_test,_regression_test) by default. Preserves old paths for one release cycle as fallback. Per02-workspace-pane-config.md § Migration W2 (lazy)and~/.soma/workspaces/README.md. Smoke-verified end-to-end against a tmp clone of~/.soma/plugins/: 8 panes migrated, registry built with types/paths/timestamps/provenance markers, re-run skipped all 8. - 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
- soma-workspace-migrate-legacy.sh — lazy migration W2 of plan 02 (s01-680a9c, preload #3) — walks
~/.soma/plugins/<type>/state.jsonand copies each into~/.soma/workspaces/__legacy__/<type>/<type>-1.json+ registers in~/.soma/workspaces/__legacy__/panes.json. Idempotent (re-run skips already-registered instances). Skips leading-underscore types (_test,_regression_test) by default. Preserves old paths for one release cycle as fallback. Per02-workspace-pane-config.md § Migration W2 (lazy)and~/.soma/workspaces/README.md. Smoke-verified end-to-end against a tmp clone of~/.soma/plugins/: 8 panes migrated, registry built with types/paths/timestamps/provenance markers, re-run skipped all 8. - 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
- soma-workspace-migrate-legacy.sh — lazy migration W2 of plan 02 (s01-680a9c, preload #3) — walks
~/.soma/plugins/<type>/state.jsonand copies each into~/.soma/workspaces/__legacy__/<type>/<type>-1.json+ registers in~/.soma/workspaces/__legacy__/panes.json. Idempotent (re-run skips already-registered instances). Skips leading-underscore types (_test,_regression_test) by default. Preserves old paths for one release cycle as fallback. Per02-workspace-pane-config.md § Migration W2 (lazy)and~/.soma/workspaces/README.md. Smoke-verified end-to-end against a tmp clone of~/.soma/plugins/: 8 panes migrated, registry built with types/paths/timestamps/provenance markers, re-run skipped all 8. - 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
- soma-workspace-migrate-legacy.sh — lazy migration W2 of plan 02 (s01-680a9c, preload #3) — walks
~/.soma/plugins/<type>/state.jsonand copies each into~/.soma/workspaces/__legacy__/<type>/<type>-1.json+ registers in~/.soma/workspaces/__legacy__/panes.json. Idempotent (re-run skips already-registered instances). Skips leading-underscore types (_test,_regression_test) by default. Preserves old paths for one release cycle as fallback. Per02-workspace-pane-config.md § Migration W2 (lazy)and~/.soma/workspaces/README.md. Smoke-verified end-to-end against a tmp clone of~/.soma/plugins/: 8 panes migrated, registry built with types/paths/timestamps/provenance markers, re-run skipped all 8. - 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
- soma-workspace-migrate-legacy.sh — lazy migration W2 of plan 02 (s01-680a9c, preload #3) — walks
~/.soma/plugins/<type>/state.jsonand copies each into~/.soma/workspaces/__legacy__/<type>/<type>-1.json+ registers in~/.soma/workspaces/__legacy__/panes.json. Idempotent (re-run skips already-registered instances). Skips leading-underscore types (_test,_regression_test) by default. Preserves old paths for one release cycle as fallback. Per02-workspace-pane-config.md § Migration W2 (lazy)and~/.soma/workspaces/README.md. Smoke-verified end-to-end against a tmp clone of~/.soma/plugins/: 8 panes migrated, registry built with types/paths/timestamps/provenance markers, re-run skipped all 8. - 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
- soma-workspace-migrate-legacy.sh — lazy migration W2 of plan 02 (s01-680a9c, preload #3) — walks
~/.soma/plugins/<type>/state.jsonand copies each into~/.soma/workspaces/__legacy__/<type>/<type>-1.json+ registers in~/.soma/workspaces/__legacy__/panes.json. Idempotent (re-run skips already-registered instances). Skips leading-underscore types (_test,_regression_test) by default. Preserves old paths for one release cycle as fallback. Per02-workspace-pane-config.md § Migration W2 (lazy)and~/.soma/workspaces/README.md. Smoke-verified end-to-end against a tmp clone of~/.soma/plugins/: 8 panes migrated, registry built with types/paths/timestamps/provenance markers, re-run skipped all 8. - 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
- soma-workspace-migrate-legacy.sh — lazy migration W2 of plan 02 (s01-680a9c, preload #3) — walks
~/.soma/plugins/<type>/state.jsonand copies each into~/.soma/workspaces/__legacy__/<type>/<type>-1.json+ registers in~/.soma/workspaces/__legacy__/panes.json. Idempotent (re-run skips already-registered instances). Skips leading-underscore types (_test,_regression_test) by default. Preserves old paths for one release cycle as fallback. Per02-workspace-pane-config.md § Migration W2 (lazy)and~/.soma/workspaces/README.md. Smoke-verified end-to-end against a tmp clone of~/.soma/plugins/: 8 panes migrated, registry built with types/paths/timestamps/provenance markers, re-run skipped all 8. - 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
- soma-workspace-migrate-legacy.sh — lazy migration W2 of plan 02 (s01-680a9c, preload #3) — walks
~/.soma/plugins/<type>/state.jsonand copies each into~/.soma/workspaces/__legacy__/<type>/<type>-1.json+ registers in~/.soma/workspaces/__legacy__/panes.json. Idempotent (re-run skips already-registered instances). Skips leading-underscore types (_test,_regression_test) by default. Preserves old paths for one release cycle as fallback. Per02-workspace-pane-config.md § Migration W2 (lazy)and~/.soma/workspaces/README.md. Smoke-verified end-to-end against a tmp clone of~/.soma/plugins/: 8 panes migrated, registry built with types/paths/timestamps/provenance markers, re-run skipped all 8. - 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
-
soma-workspace-migrate-legacy.sh — lazy migration W2 of plan 02 (s01-680a9c, preload #3) — walks
~/.soma/plugins/<type>/state.jsonand copies each into~/.soma/workspaces/__legacy__/<type>/<type>-1.json+ registers in~/.soma/workspaces/__legacy__/panes.json. Idempotent (re-run skips already-registered instances). Skips leading-underscore types (_test,_regression_test) by default. Preserves old paths for one release cycle as fallback. Per02-workspace-pane-config.md § Migration W2 (lazy)and~/.soma/workspaces/README.md. Smoke-verified end-to-end against a tmp clone of~/.soma/plugins/: 8 panes migrated, registry built with types/paths/timestamps/provenance markers, re-run skipped all 8. -
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
-
soma-workspace-migrate-legacy.sh — lazy migration W2 of plan 02 (s01-680a9c, preload #3) — walks
~/.soma/plugins/<type>/state.jsonand copies each into~/.soma/workspaces/__legacy__/<type>/<type>-1.json+ registers in~/.soma/workspaces/__legacy__/panes.json. Idempotent (re-run skips already-registered instances). Skips leading-underscore types (_test,_regression_test) by default. Preserves old paths for one release cycle as fallback. Per02-workspace-pane-config.md § Migration W2 (lazy)and~/.soma/workspaces/README.md. Smoke-verified end-to-end against a tmp clone of~/.soma/plugins/: 8 panes migrated, registry built with types/paths/timestamps/provenance markers, re-run skipped all 8. -
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
-
soma-workspace-migrate-legacy.sh — lazy migration W2 of plan 02 (s01-680a9c, preload #3) — walks
~/.soma/plugins/<type>/state.jsonand copies each into~/.soma/workspaces/__legacy__/<type>/<type>-1.json+ registers in~/.soma/workspaces/__legacy__/panes.json. Idempotent (re-run skips already-registered instances). Skips leading-underscore types (_test,_regression_test) by default. Preserves old paths for one release cycle as fallback. Per02-workspace-pane-config.md § Migration W2 (lazy)and~/.soma/workspaces/README.md. Smoke-verified end-to-end against a tmp clone of~/.soma/plugins/: 8 panes migrated, registry built with types/paths/timestamps/provenance markers, re-run skipped all 8. -
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
-
soma-workspace-migrate-legacy.sh — lazy migration W2 of plan 02 (s01-680a9c, preload #3) — walks
~/.soma/plugins/<type>/state.jsonand copies each into~/.soma/workspaces/__legacy__/<type>/<type>-1.json+ registers in~/.soma/workspaces/__legacy__/panes.json. Idempotent (re-run skips already-registered instances). Skips leading-underscore types (_test,_regression_test) by default. Preserves old paths for one release cycle as fallback. Per02-workspace-pane-config.md § Migration W2 (lazy)and~/.soma/workspaces/README.md. Smoke-verified end-to-end against a tmp clone of~/.soma/plugins/: 8 panes migrated, registry built with types/paths/timestamps/provenance markers, re-run skipped all 8. -
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
-
soma-workspace-migrate-legacy.sh — lazy migration W2 of plan 02 (s01-680a9c, preload #3) — walks
~/.soma/plugins/<type>/state.jsonand copies each into~/.soma/workspaces/__legacy__/<type>/<type>-1.json+ registers in~/.soma/workspaces/__legacy__/panes.json. Idempotent (re-run skips already-registered instances). Skips leading-underscore types (_test,_regression_test) by default. Preserves old paths for one release cycle as fallback. Per02-workspace-pane-config.md § Migration W2 (lazy)and~/.soma/workspaces/README.md. Smoke-verified end-to-end against a tmp clone of~/.soma/plugins/: 8 panes migrated, registry built with types/paths/timestamps/provenance markers, re-run skipped all 8. -
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