v2026.4.15
Breaking
-
Starter slugs renamed to plain one-word names. The bundled agent/team/flow starters now use short, human-readable names:
Old New browser-agentvisitorcodebase-analystreadercode-review-teamreviewerdebate-teamdebatediscord-assistantdiscordemail-agentmailmemory-assistantmemoryplan-executeplannerproject-monitorwatcherrag-agentlibrariantelegram-assistanttelegramtodo-plannertasksweb-researcherscoutci-pipelinepipelinecontent-pipelinewritersupport-desktriagehelpdeskandscholarare unchanged. No alias layer — update scripts and bookmarks that reference old slugs. -
Removed
deep-researcherfrom the starter catalog. The directory only contained a README;STARTER_ORDERreferenced it butlist_starters()silently skipped it. The broken entry is gone;scholarcovers the same research-team use case.
Added
- Encrypted credential vault -- new
initrunner vaultCLI (init/set/get/list/rm/import/export/rotate/verify/cache/lock/status) backed by Fernet + scrypt at~/.initrunner/vault.enc. Resolver chain checks env vars first, then the vault, so existingapi_key_env/token_env/${VAR}placeholders keep working. Standard-provider keys resolved from the vault are injected intoos.environso SDK clients (OpenAI, Anthropic, Google) find them at construction._PASSPHRASEadded to the subprocess env scrub list so the unlock passphrase cannot leak to child processes. Optional extras:initrunner[vault],initrunner[vault-keyring]. Seedocs/security/vault.md - HMAC-signed audit chain with
verify-chainCLI -- each audit record is HMAC-SHA256-signed over the previous record's hash, turning the SQLite log into a tamper-evident chain. Signing runs insideBEGIN IMMEDIATEso concurrent writers serialise through SQLite's RESERVED lock instead of forking the chain. Verification is full-chain, never auto-creates a key (a copied DB without the key fails cleanly), and treats id gaps from pruning as informational rather than breaks. Seedocs/security/audit-chain.md - Bidirectional Slack adapter (triggers) -- new
SlackAdapterimplementingChannelAdapterviaslack-sdkSocket Mode (outbound WebSocket, no inbound ports). Subscribes toapp_mentionandmessage.im, threads replies off the triggering message by default, and encodes channel+thread inchannel_targetso each Slack thread gets its ownconversation_key. The existing outbound webhook tool is unchanged. Includes schema entry, dispatcher registration, doctor/starter/role-generator integration,initrunner[slack]extra, and 28 new tests. Seedocs/core/triggers.md
Dependencies
- authlib 1.6.9 -> 1.6.11 (security: CSRF in Starlette OAuth client when a
cacheis configured) - python-multipart 0.0.22 -> 0.0.26 (security: CVE-2026-40347)