@agentplat/trust 0.3.0-beta.2 → 0.3.0-beta.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/evidence-fusion-strategy.d.ts +28 -0
- package/dist/evidence-fusion-strategy.d.ts.map +1 -0
- package/dist/evidence-fusion-strategy.js +61 -0
- package/dist/evidence-fusion-strategy.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/peer-credibility.d.ts +116 -0
- package/dist/peer-credibility.d.ts.map +1 -0
- package/dist/peer-credibility.js +421 -0
- package/dist/peer-credibility.js.map +1 -0
- package/dist/propagation.d.ts +51 -0
- package/dist/propagation.d.ts.map +1 -0
- package/dist/propagation.js +88 -0
- package/dist/propagation.js.map +1 -0
- package/package.json +14 -2
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { EvidenceFusionDecisionV1, EvidenceFusionEvaluationRequestV1, EvidenceTrustStateV1 } from "./types.js";
|
|
2
|
+
/** Stable descriptor for a pluggable evidence-fusion algorithm. */
|
|
3
|
+
export interface EvidenceFusionStrategyDescriptorV1 {
|
|
4
|
+
readonly schemaVersion: 1;
|
|
5
|
+
readonly strategyId: string;
|
|
6
|
+
readonly strategyVersion: number;
|
|
7
|
+
readonly capabilities: readonly string[];
|
|
8
|
+
readonly descriptorDigest: string;
|
|
9
|
+
}
|
|
10
|
+
export interface EvidenceFusionStrategyV1 extends EvidenceFusionStrategyDescriptorV1 {
|
|
11
|
+
evaluate(input: {
|
|
12
|
+
readonly state: EvidenceTrustStateV1;
|
|
13
|
+
readonly request: EvidenceFusionEvaluationRequestV1;
|
|
14
|
+
readonly logicalTimeMs: number;
|
|
15
|
+
}): EvidenceFusionDecisionV1;
|
|
16
|
+
}
|
|
17
|
+
export declare function digestEvidenceFusionStrategyDescriptorV1(descriptor: Pick<EvidenceFusionStrategyDescriptorV1, "schemaVersion" | "strategyId" | "strategyVersion" | "capabilities">): string;
|
|
18
|
+
export declare function validateEvidenceFusionStrategyDescriptorV1(descriptor: EvidenceFusionStrategyDescriptorV1): EvidenceFusionStrategyDescriptorV1;
|
|
19
|
+
/** Registry with deterministic replacement semantics for strategy versions. */
|
|
20
|
+
export declare class EvidenceFusionStrategyRegistryV1 {
|
|
21
|
+
#private;
|
|
22
|
+
register(strategy: EvidenceFusionStrategyV1): this;
|
|
23
|
+
get(strategyId: string, strategyVersion: number): EvidenceFusionStrategyV1;
|
|
24
|
+
list(): readonly EvidenceFusionStrategyDescriptorV1[];
|
|
25
|
+
}
|
|
26
|
+
export declare const referenceEvidenceFusionStrategyV1: EvidenceFusionStrategyV1;
|
|
27
|
+
export declare const defaultEvidenceFusionStrategyV1: EvidenceFusionStrategyV1;
|
|
28
|
+
//# sourceMappingURL=evidence-fusion-strategy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evidence-fusion-strategy.d.ts","sourceRoot":"","sources":["../src/evidence-fusion-strategy.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,wBAAwB,EACxB,iCAAiC,EACjC,oBAAoB,EACrB,MAAM,YAAY,CAAC;AAEpB,mEAAmE;AACnE,MAAM,WAAW,kCAAkC;IACjD,QAAQ,CAAC,aAAa,EAAE,CAAC,CAAC;IAC1B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;IACzC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;CACnC;AAED,MAAM,WAAW,wBACf,SAAQ,kCAAkC;IAC1C,QAAQ,CAAC,KAAK,EAAE;QACd,QAAQ,CAAC,KAAK,EAAE,oBAAoB,CAAC;QACrC,QAAQ,CAAC,OAAO,EAAE,iCAAiC,CAAC;QACpD,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;KAChC,GAAG,wBAAwB,CAAC;CAC9B;AAcD,wBAAgB,wCAAwC,CACtD,UAAU,EAAE,IAAI,CACd,kCAAkC,EAClC,eAAe,GAAG,YAAY,GAAG,iBAAiB,GAAG,cAAc,CACpE,GACA,MAAM,CAKR;AAED,wBAAgB,0CAA0C,CACxD,UAAU,EAAE,kCAAkC,GAC7C,kCAAkC,CAapC;AAED,+EAA+E;AAC/E,qBAAa,gCAAgC;;IAG3C,QAAQ,CAAC,QAAQ,EAAE,wBAAwB,GAAG,IAAI;IASlD,GAAG,CAAC,UAAU,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,wBAAwB;IAM1E,IAAI,IAAI,SAAS,kCAAkC,EAAE;CAOtD;AAeD,eAAO,MAAM,iCAAiC,EAAE,wBAI9C,CAAC;AAEH,eAAO,MAAM,+BAA+B,0BAAoC,CAAC"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { digestTrustJsonV1, TrustValidationError } from "./canonical.js";
|
|
2
|
+
import { evaluateEvidenceFusionV1 } from "./fusion.js";
|
|
3
|
+
const descriptorPayload = (strategy) => ({
|
|
4
|
+
schemaVersion: strategy.schemaVersion,
|
|
5
|
+
strategyId: strategy.strategyId,
|
|
6
|
+
strategyVersion: strategy.strategyVersion,
|
|
7
|
+
capabilities: [...strategy.capabilities],
|
|
8
|
+
});
|
|
9
|
+
export function digestEvidenceFusionStrategyDescriptorV1(descriptor) {
|
|
10
|
+
return digestTrustJsonV1("trace", descriptorPayload(descriptor));
|
|
11
|
+
}
|
|
12
|
+
export function validateEvidenceFusionStrategyDescriptorV1(descriptor) {
|
|
13
|
+
if (descriptor.schemaVersion !== 1 ||
|
|
14
|
+
!descriptor.strategyId ||
|
|
15
|
+
!Number.isSafeInteger(descriptor.strategyVersion) ||
|
|
16
|
+
descriptor.strategyVersion < 1 ||
|
|
17
|
+
!Array.isArray(descriptor.capabilities) ||
|
|
18
|
+
descriptor.capabilities.some((item) => typeof item !== "string") ||
|
|
19
|
+
[...descriptor.capabilities].sort().some((item, index, all) => index > 0 && item === all[index - 1]) ||
|
|
20
|
+
descriptor.descriptorDigest !== digestEvidenceFusionStrategyDescriptorV1(descriptor))
|
|
21
|
+
throw new TrustValidationError("evidence fusion strategy descriptor is invalid");
|
|
22
|
+
return Object.freeze({ ...descriptor, capabilities: Object.freeze([...descriptor.capabilities]) });
|
|
23
|
+
}
|
|
24
|
+
/** Registry with deterministic replacement semantics for strategy versions. */
|
|
25
|
+
export class EvidenceFusionStrategyRegistryV1 {
|
|
26
|
+
#strategies = new Map();
|
|
27
|
+
register(strategy) {
|
|
28
|
+
const validated = validateEvidenceFusionStrategyDescriptorV1(strategy);
|
|
29
|
+
const key = `${validated.strategyId}\0${validated.strategyVersion}`;
|
|
30
|
+
if (this.#strategies.has(key))
|
|
31
|
+
throw new TrustValidationError("evidence fusion strategy version already registered");
|
|
32
|
+
this.#strategies.set(key, strategy);
|
|
33
|
+
return this;
|
|
34
|
+
}
|
|
35
|
+
get(strategyId, strategyVersion) {
|
|
36
|
+
const strategy = this.#strategies.get(`${strategyId}\0${strategyVersion}`);
|
|
37
|
+
if (!strategy)
|
|
38
|
+
throw new TrustValidationError("evidence fusion strategy is unavailable");
|
|
39
|
+
return strategy;
|
|
40
|
+
}
|
|
41
|
+
list() {
|
|
42
|
+
return Object.freeze([...this.#strategies.values()]
|
|
43
|
+
.sort((a, b) => `${a.strategyId}\0${a.strategyVersion}`.localeCompare(`${b.strategyId}\0${b.strategyVersion}`))
|
|
44
|
+
.map(({ evaluate: _evaluate, ...descriptor }) => Object.freeze(descriptor)));
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
/** Reference implementation preserving the existing deterministic fusion algorithm. */
|
|
48
|
+
const referenceEvaluateV1 = ({ state, request, logicalTimeMs }) => evaluateEvidenceFusionV1(state, request, logicalTimeMs);
|
|
49
|
+
const referenceDescriptorV1 = {
|
|
50
|
+
schemaVersion: 1,
|
|
51
|
+
strategyId: "weighted-threshold",
|
|
52
|
+
strategyVersion: 1,
|
|
53
|
+
capabilities: Object.freeze(["deterministic", "weighted-threshold", "dependency-aware"]),
|
|
54
|
+
};
|
|
55
|
+
export const referenceEvidenceFusionStrategyV1 = Object.freeze({
|
|
56
|
+
...referenceDescriptorV1,
|
|
57
|
+
descriptorDigest: digestEvidenceFusionStrategyDescriptorV1(referenceDescriptorV1),
|
|
58
|
+
evaluate: referenceEvaluateV1,
|
|
59
|
+
});
|
|
60
|
+
export const defaultEvidenceFusionStrategyV1 = referenceEvidenceFusionStrategyV1;
|
|
61
|
+
//# sourceMappingURL=evidence-fusion-strategy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evidence-fusion-strategy.js","sourceRoot":"","sources":["../src/evidence-fusion-strategy.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -10,4 +10,7 @@ export * from "./eligibility.js";
|
|
|
10
10
|
export * from "./quarantine.js";
|
|
11
11
|
export * from "./state.js";
|
|
12
12
|
export * from "./lifecycle.js";
|
|
13
|
+
export * from "./peer-credibility.js";
|
|
14
|
+
export * from "./propagation.js";
|
|
15
|
+
export * from "./evidence-fusion-strategy.js";
|
|
13
16
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,uBAAuB,CAAC;AACtC,cAAc,kBAAkB,CAAC;AACjC,cAAc,+BAA+B,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -10,4 +10,7 @@ export * from "./eligibility.js";
|
|
|
10
10
|
export * from "./quarantine.js";
|
|
11
11
|
export * from "./state.js";
|
|
12
12
|
export * from "./lifecycle.js";
|
|
13
|
+
export * from "./peer-credibility.js";
|
|
14
|
+
export * from "./propagation.js";
|
|
15
|
+
export * from "./evidence-fusion-strategy.js";
|
|
13
16
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,uBAAuB,CAAC;AACtC,cAAc,kBAAkB,CAAC;AACjC,cAAc,+BAA+B,CAAC"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
export type PeerCredibilityOutcomeV1 = "satisfied" | "violated" | "inconclusive";
|
|
2
|
+
export type PeerChallengeDispositionV1 = "none" | "dismissed" | "sustained" | "contested";
|
|
3
|
+
export interface PeerCredibilityObservationV1 {
|
|
4
|
+
readonly schemaVersion: 1;
|
|
5
|
+
readonly observationId: string;
|
|
6
|
+
readonly scopeDigest: string;
|
|
7
|
+
readonly subjectId: string;
|
|
8
|
+
readonly sourceId: string;
|
|
9
|
+
readonly dependencyGroupId: string;
|
|
10
|
+
readonly criterionId: string;
|
|
11
|
+
readonly outcome: PeerCredibilityOutcomeV1;
|
|
12
|
+
readonly confidenceBasisPoints: number;
|
|
13
|
+
readonly challengeDisposition: PeerChallengeDispositionV1;
|
|
14
|
+
readonly evidenceDigest: string;
|
|
15
|
+
readonly observedAtLogicalMs: number;
|
|
16
|
+
readonly observationDigest: string;
|
|
17
|
+
}
|
|
18
|
+
export interface PeerSourceDependencyEdgeV1 {
|
|
19
|
+
readonly schemaVersion: 1;
|
|
20
|
+
readonly leftSourceId: string;
|
|
21
|
+
readonly rightSourceId: string;
|
|
22
|
+
readonly correlationBasisPoints: number;
|
|
23
|
+
readonly basisDigest: string;
|
|
24
|
+
readonly validFromLogicalMs: number;
|
|
25
|
+
readonly validUntilLogicalMs: number | null;
|
|
26
|
+
readonly edgeDigest: string;
|
|
27
|
+
}
|
|
28
|
+
export interface PeerCredibilityPolicyV1 {
|
|
29
|
+
readonly schemaVersion: 1;
|
|
30
|
+
readonly policyId: string;
|
|
31
|
+
readonly policyVersion: number;
|
|
32
|
+
readonly evidenceHorizonLogicalMs: number;
|
|
33
|
+
readonly maximumRetainedObservations: number;
|
|
34
|
+
readonly maximumSources: number;
|
|
35
|
+
readonly maximumDependencyEdges: number;
|
|
36
|
+
readonly dependencyCorrelationThresholdBasisPoints: number;
|
|
37
|
+
readonly maximumDependencyGroupWeightBasisPoints: number;
|
|
38
|
+
readonly minimumIndependentGroups: number;
|
|
39
|
+
readonly restrictedScoreAtOrBelowBasisPoints: number;
|
|
40
|
+
readonly quarantineScoreAtOrBelowBasisPoints: number;
|
|
41
|
+
readonly maximumUncertaintyBasisPoints: number;
|
|
42
|
+
readonly maximumCollusionPressureBasisPoints: number;
|
|
43
|
+
readonly recoveryScoreBasisPoints: number;
|
|
44
|
+
readonly recoveryIndependentGroups: number;
|
|
45
|
+
readonly policyDigest: string;
|
|
46
|
+
}
|
|
47
|
+
export type PeerCredibilityStatusV1 = "unknown" | "eligible" | "restricted" | "quarantined" | "recovering";
|
|
48
|
+
export interface PeerCredibilityStateV1 {
|
|
49
|
+
readonly schemaVersion: 1;
|
|
50
|
+
readonly stateKey: string;
|
|
51
|
+
readonly scopeDigest: string;
|
|
52
|
+
readonly subjectId: string;
|
|
53
|
+
readonly policyDigest: string;
|
|
54
|
+
readonly revision: number;
|
|
55
|
+
readonly logicalTimeHighWaterMs: number;
|
|
56
|
+
readonly scoreBasisPoints: number;
|
|
57
|
+
readonly uncertaintyBasisPoints: number;
|
|
58
|
+
readonly collusionPressureBasisPoints: number;
|
|
59
|
+
readonly independentGroupCount: number;
|
|
60
|
+
readonly effectiveEvidenceWeightBasisPoints: number;
|
|
61
|
+
readonly status: PeerCredibilityStatusV1;
|
|
62
|
+
readonly observations: readonly PeerCredibilityObservationV1[];
|
|
63
|
+
readonly dependencyEdgeDigests: readonly string[];
|
|
64
|
+
readonly reasonCodes: readonly string[];
|
|
65
|
+
readonly stateDigest: string;
|
|
66
|
+
}
|
|
67
|
+
export interface PeerCredibilityStateStoreV1 {
|
|
68
|
+
load(stateKey: string): Promise<PeerCredibilityStateV1 | null>;
|
|
69
|
+
save(state: PeerCredibilityStateV1, expectedRevision: number | null): Promise<boolean>;
|
|
70
|
+
}
|
|
71
|
+
export declare class InMemoryPeerCredibilityStateStoreV1 implements PeerCredibilityStateStoreV1 {
|
|
72
|
+
#private;
|
|
73
|
+
load(stateKey: string): Promise<PeerCredibilityStateV1 | null>;
|
|
74
|
+
save(state: PeerCredibilityStateV1, expectedRevision: number | null): Promise<boolean>;
|
|
75
|
+
}
|
|
76
|
+
export interface PeerCredibilityRuntimeOptionsV1 {
|
|
77
|
+
readonly policy: PeerCredibilityPolicyV1;
|
|
78
|
+
readonly store?: PeerCredibilityStateStoreV1;
|
|
79
|
+
readonly maximumCommitAttempts?: number;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Scope-local longitudinal credibility. It deliberately does not create a
|
|
83
|
+
* portable or global reputation score and caps correlated sources as one group.
|
|
84
|
+
*/
|
|
85
|
+
export declare class PeerCredibilityRuntimeV1 {
|
|
86
|
+
readonly policy: PeerCredibilityPolicyV1;
|
|
87
|
+
readonly store: PeerCredibilityStateStoreV1;
|
|
88
|
+
readonly maximumCommitAttempts: number;
|
|
89
|
+
constructor(options: PeerCredibilityRuntimeOptionsV1);
|
|
90
|
+
observe(input: {
|
|
91
|
+
readonly scopeDigest: string;
|
|
92
|
+
readonly subjectId: string;
|
|
93
|
+
readonly observation: PeerCredibilityObservationV1;
|
|
94
|
+
readonly dependencyEdges: readonly PeerSourceDependencyEdgeV1[];
|
|
95
|
+
readonly evaluatedAtLogicalMs: number;
|
|
96
|
+
}): Promise<PeerCredibilityStateV1>;
|
|
97
|
+
}
|
|
98
|
+
export declare function createPeerCredibilityPolicyV1(input: Omit<PeerCredibilityPolicyV1, "policyDigest">): PeerCredibilityPolicyV1;
|
|
99
|
+
export declare function validatePeerCredibilityPolicyV1(input: PeerCredibilityPolicyV1): PeerCredibilityPolicyV1;
|
|
100
|
+
export declare function createPeerCredibilityObservationV1(input: Omit<PeerCredibilityObservationV1, "observationDigest">): PeerCredibilityObservationV1;
|
|
101
|
+
export declare function validatePeerCredibilityObservationV1(input: PeerCredibilityObservationV1): PeerCredibilityObservationV1;
|
|
102
|
+
export declare function createPeerSourceDependencyEdgeV1(input: Omit<PeerSourceDependencyEdgeV1, "edgeDigest">): PeerSourceDependencyEdgeV1;
|
|
103
|
+
export declare function validatePeerSourceDependencyEdgeV1(input: PeerSourceDependencyEdgeV1): PeerSourceDependencyEdgeV1;
|
|
104
|
+
export declare function evaluatePeerCredibilityV1(input: {
|
|
105
|
+
readonly policy: PeerCredibilityPolicyV1;
|
|
106
|
+
readonly priorStatus: PeerCredibilityStatusV1;
|
|
107
|
+
readonly scopeDigest: string;
|
|
108
|
+
readonly subjectId: string;
|
|
109
|
+
readonly observations: readonly PeerCredibilityObservationV1[];
|
|
110
|
+
readonly dependencyEdges: readonly PeerSourceDependencyEdgeV1[];
|
|
111
|
+
readonly evaluatedAtLogicalMs: number;
|
|
112
|
+
readonly revision: number;
|
|
113
|
+
}): PeerCredibilityStateV1;
|
|
114
|
+
export declare function peerCredibilityStateKeyV1(scopeDigest: string, subjectId: string, policyDigest: string): string;
|
|
115
|
+
export declare function validatePeerCredibilityStateV1(input: PeerCredibilityStateV1): PeerCredibilityStateV1;
|
|
116
|
+
//# sourceMappingURL=peer-credibility.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"peer-credibility.d.ts","sourceRoot":"","sources":["../src/peer-credibility.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,421 @@
|
|
|
1
|
+
import { deepFreeze, digestTrustJsonV1, TrustValidationError } from "./canonical.js";
|
|
2
|
+
export class InMemoryPeerCredibilityStateStoreV1 {
|
|
3
|
+
#states = new Map();
|
|
4
|
+
async load(stateKey) {
|
|
5
|
+
const state = this.#states.get(stateKey);
|
|
6
|
+
return state ? deepFreeze(structuredClone(state)) : null;
|
|
7
|
+
}
|
|
8
|
+
async save(state, expectedRevision) {
|
|
9
|
+
const current = this.#states.get(state.stateKey);
|
|
10
|
+
if ((expectedRevision === null && (current !== undefined || state.revision !== 1)) ||
|
|
11
|
+
(expectedRevision !== null &&
|
|
12
|
+
(!current || current.revision !== expectedRevision || state.revision !== expectedRevision + 1)))
|
|
13
|
+
return false;
|
|
14
|
+
this.#states.set(state.stateKey, deepFreeze(structuredClone(state)));
|
|
15
|
+
return true;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Scope-local longitudinal credibility. It deliberately does not create a
|
|
20
|
+
* portable or global reputation score and caps correlated sources as one group.
|
|
21
|
+
*/
|
|
22
|
+
export class PeerCredibilityRuntimeV1 {
|
|
23
|
+
policy;
|
|
24
|
+
store;
|
|
25
|
+
maximumCommitAttempts;
|
|
26
|
+
constructor(options) {
|
|
27
|
+
this.policy = validatePeerCredibilityPolicyV1(options.policy);
|
|
28
|
+
this.store = options.store ?? new InMemoryPeerCredibilityStateStoreV1();
|
|
29
|
+
this.maximumCommitAttempts = integer(options.maximumCommitAttempts ?? 4, "maximumCommitAttempts", 1, 32);
|
|
30
|
+
}
|
|
31
|
+
async observe(input) {
|
|
32
|
+
const observation = validatePeerCredibilityObservationV1(input.observation);
|
|
33
|
+
digest(input.scopeDigest, "scopeDigest");
|
|
34
|
+
identifier(input.subjectId, "subjectId");
|
|
35
|
+
integer(input.evaluatedAtLogicalMs, "evaluatedAtLogicalMs", 0, Number.MAX_SAFE_INTEGER);
|
|
36
|
+
if (observation.scopeDigest !== input.scopeDigest || observation.subjectId !== input.subjectId)
|
|
37
|
+
fail("peer credibility observation scope mismatch");
|
|
38
|
+
const edges = input.dependencyEdges.map(validatePeerSourceDependencyEdgeV1);
|
|
39
|
+
if (edges.length > this.policy.maximumDependencyEdges)
|
|
40
|
+
fail("peer credibility dependency edge capacity exceeded");
|
|
41
|
+
const stateKey = peerCredibilityStateKeyV1(input.scopeDigest, input.subjectId, this.policy.policyDigest);
|
|
42
|
+
for (let attempt = 0; attempt < this.maximumCommitAttempts; attempt += 1) {
|
|
43
|
+
const current = await this.store.load(stateKey);
|
|
44
|
+
if (current && input.evaluatedAtLogicalMs < current.logicalTimeHighWaterMs)
|
|
45
|
+
fail("peer credibility logical time rollback");
|
|
46
|
+
if (current?.observations.some((item) => item.observationId === observation.observationId)) {
|
|
47
|
+
const retained = current.observations.find((item) => item.observationId === observation.observationId);
|
|
48
|
+
if (retained?.observationDigest !== observation.observationDigest)
|
|
49
|
+
fail("peer credibility observation equivocation");
|
|
50
|
+
return current;
|
|
51
|
+
}
|
|
52
|
+
const horizonStart = Math.max(0, input.evaluatedAtLogicalMs - this.policy.evidenceHorizonLogicalMs);
|
|
53
|
+
const observations = [...(current?.observations ?? []), observation]
|
|
54
|
+
.filter((item) => item.observedAtLogicalMs >= horizonStart && item.observedAtLogicalMs <= input.evaluatedAtLogicalMs)
|
|
55
|
+
.sort((left, right) => left.observedAtLogicalMs - right.observedAtLogicalMs || left.observationId.localeCompare(right.observationId))
|
|
56
|
+
.slice(-this.policy.maximumRetainedObservations);
|
|
57
|
+
if (new Set(observations.map((item) => item.sourceId)).size > this.policy.maximumSources)
|
|
58
|
+
fail("peer credibility source capacity exceeded");
|
|
59
|
+
const projected = evaluatePeerCredibilityV1({
|
|
60
|
+
policy: this.policy,
|
|
61
|
+
priorStatus: current?.status ?? "unknown",
|
|
62
|
+
scopeDigest: input.scopeDigest,
|
|
63
|
+
subjectId: input.subjectId,
|
|
64
|
+
observations,
|
|
65
|
+
dependencyEdges: edges,
|
|
66
|
+
evaluatedAtLogicalMs: input.evaluatedAtLogicalMs,
|
|
67
|
+
revision: (current?.revision ?? 0) + 1,
|
|
68
|
+
});
|
|
69
|
+
if (await this.store.save(projected, current?.revision ?? null))
|
|
70
|
+
return projected;
|
|
71
|
+
}
|
|
72
|
+
fail("peer credibility commit attempts exhausted");
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
export function createPeerCredibilityPolicyV1(input) {
|
|
76
|
+
validatePolicyBody(input);
|
|
77
|
+
const body = deepFreeze(structuredClone(input));
|
|
78
|
+
return deepFreeze({
|
|
79
|
+
...body,
|
|
80
|
+
policyDigest: digestTrustJsonV1("policy", body),
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
export function validatePeerCredibilityPolicyV1(input) {
|
|
84
|
+
const { policyDigest, ...body } = input;
|
|
85
|
+
digest(policyDigest, "policyDigest");
|
|
86
|
+
const rebuilt = createPeerCredibilityPolicyV1(body);
|
|
87
|
+
if (rebuilt.policyDigest !== policyDigest)
|
|
88
|
+
fail("peer credibility policy digest mismatch");
|
|
89
|
+
return rebuilt;
|
|
90
|
+
}
|
|
91
|
+
export function createPeerCredibilityObservationV1(input) {
|
|
92
|
+
validateObservationBody(input);
|
|
93
|
+
const body = deepFreeze(structuredClone(input));
|
|
94
|
+
return deepFreeze({
|
|
95
|
+
...body,
|
|
96
|
+
observationDigest: digestTrustJsonV1("observation", body),
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
export function validatePeerCredibilityObservationV1(input) {
|
|
100
|
+
const { observationDigest, ...body } = input;
|
|
101
|
+
digest(observationDigest, "observationDigest");
|
|
102
|
+
const rebuilt = createPeerCredibilityObservationV1(body);
|
|
103
|
+
if (rebuilt.observationDigest !== observationDigest)
|
|
104
|
+
fail("peer credibility observation digest mismatch");
|
|
105
|
+
return rebuilt;
|
|
106
|
+
}
|
|
107
|
+
export function createPeerSourceDependencyEdgeV1(input) {
|
|
108
|
+
validateEdgeBody(input);
|
|
109
|
+
const normalized = input.leftSourceId < input.rightSourceId
|
|
110
|
+
? input
|
|
111
|
+
: { ...input, leftSourceId: input.rightSourceId, rightSourceId: input.leftSourceId };
|
|
112
|
+
const body = deepFreeze(structuredClone(normalized));
|
|
113
|
+
return deepFreeze({
|
|
114
|
+
...body,
|
|
115
|
+
edgeDigest: digestTrustJsonV1("dependency-binding", body),
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
export function validatePeerSourceDependencyEdgeV1(input) {
|
|
119
|
+
const { edgeDigest, ...body } = input;
|
|
120
|
+
digest(edgeDigest, "edgeDigest");
|
|
121
|
+
const rebuilt = createPeerSourceDependencyEdgeV1(body);
|
|
122
|
+
if (rebuilt.edgeDigest !== edgeDigest)
|
|
123
|
+
fail("peer dependency edge digest mismatch");
|
|
124
|
+
return rebuilt;
|
|
125
|
+
}
|
|
126
|
+
export function evaluatePeerCredibilityV1(input) {
|
|
127
|
+
const policy = validatePeerCredibilityPolicyV1(input.policy);
|
|
128
|
+
const observations = input.observations.map(validatePeerCredibilityObservationV1);
|
|
129
|
+
const activeEdges = input.dependencyEdges
|
|
130
|
+
.map(validatePeerSourceDependencyEdgeV1)
|
|
131
|
+
.filter((edge) => edge.correlationBasisPoints >= policy.dependencyCorrelationThresholdBasisPoints &&
|
|
132
|
+
edge.validFromLogicalMs <= input.evaluatedAtLogicalMs &&
|
|
133
|
+
(edge.validUntilLogicalMs === null || input.evaluatedAtLogicalMs < edge.validUntilLogicalMs))
|
|
134
|
+
.sort((left, right) => left.edgeDigest.localeCompare(right.edgeDigest));
|
|
135
|
+
const sources = [...new Set(observations.map((item) => item.sourceId))].sort();
|
|
136
|
+
const groups = correlatedGroups(sources, observations, activeEdges);
|
|
137
|
+
const evidenceByGroup = new Map();
|
|
138
|
+
const reasons = new Set();
|
|
139
|
+
for (const observation of observations) {
|
|
140
|
+
if (observation.outcome === "inconclusive" || observation.challengeDisposition === "sustained") {
|
|
141
|
+
if (observation.challengeDisposition === "sustained")
|
|
142
|
+
reasons.add("sustained_challenge_excluded");
|
|
143
|
+
continue;
|
|
144
|
+
}
|
|
145
|
+
const age = input.evaluatedAtLogicalMs - observation.observedAtLogicalMs;
|
|
146
|
+
if (age < 0 || age > policy.evidenceHorizonLogicalMs)
|
|
147
|
+
continue;
|
|
148
|
+
const freshness = Math.max(0, policy.evidenceHorizonLogicalMs - age) / policy.evidenceHorizonLogicalMs;
|
|
149
|
+
const challengeFactor = observation.challengeDisposition === "contested" ? 0.5 : 1;
|
|
150
|
+
const weight = observation.confidenceBasisPoints * freshness * challengeFactor;
|
|
151
|
+
const value = observation.outcome === "satisfied" ? 10_000 : 0;
|
|
152
|
+
const groupId = groups.get(observation.sourceId) ?? `source:${observation.sourceId}`;
|
|
153
|
+
const bucket = evidenceByGroup.get(groupId) ?? {
|
|
154
|
+
weighted: 0,
|
|
155
|
+
value: 0,
|
|
156
|
+
sources: new Set(),
|
|
157
|
+
supportiveSources: new Set(),
|
|
158
|
+
};
|
|
159
|
+
bucket.weighted += weight;
|
|
160
|
+
bucket.value += weight * value;
|
|
161
|
+
bucket.sources.add(observation.sourceId);
|
|
162
|
+
if (observation.outcome === "satisfied")
|
|
163
|
+
bucket.supportiveSources.add(observation.sourceId);
|
|
164
|
+
evidenceByGroup.set(groupId, bucket);
|
|
165
|
+
}
|
|
166
|
+
let totalWeight = 0;
|
|
167
|
+
let totalValue = 0;
|
|
168
|
+
let largestGroupWeight = 0;
|
|
169
|
+
let largestAlignedSupportWeight = 0;
|
|
170
|
+
for (const bucket of evidenceByGroup.values()) {
|
|
171
|
+
const capped = Math.min(bucket.weighted, policy.maximumDependencyGroupWeightBasisPoints);
|
|
172
|
+
const groupMean = bucket.weighted === 0 ? 0 : bucket.value / bucket.weighted;
|
|
173
|
+
totalWeight += capped;
|
|
174
|
+
totalValue += capped * groupMean;
|
|
175
|
+
largestGroupWeight = Math.max(largestGroupWeight, capped);
|
|
176
|
+
if (bucket.supportiveSources.size > 1)
|
|
177
|
+
largestAlignedSupportWeight = Math.max(largestAlignedSupportWeight, capped);
|
|
178
|
+
}
|
|
179
|
+
const independentGroupCount = evidenceByGroup.size;
|
|
180
|
+
const scoreBasisPoints = totalWeight === 0 ? 0 : clampBps(totalValue / totalWeight);
|
|
181
|
+
const coverage = Math.min(10_000, Math.round(totalWeight / Math.max(1, policy.minimumIndependentGroups)));
|
|
182
|
+
const groupShortfall = independentGroupCount >= policy.minimumIndependentGroups
|
|
183
|
+
? 0
|
|
184
|
+
: Math.round((policy.minimumIndependentGroups - independentGroupCount) / policy.minimumIndependentGroups * 10_000);
|
|
185
|
+
const uncertaintyBasisPoints = clampBps(Math.max(10_000 - coverage, groupShortfall));
|
|
186
|
+
const concentration = totalWeight === 0 ? 10_000 : Math.round(largestGroupWeight / totalWeight * 10_000);
|
|
187
|
+
const alignedCorrelation = totalWeight === 0 ? 0 : Math.round(largestAlignedSupportWeight / totalWeight * 10_000);
|
|
188
|
+
const collusionPressureBasisPoints = clampBps(Math.max(concentration, alignedCorrelation));
|
|
189
|
+
if (independentGroupCount < policy.minimumIndependentGroups)
|
|
190
|
+
reasons.add("independent_evidence_insufficient");
|
|
191
|
+
if (collusionPressureBasisPoints > policy.maximumCollusionPressureBasisPoints)
|
|
192
|
+
reasons.add("correlated_support_concentration");
|
|
193
|
+
if (uncertaintyBasisPoints > policy.maximumUncertaintyBasisPoints)
|
|
194
|
+
reasons.add("credibility_uncertainty_above_threshold");
|
|
195
|
+
const status = credibilityStatus({
|
|
196
|
+
priorStatus: input.priorStatus,
|
|
197
|
+
scoreBasisPoints,
|
|
198
|
+
uncertaintyBasisPoints,
|
|
199
|
+
collusionPressureBasisPoints,
|
|
200
|
+
independentGroupCount,
|
|
201
|
+
policy,
|
|
202
|
+
});
|
|
203
|
+
if (status === "quarantined")
|
|
204
|
+
reasons.add("peer_quarantine_required");
|
|
205
|
+
else if (status === "restricted")
|
|
206
|
+
reasons.add("peer_restriction_required");
|
|
207
|
+
else if (status === "recovering")
|
|
208
|
+
reasons.add("peer_recovery_in_progress");
|
|
209
|
+
else if (status === "eligible")
|
|
210
|
+
reasons.add("peer_credibility_supported");
|
|
211
|
+
else
|
|
212
|
+
reasons.add("peer_credibility_unknown");
|
|
213
|
+
const stateBody = {
|
|
214
|
+
schemaVersion: 1,
|
|
215
|
+
stateKey: peerCredibilityStateKeyV1(input.scopeDigest, input.subjectId, policy.policyDigest),
|
|
216
|
+
scopeDigest: input.scopeDigest,
|
|
217
|
+
subjectId: input.subjectId,
|
|
218
|
+
policyDigest: policy.policyDigest,
|
|
219
|
+
revision: input.revision,
|
|
220
|
+
logicalTimeHighWaterMs: input.evaluatedAtLogicalMs,
|
|
221
|
+
scoreBasisPoints,
|
|
222
|
+
uncertaintyBasisPoints,
|
|
223
|
+
collusionPressureBasisPoints,
|
|
224
|
+
independentGroupCount,
|
|
225
|
+
effectiveEvidenceWeightBasisPoints: clampBps(totalWeight),
|
|
226
|
+
status,
|
|
227
|
+
observations: [...observations].sort((left, right) => left.observedAtLogicalMs - right.observedAtLogicalMs || left.observationId.localeCompare(right.observationId)),
|
|
228
|
+
dependencyEdgeDigests: activeEdges.map((item) => item.edgeDigest),
|
|
229
|
+
reasonCodes: [...reasons].sort(),
|
|
230
|
+
};
|
|
231
|
+
return deepFreeze({
|
|
232
|
+
...stateBody,
|
|
233
|
+
stateDigest: digestTrustJsonV1("state", stateBody),
|
|
234
|
+
});
|
|
235
|
+
}
|
|
236
|
+
export function peerCredibilityStateKeyV1(scopeDigest, subjectId, policyDigest) {
|
|
237
|
+
digest(scopeDigest, "scopeDigest");
|
|
238
|
+
identifier(subjectId, "subjectId");
|
|
239
|
+
digest(policyDigest, "policyDigest");
|
|
240
|
+
return `peer-credibility:${scopeDigest}:${subjectId}:${policyDigest}`;
|
|
241
|
+
}
|
|
242
|
+
export function validatePeerCredibilityStateV1(input) {
|
|
243
|
+
if (!input || input.schemaVersion !== 1)
|
|
244
|
+
fail("peer credibility state schema invalid");
|
|
245
|
+
digest(input.scopeDigest, "scopeDigest");
|
|
246
|
+
identifier(input.subjectId, "subjectId");
|
|
247
|
+
digest(input.policyDigest, "policyDigest");
|
|
248
|
+
if (input.stateKey !== peerCredibilityStateKeyV1(input.scopeDigest, input.subjectId, input.policyDigest))
|
|
249
|
+
fail("peer credibility state key invalid");
|
|
250
|
+
integer(input.revision, "revision", 1, Number.MAX_SAFE_INTEGER);
|
|
251
|
+
integer(input.logicalTimeHighWaterMs, "logicalTimeHighWaterMs", 0, Number.MAX_SAFE_INTEGER);
|
|
252
|
+
bps(input.scoreBasisPoints, "scoreBasisPoints");
|
|
253
|
+
bps(input.uncertaintyBasisPoints, "uncertaintyBasisPoints");
|
|
254
|
+
bps(input.collusionPressureBasisPoints, "collusionPressureBasisPoints");
|
|
255
|
+
integer(input.independentGroupCount, "independentGroupCount", 0, 100_000);
|
|
256
|
+
bps(input.effectiveEvidenceWeightBasisPoints, "effectiveEvidenceWeightBasisPoints");
|
|
257
|
+
if (!["unknown", "eligible", "restricted", "quarantined", "recovering"].includes(input.status))
|
|
258
|
+
fail("peer credibility state status invalid");
|
|
259
|
+
const observationIds = new Set();
|
|
260
|
+
let priorObservation = null;
|
|
261
|
+
for (const observationInput of input.observations) {
|
|
262
|
+
const observation = validatePeerCredibilityObservationV1(observationInput);
|
|
263
|
+
if (observationIds.has(observation.observationId) ||
|
|
264
|
+
observation.scopeDigest !== input.scopeDigest ||
|
|
265
|
+
observation.subjectId !== input.subjectId ||
|
|
266
|
+
observation.observedAtLogicalMs > input.logicalTimeHighWaterMs ||
|
|
267
|
+
(priorObservation !== null && (priorObservation.observedAtLogicalMs > observation.observedAtLogicalMs ||
|
|
268
|
+
(priorObservation.observedAtLogicalMs === observation.observedAtLogicalMs && priorObservation.observationId > observation.observationId))))
|
|
269
|
+
fail("peer credibility state observation binding invalid");
|
|
270
|
+
observationIds.add(observation.observationId);
|
|
271
|
+
priorObservation = observation;
|
|
272
|
+
}
|
|
273
|
+
canonicalDigests(input.dependencyEdgeDigests, "dependencyEdgeDigests");
|
|
274
|
+
canonicalIdentifiers(input.reasonCodes, "reasonCodes");
|
|
275
|
+
const { stateDigest, ...body } = input;
|
|
276
|
+
digest(stateDigest, "stateDigest");
|
|
277
|
+
if (digestTrustJsonV1("state", body) !== stateDigest)
|
|
278
|
+
fail("peer credibility state digest invalid");
|
|
279
|
+
return deepFreeze(structuredClone(input));
|
|
280
|
+
}
|
|
281
|
+
function correlatedGroups(sources, observations, edges) {
|
|
282
|
+
const parent = new Map(sources.map((source) => [source, source]));
|
|
283
|
+
const find = (source) => {
|
|
284
|
+
const current = parent.get(source) ?? source;
|
|
285
|
+
if (current === source)
|
|
286
|
+
return source;
|
|
287
|
+
const root = find(current);
|
|
288
|
+
parent.set(source, root);
|
|
289
|
+
return root;
|
|
290
|
+
};
|
|
291
|
+
const union = (left, right) => {
|
|
292
|
+
const leftRoot = find(left), rightRoot = find(right);
|
|
293
|
+
if (leftRoot === rightRoot)
|
|
294
|
+
return;
|
|
295
|
+
const [first, second] = [leftRoot, rightRoot].sort();
|
|
296
|
+
parent.set(second, first);
|
|
297
|
+
};
|
|
298
|
+
for (const edge of edges)
|
|
299
|
+
union(edge.leftSourceId, edge.rightSourceId);
|
|
300
|
+
const sourceByDeclaredGroup = new Map();
|
|
301
|
+
for (const observation of observations) {
|
|
302
|
+
const prior = sourceByDeclaredGroup.get(observation.dependencyGroupId);
|
|
303
|
+
if (prior)
|
|
304
|
+
union(prior, observation.sourceId);
|
|
305
|
+
else
|
|
306
|
+
sourceByDeclaredGroup.set(observation.dependencyGroupId, observation.sourceId);
|
|
307
|
+
}
|
|
308
|
+
return new Map(sources.map((source) => [source, `correlated:${find(source)}`]));
|
|
309
|
+
}
|
|
310
|
+
function credibilityStatus(input) {
|
|
311
|
+
const { policy } = input;
|
|
312
|
+
if (input.independentGroupCount === 0)
|
|
313
|
+
return "unknown";
|
|
314
|
+
if (input.scoreBasisPoints <= policy.quarantineScoreAtOrBelowBasisPoints ||
|
|
315
|
+
input.collusionPressureBasisPoints > policy.maximumCollusionPressureBasisPoints)
|
|
316
|
+
return "quarantined";
|
|
317
|
+
if (input.scoreBasisPoints <= policy.restrictedScoreAtOrBelowBasisPoints ||
|
|
318
|
+
input.uncertaintyBasisPoints > policy.maximumUncertaintyBasisPoints ||
|
|
319
|
+
input.independentGroupCount < policy.minimumIndependentGroups)
|
|
320
|
+
return "restricted";
|
|
321
|
+
if ((input.priorStatus === "quarantined" || input.priorStatus === "restricted" || input.priorStatus === "recovering") &&
|
|
322
|
+
(input.scoreBasisPoints < policy.recoveryScoreBasisPoints ||
|
|
323
|
+
input.independentGroupCount < policy.recoveryIndependentGroups))
|
|
324
|
+
return "recovering";
|
|
325
|
+
return "eligible";
|
|
326
|
+
}
|
|
327
|
+
function validatePolicyBody(input) {
|
|
328
|
+
if (input.schemaVersion !== 1)
|
|
329
|
+
fail("peer credibility policy schema invalid");
|
|
330
|
+
identifier(input.policyId, "policyId");
|
|
331
|
+
integer(input.policyVersion, "policyVersion", 1, Number.MAX_SAFE_INTEGER);
|
|
332
|
+
integer(input.evidenceHorizonLogicalMs, "evidenceHorizonLogicalMs", 1, Number.MAX_SAFE_INTEGER);
|
|
333
|
+
integer(input.maximumRetainedObservations, "maximumRetainedObservations", 1, 100_000);
|
|
334
|
+
integer(input.maximumSources, "maximumSources", 1, 100_000);
|
|
335
|
+
integer(input.maximumDependencyEdges, "maximumDependencyEdges", 0, 1_000_000);
|
|
336
|
+
bps(input.dependencyCorrelationThresholdBasisPoints, "dependencyCorrelationThresholdBasisPoints");
|
|
337
|
+
bps(input.maximumDependencyGroupWeightBasisPoints, "maximumDependencyGroupWeightBasisPoints");
|
|
338
|
+
integer(input.minimumIndependentGroups, "minimumIndependentGroups", 1, 10_000);
|
|
339
|
+
bps(input.restrictedScoreAtOrBelowBasisPoints, "restrictedScoreAtOrBelowBasisPoints");
|
|
340
|
+
bps(input.quarantineScoreAtOrBelowBasisPoints, "quarantineScoreAtOrBelowBasisPoints");
|
|
341
|
+
bps(input.maximumUncertaintyBasisPoints, "maximumUncertaintyBasisPoints");
|
|
342
|
+
bps(input.maximumCollusionPressureBasisPoints, "maximumCollusionPressureBasisPoints");
|
|
343
|
+
bps(input.recoveryScoreBasisPoints, "recoveryScoreBasisPoints");
|
|
344
|
+
integer(input.recoveryIndependentGroups, "recoveryIndependentGroups", 1, 10_000);
|
|
345
|
+
if (input.quarantineScoreAtOrBelowBasisPoints > input.restrictedScoreAtOrBelowBasisPoints)
|
|
346
|
+
fail("peer credibility quarantine threshold exceeds restriction threshold");
|
|
347
|
+
if (input.recoveryScoreBasisPoints <= input.restrictedScoreAtOrBelowBasisPoints)
|
|
348
|
+
fail("peer credibility recovery threshold must exceed restriction threshold");
|
|
349
|
+
}
|
|
350
|
+
function validateObservationBody(input) {
|
|
351
|
+
if (input.schemaVersion !== 1)
|
|
352
|
+
fail("peer credibility observation schema invalid");
|
|
353
|
+
identifier(input.observationId, "observationId");
|
|
354
|
+
digest(input.scopeDigest, "scopeDigest");
|
|
355
|
+
identifier(input.subjectId, "subjectId");
|
|
356
|
+
identifier(input.sourceId, "sourceId");
|
|
357
|
+
identifier(input.dependencyGroupId, "dependencyGroupId");
|
|
358
|
+
identifier(input.criterionId, "criterionId");
|
|
359
|
+
if (!["satisfied", "violated", "inconclusive"].includes(input.outcome))
|
|
360
|
+
fail("peer credibility outcome invalid");
|
|
361
|
+
bps(input.confidenceBasisPoints, "confidenceBasisPoints");
|
|
362
|
+
if (!["none", "dismissed", "sustained", "contested"].includes(input.challengeDisposition))
|
|
363
|
+
fail("peer challenge disposition invalid");
|
|
364
|
+
digest(input.evidenceDigest, "evidenceDigest");
|
|
365
|
+
integer(input.observedAtLogicalMs, "observedAtLogicalMs", 0, Number.MAX_SAFE_INTEGER);
|
|
366
|
+
}
|
|
367
|
+
function validateEdgeBody(input) {
|
|
368
|
+
if (input.schemaVersion !== 1)
|
|
369
|
+
fail("peer dependency edge schema invalid");
|
|
370
|
+
identifier(input.leftSourceId, "leftSourceId");
|
|
371
|
+
identifier(input.rightSourceId, "rightSourceId");
|
|
372
|
+
if (input.leftSourceId === input.rightSourceId)
|
|
373
|
+
fail("peer dependency self edge invalid");
|
|
374
|
+
bps(input.correlationBasisPoints, "correlationBasisPoints");
|
|
375
|
+
digest(input.basisDigest, "basisDigest");
|
|
376
|
+
integer(input.validFromLogicalMs, "validFromLogicalMs", 0, Number.MAX_SAFE_INTEGER);
|
|
377
|
+
if (input.validUntilLogicalMs !== null) {
|
|
378
|
+
integer(input.validUntilLogicalMs, "validUntilLogicalMs", 1, Number.MAX_SAFE_INTEGER);
|
|
379
|
+
if (input.validUntilLogicalMs <= input.validFromLogicalMs)
|
|
380
|
+
fail("peer dependency edge validity window invalid");
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
function digest(value, label) {
|
|
384
|
+
if (typeof value !== "string" || !/^[a-f0-9]{64}$/.test(value))
|
|
385
|
+
fail(`${label} invalid`);
|
|
386
|
+
}
|
|
387
|
+
function identifier(value, label) {
|
|
388
|
+
if (typeof value !== "string" || !/^[A-Za-z0-9][A-Za-z0-9._:/-]{0,239}$/.test(value))
|
|
389
|
+
fail(`${label} invalid`);
|
|
390
|
+
}
|
|
391
|
+
function canonicalIdentifiers(values, label) {
|
|
392
|
+
if (!Array.isArray(values) || values.length > 100_000)
|
|
393
|
+
fail(`${label} invalid`);
|
|
394
|
+
values.forEach((item) => identifier(item, label));
|
|
395
|
+
const canonical = [...new Set(values)].sort();
|
|
396
|
+
if (canonical.length !== values.length || canonical.some((item, index) => item !== values[index]))
|
|
397
|
+
fail(`${label} must be canonical`);
|
|
398
|
+
}
|
|
399
|
+
function canonicalDigests(values, label) {
|
|
400
|
+
if (!Array.isArray(values) || values.length > 1_000_000)
|
|
401
|
+
fail(`${label} invalid`);
|
|
402
|
+
values.forEach((item) => digest(item, label));
|
|
403
|
+
const canonical = [...new Set(values)].sort();
|
|
404
|
+
if (canonical.length !== values.length || canonical.some((item, index) => item !== values[index]))
|
|
405
|
+
fail(`${label} must be canonical`);
|
|
406
|
+
}
|
|
407
|
+
function integer(value, label, minimum, maximum) {
|
|
408
|
+
if (!Number.isSafeInteger(value) || value < minimum || value > maximum)
|
|
409
|
+
fail(`${label} invalid`);
|
|
410
|
+
return value;
|
|
411
|
+
}
|
|
412
|
+
function bps(value, label) {
|
|
413
|
+
return integer(value, label, 0, 10_000);
|
|
414
|
+
}
|
|
415
|
+
function clampBps(value) {
|
|
416
|
+
return Math.max(0, Math.min(10_000, Math.round(value)));
|
|
417
|
+
}
|
|
418
|
+
function fail(message) {
|
|
419
|
+
throw new TrustValidationError(message);
|
|
420
|
+
}
|
|
421
|
+
//# sourceMappingURL=peer-credibility.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"peer-credibility.js","sourceRoot":"","sources":["../src/peer-credibility.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/** A bounded, content-bound hop in a propagated message's custody chain. */
|
|
2
|
+
export interface PropagationHopV1 {
|
|
3
|
+
readonly hopIndex: number;
|
|
4
|
+
readonly senderId: string;
|
|
5
|
+
readonly receiverId: string;
|
|
6
|
+
readonly previousHopDigest: string | null;
|
|
7
|
+
readonly hopDigest: string;
|
|
8
|
+
}
|
|
9
|
+
export type PropagationDispositionV1 = "active" | "quarantined" | "blocked";
|
|
10
|
+
/**
|
|
11
|
+
* Transport-neutral envelope for content that may cross agent boundaries.
|
|
12
|
+
* The envelope is deliberately independent of a transport or model provider.
|
|
13
|
+
*/
|
|
14
|
+
export interface PropagatedContentV1 {
|
|
15
|
+
readonly schemaVersion: 1;
|
|
16
|
+
readonly contentDigest: string;
|
|
17
|
+
readonly originId: string;
|
|
18
|
+
readonly originProofDigest: string;
|
|
19
|
+
readonly hops: readonly PropagationHopV1[];
|
|
20
|
+
readonly propagationBudget: number;
|
|
21
|
+
readonly forwardsUsed: number;
|
|
22
|
+
readonly disposition: PropagationDispositionV1;
|
|
23
|
+
readonly quarantineReason: string | null;
|
|
24
|
+
}
|
|
25
|
+
export interface PropagationPolicyV1 {
|
|
26
|
+
readonly maximumHops: number;
|
|
27
|
+
readonly maximumForwards: number;
|
|
28
|
+
readonly quarantineOnBudgetExhaustion: boolean;
|
|
29
|
+
readonly quarantineOnOriginMismatch: boolean;
|
|
30
|
+
readonly blockQuarantinedForwarding: boolean;
|
|
31
|
+
}
|
|
32
|
+
export interface PropagationAssessmentV1 {
|
|
33
|
+
readonly allowed: boolean;
|
|
34
|
+
readonly disposition: PropagationDispositionV1;
|
|
35
|
+
readonly reasonCodes: readonly ("origin_invalid" | "hop_invalid" | "budget_exhausted" | "quarantine_active" | "forwarding_blocked")[];
|
|
36
|
+
readonly envelope: PropagatedContentV1;
|
|
37
|
+
}
|
|
38
|
+
export declare function propagationHopDigestV1(hop: Omit<PropagationHopV1, "hopDigest"> & {
|
|
39
|
+
readonly contentDigest: string;
|
|
40
|
+
}): string;
|
|
41
|
+
export declare function createPropagatedContentV1(input: {
|
|
42
|
+
readonly contentDigest: string;
|
|
43
|
+
readonly originId: string;
|
|
44
|
+
readonly originProofDigest?: string;
|
|
45
|
+
readonly propagationBudget: number;
|
|
46
|
+
}): PropagatedContentV1;
|
|
47
|
+
export declare function appendPropagationHopV1(envelope: PropagatedContentV1, senderId: string, receiverId: string, policy: PropagationPolicyV1): PropagationAssessmentV1;
|
|
48
|
+
export declare function assessPropagationV1(envelope: PropagatedContentV1, policy: PropagationPolicyV1): PropagationAssessmentV1;
|
|
49
|
+
export declare const canForwardPropagatedContentV1: (envelope: PropagatedContentV1, policy: PropagationPolicyV1) => boolean;
|
|
50
|
+
export declare function validatePropagationEnvelopeV1(value: unknown): asserts value is PropagatedContentV1;
|
|
51
|
+
//# sourceMappingURL=propagation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"propagation.d.ts","sourceRoot":"","sources":["../src/propagation.ts"],"names":[],"mappings":"AAIA,4EAA4E;AAC5E,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1C,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,MAAM,wBAAwB,GAAG,QAAQ,GAAG,aAAa,GAAG,SAAS,CAAC;AAE5E;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,aAAa,EAAE,CAAC,CAAC;IAC1B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,IAAI,EAAE,SAAS,gBAAgB,EAAE,CAAC;IAC3C,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,WAAW,EAAE,wBAAwB,CAAC;IAC/C,QAAQ,CAAC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1C;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,4BAA4B,EAAE,OAAO,CAAC;IAC/C,QAAQ,CAAC,0BAA0B,EAAE,OAAO,CAAC;IAC7C,QAAQ,CAAC,0BAA0B,EAAE,OAAO,CAAC;CAC9C;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,WAAW,EAAE,wBAAwB,CAAC;IAC/C,QAAQ,CAAC,WAAW,EAAE,SAAS,CAAC,gBAAgB,GAAG,aAAa,GAAG,kBAAkB,GAAG,mBAAmB,GAAG,oBAAoB,CAAC,EAAE,CAAC;IACtI,QAAQ,CAAC,QAAQ,EAAE,mBAAmB,CAAC;CACxC;AAcD,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,IAAI,CAAC,gBAAgB,EAAE,WAAW,CAAC,GAAG;IAAE,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAG5H;AAED,wBAAgB,yBAAyB,CAAC,KAAK,EAAE;IAC/C,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;CACpC,GAAG,mBAAmB,CAQtB;AAED,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,mBAAmB,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,mBAAmB,GAAG,uBAAuB,CAgBhK;AAED,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,mBAAmB,EAAE,MAAM,EAAE,mBAAmB,GAAG,uBAAuB,CAKvH;AAED,eAAO,MAAM,6BAA6B,GAAI,UAAU,mBAAmB,EAAE,QAAQ,mBAAmB,KAAG,OAAwD,CAAC;AAMpK,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,KAAK,IAAI,mBAAmB,CAgBlG"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { deepFreeze, digestTrustJsonV1, TrustValidationError } from "./canonical.js";
|
|
2
|
+
import { assertExactKeys, assertIdentifier, assertSafeInteger, assertTrustDigest } from "./validation.js";
|
|
3
|
+
const dispositionValues = ["active", "quarantined", "blocked"];
|
|
4
|
+
const digest = (value) => digestTrustJsonV1("origin-proof", value);
|
|
5
|
+
const hopPayload = (hopIndex, senderId, receiverId, previousHopDigest, contentDigest) => ({
|
|
6
|
+
schemaVersion: 1, hopIndex, senderId, receiverId, previousHopDigest, contentDigest,
|
|
7
|
+
});
|
|
8
|
+
function validatePolicy(policy) {
|
|
9
|
+
assertSafeInteger(policy.maximumHops, "maximumHops");
|
|
10
|
+
assertSafeInteger(policy.maximumForwards, "maximumForwards");
|
|
11
|
+
if (policy.maximumHops < 0 || policy.maximumForwards < 0)
|
|
12
|
+
throw new TrustValidationError("propagation limits must be non-negative");
|
|
13
|
+
}
|
|
14
|
+
export function propagationHopDigestV1(hop) {
|
|
15
|
+
assertTrustDigest(hop.contentDigest, "contentDigest");
|
|
16
|
+
return digest(hopPayload(hop.hopIndex, hop.senderId, hop.receiverId, hop.previousHopDigest, hop.contentDigest));
|
|
17
|
+
}
|
|
18
|
+
export function createPropagatedContentV1(input) {
|
|
19
|
+
assertTrustDigest(input.contentDigest, "contentDigest");
|
|
20
|
+
assertIdentifier(input.originId, "originId");
|
|
21
|
+
assertSafeInteger(input.propagationBudget, "propagationBudget");
|
|
22
|
+
if (input.propagationBudget < 0)
|
|
23
|
+
throw new TrustValidationError("propagationBudget must be non-negative");
|
|
24
|
+
const originProofDigest = input.originProofDigest ?? digest({ schemaVersion: 1, contentDigest: input.contentDigest, originId: input.originId });
|
|
25
|
+
assertTrustDigest(originProofDigest, "originProofDigest");
|
|
26
|
+
return deepFreeze({ schemaVersion: 1, contentDigest: input.contentDigest, originId: input.originId, originProofDigest, hops: [], propagationBudget: input.propagationBudget, forwardsUsed: 0, disposition: "active", quarantineReason: null });
|
|
27
|
+
}
|
|
28
|
+
export function appendPropagationHopV1(envelope, senderId, receiverId, policy) {
|
|
29
|
+
validatePropagationEnvelopeV1(envelope);
|
|
30
|
+
validatePolicy(policy);
|
|
31
|
+
assertIdentifier(senderId, "senderId");
|
|
32
|
+
assertIdentifier(receiverId, "receiverId");
|
|
33
|
+
if (envelope.disposition !== "active" && policy.blockQuarantinedForwarding)
|
|
34
|
+
return assess(envelope, "forwarding_blocked", "blocked");
|
|
35
|
+
const nextIndex = envelope.hops.length;
|
|
36
|
+
const previous = envelope.hops.at(-1)?.hopDigest ?? null;
|
|
37
|
+
if (nextIndex >= policy.maximumHops || envelope.forwardsUsed >= policy.maximumForwards || envelope.propagationBudget <= 0) {
|
|
38
|
+
const disposition = policy.quarantineOnBudgetExhaustion ? "quarantined" : "blocked";
|
|
39
|
+
return assess({ ...envelope, disposition, quarantineReason: "budget_exhausted" }, "budget_exhausted", disposition);
|
|
40
|
+
}
|
|
41
|
+
const hopBase = { hopIndex: nextIndex, senderId, receiverId, previousHopDigest: previous };
|
|
42
|
+
const hop = {
|
|
43
|
+
...hopBase,
|
|
44
|
+
hopDigest: propagationHopDigestV1({ ...hopBase, contentDigest: envelope.contentDigest }),
|
|
45
|
+
};
|
|
46
|
+
const next = { ...envelope, hops: [...envelope.hops, hop], forwardsUsed: envelope.forwardsUsed + 1, propagationBudget: envelope.propagationBudget - 1 };
|
|
47
|
+
return { allowed: true, disposition: "active", reasonCodes: [], envelope: deepFreeze(next) };
|
|
48
|
+
}
|
|
49
|
+
export function assessPropagationV1(envelope, policy) {
|
|
50
|
+
validatePropagationEnvelopeV1(envelope);
|
|
51
|
+
validatePolicy(policy);
|
|
52
|
+
if (envelope.disposition !== "active")
|
|
53
|
+
return assess(envelope, envelope.disposition === "blocked" ? "forwarding_blocked" : "quarantine_active", envelope.disposition);
|
|
54
|
+
if (envelope.hops.length > policy.maximumHops || envelope.forwardsUsed > policy.maximumForwards || envelope.propagationBudget < 0)
|
|
55
|
+
return assess(envelope, "budget_exhausted", policy.quarantineOnBudgetExhaustion ? "quarantined" : "blocked");
|
|
56
|
+
return { allowed: true, disposition: "active", reasonCodes: [], envelope };
|
|
57
|
+
}
|
|
58
|
+
export const canForwardPropagatedContentV1 = (envelope, policy) => assessPropagationV1(envelope, policy).allowed;
|
|
59
|
+
function assess(envelope, reason, disposition) {
|
|
60
|
+
return { allowed: false, disposition, reasonCodes: [reason], envelope: deepFreeze(envelope) };
|
|
61
|
+
}
|
|
62
|
+
export function validatePropagationEnvelopeV1(value) {
|
|
63
|
+
assertExactKeys(value, ["schemaVersion", "contentDigest", "originId", "originProofDigest", "hops", "propagationBudget", "forwardsUsed", "disposition", "quarantineReason"], "propagation envelope");
|
|
64
|
+
const envelope = value;
|
|
65
|
+
if (envelope.schemaVersion !== 1 || !dispositionValues.includes(envelope.disposition))
|
|
66
|
+
throw new TrustValidationError("propagation envelope is invalid");
|
|
67
|
+
assertTrustDigest(envelope.contentDigest, "contentDigest");
|
|
68
|
+
assertTrustDigest(envelope.originProofDigest, "originProofDigest");
|
|
69
|
+
assertIdentifier(envelope.originId, "originId");
|
|
70
|
+
assertSafeInteger(envelope.propagationBudget, "propagationBudget");
|
|
71
|
+
assertSafeInteger(envelope.forwardsUsed, "forwardsUsed");
|
|
72
|
+
if (envelope.propagationBudget < 0 || envelope.forwardsUsed < 0 || !Array.isArray(envelope.hops))
|
|
73
|
+
throw new TrustValidationError("propagation counters are invalid");
|
|
74
|
+
let previous = null;
|
|
75
|
+
envelope.hops.forEach((candidate, index) => {
|
|
76
|
+
const hop = candidate;
|
|
77
|
+
assertExactKeys(hop, ["hopIndex", "senderId", "receiverId", "previousHopDigest", "hopDigest"], "propagation hop");
|
|
78
|
+
if (hop.hopIndex !== index || hop.previousHopDigest !== previous)
|
|
79
|
+
throw new TrustValidationError("propagation hop chain is invalid");
|
|
80
|
+
assertIdentifier(hop.senderId, "hop senderId");
|
|
81
|
+
assertIdentifier(hop.receiverId, "hop receiverId");
|
|
82
|
+
assertTrustDigest(hop.hopDigest, "hopDigest");
|
|
83
|
+
if (propagationHopDigestV1({ hopIndex: hop.hopIndex, senderId: hop.senderId, receiverId: hop.receiverId, previousHopDigest: hop.previousHopDigest, contentDigest: envelope.contentDigest }) !== hop.hopDigest)
|
|
84
|
+
throw new TrustValidationError("propagation hop digest is invalid");
|
|
85
|
+
previous = hop.hopDigest;
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=propagation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"propagation.js","sourceRoot":"","sources":["../src/propagation.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agentplat/trust",
|
|
3
|
-
"version": "0.3.0-beta.
|
|
3
|
+
"version": "0.3.0-beta.4",
|
|
4
4
|
"description": "Browser-safe deterministic evidence and trust primitives for AgentPlat.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -15,6 +15,18 @@
|
|
|
15
15
|
"./mesh-records": {
|
|
16
16
|
"types": "./dist/mesh-records.d.ts",
|
|
17
17
|
"import": "./dist/mesh-records.js"
|
|
18
|
+
},
|
|
19
|
+
"./peer-credibility": {
|
|
20
|
+
"types": "./dist/peer-credibility.d.ts",
|
|
21
|
+
"import": "./dist/peer-credibility.js"
|
|
22
|
+
},
|
|
23
|
+
"./propagation": {
|
|
24
|
+
"types": "./dist/propagation.d.ts",
|
|
25
|
+
"import": "./dist/propagation.js"
|
|
26
|
+
},
|
|
27
|
+
"./evidence-fusion-strategy": {
|
|
28
|
+
"types": "./dist/evidence-fusion-strategy.d.ts",
|
|
29
|
+
"import": "./dist/evidence-fusion-strategy.js"
|
|
18
30
|
}
|
|
19
31
|
},
|
|
20
32
|
"files": [
|
|
@@ -22,7 +34,7 @@
|
|
|
22
34
|
"README.md"
|
|
23
35
|
],
|
|
24
36
|
"dependencies": {
|
|
25
|
-
"@agentplat/core": "^0.3.0-beta.
|
|
37
|
+
"@agentplat/core": "^0.3.0-beta.4"
|
|
26
38
|
},
|
|
27
39
|
"engines": {
|
|
28
40
|
"node": ">=20.19.3"
|