Skip to content

Capability Mapping Matrix

The capability mapping matrix is the product’s single contract for “what does the agent get, and from where.” Every capability class (skills, built-in tools, MCP servers, Pi extensions, plugins, context/memory) crossed with every assignment layer (default agent, Agent Profile, Space, user) has exactly one answer here: assignable or not, with which verb, landing in which injection destination.

  • The default agent and Agent Profiles grant reach — skills, MCP servers, extensions, built-in tools.
  • Spaces and users shape behavior without granting reach: a Space carries context, skills, and restrictive overrides (blocked tools, model/budget/guardrails); a user carries identity, memory, and self-serve connections (OAuth, plugin activations) and is never directly assigned capabilities.
ClassAgent (default)Agent ProfileSpaceUser
SkillsGrant — catalog install / workspace folderGrant — skill_policy.skillSlugs subsetCarry — space skills/ folder; same-slug overrides agentNever assigned — plugin activation gates visibility per user
Built-in toolsOn by default; restrictable via blocked_toolsGrant — subset via tool_policy.builtInToolsRestrict only — blocked toolsNever
MCP serversGrant — registry row + enablementGrant — subset via tool_policy.mcpServers + per-server tool allowlistRestrict only — blocked/allowed serversSelf-serve auth only — per-user OAuth tokens
Pi extensions (bundled)Platform-wired — capability flagsNeverNeverNever
Pi extensions (dynamic)Grant — assignment with target default_agentGrant — assignment with target agent_profileNeverNever
Plugins (apps)Install — tenant-wideNeverNeverActivate per-user — OAuth; activation gates plugin skills/servers
Context / memoryCarry — agent workspace rootCarry — profile instructionsCarry — Space folder (SPACE.md, files)Carry — users/<slug>/ (USER.md, memory)
Connections (folder)Grant — signed connections/<slug>/ sidecarNeverNever — v1; space-source folders are THINK-174Self-serve auth only — per-user OAuth satisfies user-principal
Tools (folder)Grant — signed tools/<slug>/ sidecarNeverNever — v1; space-source folders are THINK-174Never

Where each assignable cell actually lands at agent startup — the rendered per-thread filesystem and the injected runtime config:

ClassInjection destinationGating applied on the way in
SkillsRendered workspace skills/<slug>/ folders + CONTEXT.md routing lines; runtime skillsConfigTrust gate (current passed trust report), agent blocked_tools filter, plugin activation gate (per requester)
Built-in toolsRuntime skillsConfig env overlays + tool allowlist in the agent sessionTemplate opt-in + tenant credential row + blocked_tools
MCP serversmcp_configs in the invoke payload → runtime MCP toolsAttached set from the capabilities manifest (folder-dispatch agents) or workspace mcp/<slug>/.assignment.json files — the agent_mcp_servers dispatch read is retired; approved + enabled registry row; per-user OAuth resolution (fail closed for plugin servers with no requester); TOOLS.md policy filter
Pi extensions (bundled)Extension factories + tool-allowlist fold in the containerCapability flags
Pi extensions (dynamic)pi_extensions in the invoke payload → proxy loaderApproved version + verification report + artifact integrity; container permission gate (missing_granted_provider / unavailable_provider); runner enablement
Plugins (apps)Plugin-projected MCP rows + namespaced skills/<key>--<slug>/ foldersPer-user activation gate (fail closed with no requester)
Context / memoryRendered per-thread workspace mounts: agent → root, space → Spaces/<slug>/, user → User/, participants → Users/<slug>/, thread → Thread/Space access mode (membership check); renderable-path filters

These are the current rules, documented — not new behavior:

  • Blocked tools: union across layers (agent ∪ space).
  • Allowed tools: intersection across layers.
  • Blocked wins over allowed.
  • Same-slug skills: a Space skill overrides an agent skill with the same slug.
  • Model routing: precedence order agent (10) → space (20) → active workspace (30) → user (40); higher precedence overwrites per key.
  • Agent Profiles: a space-local profile (projected from a Space source’s agents/ folder) shadows a central profile with the same slug while its Space is active.

Every matrix cell begins with one of the canonical verbs, enforced by scripts/check-capability-matrix.mjs:

VerbMeaning
GrantThis layer can attach the capability, extending agent reach
CarryThis layer contributes content/behavior without granting new reach
RestrictThis layer can only narrow what other layers granted
NeverNot assignable at this layer, by product decision
OnEnabled by default at this layer (restrictable)
InstallTenant-wide installation act (operator)
ActivatePer-user activation act (self-serve)
Self-serveUser-owned connection/auth only, no capability grant
Platform-wiredWired by platform capability flags, not operator-assignable

The capability inspector renders the effective merged capability set for any agent × Space × profile × user selection, computed through the runtime’s own composer — and per-turn capability manifests record what the runtime actually loaded. Divergence between this matrix, the inspector, and the manifests is a defect: report it against the cell it violates.