@vorionsys/basis 1.0.1

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 (174) hide show
  1. package/.env.example +22 -0
  2. package/AMOY-MIGRATION.md +188 -0
  3. package/DEPLOY-AMOY.md +368 -0
  4. package/DEPLOY-NOW.md +216 -0
  5. package/DEPLOYMENT.md +239 -0
  6. package/GET-WALLET.md +286 -0
  7. package/QUICK-WALLET-SETUP.md +268 -0
  8. package/README.md +195 -0
  9. package/artifacts/@openzeppelin/contracts/access/AccessControl.sol/AccessControl.dbg.json +4 -0
  10. package/artifacts/@openzeppelin/contracts/access/AccessControl.sol/AccessControl.json +236 -0
  11. package/artifacts/@openzeppelin/contracts/access/IAccessControl.sol/IAccessControl.dbg.json +4 -0
  12. package/artifacts/@openzeppelin/contracts/access/IAccessControl.sol/IAccessControl.json +204 -0
  13. package/artifacts/@openzeppelin/contracts/interfaces/IERC4906.sol/IERC4906.dbg.json +4 -0
  14. package/artifacts/@openzeppelin/contracts/interfaces/IERC4906.sol/IERC4906.json +328 -0
  15. package/artifacts/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/IERC1155Errors.dbg.json +4 -0
  16. package/artifacts/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/IERC1155Errors.json +113 -0
  17. package/artifacts/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/IERC20Errors.dbg.json +4 -0
  18. package/artifacts/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/IERC20Errors.json +97 -0
  19. package/artifacts/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/IERC721Errors.dbg.json +4 -0
  20. package/artifacts/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/IERC721Errors.json +114 -0
  21. package/artifacts/@openzeppelin/contracts/token/ERC721/ERC721.sol/ERC721.dbg.json +4 -0
  22. package/artifacts/@openzeppelin/contracts/token/ERC721/ERC721.sol/ERC721.json +444 -0
  23. package/artifacts/@openzeppelin/contracts/token/ERC721/IERC721.sol/IERC721.dbg.json +4 -0
  24. package/artifacts/@openzeppelin/contracts/token/ERC721/IERC721.sol/IERC721.json +296 -0
  25. package/artifacts/@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol/IERC721Receiver.dbg.json +4 -0
  26. package/artifacts/@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol/IERC721Receiver.json +45 -0
  27. package/artifacts/@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol/ERC721Enumerable.dbg.json +4 -0
  28. package/artifacts/@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol/ERC721Enumerable.json +521 -0
  29. package/artifacts/@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol/ERC721URIStorage.dbg.json +4 -0
  30. package/artifacts/@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol/ERC721URIStorage.json +476 -0
  31. package/artifacts/@openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol/IERC721Enumerable.dbg.json +4 -0
  32. package/artifacts/@openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol/IERC721Enumerable.json +352 -0
  33. package/artifacts/@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol/IERC721Metadata.dbg.json +4 -0
  34. package/artifacts/@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol/IERC721Metadata.json +341 -0
  35. package/artifacts/@openzeppelin/contracts/token/ERC721/utils/ERC721Utils.sol/ERC721Utils.dbg.json +4 -0
  36. package/artifacts/@openzeppelin/contracts/token/ERC721/utils/ERC721Utils.sol/ERC721Utils.json +10 -0
  37. package/artifacts/@openzeppelin/contracts/utils/Context.sol/Context.dbg.json +4 -0
  38. package/artifacts/@openzeppelin/contracts/utils/Context.sol/Context.json +10 -0
  39. package/artifacts/@openzeppelin/contracts/utils/Panic.sol/Panic.dbg.json +4 -0
  40. package/artifacts/@openzeppelin/contracts/utils/Panic.sol/Panic.json +10 -0
  41. package/artifacts/@openzeppelin/contracts/utils/Strings.sol/Strings.dbg.json +4 -0
  42. package/artifacts/@openzeppelin/contracts/utils/Strings.sol/Strings.json +37 -0
  43. package/artifacts/@openzeppelin/contracts/utils/introspection/ERC165.sol/ERC165.dbg.json +4 -0
  44. package/artifacts/@openzeppelin/contracts/utils/introspection/ERC165.sol/ERC165.json +30 -0
  45. package/artifacts/@openzeppelin/contracts/utils/introspection/IERC165.sol/IERC165.dbg.json +4 -0
  46. package/artifacts/@openzeppelin/contracts/utils/introspection/IERC165.sol/IERC165.json +30 -0
  47. package/artifacts/@openzeppelin/contracts/utils/math/Math.sol/Math.dbg.json +4 -0
  48. package/artifacts/@openzeppelin/contracts/utils/math/Math.sol/Math.json +10 -0
  49. package/artifacts/@openzeppelin/contracts/utils/math/SafeCast.sol/SafeCast.dbg.json +4 -0
  50. package/artifacts/@openzeppelin/contracts/utils/math/SafeCast.sol/SafeCast.json +65 -0
  51. package/artifacts/@openzeppelin/contracts/utils/math/SignedMath.sol/SignedMath.dbg.json +4 -0
  52. package/artifacts/@openzeppelin/contracts/utils/math/SignedMath.sol/SignedMath.json +10 -0
  53. package/artifacts/build-info/357d1bba4062d461f497f221490811a3.json +1 -0
  54. package/artifacts/contracts/AgentCard.sol/AgentCard.dbg.json +4 -0
  55. package/artifacts/contracts/AgentCard.sol/AgentCard.json +1430 -0
  56. package/build_errors.txt +0 -0
  57. package/build_output.txt +0 -0
  58. package/cache/solidity-files-cache.json +885 -0
  59. package/contracts/AgentCard.sol +478 -0
  60. package/contracts/deploy/01-deploy-agentcard.ts +66 -0
  61. package/dist/index.d.ts.map +1 -0
  62. package/dist/index.js +12 -0
  63. package/dist/kya/accountability.d.ts.map +1 -0
  64. package/dist/kya/accountability.js +100 -0
  65. package/dist/kya/authorization.d.ts.map +1 -0
  66. package/dist/kya/authorization.js +258 -0
  67. package/dist/kya/behavior.d.ts.map +1 -0
  68. package/dist/kya/behavior.js +142 -0
  69. package/dist/kya/identity.d.ts.map +1 -0
  70. package/dist/kya/identity.js +187 -0
  71. package/dist/kya/index.d.ts.map +1 -0
  72. package/dist/kya/index.js +99 -0
  73. package/dist/kya/types.d.ts.map +1 -0
  74. package/dist/kya/types.js +5 -0
  75. package/dist/trust-1000-agents.test.d.ts.map +1 -0
  76. package/dist/trust-1000-agents.test.js +608 -0
  77. package/dist/trust-capabilities.d.ts.map +1 -0
  78. package/dist/trust-capabilities.js +478 -0
  79. package/dist/trust-factors.d.ts.map +1 -0
  80. package/dist/trust-factors.js +588 -0
  81. package/dist/trust-factors.test.d.ts.map +1 -0
  82. package/dist/trust-factors.test.js +179 -0
  83. package/dist/validation-gate.d.ts.map +1 -0
  84. package/dist/validation-gate.js +468 -0
  85. package/dist/validation-gate.test.d.ts.map +1 -0
  86. package/dist/validation-gate.test.js +419 -0
  87. package/hardhat.config.ts +55 -0
  88. package/package.json +57 -0
  89. package/scripts/certify-agent.ts +91 -0
  90. package/scripts/deploy-agentcard.ts +63 -0
  91. package/scripts/mint-agentcard.ts +87 -0
  92. package/specs/adversarial-sandbox-test-suite.md +1055 -0
  93. package/specs/kya-framework.md +910 -0
  94. package/specs/trust-factors-v2.md +437 -0
  95. package/src/index.ts +14 -0
  96. package/src/kya/accountability.ts +132 -0
  97. package/src/kya/authorization.ts +325 -0
  98. package/src/kya/behavior.ts +169 -0
  99. package/src/kya/identity.ts +224 -0
  100. package/src/kya/index.ts +125 -0
  101. package/src/kya/types.ts +242 -0
  102. package/src/trust-1000-agents.test.ts +745 -0
  103. package/src/trust-capabilities.ts +517 -0
  104. package/src/trust-factors.test.ts +241 -0
  105. package/src/trust-factors.ts +666 -0
  106. package/src/validation-gate.test.ts +531 -0
  107. package/src/validation-gate.ts +665 -0
  108. package/test-kya-simple.ts +258 -0
  109. package/test-kya.ts +245 -0
  110. package/tsconfig.json +14 -0
  111. package/typechain-types/@openzeppelin/contracts/access/AccessControl.ts +324 -0
  112. package/typechain-types/@openzeppelin/contracts/access/IAccessControl.ts +292 -0
  113. package/typechain-types/@openzeppelin/contracts/access/index.ts +5 -0
  114. package/typechain-types/@openzeppelin/contracts/index.ts +11 -0
  115. package/typechain-types/@openzeppelin/contracts/interfaces/IERC4906.ts +462 -0
  116. package/typechain-types/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/IERC1155Errors.ts +69 -0
  117. package/typechain-types/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/IERC20Errors.ts +69 -0
  118. package/typechain-types/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/IERC721Errors.ts +69 -0
  119. package/typechain-types/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/index.ts +6 -0
  120. package/typechain-types/@openzeppelin/contracts/interfaces/index.ts +6 -0
  121. package/typechain-types/@openzeppelin/contracts/token/ERC721/ERC721.ts +420 -0
  122. package/typechain-types/@openzeppelin/contracts/token/ERC721/IERC721.ts +393 -0
  123. package/typechain-types/@openzeppelin/contracts/token/ERC721/IERC721Receiver.ts +110 -0
  124. package/typechain-types/@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.ts +470 -0
  125. package/typechain-types/@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.ts +489 -0
  126. package/typechain-types/@openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.ts +443 -0
  127. package/typechain-types/@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.ts +420 -0
  128. package/typechain-types/@openzeppelin/contracts/token/ERC721/extensions/index.ts +7 -0
  129. package/typechain-types/@openzeppelin/contracts/token/ERC721/index.ts +8 -0
  130. package/typechain-types/@openzeppelin/contracts/token/index.ts +5 -0
  131. package/typechain-types/@openzeppelin/contracts/utils/Strings.ts +69 -0
  132. package/typechain-types/@openzeppelin/contracts/utils/index.ts +8 -0
  133. package/typechain-types/@openzeppelin/contracts/utils/introspection/ERC165.ts +94 -0
  134. package/typechain-types/@openzeppelin/contracts/utils/introspection/IERC165.ts +94 -0
  135. package/typechain-types/@openzeppelin/contracts/utils/introspection/index.ts +5 -0
  136. package/typechain-types/@openzeppelin/contracts/utils/math/SafeCast.ts +69 -0
  137. package/typechain-types/@openzeppelin/contracts/utils/math/index.ts +4 -0
  138. package/typechain-types/@openzeppelin/index.ts +5 -0
  139. package/typechain-types/common.ts +131 -0
  140. package/typechain-types/contracts/AgentCard.ts +1415 -0
  141. package/typechain-types/contracts/index.ts +4 -0
  142. package/typechain-types/factories/@openzeppelin/contracts/access/AccessControl__factory.ts +250 -0
  143. package/typechain-types/factories/@openzeppelin/contracts/access/IAccessControl__factory.ts +218 -0
  144. package/typechain-types/factories/@openzeppelin/contracts/access/index.ts +5 -0
  145. package/typechain-types/factories/@openzeppelin/contracts/index.ts +7 -0
  146. package/typechain-types/factories/@openzeppelin/contracts/interfaces/IERC4906__factory.ts +339 -0
  147. package/typechain-types/factories/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/IERC1155Errors__factory.ts +127 -0
  148. package/typechain-types/factories/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/IERC20Errors__factory.ts +111 -0
  149. package/typechain-types/factories/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/IERC721Errors__factory.ts +128 -0
  150. package/typechain-types/factories/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/index.ts +6 -0
  151. package/typechain-types/factories/@openzeppelin/contracts/interfaces/index.ts +5 -0
  152. package/typechain-types/factories/@openzeppelin/contracts/token/ERC721/ERC721__factory.ts +455 -0
  153. package/typechain-types/factories/@openzeppelin/contracts/token/ERC721/IERC721Receiver__factory.ts +59 -0
  154. package/typechain-types/factories/@openzeppelin/contracts/token/ERC721/IERC721__factory.ts +307 -0
  155. package/typechain-types/factories/@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable__factory.ts +535 -0
  156. package/typechain-types/factories/@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage__factory.ts +490 -0
  157. package/typechain-types/factories/@openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable__factory.ts +366 -0
  158. package/typechain-types/factories/@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata__factory.ts +355 -0
  159. package/typechain-types/factories/@openzeppelin/contracts/token/ERC721/extensions/index.ts +7 -0
  160. package/typechain-types/factories/@openzeppelin/contracts/token/ERC721/index.ts +7 -0
  161. package/typechain-types/factories/@openzeppelin/contracts/token/index.ts +4 -0
  162. package/typechain-types/factories/@openzeppelin/contracts/utils/Strings__factory.ts +90 -0
  163. package/typechain-types/factories/@openzeppelin/contracts/utils/index.ts +6 -0
  164. package/typechain-types/factories/@openzeppelin/contracts/utils/introspection/ERC165__factory.ts +41 -0
  165. package/typechain-types/factories/@openzeppelin/contracts/utils/introspection/IERC165__factory.ts +41 -0
  166. package/typechain-types/factories/@openzeppelin/contracts/utils/introspection/index.ts +5 -0
  167. package/typechain-types/factories/@openzeppelin/contracts/utils/math/SafeCast__factory.ts +118 -0
  168. package/typechain-types/factories/@openzeppelin/contracts/utils/math/index.ts +4 -0
  169. package/typechain-types/factories/@openzeppelin/index.ts +4 -0
  170. package/typechain-types/factories/contracts/AgentCard__factory.ts +1480 -0
  171. package/typechain-types/factories/contracts/index.ts +4 -0
  172. package/typechain-types/factories/index.ts +5 -0
  173. package/typechain-types/index.ts +44 -0
  174. package/vitest.config.ts +8 -0
@@ -0,0 +1,241 @@
1
+ /**
2
+ * Trust Factors Test Suite
3
+ *
4
+ * Tests 100 simulated agents through the trust scoring system
5
+ * to validate tier placement is correct.
6
+ */
7
+
8
+ import {
9
+ TrustTier,
10
+ TIER_THRESHOLDS,
11
+ getTrustTierFromScore,
12
+ getTierName,
13
+ calculateTrustScore,
14
+ getFactorThresholdsForTier,
15
+ getCriticalFactorsForTier,
16
+ FactorScore,
17
+ } from './trust-factors';
18
+
19
+ // All 23 factor codes
20
+ const ALL_FACTOR_CODES = [
21
+ 'CT-COMP', 'CT-REL', 'CT-OBS', 'CT-TRANS', 'CT-ACCT', 'CT-SAFE',
22
+ 'CT-SEC', 'CT-PRIV', 'CT-ID', 'OP-HUMAN', 'OP-ALIGN', 'OP-STEW',
23
+ 'SF-HUM', 'SF-ADAPT', 'SF-LEARN', 'LC-UNCERT', 'LC-HANDOFF',
24
+ 'LC-EMPHUM', 'LC-CAUSAL', 'LC-PATIENT', 'LC-EMP', 'LC-MORAL', 'LC-TRACK'
25
+ ];
26
+
27
+ interface TestAgent {
28
+ id: string;
29
+ targetTier: TrustTier;
30
+ factorScores: FactorScore[];
31
+ expectedScoreRange: { min: number; max: number };
32
+ }
33
+
34
+ // Generate agent with scores targeting a specific score range
35
+ function generateAgentForScoreRange(agentId: string, targetTier: TrustTier): TestAgent {
36
+ const tierRange = TIER_THRESHOLDS[targetTier];
37
+
38
+ // Target the middle of the tier's score range
39
+ const targetScore = (tierRange.min + tierRange.max) / 2 / 1000; // Convert to 0-1 scale
40
+
41
+ // Generate uniform scores around the target
42
+ const factorScores: FactorScore[] = ALL_FACTOR_CODES.map(code => {
43
+ // Add some variance but stay near target
44
+ const variance = (Math.random() - 0.5) * 0.1;
45
+ const score = Math.min(1.0, Math.max(0, targetScore + variance));
46
+
47
+ return {
48
+ code: code as any,
49
+ score,
50
+ timestamp: new Date(),
51
+ source: 'measured' as const,
52
+ confidence: 0.9,
53
+ };
54
+ });
55
+
56
+ return {
57
+ id: agentId,
58
+ targetTier,
59
+ factorScores,
60
+ expectedScoreRange: tierRange,
61
+ };
62
+ }
63
+
64
+ // Generate edge case agent at boundary of tier
65
+ function generateBoundaryAgent(agentId: string, targetTier: TrustTier, position: 'low' | 'high'): TestAgent {
66
+ const tierRange = TIER_THRESHOLDS[targetTier];
67
+
68
+ // Target specific boundary score
69
+ const targetScore = position === 'low'
70
+ ? (tierRange.min + 10) / 1000 // Just inside lower bound
71
+ : (tierRange.max - 10) / 1000; // Just inside upper bound
72
+
73
+ const factorScores: FactorScore[] = ALL_FACTOR_CODES.map(code => {
74
+ // Very small variance to stay near boundary
75
+ const variance = (Math.random() - 0.5) * 0.02;
76
+ const score = Math.min(1.0, Math.max(0, targetScore + variance));
77
+
78
+ return {
79
+ code: code as any,
80
+ score,
81
+ timestamp: new Date(),
82
+ source: 'measured' as const,
83
+ confidence: 0.9,
84
+ };
85
+ });
86
+
87
+ return {
88
+ id: agentId,
89
+ targetTier,
90
+ factorScores,
91
+ expectedScoreRange: tierRange,
92
+ };
93
+ }
94
+
95
+ // Test results
96
+ interface TestResult {
97
+ agentId: string;
98
+ targetTier: string;
99
+ actualTier: string;
100
+ score: number;
101
+ expectedRange: string;
102
+ passed: boolean;
103
+ compliant: boolean;
104
+ criticalFailures: number;
105
+ }
106
+
107
+ function runTests(): void {
108
+ console.log('='.repeat(80));
109
+ console.log('BASIS TRUST FACTORS TEST SUITE');
110
+ console.log('Testing 100 agents across all trust tiers');
111
+ console.log('='.repeat(80));
112
+ console.log('');
113
+
114
+ // Print tier thresholds
115
+ console.log('TIER THRESHOLDS:');
116
+ console.log('-'.repeat(50));
117
+ Object.entries(TIER_THRESHOLDS).forEach(([tier, range]) => {
118
+ const tierNum = parseInt(tier);
119
+ console.log(` T${tierNum} ${getTierName(tierNum)}: ${range.min} - ${range.max}`);
120
+ });
121
+ console.log('');
122
+
123
+ const results: TestResult[] = [];
124
+ let agentCounter = 0;
125
+
126
+ // Generate 100 test agents distributed across tiers
127
+ // T0: 12 agents, T1-T6: 13 agents each, T7: 10 agents
128
+ const tiersToTest = [
129
+ { tier: TrustTier.T0_SANDBOX, count: 12 },
130
+ { tier: TrustTier.T1_OBSERVED, count: 13 },
131
+ { tier: TrustTier.T2_PROVISIONAL, count: 13 },
132
+ { tier: TrustTier.T3_VERIFIED, count: 13 },
133
+ { tier: TrustTier.T4_OPERATIONAL, count: 13 },
134
+ { tier: TrustTier.T5_TRUSTED, count: 13 },
135
+ { tier: TrustTier.T6_CERTIFIED, count: 13 },
136
+ { tier: TrustTier.T7_AUTONOMOUS, count: 10 },
137
+ ];
138
+
139
+ for (const { tier, count } of tiersToTest) {
140
+ console.log(`\nTesting T${tier} ${getTierName(tier)} (${count} agents):`);
141
+ console.log('-'.repeat(60));
142
+
143
+ for (let i = 0; i < count; i++) {
144
+ agentCounter++;
145
+ const agentId = `AGENT-${agentCounter.toString().padStart(3, '0')}`;
146
+
147
+ // Mix of regular and boundary agents
148
+ const agent = i < 2
149
+ ? generateBoundaryAgent(agentId, tier, i === 0 ? 'low' : 'high')
150
+ : generateAgentForScoreRange(agentId, tier);
151
+
152
+ // Calculate trust score
153
+ const evaluation = calculateTrustScore(agent.factorScores, tier);
154
+ const actualTier = getTrustTierFromScore(evaluation.totalScore);
155
+
156
+ const passed = evaluation.totalScore >= agent.expectedScoreRange.min &&
157
+ evaluation.totalScore <= agent.expectedScoreRange.max;
158
+
159
+ const result: TestResult = {
160
+ agentId,
161
+ targetTier: `T${tier} ${getTierName(tier)}`,
162
+ actualTier: `T${actualTier} ${getTierName(actualTier)}`,
163
+ score: evaluation.totalScore,
164
+ expectedRange: `${agent.expectedScoreRange.min}-${agent.expectedScoreRange.max}`,
165
+ passed,
166
+ compliant: evaluation.compliant,
167
+ criticalFailures: evaluation.belowThreshold.length,
168
+ };
169
+
170
+ results.push(result);
171
+
172
+ // Print result
173
+ const status = passed ? '✓' : '✗';
174
+ const complianceStatus = evaluation.compliant ? 'COMPLIANT' : `FAILED(${evaluation.belowThreshold.length})`;
175
+ console.log(
176
+ ` ${status} ${agentId}: Score=${evaluation.totalScore.toString().padStart(4)} ` +
177
+ `Target=${result.targetTier.padEnd(15)} Actual=${result.actualTier.padEnd(15)} ` +
178
+ `[${complianceStatus}]`
179
+ );
180
+ }
181
+ }
182
+
183
+ // Summary
184
+ console.log('\n' + '='.repeat(80));
185
+ console.log('TEST SUMMARY');
186
+ console.log('='.repeat(80));
187
+
188
+ const passed = results.filter(r => r.passed).length;
189
+ const failed = results.filter(r => !r.passed).length;
190
+ const compliant = results.filter(r => r.compliant).length;
191
+
192
+ console.log(`\nTotal Agents Tested: ${results.length}`);
193
+ console.log(`Passed (in expected range): ${passed} (${((passed/results.length)*100).toFixed(1)}%)`);
194
+ console.log(`Failed (outside range): ${failed} (${((failed/results.length)*100).toFixed(1)}%)`);
195
+ console.log(`Compliant (met all critical factors): ${compliant} (${((compliant/results.length)*100).toFixed(1)}%)`);
196
+
197
+ // Distribution by tier
198
+ console.log('\nDISTRIBUTION BY ACTUAL TIER:');
199
+ console.log('-'.repeat(40));
200
+ for (let t = 0; t <= 7; t++) {
201
+ const inTier = results.filter(r => r.actualTier.startsWith(`T${t}`)).length;
202
+ const bar = '█'.repeat(Math.round(inTier / 2));
203
+ console.log(` T${t} ${getTierName(t).padEnd(12)}: ${inTier.toString().padStart(3)} ${bar}`);
204
+ }
205
+
206
+ // Score distribution
207
+ console.log('\nSCORE DISTRIBUTION:');
208
+ console.log('-'.repeat(40));
209
+ const scoreRanges = [
210
+ { label: '0-199', min: 0, max: 199 },
211
+ { label: '200-349', min: 200, max: 349 },
212
+ { label: '350-499', min: 350, max: 499 },
213
+ { label: '500-649', min: 500, max: 649 },
214
+ { label: '650-799', min: 650, max: 799 },
215
+ { label: '800-875', min: 800, max: 875 },
216
+ { label: '876-949', min: 876, max: 949 },
217
+ { label: '950-1000', min: 950, max: 1000 },
218
+ ];
219
+
220
+ for (const range of scoreRanges) {
221
+ const count = results.filter(r => r.score >= range.min && r.score <= range.max).length;
222
+ const bar = '█'.repeat(Math.round(count / 2));
223
+ console.log(` ${range.label.padEnd(10)}: ${count.toString().padStart(3)} ${bar}`);
224
+ }
225
+
226
+ // Failed agents detail
227
+ if (failed > 0) {
228
+ console.log('\nFAILED AGENTS:');
229
+ console.log('-'.repeat(60));
230
+ results.filter(r => !r.passed).forEach(r => {
231
+ console.log(` ${r.agentId}: Score=${r.score} Expected=${r.expectedRange} Got=${r.actualTier}`);
232
+ });
233
+ }
234
+
235
+ console.log('\n' + '='.repeat(80));
236
+ console.log(failed === 0 ? 'ALL TESTS PASSED!' : `${failed} TESTS FAILED`);
237
+ console.log('='.repeat(80));
238
+ }
239
+
240
+ // Run tests
241
+ runTests();