Commit Graph
4732 Commits
Author SHA1 Message Date
Dotta 1edb2173a9 Merge branch 'codex/runner-rich-acp' into codex/runner-cursor-acp
* codex/runner-rich-acp:
  fix(runner): pin patched Node for remote provider packs
2026-09-28 17:36:01 -05:00
Dotta 3a5637732b fix(runner): pin patched Node for remote provider packs 2026-09-28 17:35:56 -05:00
Dotta fa02f57a82 Merge branch 'codex/runner-rich-acp' into codex/runner-cursor-acp
* codex/runner-rich-acp:
  fix(runner): admit versioned ACP dependency repairs
2026-09-28 17:24:00 -05:00
Dotta e6163e16a2 fix(runner): admit versioned ACP dependency repairs 2026-09-28 17:23:57 -05:00
DottaandPaperclip bdbbd4cbfc Document Cursor prompt-image implementation gap
Distinguish the native image capability advertisement from the runner's text-only turn contract and assign the missing attachment conversion an explicit P1 follow-up.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-09-28 16:55:53 -05:00
Dotta 2fa142d665 Merge branch 'codex/runner-rich-acp' into codex/runner-cursor-acp
* codex/runner-rich-acp:
  Admit the versioned Pi invocation identity profile
  test(runner): preserve prepared OpenCode failure diagnostics
2026-09-28 16:49:42 -05:00
Dotta 1545c76922 Admit the versioned Pi invocation identity profile
Accept profile version 4 at the closed snapshot boundary while preserving exact runtime identity checks. Reject unsupported and malformed versions.
2026-09-28 16:49:29 -05:00
DottaandPaperclip b8a42fd91a test(runner): preserve prepared OpenCode failure diagnostics
Retain primary and cleanup errors together without relaxing durable close checks. Include only bounded process facts and cover cleanup-only failures and credential-safe diagnostics.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-09-28 16:45:37 -05:00
DottaandPaperclip d2e271338b Integrate shared ACP MCP display identity repair
Co-Authored-By: Paperclip <noreply@paperclip.ing>

* codex/runner-rich-acp:
  Preserve MCP tool display identity in native ACP events
2026-09-28 16:36:04 -05:00
DottaandPaperclip 5aa02662b3 Preserve MCP tool display identity in native ACP events
Parse ACP MCP namespace and tool names consistently with the TypeScript projection so persisted plan writes anchor to their actual tool boundary. Keep authority and raw argument handling unchanged.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-09-28 16:34:34 -05:00
DottaandPaperclip 3525dce1ad Integrate final shared profile contracts and verification fixes
Preserve the independently verified Cursor dependency lock while accepting the prerequisite profile-v3 parser and portable fixture corrections.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-09-28 16:23:48 -05:00
DottaandPaperclip 915adc4d33 Keep real Git streaming stress coverage portable on macOS
Retain forty thousand files and four filename lanes above 32 MiB while fitting the macOS path limit. Allow 300 seconds for real filesystem staging/deletion on macOS and retain the 180-second bound elsewhere.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-09-28 16:22:19 -05:00
DottaandPaperclip ee0836203f Refresh reviewed Daytona workspace resolution pin
Record the independently reproduced resolved lock digest after the integrated mainline dependency changes. Candidate image builds continue to supply their own verified lock digest.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-09-28 16:11:34 -05:00
DottaandPaperclip a88056eee9 Stabilize feedback route mocks during serialized validation
Keep the route service factories bound to hoisted test doubles and assert exact calls while preserving both company-boundary 404 checks.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-09-28 16:09:38 -05:00
DottaandPaperclip f676c9d2c8 docs(runner): record offline Cursor Linux image verification
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-09-28 16:06:05 -05:00
DottaandPaperclip e8dee462e2 Admit versioned ACP profile snapshots for the Pi error contract
Allow profile version 3 without changing existing provider identities. Reject unsupported and malformed versions, and retain exact runtime identity verification.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-09-28 16:01:36 -05:00
DottaandPaperclip 72f8887709 docs(runner): record Cursor native EOF lifecycle limit
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-09-28 15:57:45 -05:00
DottaandPaperclip e450bc4346 test(runner): retain Cursor native denial and billing evidence
Preserve the original grader failure and assess the same captured turn through exact tool-call correlation without another prompt.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-09-28 15:55:37 -05:00
DottaandPaperclip cb63ccd1d0 test(runner): add bounded native Cursor denial qualification
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-09-28 15:51:38 -05:00
DottaandPaperclip 829686b0c8 Record successful serialized Cursor question restart recovery
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-09-28 15:46:51 -05:00
DottaandPaperclip d35b83074a Retain native Cursor question availability qualification failure
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-09-28 15:41:32 -05:00
DottaandPaperclip d9321659d4 Refresh Cursor packaged launch proof after shared integration
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-09-28 15:19:19 -05:00
DottaandPaperclip 25fb1b5b31 Pin final Cursor lock graph and reconcile bounded product usage
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-09-28 15:17:33 -05:00
DottaandPaperclip 78360fa55a Record Cursor plan approval and retained restart infrastructure failure
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-09-28 15:16:01 -05:00
DottaandPaperclip 9d4f9fbe8a Retain merged Cursor pack and daemon qualification provenance
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-09-28 15:16:01 -05:00
DottaandPaperclip d0832d3ffa Refresh merged Cursor patch and immutable dependency pin
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-09-28 15:16:01 -05:00
DottaandPaperclip 46bf05c67f Retain Cursor file validation and artifact qualification evidence
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-09-28 15:16:01 -05:00
DottaandPaperclip b6b4ee2055 Retain Cursor local Product completion and billing evidence
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-09-28 15:16:01 -05:00
DottaandPaperclip 93bdd456b5 Retain passing authenticated Cursor protocol qualification evidence
Record exact source and fresh daemon identities, successful native MCP task-context calls, included dashboard usage with unknown native receipt, and the earlier denied attempt without an automatic retry.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-09-28 15:16:00 -05:00
DottaandPaperclip 73363e5be5 Record Cursor entitlement attempt and explicit usage gaps
Retain the initial denied canonical attempt without treating absent usage as zero; document the typed native error dropped by Cursor ACP and replacement-account model discovery.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-09-28 15:16:00 -05:00
DottaandPaperclip eda4b7e8cb Record authenticated Cursor model and configuration discovery
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-09-28 15:16:00 -05:00
DottaandPaperclip 2897bd971e Refresh Cursor pack proof after final launch credential fix
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-09-28 15:16:00 -05:00
DottaandPaperclip e5fa1cff1f Retain Cursor pack proof after credential and receipt review fixes
Record the exact reviewed runtime source, clean dependency resolution, pack and native closure digests, and a credential-free launch through the generic installation registry. Keep authenticated and Daytona qualification explicitly pending.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-09-28 15:16:00 -05:00
DottaandPaperclip eb0f43c45a Retain final rebased Cursor pack and registry launch proof
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-09-28 15:16:00 -05:00
DottaandPaperclip 4235e35070 Record Cursor candidate pack proof and exact remaining rich event gaps
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-09-28 15:16:00 -05:00
DottaandPaperclip 747ca61ad0 Bind Cursor candidate assets to Daytona image content
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-09-28 15:16:00 -05:00
DottaandPaperclip 8b4536f2b2 Wire the pinned Cursor candidate into rich ACP transport and packs
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-09-28 15:16:00 -05:00
DottaandPaperclip 36313fc908 Preserve Cursor child activity without flattening foreign sessions
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-09-28 15:16:00 -05:00
DottaandPaperclip f7b33cc553 Verify Cursor package assets through an exact native profile factory
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-09-28 15:16:00 -05:00
DottaandPaperclip e2000ca283 Bind Cursor rich input and activity adapters to an active parent turn
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-09-28 15:16:00 -05:00
DottaandPaperclip 72d7bbc9b8 Bound full Cursor plan presentation by durable payload size
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-09-28 15:16:00 -05:00
DottaandPaperclip 0129e32b3c Add Cursor ACP rich interactions and pinned distributions
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-09-28 15:16:00 -05:00
DottaandPaperclip f063fbf2bc Map rich ACP surfaces to evidence and update paid qualification results
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-09-28 15:14:02 -05:00
DottaandPaperclip 77b0b5a83d fix(accounting): keep absent paused-run cost unpriced
Zero normalized token counts do not establish a zero-dollar receipt. Require a finite nonnegative reported cost while preserving explicit zero receipts.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-09-28 15:14:01 -05:00
DottaandPaperclip 2a30219f19 Bound parallel copies when freezing native provider distributions
Keep descriptor, digest, identity, and immutable-file checks for every entry while
copying at most eight files and 32 MiB of buffers per batch. Larger admitted files
run alone. Await every copy before cleanup and preserve canonical manifest order.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-09-28 15:13:37 -05:00
DottaandPaperclip cd719a1b19 Handle manifest-free verified builtin providers in policy staging
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-09-28 15:07:35 -05:00
DottaandPaperclip 4b20957878 Merge public Grok packaging while preserving ACP candidate boundaries
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-09-28 15:03:59 -05:00
DottaandPaperclip af76ed3d46 Record paid product evidence and remaining ACP qualification gaps
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-09-28 15:02:22 -05:00
DottaandPaperclip c3b7e9ecd0 Merge explicit task context ownership while preserving candidate eval lanes
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-09-28 14:55:20 -05:00
DottaandPaperclip 18e8c121d9 fix(runner): include Grok support in public installs with sandbox prerequisites (#14024)
## Thinking Path

> - Paperclip manages agents through a shared native runner.
> - Built-in harness support should ship with Paperclip's public
distribution.
> - Grok already speaks ACP; it does not require a new public bridge
package.
> - Sandbox provisioning owns the native executable and its pinned
version.
> - The runner must verify that prerequisite without downloading it
during npm installation.
> - This change separates built-in launcher identity from external
runtime identity.
> - Clean npm installation and live staging checks verify the
distribution boundary.

## Linked Issues or Issue Description

Refs #13882, #13973, #13977, #13979.

This follow-up now targets master after #13882 was squash-merged. It
replaces the private `@paperclipai/grok-acp` workspace package with
runner-owned assets. Current master is included so the branch also
contains the merged scheduler, complete-event capture, and durable
cleanup fixes.

## What Changed

- Ship Grok launcher and qualification metadata inside the runner's
compiled output and the public server's vendored runner tree.
- Remove the separate Grok npm package and all package-manager install
hooks for this runtime.
- Require the checksum-verified Grok Build 1.0.13 binary at
`/opt/paperclip/providers/grok/1.0.13/grok` in the selected execution
environment. Provision it explicitly in the Daytona image and CI setup.
- Keep native binaries outside the provider pack. Bind the built-in
launcher into the pack manifest.
- Preserve executable leases, descriptor-backed startup, credential
fences, permissions, and exact ACP model admission.
- Use `builtin:grok-acp` and `native:grok` as profile identities.
Historical package-profile sessions fail closed on resume rather than
being silently reinterpreted.
- Resolve built-in assets from the authenticated sidecar location,
including public server npm layouts. Keep the controller path out of
provider environments.
- Add clean npm tarball installation verification to the existing
trusted canary CI job and the admitted manual EC2 verification path. It
stages a unified release version and runs npm lifecycle scripts, then
verifies missing-prerequisite rejection and admission after separate
provisioning without credentials or inference.
- Include the controller-owned provider pack in stamped Cloud images.
Unstamped local images omit the pack and remain usable; remote ACPX
requires full source provenance.
- Correct CLI approval-page metadata for an already authenticated Cloud
board user; approval authorization remains unchanged.
- Honor explicit native-runner enablement in the Cloud agent picker and
direct setup page, keeping the flag disabled by default.
- Allow selecting the execution environment before connecting
credentials. Include Grok in the existing authenticated hello-probe
flow, targeting its pinned native prerequisite for runner setup.
- Recover an existing subscription sign-in conflict through an explicit
cancel-and-retry action, serialized after cancellation succeeds.
- Preserve the selected ACPX harness before normalizing config fields,
so new Grok agents use the Grok default model.
- Keep the credential-free Cloud provider pack root-owned and readable
after runtime UID remapping; verify manifest and referenced asset access
under an unrelated unprivileged UID during image builds.
- Archive prior failover backups alongside explicitly replaced harness
state, preserving evidence while preventing stale backups from blocking
a fresh replacement.
- Update Daytona image content inputs and contract tests for the
built-in assets and explicit provisioner.
- Document and regression-test the shared `approve-all` default for Grok
setup, saved configuration, and native execution. Explicitly saved
restrictions remain unchanged.

## Verification

Current merge-repair head `df09eb3e1a619430ad8419a0ee9aedd486689b05`
incorporates master `f1a394bd30cb56fb9e479f98b9f50176fe921858` after the
base PR was squash-merged. All 12 conflicts came from incoming files
identical to the tested pre-squash base. The final tree exactly matches
a three-way merge using that original base, preserving built-in Grok
distribution and removal of the obsolete private package. All 252
focused runner/UI tests, six npm-isolation tests, and token gates pass.
Fresh exact-head Greptile review is 5/5 with no outstanding findings;
security scans and EC2 native compilation pass. All current-head CI is
green: 56 successful checks/statuses and four intentional skips ([run
36468768035](https://github.com/paperclipai/paperclip/actions/runs/36468768035)).
The repository owner explicitly authorized bypassing code-owner approval
after all checks passed; no CI checks or repository protection settings
are bypassed or changed. The only remaining PR was removed from the
completed stack metadata to permit native auto-merge.

Earlier integration head `78cb306ecc41b5c96577c26c1d89153b0ef865a1`
includes master `3447609d2247e75e55d91493dda91a608364f672` (2026-09-28).
Two master advances during verification overlapped the eval catalog; the
final merge preserves Grok qualification, completion updates, and
bounded API-response reading in all 348 cells. All 77 focused
catalog/eval/workflow tests pass. Both native stack layers (#14397) are
mergeable, and both exact-head Greptile reviews are 5/5 with successful
security scans and no unresolved review threads. All current-head CI is
green: 56 successful checks/statuses and four intentional skips ([CI
attempts](https://github.com/paperclipai/paperclip/actions/runs/36447124691)).
The initial attempt lost two EC2 runners to shutdown signals and stalled
a third shard during dependency preparation; all three passed the
same-commit failed-job-only retry. Trunk code-owner requirements remain
enforced. The review summary’s non-blocking saved-asset offset
classification note concerns code already merged in #14301; those
runtime files are identical to master and outside this stack’s diff.
Historical live evidence below retains its original source revisions.
[Final public npm
verification](https://github.com/paperclipai/paperclip/actions/runs/36445542764)
passed on `76ea70cd4d13786a042af9df82f0fd7a8c85ae30`: 17 public
packages, an executed offline lifecycle sentinel, unchanged consumer
lock, built-in launcher, missing-prerequisite rejection, and verified
separately provisioned binary/command lease. Provisioning and cleanup
require no host privilege elevation; only the positive probe mounts the
temporary native binary read-only. The verifier is unchanged by the
final master merge. All six isolation tests and an offline npm smoke
test pass. The prior head had 56 green CI checks and a 5/5 review after
two unchanged tests timed out and passed a failed-job-only retry ([CI
attempts](https://github.com/paperclipai/paperclip/actions/runs/36444597313)).
All 56 recovery-display/lineage tests pass; re-review cleared the
already-covered missed-retry concern. Earlier EC2 failures remain
retained: [npm lockfile
rejection](https://github.com/paperclipai/paperclip/actions/runs/36436311203),
[missing compiler in the slim
image](https://github.com/paperclipai/paperclip/actions/runs/36440210984),
and the aggregate 15-minute test timeouts in those broad runs. Both
broad attempts passed typecheck, token gates, Product E2E type/unit
checks and build. The focused EC2 lane preserves the existing
trusted-actor and immutable-source gates.


Earlier documentation/test checkpoint
`ff244c4fd78a7ede5a3e00efe09f475f133ef33e` leaves runtime behavior
unchanged. 154 focused tests pass across configuration building, native
provider resolution, permission policy, credentials, UI configuration,
and new-agent setup (including both Grok auth modes); token gates pass.
All fresh CI is green for this head: 56 successful checks/statuses and
two intentional skips ([run
36367065119](https://github.com/paperclipai/paperclip/actions/runs/36367065119)).
Greptile is 5/5 with no new findings. Grok already inherits the shared
`approve-all` default, so unattended setup requires no manual permission
change.

Runtime head `bb5a9307991f1ac567b781970ef11b39d518e19b` fixes a final
staging continuation failure before provider startup: explicit
replacement archived the old harness but left its failover backups
active, which caused `runner_harness_state_mismatch`. The regression
fails before the fix and passes after it; all eight adjacent
recovery-safety cases also pass. Old backups remain inspectable inside
the continuity archive. All fresh CI is green at this head ([run
36360839248](https://github.com/paperclipai/paperclip/actions/runs/36360839248)),
with a 5/5 review. One unrelated Cursor test timed out in the initial
server shard; the same-commit failed-job rerun passed, and both attempts
are retained. Staging deployment is confirmed healthy on this revision.
The controller image is
`ghcr.io/paperclipai/paperclip@sha256:6ad91c487910ccd2596ff7aed0a3a3ea5233d12b51b83cd6e1402237749b9673`.
The final browser-created staging task passed on this exact revision
with API authentication: context read → structured human question →
controller restart → answer submission → same native provider session
resumed → document saved → task Done. The two turns took approximately
119s and 77s. The actual write receipt was applied, and the saved
document has exactly one revision containing the selected answer and
requested marker. Usage and cost were not reported. [Controller image
build](https://github.com/paperclipai/paperclip/actions/runs/36360889243).

- Previous integration head `a44f7dbb6b6f77cd9ed893756ca453307f281e5f`:
all CI green (53 successful checks/statuses, two intentional skips),
including repository typecheck/build/tests, native Runner tests, browser
shards, and canary installation checks. [CI run
36358672529](https://github.com/paperclipai/paperclip/actions/runs/36358672529).
Greptile is 5/5 with no unresolved findings.
- Focused checks cover Grok credentials, executable admission, launcher
assets, provider-pack paths/permissions, workflow contracts, setup
defaults, CLI authorization, and subscription conflict recovery. All 39
protocol definitions validate. Final integration checks pass 124
catalog/evidence/cache tests and nine project-form tests; token gates
pass. Some local dependency checks could not load the stale installed
dependency tree; the corresponding fresh EC2 checks pass.
- Clean public npm installation passed on EC2 at
`8b172ebcf8e02e30662d830c00f3961e3bd459ec` ([run
36164964900](https://github.com/paperclipai/paperclip/actions/runs/36164964900)):
17 unified-version packages, lifecycle scripts enabled, built-in
launcher present, no separate Grok package or npm-downloaded binary,
missing prerequisite rejected, separately provisioned native executable
and command lease verified. No credentials or inference were used.
Subsequent changes preserve this npm asset layout.
- The immutable Daytona prerequisite image is
`ghcr.io/paperclipai/paperclip-daytona-runner@sha256:98957d5be0ac774d086b6402b5849e8e6356fec70fb8c09fca6eb4ed6de918e0`,
built from `5a2db471f3ddabe77f9f80e76ed27f996cb97fba`. The previous
Cloud controller image was
`ghcr.io/paperclipai/paperclip@sha256:fd914e1ab1e45f741e8e078ff452d16f082d7ac05f9b4b3506d3a3c64150d204`,
built from `a44f7dbb6b6f77cd9ed893756ca453307f281e5f`; it is superseded
by the latest image above. Its EC2 build verified provider-pack access
under an unrelated unprivileged UID.
- Browser staging at `40f898bc4cba73c1dff4e6344a3983ba0fb247ef` passed
full Grok onboarding with the correct `grok-4.7` model, saved credential
delivery, and pinned Daytona execution. A browser-created task read
context and asked the structured human question. After a controller
restart, answering the persisted question resumed the same native
provider session, saved the requested document, and completed the task.
Actual tool outcomes and durable state agree: one question and one
document revision. The two successful turns took 42.7s and 63.1s; usage
and cost were not reported.
- Restricted policy returned the expected `approval_required` outcome.
Functional staging tests explicitly selected `approve-all`; controller
authorization and governed approvals remain enforced. Temporary board
CLI access was revoked and verified rejected (HTTP 401), and the
disposable onboarding agent was paused.

Failures remain retained: the pre-fix continuation failure (its task
remains blocked; the passing final task is fresh), the original Cloud
provider-pack permission failure, the expected restricted-policy denial,
the superseded npm staging failure, and an earlier monolithic CI
infrastructure timeout. Browser CI exposed a project alias/form race;
the final stack uses master's stronger draft-preservation fix and all
browser shards pass. Historical full subscription/API protocol and
Product rosters retain their original source revisions and do not
qualify this packaging revision. No local Docker or Rust build was used.

## Risks

The branch includes master’s draft-preservation fix for project URL
aliases. It keeps the same project’s edit form mounted and clears prior
data when the project or company changes.

Custom sandboxes and local execution hosts must provision the pinned
binary before Grok starts. Missing, changed, unsupported-platform, and
symlinked executables fail admission. The new builtin profile cannot
resume sessions created with the former private-package profile.
Existing Claude/Codex npm bridge profiles retain their package pins.
Grok restricted modes preserve the selected policy but cannot
automatically admit Paperclip calls: ACP permission metadata does not
independently bind tool authority, so those calls stop with
`approval_required`. New Grok configurations default to `approve-all`,
including API configurations that omit the mode. Existing explicitly
restricted configurations remain restricted; controller authorization
and governed approvals remain enforced.

## Model Used

OpenAI GPT-6 through Codex, with tool use and code execution. The exact
serving model identifier 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.928.0-canary.8
2026-09-28 14:54:44 -05:00