Competency Manifest Field Rationale
Date: 2026-07-08 (revised — verified against CompetencyManifest in crates/platform/hoziron-core-types/src/types.rs and crates/platform/hoziron-core/src/competency/{manifest,equip}.rs)
Related: ADR-028, ADR-050, ADR-051, ADR-056, Issue #243
What Is a Competency?
A competency is a professional certification, not a job description. It grants domain knowledge, tools, and constraints to an agent — but doesn't act independently. An agent's character emerges from the combination of its equipped competencies and their ordering.
Competencies are composable building blocks:
claims-data-extraction+client-facing-communication→ empathetic intake agentclaims-data-extraction+investigative-analysis→ skeptical verification agent
Same domain knowledge, different character by composition.
Manifest Fields: What They Do and Why
Operational (wired to agent state at equip time)
| Field | What it does | Where it lives | Rationale |
|---|---|---|---|
system_prompt | Injected into the agent's system prompt at equip position | CompetencyManifest | The core value — defines the persona/knowledge this competency contributes |
skills | Resolved to the agent's tool allowlist; skills must be installed pre-equip | CompetencyManifest | Defines the capability surface (what tools this competency grants) |
permissions | Validated against the agent's declared permissions at equip time — equip is rejected (PermissionDenied) if the agent lacks any listed permission | CompetencyManifest | Security contract — a competency cannot silently grant an agent more access than the agent was declared to have |
contracts | Resolved at equip time to whichever installed integration declares the named contract (ADR-051 — swappable backend, matched by contract name rather than a hardcoded package). Unsatisfied contracts also block agent activation outright — activate_agent refuses Suspended → Running with Cannot activate agent: contract(s) [...] have no installed provider (ADR-056) | CompetencyManifest | Lets a competency depend on "a policy-admin integration" abstractly instead of naming one vendor's MCP server, while still hard-failing activation (not just a silent equip-time warning) if nothing satisfies it |
integrations | Direct, fixed MCP server binding by package name (ADR-050, the path that predates contracts) — wired into the agent's resolved mcp_servers list at equip time alongside contract-resolved servers | CompetencyManifest | For backends that are not swappable across deployments (universal/fixed MCPs) |
settings (schema) | Declares configurable parameters with types and defaults | CompetencyManifest | Enterprise buyers need per-deployment config without code changes |
settings (values) | Resolved at equip time, injected as a prompt block after the competency's system prompt | EquipBinding.config | Per-agent/per-deployment overrides of the schema defaults |
schedule | Creates a cron job in the kernel scheduler on equip (a default suggestion, operator-overridable) | CompetencyManifest (default), EquipBinding (actual) | Declarative cadence for autonomous execution |
schedule_action | The message sent to the agent when its cron job fires (CronAction::AgentTurn.message); falls back to "Execute scheduled competency task" if unset | CompetencyManifest | Separates HOW from WHEN: the system prompt teaches the skill, this field is the specific, actionable instruction for a scheduled turn — not knowledge, an instruction |
contracts and integrations are actively wired into the agent's MCP server list at equip time, and contracts additionally gates whether the agent can activate at all.
Stored but not enforced at runtime (future value)
| Field | What it does today | Future value | When |
|---|---|---|---|
inputs | Parsed and stored in the manifest (ACORD-aligned data contract) | Invocation payload validation; workflow composition typing | Phase 3 (structured invocation, ADR-023) |
outputs | Parsed and stored in the manifest (ACORD-aligned data contract) | Response schema enforcement; workflow pipe typing | Phase 3 (structured invocation, ADR-023) |
Cosmetic / organizational
| Field | Purpose |
|---|---|
id | Unique identifier, used for equip/unequip/catalog operations |
name | Human-readable display name |
version | Semantic version (e.g. "1.2.0"); defaults to "0.1.0" if omitted |
description | What this competency enables (catalog, CLI, dashboard) |
There is no category field on the competency manifest. Domain taxonomy (categories) is declared one layer up, at the package level (MANIFEST.toml's [package.metadata]), not on CompetencyManifest/COMPETENCY.toml. The two manifests are easy to conflate since a competency is usually packaged 1:1 with its own MANIFEST.toml, but they are distinct schemas parsed by distinct code paths.
There is no metrics field on the competency manifest.
The package manifest schema (MANIFEST.toml) has no [optional-dependencies]/[peer-dependencies] section — only [dependencies] is ever walked for transitive fetching by the catalog resolver. The competency manifest this document covers has never had those fields either.
Where Things Live: Competency vs. Agent vs. Binding
The key insight: what you know lives on the competency, what you are lives on the agent, and how you're configured lives on the equip binding.
| Concept | Owner | Rationale |
|---|---|---|
| System prompt | Competency | Reusable domain persona, authored once by the competency creator |
| Required skills/tools | Competency | Capability surface, same for all agents equipping it |
| Required permissions | Competency | Security contract, same for all agents |
| Contracts / integrations | Competency | External MCP dependencies of the role — resolved per-deployment, not authored per-agent |
| Inputs/outputs | Competency | Data contract for composition, same for all agents |
| Setting schema | Competency | What's configurable, with types and defaults |
| Setting values | Equip binding | Per-agent/per-deployment overrides |
| Schedule default | Competency | Suggested cadence |
| Schedule actual | Equip binding → kernel cron | Operator may override; cron job is independently manageable |
| Model config | Agent | Execution infrastructure, orthogonal to role |
| PII egress policy | Operator (carrier-owned policy file, not agent or competency) | One carrier-owned, file-sourced policy governs every agent uniformly (ADR-049) — there is no agent-level "trust policy" an agent or its competencies can set or relax. |
| Permissions (grants) | Agent | Grants (competency requires, agent has) |
There is no triggers field or concept on the agent or competency manifest — see invocation-model.md for how invocation sources are actually gated.
Schedule Design
Cron is a platform-level resource, not owned by the competency or agent:
- Competency manifest declares
schedule = "0 */6 * * *"(a default suggestion) and, optionally,schedule_action(the instruction sent on each fire) - On equip, a
CronJobis created in the kernel'sCronScheduler - The cron job sends periodic messages to the already-running agent (
CronAction::AgentTurn), usingschedule_actionif set or"Execute scheduled competency task"otherwise - The operator can independently pause/delete/override cron jobs without unequipping
- On unequip, the cron job is cleaned up (ignore if already deleted)
hoziron-cli competency check-schedulesreports drift between declared and actual schedulesPOST /agents/{id}/competencies/{cid}/reset-schedulerecreates a deleted job from manifest defaults
Agents don't self-schedule. The kernel's cron loop fires messages TO agents on a timer. If an operator accidentally deletes a competency's cron job, the competency remains equipped and functional for on-demand use — it just stops receiving periodic triggers.
Settings Design
Settings are the runtime configuration surface for enterprise deployments:
- The schema is authored in COMPETENCY.md (
Vec<SettingDef>with key, type, default, options) - The values are provided per-agent at equip time or updated via API
- Resolved settings are injected as a prompt block after the competency's system prompt
- Settings are scoped per-binding — two agents with the same competency can have different values
Example: FNOL intake competency has settings for cost_cap, language, policy_admin_url. Different carriers deploy with different values. No code change, no prompt surgery, no repackaging.
Multi-Competency Ordering
Order determines prompt priority. Earlier in the stack = earlier in the system prompt = more weight in LLM attention.
fnol-intake-agent:
1. claims-data-extraction → "You extract structured FNOL data..."
2. client-facing-communication → "You communicate with empathy..."
3. regulatory-compliance → "You never disclose PII..."
The agent's identity is "claims specialist" first, "communicator" second, "compliant" third. Swap 1 and 2 and you get a subtly different agent — primarily a communicator who knows claims.
This gives non-technical operators a tunable knob: "this agent is too formal — move client-communication above claims-extraction." Config change, not code change.
Important caveat: Prompt ordering influences behavior but doesn't strictly override. LLMs don't have deterministic priority parsing. Hard constraints (permissions, tool access, contract resolution, PII egress) are mechanically enforced. Soft behavior (tone, approach) is influenced by position.
Competency Tiers (Library Design)
With multi-competency, the package library shifts from "job roles" to "composable certifications":
| Tier | Purpose | Examples |
|---|---|---|
| Domain Knowledge | What you know about | claims-data-extraction, sa-fnol-fraud-signals, regulatory-knowledge-popia |
| Behavioral Modes | How you operate | client-facing-communication, investigative-analysis, escalation-judgment |
| Constraints | What you must/must not do | fais-advisory-boundary, no-decisions, cost-cap-enforcement |
Existing monolithic competencies (100+ insurance job roles) remain valid as single-equip packages. The new composable tier is additive — it enables differentiation without invalidating the existing library.