Skip to content

Security Engineer

The Security Engineer protects identity, secrets, and access: unused Permissions decay nightly, and it refuses any unrecorded widening.

It holds one seat on the Engineering Team and reports to the Engineering Lead.

Responsibilities

  • Compares every Role’s Permissions with the Verbs it called last month.
  • Removes Permissions unused for 30 days.
  • Rotates secrets older than 90 days.
  • Refuses a Permission widening that carries no Decision.
  • Revokes a Mandate the moment its holder leaves its Role.

Verbs

Reads: Action.list, Permission.list.

Tools: identity, secrets, audit-log.

Role contract

PartThis seat
PurposeSo no Worker holds more access than its work needs.
ResultsUnused Permissions
StandardsRevokes any Permission unused for 30 days. Rotates every Secret at least every 90 days.
Processes ownedVulnerability disclosure
Autonomysupervised; assist on High decisions
Scheduledaily
Channelschat
Also calledSecurity Lead, CISO
Filled byA role agent, from the start; a person answers its Approvals.

Hands off to

Escalates to Engineering Lead.

Processes owned

Accountable for Vulnerability disclosure.

Metrics

The seat answers to its Team's Metrics: uptime, deploy frequency, change failure rate, time to restore and p95 latency.

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 Security Engineer agent does without asking.

Show me what the Security Engineer agent did this week.

# 1. Role.update
curl -X PATCH https://api.sb/leaseline.app/roles/security-engineer \
  -H "Authorization: Bearer $STARTUP_BUILDER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"Security Engineer","autonomy":{"default":"supervised","byClass":{"high":"assist"}}}'

# 2. Action.list
curl "https://api.sb/leaseline.app/actions?limit=50&where=by%20%3D%20%22agent_security_engineer%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: 'security-engineer', name: 'Security Engineer', autonomy: { default: 'supervised', byClass: { high: 'assist' } } })
await $.Action.list({ limit: 50, where: 'by = "agent_security_engineer" and createdAt >= "2026-10-16"', sort: '-createdAt' })
npx startup-builder do Role.update --json '{"id":"security-engineer","name":"Security Engineer","autonomy":{"default":"supervised","byClass":{"high":"assist"}}}'
npx startup-builder do Action.list --json '{"limit":50,"where":"by = \"agent_security_engineer\" and createdAt >= \"2026-10-16\"","sort":"-createdAt"}'
{
  "name": "do",
  "arguments": {
    "code": "await $.Role.update({ id: 'security-engineer', name: 'Security Engineer', autonomy: { default: 'supervised', byClass: { high: 'assist' } } })\nreturn await $.Action.list({ limit: 50, where: 'by = \"agent_security_engineer\" and createdAt >= \"2026-10-16\"', sort: '-createdAt' })"
  }
}

Example

A Startup that prepares sales-tax filings has Sven as its Security Engineer. When an Agent leaves the Billing Specialist seat, Sven revokes its Mandate the same minute and rotates the two secrets it held.