agent-passport-system 2.6.0-alpha.5 → 2.6.0-alpha.6

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.
Files changed (62) hide show
  1. package/README.md +1 -1
  2. package/dist/src/v2/behavioral_drift_window/__tests__/behavioral_drift_window.test.d.ts +2 -0
  3. package/dist/src/v2/behavioral_drift_window/__tests__/behavioral_drift_window.test.d.ts.map +1 -0
  4. package/dist/src/v2/behavioral_drift_window/__tests__/behavioral_drift_window.test.js +449 -0
  5. package/dist/src/v2/behavioral_drift_window/__tests__/behavioral_drift_window.test.js.map +1 -0
  6. package/dist/src/v2/behavioral_drift_window/envelope.d.ts +24 -0
  7. package/dist/src/v2/behavioral_drift_window/envelope.d.ts.map +1 -0
  8. package/dist/src/v2/behavioral_drift_window/envelope.js +49 -0
  9. package/dist/src/v2/behavioral_drift_window/envelope.js.map +1 -0
  10. package/dist/src/v2/behavioral_drift_window/index.d.ts +5 -0
  11. package/dist/src/v2/behavioral_drift_window/index.d.ts.map +1 -0
  12. package/dist/src/v2/behavioral_drift_window/index.js +30 -0
  13. package/dist/src/v2/behavioral_drift_window/index.js.map +1 -0
  14. package/dist/src/v2/behavioral_drift_window/types.d.ts +130 -0
  15. package/dist/src/v2/behavioral_drift_window/types.d.ts.map +1 -0
  16. package/dist/src/v2/behavioral_drift_window/types.js +146 -0
  17. package/dist/src/v2/behavioral_drift_window/types.js.map +1 -0
  18. package/dist/src/v2/behavioral_drift_window/verify.d.ts +15 -0
  19. package/dist/src/v2/behavioral_drift_window/verify.d.ts.map +1 -0
  20. package/dist/src/v2/behavioral_drift_window/verify.js +100 -0
  21. package/dist/src/v2/behavioral_drift_window/verify.js.map +1 -0
  22. package/dist/src/v2/cross_issuer_attestation/__tests__/cross_issuer_attestation.test.d.ts +2 -0
  23. package/dist/src/v2/cross_issuer_attestation/__tests__/cross_issuer_attestation.test.d.ts.map +1 -0
  24. package/dist/src/v2/cross_issuer_attestation/__tests__/cross_issuer_attestation.test.js +198 -0
  25. package/dist/src/v2/cross_issuer_attestation/__tests__/cross_issuer_attestation.test.js.map +1 -0
  26. package/dist/src/v2/cross_issuer_attestation/envelope.d.ts +22 -0
  27. package/dist/src/v2/cross_issuer_attestation/envelope.d.ts.map +1 -0
  28. package/dist/src/v2/cross_issuer_attestation/envelope.js +39 -0
  29. package/dist/src/v2/cross_issuer_attestation/envelope.js.map +1 -0
  30. package/dist/src/v2/cross_issuer_attestation/index.d.ts +5 -0
  31. package/dist/src/v2/cross_issuer_attestation/index.d.ts.map +1 -0
  32. package/dist/src/v2/cross_issuer_attestation/index.js +33 -0
  33. package/dist/src/v2/cross_issuer_attestation/index.js.map +1 -0
  34. package/dist/src/v2/cross_issuer_attestation/types.d.ts +104 -0
  35. package/dist/src/v2/cross_issuer_attestation/types.d.ts.map +1 -0
  36. package/dist/src/v2/cross_issuer_attestation/types.js +117 -0
  37. package/dist/src/v2/cross_issuer_attestation/types.js.map +1 -0
  38. package/dist/src/v2/cross_issuer_attestation/verify.d.ts +16 -0
  39. package/dist/src/v2/cross_issuer_attestation/verify.d.ts.map +1 -0
  40. package/dist/src/v2/cross_issuer_attestation/verify.js +91 -0
  41. package/dist/src/v2/cross_issuer_attestation/verify.js.map +1 -0
  42. package/dist/src/v2/memory_provenance/__tests__/memory_provenance.test.d.ts +2 -0
  43. package/dist/src/v2/memory_provenance/__tests__/memory_provenance.test.d.ts.map +1 -0
  44. package/dist/src/v2/memory_provenance/__tests__/memory_provenance.test.js +236 -0
  45. package/dist/src/v2/memory_provenance/__tests__/memory_provenance.test.js.map +1 -0
  46. package/dist/src/v2/memory_provenance/envelope.d.ts +21 -0
  47. package/dist/src/v2/memory_provenance/envelope.d.ts.map +1 -0
  48. package/dist/src/v2/memory_provenance/envelope.js +45 -0
  49. package/dist/src/v2/memory_provenance/envelope.js.map +1 -0
  50. package/dist/src/v2/memory_provenance/index.d.ts +5 -0
  51. package/dist/src/v2/memory_provenance/index.d.ts.map +1 -0
  52. package/dist/src/v2/memory_provenance/index.js +31 -0
  53. package/dist/src/v2/memory_provenance/index.js.map +1 -0
  54. package/dist/src/v2/memory_provenance/types.d.ts +107 -0
  55. package/dist/src/v2/memory_provenance/types.d.ts.map +1 -0
  56. package/dist/src/v2/memory_provenance/types.js +92 -0
  57. package/dist/src/v2/memory_provenance/types.js.map +1 -0
  58. package/dist/src/v2/memory_provenance/verify.d.ts +19 -0
  59. package/dist/src/v2/memory_provenance/verify.d.ts.map +1 -0
  60. package/dist/src/v2/memory_provenance/verify.js +77 -0
  61. package/dist/src/v2/memory_provenance/verify.js.map +1 -0
  62. package/package.json +5 -5
package/README.md CHANGED
@@ -143,7 +143,7 @@ The composition contract specifies how a verifier MUST cross-check per-request s
143
143
 
144
144
  ## Numbers
145
145
 
146
- 3,008 tests. 8 protocol layers. Framework adapters for CrewAI, LangChain, ADK, A2A, MCP, OpenShell, IBAC, Gonka. Gateway evaluation under 2ms. Zero heavy dependencies. Apache-2.0.
146
+ 3,064 tests. 8 protocol layers. Framework adapters for CrewAI, LangChain, ADK, A2A, MCP, OpenShell, IBAC, Gonka. Gateway evaluation under 2ms. Zero heavy dependencies. Apache-2.0.
147
147
 
148
148
  ## Papers
149
149
 
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=behavioral_drift_window.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"behavioral_drift_window.test.d.ts","sourceRoot":"","sources":["../../../../../src/v2/behavioral_drift_window/__tests__/behavioral_drift_window.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,449 @@
1
+ // Copyright 2024-2026 Tymofii Pidlisnyi. Apache-2.0 license. See LICENSE.
2
+ // ══════════════════════════════════════════════════════════════════
3
+ // behavioral_drift_window signal_type (v0.1): tests
4
+ // ══════════════════════════════════════════════════════════════════
5
+ import { describe, it } from 'node:test';
6
+ import assert from 'node:assert/strict';
7
+ import { createHash } from 'node:crypto';
8
+ import { generateKeyPair } from '../../../crypto/keys.js';
9
+ import { signBehavioralDriftWindow, verifyBehavioralDriftWindow, isBehavioralDriftWindow, } from '../index.js';
10
+ function sha256Hex(s) {
11
+ return createHash('sha256').update(s, 'utf8').digest('hex');
12
+ }
13
+ const WINDOW_START = '2026-05-25T00:00:00Z';
14
+ const WINDOW_END = '2026-05-26T00:00:00Z';
15
+ function makeUnsigned(overrides) {
16
+ return {
17
+ signal_type: 'behavioral_drift_window',
18
+ window_start: WINDOW_START,
19
+ window_end: WINDOW_END,
20
+ constituent_attestations: [],
21
+ metrics: {
22
+ decision_count: 0,
23
+ class_distribution: { precondition_set: 0, candidate_set: 0, decision_path: 0 },
24
+ },
25
+ ...overrides,
26
+ };
27
+ }
28
+ // ── 1. Self-attestation round-trip ─────────────────────────────
29
+ describe('behavioral_drift_window: self-attestation round-trip', () => {
30
+ it('observer_id === subject_agent_id, single constituent, class_distribution sums match', () => {
31
+ const kp = generateKeyPair();
32
+ const constituentHash = sha256Hex('cognitive.attestation.envelope.1');
33
+ const unsigned = makeUnsigned({
34
+ subject_agent_id: kp.publicKey,
35
+ observer_id: kp.publicKey,
36
+ constituent_attestations: [constituentHash],
37
+ metrics: {
38
+ decision_count: 1,
39
+ class_distribution: { precondition_set: 0, candidate_set: 0, decision_path: 1 },
40
+ confidence_mean: 0.87,
41
+ confidence_stddev: 0.0,
42
+ },
43
+ });
44
+ const signed = signBehavioralDriftWindow(kp.privateKey, unsigned);
45
+ assert.equal(signed.signal_type, 'behavioral_drift_window');
46
+ assert.equal(signed.observer_id, kp.publicKey);
47
+ assert.equal(signed.subject_agent_id, kp.publicKey);
48
+ assert.equal(signed.signature.length, 128);
49
+ const result = verifyBehavioralDriftWindow(signed);
50
+ assert.equal(result.valid, true, `expected valid, got reason=${result.reason}`);
51
+ assert.equal(isBehavioralDriftWindow(signed), true);
52
+ });
53
+ });
54
+ // ── 2. Third-party attestation round-trip ─────────────────────
55
+ describe('behavioral_drift_window: third-party attestation round-trip', () => {
56
+ it('observer_id !== subject_agent_id, three constituents across all three classes', () => {
57
+ const subject = generateKeyPair();
58
+ const observer = generateKeyPair();
59
+ const c1 = sha256Hex('attestation.precondition.1');
60
+ const c2 = sha256Hex('attestation.candidate.1');
61
+ const c3 = sha256Hex('attestation.decision.1');
62
+ const unsigned = makeUnsigned({
63
+ subject_agent_id: subject.publicKey,
64
+ observer_id: observer.publicKey,
65
+ constituent_attestations: [c1, c2, c3],
66
+ metrics: {
67
+ decision_count: 3,
68
+ class_distribution: { precondition_set: 1, candidate_set: 1, decision_path: 1 },
69
+ },
70
+ });
71
+ const signed = signBehavioralDriftWindow(observer.privateKey, unsigned);
72
+ assert.equal(signed.observer_id, observer.publicKey);
73
+ assert.notEqual(signed.observer_id, signed.subject_agent_id);
74
+ const result = verifyBehavioralDriftWindow(signed);
75
+ assert.equal(result.valid, true, `expected valid, got reason=${result.reason}`);
76
+ });
77
+ it('round-trip with baseline_ref + divergence_score paired', () => {
78
+ const subject = generateKeyPair();
79
+ const observer = generateKeyPair();
80
+ const unsigned = makeUnsigned({
81
+ subject_agent_id: subject.publicKey,
82
+ observer_id: observer.publicKey,
83
+ metrics: {
84
+ decision_count: 0,
85
+ class_distribution: { precondition_set: 0, candidate_set: 0, decision_path: 0 },
86
+ baseline_ref: sha256Hex('baseline.window.q1'),
87
+ divergence_score: 0.42,
88
+ },
89
+ });
90
+ const signed = signBehavioralDriftWindow(observer.privateKey, unsigned);
91
+ const result = verifyBehavioralDriftWindow(signed);
92
+ assert.equal(result.valid, true, `expected valid, got reason=${result.reason}`);
93
+ });
94
+ });
95
+ // ── 3. Empty window ───────────────────────────────────────────
96
+ describe('behavioral_drift_window: empty window', () => {
97
+ it('decision_count=0 with empty constituents and zero class_distribution is valid (records absence)', () => {
98
+ const kp = generateKeyPair();
99
+ const unsigned = makeUnsigned({
100
+ subject_agent_id: kp.publicKey,
101
+ observer_id: kp.publicKey,
102
+ });
103
+ const signed = signBehavioralDriftWindow(kp.privateKey, unsigned);
104
+ const result = verifyBehavioralDriftWindow(signed);
105
+ assert.equal(result.valid, true, `expected valid, got reason=${result.reason}`);
106
+ });
107
+ });
108
+ // ── 4. Window backwards ───────────────────────────────────────
109
+ describe('behavioral_drift_window: window ordering', () => {
110
+ it('window_end < window_start returns WINDOW_INVALID', () => {
111
+ const kp = generateKeyPair();
112
+ const unsigned = makeUnsigned({
113
+ subject_agent_id: kp.publicKey,
114
+ observer_id: kp.publicKey,
115
+ window_start: WINDOW_END,
116
+ window_end: WINDOW_START,
117
+ });
118
+ const signed = signBehavioralDriftWindow(kp.privateKey, unsigned);
119
+ const result = verifyBehavioralDriftWindow(signed);
120
+ assert.equal(result.valid, false);
121
+ assert.equal(result.reason, 'WINDOW_INVALID');
122
+ });
123
+ it('window_end === window_start returns WINDOW_INVALID', () => {
124
+ const kp = generateKeyPair();
125
+ const unsigned = makeUnsigned({
126
+ subject_agent_id: kp.publicKey,
127
+ observer_id: kp.publicKey,
128
+ window_start: WINDOW_START,
129
+ window_end: WINDOW_START,
130
+ });
131
+ const signed = signBehavioralDriftWindow(kp.privateKey, unsigned);
132
+ const result = verifyBehavioralDriftWindow(signed);
133
+ assert.equal(result.valid, false);
134
+ assert.equal(result.reason, 'WINDOW_INVALID');
135
+ });
136
+ });
137
+ // ── 5. Metrics drift ──────────────────────────────────────────
138
+ describe('behavioral_drift_window: metrics consistency', () => {
139
+ it('decision_count=3 but class_distribution sums to 4 returns METRICS_INCONSISTENT', () => {
140
+ const kp = generateKeyPair();
141
+ const hashes = [sha256Hex('a'), sha256Hex('b'), sha256Hex('c')];
142
+ const unsigned = makeUnsigned({
143
+ subject_agent_id: kp.publicKey,
144
+ observer_id: kp.publicKey,
145
+ constituent_attestations: hashes,
146
+ metrics: {
147
+ decision_count: 3,
148
+ class_distribution: { precondition_set: 2, candidate_set: 1, decision_path: 1 },
149
+ },
150
+ });
151
+ const signed = signBehavioralDriftWindow(kp.privateKey, unsigned);
152
+ const result = verifyBehavioralDriftWindow(signed);
153
+ assert.equal(result.valid, false);
154
+ assert.equal(result.reason, 'METRICS_INCONSISTENT');
155
+ });
156
+ it('decision_count !== constituent_attestations.length returns METRICS_INCONSISTENT', () => {
157
+ const kp = generateKeyPair();
158
+ const hashes = [sha256Hex('a'), sha256Hex('b')];
159
+ const unsigned = makeUnsigned({
160
+ subject_agent_id: kp.publicKey,
161
+ observer_id: kp.publicKey,
162
+ constituent_attestations: hashes,
163
+ metrics: {
164
+ decision_count: 3,
165
+ class_distribution: { precondition_set: 1, candidate_set: 1, decision_path: 1 },
166
+ },
167
+ });
168
+ const signed = signBehavioralDriftWindow(kp.privateKey, unsigned);
169
+ const result = verifyBehavioralDriftWindow(signed);
170
+ assert.equal(result.valid, false);
171
+ assert.equal(result.reason, 'METRICS_INCONSISTENT');
172
+ });
173
+ });
174
+ // ── 6. Constituent duplicate ─────────────────────────────────
175
+ describe('behavioral_drift_window: constituent uniqueness', () => {
176
+ it('two identical hashes in constituent_attestations returns CONSTITUENT_HASH_DUPLICATE', () => {
177
+ const kp = generateKeyPair();
178
+ const dup = sha256Hex('attestation.duplicate');
179
+ const unsigned = makeUnsigned({
180
+ subject_agent_id: kp.publicKey,
181
+ observer_id: kp.publicKey,
182
+ constituent_attestations: [dup, dup],
183
+ metrics: {
184
+ decision_count: 2,
185
+ class_distribution: { precondition_set: 0, candidate_set: 0, decision_path: 2 },
186
+ },
187
+ });
188
+ const signed = signBehavioralDriftWindow(kp.privateKey, unsigned);
189
+ const result = verifyBehavioralDriftWindow(signed);
190
+ assert.equal(result.valid, false);
191
+ assert.equal(result.reason, 'CONSTITUENT_HASH_DUPLICATE');
192
+ });
193
+ });
194
+ // ── 7. Tamper ────────────────────────────────────────────────
195
+ describe('behavioral_drift_window: tamper detection', () => {
196
+ it('mutating one byte in a constituent hash post-signing returns SIGNATURE_INVALID', () => {
197
+ const kp = generateKeyPair();
198
+ const c1 = sha256Hex('attestation.original.1');
199
+ const c2 = sha256Hex('attestation.original.2');
200
+ const unsigned = makeUnsigned({
201
+ subject_agent_id: kp.publicKey,
202
+ observer_id: kp.publicKey,
203
+ constituent_attestations: [c1, c2],
204
+ metrics: {
205
+ decision_count: 2,
206
+ class_distribution: { precondition_set: 0, candidate_set: 1, decision_path: 1 },
207
+ },
208
+ });
209
+ const signed = signBehavioralDriftWindow(kp.privateKey, unsigned);
210
+ const mutated = [...signed.constituent_attestations];
211
+ const lastChar = mutated[0].slice(-1);
212
+ const flipped = lastChar === '0' ? '1' : '0';
213
+ mutated[0] = mutated[0].slice(0, -1) + flipped;
214
+ const tampered = {
215
+ ...signed,
216
+ constituent_attestations: mutated,
217
+ };
218
+ const result = verifyBehavioralDriftWindow(tampered);
219
+ assert.equal(result.valid, false);
220
+ assert.equal(result.reason, 'SIGNATURE_INVALID');
221
+ });
222
+ });
223
+ // ── 8. Wrong-key ─────────────────────────────────────────────
224
+ describe('behavioral_drift_window: wrong-key detection', () => {
225
+ it('envelope signed with key A but claiming observer_id of key B returns SIGNATURE_INVALID', () => {
226
+ const subject = generateKeyPair();
227
+ const keyA = generateKeyPair();
228
+ const keyB = generateKeyPair();
229
+ const unsigned = makeUnsigned({
230
+ subject_agent_id: subject.publicKey,
231
+ observer_id: keyA.publicKey,
232
+ });
233
+ const signed = signBehavioralDriftWindow(keyA.privateKey, unsigned);
234
+ // Rewrite observer_id to B's public key without re-signing.
235
+ const lying = { ...signed, observer_id: keyB.publicKey };
236
+ const result = verifyBehavioralDriftWindow(lying);
237
+ assert.equal(result.valid, false);
238
+ assert.equal(result.reason, 'SIGNATURE_INVALID');
239
+ });
240
+ it('signBehavioralDriftWindow always overwrites observer_id to match the signing key', () => {
241
+ const subject = generateKeyPair();
242
+ const keyA = generateKeyPair();
243
+ const keyB = generateKeyPair();
244
+ // Caller hands in observer_id = B but signs with A. Helper overwrites to A.
245
+ const unsigned = makeUnsigned({
246
+ subject_agent_id: subject.publicKey,
247
+ observer_id: keyB.publicKey,
248
+ });
249
+ const signed = signBehavioralDriftWindow(keyA.privateKey, unsigned);
250
+ assert.equal(signed.observer_id, keyA.publicKey);
251
+ const result = verifyBehavioralDriftWindow(signed);
252
+ assert.equal(result.valid, true);
253
+ });
254
+ });
255
+ // ── 9. Canonicalization: constituent order matters ──────────
256
+ describe('behavioral_drift_window: canonicalization', () => {
257
+ it('reordering constituent hashes changes canonical bytes and invalidates the signature', () => {
258
+ const kp = generateKeyPair();
259
+ const c1 = sha256Hex('attestation.alpha');
260
+ const c2 = sha256Hex('attestation.beta');
261
+ const c3 = sha256Hex('attestation.gamma');
262
+ const unsigned = makeUnsigned({
263
+ subject_agent_id: kp.publicKey,
264
+ observer_id: kp.publicKey,
265
+ constituent_attestations: [c1, c2, c3],
266
+ metrics: {
267
+ decision_count: 3,
268
+ class_distribution: { precondition_set: 1, candidate_set: 1, decision_path: 1 },
269
+ },
270
+ });
271
+ const signed = signBehavioralDriftWindow(kp.privateKey, unsigned);
272
+ // Reorder without re-signing: JCS preserves array order, so the canonical
273
+ // bytes change and the signature should not verify.
274
+ const reordered = {
275
+ ...signed,
276
+ constituent_attestations: [c3, c2, c1],
277
+ };
278
+ const result = verifyBehavioralDriftWindow(reordered);
279
+ assert.equal(result.valid, false);
280
+ assert.equal(result.reason, 'SIGNATURE_INVALID');
281
+ });
282
+ });
283
+ // ── 10. Baseline pairing ─────────────────────────────────────
284
+ describe('behavioral_drift_window: baseline pairing', () => {
285
+ it('baseline_ref present without divergence_score returns BASELINE_PAIRING_INVALID', () => {
286
+ const kp = generateKeyPair();
287
+ const unsigned = makeUnsigned({
288
+ subject_agent_id: kp.publicKey,
289
+ observer_id: kp.publicKey,
290
+ metrics: {
291
+ decision_count: 0,
292
+ class_distribution: { precondition_set: 0, candidate_set: 0, decision_path: 0 },
293
+ baseline_ref: sha256Hex('baseline.window.lonely'),
294
+ },
295
+ });
296
+ const signed = signBehavioralDriftWindow(kp.privateKey, unsigned);
297
+ const result = verifyBehavioralDriftWindow(signed);
298
+ assert.equal(result.valid, false);
299
+ assert.equal(result.reason, 'BASELINE_PAIRING_INVALID');
300
+ });
301
+ it('divergence_score present without baseline_ref returns BASELINE_PAIRING_INVALID', () => {
302
+ const kp = generateKeyPair();
303
+ const unsigned = makeUnsigned({
304
+ subject_agent_id: kp.publicKey,
305
+ observer_id: kp.publicKey,
306
+ metrics: {
307
+ decision_count: 0,
308
+ class_distribution: { precondition_set: 0, candidate_set: 0, decision_path: 0 },
309
+ divergence_score: 0.17,
310
+ },
311
+ });
312
+ const signed = signBehavioralDriftWindow(kp.privateKey, unsigned);
313
+ const result = verifyBehavioralDriftWindow(signed);
314
+ assert.equal(result.valid, false);
315
+ assert.equal(result.reason, 'BASELINE_PAIRING_INVALID');
316
+ });
317
+ });
318
+ // ── 11. Confidence range ─────────────────────────────────────
319
+ describe('behavioral_drift_window: confidence range', () => {
320
+ it('confidence_mean = 1.5 returns CONFIDENCE_RANGE_INVALID', () => {
321
+ const kp = generateKeyPair();
322
+ const unsigned = makeUnsigned({
323
+ subject_agent_id: kp.publicKey,
324
+ observer_id: kp.publicKey,
325
+ metrics: {
326
+ decision_count: 0,
327
+ class_distribution: { precondition_set: 0, candidate_set: 0, decision_path: 0 },
328
+ confidence_mean: 1.5,
329
+ confidence_stddev: 0.1,
330
+ },
331
+ });
332
+ const signed = signBehavioralDriftWindow(kp.privateKey, unsigned);
333
+ const result = verifyBehavioralDriftWindow(signed);
334
+ assert.equal(result.valid, false);
335
+ assert.equal(result.reason, 'CONFIDENCE_RANGE_INVALID');
336
+ });
337
+ it('confidence_mean present without confidence_stddev returns CONFIDENCE_RANGE_INVALID', () => {
338
+ const kp = generateKeyPair();
339
+ const unsigned = makeUnsigned({
340
+ subject_agent_id: kp.publicKey,
341
+ observer_id: kp.publicKey,
342
+ metrics: {
343
+ decision_count: 0,
344
+ class_distribution: { precondition_set: 0, candidate_set: 0, decision_path: 0 },
345
+ confidence_mean: 0.5,
346
+ },
347
+ });
348
+ const signed = signBehavioralDriftWindow(kp.privateKey, unsigned);
349
+ const result = verifyBehavioralDriftWindow(signed);
350
+ assert.equal(result.valid, false);
351
+ assert.equal(result.reason, 'CONFIDENCE_RANGE_INVALID');
352
+ });
353
+ it('confidence_stddev negative returns CONFIDENCE_RANGE_INVALID', () => {
354
+ const kp = generateKeyPair();
355
+ const unsigned = makeUnsigned({
356
+ subject_agent_id: kp.publicKey,
357
+ observer_id: kp.publicKey,
358
+ metrics: {
359
+ decision_count: 0,
360
+ class_distribution: { precondition_set: 0, candidate_set: 0, decision_path: 0 },
361
+ confidence_mean: 0.5,
362
+ confidence_stddev: -0.1,
363
+ },
364
+ });
365
+ const signed = signBehavioralDriftWindow(kp.privateKey, unsigned);
366
+ const result = verifyBehavioralDriftWindow(signed);
367
+ assert.equal(result.valid, false);
368
+ assert.equal(result.reason, 'CONFIDENCE_RANGE_INVALID');
369
+ });
370
+ });
371
+ // ── 12. Shape failures ───────────────────────────────────────
372
+ describe('behavioral_drift_window: shape failures', () => {
373
+ it('missing metrics field returns SHAPE_INVALID', () => {
374
+ const kp = generateKeyPair();
375
+ const unsigned = makeUnsigned({
376
+ subject_agent_id: kp.publicKey,
377
+ observer_id: kp.publicKey,
378
+ });
379
+ const signed = signBehavioralDriftWindow(kp.privateKey, unsigned);
380
+ const noMetrics = { ...signed };
381
+ delete noMetrics.metrics;
382
+ const result = verifyBehavioralDriftWindow(noMetrics);
383
+ assert.equal(result.valid, false);
384
+ assert.equal(result.reason, 'SHAPE_INVALID');
385
+ });
386
+ it('null envelope returns SHAPE_INVALID', () => {
387
+ assert.deepEqual(verifyBehavioralDriftWindow(null), { valid: false, reason: 'SHAPE_INVALID' });
388
+ });
389
+ it('wrong signal_type returns SHAPE_INVALID', () => {
390
+ const kp = generateKeyPair();
391
+ const signed = signBehavioralDriftWindow(kp.privateKey, makeUnsigned({
392
+ subject_agent_id: kp.publicKey,
393
+ observer_id: kp.publicKey,
394
+ }));
395
+ const result = verifyBehavioralDriftWindow({ ...signed, signal_type: 'cognitive_attestation' });
396
+ assert.equal(result.valid, false);
397
+ assert.equal(result.reason, 'SHAPE_INVALID');
398
+ });
399
+ it('malformed observer_id returns OBSERVER_ID_INVALID_FORMAT', () => {
400
+ const kp = generateKeyPair();
401
+ const signed = signBehavioralDriftWindow(kp.privateKey, makeUnsigned({
402
+ subject_agent_id: kp.publicKey,
403
+ observer_id: kp.publicKey,
404
+ }));
405
+ const result = verifyBehavioralDriftWindow({ ...signed, observer_id: 'XYZ' });
406
+ assert.equal(result.valid, false);
407
+ assert.equal(result.reason, 'OBSERVER_ID_INVALID_FORMAT');
408
+ });
409
+ it('malformed subject_agent_id returns SUBJECT_AGENT_ID_INVALID_FORMAT', () => {
410
+ const kp = generateKeyPair();
411
+ const signed = signBehavioralDriftWindow(kp.privateKey, makeUnsigned({
412
+ subject_agent_id: kp.publicKey,
413
+ observer_id: kp.publicKey,
414
+ }));
415
+ const result = verifyBehavioralDriftWindow({ ...signed, subject_agent_id: 'XYZ' });
416
+ assert.equal(result.valid, false);
417
+ assert.equal(result.reason, 'SUBJECT_AGENT_ID_INVALID_FORMAT');
418
+ });
419
+ it('unparseable ISO 8601 timestamp returns TIMESTAMP_FORMAT_INVALID', () => {
420
+ const kp = generateKeyPair();
421
+ const unsigned = makeUnsigned({
422
+ subject_agent_id: kp.publicKey,
423
+ observer_id: kp.publicKey,
424
+ window_start: 'not-a-date',
425
+ });
426
+ const signed = signBehavioralDriftWindow(kp.privateKey, unsigned);
427
+ const result = verifyBehavioralDriftWindow(signed);
428
+ assert.equal(result.valid, false);
429
+ assert.equal(result.reason, 'TIMESTAMP_FORMAT_INVALID');
430
+ });
431
+ });
432
+ // ── isBehavioralDriftWindow type guard ────────────────────
433
+ describe('behavioral_drift_window: isBehavioralDriftWindow', () => {
434
+ it('accepts a freshly signed envelope', () => {
435
+ const kp = generateKeyPair();
436
+ const signed = signBehavioralDriftWindow(kp.privateKey, makeUnsigned({
437
+ subject_agent_id: kp.publicKey,
438
+ observer_id: kp.publicKey,
439
+ }));
440
+ assert.equal(isBehavioralDriftWindow(signed), true);
441
+ });
442
+ it('rejects non-object inputs and wrong signal_type', () => {
443
+ assert.equal(isBehavioralDriftWindow(null), false);
444
+ assert.equal(isBehavioralDriftWindow('string'), false);
445
+ assert.equal(isBehavioralDriftWindow({}), false);
446
+ assert.equal(isBehavioralDriftWindow({ signal_type: 'cognitive_attestation' }), false);
447
+ });
448
+ });
449
+ //# sourceMappingURL=behavioral_drift_window.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"behavioral_drift_window.test.js","sourceRoot":"","sources":["../../../../../src/v2/behavioral_drift_window/__tests__/behavioral_drift_window.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import type { BehavioralDriftWindowEnvelope, UnsignedBehavioralDriftWindowEnvelope } from './types.js';
2
+ /**
3
+ * Canonicalize an envelope for signing. The signature field is set to the
4
+ * empty string before serialization so that signing and verification
5
+ * agree on the bytes-under-signature without either side rebuilding the
6
+ * envelope from a partial shape.
7
+ */
8
+ export declare function canonicalizeForSignature(envelope: UnsignedBehavioralDriftWindowEnvelope | BehavioralDriftWindowEnvelope): string;
9
+ /**
10
+ * Sign an unsigned envelope with the observer's Ed25519 private key
11
+ * (hex). Derives the public key from the private key and writes it into
12
+ * `observer_id` on the returned envelope; this guarantees that the
13
+ * embedded `observer_id` matches the signing key, which the verifier
14
+ * checks against.
15
+ *
16
+ * If the caller provides their own `observer_id` on the input, this
17
+ * helper still derives the public key from the private key and
18
+ * overwrites the field, because a divergence between the embedded
19
+ * observer_id and the signing key is always a bug. The `subject_agent_id`
20
+ * field is passed through unchanged; for self-attestation, the caller
21
+ * sets subject_agent_id to the same value as the derived observer_id.
22
+ */
23
+ export declare function signBehavioralDriftWindow(privateKeyHex: string, unsigned: UnsignedBehavioralDriftWindowEnvelope): BehavioralDriftWindowEnvelope;
24
+ //# sourceMappingURL=envelope.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"envelope.d.ts","sourceRoot":"","sources":["../../../../src/v2/behavioral_drift_window/envelope.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EACV,6BAA6B,EAC7B,qCAAqC,EACtC,MAAM,YAAY,CAAA;AAEnB;;;;;GAKG;AACH,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,qCAAqC,GAAG,6BAA6B,GAC9E,MAAM,CAGR;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,yBAAyB,CACvC,aAAa,EAAE,MAAM,EACrB,QAAQ,EAAE,qCAAqC,GAC9C,6BAA6B,CAM/B"}
@@ -0,0 +1,49 @@
1
+ // Copyright 2024-2026 Tymofii Pidlisnyi. Apache-2.0 license. See LICENSE.
2
+ // ══════════════════════════════════════════════════════════════════
3
+ // behavioral_drift_window signal_type (v0.1): envelope helpers
4
+ // ══════════════════════════════════════════════════════════════════
5
+ // Signs the JCS-canonical form of the envelope with the signature field
6
+ // emptied, then attaches the resulting signature. Mirrors the pattern
7
+ // used by v2/cognitive_attestation and v2/payment-rails: canonical form
8
+ // is the source of truth, the wire object is the canonical bytes plus
9
+ // signature.
10
+ //
11
+ // The signer is the observer (observer_id). subject_agent_id is the
12
+ // agent whose behavior is being summarized and is signature-irrelevant
13
+ // from a key-verification standpoint; the verifier checks the signature
14
+ // against observer_id. For self-attestation the two coincide.
15
+ // ══════════════════════════════════════════════════════════════════
16
+ import { canonicalizeJCS } from '../../core/canonical-jcs.js';
17
+ import { sign, publicKeyFromPrivate } from '../../crypto/keys.js';
18
+ /**
19
+ * Canonicalize an envelope for signing. The signature field is set to the
20
+ * empty string before serialization so that signing and verification
21
+ * agree on the bytes-under-signature without either side rebuilding the
22
+ * envelope from a partial shape.
23
+ */
24
+ export function canonicalizeForSignature(envelope) {
25
+ const draft = { ...envelope, signature: '' };
26
+ return canonicalizeJCS(draft);
27
+ }
28
+ /**
29
+ * Sign an unsigned envelope with the observer's Ed25519 private key
30
+ * (hex). Derives the public key from the private key and writes it into
31
+ * `observer_id` on the returned envelope; this guarantees that the
32
+ * embedded `observer_id` matches the signing key, which the verifier
33
+ * checks against.
34
+ *
35
+ * If the caller provides their own `observer_id` on the input, this
36
+ * helper still derives the public key from the private key and
37
+ * overwrites the field, because a divergence between the embedded
38
+ * observer_id and the signing key is always a bug. The `subject_agent_id`
39
+ * field is passed through unchanged; for self-attestation, the caller
40
+ * sets subject_agent_id to the same value as the derived observer_id.
41
+ */
42
+ export function signBehavioralDriftWindow(privateKeyHex, unsigned) {
43
+ const observer_id = publicKeyFromPrivate(privateKeyHex);
44
+ const withDerivedKey = { ...unsigned, observer_id };
45
+ const bytes = canonicalizeForSignature(withDerivedKey);
46
+ const signature = sign(bytes, privateKeyHex);
47
+ return { ...withDerivedKey, signature };
48
+ }
49
+ //# sourceMappingURL=envelope.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"envelope.js","sourceRoot":"","sources":["../../../../src/v2/behavioral_drift_window/envelope.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,qEAAqE;AACrE,+DAA+D;AAC/D,qEAAqE;AACrE,wEAAwE;AACxE,sEAAsE;AACtE,wEAAwE;AACxE,sEAAsE;AACtE,aAAa;AACb,EAAE;AACF,oEAAoE;AACpE,uEAAuE;AACvE,wEAAwE;AACxE,8DAA8D;AAC9D,qEAAqE;AAErE,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAA;AAC7D,OAAO,EAAE,IAAI,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAA;AAOjE;;;;;GAKG;AACH,MAAM,UAAU,wBAAwB,CACtC,QAA+E;IAE/E,MAAM,KAAK,GAAG,EAAE,GAAG,QAAQ,EAAE,SAAS,EAAE,EAAE,EAAE,CAAA;IAC5C,OAAO,eAAe,CAAC,KAAK,CAAC,CAAA;AAC/B,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,yBAAyB,CACvC,aAAqB,EACrB,QAA+C;IAE/C,MAAM,WAAW,GAAG,oBAAoB,CAAC,aAAa,CAAC,CAAA;IACvD,MAAM,cAAc,GAA0C,EAAE,GAAG,QAAQ,EAAE,WAAW,EAAE,CAAA;IAC1F,MAAM,KAAK,GAAG,wBAAwB,CAAC,cAAc,CAAC,CAAA;IACtD,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,EAAE,aAAa,CAAC,CAAA;IAC5C,OAAO,EAAE,GAAG,cAAc,EAAE,SAAS,EAAE,CAAA;AACzC,CAAC"}
@@ -0,0 +1,5 @@
1
+ export { signBehavioralDriftWindow, canonicalizeForSignature } from './envelope.js';
2
+ export { verifyBehavioralDriftWindow } from './verify.js';
3
+ export { isBehavioralDriftWindow, isBehavioralDriftWindowMetrics, classDistributionSum, parseIso8601, } from './types.js';
4
+ export type { BehavioralDriftWindowSignalType, BehavioralDriftWindowEnvelope, UnsignedBehavioralDriftWindowEnvelope, BehavioralDriftWindowMetrics, ClassDistribution, BehavioralDriftWindowVerifyResult, BehavioralDriftWindowVerifyReason, } from './types.js';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/v2/behavioral_drift_window/index.ts"],"names":[],"mappings":"AA2BA,OAAO,EAAE,yBAAyB,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAA;AACnF,OAAO,EAAE,2BAA2B,EAAE,MAAM,aAAa,CAAA;AACzD,OAAO,EACL,uBAAuB,EACvB,8BAA8B,EAC9B,oBAAoB,EACpB,YAAY,GACb,MAAM,YAAY,CAAA;AAEnB,YAAY,EACV,+BAA+B,EAC/B,6BAA6B,EAC7B,qCAAqC,EACrC,4BAA4B,EAC5B,iBAAiB,EACjB,iCAAiC,EACjC,iCAAiC,GAClC,MAAM,YAAY,CAAA"}
@@ -0,0 +1,30 @@
1
+ // Copyright 2024-2026 Tymofii Pidlisnyi. Apache-2.0 license. See LICENSE.
2
+ // ══════════════════════════════════════════════════════════════════
3
+ // behavioral_drift_window signal_type (v0.1): public surface
4
+ // ══════════════════════════════════════════════════════════════════
5
+ // Matrix v2 candidate C-II-5 (Long-horizon attestation envelope drift
6
+ // detection). Aggregates references to N single-event behavioral
7
+ // attestation envelopes for the same subject agent across a declared
8
+ // time window and records longitudinal summary metrics. RECORDS
9
+ // evidence of drift; does NOT detect malicious drift (downstream
10
+ // consumer responsibility).
11
+ //
12
+ // Scope (v0.1):
13
+ // - Envelope construction, JCS canonicalization, Ed25519 signing,
14
+ // signature verification.
15
+ // - Structural and cross-field invariants on metrics, constituent
16
+ // hash uniqueness, window ordering, and optional-field pairing.
17
+ // - Runtime type guard.
18
+ //
19
+ // Out of scope (v0.2 or deferred):
20
+ // - Computing metrics from constituents inside the SDK.
21
+ // - Verifying constituent envelopes.
22
+ // - Drift threshold policy.
23
+ // - Time-series API or windowed aggregation tooling.
24
+ // - Multi-window composition or hierarchical drift envelopes.
25
+ // - Privacy posture for sensitive metric ranges.
26
+ // ══════════════════════════════════════════════════════════════════
27
+ export { signBehavioralDriftWindow, canonicalizeForSignature } from './envelope.js';
28
+ export { verifyBehavioralDriftWindow } from './verify.js';
29
+ export { isBehavioralDriftWindow, isBehavioralDriftWindowMetrics, classDistributionSum, parseIso8601, } from './types.js';
30
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/v2/behavioral_drift_window/index.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,qEAAqE;AACrE,6DAA6D;AAC7D,qEAAqE;AACrE,sEAAsE;AACtE,iEAAiE;AACjE,qEAAqE;AACrE,gEAAgE;AAChE,iEAAiE;AACjE,4BAA4B;AAC5B,EAAE;AACF,gBAAgB;AAChB,oEAAoE;AACpE,8BAA8B;AAC9B,oEAAoE;AACpE,oEAAoE;AACpE,0BAA0B;AAC1B,EAAE;AACF,mCAAmC;AACnC,0DAA0D;AAC1D,uCAAuC;AACvC,8BAA8B;AAC9B,uDAAuD;AACvD,gEAAgE;AAChE,mDAAmD;AACnD,qEAAqE;AAErE,OAAO,EAAE,yBAAyB,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAA;AACnF,OAAO,EAAE,2BAA2B,EAAE,MAAM,aAAa,CAAA;AACzD,OAAO,EACL,uBAAuB,EACvB,8BAA8B,EAC9B,oBAAoB,EACpB,YAAY,GACb,MAAM,YAAY,CAAA"}