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.
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.”
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.
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-drafterReads the Linear ticket and drafts an OpenSpec change before any code is written.
src/roles/spec-drafter.tsimplementerClones the repo into a temp workspace, runs the agent loop, commits, pushes, and opens a PR.
src/roles/implementer.tsqaRuns targeted checks before the PR opens, with a strict bash allowlist.
src/roles/qa.tsreviewerRead-only agent that produces a structured review and posts it on GitHub.
src/roles/reviewer.tsmerge-finalizerHandles the actual merge once the reviewer signs off, with branch-protection awareness.
src/roles/merge-finalizer.tspost-merge-verificationAfter merge, confirms the work landed cleanly and the Linear ticket can transition.
src/roles/post-merge-verification.tsreverterReverts a merged change when the Linear ticket is cancelled after the fact.
src/roles/reverter.tsProduction-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.
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.
// 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"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.
Project scaffold
Node 25 / TS 6 / pnpm / Biome / Vitest / docker-compose Postgres
Database schema
Drizzle schema, migrations, SERIALIZABLE lock helper
Config + secrets
Zod env config, SecretSource abstraction, pino with redact
GitHub integration
App auth, repo/PR/webhook helpers, safety guardrails
Claude Agent wrapper
runAgent(), tool-set factories, pricing table, JSONL traces
Implementer role
Clone, agent loop, safety checks, commit, push, open PR
Webhook receiver
Hono app, signature validation, dedupe, in-process dispatch
Linear integration
OAuth, Agent Session activities, state transitions
Reviewer role
Read-only agent, structured JSON, GitHub review posting, merge finalizer
Slack integration
Threaded updates, /kanman commands, approver allowlist
Loop cap + escalation
escalate() entry point, loop cap enforcement, safety routing
Cloud Run deploy
Dockerfile, deploy script, Cloud SQL + Secret Manager runbooks
Always shipping.
2a12fc2Linear 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.
7aa954cAuto-revert when a Linear ticket is cancelled
Cancelling a ticket post-merge triggers a clean revert PR instead of a manual rollback.
6d749daObservability: tool-call tags, heartbeats, boot fingerprints
Every agent run is traceable and recoverable; long-running implementations stay alive.
4600c6dDebug Ticket: end-to-end investigation command
One command surfaces the full lifecycle of any Kanman Linear ticket for triage.
975b8a8AI usage and cost summarization
Per-ticket token and dollar accounting from the Anthropic SDK, surfaced to Linear.
What it's built on.
An AI teammate Goodcall's engineers actually use.
The system we built for Goodcall, in concrete terms.
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.
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.
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.
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.
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".
Want this for your company?
We build AI-native software with engineers who know how to ship.
Get in touch->