Files
PaperClipAI/cli/src
Saurabh Sungh 66b0aded28 fix(cli): add KillMode=mixed to generated systemd unit (#18598)
## Thinking Path

> - Paperclip is the open source app people use to manage AI agents for
work.
> - The CLI subsystem provides background service management
(`paperclipai service install`) generating systemd user units on Linux.
> - When systemctl stops or restarts the service, systemd uses default
`KillMode=control-group` and sends SIGTERM simultaneously to all cgroup
processes, including embedded PostgreSQL.
> - This races the server's clean shutdown sequence and triggers a smart
shutdown in PostgreSQL instead of a fast shutdown, leading to ungraceful
exit.
> - This pull request adds `KillMode=mixed` to the `[Service]` section
of the generated systemd unit definition.
> - The benefit is that SIGTERM is delivered only to the main server
process, allowing the server to cleanly drain and shut down embedded
PostgreSQL in order.

## Linked Issues or Issue Description

Fixes #18595

## What Changed

- Added `KillMode=mixed` to `renderSystemdUnit` under `[Service]` in
`cli/src/services/service-manager.ts`.
- Added test assertion for `KillMode=mixed` in
`cli/src/__tests__/service-manager.test.ts`.

## Verification

- Automated test: `cli/src/__tests__/service-manager.test.ts` checks
that `renderSystemdUnit` generates a unit containing `KillMode=mixed`.
- Manual verification: Checked rendered systemd unit output to ensure
valid systemd syntax and correct section placement under `[Service]`.

## Risks

- Low risk: `KillMode=mixed` only applies to systemd user services on
Linux generated via `paperclipai service install`. If the main process
fails to exit within `TimeoutStopSec` (300s), systemd sends SIGKILL to
all remaining child processes.

## Model Used

- Google Antigravity (Gemini 3.8 Flash High) with chain-of-thought
reasoning and codebase tools.

## Checklist

- [x] I have included a thinking path that traces from project context
to this change
- [x] I have specified the model used (with version and capability
details)
- [x] I have checked ROADMAP.md and confirmed this PR does not duplicate
planned core work
- [x] I have searched GitHub for duplicate or related PRs and linked
them above
- [x] I have either (a) linked existing issues with `Fixes: #` / `Closes
#` / `Refs #` OR (b) described the issue in-PR following the relevant
issue template
- [x] I have not referenced internal/instance-local Paperclip issues or
links (only public GitHub `#NNN` / `github.com/paperclipai/paperclip`
URLs)
- [x] My branch name describes the change (e.g. `docs/...`, `fix/...`)
and contains no internal Paperclip ticket id or instance-derived details
- [x] I have run tests locally and they pass
- [x] I have added or updated tests where applicable
- [x] I have updated relevant documentation to reflect my changes
- [x] I have considered and documented any risks above
- [x] All Paperclip CI gates are green
2026-11-04 17:39:54 -06:00
..