diff --git a/scripts/mcp-cross-lib.mjs b/scripts/mcp-cross-lib.mjs index 0eb6320..837326c 100644 --- a/scripts/mcp-cross-lib.mjs +++ b/scripts/mcp-cross-lib.mjs @@ -56,8 +56,8 @@ export function printCrossGuidance(log = console.log) { /** * 判定跨网证据是否达成 G6.6(四项全 true 才算通过)。 - * 注:`MemoryStatus.pendingPeers` 实为 SyncManager 的**待发事件数**(命名历史遗留), - * 成功同步后不保证为 0,故**不作为**达成判据,仅在证据里记录。 + * 注:`MemoryStatus.pendingEventCount` 为 SyncManager 的**待发事件数**(原字段名 `pendingPeers` + * 语义误导,已更名),成功同步后不保证为 0,故**不作为**达成判据,仅在证据里记录。 */ export function judgeCrossEvidence(evidence) { const failures = []; diff --git a/scripts/verify-mcp-cross.mjs b/scripts/verify-mcp-cross.mjs index 9b06091..1bb0811 100644 --- a/scripts/verify-mcp-cross.mjs +++ b/scripts/verify-mcp-cross.mjs @@ -9,7 +9,7 @@ // // 本地夹具(--selftest):无真实公网时,起两个**独立进程/独立存储**的 `mebular serve` // (环回直连 libp2p、共享同一用户主密钥),走**同一条链**,验证判定逻辑: -// 链路断言(markerFound/stateMatches/identityShared/pendingPeers)全过, +// 链路断言(markerFound/stateMatches/identityShared)全过, // 且门禁因 `differentPublicNetwork !== true`(环回)而正确判**不达成**——仅作 non-evidence, // **绝不**冒充 G6.6 达成。 // @@ -112,8 +112,8 @@ async function runChain(cfg, { requirePeerMatch = false } = {}) { evidence.A.stateHash = statusA1?.stateHash; evidence.B.nodeCount = statusB1?.nodeCount; evidence.B.stateHash = statusB1?.stateHash; - evidence.B.pendingPeers = statusB1?.pendingPeers; - evidence.pendingPeers = statusB1?.pendingPeers; + evidence.B.pendingEventCount = statusB1?.pendingEventCount; + evidence.pendingEventCount = statusB1?.pendingEventCount; evidence.stateMatches = Boolean(statusA1?.stateHash) && statusA1?.stateHash === statusB1?.stateHash; evidence.identityShared = syncError === null && evidence.markerFound === true; if (syncError) evidence.syncError = syncError; @@ -159,7 +159,7 @@ async function runReal() { await writeFile(config.out, `${JSON.stringify(evidence, null, 2)}\n`, 'utf-8'); log(` A deviceId=${evidence.A.deviceId} nodeCount=${evidence.A.nodeCount} stateHash=${evidence.A.stateHash}`); - log(` B nodeCount=${evidence.B.nodeCount} stateHash=${evidence.B.stateHash} pendingPeers=${evidence.B.pendingPeers}`); + log(` B nodeCount=${evidence.B.nodeCount} stateHash=${evidence.B.stateHash} pendingEventCount=${evidence.B.pendingEventCount}`); log(` markerFound=${evidence.markerFound} stateMatches=${evidence.stateMatches} identityShared=${evidence.identityShared}`); log(` egress(local/peer)=${evidence.localEgress.ip ?? 'unknown'}/${config.peerEgress ?? 'unset'} basis=${evidence.differentPublicNetworkBasis}`); log(` 证据写入 ${config.out}`); @@ -271,7 +271,7 @@ async function runSelftest() { await writeFile(out, `${JSON.stringify(evidence, null, 2)}\n`, 'utf-8'); log(` A deviceId=${evidence.A.deviceId} nodeCount=${evidence.A.nodeCount} stateHash=${evidence.A.stateHash}`); - log(` B nodeCount=${evidence.B.nodeCount} stateHash=${evidence.B.stateHash} pendingPeers=${evidence.B.pendingPeers}`); + log(` B nodeCount=${evidence.B.nodeCount} stateHash=${evidence.B.stateHash} pendingEventCount=${evidence.B.pendingEventCount}`); log(` markerFound=${evidence.markerFound} stateMatches=${evidence.stateMatches} identityShared=${evidence.identityShared}`); log(` differentPublicNetwork=${evidence.differentPublicNetwork}(${evidence.differentPublicNetworkBasis};环回预期不为 true)`); log(` 门禁判定 gatePassed=${gate.passed}(因无真实异网出口,应对 G6.6 判不达成)`); diff --git a/src/memory/MemoryService.ts b/src/memory/MemoryService.ts index 160e611..0693e19 100644 --- a/src/memory/MemoryService.ts +++ b/src/memory/MemoryService.ts @@ -51,7 +51,8 @@ export interface MemoryStatus { stateHash: string; atRest: boolean; semantic: boolean; - pendingPeers: number; + /** 待发事件数(尚未送达对端的事件;源自 SyncManager.getSyncStatus().pendingCount) */ + pendingEventCount: number; } export type ImportInput = AdapterSource; @@ -309,10 +310,10 @@ export class MemoryService { const nodes = await this.mebular.storage.listNodes(); const edges = await this.mebular.storage.listEdges(); const node = this.mebular.node; - let pendingPeers = 0; + let pendingEventCount = 0; try { const syncStatus = await this.mebular.sync.getSyncStatus(); - pendingPeers = syncStatus.pendingCount; + pendingEventCount = syncStatus.pendingCount; } catch { // 门面未初始化时 sync 不可访问 } @@ -327,7 +328,7 @@ export class MemoryService { stateHash: computeStateHash(nodes, edges), atRest: this.mebular.atRestEncryption, semantic: this.mebular.semanticVectorIndex !== null, - pendingPeers, + pendingEventCount, }; } diff --git a/tests/memory/MemoryService.test.ts b/tests/memory/MemoryService.test.ts index 4e2476b..6e01179 100644 --- a/tests/memory/MemoryService.test.ts +++ b/tests/memory/MemoryService.test.ts @@ -134,6 +134,7 @@ describe('MemoryService', () => { expect(status.running).toBe(false); expect(status.atRest).toBe(false); expect(status.semantic).toBe(false); + expect(Number.isInteger(status.pendingEventCount)).toBe(true); await app.shutdown(); }); diff --git a/tests/wan/mcp-cross.test.mjs b/tests/wan/mcp-cross.test.mjs index 7f72c93..2f010c7 100644 --- a/tests/wan/mcp-cross.test.mjs +++ b/tests/wan/mcp-cross.test.mjs @@ -49,7 +49,7 @@ describe('mcp-cross.judgeCrossEvidence', () => { identityShared: true, differentPublicNetwork: true, differentPublicNetworkBasis: 'distinct-public-egress', - pendingPeers: 0, + pendingEventCount: 0, }; it('全绿 → passed=true 无失败项', () => { @@ -69,8 +69,8 @@ describe('mcp-cross.judgeCrossEvidence', () => { expect(v.failures.join('\n')).toContain(needle); }); - it('pendingPeers 非 0 不判失败(其为待发事件数,非达成判据)', () => { - const v = judgeCrossEvidence({ ...green, pendingPeers: 5 }); + it('pendingEventCount 非 0 不判失败(其为待发事件数,非达成判据)', () => { + const v = judgeCrossEvidence({ ...green, pendingEventCount: 5 }); expect(v.passed).toBe(true); }); @@ -88,7 +88,7 @@ describe('mcp-cross.judgeSelftest(本地夹具判定)', () => { identityShared: true, differentPublicNetwork: null, differentPublicNetworkBasis: 'egress-unknown', - pendingPeers: 1, + pendingEventCount: 1, }; it('链路全过且因异网缺失而被门禁正确拦下 → ok=true(non-evidence)', () => {