Merge mainline and record final Cursor installed-release qualification

Resolve the two Runner fixture conflicts while preserving selected native response waits. Record all 18 passing local/Daytona cells, five original failed attempts, immutable package/image identities and clean installation evidence.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
This commit is contained in:
DottaandPaperclip committed 2026-10-06 10:14:43 -05:00
commit 67aff7ad16
101 files changed
+2592 -255

No files matched your search

+4
View File
@@ -471,6 +471,10 @@ A partial unique `(company_id, resource_type, resource_id)` index deduplicates
creation. Each actual agent pause, resume, or termination appends another event,
including budget actions and generic status updates. The agent row stays locked
until status and event commit, so concurrent repeat requests emit one hook.
Project edits and workspace additions, updates, and removals append `update`.
Repository replacement emits one aggregate update; project creation with repositories
emits only creation. Project mutations hold the project row lock until their record
commits. An archive-only change emits nothing and preserves workspace records.
Termination commits API-key revocation in that same transaction.
Hire approval and rejection commit with agent activation or termination, so a
failed event write leaves the decision pending and retryable.
+5
View File
@@ -192,6 +192,11 @@ choices. Codex uses the curated adapter catalog unless the instance declares
`PAPERCLIP_ADAPTER_MODELS`; general OpenAI API models are not Codex choices.
The Paperclip Runner Codex profile shows the same known model effort levels.
Its selected effort is saved with the run and sent to Codex for each turn.
When Codex reports that a selected model is not supported with a ChatGPT account,
the task shows **Model unavailable**, the provider's account restriction, and
guidance to choose a supported model or clear the task's model override before
retrying. The run retains this reason even when the runner saves a generic
failure result.
Claude Code uses model-specific effort levels; Haiku has no effort slider.
Grok uses its adapter's reasoning levels, including for its default model.
Kimi shows effort only when its agent uses the CLI engine, including with its
+2
View File
@@ -406,3 +406,5 @@ ambiguous proposals, and the existing card-click path with native Claude/Codex.
See the [suite contract](../tests/runner-e2e/README.md#conversational-confirmation-replies-explicit-only).
Hiring notification accounting now also requires exact completed action attribution. Missing native/provider ID mapping is uncomparable evidence; it must not be reported as a model task regression or waived through name/order matching. The fixture waits for both known completion callbacks and settled bracketed observations, including the gap before pending outbox work becomes a wake. Strict action replay and original machine verdicts are retained separately.
The explicit-only [planning guidance utility comparison](../tests/runner-e2e/PLAN-TASK-GUIDANCE.md) measures task decomposition and handoffs with current, short, and disabled skills.
+13
View File
@@ -467,6 +467,19 @@ native failure only while its saved review is still current and pending; caller
payloads cannot select a different review. Dispatch checks that assignment again.
Superseded or completed reviews retain their authority.
Cloud portfolio proxy failures have an event-local `cloud_portfolio` context.
It contains only the phase (`fetch`, `http_response`, `response_body`, or
`response_write`), upstream HTTP status when available, elapsed milliseconds,
and an allowlisted network error code. Unknown values become `unknown` or
`null`; elapsed time outside 0–60,000 ms becomes `null`. Codes come from at
most four error/cause objects' own data properties, never error messages.
`DEADLINE_EXCEEDED` means the request's own ten-second signal was aborted.
The route's warning uses the same safe fields. Neither record includes URLs,
headers, cookies, bodies, user/stack IDs, or the original exception. Sentry
receives a plain error with the existing generic message and default grouping.
The context does not change the HTTP response, authentication, cookies, cache,
deadline, or single-fetch behavior, and does not carry into unrelated events.
An unconfirmed adapter Stop timeout has an event-local `adapter_stop` context:
the run UUID, built-in adapter type, native/legacy runtime mode, configured
wait duration, and whether abort was requested. Invalid identities become
@@ -25,7 +25,188 @@ spend or enforceable per-run dollar accounting. Native AskQuestion is implemente
defensively but is not advertised or certified. See the
[Cursor capability contract](../architecture/runner-cursor-capabilities.md).
## Merge-readiness refresh — 2026-10-05
## Final installed-release qualification — 2026-10-06
This qualification follows the generic mode and provider lifecycle cleanup. Its
frozen application source is `d7b696f9b8f79095233e9e3d56d23e6a6018dd48`.
The public controller packages use source `3d0c9b7761c61eb56628ea1778b1f3ca50fe817f`;
that source adds only a fixture correction. Fixture commits through `646795e8f` change qualification
fixtures and documentation, with no changes to `cli/src`, `server/src`, `ui/src`
or `packages` relative to the frozen application. Historical results below retain
their original source and artifact identities.
The tested public version is `0.0.0-cursor-verify.3d0c9b7761c6`. Cursor CLI
`2026.09.26-dd393fe`, profile v11, patch `paperclip-cursor-usage-v4`, and explicit
model `gpt-5.6-luna[context=272k,reasoning=medium,fast=false]` stayed fixed.
The native distribution/profile digest is
`sha256:2feb50c7b0a317dff454c00115a5bbe4d5c757189691586577be9c80234d477e`.
The resolved build-lock SHA-256 is
`89e5164aa79945655d253f30540c86a620e9df434299af4f1325727dbf5edf47`.
The tracked lockfile was not changed.
| Packaged artifact | SHA-256 |
| --- | --- |
| macOS ARM64 daemon | `816c6603b4ef05ab29cc22a8b6cae9989469a8233bdedc3c97aae22a0c1c6abc` |
| macOS x64 daemon | `372524b322f1200f1708288d0497195477ecf984e21dd32f3ddc2f2038465199` |
| Linux x64 daemon | `d5a22554c922087f122ceeb0e7527529221c41af171b37315469c838dede0288` |
| Public `paperclipai` tarball | `14a96c7de0c20cde231782f54ce0df76c1d6a81512f0c5b38a08ec8e8786631a` |
| Public server tarball | `6e66d37c3ee4d61b66bbc5f2515550a246d8afc8a10b5425c064f5ec3f661d66` |
| Public Daytona plugin tarball | `a6cf4e9070503757be0505d6a1a8df219dca493f801831b3cc1ca83a185d07db` |
The immutable qualification image is
`ghcr.io/paperclipai/paperclip-daytona-runner@sha256:d6259b6bba094702c13fc2283bd85550849c1c53145b656fb2746778f9fa1747`.
Its Linux provider-pack digest is
`sha256:1916578945ba709e00904688792e50bedf505d45d69cc2023a4c95235c86cb18`.
The complete extracted pack passed verification. Anonymous registry inspection
confirmed the published OCI index and amd64 image. This publication does not
publish an npm release or deploy production.
Clean public-package installation passed on macOS ARM64, macOS x64 through
Rosetta, and Linux x64. Normal npm lifecycle scripts ran; Cursor remained absent
until explicit `paperclipai runtime setup cursor`. Setup verified the pinned
closure, and normal resolution launched each platform's packaged daemon without
candidate or asset overrides. The x64 Mac proof covers installation and daemon
startup under Rosetta, not a separate native Intel live campaign. The public
Daytona plugin was built, packed and installed with its own dependencies. Its
version matches the controller packages. Live cells use that installed CLI and
plugin, company secret bindings, ordinary production admission, and the immutable
image. Repository loaders and qualification overrides are absent.
### Post-qualification mainline reconciliation
Mainline `16b7db35ffa0f9a95913c8cbdeea3d595435691f` was merged after the
frozen campaign. The only conflicts were the fixture catalog count (now 504)
and flow dispatch in `tests/runner-e2e/runner.spec.ts`; both retain the Cursor
coverage and mainline's plan-task cases. The native selected-response consistency
wait remains intact. This reconciliation does not rebuild or relabel the tested
artifacts. Final PR checks validate the combined source separately. Release the
qualified package/image pair above; any later package or image needs release
verification against its own identity.
### Final live acceptance matrix
All 18 required cells passed, including cleanup: nine local and nine Daytona.
These are real Cursor sessions through the installed product. Each cell used
the same frozen runtime, explicit model and normal company credential path.
There were 23 attempts; the five failed attempts remain recorded below.
Campaign IDs have prefix `cursor-v11-final-d7-installed-`, followed by
`<environment>-<case>-<attempt>`. The table gives the passing attempt number.
| Case | Local | Daytona | Cleanup |
| --- | --- | --- | --- |
| `hello-complete` | Pass (02) | Pass (01) | Both passed |
| `file-edit-validate` | Pass (01) | Pass (01) | Both passed |
| `structured-question-restart-resume` | Pass (01) | Pass (01) | Both passed |
| `native-plan-reject-revise-accept` | Pass (01) | Pass (01) | Both passed |
| `native-plan-cancel` | Pass (02) | Pass (01) | Both passed |
| `native-write-deny-reconnect` | Pass (03) | Pass (01) | Both passed |
| `pending-permission-stop` | Pass (01) | Pass (01) | Both passed |
| `warm-three-turn` | Pass (01) | Pass (02) | Both passed |
| `pending-permission-provider-loss` | Pass (01) | Pass (01) | Both passed |
Questions survived controller restart and consumed the answer once. Native plans
verified rejection, revision, acceptance and cancellation; accepted planning runs
succeeded while tasks remained open awaiting explicit direction. Denied writes
stayed absent. Stop cancelled the real pending permission and retired owned
processes. Warm continuation preserved three turns and selected persisted replies.
Provider loss expired undeliverable input without automatic mutation replay.
Changed file bytes, validation results and accessible artifacts were independently
verified. Every selected result has complete evidence and no reported evidence
leaks or missing evidence.
### Retained failures and bounded fixture repairs
Every paid attempt ran serially with automatic retries disabled. Four local attempts and one Daytona attempt remain failed; none is relabeled or removed:
- `local-hello-complete-01`: the old task-creation helper expected the removed
title field. It failed before creating a task or starting a provider. The
repaired helper uses the prompt-only composer and captures the real creation
response ID. Its diagnosed repeat passed.
- `local-native-plan-cancel-01`: native cancellation, exact decision delivery,
terminal task/run state, workspace immutability, and cleanup passed. The model
inserted `PLAN` into the requested exact summary marker. This remains a
model/provider behavior failure. One repeat with the identical prompt and
assertions passed; the repeat does not erase the original failure.
- `local-native-write-deny-reconnect-01`: the provisional task title caused an
earlier task-naming permission request. The strict fixture waited for its
exact write command and timed out. Native permission fixtures now create an
explicit title through Search's public creation action before starting the
provider. No policy or provider prompt changed. The original full cleanup
grade remains failed because denial proof was incomplete. Its complete process
journal was empty, a later identity check confirmed all ten owned processes
were gone, and the continuous watcher recorded no target mutation.
- `local-native-write-deny-reconnect-02`: the exact write was denied and the task
became Blocked, but the fixture expected the old Cursor-specific error text.
The provider lifecycle cleanup correctly emits the provider-neutral diagnostic.
The fixture now accepts that exact diagnostic and the exact historical one;
all request, command, turn, terminal, no-replay and no-effect requirements stay
in place. The original failed cleanup grade remains recorded. Its process
journal was empty and its continuous watcher recorded no target mutation.
The subsequent live repeat completed every required assertion and cleanup.
- `daytona-warm-three-turn-01`: all three runs and file updates completed, but
the fixture stopped its response wait on an earlier deliverable-preparation
comment. The final marker was persisted 53ms after the final run finished and
is present with its selected-comment receipt in the retained fallback evidence.
The original verdict remains failed and cleanup passed. The consistency wait
now hydrates the native run detail and requires its actual selected comment;
it cannot substitute a finish summary or a file-preparation message. The
affected repeat passed with unchanged prompts and continuity assertions.
The shared browser helper also received a review fix for remembered project
selection. Credential-free browser checks create repeated tasks, switch projects,
and verify ordinary and explicit-title creation in standard, planning and ask work modes with
paused agents. All three checks pass without provider runs. Fixture typecheck,
1,627 Vitest checks (one skip), and 128 Node checks passed; the final diagnostic
repair passed 150 focused native lifecycle checks. A failing provider-free search
probe remains retained; the corrected probe scopes the exact phrase to tasks.
The existing seven Runner semantic passes and seven strict accounting failures
remain historical results under their original build identities. This campaign
is the focused 18-cell installed-release selection, not a rerun of the full
catalog. Native AskQuestion and authoritative per-run dollar accounting remain
excluded. Per-run USD remains unknown. The original $100 total budget is bounded
by the existing $25 account-cycle cap plus retained commitments and infrastructure
reservations. The conservative committed/reserved total is $88.080380624, leaving
$11.919619376 unreserved; these are spending bounds, not measured provider spend.
<details>
<summary>Exact result receipts for all 23 attempts</summary>
Each result lives under `tests/runner-e2e/results/<campaign>/<suite>/runner-acpx-cursor/<environment>/<case>/attempt-1/result.json`.
The full campaign prefix is defined above. The SHA-256 identifies the original
result file; later diagnoses do not rewrite its verdict.
| Campaign suffix | Verdict / cleanup | Result SHA-256 |
| --- | --- | --- |
| `local-hello-complete-01` | failed / passed | `59d8dc9194ee74fe1cd9827103f2734abb5e14d81232280d80ffdb5f6dede9e7` |
| `local-hello-complete-02` | passed / passed | `e4c0839d417ee7de3d79d5c5898d7ad05fbe1c66103979cdea470a422ec1a0d2` |
| `local-file-edit-validate-01` | passed / passed | `d45f3b2975c9ac359e969940b2209f47096cfdcebd3302c6ab42d1933e1df351` |
| `local-structured-question-restart-resume-01` | passed / passed | `0ad49f9833236998b597a245de05ca7c05208865c0c5f50d944607b07242b2f9` |
| `local-native-plan-reject-revise-accept-01` | passed / passed | `07d83d372061894812e6751679fa4f3dfb1754989aaa63a4ca6828578504ca91` |
| `local-native-plan-cancel-01` | failed / passed | `dd22d0cfd3366fbebf041807401d16ff327e92b05e08521b220613df68fc2b1e` |
| `local-native-plan-cancel-02` | passed / passed | `a4b06aefec7570af8f818e2a2705f100e10f2e8bd26fa5a500e25a6f7dc85c11` |
| `local-native-write-deny-reconnect-01` | failed / failed | `aa27b5df8b1220dfa936934666c708f899d663d2b1c3a15faf19de3842af4c4d` |
| `local-native-write-deny-reconnect-02` | failed / failed | `066dbfef92e151b87c31a62f6a8f825af0bbcab8d791b4c0aa448e30e90e3066` |
| `local-native-write-deny-reconnect-03` | passed / passed | `33f8fedad38789d37874e7622e7bcb15227fa2412b8aa2b6ef919a03d3903988` |
| `local-pending-permission-stop-01` | passed / passed | `b8101e2155f4b6bce481ee0cddb6b1c34af71dbe20798081d8821eef2dc4fbe2` |
| `local-warm-three-turn-01` | passed / passed | `65c64e282ef0cb667c89b329c4b0f22104fd0d12c811aa450638bd093d04f2b5` |
| `local-pending-permission-provider-loss-01` | passed / passed | `f8e7dc15fa051081f38f5a08292eeec7c83713964b9fb26304a5a9d2dd6edfb5` |
| `daytona-hello-complete-01` | passed / passed | `787dd287c2d29350b9ad8e48fee73bdaecbdd059342bed44bc9304e5965bbe01` |
| `daytona-file-edit-validate-01` | passed / passed | `bdb575c04162a1a24fc6354a2a284fb156665ea02de2e69be7c250bd211a2bf5` |
| `daytona-structured-question-restart-resume-01` | passed / passed | `d72536f01147e8b7b77c1e82ed34c0faf0c99176700f7c101c95b0b5665d01df` |
| `daytona-native-plan-reject-revise-accept-01` | passed / passed | `3cdb6ef262788f949d44d7d1b84c258d0494968949fb6c010c4496cc07442e5e` |
| `daytona-native-plan-cancel-01` | passed / passed | `48190c0c3338c741aac319cd356dacfe1af011f8bdcea6fbf10d571fe6110211` |
| `daytona-native-write-deny-reconnect-01` | passed / passed | `d89dd8794c5866c3612ab9a60f023dd136740a8525fd0c93feacc7bd0e17f90a` |
| `daytona-pending-permission-stop-01` | passed / passed | `fc7aae403d32d1a587c4caf711bf9cba61cb7206f8c24bfac02175293874ce07` |
| `daytona-warm-three-turn-01` | failed / passed | `528145330b803d21dc25937d3ef768c6dda3bb6583ba35030d69112e8cefbe1a` |
| `daytona-warm-three-turn-02` | passed / passed | `e3e3c295714679ee5e7040f52ebeaf95e9f860bde1b5698fbd2566588a0e161a` |
| `daytona-pending-permission-provider-loss-01` | passed / passed | `e9d15896ae5fe72e239b4fff8dd4fc8743eb309fef084ad46275e681671f7821` |
</details>
## Historical merge-readiness refresh — 2026-10-05
The branch incorporates mainline `72ff3a9f2` without replacing the qualified
Cursor CLI, profile v11, patch or explicit model. Mainline's newer Codex, Claude
@@ -63,7 +244,7 @@ errors. Native approval requests were approved through Paperclip. The reviewer
did not create or edit the page. This trial uses the previously qualified public
package; it is additional live proof, not a new certification identity.
## Qualified release candidate
## Historical qualified release candidate — before generic cleanup
Cursor admission is enabled in [PR #15075](https://github.com/paperclipai/paperclip/pull/15075).
All ten local and ten fresh Daytona gates passed, including cleanup. The final
@@ -0,0 +1,98 @@
# Planning guidance reduction — 5 October 2026
Status: implementation and eval preparation; no live result yet.
## Decision and scope
Shorten the runtime plan-to-tasks skill and the bundled task-planning skill together.
Preserve skill identities, installed-version behavior, automatic accepted-plan
selection, authorization, and native/legacy mechanics. Remove the duplicated
operational-skill pointer. Do not merge without the human's authorization.
Base: `72ff3a9f27e581a27acb49771e8658bbb0bbaa47`. Prior work on PR #15218 and
its separate checklist remains untouched.
## Bounded comparison
Four ordinary execution scenarios: cohesive work; independent specialist outputs;
a real prerequisite between specialists; an independent adverse review.
Compare current, short, and disabled planning skills using public company-copy creation
and selection APIs in isolated companies. Archived current skill bytes come from
the base above. The disabled variant is an unassigned-selection ablation (the library remains discoverable), not a production
removal or an accepted-plan continuation test. Other instructions, tools, models,
permissions, fixtures, graders, budgets, and deadlines stay matched.
Initial scope: native Codex default profile, local, 12 cells, one attempt each,
500-cent company and per-agent hard stops, at most eight total run records per
cell, including coordination wakes. One exact pilot cell precedes the remaining
selection. No automatic retries or outcome rerolls. User authorization for paid
runs persists. Extra profiles/repetitions are not part of this initial comparison.
Judge independently saved results, authorship, child boundaries, dependency order,
review delivery, and parent completion. Retain all run records, failures, missing
evidence, source/fixture hashes, skill selections and served bytes, screenshots,
usage and billing coverage. Byte/word reductions are not token or cost savings.
Skill availability is not proof that a model read or cognitively used a skill.
Run credential-free source, catalog, type and grader calibration checks before
providers. Preserve positive, plausible wrong, and missing-evidence calibration.
Report exact scenario pairs rather than equal aggregate totals. Short guidance is
eligible only if the retained comparison supports it; inconclusive evidence stays
explicit. Automatic removal and existing installed copies need separate migration
and continuation qualification before a deletion recommendation can be shipped.
## Credential-free admission
- Product E2E TypeScript compilation: pass.
- Product E2E support: 1,286 Vitest tests and 128 Node checks pass.
- Catalog discovery: twelve explicit local Codex cells; excluded from `--all`.
- Archived source hashes: conversion `08cb036df0e05b1d704dc0cd547c4e37b73078597c072a85ff982a2bb9b3a370`; planning `9c52a44a30ec8d306119da51bf298e9e3e6c382a9a9559ffd3054bf5e0c75f36`. Both match the named base Git blobs exactly.
- Generated capability inventory and catalog are synchronized.
- No provider call has started. Live outcomes remain unqualified.
Source review found two fixture defects before provider execution: bundled and
catalog skills cannot be edited, and deleted core skills are automatically
restored. Campaign `37399550253` at `843238f43cb266f6ca0bc9d255881558ffd2eb71`
was cancelled; its paid-cell step was skipped, with zero provider runs and no
behavioral grade. Corrected setup creates editable, byte-identical company copies
and varies their explicit selection. No bundled deletion or in-place edit occurs.
Corrected fixture admission: all three current/short/unassigned variants pass real
company-skill creation, content readback and native-agent selection APIs against
a disposable PostgreSQL database. No heartbeat run rows were created. The
evaluator's 35 positive/wrong/missing-evidence checks pass, including rejection
of a bare issue-ID URL without the issues route. Product E2E typecheck passes.
Initial local DB checks were skipped until the dependency's missing library
symlinks were restored with its supplied postinstall script; skipped checks were
not counted as passes.
The next setup campaign, [37401094799](https://github.com/paperclipai/paperclip/actions/runs/37401094799),
measured source `370e51d110836b942e5f90567d2bbe260bcc0f3a` using trusted workflow
revision `0e0b63e5a551388ac4601ed982b3e8f1c772f123` (workflow blob
`0600886144d3e22ea2e4a38329a79177882f3948`). It remains an original FAIL,
classified by the harness as `candidate_failure`. Inspection shows a browser
fixture error before task creation: the shared helper waited for the old Task
title field. `runIds`, the company run ledger, and planning observation are all
empty; no model executed. Cleanup passed. The billing summary's runCount=1 is
its minimum-one placeholder (`billing.ts`), not evidence of a provider run;
runtime/actual charges remain unmetered. No original result is regraded.
The corrected planning-only browser helper uses the current description composer,
explicitly selects the owner, and captures the public task-create response ID. A
real browser/server/database calibration creates the exact prompt/assignment with
paused non-provider agents, confirms zero run rows, and deletes its company. It
passes. Before any model execution, prompts also explicitly name the already
required result document key and exact JSON fields, avoiding an unstated oracle
format assumption. The legacy helper and production UI remain unchanged.
Repository checks at the previous source: full typecheck and build pass. Local
full tests: 9,591 pass, 5,796 skip and one unchanged macOS real-Git streaming test
hits its five-minute deadline; an isolated check also fails. Preserve this
limitation. Normal CI found a different, exact cause: truncated random fixture
company prefixes collided in chat integration setup. An initial per-suite counter fixed within-run collisions but review found that
its values repeat against an external database on subsequent runs. The corrected
prefix contains the complete company UUID, with no truncation; distinct company
IDs therefore produce distinct prefixes within and across runs. All five affected
native-modal variants pass locally (1,058 unrelated cases filtered). This is a
test-only repair; the measured planning fixture and production guidance remain
frozen at `8538cfce4c2defdedc2efba7519bcfce880c4e00`.