# Welcome project discovery proof

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

Run from a current-main checkout with the scenario runner. Apply `scenario-harness.patch`, place `worktree-project-discovery.e2e.ts` in `scripts/scenarios/`, and install dependencies with `vp i`.

The harness enables Claude discovery with a harmless, failing CLI executable and a separate synthetic session directory. No live provider is called. It restricts the runner to the web target. The visible CLI warning is expected: only discovery is under test.

```sh
export DISCOVERY_FIXTURE_ROOT="$(mktemp -d)"
T3CODE_DEV_SEED=0 vp run scenarios:prove scripts/scenarios/worktree-project-discovery.e2e.ts \
  --base 5cff012416c25e6b88d7f61036171e47729c3f18 \
  --head ad50076bb0fddaba83ecbbedfbaa0ffceae09d74
```

The scenario creates ordinary Git repositories with origin remotes and linked worktrees. The control repository has three recent synthetic Claude conversations in its main checkout. The target has three in its linked worktree and none in its main checkout. These are provider-format JSONL fixtures, not replay-provider threads or copied user data. Both app commits scan the same fixture paths, using fresh databases.

A real Chromium browser opens Welcome and expands Review all. Base lists only `demo/main` with count 3. Head also lists `demo/wt`, its main checkout `worktree-only`, and count 3. The linked directory is named `worktree-only-linked` and is not offered. The scenario asserts the target remote label and its count.

Environment: real development web client and server, Chromium, 1280 × 800, light theme, fresh isolated T3 state on each side. Screenshots and recordings show the same scripted interaction. Gray rectangles redact only temporary parent paths; remote labels, checkout directory names, and counts are unchanged.

The assertions failed on base and passed on head, and `scenarios:prove` exited 0. Importing conversations, Codex-format sessions, and mixed main/worktree history were not exercised.
