diff --git a/doc/architecture/runner-cursor-capabilities.md b/doc/architecture/runner-cursor-capabilities.md index 974609076a6..f394a812c32 100644 --- a/doc/architecture/runner-cursor-capabilities.md +++ b/doc/architecture/runner-cursor-capabilities.md @@ -1,6 +1,6 @@ # Cursor ACP capability inventory -Evidence date: 2026-09-28. Candidate: `2026.09.26-dd393fe`. This profile is **not live-qualified**. One authorized task-context prompt on the initial free account returned an upgrade requirement, invoked no semantic tools, and supplied no usage receipt. Its cost is unknown; the account dashboard remained unchanged at coarse precision. The user then selected another account, whose exact-model local Runner Eval passed task-context and history tools with clean terminal settlement. Its dashboard attributed 56K rounded tokens to included usage and no incremental charge; ACP still supplied no token or dollar receipt. The local Product hello subsequently passed through the real browser, server, database, native runner, and authenticated completion tool. Native interactions, file validation, restrictive permissions, recovery, and Daytona execution remain required qualification gates. +Evidence date: 2026-09-28. Candidate: `2026.09.26-dd393fe`. This profile is **not live-qualified**. One authorized task-context prompt on the initial free account returned an upgrade requirement, invoked no semantic tools, and supplied no usage receipt. Its cost is unknown; the account dashboard remained unchanged at coarse precision. The user then selected another account, whose exact-model local Runner Eval passed task-context and history tools with clean terminal settlement. Its dashboard attributed 56K rounded tokens to included usage and no incremental charge; ACP still supplied no token or dollar receipt. The local Product hello subsequently passed through the real browser, server, database, native runner, and authenticated completion tool. A second local Product case passed file creation, editing, command validation, an independent exact-byte matcher, and visible workspace artifact presentation. Native interactions, restrictive permissions, recovery, and Daytona execution remain required qualification gates. The reference is the runner's Codex app-server integration and its closed thread-item inventory in `src/provider-events.ts`. Cursor ACP and its private extension methods are the transport; the legacy Cursor adapter is unchanged. @@ -115,6 +115,8 @@ The replacement-account attempt passed all four canonical `get-task-context` che The local Product hello first stopped at agent creation with HTTP 422 before any provider prompt. Foundation `26dde3cfe` fixed exact host-owned candidate/model admission at the public agent API. The separately authorized replacement passed at source `edf538e61e712dddb6b4d59045c3dcfd445686c7`, from 19:41:56.376 to 19:42:38.761 UTC. All six independent matchers passed: one exact completion marker, task Done, run succeeded, native mode, and local execution. The retained run confirms the 120-second configured deadline, no timeout, committed finalization, and clean cleanup. The final screenshot was inspected and shows the Cursor assignee, tool activity, one completion marker, and Done status. Native usage is null. The account Usage page attributes a new 19:42:25 UTC Luna row with 41.7K tokens, Included in Pro Plus, and zero incremental cash. Metered dollars remain unavailable; a conservative $0.06 list-price bound uses at most 42K rounded tokens at $1.20/M and is not a billing receipt. This proves the local completion-tool product path, not native question/plan, permission, file, recovery, or Daytona qualification. Both attempts remain in the sanitized evidence fixture. +The local file-edit Product case passed at source `fe132224c2b30a8d9ce7b46cea38b8760af233fc`, from 19:44:43.582 to 19:45:24.406 UTC. All seven matchers passed, including an independent exact-byte read of the 24-byte final file. A native shell command created then rewrote the file and asserted the expected bytes; tool lifecycle and output were retained. The inspected browser screenshot shows the file, a downloadable workspace artifact card, edited-file activity, the completion marker, and Done. Cleanup passed. This is workspace artifact discovery and presentation evidence, not provider-reported diff projection. The account Usage page attributes a 19:44:59 UTC Luna row with 84.1K tokens, Included in Pro Plus, and zero incremental cash. Metered dollars remain unknown; the conservative list-price bound is $0.102, not an invoice. The trace also confirms a meaningful remaining field gap: native command `rawOutput.exitCode:0` survives in serialized output, while canonical `exitCode` remains null; extracting only validated command results is a P2 follow-up. + The first attempt also exposed the shared live-eval layer's rejection of missing usage. The foundation now retains explicit unavailable-usage records for diagnostic candidates, leaves the numeric receipt ledger empty, preserves the response for grading, and keeps unknown aggregate costs unknown across mixed turns. This fix does not retroactively turn the retained failed attempt into a pass. [Cursor's Grok Bot billing documentation](https://cursor.com/help/grok-bot/plans) says linking SuperGrok grants Grok Bot usage while leaving the Cursor plan unchanged. [Cursor's pricing page](https://cursor.com/pricing) lists Composer for free Hobby and frontier models for paid plans. These documents and model-list presence do not establish entitlement for a particular CLI prompt. The operator selected a replacement Pro+ account; its exact Luna configuration was echoed successfully, with no automatic model substitution. diff --git a/packages/paperclip-runner/test/fixtures/cursor-acp/authenticated-qualification-attempts.json b/packages/paperclip-runner/test/fixtures/cursor-acp/authenticated-qualification-attempts.json index f944b076c00..13e84bfeb07 100644 --- a/packages/paperclip-runner/test/fixtures/cursor-acp/authenticated-qualification-attempts.json +++ b/packages/paperclip-runner/test/fixtures/cursor-acp/authenticated-qualification-attempts.json @@ -247,6 +247,101 @@ "conservativeListCostUpperBoundUsd": 0.06, "listCostBoundBasis": "At most 42,000 rounded-display tokens at the maximum listed $1.20 per million token rate, rounded up to $0.06; not a billing receipt." } + }, + { + "id": "cursor-product-file-edit-20260928", + "family": "product-e2e", + "case": "extended-harnesses.runner-acpx-cursor.local.file-edit-validate", + "runnerSourceRevision": "fe132224c2b30a8d9ce7b46cea38b8760af233fc", + "suiteDefinitionHash": "e75cb2222d2f52ec3a2a425211d195d36b95882de2cb9ed0ad93231b7c42768a", + "runnerdSha256": "986060810ba7377c6ddd64a5d89e322d0a434e1a9c80400e6d4acf5934bfc421", + "requestedModel": "gpt-5.6-luna[context=272k,reasoning=medium,fast=false]", + "startedAt": "2026-09-28T19:44:43.582Z", + "finishedAt": "2026-09-28T19:45:24.406Z", + "durationMs": 40824, + "providerStartedAt": "2026-09-28T19:44:48.263Z", + "providerFinishedAt": "2026-09-28T19:45:20.690Z", + "providerTimeoutSec": 120, + "timeoutFired": false, + "result": "passed", + "automaticRetries": 0, + "submittedPrompts": 1, + "providerRuns": 1, + "matchers": [ + { + "kind": "message_exact", + "passed": true + }, + { + "kind": "message_occurrences", + "passed": true + }, + { + "kind": "issue_status", + "passed": true + }, + { + "kind": "run_status", + "passed": true + }, + { + "kind": "runtime_mode", + "passed": true + }, + { + "kind": "environment", + "passed": true + }, + { + "kind": "file_exact", + "passed": true + } + ], + "invariantFailures": [], + "taskStatus": "done", + "runStatus": "succeeded", + "cleanup": "passed", + "resultSha256": "2554fd5709ce35712a3f23405fe7550d169b9f3a0cde2a9906c18e4f7ba4ae86", + "screenshot": { + "id": "final-state", + "sha256": "712a1b2105ff54530db9d2a7ff3764c53ad9cbf2bbe047e90010e8f44563972c", + "visuallyInspected": true, + "observed": "Task Done; Cursor assignee; 24-byte text file and downloadable artifact card; Used tools, edited files; one completion marker." + }, + "fileEvidence": { + "exactFinalBytesMatched": true, + "sizeBytes": 24, + "sha256": "a6a152b61f60708dc2982f1a0c06cb8dd7ba6339d26018a0f00a072534fd8c18", + "commandValidation": "Python compared actual bytes to the expected bytes and exited successfully.", + "workspaceArtifactPresented": true, + "providerDiffProjectionQualified": false + }, + "observedEventGap": { + "field": "native command rawOutput.exitCode", + "nativeValue": 0, + "canonicalExitCode": null, + "preservedAs": "serialized rawOutput text", + "followUp": "P2: validated numeric command result projection; do not infer from arbitrary output text." + }, + "usage": { + "nativeReceipt": null, + "tokenUsage": null, + "costUsd": null, + "coverage": "provider usage unavailable; dashboard row attributed" + }, + "scope": "Real local create/edit/command-validation plus independent byte matcher and visible workspace artifact. Does not qualify provider-native diff projection, restrictive denial, native input, recovery, or Daytona.", + "billing": { + "source": "parent-observed account Usage row after bounded attempt", + "observedRequestAt": "2026-09-28T19:44:59Z", + "modelLabel": "gpt-5.6-luna-medium", + "tokensDisplay": "84.1K", + "usageType": "Included in Pro Plus", + "chargeDisplay": "Included", + "incrementalCashChargeUsd": 0, + "meteredCostUsd": null, + "conservativeListCostUpperBoundUsd": 0.102, + "listCostBoundBasis": "Rounded dashboard token count bounded conservatively at the maximum listed $1.20 per million token rate; not a billing receipt." + } } ], "newAccountDiscovery": {