Commit Graph

4774 Commits

Author SHA1 Message Date
Dotta 1732ce9d8b Keep Claude upgrade fixtures within the isolated test instance
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-09-12 23:06:59 -05:00
Dotta 86bbabfecd Patch isolated reporting URI dependency and enforce Node policy
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-09-12 22:46:36 -05:00
Dotta 2116570603 Isolate trusted runner reporting dependencies behind an integrity lock
Install only the dedicated reporting runtime with npm ci and disabled lifecycle scripts. Preserve the trusted source checkout, pin all registry artifacts, and execute reporting and publication through the isolated runtime before and after scoped credential exchange.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-09-12 22:38:31 -05:00
Dotta 2959fcb43d Compare sandbox Claude MCP identities independent of ordering
Canonicalize known external identity triples while preserving duplicate multiplicity and rejecting unknown fields. Keep local comparison behavior unchanged.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-09-12 22:21:49 -05:00
Dotta 355590536e Preserve sandbox Claude sessions across compatible app upgrades
Keep shipped-skill and built-in tool updates separate from external connection and agent-instruction changes. Recover historical identity only from verified host evidence, and explain native tool-contract transitions without weakening checkpoint compatibility.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-09-12 22:12:01 -05:00
Dotta 26164f1d90 Align recovery integration assertions with blocked terminal outcomes
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-09-12 21:08:18 -05:00
Dotta b042918906 Fence native runner admission on durable process ownership
Cancel pending launches and contain verified processes before reporting failed ownership. Keep unresolved checkpoints recoverable.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-09-12 21:08:18 -05:00
Dotta 378f1aec81 Resolve trusted qualification reporting locks before frozen installation
Retain the master-only authorization and trusted reporting checkout. Verify that lock resolution changes only the CI-owned lockfile, and align cache regressions with the existing pinned upstream workflow.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-09-12 20:30:17 -05:00
Dotta 04f74b4732 Persist replacement Codex process ownership before recovery succeeds
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-09-12 20:29:32 -05:00
Dotta f6e3764393 Deliver edited user direction without duplicating conversation briefs
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-09-12 20:29:32 -05:00
Dotta f9a5f0c312 Keep pending goal commands off incompatible runner leases
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-09-12 20:29:32 -05:00
Dotta afaf75a435 Integrate runner recovery with sandbox readiness fixes
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-09-12 20:00:16 -05:00
Dotta 6542394092 Integrate runner recovery through work-folder PR 13345
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-09-12 20:00:16 -05:00
Dotta c5669a60f6 Integrate runner recovery through work-folder PR 13341
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-09-12 20:00:16 -05:00
Dotta 19a0bf1236 Integrate runner recovery through work-folder PR 13337
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-09-12 20:00:16 -05:00
Dotta df1ac75884 Integrate runner recovery through work-folder PR 13264
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-09-12 20:00:16 -05:00
Dotta e998eaf466 Integrate runner recovery through work-folder PR 13163
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-09-12 20:00:15 -05:00
Dotta 557f6fd054 Integrate runner recovery through work-folder PR 13048
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-09-12 20:00:15 -05:00
Dotta 2ff6a9cc7d Integrate runner recovery through work-folder PR 13090
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-09-12 20:00:15 -05:00
Dotta 4672c6ca4a Integrate runner recovery through work-folder PR 13040
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-09-12 20:00:14 -05:00
Dotta e8cccffc24 Integrate runner recovery through work-folder PR 13006
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-09-12 20:00:14 -05:00
Dotta b779478ae3 Integrate runner recovery through work-folder PR 13002
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-09-12 20:00:14 -05:00
Dotta b3ecd2c46a Integrate runner recovery with work-folder session compatibility
Preserve task-scoped homes, verified provider-pack reuse, controller handoff, and original process start identity across the current runner recovery changes.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-09-12 19:56:00 -05:00
Dotta 422287eecd
fix: preserve runner recovery, warm sessions, and task outcomes (#13338)
## Thinking Path

> - Paperclip is the open source app people use to manage AI agents for
work.
> - The native runner connects task messages, provider execution, and
task outcomes.
> - First-time user tests exposed gaps in recovery, completion
permissions, message delivery, and Stop behavior.
> - These gaps left usable output hidden, completed work waiting for
bookkeeping, or safe work unable to continue.
> - This pull request fixes the shared lifecycle and receipt paths while
preserving process ownership and action checks.
> - Users can continue work with accurate task state and durable
messages.

## Linked Issues or Issue Description

**What happened?**

A stopped local Codex execution could remain blocked even after its
processes had stopped and its complete transcript proved that no
external action needed replay. Claude under Conservative permissions
could fail to call task completion tools. Recovery could reuse an
assistant item ID and overwrite prior output. A delivered comment could
remain marked uncertain after navigation. Stop could look like Pause or
a new recovery incident. Workspace contention could look like
cancellation. A direct reply reopening Done could enter a clarification
loop.

**Expected behavior**

Recover automatically only with verified termination and complete action
receipts. Preserve answers and messages. Keep task completion available
under Conservative permissions without broad tool access. Show crashes
as Blocked, actual human decisions as In Review, and ordinary workspace
contention as waiting. Stop the current response and allow a new
direction.

**Steps to reproduce**

1. Create ordinary response tasks with local Codex and Claude Code, then
send follow-up messages through the task composer.
2. Interrupt a disposable local Codex runner during text-only work.
Verify automatic continuation and retained output.
3. Stop a response, send a new request, answer a clarification, and
reopen completed work with another message.
4. Navigate or reload while a comment submission is pending. Confirm the
exact persisted request receipt settles it without removing newer draft
text.
5. Run two tasks in a shared Daytona workspace. Confirm waiting does not
appear as failure.

**Paperclip version or commit**

Initial acceptance baseline: `c9021c6721f91e2c74bd9fee9d3fd41c999d17b7`.
Current integration base: `6cef9743c`. Both operator-interruption and
workspace-waiting guards are preserved; native restart and legacy
permission rules remain documented.

**Deployment mode**

An isolated source-built test-drive instance, with real local Codex and
Claude Code providers and disposable Daytona environments.

Related work: #13314, #13316, #13327, #13344, #13239, #13254, #13163.
This PR addresses additional failures from ordinary task journeys,
including controller restart handoff and repeated warm sandbox setup.
Historical task status reconciliation is excluded.

## What Changed

- Persist runner ownership immediately at spawn and resume an explicitly
adopted runner even when the controller crashed before the first driver
checkpoint. Detach the controller safely across graceful restarts,
including session startup. Prevent an old finalizer from suspending or
signaling an adopted runner. Checkpoint idle warm sessions before
shutdown. Preserve the same run and queued follow-up messages.
- Scope saved legacy queue successor checks to the queue owner while
preserving ordinary task locks, operator identity, assignment gates, and
exactly-once delivery.
- Preserve managed Codex credential files when an old session is
detached for restart; normal owned cleanup still copies refreshed auth
back and removes the scoped copy.
- Reuse the bound warm shared sandbox and fully verify an existing
staged provider pack before using it. This avoids repeated uploads when
the pack is already valid.
- Add a narrow local Codex replacement path with stopped-process proof,
a closed transcript inventory, exact completion receipts, and
fresh-session lineage. Preserve no-replay holds when evidence is
incomplete. Recovery may clear only the same run's recorded Blocked
status version; manual re-blocking and dependency changes invalidate
that receipt, while queued comments do not. Later blocks stop scheduled,
queued, and final dispatch; queued/final checks re-read dependencies
even when the task status stays In Progress.
- Permit only task delivery and human-input tools through the isolated
Claude runner's exact task bridge.
- Scope assistant item identity to the provider turn and ignore only
authority-free Codex skill-change notifications during startup.
- Reconcile composer submissions by client request ID across response
loss, navigation, and reload. Retain text typed during delivery.
- Keep acknowledged run-only Stop neutral and show workspace contention
as waiting. Project exhausted native failures as Blocked.
- Restore the guarded task-page retry action for failed legacy runs,
including the server-supported explicit new-attempt path for stopped
conversation adapters. Preserve native/process recovery holds and avoid
promising Retry while a decision or execution gate hides it.
- Refresh delivered artifacts and handle direct user replies that reopen
completed work without a clarification loop.
- Check the embedded PostgreSQL PID, data directory, and actual port
before connecting or migrating.
- Document accepted behavior and add focused regressions at lifecycle,
route, transcript, and UI boundaries.

## Verification

- Final head `fece606ac2` passes the complete GitHub CI matrix: **34
green checks, two expected Storybook skips, no failures or pending
checks**, including `ci / verify`, `ci / e2e`, full runner verification,
typecheck, build, every server/workspace shard, and all browser shards.
[CI
run](https://github.com/paperclipai/paperclip/actions/runs/34727183287).
Greptile is **5/5 with no open findings**. The final two commits only
refine test fixtures; both affected suites pass 24/24 locally and in CI,
with server typecheck green.
- Complete local Vitest coverage uses the canonical groups/shards: all
635 general server suites, all 145 serialized suites, and all workspace
packages. The aggregate began on `0a8001c18` while the final queue fix
arrived: 23,903 passed, five failed, 87 skipped. The five
port/socket/timing failures passed unchanged in follow-ups (60 tests in
the exposure/file suites and 412 tests covering the serialized failures
and unrun tails). The final queue/operator-identity suites separately
passed 52/52. This is aggregate coverage plus explicit reruns, not a
pristine single-command final-head run.
- After integration with current master,
queue/operator-identity/continuation suites passed 162/162 and affected
UI suites passed 140/140. ACP Stop/continuation and legacy
task/Inbox/message browser suites passed 9/9, including both task
recovery Retry and thread Try again, automatic saved-message delivery,
exactly one new run, Done, and retained output after reload. The default
process Stop/Pause/Resume browser case passed (the native-provider case
is opt-in and skipped by default). The complete Board attachment/receipt
browser suite passed 11/11 on a disposable instance, covering both
composers, exact receipts after lost responses, no replay, bound
attachments, and newer drafts after reload.
- Blocking-intent regressions cover pre-existing Blocked, a mismatched
run/cause, an explicit manual re-block, changed dependencies, a queued
comment after failure, and a block arriving between scheduling and
provider dispatch. The negative cases reproduced before the fix. All 478
affected executor/recovery/dispatch tests passed; both database suites
ran separately after availability-probe skips in the first combined
command. The final late-dependency check passed all 143 affected
recovery/dispatch tests (zero skips) after two new negative cases
reproduced the bug.
- Focused runtime regressions cover awaited runner ownership
publication, authenticated adoption before the first checkpoint,
old-finalizer detachment, idle and busy warm-session shutdown, rejected
checkpoint propagation, provider-pack verification, and managed-Codex
credential preservation. Four managed credential detachment cases
reproduced the bug before the fix; normal owned cleanup still succeeds
exactly once.
- Live local Claude: SIGKILL 2.6 seconds into startup recovered the same
run automatically in 53 seconds, then a normal follow-up completed in 24
seconds. SIGTERM 2.5 seconds into startup preserved the same run (54
seconds) and its queued follow-up (21 seconds). Answers remained visible
and the task reached Done.
- Live Claude Daytona: a warm follow-up retained its sandbox and fell
from 121 seconds to 44 seconds. A separate cold turn took 127 seconds;
after controller shutdown and checkpointing, its follow-up completed in
33 seconds with the same sandbox, workspace, native session, and runner.
Both answers remained visible and the task was Done.
- Other live journeys covered task completion and follow-up with local
and Daytona Codex, local Codex crash recovery, Stop then new direction,
clarification response, live artifact refresh, and shared-workspace
waiting.
- Validation limits: the opt-in native composer Stop/Pause→subtree
Resume fixture exposes terminal/result ordering and subtree-cancellation
attribution bugs that can leave a child task blocked; that new finding
is assigned to a separate follow-up and is not claimed fixed here.
Default CI skips this optional native-provider fixture. Managed-Codex
credential handoff and the queue-agent integration use automated
regression evidence. Cold custom provider-pack uploads still add startup
latency.

## Risks

- Automatic replacement remains deliberately narrow: local Codex,
verified stopped identities, unchanged retained state, and a complete
text/completion-only turn. Unknown actions, partial history, or changed
ownership remain blocked.
- Claude completion permission handling changes an upstream package
patch. The exact isolated task bridge must remain pinned; unrelated
tools keep their existing permissions.
- New task failure projection changes user-visible status. No historical
status backfill or database migration is included.
- This is a broad lifecycle fix across server and UI. Live proof covers
graceful local Claude restart during startup and idle Claude Daytona
session recovery across controller shutdown. Live abrupt SIGKILL during
local Claude startup also recovered the same run. Unknown ownership or
missing action evidence still blocks reuse. Cold custom provider-pack
uploads still add startup latency; this change avoids unnecessary repeat
uploads.

## Model Used

OpenAI GPT-6 (Codex), with reasoning, code execution, browser
automation, and tool use. The exact hosted model ID and context window
are not exposed in this task.

## 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-12 19:41:15 -05:00
Dotta 95d13d0c50 test: preserve warm-run screenshots in acceptance reports
Retain canonical numbered warm-turn captures through packaging and publication validation. Keep explicit non-retryable ACPX session defects classified as candidate failures without hiding credential or model configuration errors.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-09-12 19:40:04 -05:00
Dotta 23211f7724 test: isolate authorization setup and identify queued user comments
Finish cold route imports before shared-mock test loops begin, and seed explicit user authorship required by locked queued-comment admission. Preserve all authorization and responsible-user assertions.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-09-12 19:39:37 -05:00
Dotta b802e34ffb fix: preserve managed Codex sessions through credential refresh
Partition recognized Codex subscription credentials by account and principal, retain exact-current-credential compatibility for the previous identity format, and keep model and authorization changes significant. Include the transaction-pooling lease correction from e704e1c9ae (#13347).

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-09-12 19:39:30 -05:00
Dotta 13bae6fa21
fix: reject unsupported REST tool connections without stdio validation (#13346)
## Thinking Path

> - Paperclip manages AI agents and their connections.
> - Connection checks must use the configured transport.
> - The tool service treated every remaining transport as local stdio.
> - Anthropic's old REST method therefore failed with a templateId
error. A REST connection with a valid stdio template could incorrectly
pass.
> - Anthropic now has a supported AI-account flow. This pull request
removes its obsolete REST setup option and limits stdio checks to stdio
connections.
> - Users can connect an AI account, and existing unsupported
connections receive an accurate error.

## Linked Issues or Issue Description

Related: #13248 added the supported AI-account flow. Searches for
related REST health and templateId bugs found no duplicate fix.

**What happened?**

The Anthropic REST API-key connection showed `Local stdio MCP
connections must use an approved templateId`. Health checks and catalog
discovery both fell through to the local stdio path. A REST connection
with an approved template could report success and expose the template's
catalog without a REST integration.

**Expected behavior**

Only local stdio connections use command templates. Unsupported
transports return an accurate HTTP 422 error. New Anthropic accounts use
the supported runtime authentication flow.

**Steps to reproduce**

1. Check out the test-only commit `924e6e85a` in a separate worktree and
install dependencies.
2. Run `pnpm exec vitest run packages/shared/src/app-definitions.test.ts
server/src/__tests__/tool-access-service.test.ts -t 'unsupported
REST|obsolete Anthropic'`.
3. The tests exercise saved Anthropic REST configuration and an
unsupported REST connection containing an approved stdio template. They
cover health checks and catalog discovery separately.
4. Run the same tests on the fix commit. They pass. The full affected
files also pass.

**Paperclip version or commit**

Reproduced against master `6cef9743c`.

**Deployment mode**

Server transport handling. Reproduced with an isolated embedded
PostgreSQL test database. No provider account or live credentials are
required.

## What Changed

- Restrict stdio health checks and tool discovery to `local_stdio`.
- Return and audit `tool_connection_transport_unsupported` with HTTP 422
for unsupported tool transports.
- Remove Anthropic's obsolete REST method from the generated catalog and
its durable ingestion source. Keep its subscription and API-key AI
methods.
- Cover the reported error, false-success case, rejected obsolete setup,
connection removal, and the UI's AI-account submission path.
- Replace impossible reconnect forms for removed methods with supported
setup, while preserving connection removal.
- Preserve AI-versus-tool intent isolation for legacy requests and
reject new unsupported Anthropic tool requests.
- Document recovery for existing unsupported connections.

## Verification

- Clean-worktree red/green: the same command failed all six regression
cases at `924e6e85a` and passed all six at `4d3de9de0`. The failing run
includes the reported templateId error.
- Green: all 555 tests across the six affected test files passed.
- Recovery UI red/green: three added cases failed before the recovery
fix and passed afterward; all 200 tests across setup, detail, and
advanced controls passed.
- After the recovery UI update, UI typecheck/build and token gates
passed again.
- `pnpm -r typecheck` — passed.
- `pnpm build` — passed.
- `pnpm check:token-gates` — passed.
- Catalog regeneration — passed with the documented
`PAPERCLIP_CONTENT_TEMPLATES` override for the local capture corpus.
- Full CI on `69fb31fd4` — passed all general and serialized test
shards, browser shards, typecheck, build, runner verification, and
canary dry run:
https://github.com/paperclipai/paperclip/actions/runs/34726975425.
- The local serial `pnpm test:run` was stopped after the fixture
correction superseded that run; full-suite verification above comes from
CI. All 555 affected tests passed locally, including all 17
connection-intent tests after the correction.
- Greptile — 5/5, successful check on final commit `69fb31fd4`, no
unresolved findings.
- No live Anthropic validation was performed. The UI regression uses a
fake key and a mocked AI-account response.

## Risks

Existing obsolete REST connections remain in needs-attention state.
Users must add an account through the supported flow and remove the old
connection. Credentials and grants are not transferred automatically.
Removal remains covered. The specialized AgentMail and Composio paths
keep their existing behavior. There are no schema or permission changes.

## Model Used

OpenAI GPT-6 through Codex. The exact serving model ID and
context-window capacity are not exposed in this session. Used reasoning,
code editing, shell tools, and test execution.

## 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-12 19:26:58 -05:00
Dotta 9e764359bc Integrate current master through work-folder PR 13345
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-09-12 19:05:34 -05:00
Dotta fc85a0c5ad Integrate current master through work-folder PR 13341
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-09-12 19:05:34 -05:00
Dotta cbedf6225f Integrate current master through work-folder PR 13337
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-09-12 19:05:34 -05:00
Dotta b450ece5f2 Integrate saved-message recovery with sandbox readiness fixes
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-09-12 19:05:34 -05:00
Dotta 0f6aa4555a Integrate current master through work-folder PR 13264
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-09-12 19:05:33 -05:00
Dotta 1c4750f97a Integrate current master through work-folder PR 13163
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-09-12 19:05:33 -05:00
Dotta 2f92d83b12 Integrate current master through work-folder PR 13048
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-09-12 19:05:33 -05:00
Dotta 547f16765e Integrate current master through work-folder PR 13090
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-09-12 19:05:33 -05:00
Dotta 38b1e87769 Integrate current master through work-folder PR 13040
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-09-12 19:05:33 -05:00
Dotta 1df42a1f05 Integrate current master through work-folder PR 13006
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-09-12 19:05:33 -05:00
Dotta 1180118830 Integrate current master through work-folder PR 13002
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-09-12 19:05:33 -05:00
Dotta e704e1c9ae
fix: keep AI subscription locks safe through transaction pooling (#13347)
## Thinking Path

> - Paperclip manages AI agents and their credentials.
> - AI Connections must preserve account ownership from login through
execution.
> - A subscription environment check can pass and leave a session
advisory lock on a pooled database backend.
> - The next execution then reports that the subscription is busy.
> - Onboarding can also lose its completion callback when the connection
list refreshes before the login poll.
> - This change keeps each credential lease in one transaction and keeps
the login controller mounted until completion.

## Linked Issues or Issue Description

Refs: #13247, #13248, #13344.

**What happened?**

A real hosted subscription login saved successfully and passed its
environment check. The first task then failed with an AI connection busy
error. A connection-list update could also leave onboarding on
Connecting.

**Expected behavior**

A completed environment check releases its credential lease. A saved
login completes onboarding without another sign-in.

**Steps to reproduce**

1. Run Paperclip with a transaction-pooling PostgreSQL proxy.
2. Connect a Claude subscription through onboarding and reuse it for an
agent.
3. Start a task after its environment check succeeds.
4. For the UI race, refresh the managed connection list before the login
completion poll.

## What Changed

- Hold the grant lock inside one transaction. Roll back on cleanup or
failed acquisition.
- Disable the lease transaction's idle timeout so long provider
executions retain the lock.
- Keep the onboarding login controller mounted while its authorization
URL is active; restore saved-account retry if later agent creation
fails.
- Add lock-lifetime and Claude/Codex completion-order regressions.
- Document the pooling requirement.

## Verification

- 104 focused connection and onboarding tests passed.
- Workspace typecheck, production build, Storybook build, and token
gates passed.
- All 34 latest-head checks are terminal: 32 passed and two Storybook
workflows skipped by their normal filters. CI covers all
server/workspace/serialized test shards, browser tests, typecheck,
build, runner verification, and canary packaging. The additional local
full-suite run is still in progress.
- Real browser sign-ins saved Claude and OpenAI subscriptions on both
new and existing staging stacks. On the patched new stack, both
providers completed tasks and immediate repeat executions with the same
saved accounts. Read-only database inspection confirmed live
transaction-scoped locks and no remaining locks after completion. On the
final deployed head, both shared accounts on the existing stack also
completed actual tasks. Both personal accounts passed a fresh
environment check followed immediately by execution after a deployment
restart.

## Risks

- Each active subscription reserves one database connection and holds an
otherwise idle transaction until cleanup. This is required to pin the
backend through a transaction pool.
- Old session locks from earlier versions may need operator cleanup
after active runs drain. This change does not bypass existing locks.
- No database migration, credential routing, or legacy authentication
change.

## Model Used

OpenAI GPT-6 in Codex, with code execution and browser tools. The exact
deployment model ID and context-window size are not exposed to this
task.

## 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-12 19:05:18 -05:00
Dotta 3bcbd7dab9 fix: preserve managed sessions in sandbox work folders
Keep managed account session fingerprints stable across temporary homes and
copy refreshed native Codex credentials through the actual CLI home. Handle
child stdin EPIPE without losing the authoritative exit result. Verify the
existing preview database upgrade and refresh the dedicated runner lock.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-09-12 18:38:13 -05:00
Dotta 3e0dae9952 Merge refreshed connector compatibility into task brief delivery
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-09-12 18:34:49 -05:00
Dotta 3c5340c109 Merge refreshed historical tests into connector session compatibility
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-09-12 18:34:36 -05:00
Dotta 950cb6e32c Merge refreshed session compatibility into historical upgrade tests
Preserve historical fixture bytes and expect the current 0277 work-folder migration.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-09-12 18:34:19 -05:00
Dotta f9b866c968 Merge refreshed recovery layer into session compatibility
Keep workspace and managed AI session metadata together, and load the renumbered work-folder migration in existing coverage.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-09-12 18:33:56 -05:00
Dotta 279c69fd79 Merge refreshed staging layer into remote recovery
Retain the current cancellation contract and apply both proven durable recovery test time budgets.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-09-12 18:33:25 -05:00
Dotta 65cbd327af Merge refreshed runtime layer into staging hardening
Preserve measured operations and managed AI setup, and repair trust-order and synthetic Git transport test fixtures without importing later cancellation behavior.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-09-12 18:32:05 -05:00
Dotta a3a30c1641 Carry isolated sidebar test mocks through runtime hardening
* codex/restack-13040-r121:
  Isolate sidebar preference route mocks before staging test layer

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-09-12 18:31:48 -05:00
Dotta da31dc3fc1 Carry isolated sidebar test mocks through Storybook layer
* codex/restack-13006-r121:
  Isolate sidebar preference route mocks before staging test layer

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-09-12 18:31:47 -05:00
Dotta f554c988c2 Isolate sidebar preference route mocks before staging test layer
Move the unchanged descendant test cleanup earlier to keep the staging layer below the review file limit.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-09-12 18:31:47 -05:00