paperclip/scripts
Dotta 018ca5daaf
fix: verify ACP Stop and preserve safe continuation (#13119)
## Thinking Path

> - Paperclip is the open source app people use to manage AI agents for
work.
> - Task controls coordinate provider execution and queued user
messages.
> - Stop could finish before an embedded ACP provider stopped its tools.
> - A later request could be held for reconciliation without a clear
task response.
> - A restored provider could also retain the stopped run's API
credential.
> - This pull request verifies provider termination and preserves safe
session continuation.
> - Operators can continue known-safe work and see why uncertain work
cannot start.

## Linked Issues or Issue Description

**What happened?**

Stop could leave an embedded ACP provider running. A queued follow-up
followed by “go” could fail before it reached the provider. Task chat
could show a generic missing-response message. Even a restored session
could use the previous run's credential and fail its task update.

**Expected behavior**

Stop waits for confirmed provider termination. A later explicit wake
continues the same compatible session only when recorded actions have
known outcomes. It carries pending comments and the current run's
environment. Uncertain actions retain a visible reconciliation hold.
Composer Stop preserves the existing pause rule: conversation can
continue while paused, but task work requires Resume.

**Steps to reproduce**

1. Start an embedded ACP task.
2. Send a second request while the provider is running.
3. Interrupt the run, then send “go”. Also test composer Stop followed
by Resume work.
4. Check that the request is delivered once and that the provider can
complete the task through the current run's API credential.
5. Repeat with an unfinished write. Confirm that the write stops and
that further execution stays blocked with a visible reason.

**Paperclip version or commit**

Built from source on master at `3bc60dd8b` plus this branch.

**Deployment mode**

Local source build with an isolated embedded PostgreSQL instance.

Refs #11183. Refs #12552. Those changes address recovery after operator
cancellation. This change also covers embedded ACP termination, session
proof, pending-comment delivery, and task feedback.

## What Changed

- Propagate Stop into embedded ACP and wait for bounded adapter cleanup
and provider exit. Retain the actual ChildProcess object for forced
termination on all platforms; never signal a recycled numeric PID.
- Preserve interrupted checkpoints only for acknowledged, local,
persistent sessions with settled reads or no tools. Keep writes,
incomplete actions, and forced termination blocked.
- Restore the same compatible provider session with the current run's
environment. Reject fresh-session fallback for an interrupted
checkpoint.
- Adopt pending comments on the next explicit wake. Stop alone does not
dispatch them.
- Share the execution-blocker rule across dispatch, Resume, and task
detail. Show Stopped or Couldn't start with the recorded reason. Resolve
the stopped agent for the run link, including reviewer runs.
- Keep execution reconciliation holds intact when generic recovery sees
queued comments or healthy child tasks.
- Add process, service, component, and browser regression coverage. Fix
disposable database cleanup and React test settling exposed by the full
suite.

## Verification

- Passed `pnpm -r typecheck`, `pnpm build`, and `pnpm
check:token-gates`.
- Passed all three `acp-stop-continuation.spec.ts` browser journeys.
They use an actual ACP child process and require task completion through
the agent API.
- Passed 165 adapter execution, operator-stop, and child-process control
tests, 17 queued-comment route tests, and 65 tests in the two adjusted
UI suites. Earlier focused recovery, heartbeat, and task-control tests
also passed.
- Manually used the browser to queue a request, Stop, send “go” while
paused, and Resume. The same session answered once and moved the task to
Done with the current run's credential.
- Manually interrupted an unfinished write. Its file size stayed fixed
for five seconds. “Go” showed the reconciliation reason and did not
start another provider prompt.
- Separate live Claude ACP smoke checks confirmed that Stop ended a
disposable local write and that a no-tool interruption could resume the
exact provider session. The browser fixture does not call Drive or
another external app.
- Passed all 5,615 UI tests and 3,090 other workspace tests. The CLI and
general server groups pass with targeted retries: two transient server
failures passed together on retry, and two embedded-database startup
failures passed after removing abandoned shared-memory segments from
this task's completed browser fixtures. All 144 serialized server suites
completed, with 2,189 tests passing after two transient HTTP socket
failures passed on retry.
- Passed all 135 heartbeat process/recovery tests, including a
deterministic regression that failed before the recovery-sweep fix.
- Passed 18 dispatch integration tests, including stopped-reviewer
links, company boundaries, and malformed run IDs.
- Greptile is 5/5 on `7dd170d83`, with zero unresolved review threads.
The security scan and all required CI gates pass for the same commit.

## Risks

- Safe continuation depends on complete tool reporting and a restorable
local provider session. Unknown outcomes remain blocked and require
reconciliation.
- Provider cleanup can take time. A timeout does not grant replay
permission.
- The change adds optional adapter context fields and an optional issue
projection. It does not change the database schema or require a
migration.
- Test cleanup truncates company data only in a disposable test
database.

## Model Used

OpenAI GPT-6, running as Codex with repository tools, code execution,
and browser interaction. The runtime does not expose a more specific
model deployment ID or context-window size.

## 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
- [x] Greptile is 5/5 with no open P2s, recommendations, or follow-ups
- [x] I will address all Greptile and reviewer comments before
requesting merge

---------

Co-authored-by: Paperclip <noreply@paperclip.ing>
2026-09-09 22:06:06 -05:00
..
__tests__ fix(workspaces): preserve dependency provisioning failures (#13093) 2026-09-09 10:14:58 -05:00
install-sh-fixtures feat(cli): add managed install, update, and service lifecycle (#10045) 2026-07-31 18:52:23 -07:00
mcp-fixtures fix: verify ACP Stop and preserve safe continuation (#13119) 2026-09-09 22:06:06 -05:00
smoke feat(apps): unify permissions and action testing (#12802) 2026-09-03 21:23:26 -05:00
acpx-patch-packaging.test.mjs feat: add opt-in chat provider and data foundation (#13100) 2026-09-09 13:49:12 -05:00
assert-cloud-image-sentry.mjs Install the declared Sentry server package into the hosted image (#12330) 2026-08-27 19:10:49 -07:00
assert-orphan-reaping.sh fix(docker): make tini PID 1 in the server image so adopted orphans are reaped (#12137) 2026-08-25 09:52:39 -07:00
backfill-issue-reference-mentions.ts Add first-class issue references (#4214) 2026-04-21 10:02:52 -05:00
backup-db.sh Add paperclipai db:backup CLI command 2026-03-05 06:02:12 -06:00
benchmark-skill-preparation.ts fix(skills): reuse validated runtime revisions during preparation (#13042) 2026-09-08 09:35:32 -05:00
bootstrap-npm-package.mjs feat(release): bootstrap new npm packages with a placeholder publish (#11757) 2026-08-19 19:38:17 -07:00
bootstrap-npm-package.test.mjs feat(release): bootstrap new npm packages with a placeholder publish (#11757) 2026-08-19 19:38:17 -07:00
build-npm.sh feat(cli): add managed install, update, and service lifecycle (#10045) 2026-07-31 18:52:23 -07:00
build-standalone-public-packages.mjs perf(ci): build standalone public packages concurrently (#8567) 2026-06-23 17:52:12 -07:00
capture-pap-2351-binding-picker.mjs Add secrets provider vaults and remote import (#5429) 2026-05-09 18:22:17 -05:00
chat-adapter-patch-packaging.test.mjs feat: add opt-in chat provider and data foundation (#13100) 2026-09-09 13:49:12 -05:00
check-docker-deps-stage.mjs Add E2B sandbox provider plugin (#4452) 2026-04-25 11:01:11 -07:00
check-forbidden-tokens.mjs Redact current user in comments and token checks 2026-03-11 22:17:21 -05:00
check-module-boundaries.mjs refactor(server): move scheduled-retry and queued-run dispatch into a run-dispatch module (#12920) 2026-09-08 11:00:55 -07:00
check-module-boundaries.test.mjs refactor(server): move scheduled-retry and queued-run dispatch into a run-dispatch module (#12920) 2026-09-08 11:00:55 -07:00
check-no-git-push.mjs PAPA-430: workspace finalize gates + no-remote-git enforcement (#6969) 2026-05-29 08:25:29 -07:00
check-no-git-push.test.mjs PAPA-430: workspace finalize gates + no-remote-git enforcement (#6969) 2026-05-29 08:25:29 -07:00
check-node-version-policy.mjs fix(build): enforce Node 24 across Paperclip (#11792) 2026-08-21 10:17:52 -07:00
check-release-package-bootstrap.mjs fix(ci): gate new release packages on npm bootstrap (#5146) 2026-05-03 19:31:28 -07:00
check-release-package-bootstrap.test.mjs fix(ci): gate new release packages on npm bootstrap (#5146) 2026-05-03 19:31:28 -07:00
check-task-chat-motion.mjs feat(ui): chat-style task view behind an experimental flag (#10606) 2026-08-01 02:26:47 -07:00
check-token-gates.mjs fix(ui): align the mobile task chat composer with the thread (#11296) 2026-08-14 12:53:11 -04:00
clean-install-git.sh feat(cli): add managed install, update, and service lifecycle (#10045) 2026-07-31 18:52:23 -07:00
clean-install-npm.sh feat(cli): add managed install, update, and service lifecycle (#10045) 2026-07-31 18:52:23 -07:00
clean-onboard-git.sh http clone 2026-03-09 10:03:45 -05:00
clean-onboard-npm.sh scripts 2026-03-03 14:00:10 -06:00
clean-onboard-ref.sh feat: add committed-ref onboarding smoke script 2026-03-09 09:59:43 -05:00
cli-bundled-npm-dependencies.mjs feat(cli): add managed install, update, and service lifecycle (#10045) 2026-07-31 18:52:23 -07:00
codemod-extract-colors.mjs feat(ui): single-source design tokens, visual regression suite, and theme retune (#9134) 2026-07-07 16:22:16 -05:00
codemod-extract-misc.mjs feat(ui): single-source design tokens, visual regression suite, and theme retune (#9134) 2026-07-07 16:22:16 -05:00
codemod-extract-sizes.mjs feat(ui): single-source design tokens, visual regression suite, and theme retune (#9134) 2026-07-07 16:22:16 -05:00
codemod-extract-type.mjs feat(ui): single-source design tokens, visual regression suite, and theme retune (#9134) 2026-07-07 16:22:16 -05:00
codemod-type-ladder.mjs feat(ui): single-source design tokens, visual regression suite, and theme retune (#9134) 2026-07-07 16:22:16 -05:00
codex-acp-network-policy.test.mjs fix(adapters): prevent engine fallback and preserve usable runtime defaults (#13105) 2026-09-09 13:27:24 -05:00
create-github-release.sh feat(release): draft stable notes at beta publish, read them from master at promotion (#11567) 2026-08-17 20:47:23 -07:00
dev-both.mjs feat(dev): add pnpm dev:mobile and dev:both for prebuilt UI preview (#10718) 2026-08-02 20:26:03 -07:00
dev-runner-native-binary.mjs feat(runner): integrate Codex native execution (#12616) 2026-08-31 22:51:17 -05:00
dev-runner-options.ts fix(dev): honor --data-dir isolation (#12193) 2026-08-26 09:08:31 -05:00
dev-runner-output.mjs Guard dev health JSON parsing 2026-04-06 21:23:33 -05:00
dev-runner-output.ts fix(runtime): handle empty dev runner responses 2026-04-06 21:56:13 -05:00
dev-runner-paths.mjs [codex] Add backup endpoint and dev runtime hardening (#4087) 2026-04-20 06:08:55 -05:00
dev-runner-snapshot.mjs Address dev runner snapshot review feedback 2026-06-01 22:03:51 +00:00
dev-runner.mjs [codex] Add skills CLI and catalog management (#6782) 2026-05-28 07:33:51 -10:00
dev-runner.ts fix(runner): recover native sessions across restarts (#12845) 2026-09-04 15:03:53 -05:00
dev-service-profile.ts Introduce bind presets for deployment setup 2026-04-11 07:09:07 -05:00
dev-service.ts fix(dev): honor --data-dir isolation (#12193) 2026-08-26 09:08:31 -05:00
discord-daily-digest.sh [codex] Harden heartbeat scheduling and runtime controls (#4223) 2026-04-21 12:24:11 -05:00
docker-build-test.sh fix(docker): make tini PID 1 in the server image so adopted orphans are reaped (#12137) 2026-08-25 09:52:39 -07:00
docker-entrypoint.sh Ensure app-home ownership before the privilege drop, not only on remap (#10530) 2026-07-30 21:34:45 -07:00
docker-onboard-smoke.sh Follow the current onboarding arc in the release smoke (#12423) 2026-08-28 07:21:08 -07:00
docker-onboard-smoke.test.mjs Follow the current onboarding arc in the release smoke (#12423) 2026-08-28 07:21:08 -07:00
draft-stable-notes.sh feat(release): thorough notes skeletons — nest each PR's summary at creation (#12124) 2026-08-24 20:51:33 -07:00
draft-stable-notes.test.mjs feat(release): thorough notes skeletons — nest each PR's summary at creation (#12124) 2026-08-24 20:51:33 -07:00
e2e-install-lifecycle.sh fix(build): enforce Node 24 across Paperclip (#11792) 2026-08-21 10:17:52 -07:00
e2e-mcp-user-stories.mjs feat(mcp) [split 8/8]: add e2e coverage and operator docs (#9563) 2026-07-14 15:48:57 -05:00
e2e-shard-durations.json test(e2e): shorten and split Smoke Lab coverage (#12506) 2026-08-31 10:15:39 -05:00
e2e-shard.mjs feat(connections): connect services from native task feeds (#13058) 2026-09-08 15:55:26 -05:00
e2e-update-migrations.sh test(installer): cover cross-version update migrations (#10587) 2026-07-31 18:53:34 -07:00
ensure-plugin-build-deps.mjs [codex] Add skills CLI and catalog management (#6782) 2026-05-28 07:33:51 -10:00
ensure-workspace-package-links.ts [codex] fix worktree dev dependency ergonomics (#3743) 2026-04-15 09:47:29 -05:00
extract-proposed-events.mjs Add telemetry proposal extractor (#9544) 2026-07-13 23:47:27 -07:00
extract-proposed-events.test.mjs Add telemetry proposal extractor (#9544) 2026-07-13 23:47:27 -07:00
general-server-shard-durations.json feat: add Grok device login to the sandbox login panel (#12469) 2026-08-28 21:48:34 -07:00
general-server-shard.mjs perf(ci): balance general-server test shards by recorded suite duration (#9516) 2026-07-13 12:25:54 -07:00
generate-company-assets.ts Address Greptile review on portability PR 2026-03-23 17:23:59 -05:00
generate-feature-catalog.ts Add a feature catalog build artifact derived from the experimental settings schema (#10055) 2026-07-22 18:12:56 -07:00
generate-npm-package-json.mjs fix(build): enforce Node 24 across Paperclip (#11792) 2026-08-21 10:17:52 -07:00
generate-org-chart-images.ts Add standalone Playwright-based org chart image generator 2026-03-20 05:55:33 -05:00
generate-org-chart-satori-comparison.ts feat: multi-style pure SVG org chart renderer (no Playwright needed) 2026-03-20 06:33:29 -05:00
generate-plugin-package-json.mjs Add E2B sandbox provider plugin (#4452) 2026-04-25 11:01:11 -07:00
generate-runner-api-reference.mjs feat(runner): add guarded API search and call fallback (#13003) 2026-09-07 14:14:43 -05:00
generate-runner-experimental-api-metadata.mjs feat(runner): add guarded API search and call fallback (#13003) 2026-09-07 14:14:43 -05:00
generate-ui-package-json.mjs Publish @paperclipai/ui from release automation 2026-03-26 11:13:11 -05:00
ingest-app-definitions.mjs feat(apps): refine Postman and Shopify setup (#12357) 2026-08-29 12:08:35 -05:00
install.sh fix(build): enforce Node 24 across Paperclip (#11792) 2026-08-21 10:17:52 -07:00
kill-agent-browsers.sh [codex] Stabilize tests and local maintenance assets (#4423) 2026-04-24 15:11:42 -05:00
kill-dev.sh kill chrome test servers too 2026-04-09 06:14:12 -05:00
kill-vitest.sh [codex] Harden heartbeat scheduling and runtime controls (#4223) 2026-04-21 12:24:11 -05:00
kill-workspaces.sh Add workspace runtime kill script 2026-06-05 03:28:07 +00:00
link-plugin-dev-sdk.mjs fix(plugins): move dev SDK linking out of plugin postinstall scripts (#8255) 2026-06-18 07:45:53 -07:00
link-plugin-dev-sdk.test.js fix(plugins): move dev SDK linking out of plugin postinstall scripts (#8255) 2026-06-18 07:45:53 -07:00
measure-issue-chat-long-thread.mjs Improve issue thread scale and markdown polish (#4861) 2026-04-30 13:18:01 -05:00
migrate-inline-env-secrets.ts refactor: rename packages to @paperclipai and CLI binary to paperclipai 2026-03-03 08:45:26 -06:00
paperclip-commit-metrics.ts feat: implement multi-user access and invite flows (#3784) 2026-04-17 09:44:19 -05:00
paperclip-issue-update.sh fix: verify issue-update writes instead of inferring success (#12051) 2026-08-23 16:56:51 -07:00
prepare-bundled-package.mjs Build isolated preview artifacts for exact-source deployments (#13041) 2026-09-08 09:21:58 -05:00
prepare-server-ui-dist.sh ci: speed up PR verify workflow (#6137) 2026-05-16 11:28:25 -07:00
preview-artifacts.mjs Build isolated preview artifacts for exact-source deployments (#13041) 2026-09-08 09:21:58 -05:00
preview-artifacts.test.mjs Build isolated preview artifacts for exact-source deployments (#13041) 2026-09-08 09:21:58 -05:00
provision-worktree-runtime.sh fix(scripts): silence pnpm DEP0169 at provisioning install call sites (#12228) 2026-08-26 10:42:13 -07:00
provision-worktree.sh fix(workspaces): preserve dependency provisioning failures (#13093) 2026-09-09 10:14:58 -05:00
release-lib.sh fix(release): skip lifecycle scripts for bundle staging (#12585) 2026-08-31 09:14:08 -05:00
release-lib.test.mjs fix(release): skip lifecycle scripts for bundle staging (#12585) 2026-08-31 09:14:08 -05:00
release-package-manifest.json feat: add kimi-local adapter for Kimi Code CLI (CLI + ACP engines) (#9967) 2026-08-20 12:06:33 -07:00
release-package-map.mjs feat(cli): add managed install, update, and service lifecycle (#10045) 2026-07-31 18:52:23 -07:00
release-package-map.test.mjs feat(cli): add managed install, update, and service lifecycle (#10045) 2026-07-31 18:52:23 -07:00
release-registry-versions.mjs perf(release): batch npm registry version queries (#9202) 2026-07-08 08:04:39 -07:00
release-registry-versions.test.mjs feat(release): add human-gated beta channel with stable soak enforcement (#11008) 2026-08-10 16:52:59 -07:00
release.sh feat(release): draft stable notes at beta publish, read them from master at promotion (#11567) 2026-08-17 20:47:23 -07:00
repair-pr-prep-workspace-attachment.mjs fix(workspaces): attach PR preparation to existing branches (#11703) 2026-08-21 17:23:18 -05:00
request-hot-restart.ts fix(server): preserve hot restart intent across path upgrade (#10593) 2026-07-31 21:55:59 -07:00
rollback-latest.sh chore: switch release calver to mdd patch 2026-03-18 07:57:36 -05:00
run-typecheck-build-gaps.mjs Add runtime asset build-gap guard 2026-07-13 08:35:30 -07:00
run-vitest-stable.mjs Add end-to-end session goals to Paperclip Runner 2026-09-08 16:18:47 -05:00
runner-api-eval-worker.ts feat(connections): connect services from native task feeds (#13058) 2026-09-08 15:55:26 -05:00
screenshot-blocked-inbox.mjs [codex] Add blocked inbox attention view (#5603) 2026-05-13 16:41:36 -05:00
screenshot-file-viewer.mjs Add workspace file viewer and artifact links (#7681) 2026-06-09 17:17:43 -05:00
screenshot-fork-flow.mjs Skill Studio: three-pane skill IDE with sandboxed test runs (#9241) 2026-07-09 13:08:56 -05:00
screenshot-notion-connect-flow.mjs feat(apps): connect Notion through MCP OAuth (#11009) 2026-08-06 22:18:08 -05:00
screenshot-one.mjs Add workspace file viewer and artifact links (#7681) 2026-06-09 17:17:43 -05:00
screenshot-pap2373.mjs Cancel stale queued heartbeats when issue graph changes (PAP-2314) (#4534) 2026-04-26 21:17:38 -05:00
screenshot-recovery-card.cjs [codex] Add source-scoped recovery actions (#5599) 2026-05-12 09:37:15 -05:00
screenshot-subissues.mjs Present ordered sub-issues as a workflow checklist (#4523) 2026-04-26 07:36:49 -05:00
screenshot-verdicts.mjs feat: add attention queue and Decisions surface (#9380) 2026-07-10 17:09:57 -05:00
screenshot.cjs feat: add authenticated screenshot utility (#2622) 2026-04-03 10:51:26 -07:00
serialized-shard-durations.json refactor: balance serialized server shards by recorded suite duration (#11528) 2026-08-17 20:30:44 -07:00
serve-storybook-static.mjs [codex] Document Storybook visual baseline platform lock (#9216) 2026-07-08 07:23:02 -05:00
service-onboard-smoke.sh test(release-smoke): cover the background-service leg of onboarding (#12151) 2026-08-25 01:05:27 -07:00
service-onboard-smoke.test.mjs test(release-smoke): cover the background-service leg of onboarding (#12151) 2026-08-25 01:05:27 -07:00
storybook-visual-baseline.mjs feat(ui): single-source design tokens, visual regression suite, and theme retune (#9134) 2026-07-07 16:22:16 -05:00
test-install-sh-docker.sh fix(build): enforce Node 24 across Paperclip (#11792) 2026-08-21 10:17:52 -07:00
verify-release-registry-state.mjs feat(release): add human-gated beta channel with stable soak enforcement (#11008) 2026-08-10 16:52:59 -07:00
verify-release-registry-state.test.mjs feat(release): add human-gated beta channel with stable soak enforcement (#11008) 2026-08-10 16:52:59 -07:00