diff --git a/doc/plans/2026-10-02-pi-production-readiness.md b/doc/plans/2026-10-02-pi-production-readiness.md index 29b30f4dc75..7c6b6f24da0 100644 --- a/doc/plans/2026-10-02-pi-production-readiness.md +++ b/doc/plans/2026-10-02-pi-production-readiness.md @@ -5,6 +5,30 @@ set of release gates. Pi remains a candidate until every required gate passes. Keep behavioral qualification on the accepted fixtures. Do not expand it to widgets, images, Cursor or Copilot qualification. The existing draft stack must be reviewed in dependency order. +## Current delivery scope — 2026-10-08 + +The user narrowed this delivery to normal task completion and interactive +controls. Accounting and the broad release matrix are deferred. The finish line +is one real file edit, successful command validation, registered public download, +Done and a succeeded native run; three follow-up turns with continuity; browser +questions and answers; plan approval; same-turn steering and denial; Stop; and +controller recovery with the original native question and run. Use the retained +`b696e131ae32a82418e570b32f4727b5adb14e49` packages and cloud image, the approved +Sonnet 4.6 fixture and low thinking. No local Docker, provider expansion, image +rebuild, or accounting change is needed for this scope. + +The first current-cloud file attempt, `pi-core-0-1791470050`, edited, validated, +published and finished through the real product. Its strict definition-4 grade +is failed: the public task description escaped the unfenced validation command +as Markdown paragraph text; the first Bash invocation had a syntax error, then +Pi repaired it and ran a second command. The exact post-edit and downloaded +bytes match, production copy-back finalized, and the issue/run reached +Done/succeeded. Do not change this grade or count it as qualification. All 41 +canonical files (91,468,056 bytes) are retained with archive SHA-256 +`065146a206da9f29b50999b5d931b54402edd5d30a516895a7ab8fb95e8a6029`; +independent process and scratch cleanup pass. Definition 5 fences the unchanged +command for literal Markdown paste; the one-command grader stays unchanged. + ## Correct cloud memory-read authority — 2026-10-08 Frozen runtime/image `b696e131ae32a82418e570b32f4727b5adb14e49` passes all @@ -2409,7 +2433,7 @@ Keep rollout held until every release gate is proven. and supersede once the tested correction is frozen. No workflow edit, lockfile commit, new model, fallback key, merge or release occurs. -## Remaining work in order +## Broader release follow-ups — deferred for current delivery 1. Cloud memory acceptance is complete for the frozen `b696e131ae32a82418e570b32f4727b5adb14e49` runtime/image and definition-22 harness `da8d4454ae165b557ff11730e9fe018c9b1cd9b9`. diff --git a/tests/runner-e2e/FIXTURES.md b/tests/runner-e2e/FIXTURES.md index acd34869225..de43d5d16c8 100644 --- a/tests/runner-e2e/FIXTURES.md +++ b/tests/runner-e2e/FIXTURES.md @@ -391,8 +391,11 @@ requires one native edit lifecycle followed by exactly one successful native bash execution with the exact nonce-bound byte-validation command as its projected title and a validation marker. A marker-only echo cannot pass. Final bytes must match the fixture. The Pi task prompt explicitly forbids additional shell calls, -including metadata commands, and supplies the expected post-edit byte size and -hash for registration. Extra Bash calls fail the unchanged oracle even when the +including metadata commands and repair attempts. It supplies the expected post-edit +byte size and hash for registration. Extended definition 5 places the exact command in a +fenced Bash block so the production Markdown editor preserves its operators and +literal escapes. Definition 4's escaped-paragraph attempt keeps its failed grade. +Extra Bash calls fail the unchanged oracle even when the edited file and downloadable artifact are correct. Extended definition 4 makes Pi's artifact title equal the exact filename required by the shared registered artifact check. Definition 3 attempts retain their original definitions and diff --git a/tests/runner-e2e/catalog.ts b/tests/runner-e2e/catalog.ts index 3681558a9b4..ff314e6d5b2 100644 --- a/tests/runner-e2e/catalog.ts +++ b/tests/runner-e2e/catalog.ts @@ -1223,7 +1223,7 @@ export const runnerSuites: readonly RunnerSuiteFixture[] = [ groups: ["native"], profiles: extendedHarnessProfiles, environments: runnerEnvironments, tasks: [...openRouterBreadthTasks, localIntegrityTasks[1]!, extendedHarnessFileTask], expectedMatrixSize: 30, - definitionMetadata: { version: 4, qualification: "pending", scheduling: "explicit-only", admission: "host-exact-candidate-and-model", authenticatedDiscoveryDate: "2026-09-28", piFileEvidence: "seed-edit-single-execute-public-download-v2", piFileArtifactTitle: "exact-filename" }, + definitionMetadata: { version: 5, qualification: "pending", scheduling: "explicit-only", admission: "host-exact-candidate-and-model", authenticatedDiscoveryDate: "2026-09-28", piFileEvidence: "seed-edit-single-execute-public-download-v2", piFileArtifactTitle: "exact-filename", piFileCommandTransport: "fenced-bash-markdown-paste" }, }, { id: "instruction-persistence", label: "Instruction Persistence", diff --git a/tests/runner-e2e/pi-file-evidence.test.ts b/tests/runner-e2e/pi-file-evidence.test.ts index cd453423c7f..0eda6cd77a4 100644 --- a/tests/runner-e2e/pi-file-evidence.test.ts +++ b/tests/runner-e2e/pi-file-evidence.test.ts @@ -5,7 +5,7 @@ import { mkdtemp, readFile, rm, writeFile } from "node:fs/promises"; import { tmpdir } from "node:os"; import { dirname, join } from "node:path"; import { describe, expect, it, vi } from "vitest"; -import { collectPiFileEvidence, gradePiCopyback, gradePiFileEvidence, piFileContract, seedPiFile } from "./pi-file-evidence.js"; +import { collectPiFileEvidence, gradePiCopyback, gradePiFileEvidence, piFileContract, piFilePrompt, seedPiFile } from "./pi-file-evidence.js"; import { canonicalProviderEventsFromAcpxRuntimeEvent, createAcpxToolEventNormalizer } from "../../packages/paperclip-runner/src/provider-events.js"; import { safeAcpxLocations } from "../../packages/paperclip-runner/src/drivers/acpx/safe-locations.js"; import { classifyFailure } from "./failure-classifier.js"; @@ -186,6 +186,13 @@ describe("Pi edit, validation and public artifact oracle", () => { await expect(validate()).rejects.toMatchObject({ code: 1 }); } finally { await rm(root, { recursive: true, force: true }); } }); + it("pastes the literal validation command as Markdown code instead of escaped paragraph text", () => { + const command = piFileContract("0123456789ab-1").validationCommand; + const fenced = piFilePrompt("0123456789ab-1").match(/\n```bash\n([^\n]+)\n```\n/u); + expect(fenced?.[1]).toBe(command); + expect(fenced?.[1]).toContain("!=="); + expect(fenced?.[1]).not.toContain("!\\=\\="); + }); it("changes only Pi file prompts and keeps all four question methods", () => { const cells = runnerMatrix.filter(c => c.suite.id === "extended-harnesses" && c.task.id === "file-edit-validate"); expect(cells).toHaveLength(6); diff --git a/tests/runner-e2e/pi-file-evidence.ts b/tests/runner-e2e/pi-file-evidence.ts index 7e5eeadb996..0dbd7c0283f 100644 --- a/tests/runner-e2e/pi-file-evidence.ts +++ b/tests/runner-e2e/pi-file-evidence.ts @@ -21,7 +21,7 @@ export function piFilePrompt(nonce: string) { const c = piFileContract(nonce); return [ `The fixture has already created ${c.filename} in your execution workspace with exactly ${JSON.stringify(c.before)}. Read it, then use your native edit tool once to replace those bytes with exactly ${JSON.stringify(c.after)}. Do not substitute write, bash, or an API for the edit.`, - `Run this exact native bash command exactly once, without an added shell prefix or suffix:\n${c.validationCommand}\nIt independently reads the file, fails on incorrect bytes, and prints the validation marker only after success. This is the only bash call allowed for this task; do not run any other shell commands.`, + `Run this exact native bash command exactly once, without an added shell prefix or suffix:\n\`\`\`bash\n${c.validationCommand}\n\`\`\`\nIt independently reads the file, fails on incorrect bytes, and prints the validation marker only after success. This is the only bash call allowed for this task; do not run any other shell commands.`, `Deliver the edited text file as a downloadable attachment using the assigned register_deliverable semantic tool, with filename and workspace-relative contentRef ${c.filename}, contentType text/plain, byteSize ${c.byteSize}, sha256 ${c.sha256}, title ${c.filename}, and a fresh idempotencyKey. Use the supplied byteSize and sha256 for the exact validated post-edit bytes; do not run extra commands to obtain metadata. Wait for the real registration receipt. Do not upload a different file or claim publication from a disk path.`, `After successful validation and registration, call paperclip_finish with reportedWorkDisposition done, summary EXTENDED-FILE-${nonce}, the current completion contract revision and satisfied objective criterion, no remaining work, the actual validation command/result, and the registered artifact reference.`, `Wait for paperclip_finish to succeed, then emit exactly EXTENDED-FILE-${nonce} as your final response. Do not create unrelated files or work.`,