Skills & Tools Architecture — The Capability Spine¶
Status: Canonical. Supersedes the fragmented capability narrative spread across
AD-422/423, AD-428, AD-429b, AD-441c, AD-531+, AD-543, AD-596, and the orphaned
unified-tool-layer.md. Read this first before touching anything that calls
itself a "skill" or a "tool".
Repo: OSS. This document describes how the product works. The commercial overlay (Agent Services Automation) builds on this spine — see Commercial Overlay Connection — but its pricing/PSA/billing layers live in the private repo.
1. Why this document exists¶
ProbOS shipped a lot of capability infrastructure across many ADs, and three unrelated things ended up being called a "skill":
- The legacy self-mod
Skill(types.py— a Python code handler attached to aSkillBasedAgent). - The developmental
SkillDefinition(AD-428 — a competency an agent acquires and grows from proficiency 1→7). - The AgentSkills.io
CognitiveSkillEntry(AD-596 — aSKILL.mdinstruction file loaded into an agent's context).
Meanwhile the Tool Registry (AD-423), the ACM (AD-427, "HR for agents"),
the Role/Qualification ontology (AD-429b), the Duty/Workforce scheduling
(AD-419, AD-496–498), and the skill→tool binding design (unified-tool-layer.md)
were each built in isolation. The pieces exist; the edges between them were
never wired. This document defines the coherent target and the convergence
sequence (AD-885 → AD-890) that finishes the wiring.
2. The two-concept model (industry-aligned)¶
The naming collision dissolves once we adopt the same split that Claude Code and GitHub Copilot use:
| Concept | Means | The thing the agent... | Lives in |
|---|---|---|---|
| Tool | A deterministic capability that executes | ...invokes to act | Tool Registry (master) |
| Skill | A competency / knowledge that shapes reasoning | ...has (knows how to do) | Skill Library (master) |
The dividing line: a tool runs (code executes, returns a result); a skill is loaded (instructions/knowledge that change how the agent reasons, or a proficiency record that gates what it's trusted to do).
How the three "skills" resolve¶
| Current thing | What it actually is | Belongs in |
|---|---|---|
Legacy self-mod Skill (types.py) |
Deterministic Python the agent invokes | Tool Registry (ToolType.UTILITY_AGENT / DETERMINISTIC_FUNCTION, origin="designed") |
SkillDefinition (AD-428) |
Developmental competency (Dreyfus 1–7) | Skill Library (the proficiency dimension) |
CognitiveSkillEntry (AD-596, SKILL.md) |
Natural-language instruction knowledge | Skill Library (the instruction dimension) |
So the self-mod pipeline does not "design skills" — it designs tools. The Skill Library is a single master with two kinds of competency record (developmental proficiency + cognitive instruction file), not two registries.
This is the Navy model in
crew-capability-architecture.md: NEC/PQS qualifications (skills) certify a sailor to operate authorized equipment (tools).
3. The capability spine¶
The user-authoritative model, mapped onto real code:
┌─────────────────────────────────────────────────┐
│ ACM — "HR for agents" (assignment + lens) │ AD-427 acm.py
│ onboard · lifecycle · ASSIGN role/skills/tools │
└─────────────────────────────────────────────────┘
│ assigns │ reads (consolidated profile)
▼ ▼
ROLE ───────────────── defines ──────────────── DUTIES / PROCESSES
Ontology Post + DutyScheduleTracker (AD-419)
RoleTemplate (AD-429b) Workforce WorkItems (AD-496–498)
Standing Orders (T1) (the "processes/duties" tier)
│ requires │ performed via
▼ ▼
┌──────────────── SKILL LIBRARY (master) ──────────────────┐
│ competency = what an agent KNOWS HOW to do │
│ • Developmental skills AD-428 skill_framework.py (SQL) │
│ • Cognitive skills AD-596 skill_catalog.py (.md) │
│ Proficiency (Dreyfus 1–7) · prerequisites · decay │
└──────────────────────────────────────────────────────────┘
│ may require (SkillDefinition.preferred_tools — AD-423a)
▼
┌──────────────── TOOL REGISTRY (master) ──────────────────┐
│ capability = what an agent USES to act │
│ • Native SWE tools, browser, MCP, Oracle AD-423/448/449 │
│ • Legacy self-mod "skills" → RECLASSIFIED AS TOOLS │ (AD-886)
│ Permissions (CRUD+O) · LOTO locks · rank-gated grants │
└──────────────────────────────────────────────────────────┘
The chain, in one sentence: An agent is assigned a Role; the Role defines a scope of Duties/Processes; performing a process exercises Skills; a Skill may require Tools to act. The Tool Registry and Skill Library are the masters; ACM is the assignment surface that binds them to a crew agent.
4. The identity axis already drew this line (AD-441c)¶
The crew/tool split is not new — it already exists on the identity axis. The capability axis just never caught up:
| Crew agent (domain/cognitive) | Tool agent (infrastructure/utility) | |
|---|---|---|
| Identity | Sovereign birth certificate (W3C VC, Identity Ledger) | Lightweight AssetTag (serial number) |
| Onboarded via ACM? | Yes | No |
| Capability model | Assigned Skills | Catalogued as Tools |
| The principle | "a person" | "A microwave with a name tag isn't a person. But it still has a serial number." |
AssetTag fields: asset_uuid, asset_type, slot_id, installed_at, pool_name,
tier. The fork lives in crew_utils.is_crew_agent().
Implication: the legacy self-mod Skill is produced by an agent the system
already tags as inventory, not crew. The identity layer already says it's a
tool — AD-886 simply brings the capability layer into agreement.
5. Shipped inventory (what exists today, where)¶
| Layer | Shipped as | File | Status |
|---|---|---|---|
| Assignment / HR | ACM (AD-427) | acm.py |
Lifecycle + partial consolidated profile |
| Role → skills | RoleTemplate (AD-429b) |
ontology/models.py |
Exists; not yet driving assignment |
| Duties / processes | DutyScheduleTracker (AD-419), Workforce (AD-496–498) |
config.py, workforce.py |
Exists; not linked to RoleTemplate |
| Skill Library (developmental) | SkillRegistry / AgentSkillService (AD-428) |
skill_framework.py |
skills.db, proficiency 1–7 |
| Skill Library (cognitive) | CognitiveSkillCatalog (AD-596) |
cognitive/skill_catalog.py |
SKILL.md scan + progressive disclosure |
| Tool Registry | ToolRegistry (AD-423a/b) |
tools/registry.py |
In-memory, permissions + LOTO |
| Native tools | SWE harness (AD-543–549), browser (AD-706), MCP (AD-449), Oracle (AD-696) | tools/executor.py |
Registered at startup |
| Skill→Tool link | SkillDefinition.preferred_tools / ToolPreference (AD-423a) |
tools/protocol.py |
Field exists; no resolver |
| Legacy self-mod skill | Skill dataclass |
types.py |
The third, unconverged "skill" |
6. The data model (verified field shapes)¶
RoleTemplate (ontology/models.py)
post_id: str
required_skills: list[SkillRequirement] # SkillRequirement(skill_id, min_proficiency 1-7)
optional_skills: list[SkillRequirement]
SkillDefinition (skill_framework.py) # the Skill Library master record
skill_id, name, category, description, domain
prerequisites: list[str] # skill_ids required at APPLY+
decay_rate_days: int
origin: "built_in" | "role" | "acquired" | "designed"
preferred_tools: list[ToolPreference] # ← the skill→tool edge (AD-423a)
composite_skill_ids, synergy_partners
ToolPreference (tools/protocol.py)
tool_id: str
priority: int # lower = higher priority
context: str # "when offline", "for large files", ...
ToolRegistration (tools/protocol.py)
tool: Tool # Protocol: tool_id/name/tool_type/description/invoke
tool_type: ToolType # UTILITY_AGENT | DETERMINISTIC_FUNCTION | MCP_SERVER | ...
domain, department, tags, provider, enabled
default_permissions: dict[rank → ToolPermission] # NONE<OBSERVE<READ<WRITE<FULL
concurrency: "concurrent" | "exclusive" # LOTO
CognitiveSkillEntry (cognitive/skill_catalog.py)
name, description, skill_dir, department
skill_id, min_proficiency, min_rank, intents, origin, activation, triggers
AssetTag (AD-441c) # tool-agent identity
asset_uuid, asset_type, slot_id, installed_at, pool_name, tier
Note the spine is already half-modelled in fields: RoleTemplate.required_skills
(Role→Skill), SkillDefinition.preferred_tools (Skill→Tool), and
DutyDefinition.required_skills (Duty→Skill) all exist. The convergence is
mostly about making code traverse these edges, not inventing new ones.
7. The fragmentation seams (and the fix)¶
| # | Seam | Today | Convergence AD | Issue |
|---|---|---|---|---|
| 1 | ACM is blind to most capabilities | get_consolidated_profile reads AD-428 skills only — not cognitive skills, tools, or duties |
AD-885 | #849 |
| 2 | "Skill" means three things | Legacy Skill is a parallel island next to SkillDefinition and CognitiveSkillEntry |
AD-886 | #850 |
| 3 | Two skill registries | AD-428 SkillRegistry and AD-596 CognitiveSkillCatalog are separate stores (bridged by AD-596c, not merged) |
AD-887 | #851 |
| 4 | Skill→Tool never resolves | preferred_tools field exists but nothing turns "exercise skill X" into "invoke tool Y" |
AD-888 | #852 |
| 5 | Role→Skill→Tool never traversed | commission_agent reads a hardcoded ROLE_SKILL_TEMPLATES dict, not the ontology RoleTemplate; tools are never granted from skills |
AD-889 | #853 |
| 6 | Stale design docs | unified-tool-layer.md claims "AD-543" (reused by the Native SWE Harness), orphaning its skill→tool design |
AD-890 | #854 |
8. Convergence sequence (AD-885 → AD-890)¶
Ordered smallest-blast-radius first. Each AD is a single commit; no behavior break.
-
AD-885 — ACM becomes the true single lens. Extend
ACM.get_consolidated_profileto also read the Cognitive Skill Catalog (AD-596), the agent's Tool Registry grants (AD-423), and duty schedule (AD-419). Pure read-aggregation — makes the fragmentation queryable before any behavior changes. Lowest risk, highest clarifying value. -
AD-886 — Reclassify the legacy self-mod
Skillas a Tool. The self-mod pipeline registers designed deterministic handlers into the Tool Registry (ToolType.UTILITY_AGENT/DETERMINISTIC_FUNCTION,origin="designed") instead of attaching ad-hocSkillobjects. Brings the capability layer into agreement with the AD-441c identity layer; designed capabilities gain persistence, permissions, and LOTO governance. -
AD-887 — One Skill Library master. AD-428
SkillRegistryis the single front door; AD-596CognitiveSkillCatalogbecomes an input source (a skill kind), not a parallel store. Builds on the existing AD-596c bridge. -
AD-888 — Skill→Tool binding (finishes the orphaned
unified-tool-layer.mdPart 4). Add a resolver: exercising a skill resolvesSkillDefinition.preferred_tools→ToolRegistry.list_tools()ranked by Hebbian routing, with a capability-tag fallback. The literal "missing link." -
AD-889 — ACM assignment chain: Role → Duties → Skills → Tools. The capstone.
commission_agentreads the ontologyRoleTemplate(not the hardcoded dict) → grants required skills → grants the tools those skills require → registers duties. This is the unification that was intended and never happened. -
AD-890 — Supersede the stale docs. Retire/redirect
unified-tool-layer.md(the AD-543 number collision) and mark this document +crew-capability-architecture.mdas the canonical capability spine.
9. Glossary¶
- Tool — a deterministic instrument an agent invokes (
ToolRegistry). - Skill — a competency an agent has: a developmental proficiency record
(AD-428) and/or a cognitive instruction file (AD-596,
SKILL.md). - Role / Post — an agent's job, defined by an ontology
RoleTemplate(required_skills). - Duty / Process — recurring work a role is responsible for
(
DutyScheduleTracker, WorkforceWorkItem). - ACM — Agent Capital Management; the HR/assignment surface. Onboards crew, assigns skills, grants tools, and is the single consolidated lens.
- AssetTag — a tool agent's lightweight identity (serial number), distinct from a crew agent's sovereign birth certificate (AD-441c).
Commercial Overlay Connection¶
ACM, the Skill Library, and Workforce Scheduling (AD-496–498) are the OSS plumbing for the commercial Agent Services Automation (ASA) vision. The boundary holds:
- OSS (this spine): how capability assignment, scheduling, and execution
work —
BookableResource,WorkItem,Booking, the capability matching, ACM lifecycle and consolidated profile. - Commercial (private repo): how it makes money — PSA financials (contracts, billing, revenue recognition), utilization dashboards, portfolio rollup, and ASA's advanced optimization. These build on top of the OSS entities; they do not fork them.
The convergence ADs in this document strengthen the OSS plumbing that ASA depends on (a single consolidated capability lens, a real Role→Skill→Tool assignment chain), without adding any commercial-tier logic to the OSS repo.