---
title: "Reproduce the Claim"
description: "Create an isolated Investigator, give it read-only repository access, and require the smallest disposable probe that can support or contradict a bug report."
canonical_url: "https://vercel.com/academy/creating-a-software-factory/reproduce-the-claim"
md_url: "https://vercel.com/academy/creating-a-software-factory/reproduce-the-claim.md"
docset_id: "vercel-academy"
doc_version: "1.0"
last_updated: "2026-08-29T01:48:00.621Z"
content_type: "lesson"
course: "creating-a-software-factory"
course_title: "Creating a Software Factory"
prerequisites:  []
---

<agent-instructions>
Vercel Academy — structured learning, not reference docs.
Lessons are sequenced.
Adapt commands to the human's actual environment (OS, package manager, shell, editor) — detect from project context or ask, don't assume.
The lesson shows one path; if the human's project diverges, adapt concepts to their setup.
Preserve the learning goal over literal steps.
Quizzes are pedagogical — engage, don't spoil.
Quiz answers are included for your reference.
</agent-instructions>

# Reproduce the Claim

# Reproduce the claim

“Empty messages are delivered” sounds specific enough to fix. The title names a behavior, and the body asks for a regression test. But the issue is still a claim, not evidence that the bug exists.

```text
Issue claim → smallest probe → observed result
```

The Investigator tests the premise against the repository before writing a specification.

## Make the Issue Prove Itself

Create a read-only Investigator that reproduces or contradicts a reported bug inside Vercel Sandbox.

## Hands-on Exercise 3.1

### Connect the live services

The first two sections stayed local. Live investigation needs a repository connector and Vercel Sandboxes.

Link the directory. `eve link` creates or selects the Vercel project and pulls local OIDC credentials used by AI Gateway and Vercel Connect:

```bash
pnpm exec eve link
```

Create a managed GitHub connector, install its GitHub App on **your course repository only**, and attach it to the linked project:

```bash
vercel connect create github --name signalworks-factory --triggers
vercel connect attach github/signalworks-factory --triggers --trigger-path /eve/v1/github
vercel connect list
```

If `vercel connect` is unavailable, update the CLI. The connector supplies short-lived installation tokens; do not create a personal access token or GitHub App key.

Add the course configuration to the linked project, then pull it locally:

```bash
vercel env add FACTORY_REPO --value YOUR_GITHUB_NAME/signalworks-software-factory
vercel env add FACTORY_LABEL --value factory
vercel env add FACTORY_BRANCH_PREFIX --value factory/
vercel env add FACTORY_SETUP_COMMAND --value "pnpm install --frozen-lockfile"
vercel env add GITHUB_CONNECTOR --value github/signalworks-factory
vercel env pull .env.local
```

Confirm the five values. `GITHUB_CONNECTOR` must match `vercel connect list`, and `FACTORY_REPO` must name the connected personal repository. Refresh expired authentication with `vercel env pull .env.local`.

\*\*Warning: Keep credentials out of Git\*\*

`.env.local` is ignored by the starter. Never commit OIDC tokens, AI Gateway keys, GitHub installation tokens, or connector credentials.

### Build the Investigator

Open `agent/lib/config.ts` and set the fallback repository to your personal GitHub fork. Vercel Hobby projects use repositories owned by your personal account.

Create `agent/subagents/investigator/sandbox.ts`:

```ts title="agent/subagents/investigator/sandbox.ts"
import { defineSandbox } from "eve/sandbox";
import { vercel } from "eve/sandbox/vercel";
import {
  repoBootstrap,
  repoOnSession,
  repoRevalidationKey,
} from "../../lib/github/repo-sandbox.js";

export default defineSandbox({
  backend: vercel(),
  bootstrap: repoBootstrap,
  onSession: repoOnSession,
  revalidationKey: repoRevalidationKey,
});
```

The sandbox clones into `/workspace/repo`, isolated from the host filesystem.

Create `agent/subagents/investigator/agent.ts` with a small first contract:

```ts title="agent/subagents/investigator/agent.ts"
import { defineAgent } from "eve";
import { MODELS } from "../../lib/models.js";

export default defineAgent({
  description:
    "Investigate a reported behavior against the real repository. Reproduce the claim and return command-backed evidence. Never modify files.",
  model: MODELS.investigator,
  outputSchema: {
    additionalProperties: false,
    properties: {
      claimSupported: { type: "boolean" },
      evidence: {
        items: {
          additionalProperties: false,
          properties: {
            command: { type: ["string", "null"] },
            result: { type: "string" },
            summary: { type: "string" },
          },
          required: ["summary", "command", "result"],
          type: "object",
        },
        minItems: 1,
        type: "array",
      },
    },
    required: ["claimSupported", "evidence"],
    type: "object",
  },
});
```

Add `agent/subagents/investigator/instructions.md`. Require the smallest disposable probe that can decide the claim, relevant output for every command, and cleanup before returning. The Investigator never edits product files.

Finally, add the bug-lane delegation to `agent/instructions.md`. Pass the complete work order because specialists do not inherit the root conversation.

## Try It

Check discovery first:

```bash
pnpm typecheck
pnpm exec eve info
```

The application should report one subagent. Then invoke the factory with the uppercase-channel fixture. This is the course's canonical non-interactive invocation command:

```bash
pnpm exec eve invoke "$(cat fixtures/issues/bug-example.md)"
```

`eve invoke` runs without the TUI using the linked environment. For an interactive trace, run `pnpm exec eve dev` and paste the fixture into the TUI.

The Investigator's result must include a command that demonstrates `SLACK` failing before the fix. A summary without a command is another claim.

Now repeat with the false-premise fixture:

```bash
pnpm exec eve invoke "$(cat fixtures/issues/false-premise-example.md)"
```

Both reports may enter the bug lane, but their `claimSupported` values should differ after the probes run.

\*\*Note: Predict the cheapest probe\*\*

Before invoking either issue, inspect the notification SDK tests. Write the smallest command that could distinguish a real failure from a false premise. Compare it with the Investigator's choice.

\*\*Warning: The Investigator edits a test\*\*

Disposable probes may be created and removed, but the final repository must remain unchanged. Reproduction is read-only factory work.

\*\*Warning: The sandbox cannot clone the repository\*\*

Confirm the repository uses `owner/name` format and belongs to the personal GitHub account connected to the Vercel Hobby project.

## Commit

```bash
git add agent/subagents/investigator agent/instructions.md agent/lib/config.ts
git commit -m "feat(factory): reproduce issue claims"
```

## Done-When

- [ ] eve discovers one Investigator subagent
- [ ] The linked project has an attached GitHub connector and the five course values
- [ ] The Investigator works inside `/workspace/repo`
- [ ] Every conclusion contains command-backed evidence
- [ ] Disposable probes are removed before the result returns
- [ ] The real bug and false premise produce different support decisions

One report now fails before any Builder sees it. Supported observations can move on to a specification.

## Solution

`agent/subagents/investigator/instructions.md` contains:

```md title="agent/subagents/investigator/instructions.md"
# Investigator

You investigate one work order against the repository at `/workspace/repo`. You never edit product files.

Read the source issue, classification, route, and existing evidence from the delegation message. For a bug, create and run the smallest disposable probe that proves or disproves the report. Remove the probe before finishing.

Return evidence for every conclusion. Commands include their relevant output. Observations name the file and behavior inspected. Do not claim that a bug exists without a reproducing result.
```

The root instructions delegate only the bug and public API lanes to `investigator`, passing the complete current work order.


---

[Full course index](/academy/llms.txt) · [Sitemap](/academy/sitemap.md)
