Commit Graph
2042 Commits
Author SHA1 Message Date
Devin FoleyandPaperclip e2664b655b Merge upstream startup accounting proof and fixture isolation
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-10-03 23:21:21 -07:00
Devin FoleyandPaperclip 1dd6c03d2c Merge adapter startup accounting proof and test isolation
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-10-03 23:21:17 -07:00
Devin FoleyandPaperclip 065bf17ba3 fix: preserve proof of process adapter bootstrap failures
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-10-03 23:21:13 -07:00
Devin FoleyandPaperclip 2d30ee8868 Merge runtime test isolation fixes into adapter receipts
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-10-03 23:19:30 -07:00
Devin FoleyandPaperclip 1275ef8282 test: isolate runtime port claims and canonicalize fixture paths
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-10-03 23:19:25 -07:00
Devin FoleyandPaperclip 1fae0e7554 Merge reviewed credential write-back fix into accounting core
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-10-03 22:43:10 -07:00
Devin FoleyandPaperclip fc97e24392 fix: retain and retry contended credential write-back
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-10-03 22:31:28 -07:00
Devin FoleyandPaperclip 04bd774133 Merge quota deadline and revision fixes into accounting stack
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-10-03 22:10:39 -07:00
Devin FoleyandPaperclip 8bd5846ba0 fix: preserve OAuth refresh lifetime and quota revision caches
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-10-03 22:10:36 -07:00
Devin FoleyandPaperclip b2815ee3cd fix: retain failed native receipts and known attempted-run charges
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-10-03 21:51:37 -07:00
Devin FoleyandPaperclip a9c6f25b88 Merge bounded provider record accounting into core stack
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-10-03 21:45:30 -07:00
Devin FoleyandPaperclip c4f738d112 Merge bounded provider record accounting into quota stack
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-10-03 21:45:27 -07:00
Devin FoleyandPaperclip fb8b03a083 fix: bound accounting strings before buffering provider records
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-10-03 21:45:23 -07:00
Devin FoleyandPaperclip acba463d56 test: drain heartbeat finalizers before fixture teardown
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-10-03 21:43:43 -07:00
Devin FoleyandPaperclip cde30114b2 Merge credential and adapter review follow-ups into accounting stack
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-10-03 21:38:49 -07:00
Devin FoleyandPaperclip dfd62bd7e2 fix: recheck credential versions after waits and defer conflicting refreshes
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-10-03 21:38:46 -07:00
Devin FoleyandPaperclip beb28fef65 Merge full-stream accounting fixes into quota stack
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-10-03 21:33:57 -07:00
Devin FoleyandPaperclip 6e7168ac5c fix: retain full-stream usage and scope biller inference to its provider
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-10-03 21:33:54 -07:00
Devin FoleyandPaperclip 7cf8df553d fix: serialize managed credential refresh with reads and secret edits
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-10-03 21:30:51 -07:00
Devin FoleyandPaperclip 2e9b1de70e fix: preserve policy settings and initialize cancellation on demand
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-10-03 21:24:09 -07:00
Devin FoleyandPaperclip 482cdc5fa5 Merge adapter and quota review fixes into accounting stack
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-10-03 21:15:10 -07:00
Devin FoleyandPaperclip 05035f9f65 fix: address accounting recovery and budget review findings
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-10-03 21:15:10 -07:00
Devin FoleyandPaperclip feba1f926f Merge adapter timeout contract regression update
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-10-03 21:11:22 -07:00
Devin FoleyandPaperclip 14bc077440 test: distinguish unavailable Kimi prices from incomplete receipts
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-10-03 21:10:56 -07:00
Devin FoleyandPaperclip dce0c0f265 Merge reviewed quota and adapter fixes into durable accounting
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-10-03 21:06:51 -07:00
Devin FoleyandPaperclip bd377f0906 fix: recover managed quota credentials and preserve account displays
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-10-03 21:06:14 -07:00
Devin FoleyandPaperclip 2c29548c8c Merge reviewed adapter receipt fixes into account quota reporting
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-10-03 21:02:21 -07:00
Devin FoleyandPaperclip f056a4ae59 Merge test isolation review fixes into adapter receipts
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-10-03 20:59:55 -07:00
Devin FoleyandPaperclip 1885918563 test: preserve host port leases with isolated test homes
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-10-03 20:59:38 -07:00
Devin FoleyandPaperclip dc8d57e2a4 test: verify durable checkpoints through the final flush contract
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-10-02 17:47:50 -07:00
Devin FoleyandPaperclip c0aa8f879d fix: integrate reviewed adapter and quota contracts into accounting
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-10-02 17:45:27 -07:00
Devin FoleyandPaperclip 5137effc6f fix: integrate incremental usage checkpoints with quota reporting
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-10-02 17:45:26 -07:00
Devin FoleyandPaperclip 014810c58d fix: checkpoint every usage update with incremental protocol parsers
Use provider terminal evidence for completeness; an OpenCode successful EOF closes its step-based stream. Preserve immutable snapshots and propagate partial completeness through final results.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-10-02 17:45:06 -07:00
Devin FoleyandPaperclip 3250149305 fix: invalidate quota caches when personal credentials are disabled
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-10-02 17:37:20 -07:00
Devin FoleyandPaperclip c93ef478b3 fix: carry reviewed adapter checkpoints into quota reporting
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-10-02 17:34:12 -07:00
Devin FoleyandPaperclip e1c61054cc fix: settle interrupted usage and retain estimate provenance
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-10-02 17:33:13 -07:00
Devin FoleyandPaperclip f4100b256e fix: flush attempt receipts and surface checkpoint failures
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-10-02 17:27:02 -07:00
Devin FoleyandPaperclip 3ac5772c66 fix: isolate budget recovery and account supplemental run charges
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-10-02 17:15:39 -07:00
Devin FoleyandPaperclip 5997745d77 fix: carry quota review fixes into durable accounting
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-10-02 17:01:54 -07:00
Devin FoleyandPaperclip 5825f92c62 fix: retain quota caches across reads and cancel expired probes
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-10-02 17:01:49 -07:00
Devin FoleyandPaperclip ffd09c80e6 test: carry reviewed discovery checks into quota reporting
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-10-02 16:53:20 -07:00
Devin FoleyandPaperclip 3e77a70622 test: carry authored-file review coverage into adapter changes
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-10-02 16:53:17 -07:00
Devin FoleyandPaperclip e8f389beb6 test: exercise authored-file discovery through a real Git index
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-10-02 16:52:55 -07:00
Devin FoleyandPaperclip 4154638e71 fix: make run accounting durable and budget updates atomic
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-10-02 16:45:54 -07:00
Devin FoleyandPaperclip f9163760b9 fix: scope subscription quota reports to authorized company accounts
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-10-02 16:41:32 -07:00
Devin FoleyandPaperclip b827836835 fix: checkpoint adapter usage and preserve unknown prices
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-10-02 16:39:07 -07:00
Devin FoleyandPaperclip 7eb38f881e test: isolate accounting fixtures and include all adapter suites
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-10-02 16:35:32 -07:00
Devin FoleyandPaperclip 4abff286c2 fix: retain resolved ACP execution timeout metadata (#14986)
## Thinking Path

> - Paperclip manages agent work through adapters and heartbeat runs.
> - ACP adapters resolve a timeout for the selected execution target.
> - An untouched sandbox timeout uses a four-hour default.
> - Heartbeat finalization rebuilt the metadata from the stored zero.
> - This made a timed-out sandbox run report an effective timeout of
zero.
> - This change retains the adapter's resolved policy for accurate run
diagnostics.

## Linked Issues or Issue Description

**What happened?**

ACP sandbox runs with `timeoutSec: 0` use the four-hour default. Their
terminal metadata reports `effectiveTimeoutSec: 0` and `timeoutSource:
config` because heartbeat finalization only reads the stored agent
configuration.

**Expected behavior**

The result must report the policy the adapter used: `14400` and
`sandbox_default`. Explicit limits, fractional limits, explicit
unlimited overrides, and local defaults must keep their resolved values.

**Steps to reproduce**

Run an ACP adapter on a sandbox target with `timeoutSec: 0`. Compare the
start log's four-hour policy with the terminal result's effective
timeout. The new tests exercise the adapter result and the heartbeat
metadata merge without waiting four hours.

**Paperclip version or commit**

Reproduced from `6eaf218924f0a89faf1c02eb0d6877a6c5c8a2cb`.

**Deployment mode**

Self-hosted server with an ACP sandbox execution target.

Searched open timeout and metadata issues and PRs. Related #14804
exposes timeout configuration in forms; #14496 proposes a default
policy; #14833 addresses CLI session retention. This PR changes only ACP
result metadata.

## What Changed

- Retain the resolved timeout in the ACP result after settlement.
- Use validated adapter resolution when merging terminal timeout
metadata. Preserve config fallbacks for older adapters and the HTTP
millisecond policy.
- Test sandbox defaults, explicit and fractional limits, explicit
unlimited overrides, local defaults, malformed metadata, and unchanged
cancellation fields.
- Document the result fields and their meaning.

## Verification

- `pnpm -r typecheck` passed.
- `pnpm build` passed.
- Stop metadata tests: 23 passed.
- Reporter and diagnostic suites: 84 passed; two real-Sentry-SDK tests
skipped because the optional SDK is not installed.
- ACP engine suite: all 206 tests passed with a deterministic local
`gemini --version` shim. Ambient host CLI probes made the existing
Gemini session-resume fixture intermittent (one assertion failure in
each of two broad runs); an isolated 15-case rerun and the clean-base
206-test suite also passed. No assertion or timeout was changed.
- `pnpm test:run` is in progress. This PR does not claim a complete
local suite pass.
- Independent review found no blocking issues. The tests cover real
adapter emission and the real metadata merge separately.

## Risks

Low runtime risk: this changes result diagnostics. It does not change
timeout values, cancellation acknowledgement, cleanup, checkpoint
safety, retries, or provider operations. It does not fix the cause of a
quiet or long-running tool. Older stored results are not rewritten. The
new source values apply only when an adapter returns a valid resolution.

## Model Used

OpenAI GPT-6 with reasoning, repository inspection, code editing, and
test execution. The deployment-specific 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
- [ ] 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
- [ ] 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-10-02 16:09:36 -07:00
DottaandPaperclip 862a5758ba fix(agents): reduce hiring templates to role descriptions (#14985)
## Thinking Path

> - Paperclip is the open source app people use to manage AI agents for work.
> - New agents receive role instructions from onboarding, the hiring skill, or a team package.
> - These sources repeat harness procedures and impose generic work policies.
> - They can crowd out the task and the harness instructions.
> - This pull request reduces those sources to short role descriptions.
> - It preserves configuration, skills, authentication, reporting lines, and approval controls.
> - The benefit is less repeated instruction text with explicit coverage for the default hiring path.

## Linked Issues or Issue Description

Refs #3307. The CEO template can impose a fixed delegation route instead of letting the agent choose how to fulfill the request. This change removes that route. It does not implement autonomous goal selection.

Related work: #14920 preserves stock Codex base instructions. #14948 reduces the generic manual and shared runtime prompts. #14961 improves native completion-tool descriptions. This PR is separate from those changes.

## What Changed

- Select only the short CEO `AGENTS.md` for new default CEO bundles. Keep the three former companion files as compatibility assets.
- Reduce the first-agent chief-of-staff prompt and coder, QA, UX, and security role examples.
- Reduce seven bundled team role bodies. Preserve their role, reporting, and skill metadata. Regenerate the catalog.
- Make hiring examples optional. Replace the long generic role manual with short role drafting guidance. Preserve explicit requester instructions.
- Add configuration and import coverage for native and legacy managed bundles, custom instructions, first-agent rendering, and catalog contents.
- Add an explicit-only hiring eval that starts from the production CEO default and checks one coder hire, independently computed JSON output, saved instructions, and worker reuse.
- Include the full prompt comparison and a separate three-request drafting simulation. Neither is a live provider comparison.

Prompt differences: [before and after](doc/plans/2026-10-02-hiring-template-prompt-diff.md). The CEO default falls from 1,897 to 20 words. The coder example falls from 652 to 18 words. Word counts describe instruction size, not outcome quality or billing.

## Verification

- PASS: 99 focused server tests and eight shipped-catalog tests.
- PASS: catalog generation and validation for four shipped teams.
- PASS: hiring skill validation.
- PASS: `pnpm -r typecheck`.
- PASS: `pnpm build`.
- INCOMPLETE: the full local `pnpm test:run` was stopped before rebase. Its original log is retained. This is not a completed full-suite pass. The full current-head GitHub CI workflow passed: https://github.com/paperclipai/paperclip/actions/runs/37073372419.
- PASS: `pnpm test:e2e:runner:typecheck` and `pnpm test:e2e:runner:unit` (63 files / 843 tests).
- PASS: discovery for the two new hiring cells, 50 existing everyday cells, and the full 438-cell catalog.
- PASS after rebase: 99 server tests, 11 catalog tests, 62 selected E2E support tests, and the E2E typecheck.
- PASS: all current-head PR checks at `57dcee147ed0b2d2e3cc657cd9e50fb16bf9ec25`: 51 successful check runs, two intentional Storybook skips, and successful Snyk status. Fresh Greptile is 5/5 with zero unresolved threads.
- PENDING follow-up: matched live hiring runs on frozen integration refs. No live outcome-quality or non-regression result is claimed from the configuration checks or this merge.

The new suite has two local native cells: Codex and ACPX Claude. It expects five provider turns per cell. It compares source-derived bundles, so the historical long templates remain admissible. Missing successful source-read receipts make a pair uncomparable. They do not establish a behavior regression or equivalence.

## Risks

- New default roles have fewer prescribed procedures. Live checks must determine whether a removed instruction was needed for an outcome.
- Existing custom and saved bundles keep their contents. The retained companion assets avoid a source-file compatibility break.
- Specialized Summarizer, Reflection Coach, and Wiki Maintainer prompts remain unchanged. Their product contracts need separate review.
- The generic non-CEO fallback reduction is in #14948. This PR alone does not provide its eight-word fallback.
- Configuration tests and drafting simulations do not establish live outcome quality. QA, UX, security, and chief-of-staff hiring behavior remain outside the new two-cell comparison.

> For core feature work, check [`ROADMAP.md`](ROADMAP.md) first and discuss it in `#dev` before opening the PR. Feature PRs that overlap with planned core work may need to be redirected — check the roadmap first. See `CONTRIBUTING.md`.

## Model Used

OpenAI Codex, based on GPT-6, with reasoning, code editing, shell tools, and delegated verification. The runtime does not expose the exact deployment model 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-10-02 17:56:42 -05:00
Devin FoleyandPaperclip 22cea6b2e6 fix: bound sandbox bridge waits and flag silent runs sooner (#14979)
## Thinking Path

> - Paperclip is the open source app people use to manage AI agents for
work.
> - Sandbox agents exchange input and output through bridge control
commands.
> - A provider can stop responding to a command even when it receives a
timeout.
> - These small commands can inherit a four-hour agent lifetime and
block input or teardown.
> - The board also calls a silent run healthy for the first hour.
> - This pull request bounds bridge control waits and surfaces silence
sooner.

## Linked Issues or Issue Description

**What happened?**

A sandbox run can remain active when a bridge control command never
returns. The shared helper passes a timeout to the provider but does not
enforce it on the host. It also accepts the agent's hours-long timeout.
Output silence remains `ok` for an hour and becomes `critical` only
after four hours.

**Expected behavior**

Bound short bridge operations even if the provider never settles. Report
failed input delivery through the existing shutdown path. Warn after
five silent minutes and escalate after fifteen. Keep normal agent
command limits and require verified termination before releasing
execution ownership.

**Steps to reproduce**

1. Use a sandbox runner whose bridge read or input-upload promise never
settles.
2. Set its configured timeout to four hours.
3. Observe that the old queue client never returns or rejects.
4. Inspect a running task with 35 minutes of output silence. The old
summary still reports `ok`.

**Paperclip version or commit**

Base commit `d6d88b9de2`.

**Deployment mode**

Self-hosted server with sandbox execution.

**Agent adapter(s) involved**

Shared command-managed sandbox bridge, including Codex ACP sessions. The
informational silence thresholds apply to active runs across adapters.

Related: #14889 recovers stalled Daytona output streams; #14485 retries
explicit gateway failures during input delivery. This change bounds
short control operations whose provider promises never settle. It does
not add tool replay or automatic cancellation for output silence. #6297
proposes configurable per-agent silence thresholds; this patch only
changes the existing defaults.

## What Changed

- Enforce at most 30 seconds per bridge control shell command on the
host and provider, including callback startup and shutdown,
process-session launch, and payload setup. Preserve shorter configured
deadlines and launch environments.
- Keep the long-lived agent command outside this deadline. Use a fixed
timeout diagnostic without command payloads.
- Surface suspicious output silence after five minutes and critical
silence after fifteen minutes.
- Decouple the shared-workspace holder cutoff from warning thresholds
and preserve its existing one-hour value.
- Add regressions for hung reads, a late upload response, failed input
delivery, exact warning boundaries, and fresh output clearing warnings.
- Update the adapter guide and execution contract.

## Verification

- The three new queue-client regressions fail on the unchanged base and
pass with this patch.
- Final callback bridge and sandbox session suites: 214 passed. These
cover hung reads, writes, startup, shutdown, process-session launch,
payload setup, and the separate long-running agent limit.
- Stdin ordering and shutdown suite: 56 passed after the lifecycle
change.
- Daytona and watchdog coverage passed in the earlier focused runs.
Across the focused suites, 602 distinct tests pass.
- `pnpm -r typecheck` and `pnpm build`: passed. Server and adapter
typecheck/build also passed after their respective follow-up changes.
- `pnpm test:run`: attempted and stopped after known local failures.
Four chat/email cases used an external ancestor skill path, three
skill-cache cases failed on macOS, and one wakeup case timed out. The
wakeup case passes alone (1 passed, 27 skipped). This run spanned the
workspace-cutoff follow-up and also failed its new holder case; a fresh
final-head workspace suite passes all 19 tests. The interrupted run is
not a full local-suite pass or final-head verification.
- A filesystem queue-drain test failed once during the lifecycle rerun
and passed on the complete two-suite rerun. It uses the filesystem
client, outside the changed command-runner path.
- Complete CI on `ff2212c235`: 53 successful checks and two expected
skips, including the full test suite and canary packaging dry run. No
failed or pending checks.
- Greptile reviewed `ff2212c235` at 5/5. All review findings are
addressed, no threads remain unresolved, and the branch has no merge
conflicts with `master`.
- `git diff --check` and a scan of added text for secrets and private
identifiers passed.

## Risks

- A bridge control operation that needs more than 30 seconds now fails,
even if the caller selected a longer run lifetime. Agent commands retain
their own limits.
- Timing out a provider promise does not cancel the remote operation or
prove it stopped. Existing execution settlement still owns termination
verification. No uncertain tool action is replayed.
- Quiet healthy runs display warnings sooner. Existing snooze, continue,
and false-positive dismissal controls still apply. Silence alone does
not cancel a run, create review work, or change assignments.
- No schema or API shape change.

## Model Used

OpenAI GPT-6 through Codex, with tool use and code execution. The exact
serving model ID and context window 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 change-specific 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-10-02 15:29:41 -07:00