# Settlement evidence driver

Real web client and server, Chromium at 1280 x 800, light theme, fresh synthetic projects and replay turns. No production database is read. CSS animations and transitions are disabled before still capture, then two decoded PNGs 500 ms apart must match. The server clock alone advances two days for the one-day inactivity case; an independent ordinary thread must settle before that case is captured.

Use the scenario runner helpers from current main. Copy the four scenario files into scripts/scenarios, put clock.mjs in /tmp/settlement-proof (create the directory), and apply launcher.patch to the runner checkout. Install each app checkout with vp i. Run each file separately from scripts with T3CODE_DEV_SEED=0 and T3_SCENARIO_APP_DIR pointing to the desired app checkout:

    ./node_modules/.bin/e2e run scenarios/subagent-parent-settlement.e2e.ts --target web --output .e2e/settlement-proof
    ./node_modules/.bin/e2e run scenarios/subagent-manual-enabled.e2e.ts --target web --output .e2e/manual-enabled-proof
    ./node_modules/.bin/e2e run scenarios/subagent-inactivity-lifecycle.e2e.ts --target web --output .e2e/inactivity-proof
    ./node_modules/.bin/e2e run scenarios/subagent-pr-settlement.e2e.ts --target web --output .e2e/pr-proof

The first driver creates real delegated-task relationships through the server WebSocket command surface. It records inactivity while the parent waits for input; fresh child cases after parent settlement, archive and deletion with auto-settlement disabled; pins, per-thread opt-out, pending input and a held queue; and a shared-worktree log-only settle action while the parent is still waiting for input, followed by stopping and settling the owning parent. The parent question is answered before manual parent settlement because the real server prohibits settling a thread with an unanswered question.

The manual-enabled driver settles the completed parent before the one-day threshold, with automatic settlement enabled; the lifecycle driver repeats with automatic settlement disabled.

The inactivity driver records one child continuously before and after the clock passes the inactivity threshold, then after its parent settles, with automatic settlement enabled throughout.

The PR driver uses a real merged public pull request: [#29151](https://github.com/pingdotgg/t3code/pull/29151). Synthetic setup runs with the server clock two days earlier, restored before linking the PR; the child's creation date is also backdated through the existing command's createdAt field. Inactivity settlement is disabled; merged-PR settlement alone is enabled. No forge writes occur.

Soft assertion failures keep later cases recording on base. The app itself is not patched by these drivers. Launcher changes affect only isolated test startup and capture determinism. The clock shim and generated logs contain no credentials; raw e2e traces can contain temporary pairing credentials and must not be published.

AI-assisted; verified with the tests and tools listed above.

Observed limitation: both PR-only runs left the child unsettled. The base view did not populate a PR summary within the ten-second observation window, so the PR-only driver does not establish a before/after difference. The inactivity and lifecycle drivers establish the other recorded differences.
