Commit Graph
5310 Commits
Author SHA1 Message Date
DottaandPaperclip 5909bfac9f docs: preserve upstream integration verification and submission gaps
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-10-11 07:13:44 -05:00
Dotta add1bea3ad Merge branch 'codex/boat-environment-core' into codex/boat-environment
* codex/boat-environment-core:
  perf(chat): stop polling provider action and session sync queues (#15822)
  refactor(heartbeat): extract environment selection (#15825)
  perf(runner): compile the TypeScript surface once per build (#15853)
2026-10-11 07:12:45 -05:00
DottaandPaperclip 0eac0a26e9 Merge pinned upstream environment selection into Boat feature
Integrate e733bddc45 while preserving Boat admission deferral and ownership fences. Verify agent and instance Boat selection without acquiring a lease.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-10-11 07:12:16 -05:00
DottaandPaperclip f782ae12d5 docs: record verified ACPX diagnostic correction
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-10-11 06:58:13 -05:00
Dotta da6d50f26d Merge branch 'codex/boat-environment-core' into codex/boat-environment
* codex/boat-environment-core:
  Preserve module fence diagnostics through ACPX stderr summaries
2026-10-11 06:57:51 -05:00
DottaandPaperclip 1f66cac0f8 Preserve module fence diagnostics through ACPX stderr summaries
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-10-11 06:57:22 -05:00
DottaandPaperclip 7b6cef9e6b docs: record local Boat lifecycle pass and staging resume failure
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-10-11 06:55:24 -05:00
DottaandPaperclip e733bddc45 perf(chat): stop polling provider action and session sync queues (#15822)
## Thinking Path

> - Paperclip is the open source app people use to manage AI agents for
work.
> - Chat stores pending provider actions in durable database rows.
> - Three action queues still scan every second when empty.
> - These scans keep idle databases active.
> - This pull request wakes those queues after a commit or at their next
deadline.
> - Empty queues stop querying while existing recovery rules remain in
place.

## Linked Issues or Issue Description

Refs #15808, #15802, #15625. Related sleep work: #15750, #15757.

**What existing behavior does this improve?**

Provider messages and notices, accepted GitHub webhook receipts, and
Slack session status synchronization.

**Current behavior**

Chat maintenance scans these three queues every second. It also rechecks
paused Slack sync rows every 30 seconds.

**Proposed behavior**

Reuse the transaction-aware action workers and existing chat_actions
rows. Wake after commits. Restore unfinished work on startup. Use stored
retry and stale-claim deadlines. Stop scanning when empty. Park paused
Slack sync rows until an endpoint change.

## What Changed

- Add three topics to the existing action worker registration. No
tables, migrations, triggers, or external services.
- Signal producers, claims, retry updates, terminal settlements, and
operator resolution inside their owning transaction. Provider I/O
remains outside transactions.
- Share pending-state and deadline predicates between dispatch and
scheduling. Exclude terminal history and uncertain provider sends.
- Preserve GitHub receipt attempt fences and provider-send quarantine.
Preserve Slack's 30-minute refresh while a session is processing.
- Remove these workers from periodic app maintenance. Update the sleep
inventory and add regression coverage.

## Verification

- Passed: 13 focused tests across scheduler, app wiring, and real
PostgreSQL integration. Covers actual commit wakes with deferred fast
paths disabled, GitHub retries and startup recovery, stale-send
quarantine, Slack publication-to-sync delivery, paused deadlines, and
idle queues.
- Passed: pnpm typecheck.
- Passed: full chat integration and related coordinator suites, **1,274
tests across five files**.
- Passed: pnpm build.
- Greptile: **5/5**, no actionable findings, completed on
`dc284cd275e5f6df624d60b27954421f2bcdbee2`.
- Hosted CI: **54 checks passed**, two intentionally skipped Storybook
checks, no failures or pending checks on
`dc284cd275e5f6df624d60b27954421f2bcdbee2`.

Provider responses are simulated. PostgreSQL, transactions, service
dispatch, and scheduling are real. No live Slack or GitHub App was used.

## Risks

- Writers must emit the existing process-local transaction signal.
Independent database clients and direct SQL still need explicit
integration or startup recovery.
- Accepted GitHub receipts are covered. Finding callbacks GitHub never
delivered still uses the separate provider recovery lane.
- Other chat maintenance and persistent transports still run. This does
not establish whole-instance sleep.
- Existing claim, revision, credential, and authorization checks remain
authoritative during concurrent foreground and scheduled dispatch.

## Model Used

OpenAI Codex (GPT-6), with repository inspection, code execution, and
automated tests.

## 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>
canary/v2026.1011.0-canary.7
2026-10-11 06:08:05 -05:00
DottaandPaperclip 30e338fba6 refactor(heartbeat): extract environment selection (#15825)
## Thinking Path

> - Paperclip is the open source app people use to manage AI agents for
work.
> - Heartbeat execution selects an environment before it prepares a
workspace and starts an agent.
> - Workspace preparation now has its own module, but its selection
policy still occupies the executor.
> - Environment defaults, recovery bindings, chat isolation, and
workspace contention must retain their order.
> - This pull request moves that selection phase behind one typed
function.
> - The executor keeps dispatch gates and lease cleanup. Tests cover the
public path and the new boundary.

## Linked Issues or Issue Description

Refs #15807. This continues the heartbeat extraction series after
workspace preparation.

**Current behavior**

The 5,599-line heartbeat service contains a 301-line environment
selection phase inside run execution.

**Proposed behavior**

Move that phase to `heartbeat/environment-selection.ts`. Keep the same
policy, statement order, errors, and public exports.

**Reason and benefit**

Readers can find selection policy in one module and follow the
executor's phases without reading each policy branch.

## What Changed

- Add `selectHeartbeatEnvironment` with typed run, task, policy,
configuration, and service inputs. Return the values needed by
configuration and workspace preparation.
- Preserve native recovery bindings, environment precedence, managed
sandbox enforcement, Kubernetes provisioning, native chat isolation, and
shared workspace contention.
- Reduce `heartbeat.ts` from 5,599 lines / 234,599 bytes to 5,314 lines
/ 220,784 bytes. The new module is 402 lines / 18,215 bytes.
- Add six public-path characterization cases before moving production
code and six boundary cases. Repair plugin-test teardown to drain active
execution and call the database cleanup helper.
- Assert the selected local environment in the browser fixture's real
worker and document the new boundary.

## Verification

- Before the move: 71 tests passed, including all six new public-path
cases. Three plugin tests skipped when the host could not start their
database probe.
- After the move: all 112 focused tests passed across eight files, with
no skips. These cover environment policy, local and plugin execution,
contention, recovery bindings, workspace preparation, chat isolation,
and low-trust directories.
- Passed `pnpm -r typecheck` and `pnpm build`.
- A normalized TypeScript AST comparison confirms the 301 moved lines
and remaining executor statements are unchanged, apart from the new call
and imports.
- Browser acceptance: the task UI recovered automatically and the worker
verified its selected local environment, preserved uncommitted files,
and completed the task. The persistent-failure case passed in isolation:
three total runs, then a blocked task that remained blocked after
reload.
- The first persistent-failure browser attempt missed the retry banner
within five seconds, despite a persisted scheduled retry. Its unchanged
isolated rerun passed. The trace is retained; the intermittent UI
failure is not yet attributed to a root cause. No assertion or timeout
was relaxed.
- Greptile reviewed `20953dd164decb565bc8d85081aad31a23fd33e5`: 5/5, no
actionable findings.
- Hosted CI passed on `20953dd164decb565bc8d85081aad31a23fd33e5`: 52
successful checks and two intentionally skipped Storybook checks, with
no pending or failing checks. This includes all general and serialized
test groups, Runner verification, eight browser shards, typecheck, and
build.
- The duplicate local `pnpm test:run` was interrupted after hosted CI
completed. It is not reported as a local full-suite pass. Local
completed checks are the 112 focused tests, typecheck, build, and
browser cases described above.

## Risks

- This selection phase enforces execution restrictions. A wrong input or
import could select the wrong environment or change retry behavior.
Public-path tests cover refusal, redirect, contention, and dispatch;
boundary tests cover recovery and isolation.
- The helper can provision a managed environment row and add concurrency
notes to the supplied task context. It acquires no execution lease. The
executor retains its catch/finally boundaries and resource ownership.
- Kubernetes selection is tested with real database state and bootstrap
settings. These checks do not claim execution against a live Kubernetes
cluster or hosted sandbox provider.
- No schema, migration, API contract, or intended behavior change.

## Model Used

OpenAI Codex (GPT-6), with repository inspection, code editing, compiler
checks, database integration tests, and browser automation. The exact
serving model ID and context-window size are not exposed in this
session.

## 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>
canary/v2026.1011.0-canary.6
2026-10-11 06:04:31 -05:00
Dotta 4d2a2394bc docs: record staging module rejection and diagnostic qualification 2026-10-11 06:01:48 -05:00
Dotta dbec6e9f7b Merge branch 'codex/boat-environment-core' into codex/boat-environment
* codex/boat-environment-core:
  diagnostics: identify closed provider module rejection fences
2026-10-11 06:00:29 -05:00
Dotta 8f62eef8f1 diagnostics: identify closed provider module rejection fences 2026-10-11 06:00:00 -05:00
Dotta 03ffe0a02a docs: record Boat local lifecycle and staging qualification results 2026-10-11 05:57:05 -05:00
Dotta dc6ac92f7e Record concurrent Boat admission and embedded desktop acceptance 2026-10-11 04:54:31 -05:00
Dotta 4809c1b724 Surface computer disconnect failures after closing the panel 2026-10-11 04:53:11 -05:00
Dotta 9eb1424f4e docs: record reviewed loader continuity fix and current acceptance boundary 2026-10-11 04:34:08 -05:00
Dotta 17b0910b80 Merge reviewed dependency read continuity correction
* codex/boat-environment-core:
  fix: verify dependency read continuity after ctime hydration
2026-10-11 04:32:20 -05:00
Dotta 034311fe11 docs: record settled Boat lifecycle failures and viewer evidence 2026-10-11 04:32:20 -05:00
Dotta 8e8999d681 fix: verify dependency read continuity after ctime hydration 2026-10-11 04:31:53 -05:00
Dotta 35de9f0bae docs: preserve settled Boat lifecycle and startup fix evidence 2026-10-11 04:12:45 -05:00
Dotta 4278c25e3a Merge guarded provider fatal-import settlement fix
* commit '1ab3cb94e036f5de43e4bad9fd4d345054e8763c':
  fix: terminate guarded providers on fatal module import
2026-10-11 04:10:05 -05:00
Dotta 1ab3cb94e0 fix: terminate guarded providers on fatal module import 2026-10-11 04:09:40 -05:00
Dotta e2e62a9d54 Merge shared Boat readiness correction
* commit '72042f165cbc5bfd10d3b4d3d8bcf9cced2dfcdc':
  fix(boat): coalesce concurrent readiness requests
2026-10-11 04:04:45 -05:00
Dotta 72042f165c fix(boat): coalesce concurrent readiness requests 2026-10-11 04:03:52 -05:00
Dotta f3c6034583 docs: record Boat staging warm and sibling Stop evidence 2026-10-11 03:58:43 -05:00
Dotta 06906ab358 Merge branch 'codex/boat-environment-core' into codex/boat-environment
* codex/boat-environment-core:
  test: synchronize signoff retries and touch geometry
2026-10-11 03:43:07 -05:00
Dotta e3b12138c6 test: synchronize signoff retries and touch geometry 2026-10-11 03:42:36 -05:00
Dotta d983582fd7 Merge branch 'codex/boat-environment-core' into codex/boat-environment
* codex/boat-environment-core:
  Diagnose artifact upload phases with opt-in bounded records
2026-10-11 03:28:13 -05:00
Dotta 32b092f5c4 Record upload failure and warm-owner correction evidence 2026-10-11 03:28:13 -05:00
Dotta 4e489a1014 Diagnose artifact upload phases with opt-in bounded records 2026-10-11 03:27:30 -05:00
Dotta 2a5eca4220 Merge branch 'codex/boat-environment-core' into codex/boat-environment
* codex/boat-environment-core:
  fix: expose computer retirement grace through module boundary
2026-10-11 03:08:47 -05:00
Dotta 086a9dbbd8 fix: expose computer retirement grace through module boundary 2026-10-11 03:08:05 -05:00
Dotta e2c390dd04 Merge branch 'codex/boat-environment-core' into codex/boat-environment
* codex/boat-environment-core:
  fix: preserve authoritative warm computers during orphan lease sweep
  fix: share Boat upload capacity before command admission
2026-10-11 03:01:30 -05:00
Dotta d14578ad13 fix: preserve authoritative warm computers during orphan lease sweep 2026-10-11 03:00:55 -05:00
Dotta 8198c9a571 fix: share Boat upload capacity before command admission 2026-10-11 02:59:57 -05:00
Dotta e1de8e6c8f docs: record Boat staging computer and warm preview qualification 2026-10-11 02:55:57 -05:00
Dotta ce639505e1 Merge branch 'codex/boat-environment-core' into codex/boat-environment
* codex/boat-environment-core:
  Diagnose deferred ACPX turn admission with closed phases
2026-10-11 02:26:43 -05:00
Dotta 86c1aa2b0c Diagnose deferred ACPX turn admission with closed phases 2026-10-11 02:25:56 -05:00
Dotta b3855f10b4 docs: record Boat staging HMR and Claude restore boundary 2026-10-11 02:20:05 -05:00
Dotta 26542bb9d0 Merge branch 'codex/boat-environment-core' into codex/boat-environment
* codex/boat-environment-core:
  Avoid duplicate diagnostics for immediate native session close failure
2026-10-11 01:45:08 -05:00
Dotta b1030f6233 Avoid duplicate diagnostics for immediate native session close failure 2026-10-11 01:45:01 -05:00
Dotta 0611095554 Merge branch 'codex/boat-environment-core' into codex/boat-environment
* codex/boat-environment-core:
  Share bounded artifact verification for ACP command and runtime
2026-10-11 01:41:15 -05:00
Dotta 16f1c67531 Share bounded artifact verification for ACP command and runtime 2026-10-11 01:40:46 -05:00
Dotta 3c20c6b677 docs: preserve Boat JavaScript restore verification failure 2026-10-11 01:39:08 -05:00
Dotta a7425b8d0c Merge commit '3812ccfebb43836656d3fb7375d73d85fd5fe9e9' into codex/boat-environment
* commit '3812ccfebb43836656d3fb7375d73d85fd5fe9e9':
  Record scoped warm retirement failure diagnostics
2026-10-11 01:29:46 -05:00
Dotta 3812ccfebb Record scoped warm retirement failure diagnostics 2026-10-11 01:29:37 -05:00
Dotta 3eeca3acfa docs: record Boat restore verification and live cleanup evidence 2026-10-11 01:22:53 -05:00
Dotta 818f94594d Merge commit '6c2a0a2bd86ef411bbc0e273b179d5bc4f1a3733' into codex/boat-environment
* commit '6c2a0a2bd86ef411bbc0e273b179d5bc4f1a3733':
  Reverify qualified runtime after ctime-only hydration
2026-10-11 00:59:44 -05:00
Dotta 6c2a0a2bd8 Reverify qualified runtime after ctime-only hydration 2026-10-11 00:58:56 -05:00
Dotta cbcc7b3fdd docs: record Boat staging regression and restore diagnosis 2026-10-11 00:54:39 -05:00