14 · M4e:安全、背压与真实 provider
状态:核心完成(2026-11)。M4 从“能跑”进入“可运营”的最后一块。
14.1 HMAC capability
- capability 格式:
v1:<run>:<epoch>:<hmac>。 - HMAC-SHA256(secret,
run|cell|epoch)。 - worker 端
CellHost::with_secret在spawn时校验 MAC;deliver/snapshot/remove 仍做精确匹配。 Cluster::with_secret(secret)生成 HMAC capability;revoke增加 epoch。- CLI:
ain cell serve --bind ... --secret shared-secret
ain cluster demo --nodes ... --secret shared-secret
- 无 secret 时退回
run-cell-seq字符串(兼容旧 demo)。 - 测试:正确 secret 跑通;错误 secret 在 spawn 阶段失败。
14.2 审计哈希
ClusterResult.audit_hash = sha256(canonical_json(audit))。--save-audit输出完整 audit 数组;hash 单独打印,便于归档/比对。- 后续可升级为 per-event hash chain + 签名。
14.3 队列背压
Cluster::with_queue_limit(n);默认 100,000。enqueue超限 →ClusterError::Backpressure;start/step传播。- 测试:
with_queue_limit(0)在 start 阶段返回错误。 - 仍是 coordinator 单队列;per-node/per-cell credit 窗口在 M5。
14.4 OpenAI-compatible effect
OpenAiEffect { base_url, api_key, model }:- POST
{base_url}/chat/completions messages=[{role:user, content:prompt}]- 解析
choices[0].message.content+usage.prompt_tokens/completion_tokens。
- POST
EffectBus::with_openai(base, key, model)注册为llm(覆盖 mock)。- CLI:
ain cell serve --bind ... \
--openai-base https://api.openai.com/v1 \
--openai-key "$OPENAI_API_KEY" \
--openai-model gpt-4.1-mini
- 测试:本地 fake OpenAI server 返回 JSON;断言 text/tokens。
- 真实 provider 仍需密钥、限流/重试/超时策略与成本表。
- 本地 fake OpenAI server 已验证 100 cells + kill-after 30 的 provider 代码路径。
14.5 当前测试
- 82 个:27 core/golden + 9 language + 19 runtime + 8 sched + 19 cluster。
- 新增:HMAC 校验、错误 secret、queue limit、OpenAI-compatible 解析。
14.6 仍未做
- mTLS:TCP 仍是明文;只有共享 token + HMAC capability。
- 持久化幂等:M5 已把 effect 执行移到 coordinator,并用
--effect-ledger+--run-id复用结果;provider 调用成功但 ledger 未落盘的窗口仍需幂等键。 - per-cell credit 背压:只有全局队列上限。
- wire 多端口:channel 是
from:port,没有每个 cell 多端口的独立窗口/重连状态。 - 真实 provider 的 100 agents / kill-node 5s 演练。