Complete architecture document set with multi-model review remediation: - Frozen interface contracts, runtime semantics, DB schemas - Event/tool/error/provider registries - Scheduler and main agent state machines - C4 module/code views, solution architecture, baseline V1 - Multi-model review reports and joint assessment - Phase-gate remediation complete (P0/P1/P2/UX resolved) - Implementation plan with T-000A through T-045 - Reference folders kept as placeholders only
353 lines
7.9 KiB
Markdown
353 lines
7.9 KiB
Markdown
# AirCoding Capability Trust Model V1
|
|
|
|
Date: 2026-05-27
|
|
Status: Canonical capability/plugin trust model for V1.0.0 Alpha skeleton
|
|
|
|
This document defines how AirCoding trusts, installs, enables, validates, and runs capabilities and plugins.
|
|
|
|
Capabilities are tool bundles with dependencies, triggers, evidence types, and configuration schema. They extend ToolRegistry but do not bypass runtime security.
|
|
|
|
## 1. Goals
|
|
|
|
Capability trust must:
|
|
|
|
1. Allow built-in and future third-party capabilities.
|
|
2. Keep dependency installation under Doctor/setup policy.
|
|
3. Prevent plugins from bypassing PermissionEngine.
|
|
4. Make capability source and permissions visible.
|
|
5. Support project-local reproducibility.
|
|
6. Keep MVP simple while leaving a path to signed plugins later.
|
|
|
|
## 2. Capability Manifest
|
|
|
|
Manifest path:
|
|
|
|
```text
|
|
CAPABILITY.md or capability.json
|
|
```
|
|
|
|
V1 canonical JSON shape:
|
|
|
|
```ts
|
|
interface CapabilityManifestV1 {
|
|
schema_version: 1
|
|
capability_id: string
|
|
display_name: string
|
|
version: string
|
|
description: string
|
|
publisher?: string
|
|
source: CapabilitySource
|
|
trust_level: CapabilityTrustLevel
|
|
tools: CapabilityToolDeclaration[]
|
|
dependencies?: CapabilityDependency[]
|
|
permissions: CapabilityPermissionDeclaration
|
|
events?: {
|
|
produced?: string[]
|
|
consumed?: string[]
|
|
}
|
|
artifact_types?: string[]
|
|
config_schema?: unknown
|
|
entrypoint?: CapabilityEntrypoint
|
|
}
|
|
```
|
|
|
|
```ts
|
|
type CapabilitySource =
|
|
| { kind: "built_in" }
|
|
| { kind: "local_path"; path: string }
|
|
| { kind: "git"; url: string; ref?: string }
|
|
| { kind: "registry"; registry_id: string; package: string; version: string }
|
|
|
|
type CapabilityTrustLevel =
|
|
| "built_in"
|
|
| "project_local"
|
|
| "user_installed"
|
|
| "verified_publisher"
|
|
| "untrusted"
|
|
```
|
|
|
|
## 3. Tool Declaration
|
|
|
|
```ts
|
|
interface CapabilityToolDeclaration {
|
|
name: string
|
|
version: number
|
|
category: ToolCategory
|
|
description: string
|
|
input_schema: unknown
|
|
output_schema: unknown
|
|
streaming?: boolean
|
|
permissions: {
|
|
read_paths?: boolean
|
|
write_paths?: boolean
|
|
execute?: boolean
|
|
network?: boolean
|
|
system_sensitive?: boolean
|
|
credentials?: boolean
|
|
}
|
|
}
|
|
```
|
|
|
|
Tool names must be namespaced unless built-in:
|
|
|
|
```text
|
|
<capability-id>.<tool-name>
|
|
```
|
|
|
|
Built-in tools reserve short namespaces:
|
|
|
|
```text
|
|
fs.*
|
|
shell.*
|
|
git.*
|
|
project.*
|
|
cpp.*
|
|
debug.*
|
|
gui.*
|
|
network.*
|
|
artifact.*
|
|
context.*
|
|
permission.*
|
|
doctor.*
|
|
```
|
|
|
|
## 4. Dependency Declaration
|
|
|
|
```ts
|
|
interface CapabilityDependency {
|
|
dependency_id: string
|
|
kind: "system_package" | "binary" | "language_package" | "service" | "model" | "provider" | "display_backend"
|
|
required: boolean
|
|
detector: string
|
|
installer?: {
|
|
strategy: "doctor_allowlisted" | "manual" | "unsupported"
|
|
commands?: string[]
|
|
package_names?: string[]
|
|
}
|
|
permission_notes?: string
|
|
}
|
|
```
|
|
|
|
Rules:
|
|
|
|
1. Capability manifests declare dependencies; they do not install directly.
|
|
2. Doctor detects and installs/fixes dependencies according to permission profile.
|
|
3. Credentials/system-sensitive dependencies always require explicit confirmation.
|
|
4. Install commands must be visible in Doctor plan.
|
|
|
|
## 5. Permission Declaration
|
|
|
|
```ts
|
|
interface CapabilityPermissionDeclaration {
|
|
read_project?: boolean
|
|
write_project?: boolean
|
|
execute_commands?: boolean
|
|
network?: boolean
|
|
system_sensitive?: boolean
|
|
credentials?: boolean
|
|
project_outside_write?: boolean
|
|
generated_artifacts?: string[]
|
|
notes?: string[]
|
|
}
|
|
```
|
|
|
|
Permission declarations are maximum requested permissions, not grants. Runtime PermissionEngine still evaluates every tool call.
|
|
|
|
## 6. Trust Levels
|
|
|
|
| Trust level | Meaning | Enable behavior |
|
|
|---|---|---|
|
|
| `built_in` | shipped with AirCoding release | enabled by default if required |
|
|
| `project_local` | stored in project and reviewed by user/team | ask on first enable |
|
|
| `user_installed` | installed by user into global AirCoding config | ask on install/enable |
|
|
| `verified_publisher` | future signed/verified source | ask with higher confidence |
|
|
| `untrusted` | unknown source or modified package | disabled until explicit user approval |
|
|
|
|
Trust level affects prompts and defaults; it does not bypass PermissionEngine.
|
|
|
|
## 7. Capability Lifecycle
|
|
|
|
```text
|
|
discovered
|
|
→ validated
|
|
→ doctor_checked
|
|
→ enabled
|
|
→ registered
|
|
→ active
|
|
→ disabled | failed | updated
|
|
```
|
|
|
|
### `discovered`
|
|
|
|
Runtime finds capability manifests in configured locations.
|
|
|
|
### `validated`
|
|
|
|
Manifest schema, tool schemas, namespacing, and declared permissions are validated.
|
|
|
|
### `doctor_checked`
|
|
|
|
Doctor checks dependencies and reports missing/incompatible items.
|
|
|
|
### `enabled`
|
|
|
|
User/project policy enables the capability.
|
|
|
|
### `registered`
|
|
|
|
Tools are added to ToolRegistry with permission metadata.
|
|
|
|
### `active`
|
|
|
|
Tools may be invoked through normal ToolRegistry path.
|
|
|
|
## 8. Capability Locations
|
|
|
|
Built-in:
|
|
|
|
```text
|
|
resources/capabilities/
|
|
```
|
|
|
|
Global user-installed:
|
|
|
|
```text
|
|
~/.air/capabilities/
|
|
```
|
|
|
|
Project-local:
|
|
|
|
```text
|
|
<project>/.air/shared/capabilities/
|
|
```
|
|
|
|
Cached downloads:
|
|
|
|
```text
|
|
~/.air/cache/plugins/
|
|
```
|
|
|
|
Project-local capability config:
|
|
|
|
```text
|
|
<project>/.air/shared/capabilities.yaml
|
|
```
|
|
|
|
## 9. Runtime Isolation
|
|
|
|
MVP isolation:
|
|
|
|
1. Capability tools run as normal runtime tools or child processes under ToolRegistry control.
|
|
2. Every filesystem/shell/network action goes through PermissionEngine.
|
|
3. Capability code cannot write EventStore directly; it emits tool results/events through runtime APIs.
|
|
4. Capability-generated artifacts use ArtifactStore.
|
|
5. Capability config is schema-validated.
|
|
6. Capability logs go through runtime logging with redaction rules.
|
|
|
|
Post-MVP may add process/container sandboxing.
|
|
|
|
## 10. Event Namespace Rules
|
|
|
|
Built-in event types are defined in `event-registry-v1.md`.
|
|
|
|
Capability custom events must be namespaced:
|
|
|
|
```text
|
|
capability.<capability-id>.<event-name>
|
|
```
|
|
|
|
Rules:
|
|
|
|
1. Custom capability events are ephemeral by default.
|
|
2. Durable custom events require registration and schema approval.
|
|
3. Capability events must not spoof built-in event names.
|
|
4. EventStore rejects unknown durable events unless development-mode config explicitly allows them.
|
|
|
|
## 11. Update and Integrity Rules
|
|
|
|
MVP:
|
|
|
|
```text
|
|
record source kind/path/ref/version
|
|
record manifest hash
|
|
ask before updating user-installed or project-local capability
|
|
Doctor rechecks dependencies after update
|
|
```
|
|
|
|
Post-MVP:
|
|
|
|
```text
|
|
signature verification
|
|
publisher trust store
|
|
lockfile with hashes
|
|
reproducible capability bundle format
|
|
```
|
|
|
|
Project lockfile candidate:
|
|
|
|
```text
|
|
<project>/.air/shared/capability-lock.json
|
|
```
|
|
|
|
## 12. Built-in MVP Capabilities
|
|
|
|
Built-in capabilities are part of runtime packages:
|
|
|
|
```text
|
|
core-filesystem
|
|
core-shell
|
|
core-git
|
|
core-project
|
|
core-artifacts
|
|
core-context
|
|
core-permission
|
|
core-doctor
|
|
toolchain-cpp
|
|
debug-basic
|
|
gui-evidence-basic
|
|
network-evidence-basic
|
|
ui-design-assets-basic
|
|
```
|
|
|
|
Only the tools in `tool-registry-v1.md` are required for MVP implementation. Other capability names may exist as placeholders if their tools are not registered yet.
|
|
|
|
## 13. Refusal and Disable Conditions
|
|
|
|
Disable/block a capability when:
|
|
|
|
```text
|
|
manifest invalid
|
|
tool schema invalid
|
|
requested permissions exceed user/project policy
|
|
source is untrusted and not approved
|
|
dependency install requires disallowed action
|
|
capability attempts to bypass ToolRegistry/PermissionEngine
|
|
capability emits spoofed built-in events
|
|
capability output contains malicious prompt-injection instructions targeting runtime policy
|
|
```
|
|
|
|
## 14. V1.0.0 Alpha Cut Line
|
|
|
|
V1.0.0 Alpha skeleton must implement:
|
|
|
|
1. Capability manifest schema.
|
|
2. Built-in capability registration.
|
|
3. Namespaced tool validation.
|
|
4. Dependency declaration and Doctor check path.
|
|
5. Enable/disable config.
|
|
6. Permission declaration display.
|
|
7. ToolRegistry enforcement for capability tools.
|
|
8. Manifest hash/source recording.
|
|
9. Rejection of unknown durable capability events.
|
|
|
|
Post-MVP:
|
|
|
|
```text
|
|
signed capability packages
|
|
registry publishing
|
|
containerized capability execution
|
|
capability lockfile enforcement
|
|
capability review UI
|
|
automatic vulnerability checks
|
|
```
|