<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="rss.xsl"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>iota changelog</title>
        <link>https://iota.sh/changelog</link>
        <description>Every tagged release, what changed, and what it breaks.</description>
        <lastBuildDate>Fri, 11 Sep 2026 00:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <item>
            <title><![CDATA[v0.1.0]]></title>
            <link>https://iota.sh/changelog/v0.1.0</link>
            <guid>https://iota.sh/changelog/v0.1.0</guid>
            <pubDate>Fri, 11 Sep 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[The first tagged release of the Rust iota — an agent-first command surface, three config layers, nine flags, no migration layer.]]></description>
            <content:encoded><![CDATA[<p>The first tagged release of iota as a Rust binary. It is an agent CLI: you
configure agents — a model, a prompt, a set of tools — and run them. If you
used the Go build, this is the list of things that changed under you.</p>
<h2 class="anchor anchorTargetStickyNavbar_oQr6" id="what-breaks">What breaks<a href="https://iota.sh/changelog/v0.1.0#what-breaks" class="hash-link" aria-label="Direct link to What breaks" title="Direct link to What breaks" translate="no">​</a></h2>
<ul>
<li class=""><strong>The positional argument is a command, not a name.</strong> <code>run</code>, <code>list</code>,
<code>resume</code>, <code>config</code> and <code>version</code> are the whole set, and a bare <code>iota</code> means
<code>iota run</code>. <code>iota &lt;name&gt;</code> used to be looked up in four namespaces — agents,
models, providers, then the built-in provider types — so one word could mean
four things. Now <code>iota run &lt;agent&gt;</code> resolves <code>agents:</code> alone, and a model or
a provider is reached through an agent. <code>--help</code> is the complete map, and a
command added later can never shadow an agent you named.</li>
<li class=""><strong>Six flags are gone.</strong> <code>-k/--key</code>, <code>-u/--url</code>, <code>-t/--temperature</code>,
<code>-S/--system-input</code>, <code>--context-window</code> and the boolean <code>--agent</code> are
refused by the parser. A flag stays on the command line only if it describes
THIS call: the key comes from an environment variable or
<code>providers.&lt;name&gt;.key</code>, the URL from <code>providers.&lt;name&gt;.url</code>, the temperature
and the window from <code>models:</code> or <code>agents:</code>, the prompt from
<code>agents.&lt;name&gt;.system</code>, and agent mode from <code>agents.&lt;name&gt;.workspace</code>. Nine
flags remain, and only <code>-c/--config</code> is global.</li>
<li class=""><strong><code>--resume</code> and <code>-l</code> became commands.</strong> <code>iota resume [&lt;id&gt;]</code> takes any
unique id prefix and opens a picker with no id;
<code>iota list [agents|models|providers|sessions]</code> reads the config and the
session store — no key, no network.</li>
<li class=""><strong>The config has three layers, and they are enforced.</strong> <code>providers:</code> says how
to reach an API, <code>models:</code> which model and what its protocol looks like,
<code>agents:</code> how it is driven. Every key is audited against the layer it was
written in before the document is decoded: a key of another layer, a retired
key, an unknown key, an unknown top-level key and an unknown toolset are all
errors naming the coordinate and the file. There is no migration layer — a
one-layer <code>providers.&lt;name&gt;</code> block carrying <code>model:</code>, <code>system:</code>, <code>tools:</code> or
<code>agent:</code> is refused, not split.</li>
<li class=""><strong>The <code>delegate</code> toolset is retired.</strong> A child agent is now
<code>iota run &lt;agent&gt; -m "&lt;task&gt;"</code> run from <code>bash</code> — a full run of that <code>agents:</code>
entry, with its own model, tools and session.</li>
<li class=""><strong><code>defer_mode</code> moved to <code>models:</code>.</strong> The provider — and so the dialect — is
already fixed there, so a mode the provider cannot speak is refused when the
config loads instead of silently degrading to <code>normal</code>.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_oQr6" id="what-is-new">What is new<a href="https://iota.sh/changelog/v0.1.0#what-is-new" class="hash-link" aria-label="Direct link to What is new" title="Direct link to What is new" translate="no">​</a></h2>
<ul>
<li class=""><strong><code>iota config</code>.</strong> <code>init</code> writes a commented starter config (refusing to
overwrite one), <code>path</code> prints the files a run reads, and <code>check</code> loads them
and reports the three layers, warning when no <code>agents.default</code> exists. The
zero-config start was given up on purpose; <code>init</code> is where it went.</li>
<li class=""><strong>Headless resume replays the session.</strong> <code>iota resume &lt;id&gt; -m "…"</code> takes the
model (when the session was recorded under the same provider type),
temperature, reasoning effort, context window and image settings from the
bundle; an explicit <code>-M</code> still wins. The banner goes to stderr, so stdout
stays the reply — or the JSON report — alone, and the new turn is appended
only when it succeeds.</li>
<li class=""><strong>Dedicated image providers.</strong> <code>type: imagen</code> and <code>type: images</code> carry models
that only generate pictures, with <code>/edit</code>, <code>/redo</code>, reference images through
<code>/file</code>, and per-dialect knobs on <code>/model</code>.</li>
<li class=""><strong>Background bash jobs.</strong> <code>"background": true</code> returns a job id at once and
the result arrives later as a notice the model is handed. Up to 16 at a time,
and they are killed when iota exits — a resumed session never inherits one.</li>
<li class=""><strong><code>iota version</code>.</strong> The Go build had no way to say its version; <code>iota version</code>
and <code>--version</code> both print it.</li>
<li class=""><strong>Windows.</strong> <code>x86_64-pc-windows-msvc</code> is a release target, installed by one
PowerShell line. There is no embedded interpreter: the <code>shell</code> tool drives
Git Bash, PowerShell or <code>cmd.exe</code> — whichever the machine has — and says
which one in its own description. There is no OS sandbox on Windows, so
every command asks, and the binaries are not code-signed; see
<a class="" href="https://iota.sh/docs/install">installation</a>.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_oQr6" id="fixes-worth-naming">Fixes worth naming<a href="https://iota.sh/changelog/v0.1.0#fixes-worth-naming" class="hash-link" aria-label="Direct link to Fixes worth naming" title="Direct link to Fixes worth naming" translate="no">​</a></h2>
<ul>
<li class=""><code>--mcp ""</code> and <code>-m ""</code> are errors with a message instead of a panic or a
silent fall-through into the TUI.</li>
<li class="">A stream chunk whose <code>error</code> field is literally <code>null</code> is treated as absent,
not as an in-band error.</li>
<li class="">Sparse tool-call indices in a chat-completions stream no longer drop the
calls after the gap.</li>
<li class="">Ctrl+C closes the MCP servers and exits 130; a <code>--output-format json</code> run
prints its report with <code>"error": "interrupted"</code>.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_oQr6" id="upgrading">Upgrading<a href="https://iota.sh/changelog/v0.1.0#upgrading" class="hash-link" aria-label="Direct link to Upgrading" title="Direct link to Upgrading" translate="no">​</a></h2>
<p>Start from <code>iota config init</code> and move what you had into the three layers: the
endpoint into <code>providers:</code>, the model into <code>models:</code>, the prompt and tools into
<code>agents:</code>. <code>iota config check</code> names anything still in the wrong place, with
the file and the coordinate — see <a class="" href="https://iota.sh/docs/config-file">the config file</a>.</p>]]></content:encoded>
            <category>breaking</category>
            <category>feature</category>
            <category>fix</category>
        </item>
    </channel>
</rss>