# Pi 1.4 lifecycle lab — v0.1

Author: Ayobami John Haastrup (ayobamih)

Published: 25 October 2026

Canonical report: https://aiworkaccountability.com/writing/a-parked-agent-is-not-a-finished-job/

## Scope

An author-operated local Wrangler/workerd experiment using Cloudflare Agents 0.30.1, Pi Durable / Pi AI / Chord 1.4.0, Wrangler 4.151.2 and workerd 1.20261019.1. Linux x64; Node v24.18.0. `restartLimit` is configured to 2. A deterministic faux model invokes an inert, replay-safe tool. The tool counter is instrumentation, not an external business effect.

This is not a hosted Cloudflare acceptance test. The runner makes no model-provider or payment calls and requires no model API key. Package installation and Wrangler may access package/update services. No claim of network isolation is made.

## Contents

- `source/`: exact executed worker, runner, Wrangler configuration, package metadata and dependency lockfile.
- `evidence/successful/`: completed seven-case result and source hashes.
- `evidence/adapter-failure/`: original three-case diagnostic result, source hashes, original worker and exact correction diff. The original worker was reconstructed from the two-line correction and matched its previously recorded SHA-256. All other source files are identical to the successful run.
- `logs/`: unedited Wrangler stdout/stderr logs from both runs. Disposable database directories and installed dependencies are excluded.
- `environment.json`: observed package versions and npm latest-tag checks.
- `SHA256SUMS.txt`: hashes for the published files and download bundle; excludes itself.

The ZIP contains this guide, source, evidence, logs and environment record. The manifest beside the ZIP also hashes the ZIP itself. Hashes bind the published bytes together; these are not independently signed observations.

## Reproduce locally

Use a disposable Linux directory and Node 24.18.0 (or a compatible runtime). Keep port 18979 free. The runner sends SIGKILL only to process groups that it starts, and creates a fresh timestamped evidence directory for each invocation.

```sh
cd source
npm ci --ignore-scripts
node runner.mjs
```

Do not deploy this fixture: its routes are local laboratory controls, not a production service. The worker includes a localhost hostname check; that check is not a substitute for authentication. The recorded experiment uses `wrangler dev --local` and no remote bindings.

The runner's last stdout line reports the evidence directory, completed case count and aggregate pass flag. Verify that `cases` is 7 and `passed` is true; intermediate `result.json` files are checkpoints, not a completed-suite receipt. Each case writes its assertion outcome, event times, operation ID and instance IDs. The runner creates source hashes only after the loop finishes.

## Recorded outcomes

Corrected run: 2026-10-25T08:35:42.874Z to 2026-10-25T08:38:23.187Z; exit code 0.

| Mode | Repetitions | Outcome |
| --- | ---: | --- |
| control | 1 | done / completed |
| retry | 3 | two process restarts, parked, explicit retry, done / completed |
| abort | 3 | two process restarts, parked, explicit abort, unanswered / aborted |

All six recovery cases first cancelled a 300 ms wait, observed the operation still running, and later observed that waiting on parked work did not settle it. The time between the parked read and subsequent counter check was 368–609 ms. Retry cases ended with three recorded tool entries and a completion marker; abort cases ended with two entries and no completion marker. Duplicate submission after completion was rejected in all three retry cases.

Original diagnostic run: one passing control and two timeout failures before any injected process crash; exit code 1. The worker incorrectly used the harness-level wait signature with a bare AbortSignal. It also contained a harness-level abort call that the failing run never reached. The correction uses the root session handle for both operations. This is an adapter error, not an upstream defect report.

Across both runs: 10 case attempts, 8 assertion passes, 2 original-adapter failures. The 7/7 figure refers only to the completed corrected suite.

## Limits

Small, deterministic, local sample. No cloud eviction, unattended alarm-only wake-up, long-duration parking, storage-error injection, concurrent operator race, model-stream retry, production model, payment or other irreversible external effect was tested. Polling after process restart can wake the object. The diagnostic `onReport` Error objects became `{}` when serialised; those fields do not establish an error type or message. Assertions rely on pending/result states, new instance IDs and the local counters.

The polling loops and synthetic release flag are test instrumentation. Do not copy the fixture's active wait loop as a hibernation pattern. The original Stripe/Pi 1.3 baseline was not upgraded or rerun.

## Primary references

- https://developers.cloudflare.com/changelog/post/2026-10-22-pi-harness-pi-1-4/
- https://developers.cloudflare.com/agents/harnesses/pi/

ChatGPT/Codex assisted with experiment design, implementation, execution orchestration, analysis and drafting. These artifacts are published for inspection and reproduction; no independent reproduction is claimed.
