Files
ironclaw/docs/changelog.mdx
Henry Park 9bf094fb4d fix(sandbox): consume the material mode on every platform (unblocks Windows CI) + v1.4.0 changelog (#7923)
* fix(sandbox): consume the material mode on every platform

`main` has been red on `Clippy Windows (default)` and
`Clippy Windows (all-features)` since f88ef87ce:

    error: unused variable: `mode`
      --> crates\lanes\ironclaw_sandbox\src\sandbox_process\managed_egress.rs:1889:5
      = note: `-D unused-variables` implied by `-D warnings`

`write_atomic_material_file_with_mode` took a `mode: u32` that only a
`#[cfg(unix)]` block at the call site consumed, so on Windows the parameter
was genuinely unused. This blocks cutting any release candidate: the weekly
strategy requires cutting from a commit whose required checks are green, and
no recent `main` commit qualifies.

Rather than suppress the lint, remove the reason for it. The permission apply
moves into `apply_material_mode`, with a `#[cfg(unix)]` implementation that
sets the bits and a non-unix one that is a deliberate no-op -- but still takes
`mode`. Consuming the parameter on every platform keeps a single signature,
needs no `allow`, and puts the platform difference behind a named function
instead of an inline `cfg` block.

Tested rather than exempted. The regression gate offers a `skip-regression-check`
path, but both of its forms require asserting "deterministic reproduction is
impossible", which is false here -- the Windows clippy lanes reproduce this
deterministically on every run -- so claiming it would have put an untrue
statement in the PR to buy a green tick.

`apply_material_mode_restricts_the_file_to_its_owner` asserts the mode
actually lands, not merely that the call returns Ok: these files carry proxy
credentials, so a writer that silently stopped restricting them would be a
leak rather than a style regression. The non-unix twin pins that the no-op
still accepts `mode`, which is the property that keeps the lint away.

Verified by simulating the Windows configuration on macOS (swapping which
`apply_material_mode` compiles): the crate builds clean under `-D warnings`
with no suppression anywhere. A native unix build cannot exercise this,
which is why the simulation is the local evidence and the Windows CI lanes
are the real gate.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* docs(changelog): add the v1.4.0 release entry

Covers the 81 commits since ironclaw-v1.3.0 (30 fix, 23 feat, 9 refactor,
2 perf): the durable notification inbox and actionable run gates, background
subagents with per-child delivery and healing sweeps, persistent per-user
sandbox containers behind a managed egress proxy, run-now for automations,
suggestions generated over the user's own read-only tools, Google Docs
semantic editing, and the stall/diagnostic fixes across the LLM, capability
and resource-governor paths.

The operator paragraph carries the three things a deployment actually has to
know about this release: the in-worker SSH listener is off unless
IRONCLAW_REBORN_SSH_PUBLIC_KEY is set (public-key-only as `agent` on port
2222, which must be published, and `agent` shares uid 1000 with the runtime
user so the private key is equivalent to shell access);
IRONCLAW_REBORN_WORKSPACE_ROOT is honored on both boot paths and neither it
nor IRONCLAW_REBORN_HOME may be the filesystem root; and the two new sandbox
knobs.

Upgrade note says no migration steps: installation state written by 1.2.x is
accepted and preserved, so a deployment that skipped 1.3 can come straight
here.

This lands on the release branch rather than main because the branch was cut
first. It MUST be cherry-picked back to main: the release branch freezes and
is never merged back, so an entry that lives only here disappears from the
next candidate and the live changelog silently drops this release — exactly
what happened to v1.3.0, which #7913 had to repair
(docs/internal/weekly-release-strategy.md, Candidate rules step 3).

Verified: ensure_stable_changelog_entry(".", "1.4.0") passes (it refused
before this commit), docs_publication_boundary.py and check-guidance.py OK.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-27 03:23:02 +00:00

180 lines
9.2 KiB
Plaintext

---
title: "Changelog"
description: "What shipped in each stable IronClaw release"
icon: clock-rotate-left
---
Each entry covers one stable release of the `ironclaw` binary; release
candidates are not listed. For full commit-level notes, see the
[GitHub releases page](https://github.com/nearai/ironclaw/releases). This site
always documents the **latest stable release** — docs for earlier releases
live in their git tags, such as
[`ironclaw-v1.0.0`](https://github.com/nearai/ironclaw/tree/ironclaw-v1.0.0/docs).
<Update label="2026-08-26" description="v1.4.0">
**Notifications, background subagents, and a sandbox that holds still.**
- **A durable notification inbox** — runs publish authoritative outcomes and
actionable gates to a per-user inbox instead of vanishing into a transcript,
and the WebUI notification center reads from it. Approvals and auth prompts
you missed are still there when you come back.
- **Background subagents** — a parent turn can spawn children that run and
deliver on their own, with per-child delivery, activation provenance, and a
derived cap on autonomous wakes. Healing sweeps recover children whose parent
went away.
- **Persistent per-user sandbox containers** on the local-Docker profile —
a user sandbox is a durable container reached over Docker Exec rather than a
fresh process per call, so container-local installs and state survive between
commands. The Railway preview profile still runs an ephemeral worker per
command and keeps only its checkpointed workspace. On both, sandbox egress is
routed through a managed per-user proxy, and extensions can declare
direct-exec credential bindings that stay behind it, so secrets are never
handed to sandboxed code.
- **Run-now for automations**, plus exact run capability facts, so a scheduled
automation can be exercised and inspected without waiting for its schedule.
- **Suggestions you can act on** — generated over your own no-approval,
read-only tools, gated on extensions you have actually connected, and
surfaced in onboarding with refresh and connect entries.
- **Google Docs semantic editing**, and conversation artifacts now carry run
timing evidence.
- **Fewer stalls and fewer surprises** — structured finalization is bounded,
OpenAI-compatible reasoning-only responses survive, provider failures and auth
diagnostics reach the model as readable context instead of opaque errors, and
libSQL write-lane starvation no longer cascades through the resource governor
as unrelated tool failures.
- **Telegram** separates workspace-bot pairing from personal device linking, and
**Slack** delivers the unlinked-user connect nudge privately with a one-click
link.
**Upgrading from 1.3.0:** no migration steps. Installation state written by 1.2.x
is accepted and preserved, so a deployment that skipped 1.3 upgrades directly.
**Operators:** the runtime image can now start an in-worker SSH listener, and it
is **off unless you set it**. Setting `IRONCLAW_REBORN_SSH_PUBLIC_KEY` to an
OpenSSH *public* key enables public-key-only login as user `agent` on container
port 2222, which must be published to be reachable. Note that `agent` shares
uid 1000 with the `ironclaw` runtime user, so an SSH session holds the full
runtime identity — treat the private key like shell access to the service.
`IRONCLAW_REBORN_WORKSPACE_ROOT` is honored on both CLI boot paths; neither it
nor `IRONCLAW_REBORN_HOME` may be set to the filesystem root. New sandbox knobs:
`IRONCLAW_REBORN_SANDBOX_PROXY_IMAGE` and
`IRONCLAW_SANDBOX_EXTRA_ALLOWED_DOMAINS`.
</Update>
<Update label="2026-08-19" description="v1.3.0">
**Your model, your automations, fewer writes.**
- **Per-user model preferences** — pick your model in Settings, the CLI, or a
chat command, and it follows you across chat and channels. Admins bound the
selectable set with a tenant-scoped model policy.
- **Automations you can trust to stay quiet** — scheduled runs carry a
validated execution contract instead of a free-form prompt, and a run with
nothing to report finishes silently rather than delivering filler.
- **Document editing** — structural edits to `.docx`, `.xlsx`, and `.pptx`,
plus PDF rendering from HTML.
- **Telegram linked devices** — pair your personal Telegram account with the
bot so the agent can read your conversations and act as you. Reads are live
and IronClaw keeps no mirror of your Telegram history; what the agent reads
in a run is retained in that conversation's transcript, like any other tool
result.
- **The complete Slack messaging vocabulary** — edit and delete messages,
add and remove reactions, open DMs, read a message, resolve a user, list
members.
- **Memory that actually recalls** — retrieval ranks by relevance instead of
demanding every word of your question appear in the saved fact, and broken
memory no longer looks like empty memory.
- **Faster, quieter runs** — opt-in parallel tool batches, Anthropic prompt
cache breakpoints, and a large reduction in per-turn database writes.
- Context-window eviction now compacts instead of dropping your task, an
unavailable tool call is repaired instead of ending the run, and secrets
bound for the model are redacted without rejecting the turn.
- Under sustained write load on libSQL, database contention no longer surfaces
as unrelated tool calls failing with a resource error.
**Upgrading from 1.2.0:** no migration steps — installation state written by
1.2.x is accepted and preserved (1.3.0-rc.1 crash-looped on it; fixed in
rc.2). **Slack re-consent:** the new Slack operations need
`reactions:read`, `reactions:write`, and `im:write`. There is no scope-upgrade
flow, so an account connected before this release answers those three tools
with a permission denial until you disconnect and reconnect Slack; the other
13 operations are unaffected. **Removed:** the standalone missions, routines,
and admin analytics placeholder pages in the WebUI, and the retired IronLoop
network settings.
</Update>
<Update label="2026-08-13" description="v1.2.0">
**Shared channels that just work.**
- **Presence-based admission** — add the bot to a Slack channel or Telegram
group and it is served, with nothing to configure: the
`slack_allowed_channels` / `telegram_allowed_channels` allowlists and the
shared-subject settings are gone.
- **Genuinely shared conversations** — a Slack thread or Telegram group/topic
is one continuous conversation every paired participant shares, and each
message still runs as the person who sent it: their identity, memory,
settings, and approval gates.
- **Slack channel context** — pinging the bot at the top level of a channel
gives the run recent channel history; pinging inside a thread gives it that
thread. Context is fetched host-side and framed as untrusted quoted
content, never as instructions.
- Unpaired users who ping the bot in a shared conversation get a connect
notice as a reply on their own message instead of silence.
- Every parked approval or auth gate is announced individually, in the live
conversation and the background automation lane alike.
- The runtime container image now ships `curl`, so orchestrator HTTP
healthchecks pass; Windows first-start filesystem publication and release
smoke runs are fixed.
**Upgrading from 1.1.0:** the shared-channel allowlist and subject settings
(`slack_allowed_channels`, `telegram_allowed_channels`,
`slack_shared_subject_user_id`, `slack_subject_routes`) are removed —
admission is presence-based. Previously stored shared-channel notification
preferences fail closed; DM delivery targets are unchanged. A gate prompt
delivered but not yet acknowledged when this version deploys re-announces
once.
</Update>
<Update label="2026-08-06" description="v1.1.0">
**Extension reach and legible failures.**
- **Custom MCP servers** — register a hosted MCP server from the WebUI and use
its tools like any other extension, with bounded tool discovery and auth
resolved during registration.
- **IronHub install flow** — install extensions from an IronHub deep link,
including private packages.
- **Durable file attachments** that cross channels.
- **Slack `/ironclaw` slash commands.**
- A broad pass on making failures legible: the model is told what to do next
instead of hitting an opaque stop, and users get localized, actionable
errors instead of silent dead ends.
**Upgrading from 1.0.0:** no migration steps. Extension lifecycle state moved
to a normalized on-disk shape; rows written by 1.0.0 keep deserializing.
**Removed:** the `/webhooks/slack/events` compatibility alias.
[Full release notes](https://github.com/nearai/ironclaw/releases/tag/ironclaw-v1.1.0)
</Update>
<Update label="2026-07-27" description="v1.0.0">
**First stable release of the rearchitected IronClaw** — a ground-up rebuild
of the agent runtime, storage, extension host, and web UI, shipping as the
`ironclaw` binary on seven platform targets.
**Not an in-place upgrade from 0.29.x:** there is no migration for v1 config,
databases, settings, or secrets. Treat it as a fresh install — point
`IRONCLAW_REBORN_HOME` at a new directory, run `ironclaw onboard`, and
reconnect your providers and channels.
[Full release notes](https://github.com/nearai/ironclaw/releases/tag/ironclaw-v1.0.0)
</Update>