14 KiB
AIOS V2 模块契约
- 文档版本:
V2R1-hardening-candidate - 状态:加固候选契约基线
- 原则:Control Plane 权威、Runtime 仅执行、默认拒绝、服务级最小权限、全链路租户隔离、所有权威状态可审计和恢复
核心模型名称与实现保持逐字同步:RequestContext 承载可信租户、主体、角色、trace、
session 与 policy version;TaskState 是 AIOS 权威 Task 生命周期枚举,Runtime Worker
不得直接写入或复制该状态机。
1. 通用可信上下文契约
所有控制与执行请求必须携带以下上下文:
| 字段 | 必填 | 说明 |
|---|---|---|
tenant_id |
是 | 权威租户标识 |
principal_id |
控制和 Reconcile 是 | 已认证主体 |
trace_id |
是 | 全链路追踪 |
task_id |
执行阶段是 | AIOS 权威任务 |
agent_id |
执行和 Provenance 是 | 任务绑定 Agent |
provenance_id |
生产副作用操作是 | 父 Workflow Provenance |
run_id |
生产副作用操作是 | 本次执行 Run |
dispatch_id |
Runtime Result 是 | 持久化 Dispatch 记录 |
policy_version |
控制请求是 | 策略版本 |
idempotency_key |
创建/执行是 | 幂等键 |
规则:
- 缺少必填字段时 fail closed。
- 客户端不得覆盖可信代理或 AIOS 生成的租户、身份和追踪字段。
- Runtime 返回的 tenant/task/trace/runtime execution 必须与持久 Dispatch 完全匹配。
- Runtime Result 还必须匹配 Principal、Parent Provenance 和 Run。
- 所有持久化键、缓存键、队列分区、Receipt 和 Evidence 路径必须包含租户命名空间。
2. Tenant Contract
2.1 TenantRecord
tenant_id
display_name
status
metadata
created_at
updated_at
约束:
tenant_id不可为空且不可变。- Tenant 只由 AIOS Control Plane 创建和维护。
- Runtime 不得创建或修改租户。
- 跨租户读取默认返回拒绝或资源不存在,不得泄露存在性。
实现:active-runtime/app/aios_v2/control_plane.py
3. Agent Contract
3.1 AgentRecord
agent_id
tenant_id
display_name
runtime
capabilities
enabled
metadata
created_at
updated_at
约束:
- Agent 属于唯一租户。
runtime由 Registry 决定,可取openclaw、hermes或后续注册 Runtime。capabilities是允许调度的动作集合。metadata仅保存非敏感引用,不得保存明文凭据。
4. Task Contract
4.1 TaskRecord
task_id
tenant_id
agent_id
action
payload
state
revision
idempotency_key
request_digest
result
error
created_by
approved_by
created_at
updated_at
4.2 权威状态机
CREATED -> APPROVED -> RUNNING -> COMPLETED
| | |
+----------+----------+-> CANCELLED
+-> FAILED
允许转换:
| 当前 | 允许目标 | 权威入口 |
|---|---|---|
| CREATED | APPROVED, CANCELLED | Control Plane Approval/Cancel |
| APPROVED | RUNNING, CANCELLED | Orchestrator Dispatch / Control Plane Cancel |
| RUNNING | COMPLETED, FAILED, CANCELLED | Orchestrator Reconcile / Control Plane Cancel |
| COMPLETED | 无 | 终态 |
| FAILED | 无 | 终态 |
| CANCELLED | 无 | 终态 |
约束:
- 每次转换必须校验
revision。 - COMPLETED 必须带
result;FAILED 必须带error。 - 每次转换生成 AuditEvent。
- Runtime 不得直接写 Task Store。
- 公共 API 不得直接把任务推进到
RUNNING、COMPLETED或FAILED。
5. Policy Contract
5.1 PolicyDecision
allowed
reason
policy_version
约束:
- Policy 默认拒绝。
- Runtime 不得覆盖 PolicyDecision。
- 拒绝必须审计。
- 高风险动作必须经过 Approval。
6. Audit Contract
6.1 AuditEvent
event_id
tenant_id
principal_id
trace_id
action
resource_type
resource_id
outcome
policy_version
details
created_at
约束:
- 按租户写入和查询。
details不得包含明文凭据、私钥或完整敏感 Payload。- Runtime callback 可以生成非权威审计事件,但不得单独触发 Task 状态变化。
- Task 状态变化必须经过 Orchestrator 严格 Reconcile。
- 生产版需增加不可变外部固化和完整性验证。
7. Workflow Provenance Contract
7.1 RunProvenance
父 Workflow Provenance 只绑定身份与 Run,不授予操作权限:
provenance_id
run_id
issuer
tenant_id
task_id
agent_id
principal_id
allowed_paths = []
allowed_git_operations = []
issued_at
expires_at
policy_version
key_id
nonce
signature
schema_version
约束:
- 使用 Ed25519 签名。
allowed_paths和allowed_git_operations必须为空。- 撤销或过期父 Workflow 后,全部子 Grant 自动失效。
- 私钥只存在签发端,生产应用只读取公钥。
实现:active-runtime/app/aios_v2/provenance.py
8. Provenance Grant Contract
8.1 ProvenanceGrant
grant_id
parent_provenance_id
grant_type
execution_path
run_id
issuer
tenant_id
task_id
agent_id
principal_id
allowed_git_operations
issued_at
expires_at
policy_version
key_id
nonce
signature
schema_version
Grant 类型与唯一允许路径:
| GrantType | ExecutionPath |
|---|---|
code_change |
code_change |
git |
git_operation |
deployment |
deployment |
runtime |
runtime_execute |
evidence |
evidence_write |
rollback |
rollback |
audit |
audit |
约束:
- 一个 Grant 只允许一个路径。
- Git Grant 必须显式声明具体 GitOperation;非 Git Grant 不得包含 Git 操作。
- 子 Grant 身份字段必须与父 Workflow 完全一致。
- 子 Grant TTL 不得超过父 Workflow。
(grant_id, path, git_operation, request_digest)重复使用时拒绝。- Grant 支持独立
issued/verified/used/expired/revoked生命周期。
实现:
active-runtime/app/aios_v2/provenance_grants.pyactive-runtime/app/aios_v2/provenance_scoped.py
9. Service Scoped Writer Contract
生产进程只加载职责所需 Grant:
- AIOS Application:
runtime_execute、evidence_write、audit。 - Git Worker:
git_operation,代码提交场景另需独立code_changeGrant。 - Deployment Worker:
deployment。 - Rollback Worker:
rollback。 - CLI 单次授权:一个
--path+ 一个--grant-id。
约束:
- 空 Scope 拒绝。
- 多余 Grant 映射拒绝。
- 未配置路径的方法调用拒绝。
- Receipt 必须记录
grant_id、writer_id和服务 Scope。
10. Dispatch Contract
10.1 DispatchRecord
dispatch_id
tenant_id
task_id
agent_id
principal_id
runtime
runtime_execution_id
trace_id
provenance_id
run_id
authorization_id
state
expected_worker_id
result_digest
created_at
updated_at
completed_at
状态:
PREPARED
RUNNING
QUEUED
COMPLETED
FAILED
CANCELLED
约束:
- Dispatch 必须在 Runtime 副作用之前持久化。
- 同一租户的 Task 和 Runtime Execution 各只能绑定一个 Dispatch。
- 终态 Dispatch 不得跳转到不同终态。
- 相同终态结果允许幂等读取,不同结果摘要拒绝。
- SQLite Repository 必须支持按 Task 和 Runtime Execution 恢复。
实现:active-runtime/app/aios_v2/dispatch_store.py
11. OpenClaw Contract
11.1 OpenClawCommand v2
contract_version = aios.openclaw.command.v2
signature_algorithm = Ed25519
command_id
tenant_id
task_id
trace_id
action
payload
idempotency_key
created_at
expires_at
key_id
public_key_fingerprint
signature
签名覆盖全部未签名字段,包括算法、Key ID 和公钥 Fingerprint。
约束:
- 使用规范化 JSON 与 Ed25519。
- HMAC-SHA256 不再是生产命令合同。
- 只接受由已批准任务和已授权 Dispatch 生成的命令。
- 过期、未来时间超差、签名错误、Key ID 或 Fingerprint 不匹配时拒绝。
- Fingerprint 使用恒定时间比较。
key_id只引用密钥,不包含密钥材料。
11.2 OpenClawResult
command_id
tenant_id
task_id
trace_id
state
output
error
started_at
finished_at
runtime_id
attempts
终态:COMPLETED、FAILED、CANCELLED、TIMED_OUT、REJECTED。
约束:
- Result 必须匹配持久 Dispatch 的 command、tenant、task、trace、principal、provenance 和 run。
- 只有 Orchestrator 可以更新 AIOS Task。
- callback 审计不是权威 Reconcile。
实现:active-runtime/app/aios_openclaw/
12. Hermes Contract
12.0 内部生命周期入口
- 路径:
/api/v2/internal/runtime/hermes/lifecycle/{claim,start,heartbeat,complete,fail,cancel,status}。 AIOS_HERMES_LIFECYCLE_API_ENABLED默认关闭;关闭时按不存在的路由 fail closed。- 仅可信反向代理注入且具备
runtime或platform_admin角色的身份可调用。 - 所有写请求必须携带并严格匹配 tenant、task、trace、principal、provenance、run、 dispatch、job、cell、profile;Claim 还必须指定精确 job,不能从分区中误领其他 Job。
- Worker 不得直接修改 Task Store。Complete、Fail 和 Cancel 产生的 HermesResult
必须经持久 Dispatch 校验并由
ExecutionOrchestrator.reconcile_hermes终态化。 - 每次成功生命周期写入同时落盘 Hermes 状态、Audit/Event 和 Execution Evidence。
12.1 HermesJob
job_id
tenant_id
cell_id
profile_id
task_id
trace_id
action
payload
idempotency_key
priority
state
revision
assigned_worker_id
lease_expires_at
created_at
updated_at
约束:
tenant_id + cell_id + profile_id形成执行分区。- claim 只能领取同分区 Job。
- Lease 到期 Job 回到 QUEUED。
- Hermes Store 使用
AIOS_V2_STATE_DIR/hermes.sqlite3保存 Job、Result、Lease、 Idempotency 和 Worker heartbeat;Adapter 仍是唯一 Queue/Lease 状态机。 - Lease 到期重排必须清空
assigned_worker_id、清空lease_expires_at、递增 revision 并持久化。重启后由显式 lifecycle status/claim 或健康检查安全触发重排。 - revision 冲突不得覆盖。
12.2 HermesResult
job_id
tenant_id
task_id
trace_id
state
worker_id
output
error
started_at
finished_at
约束:
- 终态 Result 必须携带 Worker ID。
- Worker 必须持有 Job Lease。
- Result 必须匹配 Dispatch、Principal、Parent Provenance 和 Run。
- 相同 Worker、相同终态和相同 output/error 的重复提交返回原 Result;不同终态或 不同结果内容返回 Conflict,不得覆盖已持久化终态。
- 只允许内部入口
POST /api/v2/internal/runtime/hermes/reconcile处理。 - 旧入口
POST /api/v2/hermes/results/reconcile返回410 Gone。
实现:active-runtime/app/aios_hermes/
13. Execution Evidence Contract
13.1 ExecutionEvidence
execution_id
tenant_id
task_id
agent_id
executor
branch
status
progress_completed
progress_total
current_step
last_commit
test_status
test_summary
result_summary
claimed_at
heartbeat_at
completed_at
provenance_id
run_id
last_authorization_id
约束:
- 按租户存储和查询。
- 生产
claim/heartbeat/complete落盘前必须通过 Evidence Grant。 - Evidence ID 不得被不同 Task、Agent 或 Provenance Context 复用。
- 不得包含 Secret 或完整敏感 Payload。
实现:active-runtime/app/aios_v2/execution_tracking.py
14. Git Writer Contract
允许操作:READ_REF、FETCH、CREATE_BRANCH、COMMIT、MERGE、PUSH、UPDATE_EVIDENCE,具体能力由 Git Grant 限定。
约束:
- 禁止直接操作
main或master。 - 所有命令使用参数数组,禁止 Shell 字符串拼接。
- Commit 和 Evidence Commit 必须先计算文件内容摘要并完成 Grant 授权,再执行
git add。 UPDATE_EVIDENCE只允许.agent/路径。- 输出必须脱敏并截断。
实现:active-runtime/app/aios_v2/provenance_git.py
15. Web/API Contract
15.1 可信身份头
X-AIOS-Authenticated
X-AIOS-Tenant-ID
X-AIOS-Principal-ID
X-AIOS-Roles
X-AIOS-Trace-ID
X-AIOS-Session-ID
X-AIOS-Policy-Version
X-AIOS-Provenance-ID
X-AIOS-Run-ID
生产约束:
- 可信代理必须删除客户端同名头后重新注入。
- 应用不得直接暴露公网端口。
- Header 与 Body 中重复的 Provenance/Run 值必须一致。
15.2 核心 API
GET /api/v2/health
POST /api/v2/tenants
GET /api/v2/tenants/current
POST /api/v2/agents
GET /api/v2/agents
POST /api/v2/tasks
GET /api/v2/tasks
GET /api/v2/tasks/{id}
POST /api/v2/tasks/{id}/approve
POST /api/v2/tasks/{id}/cancel
POST /api/v2/tasks/{id}/dispatch
GET /api/v2/audit
GET /api/v2/runtime
GET /api/v2/executions
GET /api/v2/gitops
POST /api/v2/internal/runtime/hermes/reconcile
公共生命周期旁路:
POST /api/v2/tasks/{id}/start -> 403
POST /api/v2/tasks/{id}/complete -> 403
POST /api/v2/tasks/{id}/fail -> 403
16. Persistence Contract
候选版:
- Control Plane:SQLite Snapshot。
- Dispatch:独立 SQLite Repository。
- Provenance/Grant/Usage/Event:SQLite WAL。
- Evidence/Receipt:租户隔离原子文件写入。
- 写事务使用原子替换或
BEGIN IMMEDIATE。
生产替换要求:
- 不改变 Domain/API Contract。
- 提供 migration、backup、restore、HA、隔离和容量测试。
- 恢复时保留已使用 Grant 与终态 Dispatch,禁止旧授权重放。
17. Deployment Contract
systemd
- 非 root
aios用户。 - 状态目录
/var/lib/aios-v2。 - 私钥通过受保护 credential 注入,不写入 Git 或普通环境文件。
- 私钥文件必须是 regular file、禁止 symlink、权限
0600或更严格。
Docker
- 非 root UID/GID。
- read-only root filesystem。
- drop all capabilities。
- 独立状态 volume 和 Secret mount。
Rollback
- 回滚前备份状态。
- 默认只回滚代码。
- 状态恢复需独立 Rollback Grant 和显式批准。
- 回滚后必须执行 Healthcheck 与恢复验证。
18. 契约变更规则
以下变化必须在同一分支更新本文档、追踪矩阵和相关 ADR:
- 字段、状态、Header、API、错误语义;
- 租户、安全和 Provenance 约束;
- OpenClaw/Hermes 边界;
- Dispatch、Persistence、Deployment、Rollback Contract;
- Evidence、Audit、Receipt 格式;
- 服务 Scope 或 Grant 类型。
不兼容变化必须新增 ADR 和版本号,不得静默修改。正式 Gate A 结论必须基于实际执行 Acceptance 和保存的证据,不得仅凭测试文件存在宣布通过。