Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions scripts/mcp-cross-lib.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -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 = [];
Expand Down
10 changes: 5 additions & 5 deletions scripts/verify-mcp-cross.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
//
// 本地夹具(--selftest):无真实公网时,起两个**独立进程/独立存储**的 `mebular serve`
// (环回直连 libp2p、共享同一用户主密钥),走**同一条链**,验证判定逻辑:
// 链路断言(markerFound/stateMatches/identityShared/pendingPeers)全过,
// 链路断言(markerFound/stateMatches/identityShared)全过,
// 且门禁因 `differentPublicNetwork !== true`(环回)而正确判**不达成**——仅作 non-evidence,
// **绝不**冒充 G6.6 达成。
//
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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}`);
Expand Down Expand Up @@ -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 判不达成)`);
Expand Down
9 changes: 5 additions & 4 deletions src/memory/MemoryService.ts
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,8 @@ export interface MemoryStatus {
stateHash: string;
atRest: boolean;
semantic: boolean;
pendingPeers: number;
/** 待发事件数(尚未送达对端的事件;源自 SyncManager.getSyncStatus().pendingCount) */
pendingEventCount: number;
}

export type ImportInput = AdapterSource;
Expand Down Expand Up @@ -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 不可访问
}
Expand All @@ -327,7 +328,7 @@ export class MemoryService {
stateHash: computeStateHash(nodes, edges),
atRest: this.mebular.atRestEncryption,
semantic: this.mebular.semanticVectorIndex !== null,
pendingPeers,
pendingEventCount,
};
}

Expand Down
1 change: 1 addition & 0 deletions tests/memory/MemoryService.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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();
});

Expand Down
8 changes: 4 additions & 4 deletions tests/wan/mcp-cross.test.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ describe('mcp-cross.judgeCrossEvidence', () => {
identityShared: true,
differentPublicNetwork: true,
differentPublicNetworkBasis: 'distinct-public-egress',
pendingPeers: 0,
pendingEventCount: 0,
};

it('全绿 → passed=true 无失败项', () => {
Expand All @@ -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);
});

Expand All @@ -88,7 +88,7 @@ describe('mcp-cross.judgeSelftest(本地夹具判定)', () => {
identityShared: true,
differentPublicNetwork: null,
differentPublicNetworkBasis: 'egress-unknown',
pendingPeers: 1,
pendingEventCount: 1,
};

it('链路全过且因异网缺失而被门禁正确拦下 → ok=true(non-evidence)', () => {
Expand Down
Loading