Design an agent skills and harness platform
Expected question
"Two hundred product teams want agents. How do you stop two hundred slightly different ReAct loops — and how do engineers and agents share capabilities without each team owning policy, evals, and side effects?"
Variant forms
Interviewers often ask the same design with different framing — recognize the archetype:
- "Design the internal platform so a new agent capability is a package, not a new microservice."
- "SKILL.md / agent skills vs MCP tools vs the orchestration graph — who owns what?"
- "How do you version prompts, tools, and runbooks so a bad capability can be pinned or yanked?"
- "Cursor/Codex skills for humans, runtime skills for agents — same artifact or two planes?"
- "Design a harness: budgets, traces, eval gates, loop termination — outside the model's head."
- "Our LangGraph templates forked. Every team has a different 'refund allowed?' How do you recover?"
- "What's the difference between a skill, a tool, and a workflow?"
- "How do you prevent a skill from
git pushing production because someone pasted a shell recipe?"
Where this actually gets asked
This is the 2026 Principal version of "design an agent platform" after MCP and IDE-agent skills went mainstream. Anthropic's public skills format and MCP spec are R. It is not a sourced "Company X always asks this phrase." Treat it as the missing layer on top of 03 (orchestration ≠ policy) and 24 (tools aren't trust): how capabilities get into the building so you do not operate 200 graphs.
Open proof for the package shape: vpeetla-ai-skills (O) — installable SKILL.md for engineers. That is not a claim that Lucid or any employer runs this as production AgentOps.
Executive summary
30-second thesis
I'd make capabilities a versioned platform product — skills for how to work, MCP for how to call, a gateway for what may happen in the world, a harness for budgets/traces/eval. The graph is a consumer. The wiki of prompts is not a platform.
2-minute answer
Four layers, four owners. Skills are versioned packages (SKILL.md + scripts + eval fixtures): how an engineer or an agent should do a job. MCP standardizes tool calls; it does not authorize side effects. Gateway / HITL is the only path that can refund, push, or notify. Harness is the outer loop: token/$ ceilings, trace run_id, golden-eval gates, loop termination — the model does not get to decide when to stop spending.
What I'd refuse: a shared LangGraph template that each team forks, then copies policy into the prompt. That's how you get seven "refund allowed?" answers and no fleet kill switch. Also refuse treating IDE skills as the production runtime — Cursor loading a skill is O/R developer UX, not AgentOps.
Promote a skill like you promote a library: registry digest, eval slice that can fail the build, pin, rollback. A skill that shells out to git or prod APIs still goes through the gateway. If it can't, it isn't a skill — it's unsanctioned automation.
What I'd ask them: How many teams already have a graph? Which writes are irreversible today? Is the "skill" for humans in the IDE, agents in prod, or both?
Quantitative trade-offs
| Decision | Trade-off and reversal evidence | Evidence class |
|---|---|---|
| Central skill registry vs per-team repos | Registry gives pin/yank and eval gates; reverse when a BU needs an air-gapped pack and will fund duplicate gates. | H |
| Same artifact for IDE + runtime | One pack reduces drift; reverse when runtime needs signed digest + gateway that an IDE skill must not bypass. | O,H |
| Harness-in-platform vs in-graph | Platform harness gives fleet budgets; reverse for a research sandbox with no prod tools. | H |
| Fat skill (scripts) vs thin skill (prompt only) | Scripts reproduce; prompts drift. Reverse fat skills that hide HTTP around the gateway. | H |
Numbers in delivery are H unless you can defend a measured baseline. Skills-repo install counts are O, not employer adoption.
Migration and rollout
You're migrating how work is packaged, not swapping a model.
- Inventory graphs and prompt wikis. Name which already call irreversible tools.
- Stand a registry: skill id + digest + owner + eval fixture. New capabilities only through the registry.
- Point the harness at existing graphs in shadow: same traces/budgets, no new tools yet.
- Move one high-risk tool path so the skill proposes, gateway decides. Kill switch = yank the skill id, not "tell 40 teams to pull."
- Rollback = previous digest pin. IDE packs can lag runtime; never the other way if runtime is stricter.
Org ownership and operating model
- AI platform owns the registry, harness (budgets, traces, eval gate), and yank.
- Gateway / security owns side effects — skills do not grow a back door.
- Skill owners (domain teams) own content, fixtures, and on-call for that capability.
- Product owns which jobs are skills vs workflows vs "don't agent this" (craft/13).
- Eval owns the slice that can fail a promote. A README is not a gate.
Requirements
Functional
- Publish, pin, yank a skill by digest. Agents and (optionally) IDEs resolve the same id.
- Bind tools only through MCP/registry; irreversible calls still hit the gateway.
- Harness: budget, timeout, max steps, trace id, eval gate on promote.
Non-functional
- Yank in seconds, not a deploy train.
- Fail-closed: unknown skill id or failed digest verify → no tools.
- Honesty: IDE skill load ≠ production serve.
Core entities
- Skill pack — id, digest, owner,
SKILL.md, optional scripts, eval fixtures - Capability grant — which principals/tenants may load which skill
- Harness policy — $ / tokens / steps / wall-clock; kill on breach
- Run —
run_id, skill digest, graph version, trace - Promote record — eval slice, digest, who signed
API / interface
POST /v1/skills
{"id":"aegis-gateway","owner":"ai-platform"} → 201 {"digest":"sha256:..."}
GET /v1/skills/aegis-gateway?pin=sha256:...
→ 200 {"digest":"...","skill_md":"..."} | 404 unknown | 403 principal_not_granted
POST /v1/runs
{"skill_id":"aegis-gateway","digest":"sha256:...","principal":{"tenant_id":"acme"}}
→ 202 {"run_id":"run_..."} | 402 budget_exhausted | 403 skill_not_granted
POST /v1/skills/aegis-gateway/yank
{"reason":"exfil_recipe"} → 204
Staff+ callout: yank is a control-plane call, not a Slack message.
Data Flow
Author pack → eval fixture CI → registry digest → grant to tenant/app → harness starts run (pin digest) → graph may call MCP → gateway on side effects → traces + spend on run_id → promote or yank.
High-level design
Rendering architecture diagram…
Deep dive 1: a skill is not a tool and not a graph
Hard constraint: if you mash them, you cannot yank one without redeploying the product.
- Skill = how to do a job (procedure, constraints, eval).
- Tool = a typed call. MCP makes it discoverable; the gateway makes it allowed.
- Graph = this product's control flow.
A refund skill that embeds curl $ERP is a bypass. The skill should say when to request a refund; the tool + gateway do it.
Deep dive 2: harness vs "the agent will be careful"
Hard constraint: loop termination and $ caps live outside the model.
Harness owns max steps, token/$ ceiling, and "this eval failed — do not promote." The graph may be elegant; without a harness, a stuck tool loop is a blank check. Alerts are not enforcement — same rule as cloud FinOps.
Deep dive 3: IDE skills vs production runtime
Hard constraint: developer UX can be looser; production cannot.
I'd allow the same markdown content in Cursor for humans (O). Production loads only signed digests, with grants and gateway. If a skill tells an IDE agent to push main, that's a documentation smell — the runtime must still refuse. Don't market one install script as AgentOps.
Staff+/Principal signal rubric
- Mid-level: "We'll share a LangGraph template."
- Senior: MCP + some prompt repo; policy still in the graph.
- Staff+: registry + pin; gateway on writes.
- Principal: skills/harness as the org default other teams inherit; yank-in-seconds; IDE ≠ runtime; eval-gated promote. Who inherits: every team that would otherwise fork a graph. Fail-closed: unknown digest, no tools. Clock: lock four layers + one yank story; skip a SKILL.md format lecture.
Follow-up questions to expect
- "Isn't this just an internal npm?" Packages without gateway + eval + yank are libraries. Skills that spend money are control plane.
- "Who writes the skill?" Domain team. Who can yank? Platform + security dual control on high-risk ids.
- "A2A / Agent Cards?" Discovery later. Don't boil a protocol if 40 teams still paste prompts. 24 if they steer.
- "What do you skip in 45 minutes?" Reciting YAML frontmatter. Cover registry, harness, gateway, one yank.
What I'd ask them
- How many teams already have a graph, and which writes are live?
- Same pack for IDE and runtime, or runtime-stricter?
- Who can yank a skill at 2am without a meeting?
Related
- 03 Agent orchestration — graph vs gateway
- 24 Agent IAM and MCP — tools aren't trust
- 13 Durable execution — harness pairs with checkpoints
- 07 Eval platform — gate that fails a build
- 34 HITL at org scale — reviewers, not a node flag
- craft/13 When not to use an agent
- vpeetla-ai-skills — O pack shape
- docs/PRINCIPAL_DELIVERY.md