release v1.5.11

- bump version to 1.5.11 in Cargo.toml and Cargo.lock - update doc-comment example version in src/tools.rs - add complete CHANGELOG.md entry for 1.5.11 Co-Authored-By: siGit Code <noreply@sigit.si>

Seto Elkahfi committed Sep 29, 2026 at 20:42 UTC 7afb5acd1e68445ef97921e74eca58ddf9b42634
4 files changed +75 -9
CHANGELOG.md
+72 -6
@@ -2,8 +2,21 @@
2
3 ## Unreleased
4
5 +## 1.5.11
6 +
7 ### Added
8
9 +- **`sigit run` drives the agent headlessly with resumable sessions.** A new
10 + non-interactive subcommand runs a prompt through the same agent loop as the
11 + editor and terminal surfaces, for scripts, CI, and Factory clients. Every run
12 + gets a UUID session id, writes a JSON-lines history file under
13 + `~/.config/sigit/sessions/`, and can be restored with `--resume <id>`.
14 + `--output jsonl` emits a structured session/delta/tool/result stream on
15 + stdout while logs stay on stderr, and `--allow-tool` pre-approves a tool so
16 + permission prompts collapse to denial in a non-interactive context. The
17 + legacy `-p` form still works. Each run also rewrites the session metadata
18 + with its own cwd and extra roots, so resuming keeps multi-root projects
19 +
20 - **Saved threads can be imported into the editor.** siGit Code now advertises
21 ACP's `sessionCapabilities.list` and answers `session/list`, so Zed's "Import
22 Threads" picker offers the conversations stored under
@@ -23,21 +36,74 @@
36 of the bare name, where the surface is `acp` (an editor), `tui` (the
37 terminal UI), or `headless` (`sigit run`). The model changes from session to
38 session; the version and surface tell you which build of the agent wrote the
26 - commit and how it was driven. GitHub still
27 - credits the co-author, since it matches on the address. A commit that
28 - already carries a siGit Code trailer from an older version is left alone.
39 + commit and how it was driven. GitHub still credits the co-author, since it
40 + matches on the address. A commit that already carries a siGit Code trailer
41 + from an older version is left alone
42 +
43 +- **The terminal UI's model knows which directory the project is in.** The
44 + editor (ACP) and headless paths put the working directory in the system
45 + prompt, but the terminal UI only added the project's instruction files, so
46 + on `/init` a small on-device model invented a `AGENTS.md` path and failed.
47 + All three places the terminal UI builds a prompt now go through the same
48 + session context path the ACP sessions get. The cloud tier switch had also
49 + been dropping the instruction files; that's fixed too
50 +
51 +- **An empty `write_todos` list clears the plan.** `write_todos` rejected an
52 + empty list, so the model had no way to clear a finished checklist and the
53 + last plan stayed in the editor until the session ended. An empty list now
54 + returns "Task list cleared." and goes to the client as an ACP plan with no
55 + entries. The tool description tells the model it can do this
56 +
57 +- **`sigit run` gives clearer usage errors.** A second positional prompt says
58 + "unexpected extra argument", a bare `sigit run` says "missing prompt", and a
59 + mistyped flag like `--quite` is rejected instead of becoming the prompt
60
61 ### Fixed
62
63 +- **Each ACP session keeps its own roots, conversation, and tasks.** Zed runs
64 + one siGit process for every open thread, but the process had a single cwd,
65 + workspace root list, backend conversation, and background task table. The
66 + most recent session owned all of them, so a prompt from an older thread ran
67 + against another repo with another thread's history. A `SessionState` is now
68 + kept per session id; before a prompt or config change runs, the live
69 + conversation is parked and the requested session's cwd, extra roots, and
70 + conversation are installed, rebuilding the system prompt from its roots.
71 + `new`/`load`/`fork` share a single session-opening path, and fork carries the
72 + source thread's conversation. Background tasks are scoped to the session that
73 + started them, opening a session no longer wipes every other session's
74 + permission grants, and model selection is routed per session
75 +
76 +- **New sessions no longer carry the previous thread's history.** Opening a
77 + new thread in Zed showed a `[Conversation summary]` from an earlier session.
78 + The session handlers cleared the on-device engine but not the history a cloud
79 + backend keeps for itself, and the startup routing to the cloud tier then
80 + carried that history into the installed backend. A provider override had the
81 + same leak. All session entry points now share a path that strips stale
82 + history too, and unknown session ids are rejected instead of borrowing the
83 + live thread's state
84 +
85 +- **Unparseable tool-call markup is hidden and retried, not shown as text.**
86 + Some models write tool calls into the reply as text. Well-formed blocks were
87 + already recovered and run, but a block that failed to parse or never closed
88 + was printed to the editor as-is and stayed in history, so the model later
89 + read back a call it had "made" with no result and began writing invented
90 + `<function_results>`. The scanner now reports those blocks as malformed; the
91 + backend drops them from the reply and history, and when the only tool call
92 + was malformed the model gets one retry telling it the call didn't run. A
93 + block that merely *mentions* a tool-call marker (a backticked `<tool_call>` or an
94 + unclosed XTML `<|open|>tools`) is now kept as prose, so a reply explaining
95 + the scanner no longer loses everything after the first marker. The
96 + non-streamed path now strips broken blocks beside structured calls and runs
97 + any inline calls that did parse, matching the streaming path
98 +
99 - **The co-author trailer ends a conflicted merge commit.** Finishing a
100 conflicted merge with `git commit --no-edit` keeps git's `# Conflicts:` list
101 in the message, since no editor runs to strip it. When siGit Code then added
102 its trailer, the trailer went in above that list, so it was no longer the last
103 paragraph and GitHub didn't credit the co-author. The amend now drops the
104 leftover comment block and puts the trailer last. It also fixes a commit
38 - that already has the trailer but still ends in that block.
39 -
40 -
105 + that already has the trailer but still ends in that block
106 +
107 ## 1.5.10
108
109 ### What changed
Cargo.lock
+1 -1
@@ -5778,7 +5778,7 @@ checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba"
5778
5779 [[package]]
5780 name = "sigit"
5781 -version = "1.5.10"
5781 +version = "1.5.11"
5782 dependencies = [
5783 "agent-client-protocol",
5784 "anyhow",
Cargo.toml
+1 -1
@@ -1,6 +1,6 @@
1 [package]
2 name = "sigit"
3 -version = "1.5.10"
3 +version = "1.5.11"
4 edition = "2024"
5 description = "siGit Code — ACP-compatible AI coding agent. Sí, git."
6 documentation = "https://github.com/getsigit/sigit"
src/tools.rs
+1 -1
@@ -2016,7 +2016,7 @@ fn kill_shell_tree(child: &mut std::process::Child) {
2016 /// is the safety net when it forgets.
2017 ///
2018 /// The version carries a suffix naming the surface the process serves
2019 -/// (`v1.5.10-acp`, `v1.5.10-tui`), set once at startup by [`set_surface`], so
2019 +/// (`v1.5.11-acp`, `v1.5.11-tui`), set once at startup by [`set_surface`], so
2020 /// a commit also says whether it came from the editor or the terminal.
2021 pub fn commit_co_author_trailer() -> String {
2022 co_author_trailer_for(SURFACE.get().copied())