-< All case studies
Case study / Goodcall

We built an AI engineering teammate for an AI-native company.

A multi-agent AI engineering teammate that takes a Linear ticket end to end - from spec to merged GitHub PR, with Slack as the human escape hatch.

Visit Goodcall->
multi-agentclaude-agent-sdklineargithub-appdeveloper-tools
158
Commits
in 7 weeks
7
Agent roles
specialized LLM workers
12
Build stages
shipped sequentially
Since Apr 2026
Engagement
The problem

An AI-native product company wanted to ship faster than its headcount.

Goodcall builds Agentic Voice AI: phone agents that answer customer service and sales calls for businesses ranging from solopreneurs to publicly traded companies. The product is positioned as “launch your custom phone AI agent in just a few minutes - no engineering team required.” That promise lives or dies on the pace of the underlying platform.

Goodcall's roadmap moves faster than most teams can staff against. Routine engineering work - small features, fixes, refactors, the long tail of tickets that fill an engineer's week - was a bottleneck on the bigger bets. The question was whether an AI-native company could have an AI engineering teammate that takes a Linear ticket end to end, with the same safety discipline a senior engineer would apply.

EliteCoders was brought in to build that teammate. We call it Kanman.

“Answer and automate customer service and sales requests with Agentic Voice AI on every phone call.”

What we built

Kanman: Linear ticket in, merged PR out.

Assign a Linear ticket to @kanman. Kanman drafts an OpenSpec change, implements the work in an isolated workspace, opens a GitHub PR, reviews it as a read-only agent, then either merges or escalates to a human via Slack. Post-merge verification closes the loop back to Linear.

Trigger
Linear ticket assignment
Agent
LLM-driven role
Gate
Decision point
Output
PR or Slack escalation
How we built it

Seven specialized roles, each with its own prompt and tool policy.

Kanman is not one big agent with a kitchen-sink prompt. Each role has a narrow responsibility, a curated tool set, a bash policy (allowlist for read-only roles, denylist for write roles), and its own test suite.

spec-drafter

Reads the Linear ticket and drafts an OpenSpec change before any code is written.

src/roles/spec-drafter.ts
implementer

Clones the repo into a temp workspace, runs the agent loop, commits, pushes, and opens a PR.

src/roles/implementer.ts
qa

Runs targeted checks before the PR opens, with a strict bash allowlist.

src/roles/qa.ts
reviewer

Read-only agent that produces a structured review and posts it on GitHub.

src/roles/reviewer.ts
merge-finalizer

Handles the actual merge once the reviewer signs off, with branch-protection awareness.

src/roles/merge-finalizer.ts
post-merge-verification

After merge, confirms the work landed cleanly and the Linear ticket can transition.

src/roles/post-merge-verification.ts
reverter

Reverts a merged change when the Linear ticket is cancelled after the fact.

src/roles/reverter.ts
Safety

Production-grade safety, not aspirational.

An autonomous engineer on a real codebase needs hard rules. These are non-negotiables that ship with every Kanman deployment, enforced in code, not in prompts.

01
Never push to default branches
Only `kanman/*` branches accepted
02
Never delete existing tests
Post-agent diff check enforces this
03
Webhook signatures validated on every route
Fail-closed on missing secret
04
Reviewer gets a bash allowlist
Only read-only commands (`ls`, `cat`, `rg`, `git status|log|diff|show`)
05
Implementer denylist + per-run sandbox
`/tmp/kanman-runs/<run_id>/` workspace, never the host repo
06
Lock + heartbeat + loop cap
Concurrency safety, escalation on runaway agents
Built on the Claude Agent SDK

A thin orchestration layer over a strong agent runtime.

Kanman wraps Anthropic's Claude Agent SDK with a runAgent() factory, tool-set composition, a per-model pricing table, and JSONL tracing. Each role hydrates the wrapper with its own prompt and tool surface.

This means the agent runtime is not custom-built. The orchestration, the guardrails, and the per-role policy are. That's the right division of labor.

package.json
// dependencies
"@anthropic-ai/claude-agent-sdk": "^0.2.104",
"@linear/sdk": "^81.0.0",
"@octokit/app": "^16.1.2",
"@octokit/webhooks": "^14.2.0",
"drizzle-orm": "^0.45.2",
"hono": "^4.12.12"
Twelve-stage build plan

Shipped sequentially. Each stage a reviewable OpenSpec change.

The whole platform was scoped, planned, and built as twelve sequential OpenSpec changes - each with proposal, design, capability specs, and a task list. That discipline kept the build legible and let Kanman ship to production by stage 8.

01

Project scaffold

Node 25 / TS 6 / pnpm / Biome / Vitest / docker-compose Postgres

02

Database schema

Drizzle schema, migrations, SERIALIZABLE lock helper

03

Config + secrets

Zod env config, SecretSource abstraction, pino with redact

04

GitHub integration

App auth, repo/PR/webhook helpers, safety guardrails

05

Claude Agent wrapper

runAgent(), tool-set factories, pricing table, JSONL traces

06

Implementer role

Clone, agent loop, safety checks, commit, push, open PR

07

Webhook receiver

Hono app, signature validation, dedupe, in-process dispatch

08

Linear integration

OAuth, Agent Session activities, state transitions

09

Reviewer role

Read-only agent, structured JSON, GitHub review posting, merge finalizer

10

Slack integration

Threaded updates, /kanman commands, approver allowlist

11

Loop cap + escalation

escalate() entry point, loop cap enforcement, safety routing

12

Cloud Run deploy

Dockerfile, deploy script, Cloud SQL + Secret Manager runbooks

Stages 1-8: first end-to-end Linear-to-PR loop
Stages 9-12: review, escalation, deploy
Recent shipped

Always shipping.

  1. 2a12fc2

    Linear ticket screenshots flow to every agent role

    spec-drafter, implementer, and reviewer can all see what the user pasted into the ticket - a visual is often the spec.

  2. 7aa954c

    Auto-revert when a Linear ticket is cancelled

    Cancelling a ticket post-merge triggers a clean revert PR instead of a manual rollback.

  3. 6d749da

    Observability: tool-call tags, heartbeats, boot fingerprints

    Every agent run is traceable and recoverable; long-running implementations stay alive.

  4. 4600c6d

    Debug Ticket: end-to-end investigation command

    One command surfaces the full lifecycle of any Kanman Linear ticket for triage.

  5. 975b8a8

    AI usage and cost summarization

    Per-ticket token and dollar accounting from the Anthropic SDK, surfaced to Linear.

Tech stack

What it's built on.

Language
TypeScript
on Node 25
Single Node service. Deliberate.
Frameworks
HonoDrizzle ORMpino
AI tooling
Claude Agent SDKJSONL tracingToken + cost accountingSkills loader
Integrations
GitHub AppLinear Agent SDKSlackAnthropic API
Infra
PostgreSQLDocker ComposeGoogle Cloud RunCloud SQLSecret Manager
Testing
VitestTestcontainersIntegration harness
What we delivered

An AI teammate Goodcall's engineers actually use.

The system we built for Goodcall, in concrete terms.

1

A production multi-agent engineering teammate

Kanman takes a Linear ticket assigned to @kanman, drafts an OpenSpec change, implements the work, opens a GitHub PR, reviews it, merges or escalates, and verifies post-merge - end to end, with humans only in the loop where they should be.

2

Seven specialized agent roles

spec-drafter, implementer, qa, reviewer, merge-finalizer, post-merge-verification, and reverter. Each role has its own prompt, its own tool surface, and its own bash policy. The Claude Agent SDK does the heavy lifting; Kanman provides the orchestration and guardrails.

3

Linear-native UX via the Agent Interaction SDK

Goodcall engineers stay in Linear. Kanman posts Agent Session activities, transitions ticket states, and surfaces AI usage summaries at terminal transitions. No new tool to learn.

4

Real safety guardrails, not aspirational ones

Branch protection, test-deletion detection, webhook signature validation, a reviewer bash allowlist, an implementer bash denylist, per-run temp workspaces, and a loop cap with explicit escalation. Twelve stages of deliberate engineering.

5

Observability + cost accounting

Every tool call is tagged, every long-running implementer heartbeats, every boot is fingerprinted, every ticket gets a token + dollar summary posted back to Linear. You can answer "what is this agent doing right now" and "what did this ticket cost".

Build with us

Want this for your company?

We build AI-native software with engineers who know how to ship.

Get in touch->