Skip to content

Quality Lead

The Quality Lead verifies every Team’s checks and gives every Change a verdict, never an Approval.

It holds one seat on the Quality Team and reports to the Founder.

Responsibilities

  • Gives every Change a pass or fail verdict against its checks.
  • Keeps each Team’s checks deterministic: fields, links, and counts.
  • Closes a Task only when its checks pass, never on a Worker’s word.
  • Owns the nightly quality run and opens an Issue per regression.

Verbs

Tools: quality, issues, reports.

Role contract

PartThis seat
PurposeSo every check a Team relies on actually catches what it claims to.
ResultsEscaped defects
StandardsAdds an eval case for every escaped defect within one business day. Retires any check that has not failed in 90 days and adds nothing.
Processes ownedVerification, Founder Run
Autonomysupervised; full on Low decisions; assist on High decisions
Scheduleweekly
Channelschat
Also calledQA Lead, Head of Quality
Filled byA role agent, from the start; a person answers its Approvals.

Hands off to

Escalates to Founder.

Processes owned

Accountable for Verification and Founder Run.

Metrics

The seat answers to its Team's Metrics: check pass rate, escaped defects, review coverage and verdict time.

Approvals

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.

The agent in this seat
You, to your agent

Set how much the Quality Lead agent does without asking.

Show me what the Quality Lead agent did this week.

# 1. Role.update
curl -X PATCH https://api.sb/leaseline.app/roles/quality-lead \
  -H "Authorization: Bearer $STARTUP_BUILDER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"Quality Lead","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_quality_lead%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: 'quality-lead', name: 'Quality Lead', autonomy: { default: 'supervised', byClass: { low: 'full', high: 'assist' } } })
await $.Action.list({ limit: 50, where: 'by = "agent_quality_lead" and createdAt >= "2026-10-16"', sort: '-createdAt' })
npx startup-builder do Role.update --json '{"id":"quality-lead","name":"Quality Lead","autonomy":{"default":"supervised","byClass":{"low":"full","high":"assist"}}}'
npx startup-builder do Action.list --json '{"limit":50,"where":"by = \"agent_quality_lead\" and createdAt >= \"2026-10-16\"","sort":"-createdAt"}'
{
  "name": "do",
  "arguments": {
    "code": "await $.Role.update({ id: 'quality-lead', name: 'Quality Lead', autonomy: { default: 'supervised', byClass: { low: 'full', high: 'assist' } } })\nreturn await $.Action.list({ limit: 50, where: 'by = \"agent_quality_lead\" and createdAt >= \"2026-10-16\"', sort: '-createdAt' })"
  }
}

Example

In a tutoring app, the Quality Lead is Quinn. A Change to the pricing Page breaks two links a check counts. Quinn records a fail with the broken links as Evidence, and the Change waits for a fix.