2a: 订阅 = 成员资格(namespace_membership)— core 语义变更 - #50
Merged
Merged
Conversation
POLICY-INVARIANTS:新记录行、跨切不变量 9(无循环/独立轴/legacy-empty/显式拒绝)、扰动 d、harness 含成员轴。 SEALING §3 事件类型 + M1–M3 语义 + 破坏性说明;§4 改「退订交接」为 2b/2c。
grantPolicy:NamespaceMembershipRecord/NAMESPACE_MEMBERSHIP_EVENT;deriveMembership(无条件采纳、R-b、R-c 最新胜出);PolicyState.members/membershipNamespaces;GraphNamespacePolicy.getNamespaceMembership。 namespacePolicy:NamespaceMembershipPolicy 接口。 SyncManager:membershipPolicy 槽;裁剪链改用对端成员资格(legacy-empty 退化为对端订阅声明);成员不一致显式 membershipRejected。 Mebular:declareNamespaceMembership/getNamespaceMembership/getNamespaceMembers(∩ 授权)。 BREAKING CHANGE: 分区一旦有成员记录,非成员不再收到该分区数据。
membership.test:成员∧授权同步、非成员显式拒绝、成员无授权不流动、注销后新事件不到、伪造忽略、独立轴/最新胜出。 harness:随机含成员记录;扰动 d(成员轴独立于授权);日志 residualD=0。
onboard:setNamespaceMembership/namespaceMembers/namespaceMembership。 cli:fleet member --to [--namespace] [--leave] / fleet members。 doctor:namespace 成员资格(未启用 SKIP / 在册 PASS / 否则 FAIL)。
E2E:A 成员 B + B 成员 A → 派发成功;A 注销 B(换端口重挂在线的 A)→ B 不再收新事件。 doctor skipped 期望补 namespace 成员资格;fleet 单测补成员 API/doctor 分支。
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
2a · 订阅 = 成员资格(
namespace_membership)— core 语义变更把「订阅」从瞬时 hello 声明升格为持久、签名的图上成员资格,为 2b 的「退订=成员资格退出 + 继任者全量 ack 门禁」提供「谁是成员」的可复现答案。破坏性协议变更,走封板纪律:矩阵/设计先行 → 实现 → harness → 跨端 E2E。
设计(M1–M5)
namespace_membership{ member, namespace, active, issuedAt, note? }(__policy__);两态:在册/注销。同(ns,member)取 R-c 最新记录的active。对端授权 ∩ 对端成员资格 ∩ 本机订阅声明;hello 订阅声明降级为活跃性/一致性校验,不一致 → 显式拒绝/告警(sync-completed.membershipRejected,非静默)。Mebular.declareNamespaceMembership/getNamespaceMembership/getNamespaceMembers;fleetmember/membersCLI;doctornamespace 成员资格。主张 → 证据
M1 ①·⑥ 同键最新·harness 排列/幂等M4 getNamespaceMembers·③ 成员无授权不流动② 非成员声明订阅 → membershipRejected④(旧数据保留;清理属 2b)⑤ GraphNamespacePolicy 忽略⑥ 独立轴·harness扰动 dresidualD=0verify:fleet:membership10/10红 → 绿(断言原文)
deriveMembership返回空① 采纳 active 成员…✕ Expected true Received false→ 还原 ✓membership.members.includes(peer)→true② 非成员声明订阅…✕ Expected ["nsA"] Received undefined→ 还原 ✓npm run build)④ …B 未收到新事件FAIL {"before":3,"after":5}→ 还原 10/10harness 日志
(随机含成员记录;扰动 d:删全部成员记录 → authorized/revoked 完全不变且成员集合清空。)
跨端 E2E 原始输出(
verify:fleet:membership,10/10)SEALING / 矩阵 diff 要点
POLICY-INVARIANTS.md:namespace_membership记录行(采纳/注销/最新胜出/R-b/伪造);跨切不变量 9(无循环、确定、成员∧授权、独立轴、legacy-empty、显式拒绝);harness 扰动 d。SEALING.md:§3 事件类型 + M1–M3 语义 + 破坏性说明(旧节点忽略 → 行为不变/少收,安全方向);裁剪链 bullet 改为授权 ∩ 成员资格 ∩ 本机订阅;§4 把「订阅=成员资格」改为「退订交接/重订阅恢复(2b/2c)」。给 2b 的接口/语义清单
Mebular.getNamespaceMembership(ns) → { active, members[] }:active=false= 该分区未启用成员资格;members= 图上在册(未 ∩ 授权)。Mebular.getNamespaceMembers(ns) → string[]:生效成员 = 在册 ∩ 生效授权(2b 的“继任者集合”)。Mebular.declareNamespaceMembership({ member, namespace, active, note? }):入/离的状态钩子(本轮只改集合)。SyncResult.membershipRejected?: string[]:成员不一致的显式信号;事件sync-membership-rejected。GraphNamespacePolicy.getNamespaceMembership(ns);NamespaceMembershipPolicy接口(供 SyncManager 注入)。--leave仅移出成员集合);退订交接/重订阅恢复、继任者全量 ack 门禁留 2b。未做项 / 风险
测试方式
npm ci && npm run build npm run test:coverage npm run verify:fleet:all node scripts/verify-fleet-membership.mjs