Skip to content

1d: 三形态 E2E(审查 DAG / 有限协商 / 配额制闲聊)接 live 通道 - #53

Merged
Windsander merged 5 commits into
mainfrom
feat/fleet-collab-e2e
Sep 18, 2026
Merged

Windsander merged 5 commits into
mainfrom
feat/fleet-collab-e2e

Conversation

@Windsander

Copy link
Copy Markdown
Owner

1d · 三形态 E2E:审查 DAG / 有限协商 / 配额制闲聊(接 live 通道)

把 M4 的三种协作形态从纯模型接到真实节点(任务协议/worker 接线)。范围仅 fleet 层git diff origin/main...HEAD -- src/ 为空(零 core 改动)。线格式未变:协商/闲聊消息是既有已授权 tasks 分区内的独立节点类型negotiation_message / chatter_message),DAG 子任务用既有 created + trace

实现

  • 消息存储 MebularMessageStore<T>:落既有分区、按 messageId 幂等、过滤(namespace/形状)、确定序。
  • 计划器 runtime/planner.tsTaskPlanner / mapPlanner / childTaskId(确定性)。
  • worker:① 执行成功按计划派生子任务created + causedBy/chain),禁环守卫在真实提交路径生效(成环 → 父任务 failed,原因 DAG_CYCLE: p→c);② 有限协商:轮替 counter,超 maxRoundsfailedNEGOTIATION_LIMIT: r>N),accept → 执行。
  • nodewaitForDagCompletiondagCompletion:全部可达终态才完成)+ summarizeDag(确定序汇总)+ applyNegotiationPolicy(accept/counter)。
  • 闲聊 FleetChatter:发送对 from.deviceLocalQuota(accepted/queued/rejected,无全局协调)。

主张 → 证据

# 主张 证据
1 DAG 全部可达终态才完成 + 汇总 1d-a DAG 完成/汇总(jest)+ verify:fleet:collab
2 每任务恰好一次 1d-a 每任务恰好一次 {executed:3}
3 禁环真实提交路径生效 1d-a 负例 DAG_CYCLE(jest + CLI)
4 协商 counter→accept→完成 1d-b 协商 …done(jest + CLI,libp2p)
5 超限 → NEGOTIATION_LIMIT 1d-b 超限 NEGOTIATION_LIMIT: 2>1
6 消息幂等/顺序无关 1d-b messageId 幂等 · 夹具/单测
7 闲聊配额/账本守恒/两策略 1d-c reject/queue…账本守恒 + CLI
8 live libp2p 双端 verify:fleet:collab 12/12
9 不回归 + 零 core 730 ×6、覆盖阈值全过、lint/build 无输出、CI 三 job 绿、verify:fleet:all 126/126src/ diff 空

红 → 绿(断言原文)

形态 破坏点 锚点 结果
DAG 去掉 assertAcyclicParent 守卫 1d-a …禁环负例 ✕ Expected "failed" Received "done" → 还原 ✓
闲聊 quota.decideaccepted 1d-c …超额 reject ✕ Expected "rejected" Received "accepted" → 还原 ✓
脚本类(S9,先 npm run build 同 DAG 守卫破坏 verify:fleet:collab 负例 FAIL 1d-a 负例(12→11) → 还原 12/12

三形态 E2E 原始输出(verify:fleet:collab,真实 libp2p loopback,12/12)

PASS  libp2p 双端已监听(loopback)
PASS  1d-a DAG 完成(全部可达终态)  {"reachable":3,"pending":[]}
PASS  1d-a 汇总含 3 条结果  {"summary":"…=echo:root|…~c0=echo:child-0|…~c1=echo:child-1"}
PASS  1d-a 每任务恰好一次  {"executed":3}
PASS  1d-a 负例:成环被拒(DAG_CYCLE)
PASS  1d-b 协商:counter → accept → 完成  {"status":"done"}
PASS  1d-b 超限 → failed NEGOTIATION_LIMIT  {"reason":"NEGOTIATION_LIMIT: 2>1"}
PASS  1d-c 配额内 accepted / 超额 reject / 账本守恒 {"used":2,"rejected":1}
PASS  1d-c 收件(libp2p 同步)幂等且为 2 条  {"size":2}
FLEET_SUMMARY {"total":12,"passed":12,"failed":[],"skipped":[]}

verify:fleet:all = 126/126(local/remote/agents/onboard/grant/service/membership/handoff/rejoin/collab)。

夹具/矩阵 diff 要点

  • 新夹具 packages/fleet/protocol/collab.example.json(协商/闲聊消息、DAG 计划)→ tests/fleet/collab-fixtures.test.ts 先验证。
  • PROTOCOL-INVARIANTS.md §7:三形态 live 行 → 测试名(派生/禁环/完成判定/恰好一次;消息/轮次;配额/幂等;live E2E)。
  • DESIGN.md §3/§5:三形态由「M4 目标」改为已接 liveONBOARDING §14 用法与限制。

未做项 / 风险

  • 自动化用确定性 fake executor(EchoExecutor);真实 Hermes/OpenChamber 执行器沿用既有适配器,本轮未新增真实 Agent 验收。
  • 协商为单任务轮替(发起端 accept/counter 两种策略);更丰富的多方协商留后续。
  • DAG 汇总为确定序结果拼接(summarizeDag);复杂归约策略留后续。
  • 闲聊不新增分区/授权;消息随既有 tasks 分区同步(受既有成员/授权闸门约束)。

测试方式

npm ci && npm run build
npm run test:coverage
npm run verify:fleet:all
node scripts/verify-fleet-collab.mjs

MebularMessageStore:协商/闲聊消息以独立节点类型落既有已授权 tasks 分区(幂等 messageId);线格式未变。
runtime/planner:TaskPlanner/mapPlanner/childTaskId(确定性派生)。
worker:planner 派生子任务(created+causedBy/chain,assertAcyclicParent 守卫,成环父任务 DAG_CYCLE 失败);negotiation(轮替 counter→accept,超限 NEGOTIATION_LIMIT)。
node:waitForDagCompletion/summarizeDag(dagCompletion)+ applyNegotiationPolicy。
collab:FleetChatter(本地配额 accepted/queued/rejected)+ 消息存储工厂与类型常量。
夹具先行:protocol/collab.example.json(协商/闲聊消息、DAG 计划)。
collab-e2e:两门面真实记忆同步——DAG 完成/汇总/恰好一次/禁环负例;协商 counter→accept→done 与 NEGOTIATION_LIMIT;闲聊配额/账本守恒/幂等。anti-entropy 兜底消除 push 合并抖动。
message-store:过滤/去重/默认 namespace/幂等 append。
12/12:DAG 完成+汇总+恰好一次+禁环、协商完成+超限、闲聊配额/账本/同步收件。verify:fleet:all 126/126。
PROTOCOL-INVARIANTS §7(DAG/协商/闲聊 live 行→测试);DESIGN §3/§5 更新;ONBOARDING §14 用法与限制。
负例任务在较慢 runner 上未在循环结束前处理;iterations 3000→20000、waitForDag 30s→45s。本机 3× 12/12。
@Windsander
Windsander merged commit 41e00df into main Sep 18, 2026
6 checks passed
@Windsander
Windsander deleted the feat/fleet-collab-e2e branch September 19, 2026 10:04
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant