@longarc/mdash 3.1.1 → 3.1.3
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/README.md +86 -23
- package/SECURITY.md +254 -0
- package/dist/accountability/engine.d.ts +27 -0
- package/dist/accountability/engine.d.ts.map +1 -0
- package/dist/accountability/engine.js +148 -0
- package/dist/accountability/engine.js.map +1 -0
- package/dist/accountability/types.d.ts +46 -0
- package/dist/accountability/types.d.ts.map +1 -0
- package/dist/accountability/types.js +8 -0
- package/dist/accountability/types.js.map +1 -0
- package/dist/checkpoint/engine.d.ts +2 -2
- package/dist/checkpoint/engine.d.ts.map +1 -1
- package/dist/checkpoint/engine.js +5 -1
- package/dist/checkpoint/engine.js.map +1 -1
- package/dist/context/compose.d.ts +62 -0
- package/dist/context/compose.d.ts.map +1 -0
- package/dist/context/compose.js +286 -0
- package/dist/context/compose.js.map +1 -0
- package/dist/context/crypto/hash.d.ts +100 -0
- package/dist/context/crypto/hash.d.ts.map +1 -0
- package/dist/context/crypto/hash.js +248 -0
- package/dist/context/crypto/hash.js.map +1 -0
- package/dist/context/crypto/hmac.d.ts +80 -0
- package/dist/context/crypto/hmac.d.ts.map +1 -0
- package/dist/context/crypto/hmac.js +192 -0
- package/dist/context/crypto/hmac.js.map +1 -0
- package/dist/context/crypto/index.d.ts +7 -0
- package/dist/context/crypto/index.d.ts.map +1 -0
- package/dist/context/crypto/index.js +7 -0
- package/dist/context/crypto/index.js.map +1 -0
- package/dist/context/engine-v3.0-backup.d.ts +197 -0
- package/dist/context/engine-v3.0-backup.d.ts.map +1 -0
- package/dist/context/engine-v3.0-backup.js +392 -0
- package/dist/context/engine-v3.0-backup.js.map +1 -0
- package/dist/context/engine.d.ts +2 -2
- package/dist/context/engine.d.ts.map +1 -1
- package/dist/context/engine.js +2 -2
- package/dist/context/engine.js.map +1 -1
- package/dist/context/fragment.d.ts +99 -0
- package/dist/context/fragment.d.ts.map +1 -0
- package/dist/context/fragment.js +316 -0
- package/dist/context/fragment.js.map +1 -0
- package/dist/context/index.d.ts +99 -0
- package/dist/context/index.d.ts.map +1 -0
- package/dist/context/index.js +180 -0
- package/dist/context/index.js.map +1 -0
- package/dist/context/provenance.d.ts +80 -0
- package/dist/context/provenance.d.ts.map +1 -0
- package/dist/context/provenance.js +294 -0
- package/dist/context/provenance.js.map +1 -0
- package/dist/context/resolve.d.ts +106 -0
- package/dist/context/resolve.d.ts.map +1 -0
- package/dist/context/resolve.js +440 -0
- package/dist/context/resolve.js.map +1 -0
- package/dist/context/store.d.ts +156 -0
- package/dist/context/store.d.ts.map +1 -0
- package/dist/context/store.js +396 -0
- package/dist/context/store.js.map +1 -0
- package/dist/context/types.d.ts +463 -0
- package/dist/context/types.d.ts.map +1 -0
- package/dist/context/types.js +94 -0
- package/dist/context/types.js.map +1 -0
- package/dist/context/utils/atomic.d.ts +76 -0
- package/dist/context/utils/atomic.d.ts.map +1 -0
- package/dist/context/utils/atomic.js +159 -0
- package/dist/context/utils/atomic.js.map +1 -0
- package/dist/context/utils/credit.d.ts +65 -0
- package/dist/context/utils/credit.d.ts.map +1 -0
- package/dist/context/utils/credit.js +164 -0
- package/dist/context/utils/credit.js.map +1 -0
- package/dist/context/utils/index.d.ts +13 -0
- package/dist/context/utils/index.d.ts.map +1 -0
- package/dist/context/utils/index.js +13 -0
- package/dist/context/utils/index.js.map +1 -0
- package/dist/context/utils/utility.d.ts +63 -0
- package/dist/context/utils/utility.d.ts.map +1 -0
- package/dist/context/utils/utility.js +141 -0
- package/dist/context/utils/utility.js.map +1 -0
- package/dist/core/commitment.d.ts +26 -3
- package/dist/core/commitment.d.ts.map +1 -1
- package/dist/core/commitment.js +45 -7
- package/dist/core/commitment.js.map +1 -1
- package/dist/core/crypto.d.ts +2 -0
- package/dist/core/crypto.d.ts.map +1 -1
- package/dist/core/crypto.js +12 -0
- package/dist/core/crypto.js.map +1 -1
- package/dist/index.d.ts +11 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +35 -10
- package/dist/index.js.map +1 -1
- package/dist/mcca/engine.d.ts.map +1 -1
- package/dist/mcca/engine.js +5 -4
- package/dist/mcca/engine.js.map +1 -1
- package/dist/physics/engine.d.ts +3 -2
- package/dist/physics/engine.d.ts.map +1 -1
- package/dist/physics/engine.js +37 -3
- package/dist/physics/engine.js.map +1 -1
- package/dist/provenance/api-handler.d.ts +45 -0
- package/dist/provenance/api-handler.d.ts.map +1 -0
- package/dist/provenance/api-handler.js +223 -0
- package/dist/provenance/api-handler.js.map +1 -0
- package/dist/provenance/api-types.d.ts +108 -0
- package/dist/provenance/api-types.d.ts.map +1 -0
- package/dist/provenance/api-types.js +9 -0
- package/dist/provenance/api-types.js.map +1 -0
- package/dist/provenance/index.d.ts +6 -0
- package/dist/provenance/index.d.ts.map +1 -0
- package/dist/provenance/index.js +3 -0
- package/dist/provenance/index.js.map +1 -0
- package/dist/provenance/provenance-engine.d.ts +63 -0
- package/dist/provenance/provenance-engine.d.ts.map +1 -0
- package/dist/provenance/provenance-engine.js +311 -0
- package/dist/provenance/provenance-engine.js.map +1 -0
- package/dist/provenance/types.d.ts +193 -0
- package/dist/provenance/types.d.ts.map +1 -0
- package/dist/provenance/types.js +9 -0
- package/dist/provenance/types.js.map +1 -0
- package/dist/tee/engine.d.ts.map +1 -1
- package/dist/tee/engine.js +14 -0
- package/dist/tee/engine.js.map +1 -1
- package/dist/warrant/engine.d.ts +24 -1
- package/dist/warrant/engine.d.ts.map +1 -1
- package/dist/warrant/engine.js +76 -1
- package/dist/warrant/engine.js.map +1 -1
- package/dist/zk/engine.d.ts.map +1 -1
- package/dist/zk/engine.js +7 -4
- package/dist/zk/engine.js.map +1 -1
- package/docs/SECURITY-PATCHES.md +170 -0
- package/package.json +17 -5
- package/src/__tests__/accountability.test.ts +308 -0
- package/src/__tests__/l1-verification-modes.test.ts +424 -0
- package/src/__tests__/phase1.benchmark.test.ts +94 -0
- package/src/__tests__/phase1.test.ts +0 -77
- package/src/__tests__/phase2-4.benchmark.test.ts +60 -0
- package/src/__tests__/phase2-4.test.ts +1 -52
- package/src/__tests__/provenance/api-handler.test.ts +356 -0
- package/src/__tests__/provenance/provenance-engine.test.ts +628 -0
- package/src/__tests__/sa-2026-008.test.ts +45 -0
- package/src/__tests__/sa-2026-009.test.ts +86 -0
- package/src/__tests__/sa-2026-010.test.ts +72 -0
- package/src/__tests__/sa-2026-012.test.ts +65 -0
- package/src/__tests__/sa-2026-nfc.test.ts +40 -0
- package/src/__tests__/security.test.ts +786 -0
- package/src/accountability/engine.ts +230 -0
- package/src/accountability/types.ts +58 -0
- package/src/checkpoint/engine.ts +6 -2
- package/src/context/__tests__/caret-v0.2.0.test.ts +860 -0
- package/src/context/__tests__/integration.test.ts +356 -0
- package/src/context/compose.ts +388 -0
- package/src/context/crypto/hash.ts +277 -0
- package/src/context/crypto/hmac.ts +253 -0
- package/src/context/crypto/index.ts +29 -0
- package/src/context/engine-v3.0-backup.ts +598 -0
- package/src/context/engine.ts +2 -2
- package/src/context/fragment.ts +454 -0
- package/src/context/index.ts +427 -0
- package/src/context/provenance.ts +380 -0
- package/src/context/resolve.ts +581 -0
- package/src/context/store.ts +503 -0
- package/src/context/types.ts +679 -0
- package/src/context/utils/atomic.ts +207 -0
- package/src/context/utils/credit.ts +224 -0
- package/src/context/utils/index.ts +13 -0
- package/src/context/utils/utility.ts +200 -0
- package/src/core/commitment.ts +130 -68
- package/src/core/crypto.ts +13 -0
- package/src/index.ts +62 -10
- package/src/mcca/engine.ts +5 -4
- package/src/physics/engine.ts +42 -5
- package/src/provenance/api-handler.ts +248 -0
- package/src/provenance/api-types.ts +112 -0
- package/src/provenance/index.ts +19 -0
- package/src/provenance/provenance-engine.ts +387 -0
- package/src/provenance/types.ts +211 -0
- package/src/tee/engine.ts +16 -0
- package/src/warrant/engine.ts +89 -1
- package/src/zk/engine.ts +8 -4
- package/tsconfig.json +1 -1
|
@@ -0,0 +1,356 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* mdash v3.1 - Context Module Integration Tests
|
|
3
|
+
* Validates the Caret → mdash merge
|
|
4
|
+
*
|
|
5
|
+
* @version 3.1.0
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { describe, it, expect, beforeAll } from 'vitest';
|
|
9
|
+
|
|
10
|
+
// These imports validate the merge structure
|
|
11
|
+
import type {
|
|
12
|
+
ContextFragment,
|
|
13
|
+
InfluenceBudget,
|
|
14
|
+
InfluenceConstraint,
|
|
15
|
+
Manifold,
|
|
16
|
+
Outcome,
|
|
17
|
+
Hash,
|
|
18
|
+
FragmentId,
|
|
19
|
+
Seal,
|
|
20
|
+
Timestamp,
|
|
21
|
+
Attribution,
|
|
22
|
+
MdashActionCode,
|
|
23
|
+
} from '../types.js';
|
|
24
|
+
|
|
25
|
+
import {
|
|
26
|
+
isHash,
|
|
27
|
+
isFragmentId,
|
|
28
|
+
isTimestamp,
|
|
29
|
+
isTrustLevel,
|
|
30
|
+
isTokenCount,
|
|
31
|
+
isContextFragment,
|
|
32
|
+
isValidInfluenceBudget,
|
|
33
|
+
sumInfluence,
|
|
34
|
+
isMdashActionCode,
|
|
35
|
+
DEFAULT_TRUST_LEVELS,
|
|
36
|
+
DEFAULT_MCCA_BUDGET,
|
|
37
|
+
} from '../types.js';
|
|
38
|
+
|
|
39
|
+
import {
|
|
40
|
+
maxAge,
|
|
41
|
+
notBefore,
|
|
42
|
+
notAfter,
|
|
43
|
+
allowDomains,
|
|
44
|
+
requireTrust,
|
|
45
|
+
requireSignature,
|
|
46
|
+
requireInfluence,
|
|
47
|
+
requireMCCA,
|
|
48
|
+
VERSION,
|
|
49
|
+
FORMERLY,
|
|
50
|
+
} from '../index.js';
|
|
51
|
+
|
|
52
|
+
describe('Context Module Integration', () => {
|
|
53
|
+
|
|
54
|
+
describe('Version Info', () => {
|
|
55
|
+
it('exports correct version', () => {
|
|
56
|
+
expect(VERSION).toBe('3.1.0');
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
it('acknowledges Caret heritage', () => {
|
|
60
|
+
expect(FORMERLY).toBe('Caret v0.2.0');
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
describe('Type Guards', () => {
|
|
65
|
+
it('validates Hash format', () => {
|
|
66
|
+
const validHash = 'a'.repeat(64);
|
|
67
|
+
const invalidHash = 'short';
|
|
68
|
+
|
|
69
|
+
expect(isHash(validHash)).toBe(true);
|
|
70
|
+
expect(isHash(invalidHash)).toBe(false);
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
it('validates FragmentId format (UUID v4)', () => {
|
|
74
|
+
const validId = '123e4567-e89b-4d3c-8456-426614174000';
|
|
75
|
+
const invalidId = 'not-a-uuid';
|
|
76
|
+
|
|
77
|
+
expect(isFragmentId(validId)).toBe(true);
|
|
78
|
+
expect(isFragmentId(invalidId)).toBe(false);
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
it('validates Timestamp format (ISO-8601)', () => {
|
|
82
|
+
const validTs = '2026-01-28T12:00:00.000Z';
|
|
83
|
+
const invalidTs = 'not-a-date';
|
|
84
|
+
|
|
85
|
+
expect(isTimestamp(validTs)).toBe(true);
|
|
86
|
+
expect(isTimestamp(invalidTs)).toBe(false);
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
it('validates TrustLevel range (0-100)', () => {
|
|
90
|
+
expect(isTrustLevel(50)).toBe(true);
|
|
91
|
+
expect(isTrustLevel(0)).toBe(true);
|
|
92
|
+
expect(isTrustLevel(100)).toBe(true);
|
|
93
|
+
expect(isTrustLevel(-1)).toBe(false);
|
|
94
|
+
expect(isTrustLevel(101)).toBe(false);
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
it('validates MdashActionCode', () => {
|
|
98
|
+
expect(isMdashActionCode('INVOKE')).toBe(true);
|
|
99
|
+
expect(isMdashActionCode('APPROVE')).toBe(true);
|
|
100
|
+
expect(isMdashActionCode('ATTEST')).toBe(true);
|
|
101
|
+
expect(isMdashActionCode('REVOKE')).toBe(true);
|
|
102
|
+
expect(isMdashActionCode('CHECKPOINT')).toBe(true);
|
|
103
|
+
expect(isMdashActionCode('ESCALATE')).toBe(true);
|
|
104
|
+
expect(isMdashActionCode('TERMINATE')).toBe(true);
|
|
105
|
+
expect(isMdashActionCode('INVALID')).toBe(false);
|
|
106
|
+
});
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
describe('MCCA Influence Budget', () => {
|
|
110
|
+
it('exports default MCCA budget', () => {
|
|
111
|
+
expect(DEFAULT_MCCA_BUDGET).toEqual({
|
|
112
|
+
system: 0.45,
|
|
113
|
+
user: 0.30,
|
|
114
|
+
environment: 0.15,
|
|
115
|
+
assistant: 0.10,
|
|
116
|
+
});
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
it('validates compliant budget', () => {
|
|
120
|
+
const compliant: InfluenceBudget = {
|
|
121
|
+
system: 0.45,
|
|
122
|
+
user: 0.30,
|
|
123
|
+
environment: 0.15,
|
|
124
|
+
assistant: 0.10,
|
|
125
|
+
};
|
|
126
|
+
|
|
127
|
+
expect(isValidInfluenceBudget(compliant)).toBe(true);
|
|
128
|
+
expect(sumInfluence(compliant)).toBeCloseTo(1.0);
|
|
129
|
+
});
|
|
130
|
+
|
|
131
|
+
it('rejects non-compliant budget (system too low)', () => {
|
|
132
|
+
const nonCompliant: InfluenceBudget = {
|
|
133
|
+
system: 0.30, // Below 0.40 minimum
|
|
134
|
+
user: 0.40,
|
|
135
|
+
environment: 0.20,
|
|
136
|
+
assistant: 0.10,
|
|
137
|
+
};
|
|
138
|
+
|
|
139
|
+
expect(isValidInfluenceBudget(nonCompliant)).toBe(false);
|
|
140
|
+
});
|
|
141
|
+
|
|
142
|
+
it('rejects non-compliant budget (user too high)', () => {
|
|
143
|
+
const nonCompliant: InfluenceBudget = {
|
|
144
|
+
system: 0.40,
|
|
145
|
+
user: 0.40, // Above 0.35 maximum
|
|
146
|
+
environment: 0.10,
|
|
147
|
+
assistant: 0.10,
|
|
148
|
+
};
|
|
149
|
+
|
|
150
|
+
expect(isValidInfluenceBudget(nonCompliant)).toBe(false);
|
|
151
|
+
});
|
|
152
|
+
|
|
153
|
+
it('rejects non-compliant budget (does not sum to 1.0)', () => {
|
|
154
|
+
const nonCompliant: InfluenceBudget = {
|
|
155
|
+
system: 0.50,
|
|
156
|
+
user: 0.30,
|
|
157
|
+
environment: 0.15,
|
|
158
|
+
assistant: 0.10,
|
|
159
|
+
};
|
|
160
|
+
|
|
161
|
+
expect(sumInfluence(nonCompliant)).toBeCloseTo(1.05);
|
|
162
|
+
expect(isValidInfluenceBudget(nonCompliant)).toBe(false);
|
|
163
|
+
});
|
|
164
|
+
});
|
|
165
|
+
|
|
166
|
+
describe('Constraint Builders', () => {
|
|
167
|
+
it('builds maxAge constraint', () => {
|
|
168
|
+
const constraint = maxAge(3600000);
|
|
169
|
+
|
|
170
|
+
expect(constraint.kind).toBe('time');
|
|
171
|
+
expect(constraint.max_age_ms).toBe(3600000);
|
|
172
|
+
});
|
|
173
|
+
|
|
174
|
+
it('builds notBefore constraint', () => {
|
|
175
|
+
const ts = '2026-01-28T00:00:00.000Z';
|
|
176
|
+
const constraint = notBefore(ts);
|
|
177
|
+
|
|
178
|
+
expect(constraint.kind).toBe('time');
|
|
179
|
+
expect(constraint.not_before).toBe(ts);
|
|
180
|
+
});
|
|
181
|
+
|
|
182
|
+
it('builds notAfter constraint', () => {
|
|
183
|
+
const ts = '2026-12-31T23:59:59.999Z';
|
|
184
|
+
const constraint = notAfter(ts);
|
|
185
|
+
|
|
186
|
+
expect(constraint.kind).toBe('time');
|
|
187
|
+
expect(constraint.not_after).toBe(ts);
|
|
188
|
+
});
|
|
189
|
+
|
|
190
|
+
it('builds allowDomains constraint', () => {
|
|
191
|
+
const constraint = allowDomains('mdash.sh', 'longarcstudios.com');
|
|
192
|
+
|
|
193
|
+
expect(constraint.kind).toBe('scope');
|
|
194
|
+
expect(constraint.allowed_domains).toEqual(['mdash.sh', 'longarcstudios.com']);
|
|
195
|
+
});
|
|
196
|
+
|
|
197
|
+
it('builds requireTrust constraint', () => {
|
|
198
|
+
const constraint = requireTrust(70);
|
|
199
|
+
|
|
200
|
+
expect(constraint.kind).toBe('trust');
|
|
201
|
+
expect(constraint.minimum_trust).toBe(70);
|
|
202
|
+
});
|
|
203
|
+
|
|
204
|
+
it('builds requireSignature constraint', () => {
|
|
205
|
+
const constraint = requireSignature(['signer1', 'signer2']);
|
|
206
|
+
|
|
207
|
+
expect(constraint.kind).toBe('signature');
|
|
208
|
+
expect(constraint.required).toBe(true);
|
|
209
|
+
expect(constraint.allowed_signers).toEqual(['signer1', 'signer2']);
|
|
210
|
+
});
|
|
211
|
+
|
|
212
|
+
it('builds requireInfluence constraint', () => {
|
|
213
|
+
const budget: InfluenceBudget = {
|
|
214
|
+
system: 0.45,
|
|
215
|
+
user: 0.30,
|
|
216
|
+
environment: 0.15,
|
|
217
|
+
assistant: 0.10,
|
|
218
|
+
};
|
|
219
|
+
const constraint = requireInfluence(budget, 'strict');
|
|
220
|
+
|
|
221
|
+
expect(constraint.kind).toBe('influence');
|
|
222
|
+
expect(constraint.budget).toEqual(budget);
|
|
223
|
+
expect(constraint.enforcement).toBe('strict');
|
|
224
|
+
});
|
|
225
|
+
|
|
226
|
+
it('builds requireMCCA constraint with defaults', () => {
|
|
227
|
+
const constraint = requireMCCA();
|
|
228
|
+
|
|
229
|
+
expect(constraint.kind).toBe('influence');
|
|
230
|
+
expect(constraint.budget.system).toBe(0.45);
|
|
231
|
+
expect(constraint.budget.user).toBe(0.30);
|
|
232
|
+
expect(constraint.budget.environment).toBe(0.15);
|
|
233
|
+
expect(constraint.budget.assistant).toBe(0.10);
|
|
234
|
+
expect(constraint.enforcement).toBe('strict');
|
|
235
|
+
});
|
|
236
|
+
|
|
237
|
+
it('builds requireMCCA constraint with overrides', () => {
|
|
238
|
+
const constraint = requireMCCA({ system: 0.50, user: 0.25 });
|
|
239
|
+
|
|
240
|
+
expect(constraint.budget.system).toBe(0.50);
|
|
241
|
+
expect(constraint.budget.user).toBe(0.25);
|
|
242
|
+
expect(constraint.budget.environment).toBe(0.15);
|
|
243
|
+
expect(constraint.budget.assistant).toBe(0.10);
|
|
244
|
+
});
|
|
245
|
+
});
|
|
246
|
+
|
|
247
|
+
describe('Trust Levels', () => {
|
|
248
|
+
it('exports default trust levels', () => {
|
|
249
|
+
expect(DEFAULT_TRUST_LEVELS.system).toBe(100);
|
|
250
|
+
expect(DEFAULT_TRUST_LEVELS.operator).toBe(90);
|
|
251
|
+
expect(DEFAULT_TRUST_LEVELS.user).toBe(70);
|
|
252
|
+
expect(DEFAULT_TRUST_LEVELS.derived).toBe(60);
|
|
253
|
+
expect(DEFAULT_TRUST_LEVELS.agent).toBe(50);
|
|
254
|
+
expect(DEFAULT_TRUST_LEVELS.external).toBe(30);
|
|
255
|
+
});
|
|
256
|
+
});
|
|
257
|
+
|
|
258
|
+
describe('ContextFragment Validation', () => {
|
|
259
|
+
it('validates complete fragment structure', () => {
|
|
260
|
+
const validFragment = {
|
|
261
|
+
id: '123e4567-e89b-4d3c-8456-426614174000',
|
|
262
|
+
hash: 'a'.repeat(64),
|
|
263
|
+
content: {
|
|
264
|
+
type: 'text',
|
|
265
|
+
data: 'Hello, world!',
|
|
266
|
+
token_count: 3,
|
|
267
|
+
},
|
|
268
|
+
provenance: {
|
|
269
|
+
source: 'test://example',
|
|
270
|
+
attribution: 'system',
|
|
271
|
+
trust_level: 100,
|
|
272
|
+
timestamp: '2026-01-28T12:00:00.000Z',
|
|
273
|
+
parent_hash: null,
|
|
274
|
+
},
|
|
275
|
+
sealed_at: '2026-01-28T12:00:00.000Z',
|
|
276
|
+
seal: 'seal-value',
|
|
277
|
+
constraints: [],
|
|
278
|
+
version: 'v3.1',
|
|
279
|
+
};
|
|
280
|
+
|
|
281
|
+
expect(isContextFragment(validFragment)).toBe(true);
|
|
282
|
+
});
|
|
283
|
+
|
|
284
|
+
it('rejects fragment with invalid hash', () => {
|
|
285
|
+
const invalidFragment = {
|
|
286
|
+
id: '123e4567-e89b-4d3c-8456-426614174000',
|
|
287
|
+
hash: 'short',
|
|
288
|
+
content: {},
|
|
289
|
+
provenance: {},
|
|
290
|
+
sealed_at: '2026-01-28T12:00:00.000Z',
|
|
291
|
+
seal: 'seal',
|
|
292
|
+
constraints: [],
|
|
293
|
+
version: 'v3.1',
|
|
294
|
+
};
|
|
295
|
+
|
|
296
|
+
expect(isContextFragment(invalidFragment)).toBe(false);
|
|
297
|
+
});
|
|
298
|
+
});
|
|
299
|
+
});
|
|
300
|
+
|
|
301
|
+
describe('Security Invariants', () => {
|
|
302
|
+
|
|
303
|
+
describe('INV-005: MCCA bounds are hard limits', () => {
|
|
304
|
+
it('system influence must be >= 0.40', () => {
|
|
305
|
+
const lowSystem: InfluenceBudget = {
|
|
306
|
+
system: 0.39,
|
|
307
|
+
user: 0.31,
|
|
308
|
+
environment: 0.20,
|
|
309
|
+
assistant: 0.10,
|
|
310
|
+
};
|
|
311
|
+
|
|
312
|
+
expect(isValidInfluenceBudget(lowSystem)).toBe(false);
|
|
313
|
+
});
|
|
314
|
+
|
|
315
|
+
it('user influence must be <= 0.35', () => {
|
|
316
|
+
const highUser: InfluenceBudget = {
|
|
317
|
+
system: 0.40,
|
|
318
|
+
user: 0.36,
|
|
319
|
+
environment: 0.14,
|
|
320
|
+
assistant: 0.10,
|
|
321
|
+
};
|
|
322
|
+
|
|
323
|
+
expect(isValidInfluenceBudget(highUser)).toBe(false);
|
|
324
|
+
});
|
|
325
|
+
|
|
326
|
+
it('environment influence must be <= 0.20', () => {
|
|
327
|
+
const highEnv: InfluenceBudget = {
|
|
328
|
+
system: 0.40,
|
|
329
|
+
user: 0.28,
|
|
330
|
+
environment: 0.22,
|
|
331
|
+
assistant: 0.10,
|
|
332
|
+
};
|
|
333
|
+
|
|
334
|
+
expect(isValidInfluenceBudget(highEnv)).toBe(false);
|
|
335
|
+
});
|
|
336
|
+
|
|
337
|
+
it('assistant influence must be <= 0.25', () => {
|
|
338
|
+
const highAst: InfluenceBudget = {
|
|
339
|
+
system: 0.40,
|
|
340
|
+
user: 0.23,
|
|
341
|
+
environment: 0.11,
|
|
342
|
+
assistant: 0.26,
|
|
343
|
+
};
|
|
344
|
+
|
|
345
|
+
expect(isValidInfluenceBudget(highAst)).toBe(false);
|
|
346
|
+
});
|
|
347
|
+
});
|
|
348
|
+
|
|
349
|
+
describe('INV-008: Tool outputs never become system context', () => {
|
|
350
|
+
it('tool attribution has lower trust than system', () => {
|
|
351
|
+
// In the unified model, tool maps to 'external' or environment influence
|
|
352
|
+
// External trust: 30, System trust: 100
|
|
353
|
+
expect(DEFAULT_TRUST_LEVELS.external).toBeLessThan(DEFAULT_TRUST_LEVELS.system);
|
|
354
|
+
});
|
|
355
|
+
});
|
|
356
|
+
});
|