mirror of
https://github.com/paperclipai/paperclip.git
synced 2026-10-27 02:44:50 +01:00
docs(runner): record Phase 3 recovery evidence
Co-Authored-By: Paperclip <noreply@paperclip.ing>
This commit is contained in:
1 parent
b6ec51df04
commit
486069e369
28 files changed
+7701
-21
No files matched your search
@@ -8,10 +8,12 @@ Phase 0 runs both implementations against one language-neutral fixture. Phase 1
|
||||
adds executable PRP schemas, a cross-language conformance corpus, deterministic
|
||||
static replay, and a standalone browser reference page. Phase 2 adds the Rust
|
||||
runner process, process-group supervision, a scripted fake harness over stdio
|
||||
JSONL, a TypeScript mock core, and validated live browser replay. These phases do
|
||||
not import or start Paperclip's server, UI, CLI, or production database.
|
||||
JSONL, a TypeScript mock core, and validated live browser replay. Phase 3 adds
|
||||
the Rust outbound WebSocket client, private durable state, replay and restart
|
||||
recovery, and safe CLI/browser diagnostics. These phases do not import or start
|
||||
Paperclip's server, UI, CLI, or production database.
|
||||
|
||||
## Phase 0–2 quick start
|
||||
## Phase 0–3 quick start
|
||||
|
||||
From the repository root:
|
||||
|
||||
@@ -49,6 +51,7 @@ devtool:
|
||||
```sh
|
||||
pnpm --filter @paperclipai/paperclip-runner replay:phase1
|
||||
pnpm --filter @paperclipai/paperclip-runner trace:phase2 -- --scenario happy-path
|
||||
pnpm --filter @paperclipai/paperclip-runner trace:phase3 -- --fault lost-ack
|
||||
pnpm --filter @paperclipai/paperclip-runner browser:dev --host 127.0.0.1 --port 4179
|
||||
```
|
||||
|
||||
@@ -68,12 +71,13 @@ pnpm --filter @paperclipai/paperclip-runner browser:dev --host 127.0.0.1 --port
|
||||
| `trace:phase0` | Run the Rust mock-core tracer, print the stable result, and exit. |
|
||||
| `trace:phase0:typescript` | Run the TypeScript reference tracer directly. |
|
||||
| `replay:phase1` | Validate and reduce a fixture to a final snapshot. |
|
||||
| `browser:dev` | Open the editable fixture/static replay reference page. |
|
||||
| `trace:phase2` | Run one native local session through the Rust runner and fake harness. |
|
||||
| `record:phase2` | Capture a validated happy-path live trace as a replay fixture. |
|
||||
| `browser:dev` | Start the standalone live/replay browser devtool. |
|
||||
| `trace:phase3` | Run the Rust runner against the mock core with a selected recovery fault. |
|
||||
| `record:phase3` | Regenerate the complete Phase 3 fault matrix and exact per-fault traces. |
|
||||
| `browser:dev` | Start the standalone live/replay/recovery browser devtool. |
|
||||
| `test:browser` | Exercise static replay and live scenarios, then capture temporary screenshots under ignored test output. |
|
||||
| `verify` | Run the complete Phase 0, Phase 1, and Phase 2 acceptance sequence. |
|
||||
| `verify` | Run the complete Phase 0 through Phase 3 acceptance sequence. |
|
||||
| `verify:rootless` | Extract Debian/Ubuntu browser libraries without root, then run `verify`. |
|
||||
|
||||
## Navigate
|
||||
@@ -84,6 +88,8 @@ pnpm --filter @paperclipai/paperclip-runner browser:dev --host 127.0.0.1 --port
|
||||
- [Phase 1 hand-run tutorial](docs/tutorials/phase-01-static-replay.md)
|
||||
- [Phase 2 hand-run tutorial](docs/tutorials/phase-02-local-runner.md)
|
||||
- [Phase 2 local protocol reference](docs/phase-02-local-protocol.md)
|
||||
- [Phase 3 break-it-on-purpose tutorial](docs/tutorials/phase-03-break-recovery.md)
|
||||
- [Phase 3 durable transport reference](docs/phase-03-durable-transport.md)
|
||||
- [PRP compatibility/versioning policy](docs/protocol-compatibility.md)
|
||||
- [Cumulative end-to-end tutorial](docs/tutorials/end-to-end.md)
|
||||
- [Journal guide](docs/journal.md)
|
||||
@@ -91,6 +97,4 @@ pnpm --filter @paperclipai/paperclip-runner browser:dev --host 127.0.0.1 --port
|
||||
- [Implementation plan](spec/paperclip-native-runner-implementation-plan.md)
|
||||
- [Normative spike specification](spec/paperclip-native-runner-spike-spec.md)
|
||||
|
||||
Phase 2 is local and deterministic. It does not add durable network transport,
|
||||
reconnect, production Paperclip integration, or a real model harness. Those
|
||||
capabilities remain behind later checkpoints in the implementation plan.
|
||||
Phase 3 adds package-local durable network recovery. Production Paperclip integration and a real model harness remain deferred.
|
||||
@@ -169,6 +169,33 @@ Every browser event passes `validatePrpEvent` and `applyPrpEvent`. When the run
|
||||
ends, the browser reduces the complete event list again and compares the replay
|
||||
snapshot with the live snapshot.
|
||||
|
||||
## Phase 3 durable transport boundary
|
||||
|
||||
```text
|
||||
TypeScript mock core
|
||||
| one-time ticket -> short-lived connection lease
|
||||
| PRP v1 hello/welcome, commands, events, cumulative ACKs
|
||||
v
|
||||
paperclip-runnerd (Rust WebSocket client)
|
||||
| atomic private JSON state
|
||||
+-- durable outbox and processed-command cache
|
||||
+-- stable runner/session/turn/item identities
|
||||
+-- Phase 2 fake-harness process for restart proof
|
||||
```
|
||||
|
||||
The runner initiates the loopback WebSocket. The bootstrap ticket is present
|
||||
only in the runner process environment. The returned connection-lease token is
|
||||
kept only in runner memory. The mock core stores SHA-256 digests of capabilities
|
||||
and the runner state stores neither capability. The runner writes each event and
|
||||
command result before network delivery, then removes outbox events only after a
|
||||
valid cumulative ACK.
|
||||
|
||||
The TypeScript peer is a package-local test controller, not production
|
||||
Paperclip. It injects lost ACKs, socket loss, malformed input, process restarts,
|
||||
lease expiry, storage pressure, drain, and revoke. The browser recovery page
|
||||
calls that peer through guarded package-local Vite middleware and renders only
|
||||
safe trace fields.
|
||||
|
||||
## Future integration rule
|
||||
|
||||
The [implementation plan](../spec/paperclip-native-runner-implementation-plan.md)
|
||||
|
||||
@@ -8,6 +8,7 @@ Each tutorial starts with an explanation of what the phase is and what the phase
|
||||
- [Phase 0: standalone tracer](tutorials/phase-00-standalone-tracer.md) — install the workspace, validate its Rust/TypeScript boundary and knowledge bundle, then run the deterministic Rust mock-core path and cross-language parity check.
|
||||
- [Phase 1: static PRP replay](tutorials/phase-01-static-replay.md) — validate the shared schema/fixture corpus, reduce a fixture in the CLI, and inspect the same final snapshot in the standalone browser page.
|
||||
- [Phase 2: local runner and fake harness](tutorials/phase-02-local-runner.md) — run a supervised Rust process, exercise scripted live scenarios, resolve requests, interrupt a turn, and confirm live/replay parity.
|
||||
- [Phase 3: break recovery on purpose](tutorials/phase-03-break-recovery.md) — lose an ACK, drop the socket, restart the runner side, replay durable events, and inspect recovery diagnostics.
|
||||
- [Cumulative end-to-end tutorial](tutorials/end-to-end.md) — the shortest complete workflow available at the current phase.
|
||||
|
||||
## Reference
|
||||
@@ -15,9 +16,9 @@ Each tutorial starts with an explanation of what the phase is and what the phase
|
||||
- [Architecture and dependency boundary](architecture.md)
|
||||
- [PRP compatibility and versioning policy](protocol-compatibility.md)
|
||||
- [Phase 2 local protocol and supervision](phase-02-local-protocol.md)
|
||||
- [Phase 3 durable transport and recovery](phase-03-durable-transport.md)
|
||||
- [Engineering journal guide](journal.md)
|
||||
- [Dated shadcn/ui and AI Elements compatibility note](research/2026-08-07-ui-library-compatibility.md)
|
||||
- [Package README](../README.md)
|
||||
|
||||
Phase 2 is implemented and ready for its human checkpoint. Later tutorials are
|
||||
added only after their phase is authorized and implemented.
|
||||
Phase 3 is implemented and ready for its review and human checkpoint. Later tutorials remain deferred.
|
||||
@@ -0,0 +1,203 @@
|
||||
# Phase 3 Durable Transport and Recovery
|
||||
|
||||
Phase 3 adds a real outbound WebSocket path to the standalone package. The
|
||||
Rust `paperclip-runnerd` process is the client. The TypeScript mock core is the
|
||||
remote peer. Neither side imports Paperclip server, UI, database, or shared
|
||||
control-plane code.
|
||||
|
||||
This is a local reliability proof. The mock uses `ws://127.0.0.1` so tests do
|
||||
not need certificates. A production bridge must use `wss://` and remains a
|
||||
later, separately reviewed phase.
|
||||
|
||||
## Connection and authentication
|
||||
|
||||
The connection starts in this order:
|
||||
|
||||
1. The mock core creates a random bootstrap ticket with a five-second lifetime.
|
||||
2. The ticket is passed to the runner through
|
||||
`PAPERCLIP_RUNNER_BOOTSTRAP_TICKET`. It is not a command-line argument.
|
||||
3. The runner opens an outbound WebSocket and sends the ticket in the HTTP
|
||||
`Authorization` header.
|
||||
4. The runner sends a PRP v1 `hello` envelope. It names the stable runner and
|
||||
environment lease, approved runner version and digest, platform,
|
||||
capabilities, and durable resume cursors.
|
||||
5. The mock core consumes the ticket once and sends a `welcome` envelope. The
|
||||
welcome selects PRP v1, returns a short-lived connection lease, reports the
|
||||
cumulative committed event cursor, and carries at most one pending command.
|
||||
6. Later connections authenticate with the connection lease. A real runner
|
||||
process restart receives a new one-time bootstrap ticket and loads the same
|
||||
durable state before it connects.
|
||||
|
||||
The runner keeps the live connection lease token in memory only. Its state file
|
||||
does not contain the bootstrap ticket or connection lease token. The mock core
|
||||
persists only SHA-256 digests of those capabilities. A used or expired ticket is
|
||||
rejected with `401`. The mock also rejects a changed runner identity, environment
|
||||
lease, runner version, or runner digest.
|
||||
|
||||
The daemon captures and removes the bootstrap environment variable before it
|
||||
parses arguments or starts child work. Secret buffers are overwritten when they
|
||||
are dropped. It resolves the destination once before sending a bearer value and
|
||||
accepts only concrete loopback addresses. Userinfo, query strings, fragments,
|
||||
wildcards, private-network addresses, public addresses, and mixed DNS answers
|
||||
fail closed.
|
||||
|
||||
## WebSocket limits
|
||||
|
||||
The package client implements the RFC 6455 upgrade and masked client text
|
||||
frames with Node-free Rust standard-library code. The mock core validates the
|
||||
upgrade and parses bounded masked frames.
|
||||
|
||||
- Maximum HTTP upgrade headers: 16 KiB.
|
||||
- Maximum PRP frame: 1 MiB.
|
||||
- Unknown frame opcodes and unmasked client frames close the connection.
|
||||
- Malformed JSON is recorded as a bounded diagnostic. Durable state remains
|
||||
available for reconnect.
|
||||
- WebSocket ping/pong and PRP diagnostic pong state are supported.
|
||||
|
||||
## Durable runner state
|
||||
|
||||
The runner writes `runner-state.json` below its private state directory. The
|
||||
directory uses mode `0700` and the file uses mode `0600` on Unix. Every update
|
||||
is written to an exclusive unpredictable sibling file, synchronized, atomically
|
||||
renamed, and followed by a parent-directory sync. Symlinked directories or state
|
||||
files, wrong ownership, and wrong modes fail closed.
|
||||
|
||||
The state contains:
|
||||
|
||||
- stable runner, environment lease, run, session, turn, and item IDs;
|
||||
- next source event sequence and cumulative acknowledged source sequence;
|
||||
- unacknowledged event envelopes and their byte counts;
|
||||
- a processed-command cache with a non-secret command digest and prior result;
|
||||
- lifecycle, reconnect, backpressure, harness generation, and recovery facts;
|
||||
- bounded, redacted diagnostics.
|
||||
|
||||
Authentication capabilities and arbitrary command bodies are not stored. A
|
||||
command is represented by an FNV-1a comparison digest, its stable ID and
|
||||
controller sequence, the redacted result, and the logical-effect count.
|
||||
|
||||
## Event delivery and ACKs
|
||||
|
||||
The runner writes an event to the outbox before it sends the event. Event IDs
|
||||
and source sequence numbers do not change after reconnect or restart.
|
||||
|
||||
The mock core commits or deduplicates an event before it sends this cumulative
|
||||
ACK:
|
||||
|
||||
```json
|
||||
{
|
||||
"kind": "ack",
|
||||
"payload": { "ackedSourceSeq": 9 }
|
||||
}
|
||||
```
|
||||
|
||||
The ACK means that every source event through sequence 9 is committed or
|
||||
deduplicated. The runner rejects an ACK that moves backward or beyond its
|
||||
produced source cursor. It removes only events at or below a valid ACK.
|
||||
|
||||
For the lost-ACK fault, the mock commits an event, drops the ACK and socket, and
|
||||
reports the prior cursor once after reconnect. The runner sends the same bytes
|
||||
again. The mock increments delivery count, keeps one logical event, and sends
|
||||
the committed cumulative ACK.
|
||||
|
||||
## Command delivery and effects
|
||||
|
||||
Mock-core commands are durable before delivery. Only the lowest pending
|
||||
controller sequence is sent. A command result advances the queue.
|
||||
|
||||
The runner stores a command result before it sends the result. When a result or
|
||||
socket is lost, the same command is delivered again. An equal command ID and
|
||||
digest returns the stored result. It does not add events or repeat a process
|
||||
effect. Reusing the ID with different bytes is rejected.
|
||||
|
||||
The trace records `logicalEffectCount`. Every completed command has exactly one
|
||||
logical effect. A policy rejection, such as a new turn during drain or storage
|
||||
pressure, has zero effects.
|
||||
|
||||
## Restart and reconciliation
|
||||
|
||||
A socket drop keeps the same Rust process and in-memory lease. The process
|
||||
reconnects and reloads the mock-core command and event cursor.
|
||||
|
||||
A runner restart kills the real Rust process with unacknowledged work. A new
|
||||
Rust process receives a fresh ticket, reads the same state file, emits a P0
|
||||
`runner.reconciled` event, and continues the same runner, session, turn, item,
|
||||
command, and source-event identities.
|
||||
|
||||
The harness-restart fault starts the real Phase 2 `fake-harness` child, waits
|
||||
for its ready message, terminates its process group, and starts a second child.
|
||||
The runner then emits `harness.exited`, `harness.ready`, and
|
||||
`session.reconciled` events with the same normalized session, turn, and item
|
||||
IDs.
|
||||
|
||||
If a lease expires, reconnect fails closed. The runner records
|
||||
`lease_expired_requires_bootstrap` and exits with its state intact. The mock
|
||||
then gives the replacement runner a fresh ticket. Recovery continues from the
|
||||
same cursor.
|
||||
|
||||
If recovery cannot be truthful, state names the outcome. For example, failure
|
||||
to reserve storage for a P0 event records `p0_storage_exhausted` and the
|
||||
`unrecoverable` lifecycle. It never reports a fresh session as resumed.
|
||||
|
||||
## Backpressure and bounded storage
|
||||
|
||||
The runner has a byte limit and a reserved P0 region.
|
||||
|
||||
- P2 item deltas coalesce before delivery.
|
||||
- P1 events cannot consume the P0 reserve.
|
||||
- New turns are rejected while backpressure is active.
|
||||
- A P0 `runner.backpressure` event explains the state.
|
||||
- P0 events are never dropped to make room.
|
||||
- The state records peak outbox bytes so the final empty outbox does not hide a
|
||||
limit violation.
|
||||
|
||||
The storage-pressure trace emits 250 P2 updates. They become one coalesced
|
||||
event, all P0 facts reach the mock core, peak bytes remain below the configured
|
||||
limit, and the next turn is rejected without an effect.
|
||||
|
||||
## Drain and revoke
|
||||
|
||||
`runner.drain` persists the `draining` lifecycle and a P0
|
||||
`runner.draining` event. It rejects later `turn.start` commands but continues to
|
||||
deliver the existing outbox. `runner.shutdown` stops only after the outbox is
|
||||
acknowledged.
|
||||
|
||||
A `revoke` envelope persists the `revoked` lifecycle. The runner flushes any
|
||||
existing durable events and exits. It does not accept new work or delete
|
||||
unacknowledged facts.
|
||||
|
||||
## Diagnostics
|
||||
|
||||
Run a fault and print operator-safe diagnostics:
|
||||
|
||||
```sh
|
||||
pnpm --filter @paperclipai/paperclip-runner trace:phase3 -- --fault lost-ack
|
||||
```
|
||||
|
||||
Supported fault names are:
|
||||
|
||||
```text
|
||||
none
|
||||
socket-drop
|
||||
lost-ack
|
||||
duplicate-command
|
||||
runner-restart
|
||||
harness-restart
|
||||
malformed-input
|
||||
lease-expiry
|
||||
storage-pressure
|
||||
drain
|
||||
revoke
|
||||
```
|
||||
|
||||
Use `--json` for the complete trace or `--output <path>` to write it. The CLI
|
||||
and browser show connection counts, safe lease ID and expiry, stable identities,
|
||||
source and ACK cursors, outbox current/peak bytes, command delivery/effect
|
||||
counts, replay counts, restart counts, outcomes, and redaction assertions.
|
||||
|
||||
They never show bootstrap tickets or connection lease tokens.
|
||||
|
||||
Regenerate the checked fault matrix and every exact per-fault trace with:
|
||||
|
||||
```sh
|
||||
pnpm --filter @paperclipai/paperclip-runner record:phase3
|
||||
```
|
||||
@@ -75,9 +75,30 @@ two surfaces.
|
||||
- The live browser rejects an event with an invalid schema, run ID, or session
|
||||
ID before it reaches the reducer.
|
||||
|
||||
These envelopes are local Phase 2 implementation contracts. Phase 3 may add a
|
||||
durable outbound transport, but it must preserve the canonical PRP event and
|
||||
command semantics.
|
||||
These envelopes are local Phase 2 implementation contracts.
|
||||
|
||||
## Phase 3 durable wire rules
|
||||
|
||||
- The runner opens an outbound WebSocket and sends PRP v1 `hello` before any
|
||||
command result or event.
|
||||
- A one-use bootstrap bearer capability returns a short-lived connection lease
|
||||
in `welcome`. Later connections use that lease. Neither raw capability is
|
||||
durable state.
|
||||
- `hello.resume` reports the last processed controller sequence, next source
|
||||
sequence, cumulative ACK cursor, and current unacknowledged range.
|
||||
- `welcome` selects the one overlapping protocol version, returns the core's
|
||||
cumulative ACK cursor, and carries at most one durable pending command.
|
||||
- An event is durable before send. Event IDs and source sequences stay stable
|
||||
across replay and process restart.
|
||||
- An ACK is cumulative. The runner rejects a cursor behind its durable ACK or
|
||||
beyond its produced source cursor.
|
||||
- An equal repeated command ID and canonical digest returns its stored result.
|
||||
Reuse with different bytes fails closed and cannot repeat an effect.
|
||||
- Frames are bounded at 1 MiB and upgrade headers at 16 KiB. Unknown or invalid
|
||||
required protocol data fails closed; malformed JSON is a bounded diagnostic.
|
||||
|
||||
These are package-local Phase 3 rules. Production TLS, control-plane admission,
|
||||
and deployment policy remain separately reviewed work.
|
||||
|
||||
## Change policy
|
||||
|
||||
|
||||
@@ -2,16 +2,19 @@
|
||||
|
||||
## What this tutorial is
|
||||
|
||||
This tutorial combines each implemented Native Runner phase into one procedure. It currently includes Phase 0, Phase 1, and Phase 2.
|
||||
This tutorial combines each implemented Native Runner phase into one procedure.
|
||||
It currently includes Phase 0 through Phase 3.
|
||||
|
||||
## What this tutorial proves
|
||||
|
||||
This tutorial proves that the standalone package boundary, static replay path,
|
||||
and local live-run path work together. It does not use Paperclip or a real model.
|
||||
local live-run path, and durable recovery path work together. It does not use
|
||||
Paperclip or a real model.
|
||||
|
||||
The current system includes the Rust mock-core tracer, shared protocol fixtures,
|
||||
the Rust supervisor, a scripted fake harness, CLI live runs, and browser live and
|
||||
replay modes.
|
||||
replay modes. It also includes the Rust outbound WebSocket client, durable
|
||||
outbox, package-local mock core, recovery CLI, and recovery browser view.
|
||||
|
||||
## Current end-to-end path
|
||||
|
||||
@@ -32,6 +35,10 @@ replay modes.
|
||||
12. Open the browser live mode and confirm the completed run says `Match` for live and replay output.
|
||||
13. Open the [Phase 2 journal entry](../../knowledge/journal/2026-08-07-phase-02.md)
|
||||
and its linked verification evidence and screenshots.
|
||||
14. Follow [Phase 3: Break Recovery on Purpose](phase-03-break-recovery.md).
|
||||
15. Confirm that the recovered runner and session IDs stay the same.
|
||||
16. Confirm that the outbox is empty after replay and cumulative acknowledgement.
|
||||
17. Open the [Phase 3 journal entry](../../knowledge/journal/2026-08-07-phase-03.md).
|
||||
|
||||
The one-command form after installation is:
|
||||
|
||||
@@ -67,6 +74,14 @@ pnpm --filter @paperclipai/paperclip-runner verify:rootless
|
||||
- exactly one terminal event closes every completed local trace;
|
||||
- every live browser event passes the Phase 1 validator and reducer before display;
|
||||
- replaying the completed live event list produces the same final snapshot.
|
||||
- a lost cumulative ACK replays the same durable event ID without a second
|
||||
logical event;
|
||||
- repeated commands return the stored result and cause one logical effect;
|
||||
- runner and harness restarts preserve runner, session, turn, and item IDs;
|
||||
- backpressure bounds local storage without dropping P0 events;
|
||||
- lease expiry, drain, revoke, and unrecoverable storage outcomes are explicit;
|
||||
- CLI and browser diagnostics do not expose bootstrap or connection-lease
|
||||
tokens.
|
||||
|
||||
Phase 3 may extend this tutorial only after the Phase 2 human checkpoint is
|
||||
accepted and the next phase is authorized.
|
||||
Phase 4 remains uncreated until the Phase 3 review and human checkpoint are
|
||||
complete.
|
||||
@@ -0,0 +1,194 @@
|
||||
# Phase 3: Break It on Purpose
|
||||
|
||||
## What this phase is
|
||||
|
||||
Phase 3 adds a durable outbound WebSocket connection.
|
||||
|
||||
The Rust runner connects to a package-local mock core. The runner stores events
|
||||
before it sends them. It stores each command result before it replies.
|
||||
|
||||
This phase does not use the Paperclip server, UI, database, or a real model.
|
||||
|
||||
## What this phase proves
|
||||
|
||||
This tutorial proves that a broken connection does not create a false new
|
||||
session.
|
||||
|
||||
You will drop a socket. You will lose an acknowledgement. You will restart the
|
||||
real Rust runner process. You will also restart the real fake-harness child.
|
||||
|
||||
Each test keeps the same runner, session, turn, item, command, and event IDs.
|
||||
Repeated delivery causes one logical effect. P0 events are not lost. The
|
||||
diagnostics do not show authentication secrets.
|
||||
|
||||
## Before you start
|
||||
|
||||
From the repository root, build the package binaries:
|
||||
|
||||
```sh
|
||||
pnpm --filter @paperclipai/paperclip-runner build:typescript
|
||||
pnpm --filter @paperclipai/paperclip-runner build:phase2-binaries
|
||||
```
|
||||
|
||||
The commands below use only loopback network access. They create temporary
|
||||
state below the Paperclip run scratch directory when it is available. The CLI
|
||||
removes that state after each successful proof.
|
||||
|
||||
## Step 1: Drop the socket
|
||||
|
||||
Run:
|
||||
|
||||
```sh
|
||||
pnpm --filter @paperclipai/paperclip-runner trace:phase3 -- --fault socket-drop
|
||||
```
|
||||
|
||||
Confirm:
|
||||
|
||||
- `Outcome: recovered` is shown.
|
||||
- The connection count is at least 2.
|
||||
- The runner ACK and core ACK are equal.
|
||||
- Every assertion says `PASS`.
|
||||
|
||||
## Step 2: Lose one ACK
|
||||
|
||||
Run:
|
||||
|
||||
```sh
|
||||
pnpm --filter @paperclipai/paperclip-runner trace:phase3 -- --fault lost-ack
|
||||
```
|
||||
|
||||
Confirm:
|
||||
|
||||
- the output shows at least one replay delivery;
|
||||
- the outbox ends with 0 pending events;
|
||||
- `P0 lost 0` is shown;
|
||||
- `PASS no duplicate logical events` is shown;
|
||||
- the runner, session, turn, and item IDs are unchanged.
|
||||
|
||||
The network may deliver one event more than once. The mock core keeps one
|
||||
logical event and advances one cumulative cursor.
|
||||
|
||||
## Step 3: Restart the Rust runner
|
||||
|
||||
Run:
|
||||
|
||||
```sh
|
||||
pnpm --filter @paperclipai/paperclip-runner trace:phase3 -- --fault runner-restart
|
||||
```
|
||||
|
||||
Confirm:
|
||||
|
||||
- the output shows 1 runner restart;
|
||||
- the output shows 2 fresh bootstraps;
|
||||
- a replay delivery is present;
|
||||
- every assertion says `PASS`.
|
||||
|
||||
The test kills `paperclip-runnerd` while an event is unacknowledged. The next
|
||||
process reads the same private state file. It emits `runner.reconciled` and
|
||||
continues the same durable source cursor.
|
||||
|
||||
## Step 4: Restart the fake harness
|
||||
|
||||
Run:
|
||||
|
||||
```sh
|
||||
pnpm --filter @paperclipai/paperclip-runner trace:phase3 -- --fault harness-restart
|
||||
```
|
||||
|
||||
Confirm:
|
||||
|
||||
- the output shows 1 harness restart;
|
||||
- `PASS stable identity` is shown;
|
||||
- `PASS source cursor continuity` is shown.
|
||||
|
||||
The test starts a real fake-harness child, stops its process group, and starts a
|
||||
second child. The normalized session, turn, and item IDs do not change.
|
||||
|
||||
## Step 5: Repeat a command
|
||||
|
||||
Run:
|
||||
|
||||
```sh
|
||||
pnpm --filter @paperclipai/paperclip-runner trace:phase3 -- --fault duplicate-command
|
||||
```
|
||||
|
||||
Confirm:
|
||||
|
||||
- the output shows at least one duplicate command delivery;
|
||||
- `PASS one logical effect per accepted command` is shown;
|
||||
- `workspace.ready` exists one time in JSON output when you add `--json`.
|
||||
|
||||
## Step 6: Apply storage pressure
|
||||
|
||||
Run:
|
||||
|
||||
```sh
|
||||
pnpm --filter @paperclipai/paperclip-runner trace:phase3 -- --fault storage-pressure
|
||||
```
|
||||
|
||||
Confirm:
|
||||
|
||||
- backpressure is active in JSON output;
|
||||
- peak storage is below the maximum;
|
||||
- the next turn is rejected;
|
||||
- `PASS P0 events preserved` is shown;
|
||||
- `PASS bounded storage` is shown.
|
||||
|
||||
## Step 7: Test lease expiry, drain, and revoke
|
||||
|
||||
Run:
|
||||
|
||||
```sh
|
||||
pnpm --filter @paperclipai/paperclip-runner trace:phase3 -- --fault lease-expiry
|
||||
pnpm --filter @paperclipai/paperclip-runner trace:phase3 -- --fault drain
|
||||
pnpm --filter @paperclipai/paperclip-runner trace:phase3 -- --fault revoke
|
||||
```
|
||||
|
||||
Confirm:
|
||||
|
||||
- lease expiry uses a fresh bootstrap and resumes the same cursor;
|
||||
- drain reports `Outcome: drained` and rejects new work;
|
||||
- revoke reports `Outcome: revoked`;
|
||||
- all three traces finish with an empty acknowledged outbox;
|
||||
- every security assertion passes.
|
||||
|
||||
## Step 8: Open the browser recovery view
|
||||
|
||||
Run:
|
||||
|
||||
```sh
|
||||
pnpm --filter @paperclipai/paperclip-runner browser:dev --host 127.0.0.1 --port 4179
|
||||
```
|
||||
|
||||
Open `http://127.0.0.1:4179/`. Select **Recovery**. Select
|
||||
**Run Phase 3 recovery**.
|
||||
|
||||
Confirm:
|
||||
|
||||
- recovery status becomes **complete**;
|
||||
- connection, lease, outbox, ACK, replay, storage, and outcome fields appear;
|
||||
- **Same runner and session** says **Preserved**;
|
||||
- **Secrets redacted** says **Yes**;
|
||||
- no bootstrap ticket or connection lease token appears.
|
||||
|
||||
## Step 9: Run the package verification path
|
||||
|
||||
Run:
|
||||
|
||||
```sh
|
||||
pnpm --filter @paperclipai/paperclip-runner verify
|
||||
```
|
||||
|
||||
The verification path builds TypeScript, Rust, and the browser. It runs unit,
|
||||
integration, browser, boundary, documentation, parity, and tracer checks for
|
||||
Phases 0 through 3.
|
||||
|
||||
## Evidence
|
||||
|
||||
- [Phase 3 verification record](../../knowledge/evidence/2026-08-07-phase-03-verification.md)
|
||||
- [Phase 3 recovery screenshot](../../knowledge/evidence/phase-03-recovery-diagnostics.png)
|
||||
- [Phase 3 OKF journal entry](../../knowledge/journal/2026-08-07-phase-03.md)
|
||||
- [Phase 3 transport reference](../phase-03-durable-transport.md)
|
||||
|
||||
Phase 4 remains uncreated. A human must accept the Phase 3 checkpoint before
|
||||
later work starts.
|
||||
@@ -0,0 +1,78 @@
|
||||
---
|
||||
type: Verification Evidence
|
||||
title: Phase 3 durable transport verification
|
||||
description: Package-only evidence for lost-ACK replay, restart recovery, command deduplication, and redacted diagnostics.
|
||||
tags: [native-runner, phase-3, websocket, recovery, evidence]
|
||||
status: stable
|
||||
generated: { by: openai/gpt-5, at: 2026-08-07T23:31:00Z }
|
||||
---
|
||||
|
||||
# Scope
|
||||
|
||||
This evidence covers the package-local mock core and runner transport. It does not use the Paperclip server or UI.
|
||||
|
||||
# Required checks
|
||||
|
||||
```sh
|
||||
pnpm --filter @paperclipai/paperclip-runner typecheck
|
||||
pnpm --filter @paperclipai/paperclip-runner test
|
||||
pnpm --filter @paperclipai/paperclip-runner check:browser-tokens
|
||||
pnpm --filter @paperclipai/paperclip-runner check:forbidden-imports
|
||||
pnpm --filter @paperclipai/paperclip-runner docs:validate
|
||||
pnpm --filter @paperclipai/paperclip-runner record:phase3
|
||||
pnpm --filter @paperclipai/paperclip-runner verify:rootless
|
||||
```
|
||||
|
||||
# Acceptance mapping
|
||||
|
||||
- The runner uses an outbound loopback WebSocket.
|
||||
- A one-time bootstrap ticket creates a connection lease.
|
||||
- A lost acknowledgement keeps one event in the durable outbox.
|
||||
- A restarted runner loads the same identity and sends the event again.
|
||||
- The mock core records one logical event and one duplicate delivery.
|
||||
- The runner records one repeated command and one command effect.
|
||||
- The terminal event uses the same runner and session IDs.
|
||||
- Drain and revoke states are visible.
|
||||
- CLI and browser diagnostics do not contain the ticket or lease token.
|
||||
|
||||
# Recorded outputs
|
||||
|
||||
- [CLI recovery trace](phase-03-recovery-trace.json)
|
||||
- [Complete fault matrix](phase-03-fault-matrix.json)
|
||||
- [Per-fault exact outputs](phase-03-faults/)
|
||||
- [Browser recovery screenshot](phase-03-recovery-diagnostics.png), 1440 by
|
||||
1000 pixels, SHA-256
|
||||
`2c79ea7a9834943ee9dc3dfc6a5c4eb9359518cf773882dc75882031710f84d0`.
|
||||
|
||||
# Local verification result
|
||||
|
||||
- TypeScript tests: 61 passed.
|
||||
- Rust tests: 34 passed, including fourteen Phase 3 transport, storage,
|
||||
deduplication, secret-lifecycle, destination, and state-file tests.
|
||||
- Focused Phase 3 and browser-middleware tests: 21 passed.
|
||||
- Phase 3 fault tests: 14 passed, including one-time ticket reuse rejection,
|
||||
cross-runner credential rejection, and symlink-safe mock-core state.
|
||||
- Browser tests: 7 passed with the rootless Linux library path.
|
||||
- TypeScript, Rust, and browser typechecks passed.
|
||||
- Browser token, package boundary, documentation link, and OKF checks passed.
|
||||
- All eleven recorded fault traces passed all seven assertions.
|
||||
- The complete package `verify` path passed through `verify:rootless`.
|
||||
- Destination tests reject public, private, wildcard, mixed-answer, userinfo,
|
||||
query, fragment, and malformed WebSocket targets before a capability is sent.
|
||||
- State tests reject symlinks, preserve an attacker-chosen sibling target, and
|
||||
verify private file modes. A real child-process test proves the captured
|
||||
bootstrap capability is absent from inherited environment data.
|
||||
|
||||
The first browser attempt found missing host libraries. The rootless package
|
||||
script supplied private copies without changing the host.
|
||||
|
||||
The first documentation pass also found the linked Phase 3 screenshot was not
|
||||
yet in the evidence directory. The passing browser run produced it, it was
|
||||
visually inspected, and the final verification used the checked evidence file.
|
||||
|
||||
# Review state
|
||||
|
||||
- Security review: pending.
|
||||
- UX review: pending.
|
||||
- QA tutorial run: pending.
|
||||
- Human checkpoint: pending.
|
||||
@@ -6,3 +6,4 @@
|
||||
* [Phase 0 Rust correction verification](2026-08-07-phase-00-rust-correction-verification.md) - Rust build/tests, cross-language parity, and corrected boundary evidence.
|
||||
* [Phase 1 verification](2026-08-07-phase-01-verification.md) - Schema, golden, reducer, Rust parity, CLI, browser, token, boundary, and screenshot evidence.
|
||||
* [Phase 2 verification](2026-08-07-phase-02-verification.md) - Rust supervisor, fake-driver scenarios, cleanup, live/replay parity, browser flows, screenshots, and complete package verification.
|
||||
* [Phase 3 verification](2026-08-07-phase-03-verification.md) - Lost-ACK replay, restart recovery, command deduplication, storage, and redacted diagnostics.
|
||||
@@ -0,0 +1,423 @@
|
||||
{
|
||||
"schema": "paperclip.runner.phase3.evidence.v1",
|
||||
"traces": [
|
||||
{
|
||||
"fault": "none",
|
||||
"outcome": "recovered",
|
||||
"connectionCount": 1,
|
||||
"replayDeliveries": 8,
|
||||
"runnerRestarts": 0,
|
||||
"harnessRestarts": 0,
|
||||
"commands": {
|
||||
"issued": 4,
|
||||
"completed": 4,
|
||||
"rejected": 0,
|
||||
"logicalEffects": 4,
|
||||
"duplicateDeliveries": 0
|
||||
},
|
||||
"outbox": {
|
||||
"events": 0,
|
||||
"bytes": 0,
|
||||
"peakBytes": 5315,
|
||||
"maxBytes": 65536,
|
||||
"backpressure": false,
|
||||
"p0Committed": 5,
|
||||
"p0Lost": 0
|
||||
},
|
||||
"security": {
|
||||
"bootstrapTicketPersisted": false,
|
||||
"connectionLeaseTokenPersisted": false,
|
||||
"secretLeakCount": 0
|
||||
},
|
||||
"assertions": {
|
||||
"stableIdentity": true,
|
||||
"sourceCursorContinuous": true,
|
||||
"oneLogicalEffectPerAcceptedCommand": true,
|
||||
"noDuplicateLogicalEvents": true,
|
||||
"p0Preserved": true,
|
||||
"boundedStorage": true,
|
||||
"secretsRedacted": true
|
||||
}
|
||||
},
|
||||
{
|
||||
"fault": "socket-drop",
|
||||
"outcome": "recovered",
|
||||
"connectionCount": 2,
|
||||
"replayDeliveries": 8,
|
||||
"runnerRestarts": 0,
|
||||
"harnessRestarts": 0,
|
||||
"commands": {
|
||||
"issued": 4,
|
||||
"completed": 4,
|
||||
"rejected": 0,
|
||||
"logicalEffects": 4,
|
||||
"duplicateDeliveries": 0
|
||||
},
|
||||
"outbox": {
|
||||
"events": 0,
|
||||
"bytes": 0,
|
||||
"peakBytes": 5314,
|
||||
"maxBytes": 65536,
|
||||
"backpressure": false,
|
||||
"p0Committed": 5,
|
||||
"p0Lost": 0
|
||||
},
|
||||
"security": {
|
||||
"bootstrapTicketPersisted": false,
|
||||
"connectionLeaseTokenPersisted": false,
|
||||
"secretLeakCount": 0
|
||||
},
|
||||
"assertions": {
|
||||
"stableIdentity": true,
|
||||
"sourceCursorContinuous": true,
|
||||
"oneLogicalEffectPerAcceptedCommand": true,
|
||||
"noDuplicateLogicalEvents": true,
|
||||
"p0Preserved": true,
|
||||
"boundedStorage": true,
|
||||
"secretsRedacted": true
|
||||
}
|
||||
},
|
||||
{
|
||||
"fault": "lost-ack",
|
||||
"outcome": "recovered",
|
||||
"connectionCount": 2,
|
||||
"replayDeliveries": 9,
|
||||
"runnerRestarts": 0,
|
||||
"harnessRestarts": 0,
|
||||
"commands": {
|
||||
"issued": 4,
|
||||
"completed": 4,
|
||||
"rejected": 0,
|
||||
"logicalEffects": 4,
|
||||
"duplicateDeliveries": 1
|
||||
},
|
||||
"outbox": {
|
||||
"events": 0,
|
||||
"bytes": 0,
|
||||
"peakBytes": 6023,
|
||||
"maxBytes": 65536,
|
||||
"backpressure": false,
|
||||
"p0Committed": 5,
|
||||
"p0Lost": 0
|
||||
},
|
||||
"security": {
|
||||
"bootstrapTicketPersisted": false,
|
||||
"connectionLeaseTokenPersisted": false,
|
||||
"secretLeakCount": 0
|
||||
},
|
||||
"assertions": {
|
||||
"stableIdentity": true,
|
||||
"sourceCursorContinuous": true,
|
||||
"oneLogicalEffectPerAcceptedCommand": true,
|
||||
"noDuplicateLogicalEvents": true,
|
||||
"p0Preserved": true,
|
||||
"boundedStorage": true,
|
||||
"secretsRedacted": true
|
||||
}
|
||||
},
|
||||
{
|
||||
"fault": "duplicate-command",
|
||||
"outcome": "recovered",
|
||||
"connectionCount": 2,
|
||||
"replayDeliveries": 8,
|
||||
"runnerRestarts": 0,
|
||||
"harnessRestarts": 0,
|
||||
"commands": {
|
||||
"issued": 4,
|
||||
"completed": 4,
|
||||
"rejected": 0,
|
||||
"logicalEffects": 4,
|
||||
"duplicateDeliveries": 1
|
||||
},
|
||||
"outbox": {
|
||||
"events": 0,
|
||||
"bytes": 0,
|
||||
"peakBytes": 5314,
|
||||
"maxBytes": 65536,
|
||||
"backpressure": false,
|
||||
"p0Committed": 5,
|
||||
"p0Lost": 0
|
||||
},
|
||||
"security": {
|
||||
"bootstrapTicketPersisted": false,
|
||||
"connectionLeaseTokenPersisted": false,
|
||||
"secretLeakCount": 0
|
||||
},
|
||||
"assertions": {
|
||||
"stableIdentity": true,
|
||||
"sourceCursorContinuous": true,
|
||||
"oneLogicalEffectPerAcceptedCommand": true,
|
||||
"noDuplicateLogicalEvents": true,
|
||||
"p0Preserved": true,
|
||||
"boundedStorage": true,
|
||||
"secretsRedacted": true
|
||||
}
|
||||
},
|
||||
{
|
||||
"fault": "runner-restart",
|
||||
"outcome": "recovered",
|
||||
"connectionCount": 2,
|
||||
"replayDeliveries": 10,
|
||||
"runnerRestarts": 1,
|
||||
"harnessRestarts": 0,
|
||||
"commands": {
|
||||
"issued": 4,
|
||||
"completed": 4,
|
||||
"rejected": 0,
|
||||
"logicalEffects": 4,
|
||||
"duplicateDeliveries": 1
|
||||
},
|
||||
"outbox": {
|
||||
"events": 0,
|
||||
"bytes": 0,
|
||||
"peakBytes": 6883,
|
||||
"maxBytes": 65536,
|
||||
"backpressure": false,
|
||||
"p0Committed": 6,
|
||||
"p0Lost": 0
|
||||
},
|
||||
"security": {
|
||||
"bootstrapTicketPersisted": false,
|
||||
"connectionLeaseTokenPersisted": false,
|
||||
"secretLeakCount": 0
|
||||
},
|
||||
"assertions": {
|
||||
"stableIdentity": true,
|
||||
"sourceCursorContinuous": true,
|
||||
"oneLogicalEffectPerAcceptedCommand": true,
|
||||
"noDuplicateLogicalEvents": true,
|
||||
"p0Preserved": true,
|
||||
"boundedStorage": true,
|
||||
"secretsRedacted": true
|
||||
}
|
||||
},
|
||||
{
|
||||
"fault": "harness-restart",
|
||||
"outcome": "recovered",
|
||||
"connectionCount": 1,
|
||||
"replayDeliveries": 11,
|
||||
"runnerRestarts": 0,
|
||||
"harnessRestarts": 1,
|
||||
"commands": {
|
||||
"issued": 5,
|
||||
"completed": 5,
|
||||
"rejected": 0,
|
||||
"logicalEffects": 5,
|
||||
"duplicateDeliveries": 0
|
||||
},
|
||||
"outbox": {
|
||||
"events": 0,
|
||||
"bytes": 0,
|
||||
"peakBytes": 6827,
|
||||
"maxBytes": 65536,
|
||||
"backpressure": false,
|
||||
"p0Committed": 8,
|
||||
"p0Lost": 0
|
||||
},
|
||||
"security": {
|
||||
"bootstrapTicketPersisted": false,
|
||||
"connectionLeaseTokenPersisted": false,
|
||||
"secretLeakCount": 0
|
||||
},
|
||||
"assertions": {
|
||||
"stableIdentity": true,
|
||||
"sourceCursorContinuous": true,
|
||||
"oneLogicalEffectPerAcceptedCommand": true,
|
||||
"noDuplicateLogicalEvents": true,
|
||||
"p0Preserved": true,
|
||||
"boundedStorage": true,
|
||||
"secretsRedacted": true
|
||||
}
|
||||
},
|
||||
{
|
||||
"fault": "malformed-input",
|
||||
"outcome": "recovered",
|
||||
"connectionCount": 2,
|
||||
"replayDeliveries": 8,
|
||||
"runnerRestarts": 0,
|
||||
"harnessRestarts": 0,
|
||||
"commands": {
|
||||
"issued": 4,
|
||||
"completed": 4,
|
||||
"rejected": 0,
|
||||
"logicalEffects": 4,
|
||||
"duplicateDeliveries": 0
|
||||
},
|
||||
"outbox": {
|
||||
"events": 0,
|
||||
"bytes": 0,
|
||||
"peakBytes": 5314,
|
||||
"maxBytes": 65536,
|
||||
"backpressure": false,
|
||||
"p0Committed": 5,
|
||||
"p0Lost": 0
|
||||
},
|
||||
"security": {
|
||||
"bootstrapTicketPersisted": false,
|
||||
"connectionLeaseTokenPersisted": false,
|
||||
"secretLeakCount": 0
|
||||
},
|
||||
"assertions": {
|
||||
"stableIdentity": true,
|
||||
"sourceCursorContinuous": true,
|
||||
"oneLogicalEffectPerAcceptedCommand": true,
|
||||
"noDuplicateLogicalEvents": true,
|
||||
"p0Preserved": true,
|
||||
"boundedStorage": true,
|
||||
"secretsRedacted": true
|
||||
}
|
||||
},
|
||||
{
|
||||
"fault": "lease-expiry",
|
||||
"outcome": "recovered",
|
||||
"connectionCount": 2,
|
||||
"replayDeliveries": 9,
|
||||
"runnerRestarts": 1,
|
||||
"harnessRestarts": 0,
|
||||
"commands": {
|
||||
"issued": 4,
|
||||
"completed": 4,
|
||||
"rejected": 0,
|
||||
"logicalEffects": 4,
|
||||
"duplicateDeliveries": 0
|
||||
},
|
||||
"outbox": {
|
||||
"events": 0,
|
||||
"bytes": 0,
|
||||
"peakBytes": 5314,
|
||||
"maxBytes": 65536,
|
||||
"backpressure": false,
|
||||
"p0Committed": 6,
|
||||
"p0Lost": 0
|
||||
},
|
||||
"security": {
|
||||
"bootstrapTicketPersisted": false,
|
||||
"connectionLeaseTokenPersisted": false,
|
||||
"secretLeakCount": 0
|
||||
},
|
||||
"assertions": {
|
||||
"stableIdentity": true,
|
||||
"sourceCursorContinuous": true,
|
||||
"oneLogicalEffectPerAcceptedCommand": true,
|
||||
"noDuplicateLogicalEvents": true,
|
||||
"p0Preserved": true,
|
||||
"boundedStorage": true,
|
||||
"secretsRedacted": true
|
||||
}
|
||||
},
|
||||
{
|
||||
"fault": "storage-pressure",
|
||||
"outcome": "recovered",
|
||||
"connectionCount": 1,
|
||||
"replayDeliveries": 4,
|
||||
"runnerRestarts": 0,
|
||||
"harnessRestarts": 0,
|
||||
"commands": {
|
||||
"issued": 5,
|
||||
"completed": 4,
|
||||
"rejected": 1,
|
||||
"logicalEffects": 4,
|
||||
"duplicateDeliveries": 0
|
||||
},
|
||||
"outbox": {
|
||||
"events": 0,
|
||||
"bytes": 0,
|
||||
"peakBytes": 2326,
|
||||
"maxBytes": 16384,
|
||||
"backpressure": true,
|
||||
"p0Committed": 3,
|
||||
"p0Lost": 0
|
||||
},
|
||||
"security": {
|
||||
"bootstrapTicketPersisted": false,
|
||||
"connectionLeaseTokenPersisted": false,
|
||||
"secretLeakCount": 0
|
||||
},
|
||||
"assertions": {
|
||||
"stableIdentity": true,
|
||||
"sourceCursorContinuous": true,
|
||||
"oneLogicalEffectPerAcceptedCommand": true,
|
||||
"noDuplicateLogicalEvents": true,
|
||||
"p0Preserved": true,
|
||||
"boundedStorage": true,
|
||||
"secretsRedacted": true
|
||||
}
|
||||
},
|
||||
{
|
||||
"fault": "drain",
|
||||
"outcome": "drained",
|
||||
"connectionCount": 1,
|
||||
"replayDeliveries": 3,
|
||||
"runnerRestarts": 0,
|
||||
"harnessRestarts": 0,
|
||||
"commands": {
|
||||
"issued": 5,
|
||||
"completed": 4,
|
||||
"rejected": 1,
|
||||
"logicalEffects": 4,
|
||||
"duplicateDeliveries": 0
|
||||
},
|
||||
"outbox": {
|
||||
"events": 0,
|
||||
"bytes": 0,
|
||||
"peakBytes": 1478,
|
||||
"maxBytes": 65536,
|
||||
"backpressure": false,
|
||||
"p0Committed": 3,
|
||||
"p0Lost": 0
|
||||
},
|
||||
"security": {
|
||||
"bootstrapTicketPersisted": false,
|
||||
"connectionLeaseTokenPersisted": false,
|
||||
"secretLeakCount": 0
|
||||
},
|
||||
"assertions": {
|
||||
"stableIdentity": true,
|
||||
"sourceCursorContinuous": true,
|
||||
"oneLogicalEffectPerAcceptedCommand": true,
|
||||
"noDuplicateLogicalEvents": true,
|
||||
"p0Preserved": true,
|
||||
"boundedStorage": true,
|
||||
"secretsRedacted": true
|
||||
}
|
||||
},
|
||||
{
|
||||
"fault": "revoke",
|
||||
"outcome": "revoked",
|
||||
"connectionCount": 1,
|
||||
"replayDeliveries": 4,
|
||||
"runnerRestarts": 0,
|
||||
"harnessRestarts": 0,
|
||||
"commands": {
|
||||
"issued": 4,
|
||||
"completed": 3,
|
||||
"rejected": 1,
|
||||
"logicalEffects": 3,
|
||||
"duplicateDeliveries": 0
|
||||
},
|
||||
"outbox": {
|
||||
"events": 0,
|
||||
"bytes": 0,
|
||||
"peakBytes": 5315,
|
||||
"maxBytes": 65536,
|
||||
"backpressure": false,
|
||||
"p0Committed": 4,
|
||||
"p0Lost": 0
|
||||
},
|
||||
"security": {
|
||||
"bootstrapTicketPersisted": false,
|
||||
"connectionLeaseTokenPersisted": false,
|
||||
"secretLeakCount": 0
|
||||
},
|
||||
"assertions": {
|
||||
"stableIdentity": true,
|
||||
"sourceCursorContinuous": true,
|
||||
"oneLogicalEffectPerAcceptedCommand": true,
|
||||
"noDuplicateLogicalEvents": true,
|
||||
"p0Preserved": true,
|
||||
"boundedStorage": true,
|
||||
"secretsRedacted": true
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,399 @@
|
||||
{
|
||||
"schema": "paperclip.runner.phase3.trace.v1",
|
||||
"diagnostics": {
|
||||
"schema": "paperclip.runner.phase3.diagnostics.v1",
|
||||
"fault": "drain",
|
||||
"connection": {
|
||||
"state": "stopped",
|
||||
"connectionCount": 1,
|
||||
"reconnectCount": 0,
|
||||
"leaseId": "connection_lease_0c922c88-0cfe-4a1f-b58d-15278a816adf",
|
||||
"leaseExpiresAt": "2026-08-07T23:36:40.794Z"
|
||||
},
|
||||
"identity": {
|
||||
"runnerInstanceId": "runner_phase3_stable",
|
||||
"environmentLeaseId": "environment_lease_phase3_stable",
|
||||
"runId": "run_phase3_stable",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"turnId": "turn_phase3_stable",
|
||||
"itemId": "item_phase3_stable"
|
||||
},
|
||||
"cursors": {
|
||||
"runnerAckedSourceSeq": 4,
|
||||
"runnerNextSourceSeq": 5,
|
||||
"coreAckedSourceSeq": 4,
|
||||
"highestCommittedSourceSeq": 4
|
||||
},
|
||||
"outbox": {
|
||||
"events": 0,
|
||||
"bytes": 0,
|
||||
"peakBytes": 1478,
|
||||
"maxBytes": 65536,
|
||||
"backpressure": false,
|
||||
"p0Committed": 3,
|
||||
"p0Lost": 0
|
||||
},
|
||||
"commands": {
|
||||
"issued": 5,
|
||||
"completed": 4,
|
||||
"rejected": 1,
|
||||
"logicalEffects": 4,
|
||||
"duplicateDeliveries": 0
|
||||
},
|
||||
"recovery": {
|
||||
"replayDeliveries": 3,
|
||||
"runnerRestarts": 0,
|
||||
"harnessRestarts": 0,
|
||||
"malformedFrames": 0,
|
||||
"freshBootstraps": 1,
|
||||
"outcome": "drained",
|
||||
"reason": "drain_completed"
|
||||
},
|
||||
"security": {
|
||||
"bootstrapTicketPersisted": false,
|
||||
"connectionLeaseTokenPersisted": false,
|
||||
"secretLeakCount": 0
|
||||
},
|
||||
"committedEvents": [
|
||||
{
|
||||
"sourceSeq": 1,
|
||||
"sourceEventId": "event_runner_phase3_stable_000001",
|
||||
"eventType": "workspace.ready",
|
||||
"priority": 1,
|
||||
"envelope": {
|
||||
"envelopeId": "envelope_event_000001",
|
||||
"kind": "event",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"emittedAt": "2026-08-07T23:00:00.001Z",
|
||||
"eventType": "workspace.ready",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"workspace": "phase-03-durable-fixture"
|
||||
},
|
||||
"priority": 1,
|
||||
"runId": "run_phase3_stable",
|
||||
"schema": "paperclip.prp.event.v1",
|
||||
"schemaVersion": 1,
|
||||
"sourceEventId": "event_runner_phase3_stable_000001",
|
||||
"sourceInstanceId": "runner_phase3_stable",
|
||||
"sourceKind": "runner",
|
||||
"sourceSeq": 1,
|
||||
"turnId": "turn_phase3_stable"
|
||||
},
|
||||
"protocol": "paperclip.runner",
|
||||
"runId": "run_phase3_stable",
|
||||
"runnerInstanceId": "runner_phase3_stable",
|
||||
"sentAt": "2026-08-07T23:00:00.001Z",
|
||||
"turnId": "turn_phase3_stable",
|
||||
"version": 1
|
||||
},
|
||||
"deliveryCount": 2,
|
||||
"logicalEffectCount": 1
|
||||
},
|
||||
{
|
||||
"sourceSeq": 2,
|
||||
"sourceEventId": "event_runner_phase3_stable_000002",
|
||||
"eventType": "session.started",
|
||||
"priority": 0,
|
||||
"envelope": {
|
||||
"envelopeId": "envelope_event_000002",
|
||||
"kind": "event",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"emittedAt": "2026-08-07T23:00:00.002Z",
|
||||
"eventType": "session.started",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"driverSessionId": "driver_phase3_fake",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"resumed": false
|
||||
},
|
||||
"priority": 0,
|
||||
"runId": "run_phase3_stable",
|
||||
"schema": "paperclip.prp.event.v1",
|
||||
"schemaVersion": 1,
|
||||
"sourceEventId": "event_runner_phase3_stable_000002",
|
||||
"sourceInstanceId": "runner_phase3_stable",
|
||||
"sourceKind": "runner",
|
||||
"sourceSeq": 2,
|
||||
"turnId": "turn_phase3_stable"
|
||||
},
|
||||
"protocol": "paperclip.runner",
|
||||
"runId": "run_phase3_stable",
|
||||
"runnerInstanceId": "runner_phase3_stable",
|
||||
"sentAt": "2026-08-07T23:00:00.002Z",
|
||||
"turnId": "turn_phase3_stable",
|
||||
"version": 1
|
||||
},
|
||||
"deliveryCount": 2,
|
||||
"logicalEffectCount": 1
|
||||
},
|
||||
{
|
||||
"sourceSeq": 3,
|
||||
"sourceEventId": "event_runner_phase3_stable_000003",
|
||||
"eventType": "runner.draining",
|
||||
"priority": 0,
|
||||
"envelope": {
|
||||
"envelopeId": "envelope_event_000003",
|
||||
"kind": "event",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"emittedAt": "2026-08-07T23:00:00.003Z",
|
||||
"eventType": "runner.draining",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"newWorkAccepted": false
|
||||
},
|
||||
"priority": 0,
|
||||
"runId": "run_phase3_stable",
|
||||
"schema": "paperclip.prp.event.v1",
|
||||
"schemaVersion": 1,
|
||||
"sourceEventId": "event_runner_phase3_stable_000003",
|
||||
"sourceInstanceId": "runner_phase3_stable",
|
||||
"sourceKind": "runner",
|
||||
"sourceSeq": 3,
|
||||
"turnId": "turn_phase3_stable"
|
||||
},
|
||||
"protocol": "paperclip.runner",
|
||||
"runId": "run_phase3_stable",
|
||||
"runnerInstanceId": "runner_phase3_stable",
|
||||
"sentAt": "2026-08-07T23:00:00.003Z",
|
||||
"turnId": "turn_phase3_stable",
|
||||
"version": 1
|
||||
},
|
||||
"deliveryCount": 2,
|
||||
"logicalEffectCount": 1
|
||||
},
|
||||
{
|
||||
"sourceSeq": 4,
|
||||
"sourceEventId": "event_runner_phase3_stable_000004",
|
||||
"eventType": "runner.stopped",
|
||||
"priority": 0,
|
||||
"envelope": {
|
||||
"envelopeId": "envelope_event_000004",
|
||||
"kind": "event",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"emittedAt": "2026-08-07T23:00:00.004Z",
|
||||
"eventType": "runner.stopped",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"afterDurableFlush": true
|
||||
},
|
||||
"priority": 0,
|
||||
"runId": "run_phase3_stable",
|
||||
"schema": "paperclip.prp.event.v1",
|
||||
"schemaVersion": 1,
|
||||
"sourceEventId": "event_runner_phase3_stable_000004",
|
||||
"sourceInstanceId": "runner_phase3_stable",
|
||||
"sourceKind": "runner",
|
||||
"sourceSeq": 4,
|
||||
"turnId": "turn_phase3_stable"
|
||||
},
|
||||
"protocol": "paperclip.runner",
|
||||
"runId": "run_phase3_stable",
|
||||
"runnerInstanceId": "runner_phase3_stable",
|
||||
"sentAt": "2026-08-07T23:00:00.004Z",
|
||||
"turnId": "turn_phase3_stable",
|
||||
"version": 1
|
||||
},
|
||||
"deliveryCount": 1,
|
||||
"logicalEffectCount": 1
|
||||
}
|
||||
]
|
||||
},
|
||||
"runnerState": {
|
||||
"schema": "paperclip.runner.phase3.state.v1",
|
||||
"runnerInstanceId": "runner_phase3_stable",
|
||||
"environmentLeaseId": "environment_lease_phase3_stable",
|
||||
"runId": "run_phase3_stable",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"turnId": "turn_phase3_stable",
|
||||
"itemId": "item_phase3_stable",
|
||||
"lifecycle": "stopped",
|
||||
"nextSourceSeq": 5,
|
||||
"ackedSourceSeq": 4,
|
||||
"lastControllerCommandSeq": 5,
|
||||
"reconnectCount": 0,
|
||||
"maxOutboxBytes": 65536,
|
||||
"peakOutboxBytes": 1478,
|
||||
"outbox": [],
|
||||
"processedCommands": {
|
||||
"command_phase3_001": {
|
||||
"commandId": "command_phase3_001",
|
||||
"controllerSeq": 1,
|
||||
"commandDigest": "fnv1a64:c19dfbbf86a3dbb4",
|
||||
"status": "completed",
|
||||
"logicalEffectCount": 1,
|
||||
"result": {
|
||||
"commandId": "command_phase3_001",
|
||||
"controllerSeq": 1,
|
||||
"detail": "run prepared",
|
||||
"logicalEffectCount": 1,
|
||||
"status": "completed"
|
||||
}
|
||||
},
|
||||
"command_phase3_002": {
|
||||
"commandId": "command_phase3_002",
|
||||
"controllerSeq": 2,
|
||||
"commandDigest": "fnv1a64:b5198f3ce67ce88e",
|
||||
"status": "completed",
|
||||
"logicalEffectCount": 1,
|
||||
"result": {
|
||||
"commandId": "command_phase3_002",
|
||||
"controllerSeq": 2,
|
||||
"detail": "session bound",
|
||||
"logicalEffectCount": 1,
|
||||
"status": "completed"
|
||||
}
|
||||
},
|
||||
"command_phase3_003": {
|
||||
"commandId": "command_phase3_003",
|
||||
"controllerSeq": 3,
|
||||
"commandDigest": "fnv1a64:978d0ca44be61a36",
|
||||
"status": "completed",
|
||||
"logicalEffectCount": 1,
|
||||
"result": {
|
||||
"commandId": "command_phase3_003",
|
||||
"controllerSeq": 3,
|
||||
"detail": "runner draining",
|
||||
"logicalEffectCount": 1,
|
||||
"status": "completed"
|
||||
}
|
||||
},
|
||||
"command_phase3_004": {
|
||||
"commandId": "command_phase3_004",
|
||||
"controllerSeq": 4,
|
||||
"commandDigest": "fnv1a64:34d91505a30f60fb",
|
||||
"status": "rejected",
|
||||
"logicalEffectCount": 0,
|
||||
"result": {
|
||||
"commandId": "command_phase3_004",
|
||||
"controllerSeq": 4,
|
||||
"detail": "new turns are disabled while draining or backpressured",
|
||||
"logicalEffectCount": 0,
|
||||
"status": "rejected"
|
||||
}
|
||||
},
|
||||
"command_phase3_005": {
|
||||
"commandId": "command_phase3_005",
|
||||
"controllerSeq": 5,
|
||||
"commandDigest": "fnv1a64:533318a30fba6d22",
|
||||
"status": "completed",
|
||||
"logicalEffectCount": 1,
|
||||
"result": {
|
||||
"commandId": "command_phase3_005",
|
||||
"controllerSeq": 5,
|
||||
"detail": "runner will stop after durable flush",
|
||||
"logicalEffectCount": 1,
|
||||
"status": "completed"
|
||||
}
|
||||
}
|
||||
},
|
||||
"diagnostics": [],
|
||||
"backpressure": false,
|
||||
"recoverableFailure": null,
|
||||
"unrecoverableOutcome": null,
|
||||
"harnessGeneration": 1,
|
||||
"stopAfterFlush": true
|
||||
},
|
||||
"commands": [
|
||||
{
|
||||
"schema": "paperclip.prp.command.v1",
|
||||
"commandId": "command_phase3_001",
|
||||
"controllerSeq": 1,
|
||||
"type": "run.prepare",
|
||||
"issuedAt": "2026-08-07T23:30:01.000Z",
|
||||
"payload": {
|
||||
"workspace": "phase-03-durable-fixture"
|
||||
},
|
||||
"status": "completed",
|
||||
"result": {
|
||||
"commandId": "command_phase3_001",
|
||||
"controllerSeq": 1,
|
||||
"detail": "run prepared",
|
||||
"logicalEffectCount": 1,
|
||||
"status": "completed"
|
||||
}
|
||||
},
|
||||
{
|
||||
"schema": "paperclip.prp.command.v1",
|
||||
"commandId": "command_phase3_002",
|
||||
"controllerSeq": 2,
|
||||
"type": "session.open",
|
||||
"issuedAt": "2026-08-07T23:30:02.000Z",
|
||||
"payload": {
|
||||
"reuse": "same_session"
|
||||
},
|
||||
"status": "completed",
|
||||
"result": {
|
||||
"commandId": "command_phase3_002",
|
||||
"controllerSeq": 2,
|
||||
"detail": "session bound",
|
||||
"logicalEffectCount": 1,
|
||||
"status": "completed"
|
||||
}
|
||||
},
|
||||
{
|
||||
"schema": "paperclip.prp.command.v1",
|
||||
"commandId": "command_phase3_003",
|
||||
"controllerSeq": 3,
|
||||
"type": "runner.drain",
|
||||
"issuedAt": "2026-08-07T23:30:03.000Z",
|
||||
"payload": {},
|
||||
"status": "completed",
|
||||
"result": {
|
||||
"commandId": "command_phase3_003",
|
||||
"controllerSeq": 3,
|
||||
"detail": "runner draining",
|
||||
"logicalEffectCount": 1,
|
||||
"status": "completed"
|
||||
}
|
||||
},
|
||||
{
|
||||
"schema": "paperclip.prp.command.v1",
|
||||
"commandId": "command_phase3_004",
|
||||
"controllerSeq": 4,
|
||||
"type": "turn.start",
|
||||
"issuedAt": "2026-08-07T23:30:04.000Z",
|
||||
"payload": {
|
||||
"turnId": "turn_phase3_stable",
|
||||
"text": "Prove Phase 3 durable recovery."
|
||||
},
|
||||
"status": "rejected",
|
||||
"result": {
|
||||
"commandId": "command_phase3_004",
|
||||
"controllerSeq": 4,
|
||||
"detail": "new turns are disabled while draining or backpressured",
|
||||
"logicalEffectCount": 0,
|
||||
"status": "rejected"
|
||||
}
|
||||
},
|
||||
{
|
||||
"schema": "paperclip.prp.command.v1",
|
||||
"commandId": "command_phase3_005",
|
||||
"controllerSeq": 5,
|
||||
"type": "runner.shutdown",
|
||||
"issuedAt": "2026-08-07T23:30:05.000Z",
|
||||
"payload": {},
|
||||
"status": "completed",
|
||||
"result": {
|
||||
"commandId": "command_phase3_005",
|
||||
"controllerSeq": 5,
|
||||
"detail": "runner will stop after durable flush",
|
||||
"logicalEffectCount": 1,
|
||||
"status": "completed"
|
||||
}
|
||||
}
|
||||
],
|
||||
"assertions": {
|
||||
"stableIdentity": true,
|
||||
"sourceCursorContinuous": true,
|
||||
"oneLogicalEffectPerAcceptedCommand": true,
|
||||
"noDuplicateLogicalEvents": true,
|
||||
"p0Preserved": true,
|
||||
"boundedStorage": true,
|
||||
"secretsRedacted": true
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,561 @@
|
||||
{
|
||||
"schema": "paperclip.runner.phase3.trace.v1",
|
||||
"diagnostics": {
|
||||
"schema": "paperclip.runner.phase3.diagnostics.v1",
|
||||
"fault": "duplicate-command",
|
||||
"connection": {
|
||||
"state": "stopped",
|
||||
"connectionCount": 2,
|
||||
"reconnectCount": 1,
|
||||
"leaseId": "connection_lease_2e6357a8-6a17-4450-a782-7aa4ca543a9c",
|
||||
"leaseExpiresAt": "2026-08-07T23:36:39.046Z"
|
||||
},
|
||||
"identity": {
|
||||
"runnerInstanceId": "runner_phase3_stable",
|
||||
"environmentLeaseId": "environment_lease_phase3_stable",
|
||||
"runId": "run_phase3_stable",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"turnId": "turn_phase3_stable",
|
||||
"itemId": "item_phase3_stable"
|
||||
},
|
||||
"cursors": {
|
||||
"runnerAckedSourceSeq": 9,
|
||||
"runnerNextSourceSeq": 10,
|
||||
"coreAckedSourceSeq": 9,
|
||||
"highestCommittedSourceSeq": 9
|
||||
},
|
||||
"outbox": {
|
||||
"events": 0,
|
||||
"bytes": 0,
|
||||
"peakBytes": 5314,
|
||||
"maxBytes": 65536,
|
||||
"backpressure": false,
|
||||
"p0Committed": 5,
|
||||
"p0Lost": 0
|
||||
},
|
||||
"commands": {
|
||||
"issued": 4,
|
||||
"completed": 4,
|
||||
"rejected": 0,
|
||||
"logicalEffects": 4,
|
||||
"duplicateDeliveries": 1
|
||||
},
|
||||
"recovery": {
|
||||
"replayDeliveries": 8,
|
||||
"runnerRestarts": 0,
|
||||
"harnessRestarts": 0,
|
||||
"malformedFrames": 0,
|
||||
"freshBootstraps": 1,
|
||||
"outcome": "recovered",
|
||||
"reason": "duplicate_command_completed"
|
||||
},
|
||||
"security": {
|
||||
"bootstrapTicketPersisted": false,
|
||||
"connectionLeaseTokenPersisted": false,
|
||||
"secretLeakCount": 0
|
||||
},
|
||||
"committedEvents": [
|
||||
{
|
||||
"sourceSeq": 1,
|
||||
"sourceEventId": "event_runner_phase3_stable_000001",
|
||||
"eventType": "workspace.ready",
|
||||
"priority": 1,
|
||||
"envelope": {
|
||||
"envelopeId": "envelope_event_000001",
|
||||
"kind": "event",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"emittedAt": "2026-08-07T23:00:00.001Z",
|
||||
"eventType": "workspace.ready",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"workspace": "phase-03-durable-fixture"
|
||||
},
|
||||
"priority": 1,
|
||||
"runId": "run_phase3_stable",
|
||||
"schema": "paperclip.prp.event.v1",
|
||||
"schemaVersion": 1,
|
||||
"sourceEventId": "event_runner_phase3_stable_000001",
|
||||
"sourceInstanceId": "runner_phase3_stable",
|
||||
"sourceKind": "runner",
|
||||
"sourceSeq": 1,
|
||||
"turnId": "turn_phase3_stable"
|
||||
},
|
||||
"protocol": "paperclip.runner",
|
||||
"runId": "run_phase3_stable",
|
||||
"runnerInstanceId": "runner_phase3_stable",
|
||||
"sentAt": "2026-08-07T23:00:00.001Z",
|
||||
"turnId": "turn_phase3_stable",
|
||||
"version": 1
|
||||
},
|
||||
"deliveryCount": 2,
|
||||
"logicalEffectCount": 1
|
||||
},
|
||||
{
|
||||
"sourceSeq": 2,
|
||||
"sourceEventId": "event_runner_phase3_stable_000002",
|
||||
"eventType": "session.started",
|
||||
"priority": 0,
|
||||
"envelope": {
|
||||
"envelopeId": "envelope_event_000002",
|
||||
"kind": "event",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"emittedAt": "2026-08-07T23:00:00.002Z",
|
||||
"eventType": "session.started",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"driverSessionId": "driver_phase3_fake",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"resumed": true
|
||||
},
|
||||
"priority": 0,
|
||||
"runId": "run_phase3_stable",
|
||||
"schema": "paperclip.prp.event.v1",
|
||||
"schemaVersion": 1,
|
||||
"sourceEventId": "event_runner_phase3_stable_000002",
|
||||
"sourceInstanceId": "runner_phase3_stable",
|
||||
"sourceKind": "runner",
|
||||
"sourceSeq": 2,
|
||||
"turnId": "turn_phase3_stable"
|
||||
},
|
||||
"protocol": "paperclip.runner",
|
||||
"runId": "run_phase3_stable",
|
||||
"runnerInstanceId": "runner_phase3_stable",
|
||||
"sentAt": "2026-08-07T23:00:00.002Z",
|
||||
"turnId": "turn_phase3_stable",
|
||||
"version": 1
|
||||
},
|
||||
"deliveryCount": 2,
|
||||
"logicalEffectCount": 1
|
||||
},
|
||||
{
|
||||
"sourceSeq": 3,
|
||||
"sourceEventId": "event_runner_phase3_stable_000003",
|
||||
"eventType": "turn.accepted",
|
||||
"priority": 0,
|
||||
"envelope": {
|
||||
"envelopeId": "envelope_event_000003",
|
||||
"kind": "event",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"emittedAt": "2026-08-07T23:00:00.003Z",
|
||||
"eventType": "turn.accepted",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"sameSession": true,
|
||||
"turnId": "turn_phase3_stable"
|
||||
},
|
||||
"priority": 0,
|
||||
"runId": "run_phase3_stable",
|
||||
"schema": "paperclip.prp.event.v1",
|
||||
"schemaVersion": 1,
|
||||
"sourceEventId": "event_runner_phase3_stable_000003",
|
||||
"sourceInstanceId": "runner_phase3_stable",
|
||||
"sourceKind": "runner",
|
||||
"sourceSeq": 3,
|
||||
"turnId": "turn_phase3_stable"
|
||||
},
|
||||
"protocol": "paperclip.runner",
|
||||
"runId": "run_phase3_stable",
|
||||
"runnerInstanceId": "runner_phase3_stable",
|
||||
"sentAt": "2026-08-07T23:00:00.003Z",
|
||||
"turnId": "turn_phase3_stable",
|
||||
"version": 1
|
||||
},
|
||||
"deliveryCount": 2,
|
||||
"logicalEffectCount": 1
|
||||
},
|
||||
{
|
||||
"sourceSeq": 4,
|
||||
"sourceEventId": "event_runner_phase3_stable_000004",
|
||||
"eventType": "item.started",
|
||||
"priority": 1,
|
||||
"envelope": {
|
||||
"envelopeId": "envelope_event_000004",
|
||||
"kind": "event",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"emittedAt": "2026-08-07T23:00:00.004Z",
|
||||
"eventType": "item.started",
|
||||
"itemId": "item_phase3_stable",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"kind": "assistant_message"
|
||||
},
|
||||
"priority": 1,
|
||||
"runId": "run_phase3_stable",
|
||||
"schema": "paperclip.prp.event.v1",
|
||||
"schemaVersion": 1,
|
||||
"sourceEventId": "event_runner_phase3_stable_000004",
|
||||
"sourceInstanceId": "runner_phase3_stable",
|
||||
"sourceKind": "runner",
|
||||
"sourceSeq": 4,
|
||||
"turnId": "turn_phase3_stable"
|
||||
},
|
||||
"protocol": "paperclip.runner",
|
||||
"runId": "run_phase3_stable",
|
||||
"runnerInstanceId": "runner_phase3_stable",
|
||||
"sentAt": "2026-08-07T23:00:00.004Z",
|
||||
"turnId": "turn_phase3_stable",
|
||||
"version": 1
|
||||
},
|
||||
"deliveryCount": 2,
|
||||
"logicalEffectCount": 1
|
||||
},
|
||||
{
|
||||
"sourceSeq": 5,
|
||||
"sourceEventId": "event_runner_phase3_stable_000005",
|
||||
"eventType": "item.delta",
|
||||
"priority": 2,
|
||||
"envelope": {
|
||||
"envelopeId": "envelope_event_000005",
|
||||
"kind": "event",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"emittedAt": "2026-08-07T23:00:00.005Z",
|
||||
"eventType": "item.delta",
|
||||
"itemId": "item_phase3_stable",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"text": "Prove Phase 3 durable recovery."
|
||||
},
|
||||
"priority": 2,
|
||||
"runId": "run_phase3_stable",
|
||||
"schema": "paperclip.prp.event.v1",
|
||||
"schemaVersion": 1,
|
||||
"sourceEventId": "event_runner_phase3_stable_000005",
|
||||
"sourceInstanceId": "runner_phase3_stable",
|
||||
"sourceKind": "runner",
|
||||
"sourceSeq": 5,
|
||||
"turnId": "turn_phase3_stable"
|
||||
},
|
||||
"protocol": "paperclip.runner",
|
||||
"runId": "run_phase3_stable",
|
||||
"runnerInstanceId": "runner_phase3_stable",
|
||||
"sentAt": "2026-08-07T23:00:00.005Z",
|
||||
"turnId": "turn_phase3_stable",
|
||||
"version": 1
|
||||
},
|
||||
"deliveryCount": 2,
|
||||
"logicalEffectCount": 1
|
||||
},
|
||||
{
|
||||
"sourceSeq": 6,
|
||||
"sourceEventId": "event_runner_phase3_stable_000006",
|
||||
"eventType": "item.completed",
|
||||
"priority": 1,
|
||||
"envelope": {
|
||||
"envelopeId": "envelope_event_000006",
|
||||
"kind": "event",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"emittedAt": "2026-08-07T23:00:00.006Z",
|
||||
"eventType": "item.completed",
|
||||
"itemId": "item_phase3_stable",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"text": "Durable recovery completed."
|
||||
},
|
||||
"priority": 1,
|
||||
"runId": "run_phase3_stable",
|
||||
"schema": "paperclip.prp.event.v1",
|
||||
"schemaVersion": 1,
|
||||
"sourceEventId": "event_runner_phase3_stable_000006",
|
||||
"sourceInstanceId": "runner_phase3_stable",
|
||||
"sourceKind": "runner",
|
||||
"sourceSeq": 6,
|
||||
"turnId": "turn_phase3_stable"
|
||||
},
|
||||
"protocol": "paperclip.runner",
|
||||
"runId": "run_phase3_stable",
|
||||
"runnerInstanceId": "runner_phase3_stable",
|
||||
"sentAt": "2026-08-07T23:00:00.006Z",
|
||||
"turnId": "turn_phase3_stable",
|
||||
"version": 1
|
||||
},
|
||||
"deliveryCount": 2,
|
||||
"logicalEffectCount": 1
|
||||
},
|
||||
{
|
||||
"sourceSeq": 7,
|
||||
"sourceEventId": "event_runner_phase3_stable_000007",
|
||||
"eventType": "run.result.proposed",
|
||||
"priority": 0,
|
||||
"envelope": {
|
||||
"envelopeId": "envelope_event_000007",
|
||||
"kind": "event",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"emittedAt": "2026-08-07T23:00:00.007Z",
|
||||
"eventType": "run.result.proposed",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"reportedWorkDisposition": "done",
|
||||
"schema": "paperclip.prp.result.v1",
|
||||
"status": "succeeded",
|
||||
"summary": "Phase 3 durable transport recovered without duplicate effects."
|
||||
},
|
||||
"priority": 0,
|
||||
"runId": "run_phase3_stable",
|
||||
"schema": "paperclip.prp.event.v1",
|
||||
"schemaVersion": 1,
|
||||
"sourceEventId": "event_runner_phase3_stable_000007",
|
||||
"sourceInstanceId": "runner_phase3_stable",
|
||||
"sourceKind": "runner",
|
||||
"sourceSeq": 7,
|
||||
"turnId": "turn_phase3_stable"
|
||||
},
|
||||
"protocol": "paperclip.runner",
|
||||
"runId": "run_phase3_stable",
|
||||
"runnerInstanceId": "runner_phase3_stable",
|
||||
"sentAt": "2026-08-07T23:00:00.007Z",
|
||||
"turnId": "turn_phase3_stable",
|
||||
"version": 1
|
||||
},
|
||||
"deliveryCount": 2,
|
||||
"logicalEffectCount": 1
|
||||
},
|
||||
{
|
||||
"sourceSeq": 8,
|
||||
"sourceEventId": "event_runner_phase3_stable_000008",
|
||||
"eventType": "run.terminal",
|
||||
"priority": 0,
|
||||
"envelope": {
|
||||
"envelopeId": "envelope_event_000008",
|
||||
"kind": "event",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"emittedAt": "2026-08-07T23:00:00.008Z",
|
||||
"eventType": "run.terminal",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"reportedWorkDisposition": "done",
|
||||
"runTerminalState": "succeeded",
|
||||
"schema": "paperclip.prp.terminal.v1",
|
||||
"turnTerminalState": "completed"
|
||||
},
|
||||
"priority": 0,
|
||||
"runId": "run_phase3_stable",
|
||||
"schema": "paperclip.prp.event.v1",
|
||||
"schemaVersion": 1,
|
||||
"sourceEventId": "event_runner_phase3_stable_000008",
|
||||
"sourceInstanceId": "runner_phase3_stable",
|
||||
"sourceKind": "runner",
|
||||
"sourceSeq": 8,
|
||||
"turnId": "turn_phase3_stable"
|
||||
},
|
||||
"protocol": "paperclip.runner",
|
||||
"runId": "run_phase3_stable",
|
||||
"runnerInstanceId": "runner_phase3_stable",
|
||||
"sentAt": "2026-08-07T23:00:00.008Z",
|
||||
"turnId": "turn_phase3_stable",
|
||||
"version": 1
|
||||
},
|
||||
"deliveryCount": 2,
|
||||
"logicalEffectCount": 1
|
||||
},
|
||||
{
|
||||
"sourceSeq": 9,
|
||||
"sourceEventId": "event_runner_phase3_stable_000009",
|
||||
"eventType": "runner.stopped",
|
||||
"priority": 0,
|
||||
"envelope": {
|
||||
"envelopeId": "envelope_event_000009",
|
||||
"kind": "event",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"emittedAt": "2026-08-07T23:00:00.009Z",
|
||||
"eventType": "runner.stopped",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"afterDurableFlush": true
|
||||
},
|
||||
"priority": 0,
|
||||
"runId": "run_phase3_stable",
|
||||
"schema": "paperclip.prp.event.v1",
|
||||
"schemaVersion": 1,
|
||||
"sourceEventId": "event_runner_phase3_stable_000009",
|
||||
"sourceInstanceId": "runner_phase3_stable",
|
||||
"sourceKind": "runner",
|
||||
"sourceSeq": 9,
|
||||
"turnId": "turn_phase3_stable"
|
||||
},
|
||||
"protocol": "paperclip.runner",
|
||||
"runId": "run_phase3_stable",
|
||||
"runnerInstanceId": "runner_phase3_stable",
|
||||
"sentAt": "2026-08-07T23:00:00.009Z",
|
||||
"turnId": "turn_phase3_stable",
|
||||
"version": 1
|
||||
},
|
||||
"deliveryCount": 1,
|
||||
"logicalEffectCount": 1
|
||||
}
|
||||
]
|
||||
},
|
||||
"runnerState": {
|
||||
"schema": "paperclip.runner.phase3.state.v1",
|
||||
"runnerInstanceId": "runner_phase3_stable",
|
||||
"environmentLeaseId": "environment_lease_phase3_stable",
|
||||
"runId": "run_phase3_stable",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"turnId": "turn_phase3_stable",
|
||||
"itemId": "item_phase3_stable",
|
||||
"lifecycle": "stopped",
|
||||
"nextSourceSeq": 10,
|
||||
"ackedSourceSeq": 9,
|
||||
"lastControllerCommandSeq": 4,
|
||||
"reconnectCount": 1,
|
||||
"maxOutboxBytes": 65536,
|
||||
"peakOutboxBytes": 5314,
|
||||
"outbox": [],
|
||||
"processedCommands": {
|
||||
"command_phase3_001": {
|
||||
"commandId": "command_phase3_001",
|
||||
"controllerSeq": 1,
|
||||
"commandDigest": "fnv1a64:c19dfbbf86a3dbb4",
|
||||
"status": "completed",
|
||||
"logicalEffectCount": 1,
|
||||
"result": {
|
||||
"commandId": "command_phase3_001",
|
||||
"controllerSeq": 1,
|
||||
"detail": "run prepared",
|
||||
"logicalEffectCount": 1,
|
||||
"status": "completed"
|
||||
}
|
||||
},
|
||||
"command_phase3_002": {
|
||||
"commandId": "command_phase3_002",
|
||||
"controllerSeq": 2,
|
||||
"commandDigest": "fnv1a64:b5198f3ce67ce88e",
|
||||
"status": "completed",
|
||||
"logicalEffectCount": 1,
|
||||
"result": {
|
||||
"commandId": "command_phase3_002",
|
||||
"controllerSeq": 2,
|
||||
"detail": "session bound",
|
||||
"logicalEffectCount": 1,
|
||||
"status": "completed"
|
||||
}
|
||||
},
|
||||
"command_phase3_003": {
|
||||
"commandId": "command_phase3_003",
|
||||
"controllerSeq": 3,
|
||||
"commandDigest": "fnv1a64:fb3b206fe67e1dc8",
|
||||
"status": "completed",
|
||||
"logicalEffectCount": 1,
|
||||
"result": {
|
||||
"commandId": "command_phase3_003",
|
||||
"controllerSeq": 3,
|
||||
"detail": "turn completed",
|
||||
"logicalEffectCount": 1,
|
||||
"status": "completed"
|
||||
}
|
||||
},
|
||||
"command_phase3_004": {
|
||||
"commandId": "command_phase3_004",
|
||||
"controllerSeq": 4,
|
||||
"commandDigest": "fnv1a64:d11bf8308f863bad",
|
||||
"status": "completed",
|
||||
"logicalEffectCount": 1,
|
||||
"result": {
|
||||
"commandId": "command_phase3_004",
|
||||
"controllerSeq": 4,
|
||||
"detail": "runner will stop after durable flush",
|
||||
"logicalEffectCount": 1,
|
||||
"status": "completed"
|
||||
}
|
||||
}
|
||||
},
|
||||
"diagnostics": [
|
||||
"WebSocket connection closed: failed to fill whole buffer"
|
||||
],
|
||||
"backpressure": false,
|
||||
"recoverableFailure": null,
|
||||
"unrecoverableOutcome": null,
|
||||
"harnessGeneration": 1,
|
||||
"stopAfterFlush": true
|
||||
},
|
||||
"commands": [
|
||||
{
|
||||
"schema": "paperclip.prp.command.v1",
|
||||
"commandId": "command_phase3_001",
|
||||
"controllerSeq": 1,
|
||||
"type": "run.prepare",
|
||||
"issuedAt": "2026-08-07T23:30:01.000Z",
|
||||
"payload": {
|
||||
"workspace": "phase-03-durable-fixture"
|
||||
},
|
||||
"status": "completed",
|
||||
"result": {
|
||||
"commandId": "command_phase3_001",
|
||||
"controllerSeq": 1,
|
||||
"detail": "run prepared",
|
||||
"logicalEffectCount": 1,
|
||||
"status": "completed"
|
||||
}
|
||||
},
|
||||
{
|
||||
"schema": "paperclip.prp.command.v1",
|
||||
"commandId": "command_phase3_002",
|
||||
"controllerSeq": 2,
|
||||
"type": "session.open",
|
||||
"issuedAt": "2026-08-07T23:30:02.000Z",
|
||||
"payload": {
|
||||
"reuse": "same_session"
|
||||
},
|
||||
"status": "completed",
|
||||
"result": {
|
||||
"commandId": "command_phase3_002",
|
||||
"controllerSeq": 2,
|
||||
"detail": "session bound",
|
||||
"logicalEffectCount": 1,
|
||||
"status": "completed"
|
||||
}
|
||||
},
|
||||
{
|
||||
"schema": "paperclip.prp.command.v1",
|
||||
"commandId": "command_phase3_003",
|
||||
"controllerSeq": 3,
|
||||
"type": "turn.start",
|
||||
"issuedAt": "2026-08-07T23:30:03.000Z",
|
||||
"payload": {
|
||||
"turnId": "turn_phase3_stable",
|
||||
"text": "Prove Phase 3 durable recovery."
|
||||
},
|
||||
"status": "completed",
|
||||
"result": {
|
||||
"commandId": "command_phase3_003",
|
||||
"controllerSeq": 3,
|
||||
"detail": "turn completed",
|
||||
"logicalEffectCount": 1,
|
||||
"status": "completed"
|
||||
}
|
||||
},
|
||||
{
|
||||
"schema": "paperclip.prp.command.v1",
|
||||
"commandId": "command_phase3_004",
|
||||
"controllerSeq": 4,
|
||||
"type": "runner.shutdown",
|
||||
"issuedAt": "2026-08-07T23:30:04.000Z",
|
||||
"payload": {},
|
||||
"status": "completed",
|
||||
"result": {
|
||||
"commandId": "command_phase3_004",
|
||||
"controllerSeq": 4,
|
||||
"detail": "runner will stop after durable flush",
|
||||
"logicalEffectCount": 1,
|
||||
"status": "completed"
|
||||
}
|
||||
}
|
||||
],
|
||||
"assertions": {
|
||||
"stableIdentity": true,
|
||||
"sourceCursorContinuous": true,
|
||||
"oneLogicalEffectPerAcceptedCommand": true,
|
||||
"noDuplicateLogicalEvents": true,
|
||||
"p0Preserved": true,
|
||||
"boundedStorage": true,
|
||||
"secretsRedacted": true
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,704 @@
|
||||
{
|
||||
"schema": "paperclip.runner.phase3.trace.v1",
|
||||
"diagnostics": {
|
||||
"schema": "paperclip.runner.phase3.diagnostics.v1",
|
||||
"fault": "harness-restart",
|
||||
"connection": {
|
||||
"state": "stopped",
|
||||
"connectionCount": 1,
|
||||
"reconnectCount": 0,
|
||||
"leaseId": "connection_lease_6de7f5ec-7f92-4c7c-806a-d262e02b2271",
|
||||
"leaseExpiresAt": "2026-08-07T23:36:39.644Z"
|
||||
},
|
||||
"identity": {
|
||||
"runnerInstanceId": "runner_phase3_stable",
|
||||
"environmentLeaseId": "environment_lease_phase3_stable",
|
||||
"runId": "run_phase3_stable",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"turnId": "turn_phase3_stable",
|
||||
"itemId": "item_phase3_stable"
|
||||
},
|
||||
"cursors": {
|
||||
"runnerAckedSourceSeq": 12,
|
||||
"runnerNextSourceSeq": 13,
|
||||
"coreAckedSourceSeq": 12,
|
||||
"highestCommittedSourceSeq": 12
|
||||
},
|
||||
"outbox": {
|
||||
"events": 0,
|
||||
"bytes": 0,
|
||||
"peakBytes": 6827,
|
||||
"maxBytes": 65536,
|
||||
"backpressure": false,
|
||||
"p0Committed": 8,
|
||||
"p0Lost": 0
|
||||
},
|
||||
"commands": {
|
||||
"issued": 5,
|
||||
"completed": 5,
|
||||
"rejected": 0,
|
||||
"logicalEffects": 5,
|
||||
"duplicateDeliveries": 0
|
||||
},
|
||||
"recovery": {
|
||||
"replayDeliveries": 11,
|
||||
"runnerRestarts": 0,
|
||||
"harnessRestarts": 1,
|
||||
"malformedFrames": 0,
|
||||
"freshBootstraps": 1,
|
||||
"outcome": "recovered",
|
||||
"reason": "harness_restart_completed"
|
||||
},
|
||||
"security": {
|
||||
"bootstrapTicketPersisted": false,
|
||||
"connectionLeaseTokenPersisted": false,
|
||||
"secretLeakCount": 0
|
||||
},
|
||||
"committedEvents": [
|
||||
{
|
||||
"sourceSeq": 1,
|
||||
"sourceEventId": "event_runner_phase3_stable_000001",
|
||||
"eventType": "workspace.ready",
|
||||
"priority": 1,
|
||||
"envelope": {
|
||||
"envelopeId": "envelope_event_000001",
|
||||
"kind": "event",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"emittedAt": "2026-08-07T23:00:00.001Z",
|
||||
"eventType": "workspace.ready",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"workspace": "phase-03-durable-fixture"
|
||||
},
|
||||
"priority": 1,
|
||||
"runId": "run_phase3_stable",
|
||||
"schema": "paperclip.prp.event.v1",
|
||||
"schemaVersion": 1,
|
||||
"sourceEventId": "event_runner_phase3_stable_000001",
|
||||
"sourceInstanceId": "runner_phase3_stable",
|
||||
"sourceKind": "runner",
|
||||
"sourceSeq": 1,
|
||||
"turnId": "turn_phase3_stable"
|
||||
},
|
||||
"protocol": "paperclip.runner",
|
||||
"runId": "run_phase3_stable",
|
||||
"runnerInstanceId": "runner_phase3_stable",
|
||||
"sentAt": "2026-08-07T23:00:00.001Z",
|
||||
"turnId": "turn_phase3_stable",
|
||||
"version": 1
|
||||
},
|
||||
"deliveryCount": 2,
|
||||
"logicalEffectCount": 1
|
||||
},
|
||||
{
|
||||
"sourceSeq": 2,
|
||||
"sourceEventId": "event_runner_phase3_stable_000002",
|
||||
"eventType": "session.started",
|
||||
"priority": 0,
|
||||
"envelope": {
|
||||
"envelopeId": "envelope_event_000002",
|
||||
"kind": "event",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"emittedAt": "2026-08-07T23:00:00.002Z",
|
||||
"eventType": "session.started",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"driverSessionId": "driver_phase3_fake",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"resumed": false
|
||||
},
|
||||
"priority": 0,
|
||||
"runId": "run_phase3_stable",
|
||||
"schema": "paperclip.prp.event.v1",
|
||||
"schemaVersion": 1,
|
||||
"sourceEventId": "event_runner_phase3_stable_000002",
|
||||
"sourceInstanceId": "runner_phase3_stable",
|
||||
"sourceKind": "runner",
|
||||
"sourceSeq": 2,
|
||||
"turnId": "turn_phase3_stable"
|
||||
},
|
||||
"protocol": "paperclip.runner",
|
||||
"runId": "run_phase3_stable",
|
||||
"runnerInstanceId": "runner_phase3_stable",
|
||||
"sentAt": "2026-08-07T23:00:00.002Z",
|
||||
"turnId": "turn_phase3_stable",
|
||||
"version": 1
|
||||
},
|
||||
"deliveryCount": 2,
|
||||
"logicalEffectCount": 1
|
||||
},
|
||||
{
|
||||
"sourceSeq": 3,
|
||||
"sourceEventId": "event_runner_phase3_stable_000003",
|
||||
"eventType": "harness.exited",
|
||||
"priority": 0,
|
||||
"envelope": {
|
||||
"envelopeId": "envelope_event_000003",
|
||||
"kind": "event",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"emittedAt": "2026-08-07T23:00:00.003Z",
|
||||
"eventType": "harness.exited",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"generation": 1,
|
||||
"reason": "fault_injection_restart",
|
||||
"recoverable": true
|
||||
},
|
||||
"priority": 0,
|
||||
"runId": "run_phase3_stable",
|
||||
"schema": "paperclip.prp.event.v1",
|
||||
"schemaVersion": 1,
|
||||
"sourceEventId": "event_runner_phase3_stable_000003",
|
||||
"sourceInstanceId": "runner_phase3_stable",
|
||||
"sourceKind": "runner",
|
||||
"sourceSeq": 3,
|
||||
"turnId": "turn_phase3_stable"
|
||||
},
|
||||
"protocol": "paperclip.runner",
|
||||
"runId": "run_phase3_stable",
|
||||
"runnerInstanceId": "runner_phase3_stable",
|
||||
"sentAt": "2026-08-07T23:00:00.003Z",
|
||||
"turnId": "turn_phase3_stable",
|
||||
"version": 1
|
||||
},
|
||||
"deliveryCount": 2,
|
||||
"logicalEffectCount": 1
|
||||
},
|
||||
{
|
||||
"sourceSeq": 4,
|
||||
"sourceEventId": "event_runner_phase3_stable_000004",
|
||||
"eventType": "harness.ready",
|
||||
"priority": 0,
|
||||
"envelope": {
|
||||
"envelopeId": "envelope_event_000004",
|
||||
"kind": "event",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"emittedAt": "2026-08-07T23:00:00.004Z",
|
||||
"eventType": "harness.ready",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"driverKind": "fake",
|
||||
"generation": 2
|
||||
},
|
||||
"priority": 0,
|
||||
"runId": "run_phase3_stable",
|
||||
"schema": "paperclip.prp.event.v1",
|
||||
"schemaVersion": 1,
|
||||
"sourceEventId": "event_runner_phase3_stable_000004",
|
||||
"sourceInstanceId": "runner_phase3_stable",
|
||||
"sourceKind": "runner",
|
||||
"sourceSeq": 4,
|
||||
"turnId": "turn_phase3_stable"
|
||||
},
|
||||
"protocol": "paperclip.runner",
|
||||
"runId": "run_phase3_stable",
|
||||
"runnerInstanceId": "runner_phase3_stable",
|
||||
"sentAt": "2026-08-07T23:00:00.004Z",
|
||||
"turnId": "turn_phase3_stable",
|
||||
"version": 1
|
||||
},
|
||||
"deliveryCount": 2,
|
||||
"logicalEffectCount": 1
|
||||
},
|
||||
{
|
||||
"sourceSeq": 5,
|
||||
"sourceEventId": "event_runner_phase3_stable_000005",
|
||||
"eventType": "session.reconciled",
|
||||
"priority": 0,
|
||||
"envelope": {
|
||||
"envelopeId": "envelope_event_000005",
|
||||
"kind": "event",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"emittedAt": "2026-08-07T23:00:00.005Z",
|
||||
"eventType": "session.reconciled",
|
||||
"itemId": "item_phase3_stable",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"itemId": "item_phase3_stable",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"outcome": "same_session_resumed",
|
||||
"turnId": "turn_phase3_stable"
|
||||
},
|
||||
"priority": 0,
|
||||
"runId": "run_phase3_stable",
|
||||
"schema": "paperclip.prp.event.v1",
|
||||
"schemaVersion": 1,
|
||||
"sourceEventId": "event_runner_phase3_stable_000005",
|
||||
"sourceInstanceId": "runner_phase3_stable",
|
||||
"sourceKind": "runner",
|
||||
"sourceSeq": 5,
|
||||
"turnId": "turn_phase3_stable"
|
||||
},
|
||||
"protocol": "paperclip.runner",
|
||||
"runId": "run_phase3_stable",
|
||||
"runnerInstanceId": "runner_phase3_stable",
|
||||
"sentAt": "2026-08-07T23:00:00.005Z",
|
||||
"turnId": "turn_phase3_stable",
|
||||
"version": 1
|
||||
},
|
||||
"deliveryCount": 2,
|
||||
"logicalEffectCount": 1
|
||||
},
|
||||
{
|
||||
"sourceSeq": 6,
|
||||
"sourceEventId": "event_runner_phase3_stable_000006",
|
||||
"eventType": "turn.accepted",
|
||||
"priority": 0,
|
||||
"envelope": {
|
||||
"envelopeId": "envelope_event_000006",
|
||||
"kind": "event",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"emittedAt": "2026-08-07T23:00:00.006Z",
|
||||
"eventType": "turn.accepted",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"sameSession": true,
|
||||
"turnId": "turn_phase3_stable"
|
||||
},
|
||||
"priority": 0,
|
||||
"runId": "run_phase3_stable",
|
||||
"schema": "paperclip.prp.event.v1",
|
||||
"schemaVersion": 1,
|
||||
"sourceEventId": "event_runner_phase3_stable_000006",
|
||||
"sourceInstanceId": "runner_phase3_stable",
|
||||
"sourceKind": "runner",
|
||||
"sourceSeq": 6,
|
||||
"turnId": "turn_phase3_stable"
|
||||
},
|
||||
"protocol": "paperclip.runner",
|
||||
"runId": "run_phase3_stable",
|
||||
"runnerInstanceId": "runner_phase3_stable",
|
||||
"sentAt": "2026-08-07T23:00:00.006Z",
|
||||
"turnId": "turn_phase3_stable",
|
||||
"version": 1
|
||||
},
|
||||
"deliveryCount": 2,
|
||||
"logicalEffectCount": 1
|
||||
},
|
||||
{
|
||||
"sourceSeq": 7,
|
||||
"sourceEventId": "event_runner_phase3_stable_000007",
|
||||
"eventType": "item.started",
|
||||
"priority": 1,
|
||||
"envelope": {
|
||||
"envelopeId": "envelope_event_000007",
|
||||
"kind": "event",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"emittedAt": "2026-08-07T23:00:00.007Z",
|
||||
"eventType": "item.started",
|
||||
"itemId": "item_phase3_stable",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"kind": "assistant_message"
|
||||
},
|
||||
"priority": 1,
|
||||
"runId": "run_phase3_stable",
|
||||
"schema": "paperclip.prp.event.v1",
|
||||
"schemaVersion": 1,
|
||||
"sourceEventId": "event_runner_phase3_stable_000007",
|
||||
"sourceInstanceId": "runner_phase3_stable",
|
||||
"sourceKind": "runner",
|
||||
"sourceSeq": 7,
|
||||
"turnId": "turn_phase3_stable"
|
||||
},
|
||||
"protocol": "paperclip.runner",
|
||||
"runId": "run_phase3_stable",
|
||||
"runnerInstanceId": "runner_phase3_stable",
|
||||
"sentAt": "2026-08-07T23:00:00.007Z",
|
||||
"turnId": "turn_phase3_stable",
|
||||
"version": 1
|
||||
},
|
||||
"deliveryCount": 2,
|
||||
"logicalEffectCount": 1
|
||||
},
|
||||
{
|
||||
"sourceSeq": 8,
|
||||
"sourceEventId": "event_runner_phase3_stable_000008",
|
||||
"eventType": "item.delta",
|
||||
"priority": 2,
|
||||
"envelope": {
|
||||
"envelopeId": "envelope_event_000008",
|
||||
"kind": "event",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"emittedAt": "2026-08-07T23:00:00.008Z",
|
||||
"eventType": "item.delta",
|
||||
"itemId": "item_phase3_stable",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"text": "Prove Phase 3 durable recovery."
|
||||
},
|
||||
"priority": 2,
|
||||
"runId": "run_phase3_stable",
|
||||
"schema": "paperclip.prp.event.v1",
|
||||
"schemaVersion": 1,
|
||||
"sourceEventId": "event_runner_phase3_stable_000008",
|
||||
"sourceInstanceId": "runner_phase3_stable",
|
||||
"sourceKind": "runner",
|
||||
"sourceSeq": 8,
|
||||
"turnId": "turn_phase3_stable"
|
||||
},
|
||||
"protocol": "paperclip.runner",
|
||||
"runId": "run_phase3_stable",
|
||||
"runnerInstanceId": "runner_phase3_stable",
|
||||
"sentAt": "2026-08-07T23:00:00.008Z",
|
||||
"turnId": "turn_phase3_stable",
|
||||
"version": 1
|
||||
},
|
||||
"deliveryCount": 2,
|
||||
"logicalEffectCount": 1
|
||||
},
|
||||
{
|
||||
"sourceSeq": 9,
|
||||
"sourceEventId": "event_runner_phase3_stable_000009",
|
||||
"eventType": "item.completed",
|
||||
"priority": 1,
|
||||
"envelope": {
|
||||
"envelopeId": "envelope_event_000009",
|
||||
"kind": "event",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"emittedAt": "2026-08-07T23:00:00.009Z",
|
||||
"eventType": "item.completed",
|
||||
"itemId": "item_phase3_stable",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"text": "Durable recovery completed."
|
||||
},
|
||||
"priority": 1,
|
||||
"runId": "run_phase3_stable",
|
||||
"schema": "paperclip.prp.event.v1",
|
||||
"schemaVersion": 1,
|
||||
"sourceEventId": "event_runner_phase3_stable_000009",
|
||||
"sourceInstanceId": "runner_phase3_stable",
|
||||
"sourceKind": "runner",
|
||||
"sourceSeq": 9,
|
||||
"turnId": "turn_phase3_stable"
|
||||
},
|
||||
"protocol": "paperclip.runner",
|
||||
"runId": "run_phase3_stable",
|
||||
"runnerInstanceId": "runner_phase3_stable",
|
||||
"sentAt": "2026-08-07T23:00:00.009Z",
|
||||
"turnId": "turn_phase3_stable",
|
||||
"version": 1
|
||||
},
|
||||
"deliveryCount": 2,
|
||||
"logicalEffectCount": 1
|
||||
},
|
||||
{
|
||||
"sourceSeq": 10,
|
||||
"sourceEventId": "event_runner_phase3_stable_000010",
|
||||
"eventType": "run.result.proposed",
|
||||
"priority": 0,
|
||||
"envelope": {
|
||||
"envelopeId": "envelope_event_000010",
|
||||
"kind": "event",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"emittedAt": "2026-08-07T23:00:00.010Z",
|
||||
"eventType": "run.result.proposed",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"reportedWorkDisposition": "done",
|
||||
"schema": "paperclip.prp.result.v1",
|
||||
"status": "succeeded",
|
||||
"summary": "Phase 3 durable transport recovered without duplicate effects."
|
||||
},
|
||||
"priority": 0,
|
||||
"runId": "run_phase3_stable",
|
||||
"schema": "paperclip.prp.event.v1",
|
||||
"schemaVersion": 1,
|
||||
"sourceEventId": "event_runner_phase3_stable_000010",
|
||||
"sourceInstanceId": "runner_phase3_stable",
|
||||
"sourceKind": "runner",
|
||||
"sourceSeq": 10,
|
||||
"turnId": "turn_phase3_stable"
|
||||
},
|
||||
"protocol": "paperclip.runner",
|
||||
"runId": "run_phase3_stable",
|
||||
"runnerInstanceId": "runner_phase3_stable",
|
||||
"sentAt": "2026-08-07T23:00:00.010Z",
|
||||
"turnId": "turn_phase3_stable",
|
||||
"version": 1
|
||||
},
|
||||
"deliveryCount": 2,
|
||||
"logicalEffectCount": 1
|
||||
},
|
||||
{
|
||||
"sourceSeq": 11,
|
||||
"sourceEventId": "event_runner_phase3_stable_000011",
|
||||
"eventType": "run.terminal",
|
||||
"priority": 0,
|
||||
"envelope": {
|
||||
"envelopeId": "envelope_event_000011",
|
||||
"kind": "event",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"emittedAt": "2026-08-07T23:00:00.011Z",
|
||||
"eventType": "run.terminal",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"reportedWorkDisposition": "done",
|
||||
"runTerminalState": "succeeded",
|
||||
"schema": "paperclip.prp.terminal.v1",
|
||||
"turnTerminalState": "completed"
|
||||
},
|
||||
"priority": 0,
|
||||
"runId": "run_phase3_stable",
|
||||
"schema": "paperclip.prp.event.v1",
|
||||
"schemaVersion": 1,
|
||||
"sourceEventId": "event_runner_phase3_stable_000011",
|
||||
"sourceInstanceId": "runner_phase3_stable",
|
||||
"sourceKind": "runner",
|
||||
"sourceSeq": 11,
|
||||
"turnId": "turn_phase3_stable"
|
||||
},
|
||||
"protocol": "paperclip.runner",
|
||||
"runId": "run_phase3_stable",
|
||||
"runnerInstanceId": "runner_phase3_stable",
|
||||
"sentAt": "2026-08-07T23:00:00.011Z",
|
||||
"turnId": "turn_phase3_stable",
|
||||
"version": 1
|
||||
},
|
||||
"deliveryCount": 2,
|
||||
"logicalEffectCount": 1
|
||||
},
|
||||
{
|
||||
"sourceSeq": 12,
|
||||
"sourceEventId": "event_runner_phase3_stable_000012",
|
||||
"eventType": "runner.stopped",
|
||||
"priority": 0,
|
||||
"envelope": {
|
||||
"envelopeId": "envelope_event_000012",
|
||||
"kind": "event",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"emittedAt": "2026-08-07T23:00:00.012Z",
|
||||
"eventType": "runner.stopped",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"afterDurableFlush": true
|
||||
},
|
||||
"priority": 0,
|
||||
"runId": "run_phase3_stable",
|
||||
"schema": "paperclip.prp.event.v1",
|
||||
"schemaVersion": 1,
|
||||
"sourceEventId": "event_runner_phase3_stable_000012",
|
||||
"sourceInstanceId": "runner_phase3_stable",
|
||||
"sourceKind": "runner",
|
||||
"sourceSeq": 12,
|
||||
"turnId": "turn_phase3_stable"
|
||||
},
|
||||
"protocol": "paperclip.runner",
|
||||
"runId": "run_phase3_stable",
|
||||
"runnerInstanceId": "runner_phase3_stable",
|
||||
"sentAt": "2026-08-07T23:00:00.012Z",
|
||||
"turnId": "turn_phase3_stable",
|
||||
"version": 1
|
||||
},
|
||||
"deliveryCount": 1,
|
||||
"logicalEffectCount": 1
|
||||
}
|
||||
]
|
||||
},
|
||||
"runnerState": {
|
||||
"schema": "paperclip.runner.phase3.state.v1",
|
||||
"runnerInstanceId": "runner_phase3_stable",
|
||||
"environmentLeaseId": "environment_lease_phase3_stable",
|
||||
"runId": "run_phase3_stable",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"turnId": "turn_phase3_stable",
|
||||
"itemId": "item_phase3_stable",
|
||||
"lifecycle": "stopped",
|
||||
"nextSourceSeq": 13,
|
||||
"ackedSourceSeq": 12,
|
||||
"lastControllerCommandSeq": 5,
|
||||
"reconnectCount": 0,
|
||||
"maxOutboxBytes": 65536,
|
||||
"peakOutboxBytes": 6827,
|
||||
"outbox": [],
|
||||
"processedCommands": {
|
||||
"command_phase3_001": {
|
||||
"commandId": "command_phase3_001",
|
||||
"controllerSeq": 1,
|
||||
"commandDigest": "fnv1a64:c19dfbbf86a3dbb4",
|
||||
"status": "completed",
|
||||
"logicalEffectCount": 1,
|
||||
"result": {
|
||||
"commandId": "command_phase3_001",
|
||||
"controllerSeq": 1,
|
||||
"detail": "run prepared",
|
||||
"logicalEffectCount": 1,
|
||||
"status": "completed"
|
||||
}
|
||||
},
|
||||
"command_phase3_002": {
|
||||
"commandId": "command_phase3_002",
|
||||
"controllerSeq": 2,
|
||||
"commandDigest": "fnv1a64:b5198f3ce67ce88e",
|
||||
"status": "completed",
|
||||
"logicalEffectCount": 1,
|
||||
"result": {
|
||||
"commandId": "command_phase3_002",
|
||||
"controllerSeq": 2,
|
||||
"detail": "session bound",
|
||||
"logicalEffectCount": 1,
|
||||
"status": "completed"
|
||||
}
|
||||
},
|
||||
"command_phase3_003": {
|
||||
"commandId": "command_phase3_003",
|
||||
"controllerSeq": 3,
|
||||
"commandDigest": "fnv1a64:284c1f5778b929c4",
|
||||
"status": "completed",
|
||||
"logicalEffectCount": 1,
|
||||
"result": {
|
||||
"commandId": "command_phase3_003",
|
||||
"controllerSeq": 3,
|
||||
"detail": "harness restarted and reconciled",
|
||||
"logicalEffectCount": 1,
|
||||
"status": "completed"
|
||||
}
|
||||
},
|
||||
"command_phase3_004": {
|
||||
"commandId": "command_phase3_004",
|
||||
"controllerSeq": 4,
|
||||
"commandDigest": "fnv1a64:34d91505a30f60fb",
|
||||
"status": "completed",
|
||||
"logicalEffectCount": 1,
|
||||
"result": {
|
||||
"commandId": "command_phase3_004",
|
||||
"controllerSeq": 4,
|
||||
"detail": "turn completed",
|
||||
"logicalEffectCount": 1,
|
||||
"status": "completed"
|
||||
}
|
||||
},
|
||||
"command_phase3_005": {
|
||||
"commandId": "command_phase3_005",
|
||||
"controllerSeq": 5,
|
||||
"commandDigest": "fnv1a64:533318a30fba6d22",
|
||||
"status": "completed",
|
||||
"logicalEffectCount": 1,
|
||||
"result": {
|
||||
"commandId": "command_phase3_005",
|
||||
"controllerSeq": 5,
|
||||
"detail": "runner will stop after durable flush",
|
||||
"logicalEffectCount": 1,
|
||||
"status": "completed"
|
||||
}
|
||||
}
|
||||
},
|
||||
"diagnostics": [],
|
||||
"backpressure": false,
|
||||
"recoverableFailure": null,
|
||||
"unrecoverableOutcome": null,
|
||||
"harnessGeneration": 2,
|
||||
"stopAfterFlush": true
|
||||
},
|
||||
"commands": [
|
||||
{
|
||||
"schema": "paperclip.prp.command.v1",
|
||||
"commandId": "command_phase3_001",
|
||||
"controllerSeq": 1,
|
||||
"type": "run.prepare",
|
||||
"issuedAt": "2026-08-07T23:30:01.000Z",
|
||||
"payload": {
|
||||
"workspace": "phase-03-durable-fixture"
|
||||
},
|
||||
"status": "completed",
|
||||
"result": {
|
||||
"commandId": "command_phase3_001",
|
||||
"controllerSeq": 1,
|
||||
"detail": "run prepared",
|
||||
"logicalEffectCount": 1,
|
||||
"status": "completed"
|
||||
}
|
||||
},
|
||||
{
|
||||
"schema": "paperclip.prp.command.v1",
|
||||
"commandId": "command_phase3_002",
|
||||
"controllerSeq": 2,
|
||||
"type": "session.open",
|
||||
"issuedAt": "2026-08-07T23:30:02.000Z",
|
||||
"payload": {
|
||||
"reuse": "same_session"
|
||||
},
|
||||
"status": "completed",
|
||||
"result": {
|
||||
"commandId": "command_phase3_002",
|
||||
"controllerSeq": 2,
|
||||
"detail": "session bound",
|
||||
"logicalEffectCount": 1,
|
||||
"status": "completed"
|
||||
}
|
||||
},
|
||||
{
|
||||
"schema": "paperclip.prp.command.v1",
|
||||
"commandId": "command_phase3_003",
|
||||
"controllerSeq": 3,
|
||||
"type": "fault.harness_restart",
|
||||
"issuedAt": "2026-08-07T23:30:03.000Z",
|
||||
"payload": {},
|
||||
"status": "completed",
|
||||
"result": {
|
||||
"commandId": "command_phase3_003",
|
||||
"controllerSeq": 3,
|
||||
"detail": "harness restarted and reconciled",
|
||||
"logicalEffectCount": 1,
|
||||
"status": "completed"
|
||||
}
|
||||
},
|
||||
{
|
||||
"schema": "paperclip.prp.command.v1",
|
||||
"commandId": "command_phase3_004",
|
||||
"controllerSeq": 4,
|
||||
"type": "turn.start",
|
||||
"issuedAt": "2026-08-07T23:30:04.000Z",
|
||||
"payload": {
|
||||
"turnId": "turn_phase3_stable",
|
||||
"text": "Prove Phase 3 durable recovery."
|
||||
},
|
||||
"status": "completed",
|
||||
"result": {
|
||||
"commandId": "command_phase3_004",
|
||||
"controllerSeq": 4,
|
||||
"detail": "turn completed",
|
||||
"logicalEffectCount": 1,
|
||||
"status": "completed"
|
||||
}
|
||||
},
|
||||
{
|
||||
"schema": "paperclip.prp.command.v1",
|
||||
"commandId": "command_phase3_005",
|
||||
"controllerSeq": 5,
|
||||
"type": "runner.shutdown",
|
||||
"issuedAt": "2026-08-07T23:30:05.000Z",
|
||||
"payload": {},
|
||||
"status": "completed",
|
||||
"result": {
|
||||
"commandId": "command_phase3_005",
|
||||
"controllerSeq": 5,
|
||||
"detail": "runner will stop after durable flush",
|
||||
"logicalEffectCount": 1,
|
||||
"status": "completed"
|
||||
}
|
||||
}
|
||||
],
|
||||
"assertions": {
|
||||
"stableIdentity": true,
|
||||
"sourceCursorContinuous": true,
|
||||
"oneLogicalEffectPerAcceptedCommand": true,
|
||||
"noDuplicateLogicalEvents": true,
|
||||
"p0Preserved": true,
|
||||
"boundedStorage": true,
|
||||
"secretsRedacted": true
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,603 @@
|
||||
{
|
||||
"schema": "paperclip.runner.phase3.trace.v1",
|
||||
"diagnostics": {
|
||||
"schema": "paperclip.runner.phase3.diagnostics.v1",
|
||||
"fault": "lease-expiry",
|
||||
"connection": {
|
||||
"state": "stopped",
|
||||
"connectionCount": 2,
|
||||
"reconnectCount": 2,
|
||||
"leaseId": "connection_lease_42900de0-4a64-47c1-b20c-d14890a9be42",
|
||||
"leaseExpiresAt": "2026-08-07T23:36:40.312Z"
|
||||
},
|
||||
"identity": {
|
||||
"runnerInstanceId": "runner_phase3_stable",
|
||||
"environmentLeaseId": "environment_lease_phase3_stable",
|
||||
"runId": "run_phase3_stable",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"turnId": "turn_phase3_stable",
|
||||
"itemId": "item_phase3_stable"
|
||||
},
|
||||
"cursors": {
|
||||
"runnerAckedSourceSeq": 10,
|
||||
"runnerNextSourceSeq": 11,
|
||||
"coreAckedSourceSeq": 10,
|
||||
"highestCommittedSourceSeq": 10
|
||||
},
|
||||
"outbox": {
|
||||
"events": 0,
|
||||
"bytes": 0,
|
||||
"peakBytes": 5314,
|
||||
"maxBytes": 65536,
|
||||
"backpressure": false,
|
||||
"p0Committed": 6,
|
||||
"p0Lost": 0
|
||||
},
|
||||
"commands": {
|
||||
"issued": 4,
|
||||
"completed": 4,
|
||||
"rejected": 0,
|
||||
"logicalEffects": 4,
|
||||
"duplicateDeliveries": 0
|
||||
},
|
||||
"recovery": {
|
||||
"replayDeliveries": 9,
|
||||
"runnerRestarts": 1,
|
||||
"harnessRestarts": 0,
|
||||
"malformedFrames": 0,
|
||||
"freshBootstraps": 2,
|
||||
"outcome": "recovered",
|
||||
"reason": "lease_expiry_completed"
|
||||
},
|
||||
"security": {
|
||||
"bootstrapTicketPersisted": false,
|
||||
"connectionLeaseTokenPersisted": false,
|
||||
"secretLeakCount": 0
|
||||
},
|
||||
"committedEvents": [
|
||||
{
|
||||
"sourceSeq": 1,
|
||||
"sourceEventId": "event_runner_phase3_stable_000001",
|
||||
"eventType": "runner.reconciled",
|
||||
"priority": 0,
|
||||
"envelope": {
|
||||
"envelopeId": "envelope_event_000001",
|
||||
"kind": "event",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"emittedAt": "2026-08-07T23:00:00.001Z",
|
||||
"eventType": "runner.reconciled",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"itemId": "item_phase3_stable",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"outcome": "same_durable_session_resumed",
|
||||
"runnerInstanceId": "runner_phase3_stable",
|
||||
"turnId": "turn_phase3_stable"
|
||||
},
|
||||
"priority": 0,
|
||||
"runId": "run_phase3_stable",
|
||||
"schema": "paperclip.prp.event.v1",
|
||||
"schemaVersion": 1,
|
||||
"sourceEventId": "event_runner_phase3_stable_000001",
|
||||
"sourceInstanceId": "runner_phase3_stable",
|
||||
"sourceKind": "runner",
|
||||
"sourceSeq": 1,
|
||||
"turnId": "turn_phase3_stable"
|
||||
},
|
||||
"protocol": "paperclip.runner",
|
||||
"runId": "run_phase3_stable",
|
||||
"runnerInstanceId": "runner_phase3_stable",
|
||||
"sentAt": "2026-08-07T23:00:00.001Z",
|
||||
"turnId": "turn_phase3_stable",
|
||||
"version": 1
|
||||
},
|
||||
"deliveryCount": 2,
|
||||
"logicalEffectCount": 1
|
||||
},
|
||||
{
|
||||
"sourceSeq": 2,
|
||||
"sourceEventId": "event_runner_phase3_stable_000002",
|
||||
"eventType": "workspace.ready",
|
||||
"priority": 1,
|
||||
"envelope": {
|
||||
"envelopeId": "envelope_event_000002",
|
||||
"kind": "event",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"emittedAt": "2026-08-07T23:00:00.002Z",
|
||||
"eventType": "workspace.ready",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"workspace": "phase-03-durable-fixture"
|
||||
},
|
||||
"priority": 1,
|
||||
"runId": "run_phase3_stable",
|
||||
"schema": "paperclip.prp.event.v1",
|
||||
"schemaVersion": 1,
|
||||
"sourceEventId": "event_runner_phase3_stable_000002",
|
||||
"sourceInstanceId": "runner_phase3_stable",
|
||||
"sourceKind": "runner",
|
||||
"sourceSeq": 2,
|
||||
"turnId": "turn_phase3_stable"
|
||||
},
|
||||
"protocol": "paperclip.runner",
|
||||
"runId": "run_phase3_stable",
|
||||
"runnerInstanceId": "runner_phase3_stable",
|
||||
"sentAt": "2026-08-07T23:00:00.002Z",
|
||||
"turnId": "turn_phase3_stable",
|
||||
"version": 1
|
||||
},
|
||||
"deliveryCount": 2,
|
||||
"logicalEffectCount": 1
|
||||
},
|
||||
{
|
||||
"sourceSeq": 3,
|
||||
"sourceEventId": "event_runner_phase3_stable_000003",
|
||||
"eventType": "session.started",
|
||||
"priority": 0,
|
||||
"envelope": {
|
||||
"envelopeId": "envelope_event_000003",
|
||||
"kind": "event",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"emittedAt": "2026-08-07T23:00:00.003Z",
|
||||
"eventType": "session.started",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"driverSessionId": "driver_phase3_fake",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"resumed": true
|
||||
},
|
||||
"priority": 0,
|
||||
"runId": "run_phase3_stable",
|
||||
"schema": "paperclip.prp.event.v1",
|
||||
"schemaVersion": 1,
|
||||
"sourceEventId": "event_runner_phase3_stable_000003",
|
||||
"sourceInstanceId": "runner_phase3_stable",
|
||||
"sourceKind": "runner",
|
||||
"sourceSeq": 3,
|
||||
"turnId": "turn_phase3_stable"
|
||||
},
|
||||
"protocol": "paperclip.runner",
|
||||
"runId": "run_phase3_stable",
|
||||
"runnerInstanceId": "runner_phase3_stable",
|
||||
"sentAt": "2026-08-07T23:00:00.003Z",
|
||||
"turnId": "turn_phase3_stable",
|
||||
"version": 1
|
||||
},
|
||||
"deliveryCount": 2,
|
||||
"logicalEffectCount": 1
|
||||
},
|
||||
{
|
||||
"sourceSeq": 4,
|
||||
"sourceEventId": "event_runner_phase3_stable_000004",
|
||||
"eventType": "turn.accepted",
|
||||
"priority": 0,
|
||||
"envelope": {
|
||||
"envelopeId": "envelope_event_000004",
|
||||
"kind": "event",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"emittedAt": "2026-08-07T23:00:00.004Z",
|
||||
"eventType": "turn.accepted",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"sameSession": true,
|
||||
"turnId": "turn_phase3_stable"
|
||||
},
|
||||
"priority": 0,
|
||||
"runId": "run_phase3_stable",
|
||||
"schema": "paperclip.prp.event.v1",
|
||||
"schemaVersion": 1,
|
||||
"sourceEventId": "event_runner_phase3_stable_000004",
|
||||
"sourceInstanceId": "runner_phase3_stable",
|
||||
"sourceKind": "runner",
|
||||
"sourceSeq": 4,
|
||||
"turnId": "turn_phase3_stable"
|
||||
},
|
||||
"protocol": "paperclip.runner",
|
||||
"runId": "run_phase3_stable",
|
||||
"runnerInstanceId": "runner_phase3_stable",
|
||||
"sentAt": "2026-08-07T23:00:00.004Z",
|
||||
"turnId": "turn_phase3_stable",
|
||||
"version": 1
|
||||
},
|
||||
"deliveryCount": 2,
|
||||
"logicalEffectCount": 1
|
||||
},
|
||||
{
|
||||
"sourceSeq": 5,
|
||||
"sourceEventId": "event_runner_phase3_stable_000005",
|
||||
"eventType": "item.started",
|
||||
"priority": 1,
|
||||
"envelope": {
|
||||
"envelopeId": "envelope_event_000005",
|
||||
"kind": "event",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"emittedAt": "2026-08-07T23:00:00.005Z",
|
||||
"eventType": "item.started",
|
||||
"itemId": "item_phase3_stable",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"kind": "assistant_message"
|
||||
},
|
||||
"priority": 1,
|
||||
"runId": "run_phase3_stable",
|
||||
"schema": "paperclip.prp.event.v1",
|
||||
"schemaVersion": 1,
|
||||
"sourceEventId": "event_runner_phase3_stable_000005",
|
||||
"sourceInstanceId": "runner_phase3_stable",
|
||||
"sourceKind": "runner",
|
||||
"sourceSeq": 5,
|
||||
"turnId": "turn_phase3_stable"
|
||||
},
|
||||
"protocol": "paperclip.runner",
|
||||
"runId": "run_phase3_stable",
|
||||
"runnerInstanceId": "runner_phase3_stable",
|
||||
"sentAt": "2026-08-07T23:00:00.005Z",
|
||||
"turnId": "turn_phase3_stable",
|
||||
"version": 1
|
||||
},
|
||||
"deliveryCount": 2,
|
||||
"logicalEffectCount": 1
|
||||
},
|
||||
{
|
||||
"sourceSeq": 6,
|
||||
"sourceEventId": "event_runner_phase3_stable_000006",
|
||||
"eventType": "item.delta",
|
||||
"priority": 2,
|
||||
"envelope": {
|
||||
"envelopeId": "envelope_event_000006",
|
||||
"kind": "event",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"emittedAt": "2026-08-07T23:00:00.006Z",
|
||||
"eventType": "item.delta",
|
||||
"itemId": "item_phase3_stable",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"text": "Prove Phase 3 durable recovery."
|
||||
},
|
||||
"priority": 2,
|
||||
"runId": "run_phase3_stable",
|
||||
"schema": "paperclip.prp.event.v1",
|
||||
"schemaVersion": 1,
|
||||
"sourceEventId": "event_runner_phase3_stable_000006",
|
||||
"sourceInstanceId": "runner_phase3_stable",
|
||||
"sourceKind": "runner",
|
||||
"sourceSeq": 6,
|
||||
"turnId": "turn_phase3_stable"
|
||||
},
|
||||
"protocol": "paperclip.runner",
|
||||
"runId": "run_phase3_stable",
|
||||
"runnerInstanceId": "runner_phase3_stable",
|
||||
"sentAt": "2026-08-07T23:00:00.006Z",
|
||||
"turnId": "turn_phase3_stable",
|
||||
"version": 1
|
||||
},
|
||||
"deliveryCount": 2,
|
||||
"logicalEffectCount": 1
|
||||
},
|
||||
{
|
||||
"sourceSeq": 7,
|
||||
"sourceEventId": "event_runner_phase3_stable_000007",
|
||||
"eventType": "item.completed",
|
||||
"priority": 1,
|
||||
"envelope": {
|
||||
"envelopeId": "envelope_event_000007",
|
||||
"kind": "event",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"emittedAt": "2026-08-07T23:00:00.007Z",
|
||||
"eventType": "item.completed",
|
||||
"itemId": "item_phase3_stable",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"text": "Durable recovery completed."
|
||||
},
|
||||
"priority": 1,
|
||||
"runId": "run_phase3_stable",
|
||||
"schema": "paperclip.prp.event.v1",
|
||||
"schemaVersion": 1,
|
||||
"sourceEventId": "event_runner_phase3_stable_000007",
|
||||
"sourceInstanceId": "runner_phase3_stable",
|
||||
"sourceKind": "runner",
|
||||
"sourceSeq": 7,
|
||||
"turnId": "turn_phase3_stable"
|
||||
},
|
||||
"protocol": "paperclip.runner",
|
||||
"runId": "run_phase3_stable",
|
||||
"runnerInstanceId": "runner_phase3_stable",
|
||||
"sentAt": "2026-08-07T23:00:00.007Z",
|
||||
"turnId": "turn_phase3_stable",
|
||||
"version": 1
|
||||
},
|
||||
"deliveryCount": 2,
|
||||
"logicalEffectCount": 1
|
||||
},
|
||||
{
|
||||
"sourceSeq": 8,
|
||||
"sourceEventId": "event_runner_phase3_stable_000008",
|
||||
"eventType": "run.result.proposed",
|
||||
"priority": 0,
|
||||
"envelope": {
|
||||
"envelopeId": "envelope_event_000008",
|
||||
"kind": "event",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"emittedAt": "2026-08-07T23:00:00.008Z",
|
||||
"eventType": "run.result.proposed",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"reportedWorkDisposition": "done",
|
||||
"schema": "paperclip.prp.result.v1",
|
||||
"status": "succeeded",
|
||||
"summary": "Phase 3 durable transport recovered without duplicate effects."
|
||||
},
|
||||
"priority": 0,
|
||||
"runId": "run_phase3_stable",
|
||||
"schema": "paperclip.prp.event.v1",
|
||||
"schemaVersion": 1,
|
||||
"sourceEventId": "event_runner_phase3_stable_000008",
|
||||
"sourceInstanceId": "runner_phase3_stable",
|
||||
"sourceKind": "runner",
|
||||
"sourceSeq": 8,
|
||||
"turnId": "turn_phase3_stable"
|
||||
},
|
||||
"protocol": "paperclip.runner",
|
||||
"runId": "run_phase3_stable",
|
||||
"runnerInstanceId": "runner_phase3_stable",
|
||||
"sentAt": "2026-08-07T23:00:00.008Z",
|
||||
"turnId": "turn_phase3_stable",
|
||||
"version": 1
|
||||
},
|
||||
"deliveryCount": 2,
|
||||
"logicalEffectCount": 1
|
||||
},
|
||||
{
|
||||
"sourceSeq": 9,
|
||||
"sourceEventId": "event_runner_phase3_stable_000009",
|
||||
"eventType": "run.terminal",
|
||||
"priority": 0,
|
||||
"envelope": {
|
||||
"envelopeId": "envelope_event_000009",
|
||||
"kind": "event",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"emittedAt": "2026-08-07T23:00:00.009Z",
|
||||
"eventType": "run.terminal",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"reportedWorkDisposition": "done",
|
||||
"runTerminalState": "succeeded",
|
||||
"schema": "paperclip.prp.terminal.v1",
|
||||
"turnTerminalState": "completed"
|
||||
},
|
||||
"priority": 0,
|
||||
"runId": "run_phase3_stable",
|
||||
"schema": "paperclip.prp.event.v1",
|
||||
"schemaVersion": 1,
|
||||
"sourceEventId": "event_runner_phase3_stable_000009",
|
||||
"sourceInstanceId": "runner_phase3_stable",
|
||||
"sourceKind": "runner",
|
||||
"sourceSeq": 9,
|
||||
"turnId": "turn_phase3_stable"
|
||||
},
|
||||
"protocol": "paperclip.runner",
|
||||
"runId": "run_phase3_stable",
|
||||
"runnerInstanceId": "runner_phase3_stable",
|
||||
"sentAt": "2026-08-07T23:00:00.009Z",
|
||||
"turnId": "turn_phase3_stable",
|
||||
"version": 1
|
||||
},
|
||||
"deliveryCount": 2,
|
||||
"logicalEffectCount": 1
|
||||
},
|
||||
{
|
||||
"sourceSeq": 10,
|
||||
"sourceEventId": "event_runner_phase3_stable_000010",
|
||||
"eventType": "runner.stopped",
|
||||
"priority": 0,
|
||||
"envelope": {
|
||||
"envelopeId": "envelope_event_000010",
|
||||
"kind": "event",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"emittedAt": "2026-08-07T23:00:00.010Z",
|
||||
"eventType": "runner.stopped",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"afterDurableFlush": true
|
||||
},
|
||||
"priority": 0,
|
||||
"runId": "run_phase3_stable",
|
||||
"schema": "paperclip.prp.event.v1",
|
||||
"schemaVersion": 1,
|
||||
"sourceEventId": "event_runner_phase3_stable_000010",
|
||||
"sourceInstanceId": "runner_phase3_stable",
|
||||
"sourceKind": "runner",
|
||||
"sourceSeq": 10,
|
||||
"turnId": "turn_phase3_stable"
|
||||
},
|
||||
"protocol": "paperclip.runner",
|
||||
"runId": "run_phase3_stable",
|
||||
"runnerInstanceId": "runner_phase3_stable",
|
||||
"sentAt": "2026-08-07T23:00:00.010Z",
|
||||
"turnId": "turn_phase3_stable",
|
||||
"version": 1
|
||||
},
|
||||
"deliveryCount": 1,
|
||||
"logicalEffectCount": 1
|
||||
}
|
||||
]
|
||||
},
|
||||
"runnerState": {
|
||||
"schema": "paperclip.runner.phase3.state.v1",
|
||||
"runnerInstanceId": "runner_phase3_stable",
|
||||
"environmentLeaseId": "environment_lease_phase3_stable",
|
||||
"runId": "run_phase3_stable",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"turnId": "turn_phase3_stable",
|
||||
"itemId": "item_phase3_stable",
|
||||
"lifecycle": "stopped",
|
||||
"nextSourceSeq": 11,
|
||||
"ackedSourceSeq": 10,
|
||||
"lastControllerCommandSeq": 4,
|
||||
"reconnectCount": 2,
|
||||
"maxOutboxBytes": 65536,
|
||||
"peakOutboxBytes": 5314,
|
||||
"outbox": [],
|
||||
"processedCommands": {
|
||||
"command_phase3_001": {
|
||||
"commandId": "command_phase3_001",
|
||||
"controllerSeq": 1,
|
||||
"commandDigest": "fnv1a64:c19dfbbf86a3dbb4",
|
||||
"status": "completed",
|
||||
"logicalEffectCount": 1,
|
||||
"result": {
|
||||
"commandId": "command_phase3_001",
|
||||
"controllerSeq": 1,
|
||||
"detail": "run prepared",
|
||||
"logicalEffectCount": 1,
|
||||
"status": "completed"
|
||||
}
|
||||
},
|
||||
"command_phase3_002": {
|
||||
"commandId": "command_phase3_002",
|
||||
"controllerSeq": 2,
|
||||
"commandDigest": "fnv1a64:b5198f3ce67ce88e",
|
||||
"status": "completed",
|
||||
"logicalEffectCount": 1,
|
||||
"result": {
|
||||
"commandId": "command_phase3_002",
|
||||
"controllerSeq": 2,
|
||||
"detail": "session bound",
|
||||
"logicalEffectCount": 1,
|
||||
"status": "completed"
|
||||
}
|
||||
},
|
||||
"command_phase3_003": {
|
||||
"commandId": "command_phase3_003",
|
||||
"controllerSeq": 3,
|
||||
"commandDigest": "fnv1a64:fb3b206fe67e1dc8",
|
||||
"status": "completed",
|
||||
"logicalEffectCount": 1,
|
||||
"result": {
|
||||
"commandId": "command_phase3_003",
|
||||
"controllerSeq": 3,
|
||||
"detail": "turn completed",
|
||||
"logicalEffectCount": 1,
|
||||
"status": "completed"
|
||||
}
|
||||
},
|
||||
"command_phase3_004": {
|
||||
"commandId": "command_phase3_004",
|
||||
"controllerSeq": 4,
|
||||
"commandDigest": "fnv1a64:d11bf8308f863bad",
|
||||
"status": "completed",
|
||||
"logicalEffectCount": 1,
|
||||
"result": {
|
||||
"commandId": "command_phase3_004",
|
||||
"controllerSeq": 4,
|
||||
"detail": "runner will stop after durable flush",
|
||||
"logicalEffectCount": 1,
|
||||
"status": "completed"
|
||||
}
|
||||
}
|
||||
},
|
||||
"diagnostics": [
|
||||
"WebSocket connection closed: failed to fill whole buffer",
|
||||
"connection lease expired; a fresh bootstrap may resume this state",
|
||||
"runner process restored the same durable identity"
|
||||
],
|
||||
"backpressure": false,
|
||||
"recoverableFailure": null,
|
||||
"unrecoverableOutcome": null,
|
||||
"harnessGeneration": 1,
|
||||
"stopAfterFlush": true
|
||||
},
|
||||
"commands": [
|
||||
{
|
||||
"schema": "paperclip.prp.command.v1",
|
||||
"commandId": "command_phase3_001",
|
||||
"controllerSeq": 1,
|
||||
"type": "run.prepare",
|
||||
"issuedAt": "2026-08-07T23:30:01.000Z",
|
||||
"payload": {
|
||||
"workspace": "phase-03-durable-fixture"
|
||||
},
|
||||
"status": "completed",
|
||||
"result": {
|
||||
"commandId": "command_phase3_001",
|
||||
"controllerSeq": 1,
|
||||
"detail": "run prepared",
|
||||
"logicalEffectCount": 1,
|
||||
"status": "completed"
|
||||
}
|
||||
},
|
||||
{
|
||||
"schema": "paperclip.prp.command.v1",
|
||||
"commandId": "command_phase3_002",
|
||||
"controllerSeq": 2,
|
||||
"type": "session.open",
|
||||
"issuedAt": "2026-08-07T23:30:02.000Z",
|
||||
"payload": {
|
||||
"reuse": "same_session"
|
||||
},
|
||||
"status": "completed",
|
||||
"result": {
|
||||
"commandId": "command_phase3_002",
|
||||
"controllerSeq": 2,
|
||||
"detail": "session bound",
|
||||
"logicalEffectCount": 1,
|
||||
"status": "completed"
|
||||
}
|
||||
},
|
||||
{
|
||||
"schema": "paperclip.prp.command.v1",
|
||||
"commandId": "command_phase3_003",
|
||||
"controllerSeq": 3,
|
||||
"type": "turn.start",
|
||||
"issuedAt": "2026-08-07T23:30:03.000Z",
|
||||
"payload": {
|
||||
"turnId": "turn_phase3_stable",
|
||||
"text": "Prove Phase 3 durable recovery."
|
||||
},
|
||||
"status": "completed",
|
||||
"result": {
|
||||
"commandId": "command_phase3_003",
|
||||
"controllerSeq": 3,
|
||||
"detail": "turn completed",
|
||||
"logicalEffectCount": 1,
|
||||
"status": "completed"
|
||||
}
|
||||
},
|
||||
{
|
||||
"schema": "paperclip.prp.command.v1",
|
||||
"commandId": "command_phase3_004",
|
||||
"controllerSeq": 4,
|
||||
"type": "runner.shutdown",
|
||||
"issuedAt": "2026-08-07T23:30:04.000Z",
|
||||
"payload": {},
|
||||
"status": "completed",
|
||||
"result": {
|
||||
"commandId": "command_phase3_004",
|
||||
"controllerSeq": 4,
|
||||
"detail": "runner will stop after durable flush",
|
||||
"logicalEffectCount": 1,
|
||||
"status": "completed"
|
||||
}
|
||||
}
|
||||
],
|
||||
"assertions": {
|
||||
"stableIdentity": true,
|
||||
"sourceCursorContinuous": true,
|
||||
"oneLogicalEffectPerAcceptedCommand": true,
|
||||
"noDuplicateLogicalEvents": true,
|
||||
"p0Preserved": true,
|
||||
"boundedStorage": true,
|
||||
"secretsRedacted": true
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,561 @@
|
||||
{
|
||||
"schema": "paperclip.runner.phase3.trace.v1",
|
||||
"diagnostics": {
|
||||
"schema": "paperclip.runner.phase3.diagnostics.v1",
|
||||
"fault": "lost-ack",
|
||||
"connection": {
|
||||
"state": "stopped",
|
||||
"connectionCount": 2,
|
||||
"reconnectCount": 1,
|
||||
"leaseId": "connection_lease_db423713-98d6-4a86-940b-ec2f0f6cd6e3",
|
||||
"leaseExpiresAt": "2026-08-07T23:36:38.759Z"
|
||||
},
|
||||
"identity": {
|
||||
"runnerInstanceId": "runner_phase3_stable",
|
||||
"environmentLeaseId": "environment_lease_phase3_stable",
|
||||
"runId": "run_phase3_stable",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"turnId": "turn_phase3_stable",
|
||||
"itemId": "item_phase3_stable"
|
||||
},
|
||||
"cursors": {
|
||||
"runnerAckedSourceSeq": 9,
|
||||
"runnerNextSourceSeq": 10,
|
||||
"coreAckedSourceSeq": 9,
|
||||
"highestCommittedSourceSeq": 9
|
||||
},
|
||||
"outbox": {
|
||||
"events": 0,
|
||||
"bytes": 0,
|
||||
"peakBytes": 6023,
|
||||
"maxBytes": 65536,
|
||||
"backpressure": false,
|
||||
"p0Committed": 5,
|
||||
"p0Lost": 0
|
||||
},
|
||||
"commands": {
|
||||
"issued": 4,
|
||||
"completed": 4,
|
||||
"rejected": 0,
|
||||
"logicalEffects": 4,
|
||||
"duplicateDeliveries": 1
|
||||
},
|
||||
"recovery": {
|
||||
"replayDeliveries": 9,
|
||||
"runnerRestarts": 0,
|
||||
"harnessRestarts": 0,
|
||||
"malformedFrames": 0,
|
||||
"freshBootstraps": 1,
|
||||
"outcome": "recovered",
|
||||
"reason": "lost_ack_completed"
|
||||
},
|
||||
"security": {
|
||||
"bootstrapTicketPersisted": false,
|
||||
"connectionLeaseTokenPersisted": false,
|
||||
"secretLeakCount": 0
|
||||
},
|
||||
"committedEvents": [
|
||||
{
|
||||
"sourceSeq": 1,
|
||||
"sourceEventId": "event_runner_phase3_stable_000001",
|
||||
"eventType": "workspace.ready",
|
||||
"priority": 1,
|
||||
"envelope": {
|
||||
"envelopeId": "envelope_event_000001",
|
||||
"kind": "event",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"emittedAt": "2026-08-07T23:00:00.001Z",
|
||||
"eventType": "workspace.ready",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"workspace": "phase-03-durable-fixture"
|
||||
},
|
||||
"priority": 1,
|
||||
"runId": "run_phase3_stable",
|
||||
"schema": "paperclip.prp.event.v1",
|
||||
"schemaVersion": 1,
|
||||
"sourceEventId": "event_runner_phase3_stable_000001",
|
||||
"sourceInstanceId": "runner_phase3_stable",
|
||||
"sourceKind": "runner",
|
||||
"sourceSeq": 1,
|
||||
"turnId": "turn_phase3_stable"
|
||||
},
|
||||
"protocol": "paperclip.runner",
|
||||
"runId": "run_phase3_stable",
|
||||
"runnerInstanceId": "runner_phase3_stable",
|
||||
"sentAt": "2026-08-07T23:00:00.001Z",
|
||||
"turnId": "turn_phase3_stable",
|
||||
"version": 1
|
||||
},
|
||||
"deliveryCount": 3,
|
||||
"logicalEffectCount": 1
|
||||
},
|
||||
{
|
||||
"sourceSeq": 2,
|
||||
"sourceEventId": "event_runner_phase3_stable_000002",
|
||||
"eventType": "session.started",
|
||||
"priority": 0,
|
||||
"envelope": {
|
||||
"envelopeId": "envelope_event_000002",
|
||||
"kind": "event",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"emittedAt": "2026-08-07T23:00:00.002Z",
|
||||
"eventType": "session.started",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"driverSessionId": "driver_phase3_fake",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"resumed": false
|
||||
},
|
||||
"priority": 0,
|
||||
"runId": "run_phase3_stable",
|
||||
"schema": "paperclip.prp.event.v1",
|
||||
"schemaVersion": 1,
|
||||
"sourceEventId": "event_runner_phase3_stable_000002",
|
||||
"sourceInstanceId": "runner_phase3_stable",
|
||||
"sourceKind": "runner",
|
||||
"sourceSeq": 2,
|
||||
"turnId": "turn_phase3_stable"
|
||||
},
|
||||
"protocol": "paperclip.runner",
|
||||
"runId": "run_phase3_stable",
|
||||
"runnerInstanceId": "runner_phase3_stable",
|
||||
"sentAt": "2026-08-07T23:00:00.002Z",
|
||||
"turnId": "turn_phase3_stable",
|
||||
"version": 1
|
||||
},
|
||||
"deliveryCount": 2,
|
||||
"logicalEffectCount": 1
|
||||
},
|
||||
{
|
||||
"sourceSeq": 3,
|
||||
"sourceEventId": "event_runner_phase3_stable_000003",
|
||||
"eventType": "turn.accepted",
|
||||
"priority": 0,
|
||||
"envelope": {
|
||||
"envelopeId": "envelope_event_000003",
|
||||
"kind": "event",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"emittedAt": "2026-08-07T23:00:00.003Z",
|
||||
"eventType": "turn.accepted",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"sameSession": true,
|
||||
"turnId": "turn_phase3_stable"
|
||||
},
|
||||
"priority": 0,
|
||||
"runId": "run_phase3_stable",
|
||||
"schema": "paperclip.prp.event.v1",
|
||||
"schemaVersion": 1,
|
||||
"sourceEventId": "event_runner_phase3_stable_000003",
|
||||
"sourceInstanceId": "runner_phase3_stable",
|
||||
"sourceKind": "runner",
|
||||
"sourceSeq": 3,
|
||||
"turnId": "turn_phase3_stable"
|
||||
},
|
||||
"protocol": "paperclip.runner",
|
||||
"runId": "run_phase3_stable",
|
||||
"runnerInstanceId": "runner_phase3_stable",
|
||||
"sentAt": "2026-08-07T23:00:00.003Z",
|
||||
"turnId": "turn_phase3_stable",
|
||||
"version": 1
|
||||
},
|
||||
"deliveryCount": 2,
|
||||
"logicalEffectCount": 1
|
||||
},
|
||||
{
|
||||
"sourceSeq": 4,
|
||||
"sourceEventId": "event_runner_phase3_stable_000004",
|
||||
"eventType": "item.started",
|
||||
"priority": 1,
|
||||
"envelope": {
|
||||
"envelopeId": "envelope_event_000004",
|
||||
"kind": "event",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"emittedAt": "2026-08-07T23:00:00.004Z",
|
||||
"eventType": "item.started",
|
||||
"itemId": "item_phase3_stable",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"kind": "assistant_message"
|
||||
},
|
||||
"priority": 1,
|
||||
"runId": "run_phase3_stable",
|
||||
"schema": "paperclip.prp.event.v1",
|
||||
"schemaVersion": 1,
|
||||
"sourceEventId": "event_runner_phase3_stable_000004",
|
||||
"sourceInstanceId": "runner_phase3_stable",
|
||||
"sourceKind": "runner",
|
||||
"sourceSeq": 4,
|
||||
"turnId": "turn_phase3_stable"
|
||||
},
|
||||
"protocol": "paperclip.runner",
|
||||
"runId": "run_phase3_stable",
|
||||
"runnerInstanceId": "runner_phase3_stable",
|
||||
"sentAt": "2026-08-07T23:00:00.004Z",
|
||||
"turnId": "turn_phase3_stable",
|
||||
"version": 1
|
||||
},
|
||||
"deliveryCount": 2,
|
||||
"logicalEffectCount": 1
|
||||
},
|
||||
{
|
||||
"sourceSeq": 5,
|
||||
"sourceEventId": "event_runner_phase3_stable_000005",
|
||||
"eventType": "item.delta",
|
||||
"priority": 2,
|
||||
"envelope": {
|
||||
"envelopeId": "envelope_event_000005",
|
||||
"kind": "event",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"emittedAt": "2026-08-07T23:00:00.005Z",
|
||||
"eventType": "item.delta",
|
||||
"itemId": "item_phase3_stable",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"text": "Prove Phase 3 durable recovery."
|
||||
},
|
||||
"priority": 2,
|
||||
"runId": "run_phase3_stable",
|
||||
"schema": "paperclip.prp.event.v1",
|
||||
"schemaVersion": 1,
|
||||
"sourceEventId": "event_runner_phase3_stable_000005",
|
||||
"sourceInstanceId": "runner_phase3_stable",
|
||||
"sourceKind": "runner",
|
||||
"sourceSeq": 5,
|
||||
"turnId": "turn_phase3_stable"
|
||||
},
|
||||
"protocol": "paperclip.runner",
|
||||
"runId": "run_phase3_stable",
|
||||
"runnerInstanceId": "runner_phase3_stable",
|
||||
"sentAt": "2026-08-07T23:00:00.005Z",
|
||||
"turnId": "turn_phase3_stable",
|
||||
"version": 1
|
||||
},
|
||||
"deliveryCount": 2,
|
||||
"logicalEffectCount": 1
|
||||
},
|
||||
{
|
||||
"sourceSeq": 6,
|
||||
"sourceEventId": "event_runner_phase3_stable_000006",
|
||||
"eventType": "item.completed",
|
||||
"priority": 1,
|
||||
"envelope": {
|
||||
"envelopeId": "envelope_event_000006",
|
||||
"kind": "event",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"emittedAt": "2026-08-07T23:00:00.006Z",
|
||||
"eventType": "item.completed",
|
||||
"itemId": "item_phase3_stable",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"text": "Durable recovery completed."
|
||||
},
|
||||
"priority": 1,
|
||||
"runId": "run_phase3_stable",
|
||||
"schema": "paperclip.prp.event.v1",
|
||||
"schemaVersion": 1,
|
||||
"sourceEventId": "event_runner_phase3_stable_000006",
|
||||
"sourceInstanceId": "runner_phase3_stable",
|
||||
"sourceKind": "runner",
|
||||
"sourceSeq": 6,
|
||||
"turnId": "turn_phase3_stable"
|
||||
},
|
||||
"protocol": "paperclip.runner",
|
||||
"runId": "run_phase3_stable",
|
||||
"runnerInstanceId": "runner_phase3_stable",
|
||||
"sentAt": "2026-08-07T23:00:00.006Z",
|
||||
"turnId": "turn_phase3_stable",
|
||||
"version": 1
|
||||
},
|
||||
"deliveryCount": 2,
|
||||
"logicalEffectCount": 1
|
||||
},
|
||||
{
|
||||
"sourceSeq": 7,
|
||||
"sourceEventId": "event_runner_phase3_stable_000007",
|
||||
"eventType": "run.result.proposed",
|
||||
"priority": 0,
|
||||
"envelope": {
|
||||
"envelopeId": "envelope_event_000007",
|
||||
"kind": "event",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"emittedAt": "2026-08-07T23:00:00.007Z",
|
||||
"eventType": "run.result.proposed",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"reportedWorkDisposition": "done",
|
||||
"schema": "paperclip.prp.result.v1",
|
||||
"status": "succeeded",
|
||||
"summary": "Phase 3 durable transport recovered without duplicate effects."
|
||||
},
|
||||
"priority": 0,
|
||||
"runId": "run_phase3_stable",
|
||||
"schema": "paperclip.prp.event.v1",
|
||||
"schemaVersion": 1,
|
||||
"sourceEventId": "event_runner_phase3_stable_000007",
|
||||
"sourceInstanceId": "runner_phase3_stable",
|
||||
"sourceKind": "runner",
|
||||
"sourceSeq": 7,
|
||||
"turnId": "turn_phase3_stable"
|
||||
},
|
||||
"protocol": "paperclip.runner",
|
||||
"runId": "run_phase3_stable",
|
||||
"runnerInstanceId": "runner_phase3_stable",
|
||||
"sentAt": "2026-08-07T23:00:00.007Z",
|
||||
"turnId": "turn_phase3_stable",
|
||||
"version": 1
|
||||
},
|
||||
"deliveryCount": 2,
|
||||
"logicalEffectCount": 1
|
||||
},
|
||||
{
|
||||
"sourceSeq": 8,
|
||||
"sourceEventId": "event_runner_phase3_stable_000008",
|
||||
"eventType": "run.terminal",
|
||||
"priority": 0,
|
||||
"envelope": {
|
||||
"envelopeId": "envelope_event_000008",
|
||||
"kind": "event",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"emittedAt": "2026-08-07T23:00:00.008Z",
|
||||
"eventType": "run.terminal",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"reportedWorkDisposition": "done",
|
||||
"runTerminalState": "succeeded",
|
||||
"schema": "paperclip.prp.terminal.v1",
|
||||
"turnTerminalState": "completed"
|
||||
},
|
||||
"priority": 0,
|
||||
"runId": "run_phase3_stable",
|
||||
"schema": "paperclip.prp.event.v1",
|
||||
"schemaVersion": 1,
|
||||
"sourceEventId": "event_runner_phase3_stable_000008",
|
||||
"sourceInstanceId": "runner_phase3_stable",
|
||||
"sourceKind": "runner",
|
||||
"sourceSeq": 8,
|
||||
"turnId": "turn_phase3_stable"
|
||||
},
|
||||
"protocol": "paperclip.runner",
|
||||
"runId": "run_phase3_stable",
|
||||
"runnerInstanceId": "runner_phase3_stable",
|
||||
"sentAt": "2026-08-07T23:00:00.008Z",
|
||||
"turnId": "turn_phase3_stable",
|
||||
"version": 1
|
||||
},
|
||||
"deliveryCount": 2,
|
||||
"logicalEffectCount": 1
|
||||
},
|
||||
{
|
||||
"sourceSeq": 9,
|
||||
"sourceEventId": "event_runner_phase3_stable_000009",
|
||||
"eventType": "runner.stopped",
|
||||
"priority": 0,
|
||||
"envelope": {
|
||||
"envelopeId": "envelope_event_000009",
|
||||
"kind": "event",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"emittedAt": "2026-08-07T23:00:00.009Z",
|
||||
"eventType": "runner.stopped",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"afterDurableFlush": true
|
||||
},
|
||||
"priority": 0,
|
||||
"runId": "run_phase3_stable",
|
||||
"schema": "paperclip.prp.event.v1",
|
||||
"schemaVersion": 1,
|
||||
"sourceEventId": "event_runner_phase3_stable_000009",
|
||||
"sourceInstanceId": "runner_phase3_stable",
|
||||
"sourceKind": "runner",
|
||||
"sourceSeq": 9,
|
||||
"turnId": "turn_phase3_stable"
|
||||
},
|
||||
"protocol": "paperclip.runner",
|
||||
"runId": "run_phase3_stable",
|
||||
"runnerInstanceId": "runner_phase3_stable",
|
||||
"sentAt": "2026-08-07T23:00:00.009Z",
|
||||
"turnId": "turn_phase3_stable",
|
||||
"version": 1
|
||||
},
|
||||
"deliveryCount": 1,
|
||||
"logicalEffectCount": 1
|
||||
}
|
||||
]
|
||||
},
|
||||
"runnerState": {
|
||||
"schema": "paperclip.runner.phase3.state.v1",
|
||||
"runnerInstanceId": "runner_phase3_stable",
|
||||
"environmentLeaseId": "environment_lease_phase3_stable",
|
||||
"runId": "run_phase3_stable",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"turnId": "turn_phase3_stable",
|
||||
"itemId": "item_phase3_stable",
|
||||
"lifecycle": "stopped",
|
||||
"nextSourceSeq": 10,
|
||||
"ackedSourceSeq": 9,
|
||||
"lastControllerCommandSeq": 4,
|
||||
"reconnectCount": 1,
|
||||
"maxOutboxBytes": 65536,
|
||||
"peakOutboxBytes": 6023,
|
||||
"outbox": [],
|
||||
"processedCommands": {
|
||||
"command_phase3_001": {
|
||||
"commandId": "command_phase3_001",
|
||||
"controllerSeq": 1,
|
||||
"commandDigest": "fnv1a64:c19dfbbf86a3dbb4",
|
||||
"status": "completed",
|
||||
"logicalEffectCount": 1,
|
||||
"result": {
|
||||
"commandId": "command_phase3_001",
|
||||
"controllerSeq": 1,
|
||||
"detail": "run prepared",
|
||||
"logicalEffectCount": 1,
|
||||
"status": "completed"
|
||||
}
|
||||
},
|
||||
"command_phase3_002": {
|
||||
"commandId": "command_phase3_002",
|
||||
"controllerSeq": 2,
|
||||
"commandDigest": "fnv1a64:b5198f3ce67ce88e",
|
||||
"status": "completed",
|
||||
"logicalEffectCount": 1,
|
||||
"result": {
|
||||
"commandId": "command_phase3_002",
|
||||
"controllerSeq": 2,
|
||||
"detail": "session bound",
|
||||
"logicalEffectCount": 1,
|
||||
"status": "completed"
|
||||
}
|
||||
},
|
||||
"command_phase3_003": {
|
||||
"commandId": "command_phase3_003",
|
||||
"controllerSeq": 3,
|
||||
"commandDigest": "fnv1a64:fb3b206fe67e1dc8",
|
||||
"status": "completed",
|
||||
"logicalEffectCount": 1,
|
||||
"result": {
|
||||
"commandId": "command_phase3_003",
|
||||
"controllerSeq": 3,
|
||||
"detail": "turn completed",
|
||||
"logicalEffectCount": 1,
|
||||
"status": "completed"
|
||||
}
|
||||
},
|
||||
"command_phase3_004": {
|
||||
"commandId": "command_phase3_004",
|
||||
"controllerSeq": 4,
|
||||
"commandDigest": "fnv1a64:d11bf8308f863bad",
|
||||
"status": "completed",
|
||||
"logicalEffectCount": 1,
|
||||
"result": {
|
||||
"commandId": "command_phase3_004",
|
||||
"controllerSeq": 4,
|
||||
"detail": "runner will stop after durable flush",
|
||||
"logicalEffectCount": 1,
|
||||
"status": "completed"
|
||||
}
|
||||
}
|
||||
},
|
||||
"diagnostics": [
|
||||
"WebSocket frame write failed: Broken pipe (os error 32)"
|
||||
],
|
||||
"backpressure": false,
|
||||
"recoverableFailure": null,
|
||||
"unrecoverableOutcome": null,
|
||||
"harnessGeneration": 1,
|
||||
"stopAfterFlush": true
|
||||
},
|
||||
"commands": [
|
||||
{
|
||||
"schema": "paperclip.prp.command.v1",
|
||||
"commandId": "command_phase3_001",
|
||||
"controllerSeq": 1,
|
||||
"type": "run.prepare",
|
||||
"issuedAt": "2026-08-07T23:30:01.000Z",
|
||||
"payload": {
|
||||
"workspace": "phase-03-durable-fixture"
|
||||
},
|
||||
"status": "completed",
|
||||
"result": {
|
||||
"commandId": "command_phase3_001",
|
||||
"controllerSeq": 1,
|
||||
"detail": "run prepared",
|
||||
"logicalEffectCount": 1,
|
||||
"status": "completed"
|
||||
}
|
||||
},
|
||||
{
|
||||
"schema": "paperclip.prp.command.v1",
|
||||
"commandId": "command_phase3_002",
|
||||
"controllerSeq": 2,
|
||||
"type": "session.open",
|
||||
"issuedAt": "2026-08-07T23:30:02.000Z",
|
||||
"payload": {
|
||||
"reuse": "same_session"
|
||||
},
|
||||
"status": "completed",
|
||||
"result": {
|
||||
"commandId": "command_phase3_002",
|
||||
"controllerSeq": 2,
|
||||
"detail": "session bound",
|
||||
"logicalEffectCount": 1,
|
||||
"status": "completed"
|
||||
}
|
||||
},
|
||||
{
|
||||
"schema": "paperclip.prp.command.v1",
|
||||
"commandId": "command_phase3_003",
|
||||
"controllerSeq": 3,
|
||||
"type": "turn.start",
|
||||
"issuedAt": "2026-08-07T23:30:03.000Z",
|
||||
"payload": {
|
||||
"turnId": "turn_phase3_stable",
|
||||
"text": "Prove Phase 3 durable recovery."
|
||||
},
|
||||
"status": "completed",
|
||||
"result": {
|
||||
"commandId": "command_phase3_003",
|
||||
"controllerSeq": 3,
|
||||
"detail": "turn completed",
|
||||
"logicalEffectCount": 1,
|
||||
"status": "completed"
|
||||
}
|
||||
},
|
||||
{
|
||||
"schema": "paperclip.prp.command.v1",
|
||||
"commandId": "command_phase3_004",
|
||||
"controllerSeq": 4,
|
||||
"type": "runner.shutdown",
|
||||
"issuedAt": "2026-08-07T23:30:04.000Z",
|
||||
"payload": {},
|
||||
"status": "completed",
|
||||
"result": {
|
||||
"commandId": "command_phase3_004",
|
||||
"controllerSeq": 4,
|
||||
"detail": "runner will stop after durable flush",
|
||||
"logicalEffectCount": 1,
|
||||
"status": "completed"
|
||||
}
|
||||
}
|
||||
],
|
||||
"assertions": {
|
||||
"stableIdentity": true,
|
||||
"sourceCursorContinuous": true,
|
||||
"oneLogicalEffectPerAcceptedCommand": true,
|
||||
"noDuplicateLogicalEvents": true,
|
||||
"p0Preserved": true,
|
||||
"boundedStorage": true,
|
||||
"secretsRedacted": true
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,561 @@
|
||||
{
|
||||
"schema": "paperclip.runner.phase3.trace.v1",
|
||||
"diagnostics": {
|
||||
"schema": "paperclip.runner.phase3.diagnostics.v1",
|
||||
"fault": "malformed-input",
|
||||
"connection": {
|
||||
"state": "stopped",
|
||||
"connectionCount": 2,
|
||||
"reconnectCount": 1,
|
||||
"leaseId": "connection_lease_51b9ac50-5fdc-4f68-a289-6e6e76711bbf",
|
||||
"leaseExpiresAt": "2026-08-07T23:36:39.957Z"
|
||||
},
|
||||
"identity": {
|
||||
"runnerInstanceId": "runner_phase3_stable",
|
||||
"environmentLeaseId": "environment_lease_phase3_stable",
|
||||
"runId": "run_phase3_stable",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"turnId": "turn_phase3_stable",
|
||||
"itemId": "item_phase3_stable"
|
||||
},
|
||||
"cursors": {
|
||||
"runnerAckedSourceSeq": 9,
|
||||
"runnerNextSourceSeq": 10,
|
||||
"coreAckedSourceSeq": 9,
|
||||
"highestCommittedSourceSeq": 9
|
||||
},
|
||||
"outbox": {
|
||||
"events": 0,
|
||||
"bytes": 0,
|
||||
"peakBytes": 5314,
|
||||
"maxBytes": 65536,
|
||||
"backpressure": false,
|
||||
"p0Committed": 5,
|
||||
"p0Lost": 0
|
||||
},
|
||||
"commands": {
|
||||
"issued": 4,
|
||||
"completed": 4,
|
||||
"rejected": 0,
|
||||
"logicalEffects": 4,
|
||||
"duplicateDeliveries": 0
|
||||
},
|
||||
"recovery": {
|
||||
"replayDeliveries": 8,
|
||||
"runnerRestarts": 0,
|
||||
"harnessRestarts": 0,
|
||||
"malformedFrames": 1,
|
||||
"freshBootstraps": 1,
|
||||
"outcome": "recovered",
|
||||
"reason": "malformed_input_completed"
|
||||
},
|
||||
"security": {
|
||||
"bootstrapTicketPersisted": false,
|
||||
"connectionLeaseTokenPersisted": false,
|
||||
"secretLeakCount": 0
|
||||
},
|
||||
"committedEvents": [
|
||||
{
|
||||
"sourceSeq": 1,
|
||||
"sourceEventId": "event_runner_phase3_stable_000001",
|
||||
"eventType": "workspace.ready",
|
||||
"priority": 1,
|
||||
"envelope": {
|
||||
"envelopeId": "envelope_event_000001",
|
||||
"kind": "event",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"emittedAt": "2026-08-07T23:00:00.001Z",
|
||||
"eventType": "workspace.ready",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"workspace": "phase-03-durable-fixture"
|
||||
},
|
||||
"priority": 1,
|
||||
"runId": "run_phase3_stable",
|
||||
"schema": "paperclip.prp.event.v1",
|
||||
"schemaVersion": 1,
|
||||
"sourceEventId": "event_runner_phase3_stable_000001",
|
||||
"sourceInstanceId": "runner_phase3_stable",
|
||||
"sourceKind": "runner",
|
||||
"sourceSeq": 1,
|
||||
"turnId": "turn_phase3_stable"
|
||||
},
|
||||
"protocol": "paperclip.runner",
|
||||
"runId": "run_phase3_stable",
|
||||
"runnerInstanceId": "runner_phase3_stable",
|
||||
"sentAt": "2026-08-07T23:00:00.001Z",
|
||||
"turnId": "turn_phase3_stable",
|
||||
"version": 1
|
||||
},
|
||||
"deliveryCount": 2,
|
||||
"logicalEffectCount": 1
|
||||
},
|
||||
{
|
||||
"sourceSeq": 2,
|
||||
"sourceEventId": "event_runner_phase3_stable_000002",
|
||||
"eventType": "session.started",
|
||||
"priority": 0,
|
||||
"envelope": {
|
||||
"envelopeId": "envelope_event_000002",
|
||||
"kind": "event",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"emittedAt": "2026-08-07T23:00:00.002Z",
|
||||
"eventType": "session.started",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"driverSessionId": "driver_phase3_fake",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"resumed": true
|
||||
},
|
||||
"priority": 0,
|
||||
"runId": "run_phase3_stable",
|
||||
"schema": "paperclip.prp.event.v1",
|
||||
"schemaVersion": 1,
|
||||
"sourceEventId": "event_runner_phase3_stable_000002",
|
||||
"sourceInstanceId": "runner_phase3_stable",
|
||||
"sourceKind": "runner",
|
||||
"sourceSeq": 2,
|
||||
"turnId": "turn_phase3_stable"
|
||||
},
|
||||
"protocol": "paperclip.runner",
|
||||
"runId": "run_phase3_stable",
|
||||
"runnerInstanceId": "runner_phase3_stable",
|
||||
"sentAt": "2026-08-07T23:00:00.002Z",
|
||||
"turnId": "turn_phase3_stable",
|
||||
"version": 1
|
||||
},
|
||||
"deliveryCount": 2,
|
||||
"logicalEffectCount": 1
|
||||
},
|
||||
{
|
||||
"sourceSeq": 3,
|
||||
"sourceEventId": "event_runner_phase3_stable_000003",
|
||||
"eventType": "turn.accepted",
|
||||
"priority": 0,
|
||||
"envelope": {
|
||||
"envelopeId": "envelope_event_000003",
|
||||
"kind": "event",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"emittedAt": "2026-08-07T23:00:00.003Z",
|
||||
"eventType": "turn.accepted",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"sameSession": true,
|
||||
"turnId": "turn_phase3_stable"
|
||||
},
|
||||
"priority": 0,
|
||||
"runId": "run_phase3_stable",
|
||||
"schema": "paperclip.prp.event.v1",
|
||||
"schemaVersion": 1,
|
||||
"sourceEventId": "event_runner_phase3_stable_000003",
|
||||
"sourceInstanceId": "runner_phase3_stable",
|
||||
"sourceKind": "runner",
|
||||
"sourceSeq": 3,
|
||||
"turnId": "turn_phase3_stable"
|
||||
},
|
||||
"protocol": "paperclip.runner",
|
||||
"runId": "run_phase3_stable",
|
||||
"runnerInstanceId": "runner_phase3_stable",
|
||||
"sentAt": "2026-08-07T23:00:00.003Z",
|
||||
"turnId": "turn_phase3_stable",
|
||||
"version": 1
|
||||
},
|
||||
"deliveryCount": 2,
|
||||
"logicalEffectCount": 1
|
||||
},
|
||||
{
|
||||
"sourceSeq": 4,
|
||||
"sourceEventId": "event_runner_phase3_stable_000004",
|
||||
"eventType": "item.started",
|
||||
"priority": 1,
|
||||
"envelope": {
|
||||
"envelopeId": "envelope_event_000004",
|
||||
"kind": "event",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"emittedAt": "2026-08-07T23:00:00.004Z",
|
||||
"eventType": "item.started",
|
||||
"itemId": "item_phase3_stable",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"kind": "assistant_message"
|
||||
},
|
||||
"priority": 1,
|
||||
"runId": "run_phase3_stable",
|
||||
"schema": "paperclip.prp.event.v1",
|
||||
"schemaVersion": 1,
|
||||
"sourceEventId": "event_runner_phase3_stable_000004",
|
||||
"sourceInstanceId": "runner_phase3_stable",
|
||||
"sourceKind": "runner",
|
||||
"sourceSeq": 4,
|
||||
"turnId": "turn_phase3_stable"
|
||||
},
|
||||
"protocol": "paperclip.runner",
|
||||
"runId": "run_phase3_stable",
|
||||
"runnerInstanceId": "runner_phase3_stable",
|
||||
"sentAt": "2026-08-07T23:00:00.004Z",
|
||||
"turnId": "turn_phase3_stable",
|
||||
"version": 1
|
||||
},
|
||||
"deliveryCount": 2,
|
||||
"logicalEffectCount": 1
|
||||
},
|
||||
{
|
||||
"sourceSeq": 5,
|
||||
"sourceEventId": "event_runner_phase3_stable_000005",
|
||||
"eventType": "item.delta",
|
||||
"priority": 2,
|
||||
"envelope": {
|
||||
"envelopeId": "envelope_event_000005",
|
||||
"kind": "event",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"emittedAt": "2026-08-07T23:00:00.005Z",
|
||||
"eventType": "item.delta",
|
||||
"itemId": "item_phase3_stable",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"text": "Prove Phase 3 durable recovery."
|
||||
},
|
||||
"priority": 2,
|
||||
"runId": "run_phase3_stable",
|
||||
"schema": "paperclip.prp.event.v1",
|
||||
"schemaVersion": 1,
|
||||
"sourceEventId": "event_runner_phase3_stable_000005",
|
||||
"sourceInstanceId": "runner_phase3_stable",
|
||||
"sourceKind": "runner",
|
||||
"sourceSeq": 5,
|
||||
"turnId": "turn_phase3_stable"
|
||||
},
|
||||
"protocol": "paperclip.runner",
|
||||
"runId": "run_phase3_stable",
|
||||
"runnerInstanceId": "runner_phase3_stable",
|
||||
"sentAt": "2026-08-07T23:00:00.005Z",
|
||||
"turnId": "turn_phase3_stable",
|
||||
"version": 1
|
||||
},
|
||||
"deliveryCount": 2,
|
||||
"logicalEffectCount": 1
|
||||
},
|
||||
{
|
||||
"sourceSeq": 6,
|
||||
"sourceEventId": "event_runner_phase3_stable_000006",
|
||||
"eventType": "item.completed",
|
||||
"priority": 1,
|
||||
"envelope": {
|
||||
"envelopeId": "envelope_event_000006",
|
||||
"kind": "event",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"emittedAt": "2026-08-07T23:00:00.006Z",
|
||||
"eventType": "item.completed",
|
||||
"itemId": "item_phase3_stable",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"text": "Durable recovery completed."
|
||||
},
|
||||
"priority": 1,
|
||||
"runId": "run_phase3_stable",
|
||||
"schema": "paperclip.prp.event.v1",
|
||||
"schemaVersion": 1,
|
||||
"sourceEventId": "event_runner_phase3_stable_000006",
|
||||
"sourceInstanceId": "runner_phase3_stable",
|
||||
"sourceKind": "runner",
|
||||
"sourceSeq": 6,
|
||||
"turnId": "turn_phase3_stable"
|
||||
},
|
||||
"protocol": "paperclip.runner",
|
||||
"runId": "run_phase3_stable",
|
||||
"runnerInstanceId": "runner_phase3_stable",
|
||||
"sentAt": "2026-08-07T23:00:00.006Z",
|
||||
"turnId": "turn_phase3_stable",
|
||||
"version": 1
|
||||
},
|
||||
"deliveryCount": 2,
|
||||
"logicalEffectCount": 1
|
||||
},
|
||||
{
|
||||
"sourceSeq": 7,
|
||||
"sourceEventId": "event_runner_phase3_stable_000007",
|
||||
"eventType": "run.result.proposed",
|
||||
"priority": 0,
|
||||
"envelope": {
|
||||
"envelopeId": "envelope_event_000007",
|
||||
"kind": "event",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"emittedAt": "2026-08-07T23:00:00.007Z",
|
||||
"eventType": "run.result.proposed",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"reportedWorkDisposition": "done",
|
||||
"schema": "paperclip.prp.result.v1",
|
||||
"status": "succeeded",
|
||||
"summary": "Phase 3 durable transport recovered without duplicate effects."
|
||||
},
|
||||
"priority": 0,
|
||||
"runId": "run_phase3_stable",
|
||||
"schema": "paperclip.prp.event.v1",
|
||||
"schemaVersion": 1,
|
||||
"sourceEventId": "event_runner_phase3_stable_000007",
|
||||
"sourceInstanceId": "runner_phase3_stable",
|
||||
"sourceKind": "runner",
|
||||
"sourceSeq": 7,
|
||||
"turnId": "turn_phase3_stable"
|
||||
},
|
||||
"protocol": "paperclip.runner",
|
||||
"runId": "run_phase3_stable",
|
||||
"runnerInstanceId": "runner_phase3_stable",
|
||||
"sentAt": "2026-08-07T23:00:00.007Z",
|
||||
"turnId": "turn_phase3_stable",
|
||||
"version": 1
|
||||
},
|
||||
"deliveryCount": 2,
|
||||
"logicalEffectCount": 1
|
||||
},
|
||||
{
|
||||
"sourceSeq": 8,
|
||||
"sourceEventId": "event_runner_phase3_stable_000008",
|
||||
"eventType": "run.terminal",
|
||||
"priority": 0,
|
||||
"envelope": {
|
||||
"envelopeId": "envelope_event_000008",
|
||||
"kind": "event",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"emittedAt": "2026-08-07T23:00:00.008Z",
|
||||
"eventType": "run.terminal",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"reportedWorkDisposition": "done",
|
||||
"runTerminalState": "succeeded",
|
||||
"schema": "paperclip.prp.terminal.v1",
|
||||
"turnTerminalState": "completed"
|
||||
},
|
||||
"priority": 0,
|
||||
"runId": "run_phase3_stable",
|
||||
"schema": "paperclip.prp.event.v1",
|
||||
"schemaVersion": 1,
|
||||
"sourceEventId": "event_runner_phase3_stable_000008",
|
||||
"sourceInstanceId": "runner_phase3_stable",
|
||||
"sourceKind": "runner",
|
||||
"sourceSeq": 8,
|
||||
"turnId": "turn_phase3_stable"
|
||||
},
|
||||
"protocol": "paperclip.runner",
|
||||
"runId": "run_phase3_stable",
|
||||
"runnerInstanceId": "runner_phase3_stable",
|
||||
"sentAt": "2026-08-07T23:00:00.008Z",
|
||||
"turnId": "turn_phase3_stable",
|
||||
"version": 1
|
||||
},
|
||||
"deliveryCount": 2,
|
||||
"logicalEffectCount": 1
|
||||
},
|
||||
{
|
||||
"sourceSeq": 9,
|
||||
"sourceEventId": "event_runner_phase3_stable_000009",
|
||||
"eventType": "runner.stopped",
|
||||
"priority": 0,
|
||||
"envelope": {
|
||||
"envelopeId": "envelope_event_000009",
|
||||
"kind": "event",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"emittedAt": "2026-08-07T23:00:00.009Z",
|
||||
"eventType": "runner.stopped",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"afterDurableFlush": true
|
||||
},
|
||||
"priority": 0,
|
||||
"runId": "run_phase3_stable",
|
||||
"schema": "paperclip.prp.event.v1",
|
||||
"schemaVersion": 1,
|
||||
"sourceEventId": "event_runner_phase3_stable_000009",
|
||||
"sourceInstanceId": "runner_phase3_stable",
|
||||
"sourceKind": "runner",
|
||||
"sourceSeq": 9,
|
||||
"turnId": "turn_phase3_stable"
|
||||
},
|
||||
"protocol": "paperclip.runner",
|
||||
"runId": "run_phase3_stable",
|
||||
"runnerInstanceId": "runner_phase3_stable",
|
||||
"sentAt": "2026-08-07T23:00:00.009Z",
|
||||
"turnId": "turn_phase3_stable",
|
||||
"version": 1
|
||||
},
|
||||
"deliveryCount": 1,
|
||||
"logicalEffectCount": 1
|
||||
}
|
||||
]
|
||||
},
|
||||
"runnerState": {
|
||||
"schema": "paperclip.runner.phase3.state.v1",
|
||||
"runnerInstanceId": "runner_phase3_stable",
|
||||
"environmentLeaseId": "environment_lease_phase3_stable",
|
||||
"runId": "run_phase3_stable",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"turnId": "turn_phase3_stable",
|
||||
"itemId": "item_phase3_stable",
|
||||
"lifecycle": "stopped",
|
||||
"nextSourceSeq": 10,
|
||||
"ackedSourceSeq": 9,
|
||||
"lastControllerCommandSeq": 4,
|
||||
"reconnectCount": 1,
|
||||
"maxOutboxBytes": 65536,
|
||||
"peakOutboxBytes": 5314,
|
||||
"outbox": [],
|
||||
"processedCommands": {
|
||||
"command_phase3_001": {
|
||||
"commandId": "command_phase3_001",
|
||||
"controllerSeq": 1,
|
||||
"commandDigest": "fnv1a64:c19dfbbf86a3dbb4",
|
||||
"status": "completed",
|
||||
"logicalEffectCount": 1,
|
||||
"result": {
|
||||
"commandId": "command_phase3_001",
|
||||
"controllerSeq": 1,
|
||||
"detail": "run prepared",
|
||||
"logicalEffectCount": 1,
|
||||
"status": "completed"
|
||||
}
|
||||
},
|
||||
"command_phase3_002": {
|
||||
"commandId": "command_phase3_002",
|
||||
"controllerSeq": 2,
|
||||
"commandDigest": "fnv1a64:b5198f3ce67ce88e",
|
||||
"status": "completed",
|
||||
"logicalEffectCount": 1,
|
||||
"result": {
|
||||
"commandId": "command_phase3_002",
|
||||
"controllerSeq": 2,
|
||||
"detail": "session bound",
|
||||
"logicalEffectCount": 1,
|
||||
"status": "completed"
|
||||
}
|
||||
},
|
||||
"command_phase3_003": {
|
||||
"commandId": "command_phase3_003",
|
||||
"controllerSeq": 3,
|
||||
"commandDigest": "fnv1a64:fb3b206fe67e1dc8",
|
||||
"status": "completed",
|
||||
"logicalEffectCount": 1,
|
||||
"result": {
|
||||
"commandId": "command_phase3_003",
|
||||
"controllerSeq": 3,
|
||||
"detail": "turn completed",
|
||||
"logicalEffectCount": 1,
|
||||
"status": "completed"
|
||||
}
|
||||
},
|
||||
"command_phase3_004": {
|
||||
"commandId": "command_phase3_004",
|
||||
"controllerSeq": 4,
|
||||
"commandDigest": "fnv1a64:d11bf8308f863bad",
|
||||
"status": "completed",
|
||||
"logicalEffectCount": 1,
|
||||
"result": {
|
||||
"commandId": "command_phase3_004",
|
||||
"controllerSeq": 4,
|
||||
"detail": "runner will stop after durable flush",
|
||||
"logicalEffectCount": 1,
|
||||
"status": "completed"
|
||||
}
|
||||
}
|
||||
},
|
||||
"diagnostics": [
|
||||
"malformed WebSocket JSON: EOF while parsing a value at line 1 column 8"
|
||||
],
|
||||
"backpressure": false,
|
||||
"recoverableFailure": null,
|
||||
"unrecoverableOutcome": null,
|
||||
"harnessGeneration": 1,
|
||||
"stopAfterFlush": true
|
||||
},
|
||||
"commands": [
|
||||
{
|
||||
"schema": "paperclip.prp.command.v1",
|
||||
"commandId": "command_phase3_001",
|
||||
"controllerSeq": 1,
|
||||
"type": "run.prepare",
|
||||
"issuedAt": "2026-08-07T23:30:01.000Z",
|
||||
"payload": {
|
||||
"workspace": "phase-03-durable-fixture"
|
||||
},
|
||||
"status": "completed",
|
||||
"result": {
|
||||
"commandId": "command_phase3_001",
|
||||
"controllerSeq": 1,
|
||||
"detail": "run prepared",
|
||||
"logicalEffectCount": 1,
|
||||
"status": "completed"
|
||||
}
|
||||
},
|
||||
{
|
||||
"schema": "paperclip.prp.command.v1",
|
||||
"commandId": "command_phase3_002",
|
||||
"controllerSeq": 2,
|
||||
"type": "session.open",
|
||||
"issuedAt": "2026-08-07T23:30:02.000Z",
|
||||
"payload": {
|
||||
"reuse": "same_session"
|
||||
},
|
||||
"status": "completed",
|
||||
"result": {
|
||||
"commandId": "command_phase3_002",
|
||||
"controllerSeq": 2,
|
||||
"detail": "session bound",
|
||||
"logicalEffectCount": 1,
|
||||
"status": "completed"
|
||||
}
|
||||
},
|
||||
{
|
||||
"schema": "paperclip.prp.command.v1",
|
||||
"commandId": "command_phase3_003",
|
||||
"controllerSeq": 3,
|
||||
"type": "turn.start",
|
||||
"issuedAt": "2026-08-07T23:30:03.000Z",
|
||||
"payload": {
|
||||
"turnId": "turn_phase3_stable",
|
||||
"text": "Prove Phase 3 durable recovery."
|
||||
},
|
||||
"status": "completed",
|
||||
"result": {
|
||||
"commandId": "command_phase3_003",
|
||||
"controllerSeq": 3,
|
||||
"detail": "turn completed",
|
||||
"logicalEffectCount": 1,
|
||||
"status": "completed"
|
||||
}
|
||||
},
|
||||
{
|
||||
"schema": "paperclip.prp.command.v1",
|
||||
"commandId": "command_phase3_004",
|
||||
"controllerSeq": 4,
|
||||
"type": "runner.shutdown",
|
||||
"issuedAt": "2026-08-07T23:30:04.000Z",
|
||||
"payload": {},
|
||||
"status": "completed",
|
||||
"result": {
|
||||
"commandId": "command_phase3_004",
|
||||
"controllerSeq": 4,
|
||||
"detail": "runner will stop after durable flush",
|
||||
"logicalEffectCount": 1,
|
||||
"status": "completed"
|
||||
}
|
||||
}
|
||||
],
|
||||
"assertions": {
|
||||
"stableIdentity": true,
|
||||
"sourceCursorContinuous": true,
|
||||
"oneLogicalEffectPerAcceptedCommand": true,
|
||||
"noDuplicateLogicalEvents": true,
|
||||
"p0Preserved": true,
|
||||
"boundedStorage": true,
|
||||
"secretsRedacted": true
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,559 @@
|
||||
{
|
||||
"schema": "paperclip.runner.phase3.trace.v1",
|
||||
"diagnostics": {
|
||||
"schema": "paperclip.runner.phase3.diagnostics.v1",
|
||||
"fault": "none",
|
||||
"connection": {
|
||||
"state": "stopped",
|
||||
"connectionCount": 1,
|
||||
"reconnectCount": 0,
|
||||
"leaseId": "connection_lease_469ad2f3-1655-434c-a12b-85718229ea67",
|
||||
"leaseExpiresAt": "2026-08-07T23:36:38.211Z"
|
||||
},
|
||||
"identity": {
|
||||
"runnerInstanceId": "runner_phase3_stable",
|
||||
"environmentLeaseId": "environment_lease_phase3_stable",
|
||||
"runId": "run_phase3_stable",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"turnId": "turn_phase3_stable",
|
||||
"itemId": "item_phase3_stable"
|
||||
},
|
||||
"cursors": {
|
||||
"runnerAckedSourceSeq": 9,
|
||||
"runnerNextSourceSeq": 10,
|
||||
"coreAckedSourceSeq": 9,
|
||||
"highestCommittedSourceSeq": 9
|
||||
},
|
||||
"outbox": {
|
||||
"events": 0,
|
||||
"bytes": 0,
|
||||
"peakBytes": 5315,
|
||||
"maxBytes": 65536,
|
||||
"backpressure": false,
|
||||
"p0Committed": 5,
|
||||
"p0Lost": 0
|
||||
},
|
||||
"commands": {
|
||||
"issued": 4,
|
||||
"completed": 4,
|
||||
"rejected": 0,
|
||||
"logicalEffects": 4,
|
||||
"duplicateDeliveries": 0
|
||||
},
|
||||
"recovery": {
|
||||
"replayDeliveries": 8,
|
||||
"runnerRestarts": 0,
|
||||
"harnessRestarts": 0,
|
||||
"malformedFrames": 0,
|
||||
"freshBootstraps": 1,
|
||||
"outcome": "recovered",
|
||||
"reason": "none_completed"
|
||||
},
|
||||
"security": {
|
||||
"bootstrapTicketPersisted": false,
|
||||
"connectionLeaseTokenPersisted": false,
|
||||
"secretLeakCount": 0
|
||||
},
|
||||
"committedEvents": [
|
||||
{
|
||||
"sourceSeq": 1,
|
||||
"sourceEventId": "event_runner_phase3_stable_000001",
|
||||
"eventType": "workspace.ready",
|
||||
"priority": 1,
|
||||
"envelope": {
|
||||
"envelopeId": "envelope_event_000001",
|
||||
"kind": "event",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"emittedAt": "2026-08-07T23:00:00.001Z",
|
||||
"eventType": "workspace.ready",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"workspace": "phase-03-durable-fixture"
|
||||
},
|
||||
"priority": 1,
|
||||
"runId": "run_phase3_stable",
|
||||
"schema": "paperclip.prp.event.v1",
|
||||
"schemaVersion": 1,
|
||||
"sourceEventId": "event_runner_phase3_stable_000001",
|
||||
"sourceInstanceId": "runner_phase3_stable",
|
||||
"sourceKind": "runner",
|
||||
"sourceSeq": 1,
|
||||
"turnId": "turn_phase3_stable"
|
||||
},
|
||||
"protocol": "paperclip.runner",
|
||||
"runId": "run_phase3_stable",
|
||||
"runnerInstanceId": "runner_phase3_stable",
|
||||
"sentAt": "2026-08-07T23:00:00.001Z",
|
||||
"turnId": "turn_phase3_stable",
|
||||
"version": 1
|
||||
},
|
||||
"deliveryCount": 2,
|
||||
"logicalEffectCount": 1
|
||||
},
|
||||
{
|
||||
"sourceSeq": 2,
|
||||
"sourceEventId": "event_runner_phase3_stable_000002",
|
||||
"eventType": "session.started",
|
||||
"priority": 0,
|
||||
"envelope": {
|
||||
"envelopeId": "envelope_event_000002",
|
||||
"kind": "event",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"emittedAt": "2026-08-07T23:00:00.002Z",
|
||||
"eventType": "session.started",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"driverSessionId": "driver_phase3_fake",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"resumed": false
|
||||
},
|
||||
"priority": 0,
|
||||
"runId": "run_phase3_stable",
|
||||
"schema": "paperclip.prp.event.v1",
|
||||
"schemaVersion": 1,
|
||||
"sourceEventId": "event_runner_phase3_stable_000002",
|
||||
"sourceInstanceId": "runner_phase3_stable",
|
||||
"sourceKind": "runner",
|
||||
"sourceSeq": 2,
|
||||
"turnId": "turn_phase3_stable"
|
||||
},
|
||||
"protocol": "paperclip.runner",
|
||||
"runId": "run_phase3_stable",
|
||||
"runnerInstanceId": "runner_phase3_stable",
|
||||
"sentAt": "2026-08-07T23:00:00.002Z",
|
||||
"turnId": "turn_phase3_stable",
|
||||
"version": 1
|
||||
},
|
||||
"deliveryCount": 2,
|
||||
"logicalEffectCount": 1
|
||||
},
|
||||
{
|
||||
"sourceSeq": 3,
|
||||
"sourceEventId": "event_runner_phase3_stable_000003",
|
||||
"eventType": "turn.accepted",
|
||||
"priority": 0,
|
||||
"envelope": {
|
||||
"envelopeId": "envelope_event_000003",
|
||||
"kind": "event",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"emittedAt": "2026-08-07T23:00:00.003Z",
|
||||
"eventType": "turn.accepted",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"sameSession": true,
|
||||
"turnId": "turn_phase3_stable"
|
||||
},
|
||||
"priority": 0,
|
||||
"runId": "run_phase3_stable",
|
||||
"schema": "paperclip.prp.event.v1",
|
||||
"schemaVersion": 1,
|
||||
"sourceEventId": "event_runner_phase3_stable_000003",
|
||||
"sourceInstanceId": "runner_phase3_stable",
|
||||
"sourceKind": "runner",
|
||||
"sourceSeq": 3,
|
||||
"turnId": "turn_phase3_stable"
|
||||
},
|
||||
"protocol": "paperclip.runner",
|
||||
"runId": "run_phase3_stable",
|
||||
"runnerInstanceId": "runner_phase3_stable",
|
||||
"sentAt": "2026-08-07T23:00:00.003Z",
|
||||
"turnId": "turn_phase3_stable",
|
||||
"version": 1
|
||||
},
|
||||
"deliveryCount": 2,
|
||||
"logicalEffectCount": 1
|
||||
},
|
||||
{
|
||||
"sourceSeq": 4,
|
||||
"sourceEventId": "event_runner_phase3_stable_000004",
|
||||
"eventType": "item.started",
|
||||
"priority": 1,
|
||||
"envelope": {
|
||||
"envelopeId": "envelope_event_000004",
|
||||
"kind": "event",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"emittedAt": "2026-08-07T23:00:00.004Z",
|
||||
"eventType": "item.started",
|
||||
"itemId": "item_phase3_stable",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"kind": "assistant_message"
|
||||
},
|
||||
"priority": 1,
|
||||
"runId": "run_phase3_stable",
|
||||
"schema": "paperclip.prp.event.v1",
|
||||
"schemaVersion": 1,
|
||||
"sourceEventId": "event_runner_phase3_stable_000004",
|
||||
"sourceInstanceId": "runner_phase3_stable",
|
||||
"sourceKind": "runner",
|
||||
"sourceSeq": 4,
|
||||
"turnId": "turn_phase3_stable"
|
||||
},
|
||||
"protocol": "paperclip.runner",
|
||||
"runId": "run_phase3_stable",
|
||||
"runnerInstanceId": "runner_phase3_stable",
|
||||
"sentAt": "2026-08-07T23:00:00.004Z",
|
||||
"turnId": "turn_phase3_stable",
|
||||
"version": 1
|
||||
},
|
||||
"deliveryCount": 2,
|
||||
"logicalEffectCount": 1
|
||||
},
|
||||
{
|
||||
"sourceSeq": 5,
|
||||
"sourceEventId": "event_runner_phase3_stable_000005",
|
||||
"eventType": "item.delta",
|
||||
"priority": 2,
|
||||
"envelope": {
|
||||
"envelopeId": "envelope_event_000005",
|
||||
"kind": "event",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"emittedAt": "2026-08-07T23:00:00.005Z",
|
||||
"eventType": "item.delta",
|
||||
"itemId": "item_phase3_stable",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"text": "Prove Phase 3 durable recovery."
|
||||
},
|
||||
"priority": 2,
|
||||
"runId": "run_phase3_stable",
|
||||
"schema": "paperclip.prp.event.v1",
|
||||
"schemaVersion": 1,
|
||||
"sourceEventId": "event_runner_phase3_stable_000005",
|
||||
"sourceInstanceId": "runner_phase3_stable",
|
||||
"sourceKind": "runner",
|
||||
"sourceSeq": 5,
|
||||
"turnId": "turn_phase3_stable"
|
||||
},
|
||||
"protocol": "paperclip.runner",
|
||||
"runId": "run_phase3_stable",
|
||||
"runnerInstanceId": "runner_phase3_stable",
|
||||
"sentAt": "2026-08-07T23:00:00.005Z",
|
||||
"turnId": "turn_phase3_stable",
|
||||
"version": 1
|
||||
},
|
||||
"deliveryCount": 2,
|
||||
"logicalEffectCount": 1
|
||||
},
|
||||
{
|
||||
"sourceSeq": 6,
|
||||
"sourceEventId": "event_runner_phase3_stable_000006",
|
||||
"eventType": "item.completed",
|
||||
"priority": 1,
|
||||
"envelope": {
|
||||
"envelopeId": "envelope_event_000006",
|
||||
"kind": "event",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"emittedAt": "2026-08-07T23:00:00.006Z",
|
||||
"eventType": "item.completed",
|
||||
"itemId": "item_phase3_stable",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"text": "Durable recovery completed."
|
||||
},
|
||||
"priority": 1,
|
||||
"runId": "run_phase3_stable",
|
||||
"schema": "paperclip.prp.event.v1",
|
||||
"schemaVersion": 1,
|
||||
"sourceEventId": "event_runner_phase3_stable_000006",
|
||||
"sourceInstanceId": "runner_phase3_stable",
|
||||
"sourceKind": "runner",
|
||||
"sourceSeq": 6,
|
||||
"turnId": "turn_phase3_stable"
|
||||
},
|
||||
"protocol": "paperclip.runner",
|
||||
"runId": "run_phase3_stable",
|
||||
"runnerInstanceId": "runner_phase3_stable",
|
||||
"sentAt": "2026-08-07T23:00:00.006Z",
|
||||
"turnId": "turn_phase3_stable",
|
||||
"version": 1
|
||||
},
|
||||
"deliveryCount": 2,
|
||||
"logicalEffectCount": 1
|
||||
},
|
||||
{
|
||||
"sourceSeq": 7,
|
||||
"sourceEventId": "event_runner_phase3_stable_000007",
|
||||
"eventType": "run.result.proposed",
|
||||
"priority": 0,
|
||||
"envelope": {
|
||||
"envelopeId": "envelope_event_000007",
|
||||
"kind": "event",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"emittedAt": "2026-08-07T23:00:00.007Z",
|
||||
"eventType": "run.result.proposed",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"reportedWorkDisposition": "done",
|
||||
"schema": "paperclip.prp.result.v1",
|
||||
"status": "succeeded",
|
||||
"summary": "Phase 3 durable transport recovered without duplicate effects."
|
||||
},
|
||||
"priority": 0,
|
||||
"runId": "run_phase3_stable",
|
||||
"schema": "paperclip.prp.event.v1",
|
||||
"schemaVersion": 1,
|
||||
"sourceEventId": "event_runner_phase3_stable_000007",
|
||||
"sourceInstanceId": "runner_phase3_stable",
|
||||
"sourceKind": "runner",
|
||||
"sourceSeq": 7,
|
||||
"turnId": "turn_phase3_stable"
|
||||
},
|
||||
"protocol": "paperclip.runner",
|
||||
"runId": "run_phase3_stable",
|
||||
"runnerInstanceId": "runner_phase3_stable",
|
||||
"sentAt": "2026-08-07T23:00:00.007Z",
|
||||
"turnId": "turn_phase3_stable",
|
||||
"version": 1
|
||||
},
|
||||
"deliveryCount": 2,
|
||||
"logicalEffectCount": 1
|
||||
},
|
||||
{
|
||||
"sourceSeq": 8,
|
||||
"sourceEventId": "event_runner_phase3_stable_000008",
|
||||
"eventType": "run.terminal",
|
||||
"priority": 0,
|
||||
"envelope": {
|
||||
"envelopeId": "envelope_event_000008",
|
||||
"kind": "event",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"emittedAt": "2026-08-07T23:00:00.008Z",
|
||||
"eventType": "run.terminal",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"reportedWorkDisposition": "done",
|
||||
"runTerminalState": "succeeded",
|
||||
"schema": "paperclip.prp.terminal.v1",
|
||||
"turnTerminalState": "completed"
|
||||
},
|
||||
"priority": 0,
|
||||
"runId": "run_phase3_stable",
|
||||
"schema": "paperclip.prp.event.v1",
|
||||
"schemaVersion": 1,
|
||||
"sourceEventId": "event_runner_phase3_stable_000008",
|
||||
"sourceInstanceId": "runner_phase3_stable",
|
||||
"sourceKind": "runner",
|
||||
"sourceSeq": 8,
|
||||
"turnId": "turn_phase3_stable"
|
||||
},
|
||||
"protocol": "paperclip.runner",
|
||||
"runId": "run_phase3_stable",
|
||||
"runnerInstanceId": "runner_phase3_stable",
|
||||
"sentAt": "2026-08-07T23:00:00.008Z",
|
||||
"turnId": "turn_phase3_stable",
|
||||
"version": 1
|
||||
},
|
||||
"deliveryCount": 2,
|
||||
"logicalEffectCount": 1
|
||||
},
|
||||
{
|
||||
"sourceSeq": 9,
|
||||
"sourceEventId": "event_runner_phase3_stable_000009",
|
||||
"eventType": "runner.stopped",
|
||||
"priority": 0,
|
||||
"envelope": {
|
||||
"envelopeId": "envelope_event_000009",
|
||||
"kind": "event",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"emittedAt": "2026-08-07T23:00:00.009Z",
|
||||
"eventType": "runner.stopped",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"afterDurableFlush": true
|
||||
},
|
||||
"priority": 0,
|
||||
"runId": "run_phase3_stable",
|
||||
"schema": "paperclip.prp.event.v1",
|
||||
"schemaVersion": 1,
|
||||
"sourceEventId": "event_runner_phase3_stable_000009",
|
||||
"sourceInstanceId": "runner_phase3_stable",
|
||||
"sourceKind": "runner",
|
||||
"sourceSeq": 9,
|
||||
"turnId": "turn_phase3_stable"
|
||||
},
|
||||
"protocol": "paperclip.runner",
|
||||
"runId": "run_phase3_stable",
|
||||
"runnerInstanceId": "runner_phase3_stable",
|
||||
"sentAt": "2026-08-07T23:00:00.009Z",
|
||||
"turnId": "turn_phase3_stable",
|
||||
"version": 1
|
||||
},
|
||||
"deliveryCount": 1,
|
||||
"logicalEffectCount": 1
|
||||
}
|
||||
]
|
||||
},
|
||||
"runnerState": {
|
||||
"schema": "paperclip.runner.phase3.state.v1",
|
||||
"runnerInstanceId": "runner_phase3_stable",
|
||||
"environmentLeaseId": "environment_lease_phase3_stable",
|
||||
"runId": "run_phase3_stable",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"turnId": "turn_phase3_stable",
|
||||
"itemId": "item_phase3_stable",
|
||||
"lifecycle": "stopped",
|
||||
"nextSourceSeq": 10,
|
||||
"ackedSourceSeq": 9,
|
||||
"lastControllerCommandSeq": 4,
|
||||
"reconnectCount": 0,
|
||||
"maxOutboxBytes": 65536,
|
||||
"peakOutboxBytes": 5315,
|
||||
"outbox": [],
|
||||
"processedCommands": {
|
||||
"command_phase3_001": {
|
||||
"commandId": "command_phase3_001",
|
||||
"controllerSeq": 1,
|
||||
"commandDigest": "fnv1a64:c19dfbbf86a3dbb4",
|
||||
"status": "completed",
|
||||
"logicalEffectCount": 1,
|
||||
"result": {
|
||||
"commandId": "command_phase3_001",
|
||||
"controllerSeq": 1,
|
||||
"detail": "run prepared",
|
||||
"logicalEffectCount": 1,
|
||||
"status": "completed"
|
||||
}
|
||||
},
|
||||
"command_phase3_002": {
|
||||
"commandId": "command_phase3_002",
|
||||
"controllerSeq": 2,
|
||||
"commandDigest": "fnv1a64:b5198f3ce67ce88e",
|
||||
"status": "completed",
|
||||
"logicalEffectCount": 1,
|
||||
"result": {
|
||||
"commandId": "command_phase3_002",
|
||||
"controllerSeq": 2,
|
||||
"detail": "session bound",
|
||||
"logicalEffectCount": 1,
|
||||
"status": "completed"
|
||||
}
|
||||
},
|
||||
"command_phase3_003": {
|
||||
"commandId": "command_phase3_003",
|
||||
"controllerSeq": 3,
|
||||
"commandDigest": "fnv1a64:fb3b206fe67e1dc8",
|
||||
"status": "completed",
|
||||
"logicalEffectCount": 1,
|
||||
"result": {
|
||||
"commandId": "command_phase3_003",
|
||||
"controllerSeq": 3,
|
||||
"detail": "turn completed",
|
||||
"logicalEffectCount": 1,
|
||||
"status": "completed"
|
||||
}
|
||||
},
|
||||
"command_phase3_004": {
|
||||
"commandId": "command_phase3_004",
|
||||
"controllerSeq": 4,
|
||||
"commandDigest": "fnv1a64:d11bf8308f863bad",
|
||||
"status": "completed",
|
||||
"logicalEffectCount": 1,
|
||||
"result": {
|
||||
"commandId": "command_phase3_004",
|
||||
"controllerSeq": 4,
|
||||
"detail": "runner will stop after durable flush",
|
||||
"logicalEffectCount": 1,
|
||||
"status": "completed"
|
||||
}
|
||||
}
|
||||
},
|
||||
"diagnostics": [],
|
||||
"backpressure": false,
|
||||
"recoverableFailure": null,
|
||||
"unrecoverableOutcome": null,
|
||||
"harnessGeneration": 1,
|
||||
"stopAfterFlush": true
|
||||
},
|
||||
"commands": [
|
||||
{
|
||||
"schema": "paperclip.prp.command.v1",
|
||||
"commandId": "command_phase3_001",
|
||||
"controllerSeq": 1,
|
||||
"type": "run.prepare",
|
||||
"issuedAt": "2026-08-07T23:30:01.000Z",
|
||||
"payload": {
|
||||
"workspace": "phase-03-durable-fixture"
|
||||
},
|
||||
"status": "completed",
|
||||
"result": {
|
||||
"commandId": "command_phase3_001",
|
||||
"controllerSeq": 1,
|
||||
"detail": "run prepared",
|
||||
"logicalEffectCount": 1,
|
||||
"status": "completed"
|
||||
}
|
||||
},
|
||||
{
|
||||
"schema": "paperclip.prp.command.v1",
|
||||
"commandId": "command_phase3_002",
|
||||
"controllerSeq": 2,
|
||||
"type": "session.open",
|
||||
"issuedAt": "2026-08-07T23:30:02.000Z",
|
||||
"payload": {
|
||||
"reuse": "same_session"
|
||||
},
|
||||
"status": "completed",
|
||||
"result": {
|
||||
"commandId": "command_phase3_002",
|
||||
"controllerSeq": 2,
|
||||
"detail": "session bound",
|
||||
"logicalEffectCount": 1,
|
||||
"status": "completed"
|
||||
}
|
||||
},
|
||||
{
|
||||
"schema": "paperclip.prp.command.v1",
|
||||
"commandId": "command_phase3_003",
|
||||
"controllerSeq": 3,
|
||||
"type": "turn.start",
|
||||
"issuedAt": "2026-08-07T23:30:03.000Z",
|
||||
"payload": {
|
||||
"turnId": "turn_phase3_stable",
|
||||
"text": "Prove Phase 3 durable recovery."
|
||||
},
|
||||
"status": "completed",
|
||||
"result": {
|
||||
"commandId": "command_phase3_003",
|
||||
"controllerSeq": 3,
|
||||
"detail": "turn completed",
|
||||
"logicalEffectCount": 1,
|
||||
"status": "completed"
|
||||
}
|
||||
},
|
||||
{
|
||||
"schema": "paperclip.prp.command.v1",
|
||||
"commandId": "command_phase3_004",
|
||||
"controllerSeq": 4,
|
||||
"type": "runner.shutdown",
|
||||
"issuedAt": "2026-08-07T23:30:04.000Z",
|
||||
"payload": {},
|
||||
"status": "completed",
|
||||
"result": {
|
||||
"commandId": "command_phase3_004",
|
||||
"controllerSeq": 4,
|
||||
"detail": "runner will stop after durable flush",
|
||||
"logicalEffectCount": 1,
|
||||
"status": "completed"
|
||||
}
|
||||
}
|
||||
],
|
||||
"assertions": {
|
||||
"stableIdentity": true,
|
||||
"sourceCursorContinuous": true,
|
||||
"oneLogicalEffectPerAcceptedCommand": true,
|
||||
"noDuplicateLogicalEvents": true,
|
||||
"p0Preserved": true,
|
||||
"boundedStorage": true,
|
||||
"secretsRedacted": true
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,528 @@
|
||||
{
|
||||
"schema": "paperclip.runner.phase3.trace.v1",
|
||||
"diagnostics": {
|
||||
"schema": "paperclip.runner.phase3.diagnostics.v1",
|
||||
"fault": "revoke",
|
||||
"connection": {
|
||||
"state": "revoked",
|
||||
"connectionCount": 1,
|
||||
"reconnectCount": 0,
|
||||
"leaseId": "connection_lease_8fe123ed-6a53-42e1-bdc7-315a93568cbd",
|
||||
"leaseExpiresAt": "2026-08-07T23:36:41.005Z"
|
||||
},
|
||||
"identity": {
|
||||
"runnerInstanceId": "runner_phase3_stable",
|
||||
"environmentLeaseId": "environment_lease_phase3_stable",
|
||||
"runId": "run_phase3_stable",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"turnId": "turn_phase3_stable",
|
||||
"itemId": "item_phase3_stable"
|
||||
},
|
||||
"cursors": {
|
||||
"runnerAckedSourceSeq": 8,
|
||||
"runnerNextSourceSeq": 9,
|
||||
"coreAckedSourceSeq": 8,
|
||||
"highestCommittedSourceSeq": 8
|
||||
},
|
||||
"outbox": {
|
||||
"events": 0,
|
||||
"bytes": 0,
|
||||
"peakBytes": 5315,
|
||||
"maxBytes": 65536,
|
||||
"backpressure": false,
|
||||
"p0Committed": 4,
|
||||
"p0Lost": 0
|
||||
},
|
||||
"commands": {
|
||||
"issued": 4,
|
||||
"completed": 3,
|
||||
"rejected": 1,
|
||||
"logicalEffects": 3,
|
||||
"duplicateDeliveries": 0
|
||||
},
|
||||
"recovery": {
|
||||
"replayDeliveries": 4,
|
||||
"runnerRestarts": 0,
|
||||
"harnessRestarts": 0,
|
||||
"malformedFrames": 0,
|
||||
"freshBootstraps": 1,
|
||||
"outcome": "revoked",
|
||||
"reason": "revoke_completed"
|
||||
},
|
||||
"security": {
|
||||
"bootstrapTicketPersisted": false,
|
||||
"connectionLeaseTokenPersisted": false,
|
||||
"secretLeakCount": 0
|
||||
},
|
||||
"committedEvents": [
|
||||
{
|
||||
"sourceSeq": 1,
|
||||
"sourceEventId": "event_runner_phase3_stable_000001",
|
||||
"eventType": "workspace.ready",
|
||||
"priority": 1,
|
||||
"envelope": {
|
||||
"envelopeId": "envelope_event_000001",
|
||||
"kind": "event",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"emittedAt": "2026-08-07T23:00:00.001Z",
|
||||
"eventType": "workspace.ready",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"workspace": "phase-03-durable-fixture"
|
||||
},
|
||||
"priority": 1,
|
||||
"runId": "run_phase3_stable",
|
||||
"schema": "paperclip.prp.event.v1",
|
||||
"schemaVersion": 1,
|
||||
"sourceEventId": "event_runner_phase3_stable_000001",
|
||||
"sourceInstanceId": "runner_phase3_stable",
|
||||
"sourceKind": "runner",
|
||||
"sourceSeq": 1,
|
||||
"turnId": "turn_phase3_stable"
|
||||
},
|
||||
"protocol": "paperclip.runner",
|
||||
"runId": "run_phase3_stable",
|
||||
"runnerInstanceId": "runner_phase3_stable",
|
||||
"sentAt": "2026-08-07T23:00:00.001Z",
|
||||
"turnId": "turn_phase3_stable",
|
||||
"version": 1
|
||||
},
|
||||
"deliveryCount": 2,
|
||||
"logicalEffectCount": 1
|
||||
},
|
||||
{
|
||||
"sourceSeq": 2,
|
||||
"sourceEventId": "event_runner_phase3_stable_000002",
|
||||
"eventType": "session.started",
|
||||
"priority": 0,
|
||||
"envelope": {
|
||||
"envelopeId": "envelope_event_000002",
|
||||
"kind": "event",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"emittedAt": "2026-08-07T23:00:00.002Z",
|
||||
"eventType": "session.started",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"driverSessionId": "driver_phase3_fake",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"resumed": false
|
||||
},
|
||||
"priority": 0,
|
||||
"runId": "run_phase3_stable",
|
||||
"schema": "paperclip.prp.event.v1",
|
||||
"schemaVersion": 1,
|
||||
"sourceEventId": "event_runner_phase3_stable_000002",
|
||||
"sourceInstanceId": "runner_phase3_stable",
|
||||
"sourceKind": "runner",
|
||||
"sourceSeq": 2,
|
||||
"turnId": "turn_phase3_stable"
|
||||
},
|
||||
"protocol": "paperclip.runner",
|
||||
"runId": "run_phase3_stable",
|
||||
"runnerInstanceId": "runner_phase3_stable",
|
||||
"sentAt": "2026-08-07T23:00:00.002Z",
|
||||
"turnId": "turn_phase3_stable",
|
||||
"version": 1
|
||||
},
|
||||
"deliveryCount": 2,
|
||||
"logicalEffectCount": 1
|
||||
},
|
||||
{
|
||||
"sourceSeq": 3,
|
||||
"sourceEventId": "event_runner_phase3_stable_000003",
|
||||
"eventType": "turn.accepted",
|
||||
"priority": 0,
|
||||
"envelope": {
|
||||
"envelopeId": "envelope_event_000003",
|
||||
"kind": "event",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"emittedAt": "2026-08-07T23:00:00.003Z",
|
||||
"eventType": "turn.accepted",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"sameSession": true,
|
||||
"turnId": "turn_phase3_stable"
|
||||
},
|
||||
"priority": 0,
|
||||
"runId": "run_phase3_stable",
|
||||
"schema": "paperclip.prp.event.v1",
|
||||
"schemaVersion": 1,
|
||||
"sourceEventId": "event_runner_phase3_stable_000003",
|
||||
"sourceInstanceId": "runner_phase3_stable",
|
||||
"sourceKind": "runner",
|
||||
"sourceSeq": 3,
|
||||
"turnId": "turn_phase3_stable"
|
||||
},
|
||||
"protocol": "paperclip.runner",
|
||||
"runId": "run_phase3_stable",
|
||||
"runnerInstanceId": "runner_phase3_stable",
|
||||
"sentAt": "2026-08-07T23:00:00.003Z",
|
||||
"turnId": "turn_phase3_stable",
|
||||
"version": 1
|
||||
},
|
||||
"deliveryCount": 1,
|
||||
"logicalEffectCount": 1
|
||||
},
|
||||
{
|
||||
"sourceSeq": 4,
|
||||
"sourceEventId": "event_runner_phase3_stable_000004",
|
||||
"eventType": "item.started",
|
||||
"priority": 1,
|
||||
"envelope": {
|
||||
"envelopeId": "envelope_event_000004",
|
||||
"kind": "event",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"emittedAt": "2026-08-07T23:00:00.004Z",
|
||||
"eventType": "item.started",
|
||||
"itemId": "item_phase3_stable",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"kind": "assistant_message"
|
||||
},
|
||||
"priority": 1,
|
||||
"runId": "run_phase3_stable",
|
||||
"schema": "paperclip.prp.event.v1",
|
||||
"schemaVersion": 1,
|
||||
"sourceEventId": "event_runner_phase3_stable_000004",
|
||||
"sourceInstanceId": "runner_phase3_stable",
|
||||
"sourceKind": "runner",
|
||||
"sourceSeq": 4,
|
||||
"turnId": "turn_phase3_stable"
|
||||
},
|
||||
"protocol": "paperclip.runner",
|
||||
"runId": "run_phase3_stable",
|
||||
"runnerInstanceId": "runner_phase3_stable",
|
||||
"sentAt": "2026-08-07T23:00:00.004Z",
|
||||
"turnId": "turn_phase3_stable",
|
||||
"version": 1
|
||||
},
|
||||
"deliveryCount": 1,
|
||||
"logicalEffectCount": 1
|
||||
},
|
||||
{
|
||||
"sourceSeq": 5,
|
||||
"sourceEventId": "event_runner_phase3_stable_000005",
|
||||
"eventType": "item.delta",
|
||||
"priority": 2,
|
||||
"envelope": {
|
||||
"envelopeId": "envelope_event_000005",
|
||||
"kind": "event",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"emittedAt": "2026-08-07T23:00:00.005Z",
|
||||
"eventType": "item.delta",
|
||||
"itemId": "item_phase3_stable",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"text": "Prove Phase 3 durable recovery."
|
||||
},
|
||||
"priority": 2,
|
||||
"runId": "run_phase3_stable",
|
||||
"schema": "paperclip.prp.event.v1",
|
||||
"schemaVersion": 1,
|
||||
"sourceEventId": "event_runner_phase3_stable_000005",
|
||||
"sourceInstanceId": "runner_phase3_stable",
|
||||
"sourceKind": "runner",
|
||||
"sourceSeq": 5,
|
||||
"turnId": "turn_phase3_stable"
|
||||
},
|
||||
"protocol": "paperclip.runner",
|
||||
"runId": "run_phase3_stable",
|
||||
"runnerInstanceId": "runner_phase3_stable",
|
||||
"sentAt": "2026-08-07T23:00:00.005Z",
|
||||
"turnId": "turn_phase3_stable",
|
||||
"version": 1
|
||||
},
|
||||
"deliveryCount": 1,
|
||||
"logicalEffectCount": 1
|
||||
},
|
||||
{
|
||||
"sourceSeq": 6,
|
||||
"sourceEventId": "event_runner_phase3_stable_000006",
|
||||
"eventType": "item.completed",
|
||||
"priority": 1,
|
||||
"envelope": {
|
||||
"envelopeId": "envelope_event_000006",
|
||||
"kind": "event",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"emittedAt": "2026-08-07T23:00:00.006Z",
|
||||
"eventType": "item.completed",
|
||||
"itemId": "item_phase3_stable",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"text": "Durable recovery completed."
|
||||
},
|
||||
"priority": 1,
|
||||
"runId": "run_phase3_stable",
|
||||
"schema": "paperclip.prp.event.v1",
|
||||
"schemaVersion": 1,
|
||||
"sourceEventId": "event_runner_phase3_stable_000006",
|
||||
"sourceInstanceId": "runner_phase3_stable",
|
||||
"sourceKind": "runner",
|
||||
"sourceSeq": 6,
|
||||
"turnId": "turn_phase3_stable"
|
||||
},
|
||||
"protocol": "paperclip.runner",
|
||||
"runId": "run_phase3_stable",
|
||||
"runnerInstanceId": "runner_phase3_stable",
|
||||
"sentAt": "2026-08-07T23:00:00.006Z",
|
||||
"turnId": "turn_phase3_stable",
|
||||
"version": 1
|
||||
},
|
||||
"deliveryCount": 1,
|
||||
"logicalEffectCount": 1
|
||||
},
|
||||
{
|
||||
"sourceSeq": 7,
|
||||
"sourceEventId": "event_runner_phase3_stable_000007",
|
||||
"eventType": "run.result.proposed",
|
||||
"priority": 0,
|
||||
"envelope": {
|
||||
"envelopeId": "envelope_event_000007",
|
||||
"kind": "event",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"emittedAt": "2026-08-07T23:00:00.007Z",
|
||||
"eventType": "run.result.proposed",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"reportedWorkDisposition": "done",
|
||||
"schema": "paperclip.prp.result.v1",
|
||||
"status": "succeeded",
|
||||
"summary": "Phase 3 durable transport recovered without duplicate effects."
|
||||
},
|
||||
"priority": 0,
|
||||
"runId": "run_phase3_stable",
|
||||
"schema": "paperclip.prp.event.v1",
|
||||
"schemaVersion": 1,
|
||||
"sourceEventId": "event_runner_phase3_stable_000007",
|
||||
"sourceInstanceId": "runner_phase3_stable",
|
||||
"sourceKind": "runner",
|
||||
"sourceSeq": 7,
|
||||
"turnId": "turn_phase3_stable"
|
||||
},
|
||||
"protocol": "paperclip.runner",
|
||||
"runId": "run_phase3_stable",
|
||||
"runnerInstanceId": "runner_phase3_stable",
|
||||
"sentAt": "2026-08-07T23:00:00.007Z",
|
||||
"turnId": "turn_phase3_stable",
|
||||
"version": 1
|
||||
},
|
||||
"deliveryCount": 1,
|
||||
"logicalEffectCount": 1
|
||||
},
|
||||
{
|
||||
"sourceSeq": 8,
|
||||
"sourceEventId": "event_runner_phase3_stable_000008",
|
||||
"eventType": "run.terminal",
|
||||
"priority": 0,
|
||||
"envelope": {
|
||||
"envelopeId": "envelope_event_000008",
|
||||
"kind": "event",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"emittedAt": "2026-08-07T23:00:00.008Z",
|
||||
"eventType": "run.terminal",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"reportedWorkDisposition": "done",
|
||||
"runTerminalState": "succeeded",
|
||||
"schema": "paperclip.prp.terminal.v1",
|
||||
"turnTerminalState": "completed"
|
||||
},
|
||||
"priority": 0,
|
||||
"runId": "run_phase3_stable",
|
||||
"schema": "paperclip.prp.event.v1",
|
||||
"schemaVersion": 1,
|
||||
"sourceEventId": "event_runner_phase3_stable_000008",
|
||||
"sourceInstanceId": "runner_phase3_stable",
|
||||
"sourceKind": "runner",
|
||||
"sourceSeq": 8,
|
||||
"turnId": "turn_phase3_stable"
|
||||
},
|
||||
"protocol": "paperclip.runner",
|
||||
"runId": "run_phase3_stable",
|
||||
"runnerInstanceId": "runner_phase3_stable",
|
||||
"sentAt": "2026-08-07T23:00:00.008Z",
|
||||
"turnId": "turn_phase3_stable",
|
||||
"version": 1
|
||||
},
|
||||
"deliveryCount": 3,
|
||||
"logicalEffectCount": 1
|
||||
}
|
||||
]
|
||||
},
|
||||
"runnerState": {
|
||||
"schema": "paperclip.runner.phase3.state.v1",
|
||||
"runnerInstanceId": "runner_phase3_stable",
|
||||
"environmentLeaseId": "environment_lease_phase3_stable",
|
||||
"runId": "run_phase3_stable",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"turnId": "turn_phase3_stable",
|
||||
"itemId": "item_phase3_stable",
|
||||
"lifecycle": "revoked",
|
||||
"nextSourceSeq": 9,
|
||||
"ackedSourceSeq": 8,
|
||||
"lastControllerCommandSeq": 4,
|
||||
"reconnectCount": 0,
|
||||
"maxOutboxBytes": 65536,
|
||||
"peakOutboxBytes": 5315,
|
||||
"outbox": [],
|
||||
"processedCommands": {
|
||||
"command_after_revoke": {
|
||||
"commandId": "command_after_revoke",
|
||||
"controllerSeq": 4,
|
||||
"commandDigest": "fnv1a64:fd10e64f32894219",
|
||||
"status": "rejected",
|
||||
"logicalEffectCount": 0,
|
||||
"result": {
|
||||
"commandId": "command_after_revoke",
|
||||
"controllerSeq": 4,
|
||||
"detail": "connection capability is revoked; commands have no logical effect",
|
||||
"logicalEffectCount": 0,
|
||||
"status": "rejected"
|
||||
}
|
||||
},
|
||||
"command_phase3_001": {
|
||||
"commandId": "command_phase3_001",
|
||||
"controllerSeq": 1,
|
||||
"commandDigest": "fnv1a64:c19dfbbf86a3dbb4",
|
||||
"status": "completed",
|
||||
"logicalEffectCount": 1,
|
||||
"result": {
|
||||
"commandId": "command_phase3_001",
|
||||
"controllerSeq": 1,
|
||||
"detail": "run prepared",
|
||||
"logicalEffectCount": 1,
|
||||
"status": "completed"
|
||||
}
|
||||
},
|
||||
"command_phase3_002": {
|
||||
"commandId": "command_phase3_002",
|
||||
"controllerSeq": 2,
|
||||
"commandDigest": "fnv1a64:b5198f3ce67ce88e",
|
||||
"status": "completed",
|
||||
"logicalEffectCount": 1,
|
||||
"result": {
|
||||
"commandId": "command_phase3_002",
|
||||
"controllerSeq": 2,
|
||||
"detail": "session bound",
|
||||
"logicalEffectCount": 1,
|
||||
"status": "completed"
|
||||
}
|
||||
},
|
||||
"command_phase3_003": {
|
||||
"commandId": "command_phase3_003",
|
||||
"controllerSeq": 3,
|
||||
"commandDigest": "fnv1a64:fb3b206fe67e1dc8",
|
||||
"status": "completed",
|
||||
"logicalEffectCount": 1,
|
||||
"result": {
|
||||
"commandId": "command_phase3_003",
|
||||
"controllerSeq": 3,
|
||||
"detail": "turn completed",
|
||||
"logicalEffectCount": 1,
|
||||
"status": "completed"
|
||||
}
|
||||
}
|
||||
},
|
||||
"diagnostics": [
|
||||
"connection lease revoked; flushing durable events"
|
||||
],
|
||||
"backpressure": false,
|
||||
"recoverableFailure": null,
|
||||
"unrecoverableOutcome": null,
|
||||
"harnessGeneration": 1,
|
||||
"stopAfterFlush": true
|
||||
},
|
||||
"commands": [
|
||||
{
|
||||
"schema": "paperclip.prp.command.v1",
|
||||
"commandId": "command_phase3_001",
|
||||
"controllerSeq": 1,
|
||||
"type": "run.prepare",
|
||||
"issuedAt": "2026-08-07T23:30:01.000Z",
|
||||
"payload": {
|
||||
"workspace": "phase-03-durable-fixture"
|
||||
},
|
||||
"status": "completed",
|
||||
"result": {
|
||||
"commandId": "command_phase3_001",
|
||||
"controllerSeq": 1,
|
||||
"detail": "run prepared",
|
||||
"logicalEffectCount": 1,
|
||||
"status": "completed"
|
||||
}
|
||||
},
|
||||
{
|
||||
"schema": "paperclip.prp.command.v1",
|
||||
"commandId": "command_phase3_002",
|
||||
"controllerSeq": 2,
|
||||
"type": "session.open",
|
||||
"issuedAt": "2026-08-07T23:30:02.000Z",
|
||||
"payload": {
|
||||
"reuse": "same_session"
|
||||
},
|
||||
"status": "completed",
|
||||
"result": {
|
||||
"commandId": "command_phase3_002",
|
||||
"controllerSeq": 2,
|
||||
"detail": "session bound",
|
||||
"logicalEffectCount": 1,
|
||||
"status": "completed"
|
||||
}
|
||||
},
|
||||
{
|
||||
"schema": "paperclip.prp.command.v1",
|
||||
"commandId": "command_phase3_003",
|
||||
"controllerSeq": 3,
|
||||
"type": "turn.start",
|
||||
"issuedAt": "2026-08-07T23:30:03.000Z",
|
||||
"payload": {
|
||||
"turnId": "turn_phase3_stable",
|
||||
"text": "Prove Phase 3 durable recovery."
|
||||
},
|
||||
"status": "completed",
|
||||
"result": {
|
||||
"commandId": "command_phase3_003",
|
||||
"controllerSeq": 3,
|
||||
"detail": "turn completed",
|
||||
"logicalEffectCount": 1,
|
||||
"status": "completed"
|
||||
}
|
||||
},
|
||||
{
|
||||
"schema": "paperclip.prp.command.v1",
|
||||
"commandId": "command_after_revoke",
|
||||
"controllerSeq": 4,
|
||||
"type": "turn.start",
|
||||
"issuedAt": "2026-08-07T23:30:04.000Z",
|
||||
"payload": {
|
||||
"turnId": "turn_phase3_stable",
|
||||
"text": "must be rejected after revoke"
|
||||
},
|
||||
"status": "rejected",
|
||||
"result": {
|
||||
"commandId": "command_after_revoke",
|
||||
"controllerSeq": 4,
|
||||
"detail": "connection capability is revoked; commands have no logical effect",
|
||||
"logicalEffectCount": 0,
|
||||
"status": "rejected"
|
||||
}
|
||||
}
|
||||
],
|
||||
"assertions": {
|
||||
"stableIdentity": true,
|
||||
"sourceCursorContinuous": true,
|
||||
"oneLogicalEffectPerAcceptedCommand": true,
|
||||
"noDuplicateLogicalEvents": true,
|
||||
"p0Preserved": true,
|
||||
"boundedStorage": true,
|
||||
"secretsRedacted": true
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,601 @@
|
||||
{
|
||||
"schema": "paperclip.runner.phase3.trace.v1",
|
||||
"diagnostics": {
|
||||
"schema": "paperclip.runner.phase3.diagnostics.v1",
|
||||
"fault": "runner-restart",
|
||||
"connection": {
|
||||
"state": "stopped",
|
||||
"connectionCount": 2,
|
||||
"reconnectCount": 1,
|
||||
"leaseId": "connection_lease_dcd257e4-0a30-4bb8-8674-0446c617e29f",
|
||||
"leaseExpiresAt": "2026-08-07T23:36:39.391Z"
|
||||
},
|
||||
"identity": {
|
||||
"runnerInstanceId": "runner_phase3_stable",
|
||||
"environmentLeaseId": "environment_lease_phase3_stable",
|
||||
"runId": "run_phase3_stable",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"turnId": "turn_phase3_stable",
|
||||
"itemId": "item_phase3_stable"
|
||||
},
|
||||
"cursors": {
|
||||
"runnerAckedSourceSeq": 10,
|
||||
"runnerNextSourceSeq": 11,
|
||||
"coreAckedSourceSeq": 10,
|
||||
"highestCommittedSourceSeq": 10
|
||||
},
|
||||
"outbox": {
|
||||
"events": 0,
|
||||
"bytes": 0,
|
||||
"peakBytes": 6883,
|
||||
"maxBytes": 65536,
|
||||
"backpressure": false,
|
||||
"p0Committed": 6,
|
||||
"p0Lost": 0
|
||||
},
|
||||
"commands": {
|
||||
"issued": 4,
|
||||
"completed": 4,
|
||||
"rejected": 0,
|
||||
"logicalEffects": 4,
|
||||
"duplicateDeliveries": 1
|
||||
},
|
||||
"recovery": {
|
||||
"replayDeliveries": 10,
|
||||
"runnerRestarts": 1,
|
||||
"harnessRestarts": 0,
|
||||
"malformedFrames": 0,
|
||||
"freshBootstraps": 2,
|
||||
"outcome": "recovered",
|
||||
"reason": "runner_restart_completed"
|
||||
},
|
||||
"security": {
|
||||
"bootstrapTicketPersisted": false,
|
||||
"connectionLeaseTokenPersisted": false,
|
||||
"secretLeakCount": 0
|
||||
},
|
||||
"committedEvents": [
|
||||
{
|
||||
"sourceSeq": 1,
|
||||
"sourceEventId": "event_runner_phase3_stable_000001",
|
||||
"eventType": "workspace.ready",
|
||||
"priority": 1,
|
||||
"envelope": {
|
||||
"envelopeId": "envelope_event_000001",
|
||||
"kind": "event",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"emittedAt": "2026-08-07T23:00:00.001Z",
|
||||
"eventType": "workspace.ready",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"workspace": "phase-03-durable-fixture"
|
||||
},
|
||||
"priority": 1,
|
||||
"runId": "run_phase3_stable",
|
||||
"schema": "paperclip.prp.event.v1",
|
||||
"schemaVersion": 1,
|
||||
"sourceEventId": "event_runner_phase3_stable_000001",
|
||||
"sourceInstanceId": "runner_phase3_stable",
|
||||
"sourceKind": "runner",
|
||||
"sourceSeq": 1,
|
||||
"turnId": "turn_phase3_stable"
|
||||
},
|
||||
"protocol": "paperclip.runner",
|
||||
"runId": "run_phase3_stable",
|
||||
"runnerInstanceId": "runner_phase3_stable",
|
||||
"sentAt": "2026-08-07T23:00:00.001Z",
|
||||
"turnId": "turn_phase3_stable",
|
||||
"version": 1
|
||||
},
|
||||
"deliveryCount": 3,
|
||||
"logicalEffectCount": 1
|
||||
},
|
||||
{
|
||||
"sourceSeq": 2,
|
||||
"sourceEventId": "event_runner_phase3_stable_000002",
|
||||
"eventType": "session.started",
|
||||
"priority": 0,
|
||||
"envelope": {
|
||||
"envelopeId": "envelope_event_000002",
|
||||
"kind": "event",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"emittedAt": "2026-08-07T23:00:00.002Z",
|
||||
"eventType": "session.started",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"driverSessionId": "driver_phase3_fake",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"resumed": false
|
||||
},
|
||||
"priority": 0,
|
||||
"runId": "run_phase3_stable",
|
||||
"schema": "paperclip.prp.event.v1",
|
||||
"schemaVersion": 1,
|
||||
"sourceEventId": "event_runner_phase3_stable_000002",
|
||||
"sourceInstanceId": "runner_phase3_stable",
|
||||
"sourceKind": "runner",
|
||||
"sourceSeq": 2,
|
||||
"turnId": "turn_phase3_stable"
|
||||
},
|
||||
"protocol": "paperclip.runner",
|
||||
"runId": "run_phase3_stable",
|
||||
"runnerInstanceId": "runner_phase3_stable",
|
||||
"sentAt": "2026-08-07T23:00:00.002Z",
|
||||
"turnId": "turn_phase3_stable",
|
||||
"version": 1
|
||||
},
|
||||
"deliveryCount": 2,
|
||||
"logicalEffectCount": 1
|
||||
},
|
||||
{
|
||||
"sourceSeq": 3,
|
||||
"sourceEventId": "event_runner_phase3_stable_000003",
|
||||
"eventType": "runner.reconciled",
|
||||
"priority": 0,
|
||||
"envelope": {
|
||||
"envelopeId": "envelope_event_000003",
|
||||
"kind": "event",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"emittedAt": "2026-08-07T23:00:00.003Z",
|
||||
"eventType": "runner.reconciled",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"itemId": "item_phase3_stable",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"outcome": "same_durable_session_resumed",
|
||||
"runnerInstanceId": "runner_phase3_stable",
|
||||
"turnId": "turn_phase3_stable"
|
||||
},
|
||||
"priority": 0,
|
||||
"runId": "run_phase3_stable",
|
||||
"schema": "paperclip.prp.event.v1",
|
||||
"schemaVersion": 1,
|
||||
"sourceEventId": "event_runner_phase3_stable_000003",
|
||||
"sourceInstanceId": "runner_phase3_stable",
|
||||
"sourceKind": "runner",
|
||||
"sourceSeq": 3,
|
||||
"turnId": "turn_phase3_stable"
|
||||
},
|
||||
"protocol": "paperclip.runner",
|
||||
"runId": "run_phase3_stable",
|
||||
"runnerInstanceId": "runner_phase3_stable",
|
||||
"sentAt": "2026-08-07T23:00:00.003Z",
|
||||
"turnId": "turn_phase3_stable",
|
||||
"version": 1
|
||||
},
|
||||
"deliveryCount": 2,
|
||||
"logicalEffectCount": 1
|
||||
},
|
||||
{
|
||||
"sourceSeq": 4,
|
||||
"sourceEventId": "event_runner_phase3_stable_000004",
|
||||
"eventType": "turn.accepted",
|
||||
"priority": 0,
|
||||
"envelope": {
|
||||
"envelopeId": "envelope_event_000004",
|
||||
"kind": "event",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"emittedAt": "2026-08-07T23:00:00.004Z",
|
||||
"eventType": "turn.accepted",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"sameSession": true,
|
||||
"turnId": "turn_phase3_stable"
|
||||
},
|
||||
"priority": 0,
|
||||
"runId": "run_phase3_stable",
|
||||
"schema": "paperclip.prp.event.v1",
|
||||
"schemaVersion": 1,
|
||||
"sourceEventId": "event_runner_phase3_stable_000004",
|
||||
"sourceInstanceId": "runner_phase3_stable",
|
||||
"sourceKind": "runner",
|
||||
"sourceSeq": 4,
|
||||
"turnId": "turn_phase3_stable"
|
||||
},
|
||||
"protocol": "paperclip.runner",
|
||||
"runId": "run_phase3_stable",
|
||||
"runnerInstanceId": "runner_phase3_stable",
|
||||
"sentAt": "2026-08-07T23:00:00.004Z",
|
||||
"turnId": "turn_phase3_stable",
|
||||
"version": 1
|
||||
},
|
||||
"deliveryCount": 2,
|
||||
"logicalEffectCount": 1
|
||||
},
|
||||
{
|
||||
"sourceSeq": 5,
|
||||
"sourceEventId": "event_runner_phase3_stable_000005",
|
||||
"eventType": "item.started",
|
||||
"priority": 1,
|
||||
"envelope": {
|
||||
"envelopeId": "envelope_event_000005",
|
||||
"kind": "event",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"emittedAt": "2026-08-07T23:00:00.005Z",
|
||||
"eventType": "item.started",
|
||||
"itemId": "item_phase3_stable",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"kind": "assistant_message"
|
||||
},
|
||||
"priority": 1,
|
||||
"runId": "run_phase3_stable",
|
||||
"schema": "paperclip.prp.event.v1",
|
||||
"schemaVersion": 1,
|
||||
"sourceEventId": "event_runner_phase3_stable_000005",
|
||||
"sourceInstanceId": "runner_phase3_stable",
|
||||
"sourceKind": "runner",
|
||||
"sourceSeq": 5,
|
||||
"turnId": "turn_phase3_stable"
|
||||
},
|
||||
"protocol": "paperclip.runner",
|
||||
"runId": "run_phase3_stable",
|
||||
"runnerInstanceId": "runner_phase3_stable",
|
||||
"sentAt": "2026-08-07T23:00:00.005Z",
|
||||
"turnId": "turn_phase3_stable",
|
||||
"version": 1
|
||||
},
|
||||
"deliveryCount": 2,
|
||||
"logicalEffectCount": 1
|
||||
},
|
||||
{
|
||||
"sourceSeq": 6,
|
||||
"sourceEventId": "event_runner_phase3_stable_000006",
|
||||
"eventType": "item.delta",
|
||||
"priority": 2,
|
||||
"envelope": {
|
||||
"envelopeId": "envelope_event_000006",
|
||||
"kind": "event",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"emittedAt": "2026-08-07T23:00:00.006Z",
|
||||
"eventType": "item.delta",
|
||||
"itemId": "item_phase3_stable",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"text": "Prove Phase 3 durable recovery."
|
||||
},
|
||||
"priority": 2,
|
||||
"runId": "run_phase3_stable",
|
||||
"schema": "paperclip.prp.event.v1",
|
||||
"schemaVersion": 1,
|
||||
"sourceEventId": "event_runner_phase3_stable_000006",
|
||||
"sourceInstanceId": "runner_phase3_stable",
|
||||
"sourceKind": "runner",
|
||||
"sourceSeq": 6,
|
||||
"turnId": "turn_phase3_stable"
|
||||
},
|
||||
"protocol": "paperclip.runner",
|
||||
"runId": "run_phase3_stable",
|
||||
"runnerInstanceId": "runner_phase3_stable",
|
||||
"sentAt": "2026-08-07T23:00:00.006Z",
|
||||
"turnId": "turn_phase3_stable",
|
||||
"version": 1
|
||||
},
|
||||
"deliveryCount": 2,
|
||||
"logicalEffectCount": 1
|
||||
},
|
||||
{
|
||||
"sourceSeq": 7,
|
||||
"sourceEventId": "event_runner_phase3_stable_000007",
|
||||
"eventType": "item.completed",
|
||||
"priority": 1,
|
||||
"envelope": {
|
||||
"envelopeId": "envelope_event_000007",
|
||||
"kind": "event",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"emittedAt": "2026-08-07T23:00:00.007Z",
|
||||
"eventType": "item.completed",
|
||||
"itemId": "item_phase3_stable",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"text": "Durable recovery completed."
|
||||
},
|
||||
"priority": 1,
|
||||
"runId": "run_phase3_stable",
|
||||
"schema": "paperclip.prp.event.v1",
|
||||
"schemaVersion": 1,
|
||||
"sourceEventId": "event_runner_phase3_stable_000007",
|
||||
"sourceInstanceId": "runner_phase3_stable",
|
||||
"sourceKind": "runner",
|
||||
"sourceSeq": 7,
|
||||
"turnId": "turn_phase3_stable"
|
||||
},
|
||||
"protocol": "paperclip.runner",
|
||||
"runId": "run_phase3_stable",
|
||||
"runnerInstanceId": "runner_phase3_stable",
|
||||
"sentAt": "2026-08-07T23:00:00.007Z",
|
||||
"turnId": "turn_phase3_stable",
|
||||
"version": 1
|
||||
},
|
||||
"deliveryCount": 2,
|
||||
"logicalEffectCount": 1
|
||||
},
|
||||
{
|
||||
"sourceSeq": 8,
|
||||
"sourceEventId": "event_runner_phase3_stable_000008",
|
||||
"eventType": "run.result.proposed",
|
||||
"priority": 0,
|
||||
"envelope": {
|
||||
"envelopeId": "envelope_event_000008",
|
||||
"kind": "event",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"emittedAt": "2026-08-07T23:00:00.008Z",
|
||||
"eventType": "run.result.proposed",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"reportedWorkDisposition": "done",
|
||||
"schema": "paperclip.prp.result.v1",
|
||||
"status": "succeeded",
|
||||
"summary": "Phase 3 durable transport recovered without duplicate effects."
|
||||
},
|
||||
"priority": 0,
|
||||
"runId": "run_phase3_stable",
|
||||
"schema": "paperclip.prp.event.v1",
|
||||
"schemaVersion": 1,
|
||||
"sourceEventId": "event_runner_phase3_stable_000008",
|
||||
"sourceInstanceId": "runner_phase3_stable",
|
||||
"sourceKind": "runner",
|
||||
"sourceSeq": 8,
|
||||
"turnId": "turn_phase3_stable"
|
||||
},
|
||||
"protocol": "paperclip.runner",
|
||||
"runId": "run_phase3_stable",
|
||||
"runnerInstanceId": "runner_phase3_stable",
|
||||
"sentAt": "2026-08-07T23:00:00.008Z",
|
||||
"turnId": "turn_phase3_stable",
|
||||
"version": 1
|
||||
},
|
||||
"deliveryCount": 2,
|
||||
"logicalEffectCount": 1
|
||||
},
|
||||
{
|
||||
"sourceSeq": 9,
|
||||
"sourceEventId": "event_runner_phase3_stable_000009",
|
||||
"eventType": "run.terminal",
|
||||
"priority": 0,
|
||||
"envelope": {
|
||||
"envelopeId": "envelope_event_000009",
|
||||
"kind": "event",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"emittedAt": "2026-08-07T23:00:00.009Z",
|
||||
"eventType": "run.terminal",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"reportedWorkDisposition": "done",
|
||||
"runTerminalState": "succeeded",
|
||||
"schema": "paperclip.prp.terminal.v1",
|
||||
"turnTerminalState": "completed"
|
||||
},
|
||||
"priority": 0,
|
||||
"runId": "run_phase3_stable",
|
||||
"schema": "paperclip.prp.event.v1",
|
||||
"schemaVersion": 1,
|
||||
"sourceEventId": "event_runner_phase3_stable_000009",
|
||||
"sourceInstanceId": "runner_phase3_stable",
|
||||
"sourceKind": "runner",
|
||||
"sourceSeq": 9,
|
||||
"turnId": "turn_phase3_stable"
|
||||
},
|
||||
"protocol": "paperclip.runner",
|
||||
"runId": "run_phase3_stable",
|
||||
"runnerInstanceId": "runner_phase3_stable",
|
||||
"sentAt": "2026-08-07T23:00:00.009Z",
|
||||
"turnId": "turn_phase3_stable",
|
||||
"version": 1
|
||||
},
|
||||
"deliveryCount": 2,
|
||||
"logicalEffectCount": 1
|
||||
},
|
||||
{
|
||||
"sourceSeq": 10,
|
||||
"sourceEventId": "event_runner_phase3_stable_000010",
|
||||
"eventType": "runner.stopped",
|
||||
"priority": 0,
|
||||
"envelope": {
|
||||
"envelopeId": "envelope_event_000010",
|
||||
"kind": "event",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"emittedAt": "2026-08-07T23:00:00.010Z",
|
||||
"eventType": "runner.stopped",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"afterDurableFlush": true
|
||||
},
|
||||
"priority": 0,
|
||||
"runId": "run_phase3_stable",
|
||||
"schema": "paperclip.prp.event.v1",
|
||||
"schemaVersion": 1,
|
||||
"sourceEventId": "event_runner_phase3_stable_000010",
|
||||
"sourceInstanceId": "runner_phase3_stable",
|
||||
"sourceKind": "runner",
|
||||
"sourceSeq": 10,
|
||||
"turnId": "turn_phase3_stable"
|
||||
},
|
||||
"protocol": "paperclip.runner",
|
||||
"runId": "run_phase3_stable",
|
||||
"runnerInstanceId": "runner_phase3_stable",
|
||||
"sentAt": "2026-08-07T23:00:00.010Z",
|
||||
"turnId": "turn_phase3_stable",
|
||||
"version": 1
|
||||
},
|
||||
"deliveryCount": 1,
|
||||
"logicalEffectCount": 1
|
||||
}
|
||||
]
|
||||
},
|
||||
"runnerState": {
|
||||
"schema": "paperclip.runner.phase3.state.v1",
|
||||
"runnerInstanceId": "runner_phase3_stable",
|
||||
"environmentLeaseId": "environment_lease_phase3_stable",
|
||||
"runId": "run_phase3_stable",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"turnId": "turn_phase3_stable",
|
||||
"itemId": "item_phase3_stable",
|
||||
"lifecycle": "stopped",
|
||||
"nextSourceSeq": 11,
|
||||
"ackedSourceSeq": 10,
|
||||
"lastControllerCommandSeq": 4,
|
||||
"reconnectCount": 1,
|
||||
"maxOutboxBytes": 65536,
|
||||
"peakOutboxBytes": 6883,
|
||||
"outbox": [],
|
||||
"processedCommands": {
|
||||
"command_phase3_001": {
|
||||
"commandId": "command_phase3_001",
|
||||
"controllerSeq": 1,
|
||||
"commandDigest": "fnv1a64:c19dfbbf86a3dbb4",
|
||||
"status": "completed",
|
||||
"logicalEffectCount": 1,
|
||||
"result": {
|
||||
"commandId": "command_phase3_001",
|
||||
"controllerSeq": 1,
|
||||
"detail": "run prepared",
|
||||
"logicalEffectCount": 1,
|
||||
"status": "completed"
|
||||
}
|
||||
},
|
||||
"command_phase3_002": {
|
||||
"commandId": "command_phase3_002",
|
||||
"controllerSeq": 2,
|
||||
"commandDigest": "fnv1a64:b5198f3ce67ce88e",
|
||||
"status": "completed",
|
||||
"logicalEffectCount": 1,
|
||||
"result": {
|
||||
"commandId": "command_phase3_002",
|
||||
"controllerSeq": 2,
|
||||
"detail": "session bound",
|
||||
"logicalEffectCount": 1,
|
||||
"status": "completed"
|
||||
}
|
||||
},
|
||||
"command_phase3_003": {
|
||||
"commandId": "command_phase3_003",
|
||||
"controllerSeq": 3,
|
||||
"commandDigest": "fnv1a64:fb3b206fe67e1dc8",
|
||||
"status": "completed",
|
||||
"logicalEffectCount": 1,
|
||||
"result": {
|
||||
"commandId": "command_phase3_003",
|
||||
"controllerSeq": 3,
|
||||
"detail": "turn completed",
|
||||
"logicalEffectCount": 1,
|
||||
"status": "completed"
|
||||
}
|
||||
},
|
||||
"command_phase3_004": {
|
||||
"commandId": "command_phase3_004",
|
||||
"controllerSeq": 4,
|
||||
"commandDigest": "fnv1a64:d11bf8308f863bad",
|
||||
"status": "completed",
|
||||
"logicalEffectCount": 1,
|
||||
"result": {
|
||||
"commandId": "command_phase3_004",
|
||||
"controllerSeq": 4,
|
||||
"detail": "runner will stop after durable flush",
|
||||
"logicalEffectCount": 1,
|
||||
"status": "completed"
|
||||
}
|
||||
}
|
||||
},
|
||||
"diagnostics": [
|
||||
"runner process restored the same durable identity"
|
||||
],
|
||||
"backpressure": false,
|
||||
"recoverableFailure": null,
|
||||
"unrecoverableOutcome": null,
|
||||
"harnessGeneration": 1,
|
||||
"stopAfterFlush": true
|
||||
},
|
||||
"commands": [
|
||||
{
|
||||
"schema": "paperclip.prp.command.v1",
|
||||
"commandId": "command_phase3_001",
|
||||
"controllerSeq": 1,
|
||||
"type": "run.prepare",
|
||||
"issuedAt": "2026-08-07T23:30:01.000Z",
|
||||
"payload": {
|
||||
"workspace": "phase-03-durable-fixture"
|
||||
},
|
||||
"status": "completed",
|
||||
"result": {
|
||||
"commandId": "command_phase3_001",
|
||||
"controllerSeq": 1,
|
||||
"detail": "run prepared",
|
||||
"logicalEffectCount": 1,
|
||||
"status": "completed"
|
||||
}
|
||||
},
|
||||
{
|
||||
"schema": "paperclip.prp.command.v1",
|
||||
"commandId": "command_phase3_002",
|
||||
"controllerSeq": 2,
|
||||
"type": "session.open",
|
||||
"issuedAt": "2026-08-07T23:30:02.000Z",
|
||||
"payload": {
|
||||
"reuse": "same_session"
|
||||
},
|
||||
"status": "completed",
|
||||
"result": {
|
||||
"commandId": "command_phase3_002",
|
||||
"controllerSeq": 2,
|
||||
"detail": "session bound",
|
||||
"logicalEffectCount": 1,
|
||||
"status": "completed"
|
||||
}
|
||||
},
|
||||
{
|
||||
"schema": "paperclip.prp.command.v1",
|
||||
"commandId": "command_phase3_003",
|
||||
"controllerSeq": 3,
|
||||
"type": "turn.start",
|
||||
"issuedAt": "2026-08-07T23:30:03.000Z",
|
||||
"payload": {
|
||||
"turnId": "turn_phase3_stable",
|
||||
"text": "Prove Phase 3 durable recovery."
|
||||
},
|
||||
"status": "completed",
|
||||
"result": {
|
||||
"commandId": "command_phase3_003",
|
||||
"controllerSeq": 3,
|
||||
"detail": "turn completed",
|
||||
"logicalEffectCount": 1,
|
||||
"status": "completed"
|
||||
}
|
||||
},
|
||||
{
|
||||
"schema": "paperclip.prp.command.v1",
|
||||
"commandId": "command_phase3_004",
|
||||
"controllerSeq": 4,
|
||||
"type": "runner.shutdown",
|
||||
"issuedAt": "2026-08-07T23:30:04.000Z",
|
||||
"payload": {},
|
||||
"status": "completed",
|
||||
"result": {
|
||||
"commandId": "command_phase3_004",
|
||||
"controllerSeq": 4,
|
||||
"detail": "runner will stop after durable flush",
|
||||
"logicalEffectCount": 1,
|
||||
"status": "completed"
|
||||
}
|
||||
}
|
||||
],
|
||||
"assertions": {
|
||||
"stableIdentity": true,
|
||||
"sourceCursorContinuous": true,
|
||||
"oneLogicalEffectPerAcceptedCommand": true,
|
||||
"noDuplicateLogicalEvents": true,
|
||||
"p0Preserved": true,
|
||||
"boundedStorage": true,
|
||||
"secretsRedacted": true
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,561 @@
|
||||
{
|
||||
"schema": "paperclip.runner.phase3.trace.v1",
|
||||
"diagnostics": {
|
||||
"schema": "paperclip.runner.phase3.diagnostics.v1",
|
||||
"fault": "socket-drop",
|
||||
"connection": {
|
||||
"state": "stopped",
|
||||
"connectionCount": 2,
|
||||
"reconnectCount": 1,
|
||||
"leaseId": "connection_lease_efd9f53a-cc91-4232-8ec8-1a5d5963dad4",
|
||||
"leaseExpiresAt": "2026-08-07T23:36:38.467Z"
|
||||
},
|
||||
"identity": {
|
||||
"runnerInstanceId": "runner_phase3_stable",
|
||||
"environmentLeaseId": "environment_lease_phase3_stable",
|
||||
"runId": "run_phase3_stable",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"turnId": "turn_phase3_stable",
|
||||
"itemId": "item_phase3_stable"
|
||||
},
|
||||
"cursors": {
|
||||
"runnerAckedSourceSeq": 9,
|
||||
"runnerNextSourceSeq": 10,
|
||||
"coreAckedSourceSeq": 9,
|
||||
"highestCommittedSourceSeq": 9
|
||||
},
|
||||
"outbox": {
|
||||
"events": 0,
|
||||
"bytes": 0,
|
||||
"peakBytes": 5314,
|
||||
"maxBytes": 65536,
|
||||
"backpressure": false,
|
||||
"p0Committed": 5,
|
||||
"p0Lost": 0
|
||||
},
|
||||
"commands": {
|
||||
"issued": 4,
|
||||
"completed": 4,
|
||||
"rejected": 0,
|
||||
"logicalEffects": 4,
|
||||
"duplicateDeliveries": 0
|
||||
},
|
||||
"recovery": {
|
||||
"replayDeliveries": 8,
|
||||
"runnerRestarts": 0,
|
||||
"harnessRestarts": 0,
|
||||
"malformedFrames": 0,
|
||||
"freshBootstraps": 1,
|
||||
"outcome": "recovered",
|
||||
"reason": "socket_drop_completed"
|
||||
},
|
||||
"security": {
|
||||
"bootstrapTicketPersisted": false,
|
||||
"connectionLeaseTokenPersisted": false,
|
||||
"secretLeakCount": 0
|
||||
},
|
||||
"committedEvents": [
|
||||
{
|
||||
"sourceSeq": 1,
|
||||
"sourceEventId": "event_runner_phase3_stable_000001",
|
||||
"eventType": "workspace.ready",
|
||||
"priority": 1,
|
||||
"envelope": {
|
||||
"envelopeId": "envelope_event_000001",
|
||||
"kind": "event",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"emittedAt": "2026-08-07T23:00:00.001Z",
|
||||
"eventType": "workspace.ready",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"workspace": "phase-03-durable-fixture"
|
||||
},
|
||||
"priority": 1,
|
||||
"runId": "run_phase3_stable",
|
||||
"schema": "paperclip.prp.event.v1",
|
||||
"schemaVersion": 1,
|
||||
"sourceEventId": "event_runner_phase3_stable_000001",
|
||||
"sourceInstanceId": "runner_phase3_stable",
|
||||
"sourceKind": "runner",
|
||||
"sourceSeq": 1,
|
||||
"turnId": "turn_phase3_stable"
|
||||
},
|
||||
"protocol": "paperclip.runner",
|
||||
"runId": "run_phase3_stable",
|
||||
"runnerInstanceId": "runner_phase3_stable",
|
||||
"sentAt": "2026-08-07T23:00:00.001Z",
|
||||
"turnId": "turn_phase3_stable",
|
||||
"version": 1
|
||||
},
|
||||
"deliveryCount": 2,
|
||||
"logicalEffectCount": 1
|
||||
},
|
||||
{
|
||||
"sourceSeq": 2,
|
||||
"sourceEventId": "event_runner_phase3_stable_000002",
|
||||
"eventType": "session.started",
|
||||
"priority": 0,
|
||||
"envelope": {
|
||||
"envelopeId": "envelope_event_000002",
|
||||
"kind": "event",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"emittedAt": "2026-08-07T23:00:00.002Z",
|
||||
"eventType": "session.started",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"driverSessionId": "driver_phase3_fake",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"resumed": true
|
||||
},
|
||||
"priority": 0,
|
||||
"runId": "run_phase3_stable",
|
||||
"schema": "paperclip.prp.event.v1",
|
||||
"schemaVersion": 1,
|
||||
"sourceEventId": "event_runner_phase3_stable_000002",
|
||||
"sourceInstanceId": "runner_phase3_stable",
|
||||
"sourceKind": "runner",
|
||||
"sourceSeq": 2,
|
||||
"turnId": "turn_phase3_stable"
|
||||
},
|
||||
"protocol": "paperclip.runner",
|
||||
"runId": "run_phase3_stable",
|
||||
"runnerInstanceId": "runner_phase3_stable",
|
||||
"sentAt": "2026-08-07T23:00:00.002Z",
|
||||
"turnId": "turn_phase3_stable",
|
||||
"version": 1
|
||||
},
|
||||
"deliveryCount": 2,
|
||||
"logicalEffectCount": 1
|
||||
},
|
||||
{
|
||||
"sourceSeq": 3,
|
||||
"sourceEventId": "event_runner_phase3_stable_000003",
|
||||
"eventType": "turn.accepted",
|
||||
"priority": 0,
|
||||
"envelope": {
|
||||
"envelopeId": "envelope_event_000003",
|
||||
"kind": "event",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"emittedAt": "2026-08-07T23:00:00.003Z",
|
||||
"eventType": "turn.accepted",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"sameSession": true,
|
||||
"turnId": "turn_phase3_stable"
|
||||
},
|
||||
"priority": 0,
|
||||
"runId": "run_phase3_stable",
|
||||
"schema": "paperclip.prp.event.v1",
|
||||
"schemaVersion": 1,
|
||||
"sourceEventId": "event_runner_phase3_stable_000003",
|
||||
"sourceInstanceId": "runner_phase3_stable",
|
||||
"sourceKind": "runner",
|
||||
"sourceSeq": 3,
|
||||
"turnId": "turn_phase3_stable"
|
||||
},
|
||||
"protocol": "paperclip.runner",
|
||||
"runId": "run_phase3_stable",
|
||||
"runnerInstanceId": "runner_phase3_stable",
|
||||
"sentAt": "2026-08-07T23:00:00.003Z",
|
||||
"turnId": "turn_phase3_stable",
|
||||
"version": 1
|
||||
},
|
||||
"deliveryCount": 2,
|
||||
"logicalEffectCount": 1
|
||||
},
|
||||
{
|
||||
"sourceSeq": 4,
|
||||
"sourceEventId": "event_runner_phase3_stable_000004",
|
||||
"eventType": "item.started",
|
||||
"priority": 1,
|
||||
"envelope": {
|
||||
"envelopeId": "envelope_event_000004",
|
||||
"kind": "event",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"emittedAt": "2026-08-07T23:00:00.004Z",
|
||||
"eventType": "item.started",
|
||||
"itemId": "item_phase3_stable",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"kind": "assistant_message"
|
||||
},
|
||||
"priority": 1,
|
||||
"runId": "run_phase3_stable",
|
||||
"schema": "paperclip.prp.event.v1",
|
||||
"schemaVersion": 1,
|
||||
"sourceEventId": "event_runner_phase3_stable_000004",
|
||||
"sourceInstanceId": "runner_phase3_stable",
|
||||
"sourceKind": "runner",
|
||||
"sourceSeq": 4,
|
||||
"turnId": "turn_phase3_stable"
|
||||
},
|
||||
"protocol": "paperclip.runner",
|
||||
"runId": "run_phase3_stable",
|
||||
"runnerInstanceId": "runner_phase3_stable",
|
||||
"sentAt": "2026-08-07T23:00:00.004Z",
|
||||
"turnId": "turn_phase3_stable",
|
||||
"version": 1
|
||||
},
|
||||
"deliveryCount": 2,
|
||||
"logicalEffectCount": 1
|
||||
},
|
||||
{
|
||||
"sourceSeq": 5,
|
||||
"sourceEventId": "event_runner_phase3_stable_000005",
|
||||
"eventType": "item.delta",
|
||||
"priority": 2,
|
||||
"envelope": {
|
||||
"envelopeId": "envelope_event_000005",
|
||||
"kind": "event",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"emittedAt": "2026-08-07T23:00:00.005Z",
|
||||
"eventType": "item.delta",
|
||||
"itemId": "item_phase3_stable",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"text": "Prove Phase 3 durable recovery."
|
||||
},
|
||||
"priority": 2,
|
||||
"runId": "run_phase3_stable",
|
||||
"schema": "paperclip.prp.event.v1",
|
||||
"schemaVersion": 1,
|
||||
"sourceEventId": "event_runner_phase3_stable_000005",
|
||||
"sourceInstanceId": "runner_phase3_stable",
|
||||
"sourceKind": "runner",
|
||||
"sourceSeq": 5,
|
||||
"turnId": "turn_phase3_stable"
|
||||
},
|
||||
"protocol": "paperclip.runner",
|
||||
"runId": "run_phase3_stable",
|
||||
"runnerInstanceId": "runner_phase3_stable",
|
||||
"sentAt": "2026-08-07T23:00:00.005Z",
|
||||
"turnId": "turn_phase3_stable",
|
||||
"version": 1
|
||||
},
|
||||
"deliveryCount": 2,
|
||||
"logicalEffectCount": 1
|
||||
},
|
||||
{
|
||||
"sourceSeq": 6,
|
||||
"sourceEventId": "event_runner_phase3_stable_000006",
|
||||
"eventType": "item.completed",
|
||||
"priority": 1,
|
||||
"envelope": {
|
||||
"envelopeId": "envelope_event_000006",
|
||||
"kind": "event",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"emittedAt": "2026-08-07T23:00:00.006Z",
|
||||
"eventType": "item.completed",
|
||||
"itemId": "item_phase3_stable",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"text": "Durable recovery completed."
|
||||
},
|
||||
"priority": 1,
|
||||
"runId": "run_phase3_stable",
|
||||
"schema": "paperclip.prp.event.v1",
|
||||
"schemaVersion": 1,
|
||||
"sourceEventId": "event_runner_phase3_stable_000006",
|
||||
"sourceInstanceId": "runner_phase3_stable",
|
||||
"sourceKind": "runner",
|
||||
"sourceSeq": 6,
|
||||
"turnId": "turn_phase3_stable"
|
||||
},
|
||||
"protocol": "paperclip.runner",
|
||||
"runId": "run_phase3_stable",
|
||||
"runnerInstanceId": "runner_phase3_stable",
|
||||
"sentAt": "2026-08-07T23:00:00.006Z",
|
||||
"turnId": "turn_phase3_stable",
|
||||
"version": 1
|
||||
},
|
||||
"deliveryCount": 2,
|
||||
"logicalEffectCount": 1
|
||||
},
|
||||
{
|
||||
"sourceSeq": 7,
|
||||
"sourceEventId": "event_runner_phase3_stable_000007",
|
||||
"eventType": "run.result.proposed",
|
||||
"priority": 0,
|
||||
"envelope": {
|
||||
"envelopeId": "envelope_event_000007",
|
||||
"kind": "event",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"emittedAt": "2026-08-07T23:00:00.007Z",
|
||||
"eventType": "run.result.proposed",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"reportedWorkDisposition": "done",
|
||||
"schema": "paperclip.prp.result.v1",
|
||||
"status": "succeeded",
|
||||
"summary": "Phase 3 durable transport recovered without duplicate effects."
|
||||
},
|
||||
"priority": 0,
|
||||
"runId": "run_phase3_stable",
|
||||
"schema": "paperclip.prp.event.v1",
|
||||
"schemaVersion": 1,
|
||||
"sourceEventId": "event_runner_phase3_stable_000007",
|
||||
"sourceInstanceId": "runner_phase3_stable",
|
||||
"sourceKind": "runner",
|
||||
"sourceSeq": 7,
|
||||
"turnId": "turn_phase3_stable"
|
||||
},
|
||||
"protocol": "paperclip.runner",
|
||||
"runId": "run_phase3_stable",
|
||||
"runnerInstanceId": "runner_phase3_stable",
|
||||
"sentAt": "2026-08-07T23:00:00.007Z",
|
||||
"turnId": "turn_phase3_stable",
|
||||
"version": 1
|
||||
},
|
||||
"deliveryCount": 2,
|
||||
"logicalEffectCount": 1
|
||||
},
|
||||
{
|
||||
"sourceSeq": 8,
|
||||
"sourceEventId": "event_runner_phase3_stable_000008",
|
||||
"eventType": "run.terminal",
|
||||
"priority": 0,
|
||||
"envelope": {
|
||||
"envelopeId": "envelope_event_000008",
|
||||
"kind": "event",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"emittedAt": "2026-08-07T23:00:00.008Z",
|
||||
"eventType": "run.terminal",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"reportedWorkDisposition": "done",
|
||||
"runTerminalState": "succeeded",
|
||||
"schema": "paperclip.prp.terminal.v1",
|
||||
"turnTerminalState": "completed"
|
||||
},
|
||||
"priority": 0,
|
||||
"runId": "run_phase3_stable",
|
||||
"schema": "paperclip.prp.event.v1",
|
||||
"schemaVersion": 1,
|
||||
"sourceEventId": "event_runner_phase3_stable_000008",
|
||||
"sourceInstanceId": "runner_phase3_stable",
|
||||
"sourceKind": "runner",
|
||||
"sourceSeq": 8,
|
||||
"turnId": "turn_phase3_stable"
|
||||
},
|
||||
"protocol": "paperclip.runner",
|
||||
"runId": "run_phase3_stable",
|
||||
"runnerInstanceId": "runner_phase3_stable",
|
||||
"sentAt": "2026-08-07T23:00:00.008Z",
|
||||
"turnId": "turn_phase3_stable",
|
||||
"version": 1
|
||||
},
|
||||
"deliveryCount": 2,
|
||||
"logicalEffectCount": 1
|
||||
},
|
||||
{
|
||||
"sourceSeq": 9,
|
||||
"sourceEventId": "event_runner_phase3_stable_000009",
|
||||
"eventType": "runner.stopped",
|
||||
"priority": 0,
|
||||
"envelope": {
|
||||
"envelopeId": "envelope_event_000009",
|
||||
"kind": "event",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"emittedAt": "2026-08-07T23:00:00.009Z",
|
||||
"eventType": "runner.stopped",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"afterDurableFlush": true
|
||||
},
|
||||
"priority": 0,
|
||||
"runId": "run_phase3_stable",
|
||||
"schema": "paperclip.prp.event.v1",
|
||||
"schemaVersion": 1,
|
||||
"sourceEventId": "event_runner_phase3_stable_000009",
|
||||
"sourceInstanceId": "runner_phase3_stable",
|
||||
"sourceKind": "runner",
|
||||
"sourceSeq": 9,
|
||||
"turnId": "turn_phase3_stable"
|
||||
},
|
||||
"protocol": "paperclip.runner",
|
||||
"runId": "run_phase3_stable",
|
||||
"runnerInstanceId": "runner_phase3_stable",
|
||||
"sentAt": "2026-08-07T23:00:00.009Z",
|
||||
"turnId": "turn_phase3_stable",
|
||||
"version": 1
|
||||
},
|
||||
"deliveryCount": 1,
|
||||
"logicalEffectCount": 1
|
||||
}
|
||||
]
|
||||
},
|
||||
"runnerState": {
|
||||
"schema": "paperclip.runner.phase3.state.v1",
|
||||
"runnerInstanceId": "runner_phase3_stable",
|
||||
"environmentLeaseId": "environment_lease_phase3_stable",
|
||||
"runId": "run_phase3_stable",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"turnId": "turn_phase3_stable",
|
||||
"itemId": "item_phase3_stable",
|
||||
"lifecycle": "stopped",
|
||||
"nextSourceSeq": 10,
|
||||
"ackedSourceSeq": 9,
|
||||
"lastControllerCommandSeq": 4,
|
||||
"reconnectCount": 1,
|
||||
"maxOutboxBytes": 65536,
|
||||
"peakOutboxBytes": 5314,
|
||||
"outbox": [],
|
||||
"processedCommands": {
|
||||
"command_phase3_001": {
|
||||
"commandId": "command_phase3_001",
|
||||
"controllerSeq": 1,
|
||||
"commandDigest": "fnv1a64:c19dfbbf86a3dbb4",
|
||||
"status": "completed",
|
||||
"logicalEffectCount": 1,
|
||||
"result": {
|
||||
"commandId": "command_phase3_001",
|
||||
"controllerSeq": 1,
|
||||
"detail": "run prepared",
|
||||
"logicalEffectCount": 1,
|
||||
"status": "completed"
|
||||
}
|
||||
},
|
||||
"command_phase3_002": {
|
||||
"commandId": "command_phase3_002",
|
||||
"controllerSeq": 2,
|
||||
"commandDigest": "fnv1a64:b5198f3ce67ce88e",
|
||||
"status": "completed",
|
||||
"logicalEffectCount": 1,
|
||||
"result": {
|
||||
"commandId": "command_phase3_002",
|
||||
"controllerSeq": 2,
|
||||
"detail": "session bound",
|
||||
"logicalEffectCount": 1,
|
||||
"status": "completed"
|
||||
}
|
||||
},
|
||||
"command_phase3_003": {
|
||||
"commandId": "command_phase3_003",
|
||||
"controllerSeq": 3,
|
||||
"commandDigest": "fnv1a64:fb3b206fe67e1dc8",
|
||||
"status": "completed",
|
||||
"logicalEffectCount": 1,
|
||||
"result": {
|
||||
"commandId": "command_phase3_003",
|
||||
"controllerSeq": 3,
|
||||
"detail": "turn completed",
|
||||
"logicalEffectCount": 1,
|
||||
"status": "completed"
|
||||
}
|
||||
},
|
||||
"command_phase3_004": {
|
||||
"commandId": "command_phase3_004",
|
||||
"controllerSeq": 4,
|
||||
"commandDigest": "fnv1a64:d11bf8308f863bad",
|
||||
"status": "completed",
|
||||
"logicalEffectCount": 1,
|
||||
"result": {
|
||||
"commandId": "command_phase3_004",
|
||||
"controllerSeq": 4,
|
||||
"detail": "runner will stop after durable flush",
|
||||
"logicalEffectCount": 1,
|
||||
"status": "completed"
|
||||
}
|
||||
}
|
||||
},
|
||||
"diagnostics": [
|
||||
"WebSocket connection closed: failed to fill whole buffer"
|
||||
],
|
||||
"backpressure": false,
|
||||
"recoverableFailure": null,
|
||||
"unrecoverableOutcome": null,
|
||||
"harnessGeneration": 1,
|
||||
"stopAfterFlush": true
|
||||
},
|
||||
"commands": [
|
||||
{
|
||||
"schema": "paperclip.prp.command.v1",
|
||||
"commandId": "command_phase3_001",
|
||||
"controllerSeq": 1,
|
||||
"type": "run.prepare",
|
||||
"issuedAt": "2026-08-07T23:30:01.000Z",
|
||||
"payload": {
|
||||
"workspace": "phase-03-durable-fixture"
|
||||
},
|
||||
"status": "completed",
|
||||
"result": {
|
||||
"commandId": "command_phase3_001",
|
||||
"controllerSeq": 1,
|
||||
"detail": "run prepared",
|
||||
"logicalEffectCount": 1,
|
||||
"status": "completed"
|
||||
}
|
||||
},
|
||||
{
|
||||
"schema": "paperclip.prp.command.v1",
|
||||
"commandId": "command_phase3_002",
|
||||
"controllerSeq": 2,
|
||||
"type": "session.open",
|
||||
"issuedAt": "2026-08-07T23:30:02.000Z",
|
||||
"payload": {
|
||||
"reuse": "same_session"
|
||||
},
|
||||
"status": "completed",
|
||||
"result": {
|
||||
"commandId": "command_phase3_002",
|
||||
"controllerSeq": 2,
|
||||
"detail": "session bound",
|
||||
"logicalEffectCount": 1,
|
||||
"status": "completed"
|
||||
}
|
||||
},
|
||||
{
|
||||
"schema": "paperclip.prp.command.v1",
|
||||
"commandId": "command_phase3_003",
|
||||
"controllerSeq": 3,
|
||||
"type": "turn.start",
|
||||
"issuedAt": "2026-08-07T23:30:03.000Z",
|
||||
"payload": {
|
||||
"turnId": "turn_phase3_stable",
|
||||
"text": "Prove Phase 3 durable recovery."
|
||||
},
|
||||
"status": "completed",
|
||||
"result": {
|
||||
"commandId": "command_phase3_003",
|
||||
"controllerSeq": 3,
|
||||
"detail": "turn completed",
|
||||
"logicalEffectCount": 1,
|
||||
"status": "completed"
|
||||
}
|
||||
},
|
||||
{
|
||||
"schema": "paperclip.prp.command.v1",
|
||||
"commandId": "command_phase3_004",
|
||||
"controllerSeq": 4,
|
||||
"type": "runner.shutdown",
|
||||
"issuedAt": "2026-08-07T23:30:04.000Z",
|
||||
"payload": {},
|
||||
"status": "completed",
|
||||
"result": {
|
||||
"commandId": "command_phase3_004",
|
||||
"controllerSeq": 4,
|
||||
"detail": "runner will stop after durable flush",
|
||||
"logicalEffectCount": 1,
|
||||
"status": "completed"
|
||||
}
|
||||
}
|
||||
],
|
||||
"assertions": {
|
||||
"stableIdentity": true,
|
||||
"sourceCursorContinuous": true,
|
||||
"oneLogicalEffectPerAcceptedCommand": true,
|
||||
"noDuplicateLogicalEvents": true,
|
||||
"p0Preserved": true,
|
||||
"boundedStorage": true,
|
||||
"secretsRedacted": true
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,443 @@
|
||||
{
|
||||
"schema": "paperclip.runner.phase3.trace.v1",
|
||||
"diagnostics": {
|
||||
"schema": "paperclip.runner.phase3.diagnostics.v1",
|
||||
"fault": "storage-pressure",
|
||||
"connection": {
|
||||
"state": "stopped",
|
||||
"connectionCount": 1,
|
||||
"reconnectCount": 0,
|
||||
"leaseId": "connection_lease_d78971e6-232f-4e78-955f-9de455589f8c",
|
||||
"leaseExpiresAt": "2026-08-07T23:36:40.583Z"
|
||||
},
|
||||
"identity": {
|
||||
"runnerInstanceId": "runner_phase3_stable",
|
||||
"environmentLeaseId": "environment_lease_phase3_stable",
|
||||
"runId": "run_phase3_stable",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"turnId": "turn_phase3_stable",
|
||||
"itemId": "item_phase3_stable"
|
||||
},
|
||||
"cursors": {
|
||||
"runnerAckedSourceSeq": 5,
|
||||
"runnerNextSourceSeq": 6,
|
||||
"coreAckedSourceSeq": 5,
|
||||
"highestCommittedSourceSeq": 5
|
||||
},
|
||||
"outbox": {
|
||||
"events": 0,
|
||||
"bytes": 0,
|
||||
"peakBytes": 2326,
|
||||
"maxBytes": 16384,
|
||||
"backpressure": true,
|
||||
"p0Committed": 3,
|
||||
"p0Lost": 0
|
||||
},
|
||||
"commands": {
|
||||
"issued": 5,
|
||||
"completed": 4,
|
||||
"rejected": 1,
|
||||
"logicalEffects": 4,
|
||||
"duplicateDeliveries": 0
|
||||
},
|
||||
"recovery": {
|
||||
"replayDeliveries": 4,
|
||||
"runnerRestarts": 0,
|
||||
"harnessRestarts": 0,
|
||||
"malformedFrames": 0,
|
||||
"freshBootstraps": 1,
|
||||
"outcome": "recovered",
|
||||
"reason": "storage_pressure_completed"
|
||||
},
|
||||
"security": {
|
||||
"bootstrapTicketPersisted": false,
|
||||
"connectionLeaseTokenPersisted": false,
|
||||
"secretLeakCount": 0
|
||||
},
|
||||
"committedEvents": [
|
||||
{
|
||||
"sourceSeq": 1,
|
||||
"sourceEventId": "event_runner_phase3_stable_000001",
|
||||
"eventType": "workspace.ready",
|
||||
"priority": 1,
|
||||
"envelope": {
|
||||
"envelopeId": "envelope_event_000001",
|
||||
"kind": "event",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"emittedAt": "2026-08-07T23:00:00.001Z",
|
||||
"eventType": "workspace.ready",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"workspace": "phase-03-durable-fixture"
|
||||
},
|
||||
"priority": 1,
|
||||
"runId": "run_phase3_stable",
|
||||
"schema": "paperclip.prp.event.v1",
|
||||
"schemaVersion": 1,
|
||||
"sourceEventId": "event_runner_phase3_stable_000001",
|
||||
"sourceInstanceId": "runner_phase3_stable",
|
||||
"sourceKind": "runner",
|
||||
"sourceSeq": 1,
|
||||
"turnId": "turn_phase3_stable"
|
||||
},
|
||||
"protocol": "paperclip.runner",
|
||||
"runId": "run_phase3_stable",
|
||||
"runnerInstanceId": "runner_phase3_stable",
|
||||
"sentAt": "2026-08-07T23:00:00.001Z",
|
||||
"turnId": "turn_phase3_stable",
|
||||
"version": 1
|
||||
},
|
||||
"deliveryCount": 2,
|
||||
"logicalEffectCount": 1
|
||||
},
|
||||
{
|
||||
"sourceSeq": 2,
|
||||
"sourceEventId": "event_runner_phase3_stable_000002",
|
||||
"eventType": "session.started",
|
||||
"priority": 0,
|
||||
"envelope": {
|
||||
"envelopeId": "envelope_event_000002",
|
||||
"kind": "event",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"emittedAt": "2026-08-07T23:00:00.002Z",
|
||||
"eventType": "session.started",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"driverSessionId": "driver_phase3_fake",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"resumed": false
|
||||
},
|
||||
"priority": 0,
|
||||
"runId": "run_phase3_stable",
|
||||
"schema": "paperclip.prp.event.v1",
|
||||
"schemaVersion": 1,
|
||||
"sourceEventId": "event_runner_phase3_stable_000002",
|
||||
"sourceInstanceId": "runner_phase3_stable",
|
||||
"sourceKind": "runner",
|
||||
"sourceSeq": 2,
|
||||
"turnId": "turn_phase3_stable"
|
||||
},
|
||||
"protocol": "paperclip.runner",
|
||||
"runId": "run_phase3_stable",
|
||||
"runnerInstanceId": "runner_phase3_stable",
|
||||
"sentAt": "2026-08-07T23:00:00.002Z",
|
||||
"turnId": "turn_phase3_stable",
|
||||
"version": 1
|
||||
},
|
||||
"deliveryCount": 2,
|
||||
"logicalEffectCount": 1
|
||||
},
|
||||
{
|
||||
"sourceSeq": 3,
|
||||
"sourceEventId": "event_runner_phase3_stable_000003",
|
||||
"eventType": "item.delta",
|
||||
"priority": 2,
|
||||
"envelope": {
|
||||
"envelopeId": "envelope_event_000003",
|
||||
"kind": "event",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"emittedAt": "2026-08-07T23:00:00.003Z",
|
||||
"eventType": "item.delta",
|
||||
"itemId": "item_phase3_stable",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"coalescedCount": 250,
|
||||
"latest": {
|
||||
"chunk": "bounded-progress-249",
|
||||
"secretToken": "[REDACTED]"
|
||||
}
|
||||
},
|
||||
"priority": 2,
|
||||
"runId": "run_phase3_stable",
|
||||
"schema": "paperclip.prp.event.v1",
|
||||
"schemaVersion": 1,
|
||||
"sourceEventId": "event_runner_phase3_stable_000003",
|
||||
"sourceInstanceId": "runner_phase3_stable",
|
||||
"sourceKind": "runner",
|
||||
"sourceSeq": 3,
|
||||
"turnId": "turn_phase3_stable"
|
||||
},
|
||||
"protocol": "paperclip.runner",
|
||||
"runId": "run_phase3_stable",
|
||||
"runnerInstanceId": "runner_phase3_stable",
|
||||
"sentAt": "2026-08-07T23:00:00.003Z",
|
||||
"turnId": "turn_phase3_stable",
|
||||
"version": 1
|
||||
},
|
||||
"deliveryCount": 2,
|
||||
"logicalEffectCount": 1
|
||||
},
|
||||
{
|
||||
"sourceSeq": 4,
|
||||
"sourceEventId": "event_runner_phase3_stable_000004",
|
||||
"eventType": "runner.backpressure",
|
||||
"priority": 0,
|
||||
"envelope": {
|
||||
"envelopeId": "envelope_event_000004",
|
||||
"kind": "event",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"emittedAt": "2026-08-07T23:00:00.004Z",
|
||||
"eventType": "runner.backpressure",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"maxOutboxBytes": 16384,
|
||||
"newTurnsAccepted": false,
|
||||
"p0ReserveBytes": 8192,
|
||||
"reason": "outbox_soft_limit"
|
||||
},
|
||||
"priority": 0,
|
||||
"runId": "run_phase3_stable",
|
||||
"schema": "paperclip.prp.event.v1",
|
||||
"schemaVersion": 1,
|
||||
"sourceEventId": "event_runner_phase3_stable_000004",
|
||||
"sourceInstanceId": "runner_phase3_stable",
|
||||
"sourceKind": "runner",
|
||||
"sourceSeq": 4,
|
||||
"turnId": "turn_phase3_stable"
|
||||
},
|
||||
"protocol": "paperclip.runner",
|
||||
"runId": "run_phase3_stable",
|
||||
"runnerInstanceId": "runner_phase3_stable",
|
||||
"sentAt": "2026-08-07T23:00:00.004Z",
|
||||
"turnId": "turn_phase3_stable",
|
||||
"version": 1
|
||||
},
|
||||
"deliveryCount": 2,
|
||||
"logicalEffectCount": 1
|
||||
},
|
||||
{
|
||||
"sourceSeq": 5,
|
||||
"sourceEventId": "event_runner_phase3_stable_000005",
|
||||
"eventType": "runner.stopped",
|
||||
"priority": 0,
|
||||
"envelope": {
|
||||
"envelopeId": "envelope_event_000005",
|
||||
"kind": "event",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"emittedAt": "2026-08-07T23:00:00.005Z",
|
||||
"eventType": "runner.stopped",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"afterDurableFlush": true
|
||||
},
|
||||
"priority": 0,
|
||||
"runId": "run_phase3_stable",
|
||||
"schema": "paperclip.prp.event.v1",
|
||||
"schemaVersion": 1,
|
||||
"sourceEventId": "event_runner_phase3_stable_000005",
|
||||
"sourceInstanceId": "runner_phase3_stable",
|
||||
"sourceKind": "runner",
|
||||
"sourceSeq": 5,
|
||||
"turnId": "turn_phase3_stable"
|
||||
},
|
||||
"protocol": "paperclip.runner",
|
||||
"runId": "run_phase3_stable",
|
||||
"runnerInstanceId": "runner_phase3_stable",
|
||||
"sentAt": "2026-08-07T23:00:00.005Z",
|
||||
"turnId": "turn_phase3_stable",
|
||||
"version": 1
|
||||
},
|
||||
"deliveryCount": 1,
|
||||
"logicalEffectCount": 1
|
||||
}
|
||||
]
|
||||
},
|
||||
"runnerState": {
|
||||
"schema": "paperclip.runner.phase3.state.v1",
|
||||
"runnerInstanceId": "runner_phase3_stable",
|
||||
"environmentLeaseId": "environment_lease_phase3_stable",
|
||||
"runId": "run_phase3_stable",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"turnId": "turn_phase3_stable",
|
||||
"itemId": "item_phase3_stable",
|
||||
"lifecycle": "stopped",
|
||||
"nextSourceSeq": 6,
|
||||
"ackedSourceSeq": 5,
|
||||
"lastControllerCommandSeq": 5,
|
||||
"reconnectCount": 0,
|
||||
"maxOutboxBytes": 16384,
|
||||
"peakOutboxBytes": 2326,
|
||||
"outbox": [],
|
||||
"processedCommands": {
|
||||
"command_phase3_001": {
|
||||
"commandId": "command_phase3_001",
|
||||
"controllerSeq": 1,
|
||||
"commandDigest": "fnv1a64:c19dfbbf86a3dbb4",
|
||||
"status": "completed",
|
||||
"logicalEffectCount": 1,
|
||||
"result": {
|
||||
"commandId": "command_phase3_001",
|
||||
"controllerSeq": 1,
|
||||
"detail": "run prepared",
|
||||
"logicalEffectCount": 1,
|
||||
"status": "completed"
|
||||
}
|
||||
},
|
||||
"command_phase3_002": {
|
||||
"commandId": "command_phase3_002",
|
||||
"controllerSeq": 2,
|
||||
"commandDigest": "fnv1a64:b5198f3ce67ce88e",
|
||||
"status": "completed",
|
||||
"logicalEffectCount": 1,
|
||||
"result": {
|
||||
"commandId": "command_phase3_002",
|
||||
"controllerSeq": 2,
|
||||
"detail": "session bound",
|
||||
"logicalEffectCount": 1,
|
||||
"status": "completed"
|
||||
}
|
||||
},
|
||||
"command_phase3_003": {
|
||||
"commandId": "command_phase3_003",
|
||||
"controllerSeq": 3,
|
||||
"commandDigest": "fnv1a64:778efd982aadc99f",
|
||||
"status": "completed",
|
||||
"logicalEffectCount": 1,
|
||||
"result": {
|
||||
"commandId": "command_phase3_003",
|
||||
"controllerSeq": 3,
|
||||
"detail": "storage pressure applied with P2 coalescing",
|
||||
"logicalEffectCount": 1,
|
||||
"status": "completed"
|
||||
}
|
||||
},
|
||||
"command_phase3_004": {
|
||||
"commandId": "command_phase3_004",
|
||||
"controllerSeq": 4,
|
||||
"commandDigest": "fnv1a64:34d91505a30f60fb",
|
||||
"status": "rejected",
|
||||
"logicalEffectCount": 0,
|
||||
"result": {
|
||||
"commandId": "command_phase3_004",
|
||||
"controllerSeq": 4,
|
||||
"detail": "new turns are disabled while draining or backpressured",
|
||||
"logicalEffectCount": 0,
|
||||
"status": "rejected"
|
||||
}
|
||||
},
|
||||
"command_phase3_005": {
|
||||
"commandId": "command_phase3_005",
|
||||
"controllerSeq": 5,
|
||||
"commandDigest": "fnv1a64:533318a30fba6d22",
|
||||
"status": "completed",
|
||||
"logicalEffectCount": 1,
|
||||
"result": {
|
||||
"commandId": "command_phase3_005",
|
||||
"controllerSeq": 5,
|
||||
"detail": "runner will stop after durable flush",
|
||||
"logicalEffectCount": 1,
|
||||
"status": "completed"
|
||||
}
|
||||
}
|
||||
},
|
||||
"diagnostics": [],
|
||||
"backpressure": true,
|
||||
"recoverableFailure": null,
|
||||
"unrecoverableOutcome": null,
|
||||
"harnessGeneration": 1,
|
||||
"stopAfterFlush": true
|
||||
},
|
||||
"commands": [
|
||||
{
|
||||
"schema": "paperclip.prp.command.v1",
|
||||
"commandId": "command_phase3_001",
|
||||
"controllerSeq": 1,
|
||||
"type": "run.prepare",
|
||||
"issuedAt": "2026-08-07T23:30:01.000Z",
|
||||
"payload": {
|
||||
"workspace": "phase-03-durable-fixture"
|
||||
},
|
||||
"status": "completed",
|
||||
"result": {
|
||||
"commandId": "command_phase3_001",
|
||||
"controllerSeq": 1,
|
||||
"detail": "run prepared",
|
||||
"logicalEffectCount": 1,
|
||||
"status": "completed"
|
||||
}
|
||||
},
|
||||
{
|
||||
"schema": "paperclip.prp.command.v1",
|
||||
"commandId": "command_phase3_002",
|
||||
"controllerSeq": 2,
|
||||
"type": "session.open",
|
||||
"issuedAt": "2026-08-07T23:30:02.000Z",
|
||||
"payload": {
|
||||
"reuse": "same_session"
|
||||
},
|
||||
"status": "completed",
|
||||
"result": {
|
||||
"commandId": "command_phase3_002",
|
||||
"controllerSeq": 2,
|
||||
"detail": "session bound",
|
||||
"logicalEffectCount": 1,
|
||||
"status": "completed"
|
||||
}
|
||||
},
|
||||
{
|
||||
"schema": "paperclip.prp.command.v1",
|
||||
"commandId": "command_phase3_003",
|
||||
"controllerSeq": 3,
|
||||
"type": "fault.storage_pressure",
|
||||
"issuedAt": "2026-08-07T23:30:03.000Z",
|
||||
"payload": {},
|
||||
"status": "completed",
|
||||
"result": {
|
||||
"commandId": "command_phase3_003",
|
||||
"controllerSeq": 3,
|
||||
"detail": "storage pressure applied with P2 coalescing",
|
||||
"logicalEffectCount": 1,
|
||||
"status": "completed"
|
||||
}
|
||||
},
|
||||
{
|
||||
"schema": "paperclip.prp.command.v1",
|
||||
"commandId": "command_phase3_004",
|
||||
"controllerSeq": 4,
|
||||
"type": "turn.start",
|
||||
"issuedAt": "2026-08-07T23:30:04.000Z",
|
||||
"payload": {
|
||||
"turnId": "turn_phase3_stable",
|
||||
"text": "Prove Phase 3 durable recovery."
|
||||
},
|
||||
"status": "rejected",
|
||||
"result": {
|
||||
"commandId": "command_phase3_004",
|
||||
"controllerSeq": 4,
|
||||
"detail": "new turns are disabled while draining or backpressured",
|
||||
"logicalEffectCount": 0,
|
||||
"status": "rejected"
|
||||
}
|
||||
},
|
||||
{
|
||||
"schema": "paperclip.prp.command.v1",
|
||||
"commandId": "command_phase3_005",
|
||||
"controllerSeq": 5,
|
||||
"type": "runner.shutdown",
|
||||
"issuedAt": "2026-08-07T23:30:05.000Z",
|
||||
"payload": {},
|
||||
"status": "completed",
|
||||
"result": {
|
||||
"commandId": "command_phase3_005",
|
||||
"controllerSeq": 5,
|
||||
"detail": "runner will stop after durable flush",
|
||||
"logicalEffectCount": 1,
|
||||
"status": "completed"
|
||||
}
|
||||
}
|
||||
],
|
||||
"assertions": {
|
||||
"stableIdentity": true,
|
||||
"sourceCursorContinuous": true,
|
||||
"oneLogicalEffectPerAcceptedCommand": true,
|
||||
"noDuplicateLogicalEvents": true,
|
||||
"p0Preserved": true,
|
||||
"boundedStorage": true,
|
||||
"secretsRedacted": true
|
||||
}
|
||||
}
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 68 KiB |
@@ -0,0 +1,561 @@
|
||||
{
|
||||
"schema": "paperclip.runner.phase3.trace.v1",
|
||||
"diagnostics": {
|
||||
"schema": "paperclip.runner.phase3.diagnostics.v1",
|
||||
"fault": "lost-ack",
|
||||
"connection": {
|
||||
"state": "stopped",
|
||||
"connectionCount": 2,
|
||||
"reconnectCount": 1,
|
||||
"leaseId": "connection_lease_db423713-98d6-4a86-940b-ec2f0f6cd6e3",
|
||||
"leaseExpiresAt": "2026-08-07T23:36:38.759Z"
|
||||
},
|
||||
"identity": {
|
||||
"runnerInstanceId": "runner_phase3_stable",
|
||||
"environmentLeaseId": "environment_lease_phase3_stable",
|
||||
"runId": "run_phase3_stable",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"turnId": "turn_phase3_stable",
|
||||
"itemId": "item_phase3_stable"
|
||||
},
|
||||
"cursors": {
|
||||
"runnerAckedSourceSeq": 9,
|
||||
"runnerNextSourceSeq": 10,
|
||||
"coreAckedSourceSeq": 9,
|
||||
"highestCommittedSourceSeq": 9
|
||||
},
|
||||
"outbox": {
|
||||
"events": 0,
|
||||
"bytes": 0,
|
||||
"peakBytes": 6023,
|
||||
"maxBytes": 65536,
|
||||
"backpressure": false,
|
||||
"p0Committed": 5,
|
||||
"p0Lost": 0
|
||||
},
|
||||
"commands": {
|
||||
"issued": 4,
|
||||
"completed": 4,
|
||||
"rejected": 0,
|
||||
"logicalEffects": 4,
|
||||
"duplicateDeliveries": 1
|
||||
},
|
||||
"recovery": {
|
||||
"replayDeliveries": 9,
|
||||
"runnerRestarts": 0,
|
||||
"harnessRestarts": 0,
|
||||
"malformedFrames": 0,
|
||||
"freshBootstraps": 1,
|
||||
"outcome": "recovered",
|
||||
"reason": "lost_ack_completed"
|
||||
},
|
||||
"security": {
|
||||
"bootstrapTicketPersisted": false,
|
||||
"connectionLeaseTokenPersisted": false,
|
||||
"secretLeakCount": 0
|
||||
},
|
||||
"committedEvents": [
|
||||
{
|
||||
"sourceSeq": 1,
|
||||
"sourceEventId": "event_runner_phase3_stable_000001",
|
||||
"eventType": "workspace.ready",
|
||||
"priority": 1,
|
||||
"envelope": {
|
||||
"envelopeId": "envelope_event_000001",
|
||||
"kind": "event",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"emittedAt": "2026-08-07T23:00:00.001Z",
|
||||
"eventType": "workspace.ready",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"workspace": "phase-03-durable-fixture"
|
||||
},
|
||||
"priority": 1,
|
||||
"runId": "run_phase3_stable",
|
||||
"schema": "paperclip.prp.event.v1",
|
||||
"schemaVersion": 1,
|
||||
"sourceEventId": "event_runner_phase3_stable_000001",
|
||||
"sourceInstanceId": "runner_phase3_stable",
|
||||
"sourceKind": "runner",
|
||||
"sourceSeq": 1,
|
||||
"turnId": "turn_phase3_stable"
|
||||
},
|
||||
"protocol": "paperclip.runner",
|
||||
"runId": "run_phase3_stable",
|
||||
"runnerInstanceId": "runner_phase3_stable",
|
||||
"sentAt": "2026-08-07T23:00:00.001Z",
|
||||
"turnId": "turn_phase3_stable",
|
||||
"version": 1
|
||||
},
|
||||
"deliveryCount": 3,
|
||||
"logicalEffectCount": 1
|
||||
},
|
||||
{
|
||||
"sourceSeq": 2,
|
||||
"sourceEventId": "event_runner_phase3_stable_000002",
|
||||
"eventType": "session.started",
|
||||
"priority": 0,
|
||||
"envelope": {
|
||||
"envelopeId": "envelope_event_000002",
|
||||
"kind": "event",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"emittedAt": "2026-08-07T23:00:00.002Z",
|
||||
"eventType": "session.started",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"driverSessionId": "driver_phase3_fake",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"resumed": false
|
||||
},
|
||||
"priority": 0,
|
||||
"runId": "run_phase3_stable",
|
||||
"schema": "paperclip.prp.event.v1",
|
||||
"schemaVersion": 1,
|
||||
"sourceEventId": "event_runner_phase3_stable_000002",
|
||||
"sourceInstanceId": "runner_phase3_stable",
|
||||
"sourceKind": "runner",
|
||||
"sourceSeq": 2,
|
||||
"turnId": "turn_phase3_stable"
|
||||
},
|
||||
"protocol": "paperclip.runner",
|
||||
"runId": "run_phase3_stable",
|
||||
"runnerInstanceId": "runner_phase3_stable",
|
||||
"sentAt": "2026-08-07T23:00:00.002Z",
|
||||
"turnId": "turn_phase3_stable",
|
||||
"version": 1
|
||||
},
|
||||
"deliveryCount": 2,
|
||||
"logicalEffectCount": 1
|
||||
},
|
||||
{
|
||||
"sourceSeq": 3,
|
||||
"sourceEventId": "event_runner_phase3_stable_000003",
|
||||
"eventType": "turn.accepted",
|
||||
"priority": 0,
|
||||
"envelope": {
|
||||
"envelopeId": "envelope_event_000003",
|
||||
"kind": "event",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"emittedAt": "2026-08-07T23:00:00.003Z",
|
||||
"eventType": "turn.accepted",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"sameSession": true,
|
||||
"turnId": "turn_phase3_stable"
|
||||
},
|
||||
"priority": 0,
|
||||
"runId": "run_phase3_stable",
|
||||
"schema": "paperclip.prp.event.v1",
|
||||
"schemaVersion": 1,
|
||||
"sourceEventId": "event_runner_phase3_stable_000003",
|
||||
"sourceInstanceId": "runner_phase3_stable",
|
||||
"sourceKind": "runner",
|
||||
"sourceSeq": 3,
|
||||
"turnId": "turn_phase3_stable"
|
||||
},
|
||||
"protocol": "paperclip.runner",
|
||||
"runId": "run_phase3_stable",
|
||||
"runnerInstanceId": "runner_phase3_stable",
|
||||
"sentAt": "2026-08-07T23:00:00.003Z",
|
||||
"turnId": "turn_phase3_stable",
|
||||
"version": 1
|
||||
},
|
||||
"deliveryCount": 2,
|
||||
"logicalEffectCount": 1
|
||||
},
|
||||
{
|
||||
"sourceSeq": 4,
|
||||
"sourceEventId": "event_runner_phase3_stable_000004",
|
||||
"eventType": "item.started",
|
||||
"priority": 1,
|
||||
"envelope": {
|
||||
"envelopeId": "envelope_event_000004",
|
||||
"kind": "event",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"emittedAt": "2026-08-07T23:00:00.004Z",
|
||||
"eventType": "item.started",
|
||||
"itemId": "item_phase3_stable",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"kind": "assistant_message"
|
||||
},
|
||||
"priority": 1,
|
||||
"runId": "run_phase3_stable",
|
||||
"schema": "paperclip.prp.event.v1",
|
||||
"schemaVersion": 1,
|
||||
"sourceEventId": "event_runner_phase3_stable_000004",
|
||||
"sourceInstanceId": "runner_phase3_stable",
|
||||
"sourceKind": "runner",
|
||||
"sourceSeq": 4,
|
||||
"turnId": "turn_phase3_stable"
|
||||
},
|
||||
"protocol": "paperclip.runner",
|
||||
"runId": "run_phase3_stable",
|
||||
"runnerInstanceId": "runner_phase3_stable",
|
||||
"sentAt": "2026-08-07T23:00:00.004Z",
|
||||
"turnId": "turn_phase3_stable",
|
||||
"version": 1
|
||||
},
|
||||
"deliveryCount": 2,
|
||||
"logicalEffectCount": 1
|
||||
},
|
||||
{
|
||||
"sourceSeq": 5,
|
||||
"sourceEventId": "event_runner_phase3_stable_000005",
|
||||
"eventType": "item.delta",
|
||||
"priority": 2,
|
||||
"envelope": {
|
||||
"envelopeId": "envelope_event_000005",
|
||||
"kind": "event",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"emittedAt": "2026-08-07T23:00:00.005Z",
|
||||
"eventType": "item.delta",
|
||||
"itemId": "item_phase3_stable",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"text": "Prove Phase 3 durable recovery."
|
||||
},
|
||||
"priority": 2,
|
||||
"runId": "run_phase3_stable",
|
||||
"schema": "paperclip.prp.event.v1",
|
||||
"schemaVersion": 1,
|
||||
"sourceEventId": "event_runner_phase3_stable_000005",
|
||||
"sourceInstanceId": "runner_phase3_stable",
|
||||
"sourceKind": "runner",
|
||||
"sourceSeq": 5,
|
||||
"turnId": "turn_phase3_stable"
|
||||
},
|
||||
"protocol": "paperclip.runner",
|
||||
"runId": "run_phase3_stable",
|
||||
"runnerInstanceId": "runner_phase3_stable",
|
||||
"sentAt": "2026-08-07T23:00:00.005Z",
|
||||
"turnId": "turn_phase3_stable",
|
||||
"version": 1
|
||||
},
|
||||
"deliveryCount": 2,
|
||||
"logicalEffectCount": 1
|
||||
},
|
||||
{
|
||||
"sourceSeq": 6,
|
||||
"sourceEventId": "event_runner_phase3_stable_000006",
|
||||
"eventType": "item.completed",
|
||||
"priority": 1,
|
||||
"envelope": {
|
||||
"envelopeId": "envelope_event_000006",
|
||||
"kind": "event",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"emittedAt": "2026-08-07T23:00:00.006Z",
|
||||
"eventType": "item.completed",
|
||||
"itemId": "item_phase3_stable",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"text": "Durable recovery completed."
|
||||
},
|
||||
"priority": 1,
|
||||
"runId": "run_phase3_stable",
|
||||
"schema": "paperclip.prp.event.v1",
|
||||
"schemaVersion": 1,
|
||||
"sourceEventId": "event_runner_phase3_stable_000006",
|
||||
"sourceInstanceId": "runner_phase3_stable",
|
||||
"sourceKind": "runner",
|
||||
"sourceSeq": 6,
|
||||
"turnId": "turn_phase3_stable"
|
||||
},
|
||||
"protocol": "paperclip.runner",
|
||||
"runId": "run_phase3_stable",
|
||||
"runnerInstanceId": "runner_phase3_stable",
|
||||
"sentAt": "2026-08-07T23:00:00.006Z",
|
||||
"turnId": "turn_phase3_stable",
|
||||
"version": 1
|
||||
},
|
||||
"deliveryCount": 2,
|
||||
"logicalEffectCount": 1
|
||||
},
|
||||
{
|
||||
"sourceSeq": 7,
|
||||
"sourceEventId": "event_runner_phase3_stable_000007",
|
||||
"eventType": "run.result.proposed",
|
||||
"priority": 0,
|
||||
"envelope": {
|
||||
"envelopeId": "envelope_event_000007",
|
||||
"kind": "event",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"emittedAt": "2026-08-07T23:00:00.007Z",
|
||||
"eventType": "run.result.proposed",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"reportedWorkDisposition": "done",
|
||||
"schema": "paperclip.prp.result.v1",
|
||||
"status": "succeeded",
|
||||
"summary": "Phase 3 durable transport recovered without duplicate effects."
|
||||
},
|
||||
"priority": 0,
|
||||
"runId": "run_phase3_stable",
|
||||
"schema": "paperclip.prp.event.v1",
|
||||
"schemaVersion": 1,
|
||||
"sourceEventId": "event_runner_phase3_stable_000007",
|
||||
"sourceInstanceId": "runner_phase3_stable",
|
||||
"sourceKind": "runner",
|
||||
"sourceSeq": 7,
|
||||
"turnId": "turn_phase3_stable"
|
||||
},
|
||||
"protocol": "paperclip.runner",
|
||||
"runId": "run_phase3_stable",
|
||||
"runnerInstanceId": "runner_phase3_stable",
|
||||
"sentAt": "2026-08-07T23:00:00.007Z",
|
||||
"turnId": "turn_phase3_stable",
|
||||
"version": 1
|
||||
},
|
||||
"deliveryCount": 2,
|
||||
"logicalEffectCount": 1
|
||||
},
|
||||
{
|
||||
"sourceSeq": 8,
|
||||
"sourceEventId": "event_runner_phase3_stable_000008",
|
||||
"eventType": "run.terminal",
|
||||
"priority": 0,
|
||||
"envelope": {
|
||||
"envelopeId": "envelope_event_000008",
|
||||
"kind": "event",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"emittedAt": "2026-08-07T23:00:00.008Z",
|
||||
"eventType": "run.terminal",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"reportedWorkDisposition": "done",
|
||||
"runTerminalState": "succeeded",
|
||||
"schema": "paperclip.prp.terminal.v1",
|
||||
"turnTerminalState": "completed"
|
||||
},
|
||||
"priority": 0,
|
||||
"runId": "run_phase3_stable",
|
||||
"schema": "paperclip.prp.event.v1",
|
||||
"schemaVersion": 1,
|
||||
"sourceEventId": "event_runner_phase3_stable_000008",
|
||||
"sourceInstanceId": "runner_phase3_stable",
|
||||
"sourceKind": "runner",
|
||||
"sourceSeq": 8,
|
||||
"turnId": "turn_phase3_stable"
|
||||
},
|
||||
"protocol": "paperclip.runner",
|
||||
"runId": "run_phase3_stable",
|
||||
"runnerInstanceId": "runner_phase3_stable",
|
||||
"sentAt": "2026-08-07T23:00:00.008Z",
|
||||
"turnId": "turn_phase3_stable",
|
||||
"version": 1
|
||||
},
|
||||
"deliveryCount": 2,
|
||||
"logicalEffectCount": 1
|
||||
},
|
||||
{
|
||||
"sourceSeq": 9,
|
||||
"sourceEventId": "event_runner_phase3_stable_000009",
|
||||
"eventType": "runner.stopped",
|
||||
"priority": 0,
|
||||
"envelope": {
|
||||
"envelopeId": "envelope_event_000009",
|
||||
"kind": "event",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"emittedAt": "2026-08-07T23:00:00.009Z",
|
||||
"eventType": "runner.stopped",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"payload": {
|
||||
"afterDurableFlush": true
|
||||
},
|
||||
"priority": 0,
|
||||
"runId": "run_phase3_stable",
|
||||
"schema": "paperclip.prp.event.v1",
|
||||
"schemaVersion": 1,
|
||||
"sourceEventId": "event_runner_phase3_stable_000009",
|
||||
"sourceInstanceId": "runner_phase3_stable",
|
||||
"sourceKind": "runner",
|
||||
"sourceSeq": 9,
|
||||
"turnId": "turn_phase3_stable"
|
||||
},
|
||||
"protocol": "paperclip.runner",
|
||||
"runId": "run_phase3_stable",
|
||||
"runnerInstanceId": "runner_phase3_stable",
|
||||
"sentAt": "2026-08-07T23:00:00.009Z",
|
||||
"turnId": "turn_phase3_stable",
|
||||
"version": 1
|
||||
},
|
||||
"deliveryCount": 1,
|
||||
"logicalEffectCount": 1
|
||||
}
|
||||
]
|
||||
},
|
||||
"runnerState": {
|
||||
"schema": "paperclip.runner.phase3.state.v1",
|
||||
"runnerInstanceId": "runner_phase3_stable",
|
||||
"environmentLeaseId": "environment_lease_phase3_stable",
|
||||
"runId": "run_phase3_stable",
|
||||
"normalizedSessionId": "session_phase3_stable",
|
||||
"turnId": "turn_phase3_stable",
|
||||
"itemId": "item_phase3_stable",
|
||||
"lifecycle": "stopped",
|
||||
"nextSourceSeq": 10,
|
||||
"ackedSourceSeq": 9,
|
||||
"lastControllerCommandSeq": 4,
|
||||
"reconnectCount": 1,
|
||||
"maxOutboxBytes": 65536,
|
||||
"peakOutboxBytes": 6023,
|
||||
"outbox": [],
|
||||
"processedCommands": {
|
||||
"command_phase3_001": {
|
||||
"commandId": "command_phase3_001",
|
||||
"controllerSeq": 1,
|
||||
"commandDigest": "fnv1a64:c19dfbbf86a3dbb4",
|
||||
"status": "completed",
|
||||
"logicalEffectCount": 1,
|
||||
"result": {
|
||||
"commandId": "command_phase3_001",
|
||||
"controllerSeq": 1,
|
||||
"detail": "run prepared",
|
||||
"logicalEffectCount": 1,
|
||||
"status": "completed"
|
||||
}
|
||||
},
|
||||
"command_phase3_002": {
|
||||
"commandId": "command_phase3_002",
|
||||
"controllerSeq": 2,
|
||||
"commandDigest": "fnv1a64:b5198f3ce67ce88e",
|
||||
"status": "completed",
|
||||
"logicalEffectCount": 1,
|
||||
"result": {
|
||||
"commandId": "command_phase3_002",
|
||||
"controllerSeq": 2,
|
||||
"detail": "session bound",
|
||||
"logicalEffectCount": 1,
|
||||
"status": "completed"
|
||||
}
|
||||
},
|
||||
"command_phase3_003": {
|
||||
"commandId": "command_phase3_003",
|
||||
"controllerSeq": 3,
|
||||
"commandDigest": "fnv1a64:fb3b206fe67e1dc8",
|
||||
"status": "completed",
|
||||
"logicalEffectCount": 1,
|
||||
"result": {
|
||||
"commandId": "command_phase3_003",
|
||||
"controllerSeq": 3,
|
||||
"detail": "turn completed",
|
||||
"logicalEffectCount": 1,
|
||||
"status": "completed"
|
||||
}
|
||||
},
|
||||
"command_phase3_004": {
|
||||
"commandId": "command_phase3_004",
|
||||
"controllerSeq": 4,
|
||||
"commandDigest": "fnv1a64:d11bf8308f863bad",
|
||||
"status": "completed",
|
||||
"logicalEffectCount": 1,
|
||||
"result": {
|
||||
"commandId": "command_phase3_004",
|
||||
"controllerSeq": 4,
|
||||
"detail": "runner will stop after durable flush",
|
||||
"logicalEffectCount": 1,
|
||||
"status": "completed"
|
||||
}
|
||||
}
|
||||
},
|
||||
"diagnostics": [
|
||||
"WebSocket frame write failed: Broken pipe (os error 32)"
|
||||
],
|
||||
"backpressure": false,
|
||||
"recoverableFailure": null,
|
||||
"unrecoverableOutcome": null,
|
||||
"harnessGeneration": 1,
|
||||
"stopAfterFlush": true
|
||||
},
|
||||
"commands": [
|
||||
{
|
||||
"schema": "paperclip.prp.command.v1",
|
||||
"commandId": "command_phase3_001",
|
||||
"controllerSeq": 1,
|
||||
"type": "run.prepare",
|
||||
"issuedAt": "2026-08-07T23:30:01.000Z",
|
||||
"payload": {
|
||||
"workspace": "phase-03-durable-fixture"
|
||||
},
|
||||
"status": "completed",
|
||||
"result": {
|
||||
"commandId": "command_phase3_001",
|
||||
"controllerSeq": 1,
|
||||
"detail": "run prepared",
|
||||
"logicalEffectCount": 1,
|
||||
"status": "completed"
|
||||
}
|
||||
},
|
||||
{
|
||||
"schema": "paperclip.prp.command.v1",
|
||||
"commandId": "command_phase3_002",
|
||||
"controllerSeq": 2,
|
||||
"type": "session.open",
|
||||
"issuedAt": "2026-08-07T23:30:02.000Z",
|
||||
"payload": {
|
||||
"reuse": "same_session"
|
||||
},
|
||||
"status": "completed",
|
||||
"result": {
|
||||
"commandId": "command_phase3_002",
|
||||
"controllerSeq": 2,
|
||||
"detail": "session bound",
|
||||
"logicalEffectCount": 1,
|
||||
"status": "completed"
|
||||
}
|
||||
},
|
||||
{
|
||||
"schema": "paperclip.prp.command.v1",
|
||||
"commandId": "command_phase3_003",
|
||||
"controllerSeq": 3,
|
||||
"type": "turn.start",
|
||||
"issuedAt": "2026-08-07T23:30:03.000Z",
|
||||
"payload": {
|
||||
"turnId": "turn_phase3_stable",
|
||||
"text": "Prove Phase 3 durable recovery."
|
||||
},
|
||||
"status": "completed",
|
||||
"result": {
|
||||
"commandId": "command_phase3_003",
|
||||
"controllerSeq": 3,
|
||||
"detail": "turn completed",
|
||||
"logicalEffectCount": 1,
|
||||
"status": "completed"
|
||||
}
|
||||
},
|
||||
{
|
||||
"schema": "paperclip.prp.command.v1",
|
||||
"commandId": "command_phase3_004",
|
||||
"controllerSeq": 4,
|
||||
"type": "runner.shutdown",
|
||||
"issuedAt": "2026-08-07T23:30:04.000Z",
|
||||
"payload": {},
|
||||
"status": "completed",
|
||||
"result": {
|
||||
"commandId": "command_phase3_004",
|
||||
"controllerSeq": 4,
|
||||
"detail": "runner will stop after durable flush",
|
||||
"logicalEffectCount": 1,
|
||||
"status": "completed"
|
||||
}
|
||||
}
|
||||
],
|
||||
"assertions": {
|
||||
"stableIdentity": true,
|
||||
"sourceCursorContinuous": true,
|
||||
"oneLogicalEffectPerAcceptedCommand": true,
|
||||
"noDuplicateLogicalEvents": true,
|
||||
"p0Preserved": true,
|
||||
"boundedStorage": true,
|
||||
"secretsRedacted": true
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,69 @@
|
||||
---
|
||||
type: Engineering Journal Entry
|
||||
title: Phase 3 durable outbound transport and recovery
|
||||
description: Decisions and evidence for WebSocket authentication, durable replay, restart recovery, and redacted diagnostics.
|
||||
tags: [native-runner, phase-3, websocket, outbox, replay, recovery]
|
||||
status: stable
|
||||
generated: { by: openai/gpt-5, at: 2026-08-07T23:31:00Z }
|
||||
entry_kind: phase
|
||||
phase: "3"
|
||||
---
|
||||
|
||||
# Context
|
||||
|
||||
Phase 3 proves network recovery before a real model driver or production control-plane connection exists.
|
||||
|
||||
# Decisions
|
||||
|
||||
1. Use a real loopback WebSocket. Keep the mock core and all state inside the package.
|
||||
2. Use a one-time bootstrap ticket. Exchange it for a connection lease on the first connection.
|
||||
3. Write events before network delivery. Remove events only after a cumulative acknowledgement.
|
||||
4. Keep event IDs and command IDs stable across reconnect and restart.
|
||||
5. Store processed command IDs with the outbox. Repeated commands do not repeat effects.
|
||||
6. Protect P0 events when the outbox reaches its limit.
|
||||
7. Use a private atomic JSON state file for the tracer. Do not store the bootstrap ticket.
|
||||
8. Show counters and states in diagnostics. Do not show authentication secrets.
|
||||
9. Resolve and pin only loopback destinations before sending a bearer
|
||||
capability. Reject ambiguous or mixed DNS answers.
|
||||
10. Use exclusive random temporary state files, no-follow opens, ownership and
|
||||
mode checks, atomic rename, file sync, and directory sync.
|
||||
11. Capture and remove the bootstrap environment value at daemon entry. Keep
|
||||
bootstrap and lease values in overwrite-on-drop buffers.
|
||||
|
||||
# Evidence
|
||||
|
||||
See the [Phase 3 verification evidence](../evidence/2026-08-07-phase-03-verification.md).
|
||||
|
||||
Follow the [Phase 3 tutorial](../../docs/tutorials/phase-03-break-recovery.md).
|
||||
|
||||
# Failures
|
||||
|
||||
- The first lost-ACK path let a socket write error escape before reconnect. The
|
||||
recovery loop now records the failure, preserves state, and reconnects.
|
||||
- The security diagnostic first reported capability persistence with fixed
|
||||
`false` values. It now derives both facts from the runner state file and the
|
||||
tests assert the result.
|
||||
- The normal browser run could not start Chromium because this minimal host did
|
||||
not include `libatk`. The supported rootless verifier downloaded private
|
||||
runtime libraries and all seven browser checks passed.
|
||||
- Documentation validation found the recovery screenshot link before the file
|
||||
was captured. The browser proof produced the screenshot, it was inspected,
|
||||
and the final documentation check passed.
|
||||
|
||||
# Known gaps
|
||||
|
||||
- The runner transport and durable store are Rust. The mock core, fault driver,
|
||||
evidence recorder, and browser peer are TypeScript.
|
||||
- The WebSocket uses loopback `ws` for local proof. Production `wss`
|
||||
certificate and proxy policy remain deferred.
|
||||
- The mock core supports one runner session.
|
||||
- The atomic JSON state is a tracer store. A production database format,
|
||||
migration policy, and long-term processed-command retention remain deferred.
|
||||
- Lease replacement after expiry is an external fresh-bootstrap action. This
|
||||
phase does not implement a production lease-renewal service.
|
||||
|
||||
# Follow-up questions
|
||||
|
||||
- Which TLS implementation and trust policy will own production `wss`?
|
||||
- Which encrypted store and migration policy will replace the tracer JSON file?
|
||||
- Which replay window will the production core retain for diagnostics?
|
||||
@@ -6,3 +6,4 @@
|
||||
* [Phase 0 Rust boundary correction](2026-08-07-phase-00-rust-boundary-correction.md) - Root cause and corrected Rust/TypeScript ownership after the human checkpoint.
|
||||
* [Phase 1 protocol, fixtures, reducer, and static replay](2026-08-07-phase-01.md) - Executable PRP schemas, deterministic replay decisions, browser findings, and checkpoint gaps.
|
||||
* [Phase 2 local runner and fake harness](2026-08-07-phase-02.md) - Rust supervision, stdio protocol, scripted driver, live browser, cleanup, and parity decisions.
|
||||
* [Phase 3 durable outbound transport and recovery](2026-08-07-phase-03.md) - WebSocket authentication, durable ACK replay, command deduplication, and recovery diagnostics.
|
||||
@@ -6,3 +6,4 @@
|
||||
* **Rust boundary correction**: Added the production-direction Cargo workspace, shared-fixture parity evidence, negative Cargo boundary coverage, and a superseding journal entry after the Phase 0 checkpoint exposed the TypeScript-only omission.
|
||||
* **Phase 1 static replay**: Added executable PRP v1 schemas, cross-language fixture/golden parity, deterministic reducer, CLI/browser replay, compatibility policy, tutorial, screenshot, and verification evidence.
|
||||
* **Phase 2 local runner**: Added the deterministic Rust supervisor, stdio fake-harness protocol, scripted scenarios, bounded logs, cleanup and terminal guards, TypeScript mock core, validated live browser mode, screenshots, tutorial, and verification evidence.
|
||||
* **Phase 3 durable recovery**: Added package-local WebSocket authentication, a durable outbox, cumulative acknowledgements, restart replay, command deduplication, recovery diagnostics, tutorial, and evidence.
|
||||
@@ -6,7 +6,7 @@ This document is the implementation-phase plan for [`paperclip-native-runner-spi
|
||||
|
||||
All implementation starts inside `packages/paperclip-runner/` with protocol and mock-control-plane layers. These standalone phases do not modify Paperclip control-plane semantics. A real Paperclip bridge is a late, separately reviewed phase after the standalone contract passes conformance tests.
|
||||
|
||||
Phase 0, Phase 1, and Phase 2 are complete. Their runnable demos, tests, package-local documentation, tutorials, journal entries, screenshots, and evidence satisfy the first three task-creation gates. The human accepted Phase 2 and authorized Phase 3 on August 7, 2026. Create only the Phase 3 task graph now. Keep Phase 4 and later issues deferred until the Phase 3 human checkpoint is complete.
|
||||
Phase 0, Phase 1, and Phase 2 are complete. The Phase 3 tracer is implemented and awaits Security, UX, QA, and human acceptance. Keep Phase 4 and later issues deferred until the Phase 3 human checkpoint is complete.
|
||||
|
||||
## Non-negotiable delivery rules
|
||||
|
||||
|
||||
@@ -6575,7 +6575,7 @@ Never change an active run from native to legacy mid-session.
|
||||
|
||||
The implementation phases, dependency policy, package-local documentation layout, human checkpoints, and retained future backlog now live in [`paperclip-native-runner-implementation-plan.md`](./paperclip-native-runner-implementation-plan.md).
|
||||
|
||||
The spike specification remains the normative contract. Keep it updated when implementation evidence changes architecture, protocol, security, persistence, API, UI, performance, or exit criteria. Keep sequencing and task-creation details in the implementation plan. Phase 0, Phase 1, and Phase 2 are complete. The human accepted Phase 2 and authorized the Phase 3 task graph on August 7, 2026. Phase 3 must prove durable outbound transport and same-session recovery entirely inside `packages/paperclip-runner/` against the mock core. Its normative recovery invariants, tutorial evidence, and human checkpoint are defined in the package-local implementation plan. Keep Phase 4 and later tasks deferred until the Phase 3 human checkpoint is complete.
|
||||
The spike specification remains the normative contract. Keep it updated when implementation evidence changes architecture, protocol, security, persistence, API, UI, performance, or exit criteria. Keep sequencing and task-creation details in the implementation plan. Phase 0, Phase 1, and Phase 2 are complete. The Phase 3 tracer now implements package-local outbound WebSocket authentication, private durable state, cumulative acknowledgement replay, command deduplication, bounded P0-preserving storage, drain, revoke, and redacted CLI/browser diagnostics. Security, UX, QA, and human acceptance remain open. Keep Phase 4 and later tasks deferred until the Phase 3 human checkpoint is complete.
|
||||
|
||||
## 30. Dependency sequencing
|
||||
|
||||
|
||||
Reference in new issue
Block a user