One API
Skills, plugins & capability injection
The platform does not ship one agent per behaviour. It ships one agent — one-agent, whose
loop mode runs the mission (see Agents plane) — into which
capabilities are injected per run. Capability injection is the six kinds below: skills,
experts, persona, backgrounds, plugins, and MCP servers. You declare them on a type: harness task
and the loop host resolves them in one parallel pass before the run
(core/core-base/pack-enrich.ts). Base URL is https://api.plungeai.com; runs use an ozk_ key
(Authentication).
14.1 The six kinds
| Kind | What it injects | Where it comes from | Eager limit | Field |
|---|---|---|---|---|
| backgrounds | always-on ambient context, prepended first | registry card prompt_format | 3 | backgrounds: [id, …] |
| persona | identity / voice, prepended | persona-memory | 1 (one voice per run) | persona: id (aliases digital_twin, personas[0]) |
| experts | labelled ## EXPERT: <id> sections | expert-memory | 3 | experts: [id, …] |
| skills | an ## ADDITIONAL INSTRUCTIONS body | skill-memory, else the registry skill card | 5 | skills: [id, …] |
| plugins | a bundled SKILL.md index + script index (never MCP ids) | plugin-memory | — | plugins: [id, …] |
| mcp | remote MCP tools, connected for the run and exposed under the fence | mcp-executor (secrets resolved server-side) | — | mcp: [id, …] |
Injection order into the system prompt: backgrounds → persona → experts, then the skill body
under ## ADDITIONAL INSTRUCTIONS. Plugin scripts become available to the run_python tool;
plugin skills are advertised by name + description and pulled on demand with load_skill. MCP
ids are connected by the loop host through the mcp-executor (the same machinery as the
MCP plane outbound runs) and their tools appear as mcp__<server>__<tool> under the
mission's fence.
14.2 Limits & degradation
- Total eager budget across backgrounds + persona + experts + skills is
EAGER_BUDGET_BYTES= 24 KiB (pack-enrich.ts). Over budget, later items are listed by id + description instead of injected — the agent pulls them on demand viaload_skill(progressive disclosure). - Per-kind caps:
skills5,experts3,backgrounds3 (MAX_EAGER). Ids beyond the cap are deferred toload_skillthe same way. - Fail-soft: a missing or unresolvable capability degrades to a warning lane, it does not
fail the run. A missing MCP credential surfaces as a structured
needs_connection:<provider>. - Arrays replace, they don't union — the most specific layer wins per key (14.4).
14.3 The skill catalog
Skill sources live in skills/<id>/SKILL.md; the runtime injects the published registry skill
card. The live catalog is the source of truth — discover it with
GET /v1/discovery/search?kind=skills (Discovery). Install PlungeAI's own agent
skills from the skills catalog (opens in a new tab). The ids on disk today (skills/):
| id | one line |
|---|---|
web-search | search the web and cite sources |
report | structure findings into a clean report |
refactor | refactor code toward a smaller, clearer shape |
code-review | review a diff for correctness and simplification |
debug | systematic root-cause debugging |
file-ops | read/write/search files in the workspace |
prd | draft a product requirements document |
qa | test-and-verify discipline |
thinking | structured reasoning before acting |
workflow | author a CNL workflow |
biotech | biotech-domain research helper |
curl -s "https://api.plungeai.com/v1/discovery/search?kind=skills&q=web-search&limit=5" \
-H "Authorization: Bearer $PLUNGE_API_KEY"Plugins are bundled SKILL.md indexes + runnable scripts (not MCP servers). Discover them with
kind=plugins; MCP servers (the mcp: kind) with kind=mcp-servers:
curl -s "https://api.plungeai.com/v1/discovery/search?kind=mcp-servers&limit=5" \
-H "Authorization: Bearer $PLUNGE_API_KEY"The discovery kinds
personasandexpertsreturn cards (live-verified 2026-10-05: 20 of each on a first page ofGET /api/registry/search?kind=personas&q=assistant, same forkind=experts; persona cards havetype: digital_twin). The card is the catalog entry; persona/expert text is still resolved from the persona-memory / expert-memory services at run time.
14.4 Pre-built agent cards — mission_ref / pack
A pre-built agent is a registry agent card whose prompt_format holds one portable markdown
document: YAML frontmatter (a typed capability pack) plus a body that is the system prompt,
compiled on read by core/core-base/agent-markdown.ts. Reference it instead of writing the mission
inline:
- type: harness
agent: one-agent
mission_ref: research-analyst # canonical; `pack:` is an alias; a single-token `mission:` also worksFrontmatter keys the compiler reads: name, description, model, effort, tools, skills,
experts, persona, backgrounds, plugins, mcp, agents (named sub-agents), permissions,
success_criteria — plus the body. Unknown keys are ignored with a warning (forward-compatible);
ownership/visibility are stamped server-side, never read from frontmatter. Merge order (per key,
last wins): pre-built card → workflow root → task; arrays replace. So a card can define the base
mission and the task can override model or clear skills: [].
14.5 How to run it
Workflows plane (recommended) — a type: harness task carries the mission and its capability
fields; run it inline or save it (see Workflows plane). A full example:
workflow:
name: sourced-brief
tasks:
- type: harness
id: brief
agent: one-agent
goal: "Write a one-paragraph brief on the latest Anthropic model; every claim a source URL."
mission: "You are a research analyst. Produce sourced, factual briefs."
allowed_tools: [web_search, web_fetch, task_complete]
success_criteria:
- "Every factual claim is followed by a source URL."
max_iterations: 8
skills: [web-search, report]
experts: [python-pro]
persona: analyst
backgrounds: [acme-corp]
plugins: [finance-bundle]
mcp: [brave-search]allowed_tools is the fence (fail-closed — a tool not listed never executes); max_iterations
(alias max_turns) is the loop cap; effort (quick/standard/deep) sets a default cap when no
explicit number is given.
Agents plane — POST /v1/agents/:id/execute forwards only persona among the capability
fields (routes/agents.ts); skills, experts, backgrounds, plugins, mcp, goal,
allowed_tools are ignored there. To inject skills/plugins/MCP, use the type: harness task on
the workflows plane, or the MCP plane plungeai_run_mission.
A minimal harness run with a real skill injected, capped at 2 iterations:
curl -s "https://api.plungeai.com/v1/workflows/execute" \
-H "Authorization: Bearer $PLUNGE_API_KEY" -H 'Content-Type: application/json' \
-d '{"workflow":{"name":"cap-demo","tasks":[{"type":"harness","id":"h1","agent":"one-agent","goal":"Reply with the single word pong, then call task_complete.","mission":"You are a terse assistant. Answer in one word.","allowed_tools":["task_complete"],"max_iterations":2,"skills":["report"]}]}}'14.6 Seeing what was injected
The enrichment pass reports what it resolved and what degraded (pack-enrich.ts): capabilities that
could not be resolved appear as warning lanes, and those dropped for the eager budget/cap are
reported as deferred (loadable with load_skill). These surface in the run's result metadata and
in the trace spans (Traces & observability); a missing skill shows up as
a warning rather than silently absent behaviour. For the full runtime model — tool fence, memory,
delegation, recursion guard — see orchestration/HARNESS-README.md.