# Manual cleanup proof

Surface: real web client, Chromium, light theme, 1440 × 1000 CSS pixels (device scale 2).
Both commits ran from linked git checkouts with their default `.t3` homes and fresh databases.
No live database was read or copied. This recreates the retained external references and copied
settings of the proposed seeded-home reproduction through the application's own commands.

1. Install each checkout with `vp i`. Set a fixture clock file to -2592000000 milliseconds.
2. Start each real stack with `T3CODE_DEV_SEED=0`, `T3CODE_AUTO_BOOTSTRAP_PROJECT_FROM_CWD=0`,
   `NODE_OPTIONS=--require=<clock.cjs>`, and `PROOF_CLOCK_FILE=<clock file>`, using `vp run dev`.
   The hostname probe commands were shimmed to return the synthetic label `Cleanup demo`.
3. Set clock to 0, issue a fresh pairing link with `node apps/server/src/bin.ts pair --base-dir .t3`,
   and authenticate in the browser. This prevents synthetic historical cookie expiry.
4. Use fixture-seed.py prepare to create a git project with an ignored marker file pattern, a
   worktree outside the dev home in a custom folder, and a control under `.t3/worktrees`.
5. Set clock to -2592000000, then call seedThreads from browser-driver.js with the project's
   returned id and worktree paths. These are real thread.create RPC commands; no agent runs.
6. Restore clock to 0 and call enableCleanup with the custom folder. This stores the equivalent
   copied settings: a seven-day inactivity rule and the uncommitted-changes preservation policy.
   Enabling the rule itself sweeps: base removes both; head keeps the external and removes the control.
7. Use fixture-seed.py restore to restore any removed disposable worktrees and markers, without
   modifying thread history. Advance clock to +86400000 so automatic settlement's one-minute grace
   period cannot mask cleanup eligibility. Both threads are now 31 days inactive.
8. Open Settings > Maintenance, expand Last run, scroll the content pane to 321 pixels, start
   recording, click Delete now, and wait for the enabled Delete now button.
9. Capture the report and run fixture-seed.py inspect. On base both paths/markers are absent.
   On head the external path/marker remain and the control path/marker are absent.

Base report: 2 removed, 0 kept, inactive for 31 days.
Head report: 1 removed, 1 kept; external reason: Outside the managed worktree folder.
Each final PNG was captured after two identical screenshots more than 500 ms apart.
Evidence masks only filesystem path values; status, reasons, counts, and thread titles are original.
Scripts use arguments in place of this run's private absolute paths. Pairing tokens are omitted.

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