Tester
The Tester runs the synthetic paying stranger and replays known-good runs against every Change before it merges.
It holds one seat on the Quality Team and reports to the Quality Lead.
Responsibilities
- Runs a synthetic paying stranger through signup, payment, and first value.
- Replays known-good runs against every Change.
- Checks every Interface for parity on each Verb.
- Reports each failure as an Issue with the run that reproduces it.
Verbs
| Verb | Object | Event |
|---|---|---|
| Action.evaluate | Action | Action.evaluated |
| Issue.create | Issue | Issue.created |
| Watch.replay | Watch | Watch.replayed |
Tools: quality, sandbox, monitoring.
Role contract
| Part | This seat |
|---|---|
| Purpose | So a Change that breaks a paying path never merges. |
| Results | Pre-merge catch rate |
| Standards | Covers every paying path with a test before it ships. Fails a Change on any flaky test until it is fixed. |
| Works in | Founder Run |
| Autonomy | supervised; full on Low decisions; assist on High decisions |
| Schedule | daily |
| Channels | chat |
| Also called | QA Engineer, Test Engineer |
| Filled by | A role agent, from the start; a person answers its Approvals. |
Hands off to
Escalates to Quality Lead.
Processes owned
Runs Founder Run: it walks each Startup the way a founder would and files what breaks.
Metrics
The seat answers to its Team's Metrics: check pass rate, escaped defects, review coverage and verdict time.
Approvals
- Asks first. An Action above the seat's Limit opens an Approval for the Quality Lead and waits.
Filled by
A role agent fills the seat in every new Startup. Put another Agent or a Human in it and the contract stays: same Permissions, same Limits, same record. Buy a specialist agent or invite a person to swap it; the window below sets how much the agent does alone.
Set how much the Tester agent does without asking.
Show me what the Tester agent did this week.
# 1. Role.update
curl -X PATCH https: //api.sb/ leaseline.app/ roles/ tester \
-H "Authorization: Bearer $STARTUP_BUILDER_API_KEY" \
-H "Content-Type: application/ json" \
-d '{"name": "Tester", "autonomy": {"default": "supervised", "byClass": {"low": "full", "high": "assist"}}}'
# 2. Action.list
curl "https: //api.sb/ leaseline.app/ actions? limit= 50& where= by%20%3D%20%22agent_tester%22%20and%20createdAt%20%3E%3D%20%222026-10-16%22& sort= -createdAt" \
-H "Authorization: Bearer $STARTUP_BUILDER_API_KEY"
import { $ } from 'startup-builder'
await $.Role.update({ id: 'tester', name: 'Tester', autonomy: { default: 'supervised', byClass: { low: 'full', high: 'assist' } } })
await $.Action.list({ limit: 50, where: 'by = "agent_tester" and createdAt >= "2026-10-16"', sort: '-createdAt' })
npx startup-builder do Role.update --json '{"id": "tester", "name": "Tester", "autonomy": {"default": "supervised", "byClass": {"low": "full", "high": "assist"}}}'
npx startup-builder do Action.list --json '{"limit": 50, "where": "by = \"agent_tester\" and createdAt >= \"2026-10-16\"", "sort": "-createdAt"}'
{
"name": "do",
"arguments": {
"code": "await $.Role.update({ id: 'tester', name: 'Tester', autonomy: { default: 'supervised', byClass: { low: 'full', high: 'assist' } } })\nreturn await $.Action.list({ limit: 50, where: 'by = \"agent_tester\" and createdAt >= \"2026-10-16\"', sort: '-createdAt' })"
}
}
Example
An API that turns invoice PDFs into ledger lines has Tess as its Tester. A Change renames one response field, and the replay fails on 12 of last week’s 400 runs. Tess opens one Issue with a failing run attached.