ΓDocsInteractiveNet

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。
  • 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 演练。

在 GitHub 编辑本文