-
Notifications
You must be signed in to change notification settings - Fork 1
Releases: getstackit/stackit
v0.19.2
02e7137 This release is a broad performance pass — batching git and GitHub
operations to eliminate N+1 calls across nearly every command — together
with a sync --dry-run correctness fix and cleaner sync output.
Highlights
sync --dry-runis now a true read-only preview. Previously it could perform side effects; it now never fast-forwards trunk, deletes branches, restacks, or pushes to GitHub — it just shows you whatsyncwould do (#1236).- Faster commands across the board. Git and GitHub operations are now batched throughout
submit,sync,merge,delete,create,reorder,fold,absorb,log, and the dashboard, removing per-branch N+1 calls. The global revision cache was replaced with explicit batched readers, so large stacks feel noticeably snappier. - Cleaner sync output. The streaming and interactive sync output was decluttered and polished, and empty phase headers are now suppressed in the interactive sync TUI (#1237, #1238, #1268).
- Accurate file and commit counts.
infoandstack-infonow count changed files against the stack's divergence point rather than whole history, and commit lists are based on the divergence point too — so counts reflect the branch's actual changes (#1260, #1261, #1265).
Fixes
- Make
sync --dry-runa true read-only preview (#1236). - Base commit lists on the divergence point, not whole history (#1265).
- Count changed files in
infoagainst the divergence point (#1261). - Count changed files in
stack-infoagainst the divergence point (#1260). - Don't report a worktree as removed when anchor branch deletion fails (#1248).
- Escape Slack mrkdwn special characters in
shareoutput (#1246). - Declutter and polish sync streaming output (#1237).
- Suppress empty phase headers in the interactive sync TUI (#1238).
- Polish sync output quality (#1268).
Performance
- Batch behind-branch pulls and prefetch remote branch statuses in a parallel block on sync (#1206, #1207).
- Batch orphaned-metadata cleanup into one transaction on sync (#1230).
- Batch PR-info writes, warm caches, and batch revision resolution in submit planning (#1228, #1256).
- Read external-parent remote status in one batch on submit (#1229).
- Batch PR-info writes during consolidation merge, sync, and submit validation (#1205, #1216).
- Batch child reparenting on insert in
create(#1226) and pre-reparent of children indelete(#1227). - Resolve PR node IDs in one GraphQL query and batch PR state/body fetch in consolidation cleanup (#1231, #1233).
- Batch ref deletions in
DeleteBranchto matchDeleteBranches(#1239). - Batch child metadata writes in
RenameBranch(#1220). - Batch commit-to-branch lookups in
absorb(#1221). - Reparent same-parent children in one pass for
foldandpluck(#1222). - Reparent via batched
ReparentBranchesToParentsinreorderandflatten(#1225). - Warm revision and stat caches before per-branch loops (#1223).
- Batch PR status and warm caches for the stack in
stack-info(#1224). - Batch commit messages in the dashboard shippable rebuild (#1262).
- Annotate the
logaction from batchedBranchStats(#1257). - Read stack metadata in a single cat-file lookup (#1232).
Refactors
- Remove the global revision cache in favor of explicit batched readers (#1258).
- Add per-concern batch readers for branch state (#1252).
- Bound
batchByBranchfan-out and add a concurrency rule (#1264). - Plan
flattenfrom batched revision/divergence values (#1253). - Annotate
logfrom batched stats, keeping forge status a separate concern (#1254, #1259). - Trim the batch cleanup APIs (#1234).
- Consolidate split-hunk cleanup with a deferred branch restore (#1247).
- Extract helpers to cut duplication —
applyPRMetadata,buildBatchPRNodeQuery,Plan.BranchNames(), andsplitNulTerminated(#1204, #1243, #1255, #1273). - Remove redundant
GetBranchcalls inInfoAction(#1272). - Tidy review nits in the branch-state readers (#1263).
Chore
- Update all Go and frontend dependencies to latest versions (#1240).
- Add the
/optimize-testsdev skill for coverage-guarded test speedups, hardened with parallel-hazard detection and a union coverage guard (#1208, #1213). - Parallelize the action test suite for faster runs (#1209, #1210, #1211, #1212).
- Add a golden-output transcript harness for sync (#1217, #1218).
What's Changed
- refactor: extract applyPRMetadata helper to remove duplication by @jonnii in #1204
- perf: batch PR info writes during consolidation merge by @jonnii in #1205
- feat: add /optimize-tests skill for coverage-guarded test speedups by @jonnii in #1208
- perf(test): parallelize action-package tests and harden /optimize-tests skill by @jonnii in #1214
- perf(test): parallelize fold/move/pluck action subtests by @jonnii in #1209
- perf(test): parallelize sync action subtests by @jonnii in #1210
- perf(test): parallelize 10 action subpackages' scenario tests by @jonnii in #1211
- perf(test): parallelize root actions package tests (excluding stdin-mutating modify) by @jonnii in #1212
- feat(skill): harden /optimize-tests with parallel-hazard detection and union coverage guard by @jonnii in #1213
- Merging 2 PRs by @jonnii in #1215
- perf(sync): batch behind-branch pulls by @jonnii in #1206
- perf(sync): prefetch remote branch statuses in Phase 1 parallel block by @jonnii in #1207
- perf: batch PR info writes during sync and submit validation by @jonnii in #1216
- Merging 2 PRs by @jonnii in #1219
- refactor: extract reusable golden helper and sync prompt-description helpers by @jonnii in #1217
- test: add golden-output transcript harness for sync by @jonnii in #1218
- perf(create): batch child reparenting on insert via ReparentBranchesRecompute by @jonnii in #1226
- perf(submit): read external parent remote status in one batch by @jonnii in #1229
- perf(delete): batch pre-reparent of children via ReparentBranchesToParents by @jonnii in #1227
- Merging 12 PRs by @jonnii in #1235
- perf(engine): batch child metadata writes in RenameBranch by @jonnii in #1220
- perf(absorb): batch commit-to-branch lookups via FindBranchesForCommits by @jonnii in #1221
- perf(fold,pluck): reparent same-parent children via ReparentBranches by @jonnii in #1222
- perf: warm revision/stat caches before per-branch loops by @jonnii in #1223
- perf(stack-info): batch PR status and warm caches for the stack by @jonnii in #1224
- perf(reorder,flatten): reparent via per-branch ReparentBranchesToParents by @jonnii in #1225
- perf(submit): batch PR-info writes and warm caches during planning by @jonnii in #1228
- perf(sync): batch orphaned-metadata cleanup in one transaction by @jonnii in #1230
- perf(merge): resolve PR node IDs in one GraphQL query by @jonnii in #1231
- perf(git): read stack metadata in one cat-file lookup by @jonnii in #1232
- perf(merge): batch PR state/body fetch in consolidation cleanup by @jonnii in #1233
- refactor: trim batch cleanup APIs by @jonnii in #1234
- perf: batch ref deletions in DeleteBranch to match DeleteBranches by @jonnii in #1239
- chore: update all dependencies to latest versions by @jonnii in #1240
- refactor: add Plan.BranchNames() to eliminate repeated branch-name extraction loops by @jonnii in #1243
- feat: Postgres-backed repo store for the API server by @jonnii in #1244
- feat: add PostgreSQL repo-config store for the API server by @jonnii in #1067
- feat: serve API server repos from the Postgres store by @jonnii in #1068
- fix: escape Slack mrkdwn special chars in share output by @jonnii in #1246
- refactor: consolidate split hunk cleanup with deferred branch restore by @jonnii in #1247
- fix: don't report worktree as removed when anchor branch deletion fails by @jonnii in #1248
- refactor: extract buildBatchPRNodeQuery to eliminate duplicated GraphQL boilerplate by @jonnii in #1255
- test(store): use testcontainers locally instead of a fixed local Postgres by @jonnii in #1266
- Merging 13 PRs by @jonnii in #1267
- refactor(engine): per-concern batch readers for branch state by @jonnii in #1252
- refactor(flatten): plan from batched re...
Assets 15
- sha256:f919accd83f907bfdc38c4304252b5b9d77d04d9f230b4d4689bba89e079151f1.14 KB
2026年06月21日T21:55:09Z - sha256:cbce7491e7e635fe792907f9ef1b6cd94b8eee4d1190dee43351d61f6f43fa0811.2 MB
2026年06月21日T21:55:08Z - sha256:eb6ba7717de60bb3cbf3e588f744c6054458a987dbcd6c94e27507ea83ac1c5211.6 MB
2026年06月21日T21:55:08Z - sha256:cde3c2102bb264206e17f1d657bb9bfd589cde1b4e1c6a4d1aee806e4df633bd10.7 MB
2026年06月21日T21:55:07Z - sha256:552bc5db60def4b9c57e190cef14c2136c3c26b13084cc8cc6eb41cc0c3ea2f811.4 MB
2026年06月21日T21:55:07Z - sha256:73279d0d3ea2ddbd8dc9698fb5e85544897438935778bbbc26a79fb3bc66dd6110.8 MB
2026年06月21日T21:55:08Z - sha256:7b59fb3ffc2c625caea8865e2abba6114ad368092598f384550a523a59d24d5911.7 MB
2026年06月21日T21:55:08Z - sha256:37bf88c2859a2748b59610728209bf765aa5996e1d141e4de4a147d86a9d841f8.19 MB
2026年06月21日T21:55:07Z - sha256:9fec322bcc2c6cc6b190ad246d9bf68666718d50179297cc64c2df81c0aec9618.76 MB
2026年06月21日T21:55:07Z - sha256:a5bf037bc15ad4931e073b3042fad1d3bf53b85a5b981838595b3e020a16cbb27.05 MB
2026年06月21日T21:55:06Z -
2026年06月21日T21:45:26Z -
2026年06月21日T21:45:26Z - Loading
v0.19.1
9242e28 This release makes submit and get dramatically faster by eliminating
N+1 git and GitHub calls, and fixes several restack correctness bugs around
how a PR's base is refreshed after force-pushes.
Highlights
- Much faster
submit. The submit path no longer makes per-branch git and GitHub calls: the entire stack now pushes in a singlegit push, PR info is fetched in one GraphQL query, and remote ref reads, PR-content reads, and empty-branch validation are all batched. Submitting large stacks is substantially faster. - Faster
get. Parents are now derived from already-fetched metadata instead of a serial per-branch GitHub crawl, with O(1) branch lookups in target validation. - Restack base.sha correctness. Fixes for refreshing a PR's stale GitHub
base.shaafter a restack force-push, preserving the divergence point when an old parent was squash-merged, and only refreshing on a genuine non-fast-forward parent rewrite — so stacked PRs show the right diff after restacks. - Skip already-merged branches on restack. Restack no longer tries to rebase branches whose PR has already merged, and the REST PR-info fallback now records merged PRs as
MERGED.
Fixes
- Record merged PRs as
MERGEDin the REST PR-info fallback (#1201). - Only refresh
base.shaon a non-fast-forward parent rewrite (#1200). - Skip restacking branches whose PR is already merged (#1199).
- Refresh stale GitHub
base.shaafter a restack force-push, and preserve the divergence point when the old parent was squash-merged (#1193). - Surface metadata write errors in
RenameBranch(#1122).
Performance
- Batch the empty-branch validation check on submit (#1181).
- Overlap the remote read with PR sync and share a single
ls-remote(#1180). - Batch the remote read in submit planning (#1179).
- Batch PR-content reads in the footer pass (#1178).
- Fetch stack PR info in one GraphQL query (#1177).
- Push the entire stack in a single
git push(#1176). - Batch the remote ref read for stack submit (#1175).
- Derive
getparents from fetched metadata instead of a serial GitHub crawl (#1170). - Use an O(1)
BranchNameslookup inValidateTargetBranch(#1167).
Refactors
- Remove redundant
PrInfoconstructors (#1198). - Use the
Branches.Names()helper instead of manual extraction loops (#1188). - Replace
fmt.Sscanf("%d")withstrconv.Atoi(#1185). - Submit cleanup and feedback, folding
HasSubmitWorkinto the action with lazy TUI start (#1182, #1183). - Extract a
crawlAncestorsViaGitHubhelper inget(#1169). - Use
err.Error()inisCIFailureand avoid an allocation in the split prompt (#1168). - Consolidate cleanup in
splitByFileSiblingwithdefer(#1166). - Complete the
Engine.Git()escape-hatch removal: route read-only queries, conflict recovery, staging, remote-metadata, and remaining domain git operations through the engine, add aMetadataInspectorfor diagnostic reads, and add a lint guard against new escape-hatch use (#1149–1158). - Render colors via the output layer instead of
tui/style(#1163). - Narrow dependencies: branch patterns take a username, the GitHub client takes a 2-method
GitCommandRunner, rerere takes aGitConfigurer, and validation takes an engine-state interface (#1155, #1157, #1161, #1162). - Remove redundant
GetBranchcalls in the debug action loop (#1152).
Docs
- Add a performance guide covering SSH reuse and tracing (#1172).
- Document that
lock/unlocksync GitHub immediately by design (#1173).
Chore
- Update all Go and web dependencies to latest (#1187).
- Add
t.Parallel()to all TUI tests and cover metadata-driven discovery inget(#1171, #1186).
What's Changed
- Eliminate Engine.Git() escape-hatch: route ops through engine interfaces by @jonnii in #1159
- refactor(actions): route read-only git queries through the engine by @jonnii in #1149
- refactor(actions): route conflict recovery and staging through the engine by @jonnii in #1150
- refactor(actions): route remaining query and remote-metadata Git() calls through the engine by @jonnii in #1151
- refactor(engine): add MetadataInspector for diagnostic raw metadata reads by @jonnii in #1153
- refactor: eliminate the last production Engine.Git() escape-hatch uses by @jonnii in #1154
- refactor(validation): take engine state interface instead of the raw git runner by @jonnii in #1155
- refactor: route remaining domain git operations through the engine by @jonnii in #1156
- refactor(rerere): take a narrow GitConfigurer instead of the raw git runner by @jonnii in #1157
- chore(lint): guard against new Engine.Git() escape-hatch use by @jonnii in #1158
- refactor(github): depend on a 2-method GitCommandRunner, not the whole git.Runner by @jonnii in #1161
- refactor(config): branch patterns need a username, not the whole git runner by @jonnii in #1162
- refactor(actions): render colors via the output layer, not tui/style by @jonnii in #1163
- refactor: remove redundant GetBranch calls in debug action loop by @jonnii in #1152
- fix: surface metadata write errors in RenameBranch by @jonnii in #1122
- refactor(split): consolidate cleanup in splitByFileSibling with defer by @jonnii in #1166
- perf: use O(1) BranchNames lookup in ValidateTargetBranch by @jonnii in #1167
- docs(lock): document that lock/unlock sync GitHub immediately by design by @jonnii in #1173
- refactor: use err.Error() in isCIFailure and avoid alloc in split prompt by @jonnii in #1168
- Merging 4 PRs by @jonnii in #1174
- refactor(get): extract crawlAncestorsViaGitHub helper by @jonnii in #1169
- perf(get): derive parents from fetched metadata, not a serial GitHub crawl by @jonnii in #1170
- test(get): cover metadata-driven discovery and GitHub fallback by @jonnii in #1171
- docs: add performance guide (SSH reuse + tracing) by @jonnii in #1172
- Eliminate submit N+1s: batch remote reads, pushes, and GitHub API calls by @jonnii in #1184
- perf(submit): batch remote ref read for stack submit by @jonnii in #1175
- perf(submit): push entire stack in a single git push by @jonnii in #1176
- perf(submit): fetch stack PR info in one GraphQL query by @jonnii in #1177
- perf(submit): batch PR-content reads in the footer pass by @jonnii in #1178
- perf(submit): batch remote read in submit planning by @jonnii in #1179
- perf(submit): overlap remote read with PR sync, share one ls-remote by @jonnii in #1180
- perf(submit): batch the empty-branch validation check by @jonnii in #1181
- refactor(submit): fold HasSubmitWork into Action with lazy TUI start by @jonnii in #1182
- refactor: submit feedback by @jonnii in #1183
- refactor: replace fmt.Sscanf("%d") with strconv.Atoi by @jonnii in #1185
- test: add t.Parallel() to all TUI tests by @jonnii in #1186
- chore: update all Go and web dependencies to latest by @jonnii in #1187
- refactor: use Branches.Names() helper instead of manual loops by @jonnii in #1188
- fix: refresh stale GitHub base.sha after restack force-push by @jonnii in #1193
- fix: skip restacking branches whose PR is already merged by @jonnii in #1199
- refactor: remove redundant PrInfo constructors by @jonnii in #1198
- Merging 2 PRs by @jonnii in #1202
- fix: only refresh base.sha on a non-fast-forward parent rewrite by @jonnii in #1200
- fix: record merged PRs as MERGED in the REST PR-info fallback by @jonnii in #1201
- feat: add /pre-release-check skill for release go/no-go review by @jonnii in #1203
Full Changelog: v0.19.0...v0.19.1
Assets 15
v0.19.0
8dc5200 This release makes stackit self-hostable as a service and far friendlier to
scripts and agents — a deployable server with auth, hardened non-interactive
workflows, new JSON introspection commands, lifecycle hooks, and a large round
of performance work.
Highlights
- Self-hostable stackit-server. The server is now deployable as a hosted service: GitHub OAuth gating with an allowlist, CSRF protection on mutating endpoints, structured audit logs, multi-repo config (
reposRoot+ owner/name coords), a multi-arch container published to ghcr.io, and a new deploy guide (#1015, #1016, #1017, #1055, #1008, #1009). - Scripting- and agent-friendly CLI. Interactivity auto-disables on non-TTY and via
STACKIT_NO_INTERACTIVE,-F/--message-filereads messages from a file or stdin acrosscreate/modify/squash/split,mergeaccepts--yes, and commands now fail loudly instead of silently falling back — no more accidental empty-branch creation (#1072, #1075, #1076, #1074, #1073). - New introspection commands.
stackit state --jsongives a complete one-call snapshot of stack structure for tooling,stackit sharerenders Slack-ready stack output, and--jsonis now a first-class, self-describing source onlogandmerge status(#1083, #1082, #1077, #1107). - Lifecycle command hooks. New pre/post command hooks with per-phase approval let you run custom commands around stackit operations (#1051, #1052).
- Faster across the board. A persistent
git cat-file --batchprocess eliminates per-read process spawns, and git/GitHub calls are batched throughout sync, get, and snapshot paths (#1094, #1114, #1113, #1132, #1112).
Features
- Added
stackit statecommand with a complete--jsonsnapshot (#1083). - Added
stackit sharecommand for Slack-ready stack output (#1082). - Added
--jsonflag tostackit merge status(#1107). - Made
log --jsona complete, self-describing status source (#1077). - Auto-disable interactivity for non-TTY and
STACKIT_NO_INTERACTIVE(#1072). - Made
-Fthe--message-fileshorthand onsplit(#1075). - Accept
--yeson the parentmergecommand for non-interactive use (#1076). - Prompt for stack description on multi-PR ship (#1066).
- Added pre/post command lifecycle hooks with per-phase approval (#1051).
- Added the
stack-shipskill (#1106). - Server: gate API behind GitHub OAuth + allowlist (#1015).
- Server: require
X-Stackit-CSRFon mutating endpoints (#1016). - Server: structured audit logs on mutating calls (#1017).
- Server: multi-repo config with
reposRootand owner/name coords (#1055). - Server: auto-compute CSP
script-srchashes from the embedded static FS (#1060). - Server: log version, commit, and build date on startup (#1056).
- Server: harden HTTP middleware for public deploy (#1011).
- Server: publish a multi-arch container to ghcr.io (#1008).
- Server: fall back to
$PORTenv when-portisn't set (#1007).
Fixes
- Restore the original branch after a pre-commit hook failure in
create(#1148). - Prevent
merge nextfrom leaving the user in a detached HEAD state (#1146). - Fall back to the
mergeablefield whenmergeStateStatusis unavailable on GitHub Enterprise (#1144). - Handle ignored errors from metadata cache writes in PR updates (#1142).
- Replay rerere in the rebase auto-continue error path (#1139).
- Multi-stack dry-run no longer bypasses the
--yesguard in non-interactive mode (#1137). - Normalize hook commands to trimmed form before approval checks (#1136).
- Clear the cat-file process on batch I/O failure (#1135).
- Force-update remote-tracking refs on explicit branch fetch (#1134).
- Use valid merge-tree fast-path syntax (#1133).
- Fail closed for unapproved pre-command hooks (#1131).
- Harden CLI sync and worktree status (#1128).
- Expose
undo.enabledin the config CLI (#1126). - Preserve the merge branch in PR info updates (#1125).
- Avoid duplicate worktree create hooks (#1124).
- Require
--yesfor non-interactive merge (#1123). - Avoid duplicate PR branch lookups (#1115).
- Reject silent empty-branch creation when changes aren't staged (#1074).
describefails loudly in non-interactive mode and accepts-F/--message-file(#1073).- Correct and harden Claude/Codex agent integration templates (#1071).
- Prompt before entering the conflict workflow on
restack(#1069). - Web: default
API_BASEto same-origin, fixing a connect-src CSP violation (#1061). - Web: route picker selection via
?repo=query string (#1006).
Performance
- Persistent
git cat-file --batchprocess for zero-spawn metadata reads (#1094). - Compile branch-name and GraphQL-alias regexes once at package init (#1093).
- Batch merge remote status checks (#1132).
- Refresh
getbranches selectively (#1116). - Batch sync fetches (#1114).
- Batch get fetches (#1113).
- Batch stack ID propagation into a single transaction (#1112).
- Fix untrack N+1 rebuild with
BatchUntrackBranches(#1087). - Batch revision lookups in
TakeSnapshot(#1079). - Use cached
ctx.Configin the trunk command (#1080).
Refactors
- Normalize hook phase config (#1129).
- Introduce
BranchRemoteStatusestype and removeGetBranchRemoteStatus(#1121). - Replace remote SHA cache warming (#1117).
- Eliminate duplicate
CreatePullRequestlogic and fix silent error swallowing (#1064). - Hooks: tighten the resolve API and drop deprecated wrappers (#1053).
- Config: generalize hook approval keys to a per-phase family (#1050).
- Hooks: extract a shared runner from worktree hooks (#1049).
- Server: migrate stdlib
logtoslogwith structured, leveled output (#1059). - Engine: consolidate duplicate ancestor-walk helpers (#1047).
- Engine: split
engine_sync.goandtypes.goby concern (#1046). - Actions: prune redundant
eng.Rebuild()calls and document the rest (#1045). - Engine: push metadata-ref transport down into the engine (#1044).
- Engine: drop redundant lowercase getter wrappers (#1043).
- Engine: unify
SetParentunder explicitDivergenceMode(#1042). - Engine: drop
Options.Writerand best-effort metadata-cleanup warnings (#1041). - Engine: auto-rebuild after delete, auto-sync stack ID after reparent (#1040).
- Engine: split
engine_writer.goby concern (#1039).
Docs
- Use
stackit state --jsonas the one-call preflight in agent skills (#1084). - Annotate
cross-cutting.mdwith implementation status (#1086). - Document lifecycle phases, env vars, and recipes for hooks (#1052).
- Add a deploy guide for the hosted stackit-server (#1009).
Chore
- Update all dependencies to the latest versions (#1127).
- Add a server
env:initmise task to populate.envvia gh + openssl (#1058). - Document required server env vars via
.env.template(#1057). - Test suite cleanup: consolidate, parallelize, and delete duplicate tests (#1141, #1105, #1104, #1103, #1102, #1101, #1100, #1099, #1098, #1097, #1096, #1095, #1081).
What's Changed
- Merging 9 PRs by @jonnii in #1048
- refactor(engine): split engine_writer.go by concern by @jonnii in #1039
- refactor(engine): auto-rebuild after delete, auto-sync stack ID after reparent by @jonnii in #1040
- refactor(engine): drop Options.Writer and best-effort metadata-cleanup warnings by @jonnii in #1041
- refactor(engine): unify SetParent under explicit DivergenceMode by @jonnii in #1042
- refactor(engine): drop redundant lowercase getter wrappers by @jonnii in #1043
- refactor(engine): push metadata-ref transport down into engine by @jonnii in #1044
- refactor(actions): prune redundant eng.Rebuild() calls; document the rest by @jonnii in #1045
- refactor(engine): split engine_sync.go and types.go by concern by @jonnii in #1046
- refactor(engine): consolidate duplicate ancestor-walk helpers by @jonnii in #1047
- Merging 9 PRs by @jonnii in #1054
- fix(web): route picker selection via ?repo= query string by @jonnii in #1006
- feat(server): fall back to $PORT env when -port isn't set by @jonnii in #1007
- feat(server): publish multi-arch container to ghcr.io by @jonnii in #1008
- docs: add deploy guide for hosted stackit-server by @jonnii in #1009
- feat(server): harden HTTP middleware for public deploy by @jonnii in #1011
- feat(server): gate API behind GitHub OAuth + allowlist by @jonnii in #1015
- feat(server): require X-Stackit-CSRF on mutating endpoints by @jonnii in #1016
- feat(server): structured audit logs on mutating calls by @jonnii in #1017
- build: publish dev by @jonnii in #1012
- Merging 7 PRs by @jonnii in #1062
- feat(server): multi-repo config with reposRoot and owner/name coords by @jonnii in #1055
- feat(server): log version, commit, build date on startup by @jonnii in #1056
- chore(server): document required env vars via .env.template by @jonnii in #1057
- chore(server): add env:init mise task to populate .env via gh + openssl by @jonnii in #1058
- refactor(server): migrate stdlib log to slog with structured, leveled output ...
Assets 15
v0.18.1
0d29e89 This release lays groundwork for hosted multi-repo support in the server and web app, and finishes dropping the go-git dependency in favor of shelling out to native git.
Highlights
- Multi-repo server support: a new
-repos-configflag lets the server back multiple repositories, withGET /api/v1/reposreturning the registered set and per-repo SSE broadcasters keeping watchers isolated. The web app gained a repo picker so a single instance can drive multiple stacks. go-gitis gone. All git operations now shell out to the nativegitCLI, which eliminates the long-standing divergence between the two code paths and removes a large transitive dependency tree.ConfigStore, fetch/push, staging, and read-only history ops all usegitdirectly.- Batched metadata writes via
git hash-object --stdin-paths, plusfor-each-ref --mergedfor merged-branch detection, cut process spawns on hot paths. stackit submitnow skips the push when the local branch is already in sync with its remote, avoiding redundant network calls during repeated submits.
Features
- Server
-repos-configflag for serving multiple repos (#978). GET /api/v1/reposlists registered repositories (#979).- Per-repo broadcaster and watcher in the API (#980).
- Web app repo picker and multi-repo client (#981).
- Registry package for multi-repo support in the API (#976).
Fixes
stackit submitskips push when the branch is already in sync with the remote (#1014).- Distinguish detached HEAD from real errors in
GetWorktreeCurrentBranch(#1034). - Log a debug breadcrumb when
getRemotefalls back to the default (#1035).
Performance
- Batch metadata blob writes via
git hash-object --stdin-paths(#1024). - Replace O(n2) bubble sort and manual reversal with
slicesstdlib (#1026).
Refactors
- Drop
go-gitdependency entirely; nativegitCLI is used for all operations (#1019, #1020, #1021, #1022, #1023). - Add metadata blob batch writers and drop unused singletons (#1028).
- Batch
GetMergedBranchesviafor-each-ref --merged(#1027). - Route
repoRootreads throughgetRepoRootand tighten thels-filesexit-code check (#1029). - Surface
os.Getwderror inensureRepo(#1030). - Plumb
context.Contextthrough batch blob writers and read-path git operations (#1036, #1037). - API handlers take a registry; add
/repos/{repoID}/...routes (#977).
Docs
- Add hosted multi-tenant server plan (#975).
- Clarify that
ConfigStore.Getreads merged config scope (#1033). - Drop stale
go-gitreferences from comments (#1031).
Chore
- Baseline benchmarks for the go-git hot paths captured before removal (#1018).
What's Changed
- Merging 7 PRs by @jonnii in #1005
- docs(plans): add hosted multi-tenant server plan by @jonnii in #975
- feat(api): add registry package for multi-repo support by @jonnii in #976
- refactor(api): handlers take registry, add /repos/{repoID}/... routes by @jonnii in #977
- feat(server): -repos-config flag for serving multiple repos by @jonnii in #978
- feat(api): GET /api/v1/repos lists registered repositories by @jonnii in #979
- feat(api): per-repo broadcaster and watcher by @jonnii in #980
- feat(web): repo picker and multi-repo client by @jonnii in #981
- Drop go-git dependency, shell out to native git for all ops by @jonnii in #1025
- test(git): add baseline benchmarks for go-git hot paths by @jonnii in #1018
- refactor(git): replace go-git in read-only history ops with shell-out by @jonnii in #1019
- refactor(git): replace go-git staging ops with native git commands by @jonnii in #1020
- refactor(git): drop go-git fetch/push, use git CLI exclusively by @jonnii in #1021
- refactor(git): rewrite ConfigStore on top of
git configCLI by @jonnii in #1022 - refactor(git): drop go-git dependency entirely by @jonnii in #1023
- perf(git): batch metadata blob writes via git hash-object --stdin-paths by @jonnii in #1024
- Merging 5 PRs by @jonnii in #1032
- refactor(git): batch GetMergedBranches via for-each-ref --merged by @jonnii in #1027
- refactor(git): add metadata blob batch writers, drop unused singletons by @jonnii in #1028
- refactor(git): route repoRoot reads through getRepoRoot, tighten ls-files exit-code check by @jonnii in #1029
- refactor(git): surface os.Getwd error in ensureRepo by @jonnii in #1030
- docs(git): drop stale go-git references from comments by @jonnii in #1031
- perf: replace O(n2) bubble sort and manual reversal with slices stdlib by @jonnii in #1026
- fix(submit): skip push when branch is already in sync with remote by @jonnii in #1014
- Merging 5 PRs by @jonnii in #1038
- docs(git): clarify ConfigStore.Get reads merged config scope by @jonnii in #1033
- fix(git): distinguish detached HEAD from real errors in GetWorktreeCurrentBranch by @jonnii in #1034
- fix(git): log debug breadcrumb when getRemote falls back to default by @jonnii in #1035
- refactor(git,engine): plumb context through batch blob writers by @jonnii in #1036
- refactor(git,engine): plumb context through read-path git operations by @jonnii in #1037
Full Changelog: v0.18.0...v0.18.1
Assets 15
v0.18.0
a2362ea A big release focused on worktree workflows, a broad performance pass across restack/merge/cleanup, and a long tail of correctness fixes around restack, merge, and modify.
Highlights
- New
stackit worktree runcommand lets you run a one-off shell command inside a managed worktree without checking it out manually (#974). - Worktree management is much sturdier: managed worktrees are now anchored so they survive moves and re-checkouts (#949),
worktree repairplus richer status output makes broken worktrees easy to recover (#950), and removal/sync cleanup paths handle failure modes more gracefully (#948, #951). - Naked
stackit modifynow amends in place without bouncing you into an editor, matching what users actually expect from a quick amend (#1002). - Major performance pass across the engine: native-git checkout (#963, #964), cached worktree/metadata snapshots during restack and merge (#984, #987, #988, #993, #994), batched ref deletions (#985, #990, #991), and fast-tree-equality short-circuits during branch cleanup planning (#999) — restack, merge, and sync are all noticeably snappier on large stacks.
- Restack reliability fixes: HEAD is detached before conflict-workflow rebases so the workflow no longer corrupts the original branch (#953), trunk is properly excluded from restack plans (#938), and branches are now classified by validation result rather than spec position so partial failures are reported correctly (#954).
Features
- Add
stackit worktree runcommand for executing commands inside a managed worktree (#974). - Anchor managed worktrees so they remain valid across repository moves (#949).
- Add
worktree repairand richer worktree status output (#950).
Fixes
- Restack: exclude trunk from restack plans (#938).
- Restack: detach HEAD before conflict-workflow rebase so the original branch is preserved (#953).
- Restack: classify branches by validation result rather than spec position so partial failures are reported correctly (#954).
- Move: let interactive users resolve conflicts and continue instead of aborting (#940).
- Merge: surface DeleteBranch failures during ship cleanup so silent leftovers are caught (#970).
- Merge: drop the remote metadata ref when ship deletes a branch (#971).
- Git: handle packed refs in DeleteBranch and DeleteRef (#972).
- Git: honor context cancellation in reset paths (#1003).
- Harden worktree removal against partial-state directories (#948).
- Harden worktree sync cleanup to recover from leftover state (#951).
- Naked
modifyamends in place without prompting for the editor (#1002). - Handle BatchMarkNeedsPRBodyUpdate errors in
scopeanddescribeso failures aren't swallowed (#996). - Respect
STACKIT_NO_LOGGING=0/=falseas logging-on (#998). - Clean up release blockers before shipping a stack (#1003).
Performance
- Speed up checkout resolution and use native git for checkout paths (#963, #964).
- Optimize bounded log rendering and cache interactive log branches/offsets for faster log views (#930, #931, #933).
- Speed up common read-only views across the engine (#982).
- Cache parent revision on BranchState; drop redundant IsUpToDate re-read (#957).
- Cache worktree list during branch cleanup, restack batches, and merge plans (#984, #987, #988).
- Batch all ref deletions in
engine.DeleteBranches, batch local stack metadata ref deletion, and push deleted metadata refs once per cleanup pass (#985, #990, #991). - Snapshot metadata ref SHAs once per restack batch and expose new SHA on RestackBranchResult to skip per-branch GetRevision (#993, #994).
- Short-circuit branch-deletion planning with fast tree-equality plus timing logs (#999).
- Instrument metadata cache hits/misses and batch loads (#956).
Refactors
- Unify editor command launching across CLI surfaces (#929).
- Submit: merge allCreates check into the branchInfos loop (#939).
- Replace private stdlib wrappers with direct stdlib calls (#952).
- Remove unused parameter and dead variable (#965).
- Make branch collections first-class and finish the branch-collection migration (#967, #968).
- Model worktree list as a typed
WorktreeList(#986).
Docs
Chore
- Instrument
executeDeletionswith per-step timing (#997). - Add LoadMode equivalence and concurrency tests for the engine (#961).
- Update Go and frontend dependencies (#941, #942, #943, #946, #947, #966).
What's Changed
- refactor(submit): merge allCreates check into branchInfos loop by @jonnii in #939
- fix(move): let interactive users resolve conflicts and continue by @jonnii in #940
- docs(agent): improve stack-create workflow by @jonnii in #937
- fix(restack): exclude trunk from restack plans by @jonnii in #938
- chore(deps): update Go dependencies by @jonnii in #941
- Merging 2 PRs by @jonnii in #944
- chore(deps): update Go dependencies by @jonnii in #942
- chore(deps): update web dependencies by @jonnii in #943
- chore(deps): update web dependencies by @jonnii in #947
- chore(deps): update Go dependencies by @jonnii in #946
- fix(restack): detach HEAD before conflict-workflow rebase by @jonnii in #953
- fix(restack): classify branches by validation result, not spec position by @jonnii in #954
- Merging 4 PRs by @jonnii in #955
- fix: harden worktree removal by @jonnii in #948
- feat: anchor managed worktrees by @jonnii in #949
- feat: add worktree repair and status output by @jonnii in #950
- fix: harden worktree sync cleanup by @jonnii in #951
- refactor: unify editor command launching by @jonnii in #929
- perf: instrument metadata cache hits/misses and batch-loads by @jonnii in #956
- perf: cache parent revision on BranchState; drop IsUpToDate re-read by @jonnii in #957
- refactor: replace private stdlib wrappers with direct stdlib calls by @jonnii in #952
- test(engine): add LoadMode equivalence and concurrency tests by @jonnii in #961
- Merging 3 PRs by @jonnii in #962
- perf: optimize bounded log rendering by @jonnii in #930
- perf: cache interactive log branches by @jonnii in #931
- perf: cache interactive log line offsets by @jonnii in #933
- perf: use native git for checkout paths by @jonnii in #963
- chore: update Go and frontend dependencies to latest versions by @jonnii in #966
- refactor: remove unused parameter and dead variable by @jonnii in #965
- Merging 3 PRs by @jonnii in #969
- perf: speed up checkout resolution by @jonnii in #964
- refactor: make branch collections first-class by @jonnii in #967
- refactor: finish branch collection migration by @jonnii in #968
- Merging 3 PRs by @jonnii in #973
- fix(merge): surface DeleteBranch failures during ship cleanup by @jonnii in #970
- fix(merge): drop remote metadata ref when ship deletes a branch by @jonnii in #971
- fix(git): handle packed refs in DeleteBranch and DeleteRef by @jonnii in #972
- feat: add worktree run command by @jonnii in #974
- perf: speed up common read-only views by @jonnii in #982
- Merging 5 PRs by @jonnii in #989
- perf: cache worktree list during branch cleanup by @jonnii in #984
- perf: batch all ref deletions in engine.DeleteBranches by @jonnii in #985
- refactor: model worktree list as a typed WorktreeList by @jonnii in #986
- perf: snapshot worktree list once per restack batch by @jonnii in #987
- perf: snapshot worktree list once per merge plan by @jonnii in #988
- Merging 2 PRs by @jonnii in #992
- perf: push deleted metadata refs once per cleanup pass by @jonnii in #990
- perf: batch local stack metadata ref deletion by @jonnii in #991
- docs: refresh perf plans by @jonnii in #983
- Merging 2 PRs by @jonnii in #995
- perf: snapshot metadata ref SHAs once per restack batch by @jonnii in #993
- perf: expose new SHA on RestackBranchResult to skip per-branch GetRevision by @jonnii in https://github.com/getsta...
Assets 15
v0.17.15
123b783 Patch release fixing a data race in the git runner.
Highlights
- Fixed a data race in the git runner where concurrent reads of
runner.repoRootcould race with writes, occasionally causing flaky behavior under parallel command execution.
Fixes
- Guarded
runner.repoRootreads withrepoMuto fix a data race (#934).
Chore
- Bumped goreleaser wait timeout to 1200s in the create-release skill (#932).
What's Changed
- chore(create-release): bump goreleaser wait timeout to 1200s by @jonnii in #932
- fix(git): guard runner.repoRoot reads with repoMu to fix data race by @jonnii in #934
Full Changelog: v0.17.14...v0.17.15
Assets 15
v0.17.14
A maintenance release focused on faster sync, smoother restacks, and better resilience when GitHub-side squash merges leave the stack in unexpected states.
Highlights
- Faster remote operations on large stacks. Metadata pushes, PR base updates, and metadata-ref deletions are now batched and parallelized, cutting overhead from O(N ×ばつ roundtrip) to roughly O(1) for many common workflows (#918, #916).
- Quieter no-op commands.
restack,flatten,submit, andforeachnow skip the TUI entirely when there's nothing to do, so commands that resolve to no work no longer flash a transient progress UI (#919). - Sync handles user-induced inconsistencies. When a user manually deletes a merged parent branch, sync now reparents stranded children onto the correct ancestor instead of leaving an orphaned stack (#921).
- Module renamed to
github.com/getstackit/stackit. The Go import path moved to the canonical org location. CLI users are unaffected; Go importers need to update their imports (#928).
Fixes
- Skip the restack TUI when there's no work to do, and avoid leaking OSC 11 terminal queries on every CLI invocation (#919).
- Respect the caller's context in the
ResetTrunkToRemotefallback fetch path so cancellations propagate correctly (#917). - Point the agents-block link in docs to the repo instead of stackit.dev (#926).
Performance
- Batch and parallelize remote metadata pushes and PR base updates during submit/sync (#918).
- Batch metadata ref deletion in
Resetinstead of issuing one git command per ref (#916).
Refactors
- Extract the shared apply path for
describeto make future describe-adjacent commands easier to add (#923). - Extract
MetadataTxstate-check logic into a helper (#924).
Docs
- Align the GitHub integration page with the real workflow template (#927).
Chore
- Rename module to
github.com/getstackit/stackit(#928). - Add pressure tests for GitHub-side squash merge edge cases in sync (#921).
- Reorganize and speed up the test suites (#925).
- Update backend dependencies (#922).
What's Changed
- perf: batch metadata ref deletion in Reset by @jonnii in #916
- fix: respect caller context in ResetTrunkToRemote fallback fetch by @jonnii in #917
- perf: batch and parallelize remote metadata + PR base updates by @jonnii in #918
- fix(restack): skip TUI when restack has no work to do by @jonnii in #919
- test(sync): add pressure tests for GitHub-side squash merge by @jonnii in #921
- refactor: extract MetadataTx state check into helper by @jonnii in #924
- refactor(describe): extract shared apply path by @jonnii in #923
- chore: update backend dependencies by @jonnii in #922
- test: reorganize and speed up test suites by @jonnii in #925
- fix: point agents-block link to repo instead of stackit.dev by @jonnii in #926
- chore: rename module to github.com/getstackit/stackit by @jonnii in #928
- docs: align github integration page with real workflow template by @jonnii in #927
Full Changelog: v0.17.13...v0.17.14
Assets 15
v0.17.13
3b0b060 Highlights
- Added
--message-file/-Fflag tostackit create,modify,squash, andsplit,
mirroringgit commit -F. Use-F pathor-F -to read messages from a file or stdin —
keeps Bash command lines stable across runs so a single permission rule covers every commit
message in agent harnesses. - Reshaped Codex skill output as a first-class product surface. Codex skills
(~/.codex/skills/) now ship with their own descriptions corpus, slim router, frontmatter
rewrites, and override tree — Claude templates remain byte-identical. - Streaming restack progress updates: long-running restacks now report progress live instead
of waiting for the whole operation to finish.
Features
- Added
--message-file(-F) flag tocreate,modify,squash, andsplitfor stable
message input from files or stdin (#901). - Reshaped Codex skills with per-skill descriptions, transform pipeline (model: stripping,
allowed-tools filtering, ~/.claude path rewriting,!...`` macro removal, AskUserQuestion
rewriting), andtemplates/codex_overrides/precedence tree (#909).
Fixes
- Streamed restack progress updates so long-running restacks no longer appear to hang
(#910). - Detected dumb terminals, added
WaittoSender, and renamed the restack progress label
(#905). - Used explicit force-with-lease SHA when pushing branches to avoid stale-ref races (#897).
- Deduped flatten restack targets so children aren't restacked multiple times in the same
run (#896). - Validated
splitflags before any I/O so invalid combinations fail fast without draining
stdin or opening files (#903). - Hardened
--message-filehandling: empty-input errors, TTY guard on-, clearer
mutex/missing-file error messages, anderrors.Is(fs.ErrNotExist)support (#902).
Performance
- Reused validated restack commits to skip redundant work when commits are already in the
right state (#907). - Ported validated restack special cases to the shared fast path (#908).
Refactors
- Shared best-effort action snapshots across CLI commands (#892).
- Shared CLI checkout navigation helpers (#891).
- Shared CLI branch argument resolution (#890).
- Centralized stack graph access (#889).
- Shared branch comparison revision resolution (#888).
- Shared PR navigation renderer (#887).
- Dropped the
commandprefix from agent templates and project rules — Claude's
non-interactive Bash sandbox doesn't expand aliases, so the prefix only doubled the
permission match surface (#898, #899).
Docs
- Added "Keeping Permission Rules Stable" guidance to the stackit workflow rule, covering
one-command-per-Bash-call, no2>&1appending, and stdin/file-based message input (#900). - Clarified scoped restack agent wording (#886).
- Dogfooded
-F -across 20 agent template sites andAGENTS.mdworkflow examples (#903).
Chore
- Updated Go and backend dependencies (#893, #913).
- Updated web/frontend dependencies (#894, part of #913).
What's Changed
- Merging 2 PRs by @jonnii in #895
- chore: update backend dependencies by @jonnii in #893
- chore: update frontend dependencies by @jonnii in #894
- Merging 6 PRs by @jonnii in #904
- refactor: drop
commandprefix from agent templates by @jonnii in #898 - refactor: drop
commandprefix from project rules and AGENTS.md by @jonnii in #899 - docs: add permission-stability guidance for stackit workflow by @jonnii in #900
- feat: add --message-file flag to create/modify/squash/split by @jonnii in #901
- fix: harden --message-file handling and broaden test coverage by @jonnii in #902
- fix: validate split flags before I/O and dogfood -F - in templates by @jonnii in #903
- Merging 2 PRs by @jonnii in #906
- fix: dedupe flatten restack targets by @jonnii in #896
- fix: use explicit force-with-lease sha by @jonnii in #897
- fix: detect dumb terminals, add Wait to Sender, rename restack label by @jonnii in #905
- feat: reshape Codex skills as a first-class product surface by @jonnii in #909
- Merging 2 PRs by @jonnii in #911
- perf: reuse validated restack commits by @jonnii in #907
- refactor: port validated restack special cases by @jonnii in #908
- fix: stream restack progress updates by @jonnii in #910
- Merging 7 PRs by @jonnii in #912
- docs: clarify scoped restack agent wording by @jonnii in #886
- refactor: share PR navigation renderer by @jonnii in #887
- refactor: share branch comparison revision resolution by @jonnii in #888
- refactor: centralize stack graph access by @jonnii in #889
- refactor: share CLI branch argument resolution by @jonnii in #890
- refactor: share CLI checkout navigation helpers by @jonnii in #891
- refactor: share best-effort action snapshots by @jonnii in #892
- chore: update web dependencies by @jonnii in #914
- chore: update Go dependencies by @jonnii in #913
Full Changelog: v0.17.11...v0.17.13
Assets 15
v0.17.12
v0.17.11
32af894 This release focuses on safer multi-stack automation, better restack and foreach targeting, improved conflict handling, and a cleaner web diff explorer.
Highlights
- Added multi-stack restack support with
stackit restack --all-stacksand--stacks <roots>. - Added
stackit restack --parallelwith--jobsto process independent stack groups in
parallel worktrees. - Added
stackit restack --continue-on-conflictso conflicted stacks can be reported
without blocking unrelated independent stacks. - Added multi-stack foreach targeting with
stackit foreach --all-stacks,--stacks, and
--branch. - Added
stackit foreach --json, including per-branch status, output, errors, and exit
codes. - Added
stackit foreach --find-first-failureto run branches by stack depth and stop after
the first failing layer. - Improved conflict reporting by showing conflict marker line ranges and clearer resolution
instructions. - Added git rerere integration for restack/sync flows, including auto-continuing rebases
when rerere resolves conflicts. - Replaced the web diff file explorer with
@pierre/trees, improving file tree behavior and
status display.
Fixes
- Preserved divergence points across delete, fold, reorder, split, get, flatten, and
worktree reparenting paths. - Fixed flatten/reparent behavior so branches only carry their own commits after structural
changes. - Fixed restack parallel conflict handling so worker cleanup does not destroy conflict state
or under-report failed groups. - Hardened stack automation error handling.
- Fixed sync dry-run JSON by adding
would_restack_stacksfor planning scoped restacks. - Closed API logger resources, drained SSE clients, and tracked the ref watcher goroutine
during shutdown.
Developer And Docs
- Updated restack docs and agent templates to prefer explicit scoped commands such as
stackit restack --upstack. - Added JSON
stack_root/stack_rootsannotations for multi-stack restack output. - Updated Go and frontend dependencies, including Next.js, TypeScript, Vitest, lucide-react,
@pierre/diffs, and new@pierre/trees.
Notes
stackit restack --parallel now requires --all-stacks or --stacks, since parallel
restack operates across independent stack groups
What's Changed
- Merging 4 PRs by @jonnii in #855
- test(flatten): add commit integrity tests to verify branches only contain their own commits after flatten by @jonnii in #851
- fix(flatten): propagate UpdateParentRevision error instead of silently swallowing it by @jonnii in #852
- refactor(engine): add SetParentName, fix SetParentPreservingDivergence, fix pluck child reparenting, add commit integrity tests by @jonnii in #853
- chore: update go and frontend dependencies by @jonnii in #858
- feat(git): auto-continue rerere-resolved rebases by @jonnii in #860
- feat(actions): show conflict marker line ranges by @jonnii in #859
- docs(cli): update stack-fix and stack-restack agent templates by @jonnii in #861
- refactor(merge): simplify multistack discovery logic by @jonnii in #862
- Merging 18 PRs by @jonnii in #882
- feat(foreach): improve foreach action and add tests by @jonnii in #863
- feat(foreach): add foreach events and dry-run support by @jonnii in #864
- feat(foreach): add stack range filtering and parallel execution by @jonnii in #865
- feat(restack): improve restack with better CLI flags and add tests by @jonnii in #866
- docs(cli): update stack-fix agent template by @jonnii in #867
- docs(cli): update stack-verify agent template by @jonnii in #868
- docs(cli): update stack-absorb agent template by @jonnii in #869
- docs(cli): update stack-sync agent template by @jonnii in #870
- docs(cli): update stack-status agent template by @jonnii in #871
- docs(cli): update skill templates to use scoped restack commands by @jonnii in #872
- feat(sync): add would_restack_stacks to dry-run JSON for restack planning by @jonnii in #873
- feat(foreach): add --all-stacks and --stacks multi-stack scope flags by @jonnii in #874
- feat(restack): add --parallel flag to run independent stacks in parallel worktrees by @jonnii in #875
- feat(restack): annotate JSON output with stack_root per branch for multi-stack grouping by @jonnii in #876
- docs: update restack examples to use scoped flags across user-facing docs by @jonnii in #877
- fix: harden stack automation error handling by @jonnii in #878
- docs: clarify would_restack_stacks must be recomputed after sync before restack by @jonnii in #880
- feat(web): replace diff file explorer with @pierre/trees by @jonnii in #879
- fix(api): close logger, drain SSE clients, and track watcher goroutine on shutdown by @jonnii in #881
- fix(restack): stop parallel worker from destroying conflict state and under-reporting failed groups by @jonnii in #883
- refactor(restack): typed ConflictMode and parallelResultCollector by @jonnii in #884
- fix: harden foreach and reparent release prep by @jonnii in #885
Full Changelog: v0.17.10...v0.17.11