Commit Graph
5760 Commits
Author SHA1 Message Date
DottaandPaperclip d66e96646d Resume committed rotations without asking for another signing secret
Compare the persisted generation with the saved request baseline, keep one-time plaintext separate from reconnect readiness, and reset local state for a new rotation objective. Cover verified, pending-verification, and unchanged generations.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-10-26 15:41:37 -05:00
DottaandPaperclip cbf3dc6fc6 Merge stable saved rotation baselines
Co-Authored-By: Paperclip <noreply@paperclip.ing>

* codex/agent-connection-api-parity:
  Keep the rotation baseline stable across saved handoff reloads
2026-10-26 15:33:38 -05:00
DottaandPaperclip e54b9b11d6 Keep the rotation baseline stable across saved handoff reloads
Expose only an opaque rotation identifier and bind setup links to the generation they requested. Preserve the baseline on run retries and validate the projection through real authentication.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-10-26 15:32:52 -05:00
DottaandPaperclip e22d2a0eba Open saved GitHub credential handoffs at the required human step
Preserve import and rotation objectives in the existing setup screen, keep one-time secret copy and retry states bounded, and document authorized self-targeted policy administration. Record fixture evidence separately from live verification.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-10-26 15:12:18 -05:00
DottaandPaperclip f109b3836e Merge verified credential handoff completion
Co-Authored-By: Paperclip <noreply@paperclip.ing>

* codex/agent-connection-api-parity:
  Keep credential handoffs pending until their requested change commits
2026-10-26 15:07:07 -05:00
DottaandPaperclip f99e8aa6d5 Keep credential handoffs pending until their requested change commits
Separate saved import, identity, and rotation actions; bind rotation completion atomically to new vault references and fresh verification. Keep signing-key import human-only. Exercise authorized self-targeted policy administration without granting self-approval.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-10-26 15:06:38 -05:00
DottaandPaperclip d84538f8a3 Record credential handoff API contract verification
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-10-26 13:42:51 -05:00
DottaandPaperclip e7899f18c5 Merge the credential handoff API contract
Co-Authored-By: Paperclip <noreply@paperclip.ing>

* codex/agent-connection-api-parity:
  Describe the human signing-secret handoff in API discovery
2026-10-26 13:42:49 -05:00
DottaandPaperclip 35585448ef Describe the human signing-secret handoff in API discovery
Expose the credential-entry response separately from human-only secret generation and verify the typed contract through OpenAPI and real agent authentication.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-10-26 13:42:13 -05:00
DottaandPaperclip ad327e0220 Document the human webhook-secret setup boundary
Record actual agent-key and JWT handoff evidence, human rotation compatibility, and retained CI failures.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-10-26 13:38:49 -05:00
Dotta ede4b768d0 Merge branch 'codex/agent-connection-api-parity' into codex/agent-connection-api-parity-maps
* codex/agent-connection-api-parity:
  Keep GitHub webhook secret rotation in human setup
2026-10-26 13:38:22 -05:00
DottaandPaperclip 096d2b0039 Keep GitHub webhook secret rotation in human setup
Return a saved setup handoff for delegated agents and reject plaintext signing-secret generation at the service boundary. Verify key/JWT handoffs preserve credential refs and human sessions can still rotate.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-10-26 13:37:44 -05:00
DottaandPaperclip 4ad17e94d2 Document complete AI and profile management grants
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-10-26 13:24:12 -05:00
DottaandPaperclip 37856f2fb1 Merge bounded effective profile projection checks
Co-Authored-By: Paperclip <noreply@paperclip.ing>

* codex/agent-connection-api-parity:
  Deduplicate account checks in effective profile projections
2026-10-26 13:22:37 -05:00
DottaandPaperclip 271740cc19 Deduplicate account checks in effective profile projections
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-10-26 13:22:33 -05:00
DottaandPaperclip 6bd64483de Link profile read operations to authenticated privacy evidence
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-10-26 13:08:15 -05:00
DottaandPaperclip 2cd1ff192f Record complete profile visibility regression coverage
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-10-26 13:07:27 -05:00
DottaandPaperclip 54d91c685a Merge complete profile resource authorization
Co-Authored-By: Paperclip <noreply@paperclip.ing>

* codex/agent-connection-api-parity:
  Authorize complete profile selectors and effective account projections
2026-10-26 13:06:24 -05:00
DottaandPaperclip 99e4653019 Authorize complete profile selectors and effective account projections
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-10-26 13:06:21 -05:00
DottaandPaperclip ed3e03b477 Document exact host template administration grants
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-10-26 12:45:36 -05:00
DottaandPaperclip f8a0525574 Record final qualification and external review boundaries
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-10-26 12:37:06 -05:00
DottaandPaperclip 2884149efd Merge current implementation base for stacked review
Co-Authored-By: Paperclip <noreply@paperclip.ing>

* codex/agent-connection-api-parity:
  fix(tasks): hide empty message history disclosure (#17751)
2026-10-26 12:36:41 -05:00
DottaandPaperclip 6bc3859883 Merge current master for required base freshness
Co-Authored-By: Paperclip <noreply@paperclip.ing>

* origin/master:
  fix(tasks): hide empty message history disclosure (#17751)
2026-10-26 12:36:38 -05:00
DottaandPaperclip 6f2a14d2d7 Place scoped account evidence on the listing operation
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-10-26 12:07:29 -05:00
DottaandPaperclip aa14dbbc2a Record scoped AI listing acceptance evidence
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-10-26 12:07:01 -05:00
DottaandPaperclip d3b554d5e6 Merge scoped AI collection authorization
Co-Authored-By: Paperclip <noreply@paperclip.ing>

* codex/agent-connection-api-parity:
  Filter AI account and pool projections through agent scope
2026-10-26 12:05:42 -05:00
DottaandPaperclip 9aa8fbe34a Filter AI account and pool projections through agent scope
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-10-26 12:05:39 -05:00
DottaandPaperclip 227a30564b Use canonical delegated connection guidance across feature maps
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-10-26 12:01:38 -05:00
DottaandPaperclip a67a18c171 fix(tasks): hide empty message history disclosure (#17751)
## Thinking Path

> - Paperclip helps people manage AI agents and their work.
> - Each task page shows the instruction and saved conversation.
> - Cold opens show recent content before older history.
> - The page used any linked run as evidence of older messages.
> - A task's first run therefore showed an empty More messages control.
> - This PR shows the control only when the preview omits comments or
runs.
> - Fresh tasks stay clear, and older task history remains available.

## Linked Issues or Issue Description

Refs: #17593.

**What happened?**

A fresh task with only its first run displayed More messages, even
though there was no earlier history to load.

**Expected behavior**

Show More messages only when older comments or runs are omitted. Runs
observed while the page stays open must not create a false disclosure.
The output control also uses actual skipped bytes, so a growing run does
not gain an empty output control.

**Steps to reproduce**

1. Create a task and let its first run start or finish.
2. Open that task with a fresh application cache.
3. Observe the empty More messages control below its instruction.

## What Changed

- Keep omitted-run evidence with the cached recent run window.
- Use omitted comments or runs to decide whether to show More messages.
- Preserve run retention, reconnect reconciliation, and expansion of
real history.
- Offer More run output when a single legacy log exceeds the compact
byte window.
- Keep first-run native diagnostics accessible through More task actions
→ Show task activity.
- Add regression coverage and update the task feature map.

## Verification

- Passed the existing 9,168-test UI suite across 794 files, then all 504
focused task-detail, history-window, real thread, and log-transport
tests after adding the activity-menu regression.
- Passed workspace build, workspace typechecks, token gates, and map
checks.
- Reproduced the bug in the earlier UI using a disposable local task.
The corrected UI hides the control with zero runs or only the first run.
- In the local browser, expanded a long task to all 80 comments. The
latest answer appeared once and the disclosure disappeared. No console
warnings or errors occurred in that journey.
- Expanded a saved 111 KB legacy log through More run output and opened
its earlier activity in the local browser.
- On a single saved native run, verified no More messages control. Used
Show task activity to reveal its earlier tool output; the latest answer
remained visible exactly once, with no console warnings or errors.
- The first broad local run stopped because the fresh dependency install
lacked PostgreSQL library symlinks. The normal package setup repaired
that environment issue.
- The next broad run hit one workspace-runtime timeout. Its focused
rerun passed with unchanged server source; the original failure remains
recorded. Stopped the already-failed broad runner after the previous
revision passed full PR CI. All final-head build, typecheck, test, and
policy CI jobs passed. Both automated reviewers scored the final head
5/5, with no unresolved threads. The separate Entire Gates check is
pending because the PR has no active assessed Change for its current
comparison. The installed Entire CLI reports no linked project trail and
exposes no Change-assessment command; no gate or repository settings
were altered. Browser verification used this branch's UI with the
existing disposable test-drive API. No agent execution was started.

## Risks

Low risk. This changes the recent run cache shape and the disclosure
condition. The full run cache remains an array. Tests cover first-run
states, observed new runs, omitted older runs, expansion, and reconnect
reconciliation. No schema or API changes. A separate run-output control
preserves access to a single truncated legacy log. The task menu
preserves first-run native activity access without implying older
messages exist.

## Model Used

OpenAI GPT-6 through Codex, with code execution and browser tools. A
more 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
- [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
- [ ] 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-26 11:58:30 -05:00
DottaandPaperclip a523d97df4 Restore addressed Google service choices during saved setup
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-10-26 11:55:10 -05:00
DottaandPaperclip 7eca024e1e Merge connection authority and saved consent fixes
Co-Authored-By: Paperclip <noreply@paperclip.ing>

* codex/agent-connection-api-parity:
  Preserve scoped policy audiences and Google consent choices
2026-10-26 11:52:51 -05:00
DottaandPaperclip e27eb756e6 Preserve scoped policy audiences and Google consent choices
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-10-26 11:52:47 -05:00
DottaandPaperclip 11e1f6f489 docs(connections): record final upstream and project binding checks
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-10-26 11:30:24 -05:00
DottaandPaperclip 7687c2dfab Merge current Runner compatibility and complete profile target checks
Co-Authored-By: Paperclip <noreply@paperclip.ing>

* codex/agent-connection-api-parity:
  fix(connections): authorize all agents affected by project profile bindings
  perf(runner): keep event journal writes off the HTTP thread (#17745)
  Bound native OpenCode assigned-tool catalog projection (#17740)
  fix(ui): keep iPhone task chat stable while typing and streaming (#17232)
2026-10-26 11:28:43 -05:00
DottaandPaperclip b1b6e2df52 fix(connections): authorize all agents affected by project profile bindings
Project profiles can affect any company agent running work in that project. Check the existing configuration authority for all affected agents on bind, unbind, and retained profile edits, alongside project visibility.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-10-26 11:28:40 -05:00
Dotta 03888b25ce Merge current master for final connection qualification
Co-Authored-By: Paperclip <noreply@paperclip.ing>

* origin/master:
  perf(runner): keep event journal writes off the HTTP thread (#17745)
  Bound native OpenCode assigned-tool catalog projection (#17740)
  fix(ui): keep iPhone task chat stable while typing and streaming (#17232)

# Conflicts:
#	packages/paperclip-runner/acpx-profiles.json
#	packages/paperclip-runner/runner/crates/runner-core/src/generated_acpx_profiles.rs
#	packages/paperclip-runner/src/drivers/acpx/copilot-installation.test.ts
#	packages/paperclip-runner/src/drivers/acpx/generated-profiles.ts
#	packages/paperclip-runner/test/fixtures/copilot-profile-v61-identity.json
2026-10-26 11:27:43 -05:00
DottaandPaperclip e5aa49cd69 docs(connections): record linked-resource and quota qualification
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-10-26 11:22:14 -05:00
DottaandPaperclip f364ca34dd Merge linked-resource authorization review fixes
Co-Authored-By: Paperclip <noreply@paperclip.ing>

* codex/agent-connection-api-parity:
  fix(connections): enforce linked targets and preserve governed call admission
2026-10-26 11:21:21 -05:00
DottaandPaperclip 833b090ecc fix(connections): enforce linked targets and preserve governed call admission
Authorize issue, routine, and gateway profile targets, including retained gateway references. Filter GitHub reviews by linked task visibility, count Slack setup sends against policy quotas, reject caller-labelled application provider spoofing, preserve approved invocation rate admission, and authorize before taking profile/policy transaction locks. Add actual-authenticated scope, approval, visibility, quota, and concurrency regressions.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-10-26 11:20:49 -05:00
DottaandPaperclip 125ddcabe5 perf(runner): keep event journal writes off the HTTP thread (#17745)
## Thinking Path

> - Paperclip lets people manage AI agents and their work.
> - The HTTP server also owns durable Runner state.
> - Each committed event rewrites and flushes that state on the HTTP
thread.
> - Large journals and slow writes delay unrelated navigation and saves.
> - Event acknowledgements must still wait for durable storage.
> - This PR stages output writes asynchronously and joins them before
writer replacement.
> - The board can serve requests while Runner output waits for storage.

## Linked Issues or Issue Description

Refs: #17507. Related: #17514 reduces writes per event burst. This PR
moves individual output writes and file flushes outside the HTTP thread.

**What happened?**
A live CPU profile spent about three seconds of a 13-second sample
serializing and synchronously writing Runner state. Representative
journals were about 9 MB. Unrelated task requests had multi-second
delays.

**Expected behavior**
A slow output-journal write must leave unrelated HTTP requests
responsive. An event must not be acknowledged before it is durable.

**Steps to reproduce**
Hold an authenticated output event's file flush in the durable protocol
test. Send an unrelated HTTP request during that flush. Also save a
command, reconnect, or retire the controller during the write.

## What Changed

- Stage `item.delta` snapshots with asynchronous file writes and file
flushes. Keep lifecycle, control, authentication, and tool events
synchronous so transport readers observe durable boundaries.
- Fence publication by saved revision. An older snapshot cannot replace
newer commands or connection state. A failed write fences the writer.
- Write compact JSON and share private-file checks. Existing journals
remain readable.
- Stop external ingress before joining admitted writes. Checkpoint only
after retirement succeeds. Close reports a failed detach consistently
and releases notification consumers.
- Add real HTTP and Rust transport cases for held writes, reconnects,
commands, failure, restart, close, and timeout.
- Add immutable Copilot source identity v61 for the changed shared
transport. Preserve v60, historical decoding, exact-current launch
checks, and qualification flags. No new live Copilot qualification is
claimed.

## Verification

- Head `6f5c92e778`: workspace `pnpm -r typecheck` and `pnpm build`
passed. All CI gates passed in [run
40356159484](https://github.com/paperclipai/paperclip/actions/runs/40356159484),
including both full Runner shards. Fresh Greptile review is 5/5; all
findings are resolved.
- Current-base focused verification passed 300 cases across protocol,
real Rust restart/continuation, permission, backend, and
immutable-profile suites. The complete transport suite also passed 286
cases before the base refresh.
- Earlier iterations exposed lifecycle visibility, late writer
publication, and close-order failures. Controlled regressions reproduced
each before repair. CI also found missing test-peer drain methods and a
stale source fingerprint; both are corrected. An older broad local test
run was stopped after its source was superseded. No full local-suite
pass is claimed; full coverage passed in isolated CI.
- A synthetic 9 MB journal comparison used 20 writes per sample and
concurrent HTTP probes, with alternating baseline/treatment order. HTTP
median changed from 31 ms to 2–3 ms; p95 changed from 51–85 ms to 12–21
ms. Parsed output was equal. The asynchronous loop served 125–153 probes
versus 19–20, and took longer overall (992–1069 ms versus 675–678 ms).
This proves local I/O responsiveness, not deployed application latency.
- Deployment and live save/archive acceptance remain pending.

## Risks

Persistence interleavings affect restart authority. The tests cover
concurrent commands, replacement, failed storage, and reopening the
journal. JSON serialization, atomic rename, directory flush, and
control-event writes remain synchronous. This change still rewrites
whole journals. Incomplete retirement retains recovery evidence and
fails the close. A new exact-current Copilot source identity can reject
an older launch identity; historical decoding remains available. No
migration is required.

## Model Used

OpenAI GPT-6 (Codex), with reasoning, tool use, SSH and browser
diagnostics, code editing, and test execution. The exact serving model
suffix 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>
2026-10-26 11:19:36 -05:00
DottaandPaperclip 063a498b54 Bound native OpenCode assigned-tool catalog projection (#17740)
## Thinking Path

> - Paperclip is the open source app people use to manage AI agents for
work.
> - Native agents use assigned connection tools through a governed
gateway.
> - OpenCode received the gateway catalog directly, outside the bounded
server tool projection.
> - A large catalog can exceed a provider grammar compiler's capacity
even when it fits the transport limits.
> - Synthetic requests reproduced the Fireworks grammar timeout on the
configured DeepSeek model.
> - This pull request gives OpenCode two assigned-tool discovery and
call schemas through the existing server relay.
> - The gateway keeps the same grants, validation, approvals,
revocation, and audit rules.

## Linked Issues or Issue Description

**What happened?**

A native OpenCode run could fail during provider grammar compilation
before its first assigned-tool call. OpenCode advertised the full
assigned gateway catalog. A synthetic catalog of 741 tool schemas
reproduced `Grammar processing took too much time` on Fireworks through
OpenRouter with `deepseek/deepseek-v4.1-flash-1017`. The same model and
backend accepted a compact two-tool discovery/call catalog. This
reproduces the mechanism; it does not replay a historical private
request.

**Expected behavior**

Assigned-tool discovery must keep provider grammar size bounded. Every
call must retain the run's original gateway binding and permissions.

**Steps to reproduce**

1. Give a native OpenCode run a large assigned connection catalog.
2. Use a provider that compiles tool schemas into a constrained output
grammar.
3. Observe the full catalog in the provider tool surface before this
change.
4. After this change, observe only `paperclip_search_assigned_tools` and
`paperclip_call_assigned_tool` for assigned tools. Discover and call a
permitted tool through its pinned alias.

**Paperclip version or commit**

Source checkout based on current `master`.

**Deployment mode**

Native local or sandbox execution with OpenCode 1.18.34.

Related work: Refs #14258 (discovery paging), #16678 (local adapter MCP
launch), and #17688 (gateway capability advertisement). This change
covers native OpenCode catalog projection.

## What Changed

- Route native OpenCode assigned tools through the existing server-owned
authenticated relay.
- Use bounded discovery/call schemas for OpenCode, including small
catalogs. Preserve transport capacity checks.
- Keep assigned gateway credentials on the controller. Ignore gateway
and credential values in tool arguments.
- Preserve exact declared MCP operation names through admission and
driver dispatch. Resolve transport prefixes only against the closed
catalog. Reject unknown or shortened names.
- Refresh former OpenCode direct-catalog and shortened-name checkpoints.
Keep the existing fingerprints for other providers.
- Add local and remote wiring, catalog capacity, alias, scope,
work-mode, approval, and revocation tests.
- Allow the native test files to use a validated dedicated external test
database when embedded PostgreSQL is unavailable.
- Document the assigned-tool execution contract.

- Bound OpenCode discovery pages to 32 KiB and large-schema chunks to
16K characters. Keep other harness budgets unchanged.
- Test medium pages and escaped large schemas through the actual HTTP
MCP bridge on the explicit Runner testing surface.

## Verification

- Red before the catalog fix: OpenCode did not create the server relay,
and forced compact delivery advertised 1 or 741 direct schemas.
- Red before the alias repair: HTTP MCP changed declared operation
names, and the driver sent `search_assigned_tools` instead of the
authorized `paperclip_search_assigned_tools`.
- Current repair tests: 112 OpenCode/proxy tests pass, plus one actual
Rust/proxy/HTTP MCP regression. Two checkpoint regressions fail with the
former scoped revision and pass with the new revision. Other providers
keep their prior fingerprints.
- The combined QA candidate with this exact PR head passes all 916
native tests and all 113 transport tests on supported Node 24.22. An
earlier Node 26.4/macOS run passed the 113 assertions but had an
uncaught networking error. That non-clean run remains recorded; its
stack matches [the upstream Undici
defect](https://github.com/nodejs/undici/issues/5544). No production
workaround or error suppression was added.
- `pnpm -r typecheck`, `pnpm build`, and `git diff --check` pass on
`bc41ba72be2195eabeb0d7727227ee0cd02e8532`. The maps structural check
passes.
- The local `pnpm test:run` attempt stopped after host embedded
PostgreSQL initialization failures. The relevant database suites pass
with isolated PostgreSQL 18. All repository CI gates, including
aggregate `ci / verify`, pass on the current head.
- Synthetic live provider comparison: 741 invented schemas produced the
exact Fireworks grammar timeout in 20.9 seconds. Two compact invented
schemas produced a discovery call in 585 ms on the same model and
backend.
- The first hosted QA attempt exposed the alias failure described above.
On the patched source, a real local Rust runner → proxy → OpenCode
1.18.34 → exact DeepSeek smoke completed discovery, one synthetic
gateway read, and `paperclip_finish`, then emitted `turn/completed`. It
used the production compact projection and unchanged Rust allowlist.
- Two earlier local smoke attempts exposed missing terminal authority
and completion-contract fields in the smoke harness. Those failures
remain recorded. The corrected ordinary bindings produced the clean
result.
- Fresh Greptile: 5/5 on `bc41ba72be2195eabeb0d7727227ee0cd02e8532`,
with no new actionable findings or unresolved threads.
- Hosted QA publication and lifecycle acceptance remain pending. The
separate deployed-agent `Paperclip Review` check is also pending; it
follows a task that failed on the earlier deployed runtime.

- Local OpenCode/OpenRouter acceptance at `bc41ba72`: 530 synthetic
tools were authorized and installed. A simple model-ID reply completed
in 17.3 seconds with no app calls. A discovery task completed in 37.6
seconds, used the search/call relay, made one upstream call, and
returned the exact synthetic value. This is local source acceptance, not
a staging sandbox timing comparison.
- The large-result review finding has a failing-before/passing-after
HTTP MCP regression. Five medium schemas now page without invalid JSON.
A large schema with escaped text reconstructs exactly through bounded
chunks. All 35 assigned-tool tests and the server typecheck pass after
this follow-up.
- Final head `d84ce4856a6e65a35ad5fb8b561492598b525f4e`: all CI gates
pass. Greptile and Paperclip Review both rate the change 5/5. No review
threads remain open. The final full build, server typecheck, and 35
assigned-tool tests pass locally.

## Risks

- OpenCode uses discovery before it calls an assigned tool, including
for small catalogs. This can add a model turn.
- An existing OpenCode provider checkpoint rotates once because it
retains the former tool declarations. Paperclip task history remains
available.
- The historical filtered catalog was not captured. The synthetic
comparison proves the failure mechanism, not the exact cardinality of an
earlier private request.
- No model, provider route, permission, or automatic retry policy
changes.

## Model Used

The bounded-result follow-up also used OpenAI Codex (GPT-6 family). The
exact backend model ID and context-window size were not exposed for that
session. It used reasoning, code execution, and tool use.

OpenAI `gpt-6.1-sol` in Codex, with reasoning, tool use, code execution,
and source inspection. The runtime does not expose the 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-26 10:49:23 -05:00
DottaandPaperclip 21d5571b08 docs(connections): retain route regression and upstream merge evidence
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-10-26 10:47:33 -05:00
DottaandPaperclip 2a99cc8944 Merge current-master compatibility for connection qualification
Co-Authored-By: Paperclip <noreply@paperclip.ing>

* codex/agent-connection-api-parity:
  fix(runner): preserve disabled Codex web search (#17744)
  fix(ui): identify accounts in AI connection choices (#17738)
  fix(recovery): wake retained workspace preservation after Retry (#17741)
  fix(chat): admit task Retry after GitHub reconnect (#17733)
  fix(runner): allow bounded controller admission before welcome (#17735)
  feat(evals): retain bounded native tracing in the Runner controller (#17493)
  fix(ci): provide Copilot auth only to protected paid eval cells (#17743)
  feat(evals): retain portable Runner controller evidence (#17469)
2026-10-26 10:46:43 -05:00
Dotta dc329dd938 Merge current master for connection API qualification
Co-Authored-By: Paperclip <noreply@paperclip.ing>

* origin/master:
  fix(runner): preserve disabled Codex web search (#17744)
  fix(ui): identify accounts in AI connection choices (#17738)
  fix(recovery): wake retained workspace preservation after Retry (#17741)
  fix(chat): admit task Retry after GitHub reconnect (#17733)
  fix(runner): allow bounded controller admission before welcome (#17735)
  feat(evals): retain bounded native tracing in the Runner controller (#17493)
  fix(ci): provide Copilot auth only to protected paid eval cells (#17743)
  feat(evals): retain portable Runner controller evidence (#17469)

# Conflicts:
#	packages/paperclip-runner/acpx-profiles.json
#	packages/paperclip-runner/runner/crates/runner-core/src/generated_acpx_profiles.rs
#	packages/paperclip-runner/src/drivers/acpx/copilot-installation.test.ts
#	packages/paperclip-runner/src/drivers/acpx/generated-profiles.ts
#	packages/paperclip-runner/test/fixtures/copilot-profile-v60-identity.json
2026-10-26 10:46:38 -05:00
Clément df5a78cf91 fix(ui): keep iPhone task chat stable while typing and streaming (#17232)
## Thinking Path

> - Paperclip keeps human-agent conversations attached to tasks.
> - People need to read and reply comfortably from a phone.
> - The mobile task page scrolled the document and positioned its
composer with a sticky navigation offset.
> - Safari's keyboard resize and later focus pan could move that
document again, causing overlap, gaps, and jumps while editing.
> - This change gives mobile and desktop the same message scroller and a
normal flex footer.
> - CSS owns the layout. A small VisualViewport adapter handles the
visible height and Safari's stale document focus scroll.
> - Streaming no longer measures every historical row while following
the bottom.

## Linked Issues or Issue Description

Fixes https://github.com/paperclipai/paperclip/issues/16497

Related: https://github.com/paperclipai/paperclip/pull/15245 also
addresses keyboard positioning. This change additionally removes mobile
document auto-follow and reduces historical-row measurement work.

## What Changed

### One scroll owner and a natural-flow composer

Before:

```text
Document scroll + mobile auto-follow
  └─ Conversation + sticky composer + animated navigation offset
```

After:

```text
Height-constrained conversation shell
  ├─ Header
  ├─ Message scroller — owns follow/reading position
  └─ Composer — normal flex footer
Navigation stays at the layout viewport bottom, behind the keyboard
```

- Reuse TaskMessageScroller on mobile. Delete the separate 136-line
useWindowAutoFollow implementation and its superseded tests.
- Keep the composer in normal flex flow. Remove its sticky bottom
positioning and navigation-offset animation.
- Constrain the mobile conversation with CSS. Classic tasks and other
pages retain their existing layout.
- Add a 47-line useMobileVisualViewport hook. It changes shell height on
resize, not on typing or incoming messages. It never translates the
shell or hides navigation.
- Reject Safari's stale document focus pan only for an unzoomed,
keyboard-open conversation. Inner message and editor scrolling stay
native.
- Keep a saved reading anchor when reading older messages. Skip
historical-row measurements while following the bottom.
- Update tests and the existing mobile streaming fixture. Keep only two
layout-contract sentences in DESIGN.md.

**Scope:** 19 files, +367 / -482 lines: 115 fewer lines overall.
Production UI/CSS alone is +158 / -190 lines. No API, database, or
dependency changes.

## Verification

Bottom-follow is also saved explicitly for Back navigation. A new
regression covers returning after rotation changes message wrapping,
without restoring historical-row scans.

### Physical iPhone acceptance

Tested on an iPhone 15 Pro running iOS 26.7.1. The reporter confirmed:

- Opening the keyboard positions the composer correctly immediately,
before any typing.
- The installed web app works.
- Long drafts, insertion, deletion, and sending are acceptable. The
reporter described long drafts as not perfect but good enough.
- Reading older messages during incoming output preserves position;
returning to the bottom resumes following.
- Rotation, keyboard close/reopen, and attachment/picker transitions
work.

Remote inspection corroborated the corrected open-keyboard state:
visible height 358px, composer bottom 358px, document scrollY 0.
Navigation remained display:block at y=631px, behind the keyboard.

Earlier candidates failed device testing. The decisive trace showed a
correct viewport resize followed about one frame later by a stale 337px
native document focus pan. Typing caused Safari to correct it. Tests now
cover that event ordering, the reverse ordering, and zoom panning.

### Performance evidence

The existing TaskChatPerfHarness supplied 200 historical responses,
4,000 collapsed tools, and 30 updates at 100ms intervals.

| Measurement | Before | After |
| --- | ---: | ---: |
| Historical row geometry reads | 6,000 | 0 |
| Renderer main-thread work | 331.2ms | 273.5ms |
| Largest task | 27.1ms | 12.3ms |

This is one instrumented Chromium development run on the Mac, not a
phone benchmark or a statistical speedup claim. The zero-row-measurement
result also has a regression test that failed with 6,000 reads before
the change.

To reproduce, serve ui/tests/task-chat-perf.html with the UI Vite
server. Record 30 streaming updates at the bottom. Inspect
TaskMessageScroller and row getBoundingClientRect calls. Existing
historical-render tests also confirm that unchanged Markdown does not
reparse on live-tail updates.

### Automated and full-app checks

- [Current-head
CI](https://github.com/paperclipai/paperclip/actions/runs/39862524031)
is green: 54 successful checks and 2 skipped checks. Greptile rates the
current head 5/5, confirms the Back-navigation fix, and has no
unresolved findings.

- **601 focused tests pass** across the task page, layout, composer,
scroller, viewport adapter, and historical-render coverage.
- UI typecheck and production build pass.
- Token gates, Storybook catalog checks, and catalog/map structural
tests pass.
- Independent review of the final source tree passed with no findings.
- The full source app ran on macOS with an isolated database and saved
conversation history. A reply sent through the real UI persisted after
reload. Provider execution was not part of this layout test.
- **Full local repository checks did not pass.** Build/typecheck stop at
missing Rust cargo. The full test run reported 142 failed server tests
and 3 failed suites; missing cargo is confirmed in those three suites.
The other server failures were not diagnosed in this UI task.
Current-head CI now supplies the repository-wide evidence; these local
failures remain disclosed.

## Risks

- Mobile conversations now share the desktop scroll owner. Navigation,
loading, history restoration, and reading-position tests cover that
change.
- The keyboard-state threshold is a 120px viewport reduction.
Accessory-only keyboards retain the normal navigation spacing.
- The document-scroll fallback is scoped to rendered conversations with
an open keyboard at scale 1. It does not handle inner scrolling or
prevent zoom panning.
- Long-draft behavior is accepted, with minor polish still possible.
- The UI change is reversible and requires no data migration.

## Model Used

OpenAI GPT-6 Astra, exact model ID gpt-6-astra, through OpenCode.
Capabilities used: reasoning, code editing, tests, Chromium performance
tracing, and Safari remote inspection. The harness does not expose the
context-window size. An independent general-purpose subagent reviewed
the final tree; its serving model ID was not exposed.

## 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
- [x] My branch name describes the change and contains no internal
Paperclip ticket id or instance-derived details
- [x] I have run focused tests locally and they pass; repository-wide
failures are disclosed above
- [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
2026-10-26 08:44:39 -07:00
DottaandPaperclip 0c91d97e9f fix(connections): admit saved AI sign-in handoffs at the route entry
A saved aiLogin link reaches the existing owner-validated login panel without a catalog source. Add an entry-policy regression that failed before the fix and reject empty identifiers.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-10-26 10:44:31 -05:00
DottaandPaperclip e11e6eea33 docs(maps): correct MCP transport and private voice boundaries
Restore existing chat provenance notes and enumerate private voice and phone operations. Record unsupported MCP GET transports and the authenticated device-session regression evidence.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-10-26 10:41:11 -05:00
DottaandPaperclip 770b5dc5ce Merge delegated sandbox device-login guard fix
Co-Authored-By: Paperclip <noreply@paperclip.ing>

* codex/agent-connection-api-parity:
  fix(connections): allow delegated sandbox device login ownership
2026-10-26 10:38:53 -05:00
DottaandPaperclip d922acf01d fix(connections): allow delegated sandbox device login ownership
Use the shared connection authority for device-login management while preserving the responsible user as immutable owner. Keep refreshed continuation context available at dispatch. Add bearer-authenticated saved-session reads, cancellation, and owner isolation coverage.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-10-26 10:38:20 -05:00
DottaandPaperclip 9c083b0b41 docs(connections): record current authorization qualification
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-10-26 10:30:37 -05:00