yakmesh 2.8.2 → 3.0.0

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 (232) hide show
  1. package/CHANGELOG.md +637 -0
  2. package/CONTRIBUTING.md +42 -0
  3. package/Caddyfile +77 -0
  4. package/README.md +119 -29
  5. package/adapters/adapter-mlv-bible/README.md +124 -0
  6. package/adapters/adapter-mlv-bible/index.js +400 -0
  7. package/adapters/chat-mod-adapter.js +532 -0
  8. package/adapters/content-adapter.js +273 -0
  9. package/content/api.js +50 -41
  10. package/content/index.js +2 -2
  11. package/content/store.js +355 -173
  12. package/dashboard/index.html +19 -3
  13. package/database/replication.js +117 -37
  14. package/docs/CRYPTO-AGILITY.md +204 -0
  15. package/docs/MTLS-RESEARCH.md +367 -0
  16. package/docs/NAMCHE-SPEC.md +681 -0
  17. package/docs/PEERQUANTA-YAKMESH-INTEGRATION.md +407 -0
  18. package/docs/PRECISION-DISCLOSURE.md +96 -0
  19. package/docs/README.md +76 -0
  20. package/docs/ROADMAP-2.4.0.md +447 -0
  21. package/docs/ROADMAP-2.5.0.md +244 -0
  22. package/docs/SECURITY-AUDIT-REPORT.md +306 -0
  23. package/docs/SST-INTEGRATION.md +712 -0
  24. package/docs/STEADYWATCH-IMPLEMENTATION.md +303 -0
  25. package/docs/TERNARY-AUDIT-REPORT.md +247 -0
  26. package/docs/TME-FAQ.md +221 -0
  27. package/docs/WHITEPAPER.md +623 -0
  28. package/docs/adapters.html +1001 -0
  29. package/docs/advanced-systems.html +1045 -0
  30. package/docs/annex.html +1046 -0
  31. package/docs/api.html +970 -0
  32. package/docs/business/response-templates.md +160 -0
  33. package/docs/c2c.html +1225 -0
  34. package/docs/cli.html +1332 -0
  35. package/docs/configuration.html +1248 -0
  36. package/docs/darshan.html +1085 -0
  37. package/docs/dharma.html +966 -0
  38. package/docs/docs-bundle.html +1075 -0
  39. package/docs/docs.css +3120 -0
  40. package/docs/docs.js +556 -0
  41. package/docs/doko.html +969 -0
  42. package/docs/geo-proof.html +858 -0
  43. package/docs/getting-started.html +840 -0
  44. package/docs/gumba-tutorial.html +1144 -0
  45. package/docs/gumba.html +1098 -0
  46. package/docs/index.html +914 -0
  47. package/docs/jhilke.html +1312 -0
  48. package/docs/karma.html +1100 -0
  49. package/docs/katha.html +1037 -0
  50. package/docs/lama.html +978 -0
  51. package/docs/mandala.html +1067 -0
  52. package/docs/mani.html +964 -0
  53. package/docs/mantra.html +967 -0
  54. package/docs/mesh.html +1409 -0
  55. package/docs/nakpak.html +869 -0
  56. package/docs/namche.html +928 -0
  57. package/docs/nav-order.json +53 -0
  58. package/docs/prahari.html +1043 -0
  59. package/docs/prism-bash.min.js +1 -0
  60. package/docs/prism-javascript.min.js +1 -0
  61. package/docs/prism-json.min.js +1 -0
  62. package/docs/prism-tomorrow.min.css +1 -0
  63. package/docs/prism.min.js +1 -0
  64. package/docs/privacy.html +699 -0
  65. package/docs/quick-reference.html +1181 -0
  66. package/docs/sakshi.html +1402 -0
  67. package/docs/sandboxing.md +386 -0
  68. package/docs/seva.html +911 -0
  69. package/docs/sherpa.html +871 -0
  70. package/docs/studio.html +860 -0
  71. package/docs/stupa.html +995 -0
  72. package/docs/tailwind.min.css +2 -0
  73. package/docs/tattva.html +1332 -0
  74. package/docs/terms.html +686 -0
  75. package/docs/time-server-deployment.md +166 -0
  76. package/docs/time-sources.html +1392 -0
  77. package/docs/tivra.html +1127 -0
  78. package/docs/trademark-policy.html +686 -0
  79. package/docs/tribhuj.html +1183 -0
  80. package/docs/trust-security.html +1029 -0
  81. package/docs/tutorials/backup-recovery.html +654 -0
  82. package/docs/tutorials/dashboard.html +604 -0
  83. package/docs/tutorials/domain-setup.html +605 -0
  84. package/docs/tutorials/host-website.html +456 -0
  85. package/docs/tutorials/mesh-network.html +505 -0
  86. package/docs/tutorials/mobile-access.html +445 -0
  87. package/docs/tutorials/privacy.html +467 -0
  88. package/docs/tutorials/raspberry-pi.html +600 -0
  89. package/docs/tutorials/security-basics.html +539 -0
  90. package/docs/tutorials/share-files.html +431 -0
  91. package/docs/tutorials/troubleshooting.html +637 -0
  92. package/docs/tutorials/trust-karma.html +419 -0
  93. package/docs/tutorials/yak-protocol.html +456 -0
  94. package/docs/tutorials.html +1034 -0
  95. package/docs/vani.html +1270 -0
  96. package/docs/webserver.html +809 -0
  97. package/docs/yak-protocol.html +940 -0
  98. package/docs/yak-timeserver-design.md +475 -0
  99. package/docs/yakapp.html +1015 -0
  100. package/docs/ypc27.html +1069 -0
  101. package/docs/yurt.html +1344 -0
  102. package/embedded-docs/bundle.js +334 -74
  103. package/gossip/protocol.js +247 -27
  104. package/identity/key-resolver.js +262 -0
  105. package/identity/machine-seed.js +632 -0
  106. package/identity/node-key.js +669 -368
  107. package/identity/tribhuj-ratchet.js +506 -0
  108. package/knowledge-base.js +37 -8
  109. package/launcher/yakmesh.bat +62 -0
  110. package/launcher/yakmesh.sh +70 -0
  111. package/mesh/annex.js +462 -108
  112. package/mesh/beacon-broadcast.js +113 -1
  113. package/mesh/darshan.js +1718 -0
  114. package/mesh/gumba.js +1567 -0
  115. package/mesh/jhilke.js +651 -0
  116. package/mesh/katha.js +1012 -0
  117. package/mesh/nakpak-routing.js +8 -5
  118. package/mesh/network.js +724 -34
  119. package/mesh/pulse-sync.js +4 -1
  120. package/mesh/rate-limiter.js +127 -15
  121. package/mesh/seva.js +526 -0
  122. package/mesh/sherpa-discovery.js +89 -8
  123. package/mesh/sybil-defense.js +19 -5
  124. package/mesh/temporal-encoder.js +4 -3
  125. package/mesh/vani.js +1364 -0
  126. package/mesh/yurt.js +1340 -0
  127. package/models/entropy-sentinel.onnx +0 -0
  128. package/models/karma-trust.onnx +0 -0
  129. package/models/manifest.json +43 -0
  130. package/models/sakshi-anomaly.onnx +0 -0
  131. package/oracle/code-proof-protocol.js +7 -6
  132. package/oracle/codebase-lock.js +257 -28
  133. package/oracle/index.js +74 -15
  134. package/oracle/ma902-snmp.js +678 -0
  135. package/oracle/module-sealer.js +5 -3
  136. package/oracle/network-identity.js +16 -0
  137. package/oracle/packet-checksum.js +201 -0
  138. package/oracle/sst.js +579 -0
  139. package/oracle/ternary-144t.js +714 -0
  140. package/oracle/ternary-ml.js +481 -0
  141. package/oracle/time-api.js +239 -0
  142. package/oracle/time-source.js +137 -47
  143. package/oracle/validation-oracle-hardened.js +1111 -1071
  144. package/oracle/validation-oracle.js +4 -2
  145. package/oracle/ypc27.js +211 -0
  146. package/package.json +20 -3
  147. package/protocol/yak-handler.js +35 -9
  148. package/protocol/yak-protocol.js +28 -13
  149. package/reference/cpp/yakmesh_mceliece_shard.cpp +168 -0
  150. package/reference/cpp/yakmesh_ypc27.cpp +179 -0
  151. package/sbom.json +87 -0
  152. package/scripts/security-audit.mjs +264 -0
  153. package/scripts/update-docs-nav.js +194 -0
  154. package/scripts/update-docs-sidebar.cjs +164 -0
  155. package/security/crypto-config.js +4 -3
  156. package/security/dharma-moderation.js +517 -0
  157. package/security/doko-identity.js +193 -143
  158. package/security/domain-consensus.js +86 -85
  159. package/security/fs-hardening.js +620 -0
  160. package/security/hardware-attestation.js +5 -3
  161. package/security/hybrid-trust.js +227 -87
  162. package/security/karma-rate-limiter.js +692 -0
  163. package/security/khata-protocol.js +22 -21
  164. package/security/khata-trust-integration.js +277 -150
  165. package/security/memory-safety.js +635 -0
  166. package/security/mesh-auth.js +11 -10
  167. package/security/mesh-revocation.js +373 -5
  168. package/security/namche-gateway.js +298 -69
  169. package/security/sakshi.js +460 -3
  170. package/security/sangha.js +770 -0
  171. package/security/secure-config.js +473 -0
  172. package/security/silicon-parity.js +13 -10
  173. package/security/steadywatch.js +1142 -0
  174. package/security/strike-system.js +32 -3
  175. package/security/temporal-signing.js +488 -0
  176. package/security/trit-commitment.js +464 -0
  177. package/server/crypto/annex.js +247 -0
  178. package/server/darshan-api.js +343 -0
  179. package/server/index.js +3259 -362
  180. package/server/komm-api.js +668 -0
  181. package/utils/accel.js +2273 -0
  182. package/utils/ternary-id.js +79 -0
  183. package/utils/verify-worker.js +57 -0
  184. package/webserver/index.js +95 -5
  185. package/assets/yakmesh-logo.png +0 -0
  186. package/assets/yakmesh-logo.svg +0 -80
  187. package/assets/yakmesh-logo2.png +0 -0
  188. package/assets/yakmesh-logo2sm.png +0 -0
  189. package/assets/ymsm.png +0 -0
  190. package/website/assets/silhouettes/adapters.svg +0 -107
  191. package/website/assets/silhouettes/api-endpoints.svg +0 -115
  192. package/website/assets/silhouettes/atomic-clock.svg +0 -83
  193. package/website/assets/silhouettes/base-camp.svg +0 -81
  194. package/website/assets/silhouettes/bridge.svg +0 -69
  195. package/website/assets/silhouettes/docs-bundle.svg +0 -113
  196. package/website/assets/silhouettes/doko-basket.svg +0 -70
  197. package/website/assets/silhouettes/fortress.svg +0 -93
  198. package/website/assets/silhouettes/gateway.svg +0 -54
  199. package/website/assets/silhouettes/gears.svg +0 -93
  200. package/website/assets/silhouettes/globe-satellite.svg +0 -67
  201. package/website/assets/silhouettes/karma-wheel.svg +0 -137
  202. package/website/assets/silhouettes/lama-council.svg +0 -141
  203. package/website/assets/silhouettes/mandala-network.svg +0 -169
  204. package/website/assets/silhouettes/mani-stones.svg +0 -149
  205. package/website/assets/silhouettes/mantra-wheel.svg +0 -116
  206. package/website/assets/silhouettes/mesh-nodes.svg +0 -113
  207. package/website/assets/silhouettes/nakpak.svg +0 -56
  208. package/website/assets/silhouettes/peak-lightning.svg +0 -73
  209. package/website/assets/silhouettes/sherpa.svg +0 -69
  210. package/website/assets/silhouettes/stupa-tower.svg +0 -119
  211. package/website/assets/silhouettes/tattva-eye.svg +0 -78
  212. package/website/assets/silhouettes/terminal.svg +0 -74
  213. package/website/assets/silhouettes/webserver.svg +0 -145
  214. package/website/assets/silhouettes/yak.svg +0 -78
  215. package/website/assets/yakmesh-logo.png +0 -0
  216. package/website/assets/yakmesh-logo.webp +0 -0
  217. package/website/assets/yakmesh-logo128x140.webp +0 -0
  218. package/website/assets/yakmesh-logo2.png +0 -0
  219. package/website/assets/yakmesh-logo2.svg +0 -51
  220. package/website/assets/yakmesh-logo40x44.webp +0 -0
  221. package/website/assets/yakmesh.gif +0 -0
  222. package/website/assets/yakmesh.ico +0 -0
  223. package/website/assets/yakmesh.jpg +0 -0
  224. package/website/assets/yakmesh.pdf +0 -0
  225. package/website/assets/yakmesh.png +0 -0
  226. package/website/assets/yakmesh.svg +0 -70
  227. package/website/assets/yakmesh128.webp +0 -0
  228. package/website/assets/yakmesh32.png +0 -0
  229. package/website/assets/yakmesh32.svg +0 -65
  230. package/website/assets/yakmesh32o.ico +0 -2
  231. package/website/assets/yakmesh32o.svg +0 -65
  232. package/website/assets/yakmesh32o.svgz +0 -0
@@ -59,6 +59,14 @@ import { EventEmitter } from 'events';
59
59
  import { sha3_256 } from '@noble/hashes/sha3.js';
60
60
  import { bytesToHex, utf8ToBytes } from '@noble/hashes/utils.js';
61
61
 
62
+ // ═══ TRIBHUJ — Balanced ternary for evidence verification states ═══
63
+ // Evidence sources use trits: POSITIVE (verified), NEUTRAL (unchecked), NEGATIVE (failed)
64
+ import { POSITIVE, NEUTRAL, NEGATIVE, TritState } from '../oracle/tribhuj.js';
65
+
66
+ // ═══ SST — Synergy Sequence Theory for trust geometry ═══
67
+ // Trust decay uses the 30-60-90 triangle geometry (√3 ratios)
68
+ import { propagateTrust, decayTrust, TRUST_PROPAGATION, SynergyAngles } from '../oracle/sst.js';
69
+
62
70
  /**
63
71
  * KARMA Level Constants - Stages of spiritual trust
64
72
  */
@@ -67,6 +75,11 @@ export const KarmaLevel = {
67
75
  SEEKING: 1, // Basic - Self-asserted only (on the path)
68
76
  AWAKENED: 2, // Standard - Mesh verified (eyes opening)
69
77
  ENLIGHTENED: 3, // Highest - Full verification (full realization)
78
+
79
+ // Backward compatibility aliases
80
+ BRONZE: 1, // → SEEKING
81
+ GOLD: 2, // → AWAKENED
82
+ PLATINUM: 3, // → ENLIGHTENED
70
83
  };
71
84
 
72
85
  // Backward compatibility alias
@@ -153,11 +166,14 @@ class KarmaEvidence {
153
166
  this.createdAt = Date.now();
154
167
  this.lastUpdated = Date.now();
155
168
 
156
- // Evidence sources
169
+ // Evidence sources — verified uses balanced ternary trits:
170
+ // POSITIVE (+1) = verified/passed
171
+ // NEUTRAL ( 0) = unchecked (not yet attempted)
172
+ // NEGATIVE (-1) = verification failed
157
173
  this.sources = {
158
174
  // DOKO verification via NAMCHE
159
175
  doko: {
160
- verified: false,
176
+ verified: NEUTRAL,
161
177
  verifiedAt: null,
162
178
  gatesPassedCount: 0,
163
179
  dokoHash: null,
@@ -165,7 +181,7 @@ class KarmaEvidence {
165
181
 
166
182
  // Mesh quorum verification
167
183
  meshQuorum: {
168
- verified: false,
184
+ verified: NEUTRAL,
169
185
  verifiedAt: null,
170
186
  quorumSize: 0,
171
187
  verifiers: [],
@@ -174,7 +190,7 @@ class KarmaEvidence {
174
190
 
175
191
  // SSL/TLS verification
176
192
  ssl: {
177
- verified: false,
193
+ verified: NEUTRAL,
178
194
  verifiedAt: null,
179
195
  certType: null, // 'ca-signed', 'self-signed', 'doko-bound'
180
196
  certFingerprint: null,
@@ -183,7 +199,7 @@ class KarmaEvidence {
183
199
 
184
200
  // Domain ownership
185
201
  domain: {
186
- verified: false,
202
+ verified: NEUTRAL,
187
203
  verifiedAt: null,
188
204
  domain: null,
189
205
  proofCount: 0,
@@ -199,17 +215,28 @@ class KarmaEvidence {
199
215
  };
200
216
 
201
217
  // Computed trust level
202
- this.trustLevel = TrustLevel.UNTRUSTED;
218
+ this.trustLevel = KarmaLevel.UNTRUSTED;
203
219
  this.trustScore = 0; // 0-100 detailed score
204
220
  this.levelHistory = []; // Track level changes
205
221
  }
206
222
 
223
+ /**
224
+ * Convert boolean → trit for backward compatibility
225
+ * true → POSITIVE (+1), false → NEGATIVE (-1), null/undefined → NEUTRAL (0)
226
+ */
227
+ static boolToTrit(val) {
228
+ if (typeof val === 'number' && val >= -1 && val <= 1) return val; // already a trit
229
+ if (val === null || val === undefined) return NEUTRAL;
230
+ return val ? POSITIVE : NEGATIVE;
231
+ }
232
+
207
233
  /**
208
234
  * Record DOKO verification
209
235
  */
210
236
  recordDokoVerification(result) {
237
+ const passed = result.passed ?? result.verified;
211
238
  this.sources.doko = {
212
- verified: result.passed,
239
+ verified: KarmaEvidence.boolToTrit(passed),
213
240
  verifiedAt: Date.now(),
214
241
  gatesPassedCount: result.gatesChecked || 7,
215
242
  dokoHash: result.dokoHash || null,
@@ -222,7 +249,7 @@ class KarmaEvidence {
222
249
  */
223
250
  recordMeshQuorum(result) {
224
251
  this.sources.meshQuorum = {
225
- verified: result.valid,
252
+ verified: KarmaEvidence.boolToTrit(result.valid),
226
253
  verifiedAt: Date.now(),
227
254
  quorumSize: result.validProofs || 0,
228
255
  verifiers: result.verifiers || [],
@@ -236,7 +263,7 @@ class KarmaEvidence {
236
263
  */
237
264
  recordSSLVerification(result) {
238
265
  this.sources.ssl = {
239
- verified: result.verified,
266
+ verified: KarmaEvidence.boolToTrit(result.verified),
240
267
  verifiedAt: Date.now(),
241
268
  certType: result.certType || 'unknown',
242
269
  certFingerprint: result.fingerprint || null,
@@ -250,7 +277,7 @@ class KarmaEvidence {
250
277
  */
251
278
  recordDomainVerification(result) {
252
279
  this.sources.domain = {
253
- verified: result.valid,
280
+ verified: KarmaEvidence.boolToTrit(result.valid),
254
281
  verifiedAt: Date.now(),
255
282
  domain: result.domain || null,
256
283
  proofCount: result.proofCount || 0,
@@ -328,7 +355,7 @@ class KarmaEvidence {
328
355
  * Restore from persistence
329
356
  */
330
357
  static deserialize(data) {
331
- const evidence = new TrustEvidence(data.nodeId);
358
+ const evidence = new KarmaEvidence(data.nodeId);
332
359
  evidence.createdAt = data.createdAt;
333
360
  evidence.lastUpdated = data.lastUpdated;
334
361
  evidence.sources = data.sources;
@@ -349,6 +376,8 @@ export class KarmaTrustModel extends EventEmitter {
349
376
  constructor(config = {}) {
350
377
  super();
351
378
  this.config = { ...DEFAULT_CONFIG, ...config };
379
+ this._inferenceEngine = config.inferenceEngine || null;
380
+ this._modelName = 'karma-trust';
352
381
 
353
382
  // Karma evidence per node (spiritual ledger)
354
383
  this.evidence = new Map(); // nodeId -> KarmaEvidence
@@ -377,10 +406,12 @@ export class KarmaTrustModel extends EventEmitter {
377
406
  * Get or create karma evidence for a node
378
407
  */
379
408
  getEvidence(nodeId) {
380
- if (!this.evidence.has(nodeId)) {
381
- this.evidence.set(nodeId, new KarmaEvidence(nodeId));
409
+ // Coerce to string — prevent non-string keys from entering evidence Map
410
+ const id = typeof nodeId === 'string' ? nodeId : String(nodeId ?? 'unknown');
411
+ if (!this.evidence.has(id)) {
412
+ this.evidence.set(id, new KarmaEvidence(id));
382
413
  }
383
- return this.evidence.get(nodeId);
414
+ return this.evidence.get(id);
384
415
  }
385
416
 
386
417
  /**
@@ -479,114 +510,223 @@ export class KarmaTrustModel extends EventEmitter {
479
510
 
480
511
  /**
481
512
  * Calculate trust level based on evidence
513
+ * Uses TRIBHUJ balanced ternary for verification state checks
514
+ * and SST geometric decay (√3 ratios) for trust degradation.
482
515
  */
483
516
  calculateTrustLevel(evidence) {
484
517
  const sources = evidence.sources;
485
518
  const age = evidence.getAge();
486
519
 
487
520
  // ═════════════════════════════════════════════════════════════════════
488
- // Check for UNTRUSTED conditions first
521
+ // Check for UNTRUSTED conditions first (NEGATIVE karma)
489
522
  // ═════════════════════════════════════════════════════════════════════
490
523
 
491
- // If DOKO verification explicitly failed (not just missing)
492
- if (sources.doko.verified === false && sources.doko.verifiedAt !== null) {
524
+ // If DOKO verification explicitly failed (NEGATIVE trit — not just NEUTRAL/unchecked)
525
+ if (sources.doko.verified === NEGATIVE) {
493
526
  return {
494
- level: TrustLevel.UNTRUSTED,
527
+ level: KarmaLevel.UNTRUSTED,
495
528
  score: 0,
496
- reason: 'DOKO verification failed',
497
- requirements: { dokoVerification: 'FAILED' },
529
+ reason: 'DOKO verification failed (NEGATIVE karma)',
530
+ requirements: { dokoVerification: 'NEGATIVE' },
498
531
  };
499
532
  }
500
533
 
501
- // Check for trust decay
534
+ // SST geometric trust decay (replaces flat 30-day threshold)
535
+ // Uses the 30-60-90 Synergy Triangle: MIDDLE angle = 7-day half-life
502
536
  if (this.config.trustDecayEnabled) {
503
- const lastActivity = evidence.lastUpdated;
504
- const decayThreshold = Date.now() - this.config.trustDecayPeriod;
537
+ const elapsedMs = Date.now() - evidence.lastUpdated;
538
+ const currentScore = evidence.trustScore || 0;
505
539
 
506
- if (lastActivity < decayThreshold) {
507
- return {
508
- level: TrustLevel.UNTRUSTED,
509
- score: 0,
510
- reason: 'Trust decayed due to inactivity',
511
- requirements: { activity: 'STALE' },
512
- };
540
+ if (currentScore > 0 && elapsedMs > 0) {
541
+ const decayedScore = decayTrust(currentScore / 100, elapsedMs, SynergyAngles.MIDDLE);
542
+
543
+ // Fully decayed: trust has gone below threshold
544
+ if (decayedScore * 100 < 1) {
545
+ return {
546
+ level: KarmaLevel.UNTRUSTED,
547
+ score: 0,
548
+ reason: 'Trust decayed (SST √3 geometric — 7-day half-life)',
549
+ requirements: { activity: 'DECAYED', decayedScore: Math.round(decayedScore * 100) },
550
+ };
551
+ }
513
552
  }
514
553
  }
515
554
 
516
555
  // ═════════════════════════════════════════════════════════════════════
517
- // Check for PLATINUM level
556
+ // Check for ENLIGHTENED level (formerly PLATINUM)
518
557
  // ═════════════════════════════════════════════════════════════════════
519
558
 
520
- const platinumRequirements = {
521
- doko: sources.doko.verified,
522
- meshQuorum: sources.meshQuorum.verified &&
559
+ const enlightenedRequirements = {
560
+ doko: sources.doko.verified === POSITIVE,
561
+ meshQuorum: sources.meshQuorum.verified === POSITIVE &&
523
562
  sources.meshQuorum.quorumSize >= this.config.minQuorumForGold,
524
563
  meshDiversity: sources.meshQuorum.diversity?.sufficient || false,
525
- ssl: !this.config.requireSSLForPlatinum || sources.ssl.verified,
564
+ ssl: !this.config.requireSSLForPlatinum || sources.ssl.verified === POSITIVE,
526
565
  age: age >= this.config.minAgeForPlatinum,
527
- domain: !this.config.requireDomainForPlatinum || sources.domain.verified,
566
+ domain: !this.config.requireDomainForPlatinum || sources.domain.verified === POSITIVE,
528
567
  consistency: evidence.calculateBeaconConsistency(this.config.beaconCheckWindow)
529
568
  >= this.config.minBeaconConsistency,
530
569
  };
531
570
 
532
- const platinumScore = Object.values(platinumRequirements).filter(Boolean).length;
533
- const platinumTotal = Object.keys(platinumRequirements).length;
571
+ const enlightenedScore = Object.values(enlightenedRequirements).filter(Boolean).length;
572
+ const enlightenedTotal = Object.keys(enlightenedRequirements).length;
534
573
 
535
- if (platinumScore === platinumTotal) {
574
+ if (enlightenedScore === enlightenedTotal) {
536
575
  return {
537
- level: TrustLevel.PLATINUM,
538
- score: 90 + (platinumScore / platinumTotal) * 10,
539
- reason: 'Full verification: SSL + Mesh + Time + Domain',
540
- requirements: platinumRequirements,
576
+ level: KarmaLevel.ENLIGHTENED,
577
+ score: 90 + (enlightenedScore / enlightenedTotal) * 10,
578
+ reason: 'Full verification: SSL + Mesh + Time + Domain (dharma embodied)',
579
+ requirements: enlightenedRequirements,
541
580
  };
542
581
  }
543
582
 
544
583
  // ═════════════════════════════════════════════════════════════════════
545
- // Check for GOLD level
584
+ // Check for AWAKENED level (formerly GOLD)
546
585
  // ═════════════════════════════════════════════════════════════════════
547
586
 
548
- const goldRequirements = {
549
- doko: sources.doko.verified,
550
- meshQuorum: sources.meshQuorum.verified &&
587
+ const awakenedRequirements = {
588
+ doko: sources.doko.verified === POSITIVE,
589
+ meshQuorum: sources.meshQuorum.verified === POSITIVE &&
551
590
  sources.meshQuorum.quorumSize >= this.config.minQuorumForGold,
552
591
  meshDiversity: sources.meshQuorum.diversity?.sufficient || false,
553
592
  };
554
593
 
555
- const goldScore = Object.values(goldRequirements).filter(Boolean).length;
556
- const goldTotal = Object.keys(goldRequirements).length;
594
+ const awakenedScore = Object.values(awakenedRequirements).filter(Boolean).length;
595
+ const awakenedTotal = Object.keys(awakenedRequirements).length;
557
596
 
558
- if (goldScore === goldTotal) {
559
- // Calculate how close to platinum
560
- const progressTowardsPlatinum = platinumScore / platinumTotal;
597
+ if (awakenedScore === awakenedTotal) {
598
+ // Calculate how close to enlightenment
599
+ const progressTowardsEnlightenment = enlightenedScore / enlightenedTotal;
561
600
 
562
601
  return {
563
- level: TrustLevel.GOLD,
564
- score: 50 + (progressTowardsPlatinum * 40),
565
- reason: 'Mesh verified with diverse quorum',
566
- requirements: goldRequirements,
567
- platinumProgress: platinumRequirements,
602
+ level: KarmaLevel.AWAKENED,
603
+ score: 50 + (progressTowardsEnlightenment * 40),
604
+ reason: 'Mesh verified with diverse quorum (eyes opening)',
605
+ requirements: awakenedRequirements,
606
+ enlightenedProgress: enlightenedRequirements,
568
607
  };
569
608
  }
570
609
 
571
610
  // ═════════════════════════════════════════════════════════════════════
572
- // Default to BRONZE level
611
+ // Default to SEEKING level (formerly BRONZE)
573
612
  // ═════════════════════════════════════════════════════════════════════
574
613
 
575
- const bronzeScore = (
576
- (sources.doko.verified ? 20 : 0) +
614
+ const seekingScore = (
615
+ (sources.doko.verified === POSITIVE ? 20 : 0) +
577
616
  (sources.beaconHistory.sightings > 0 ? 10 : 0) +
578
- (goldScore / goldTotal) * 20
617
+ (awakenedScore / awakenedTotal) * 20
579
618
  );
580
619
 
581
620
  return {
582
- level: TrustLevel.BRONZE,
583
- score: bronzeScore,
584
- reason: 'Self-asserted, awaiting mesh verification',
621
+ level: KarmaLevel.SEEKING,
622
+ score: seekingScore,
623
+ reason: 'Self-asserted, awaiting mesh verification (beginning the journey)',
585
624
  requirements: {
586
- doko: sources.doko.verified,
625
+ doko: sources.doko.verified === POSITIVE,
587
626
  beaconSeen: sources.beaconHistory.sightings > 0,
588
627
  },
589
- goldProgress: goldRequirements,
628
+ awakenedProgress: awakenedRequirements,
629
+ };
630
+ }
631
+
632
+ /**
633
+ * NPU-accelerated trust level prediction.
634
+ * Feeds evidence features into the karma-trust ONNX model for softmax
635
+ * probability distribution over [UNTRUSTED, SEEKING, AWAKENED, ENLIGHTENED].
636
+ *
637
+ * Falls back to CPU rule-based `calculateTrustLevel()` if ONNX is unavailable.
638
+ *
639
+ * The NPU prediction is a "second opinion" — the authoritative trust level
640
+ * is always the rule-based `calculateTrustLevel()` method.
641
+ *
642
+ * @param {Object} evidence - KarmaEvidence instance
643
+ * @returns {Promise<Object>} Trust prediction with probabilities per level
644
+ */
645
+ async predictTrustLevel(evidence) {
646
+ const sources = evidence.sources;
647
+ const age = evidence.getAge();
648
+
649
+ // Map trit value to normalized float: -1→0, 0→0.5, 1→1
650
+ const tritNorm = (t) => (t + 1) / 2;
651
+
652
+ // Determine SSL type numeric value
653
+ let sslType = 0;
654
+ if (sources.ssl.verified === POSITIVE) {
655
+ sslType = sources.ssl.certBound ? 0.67 : (sources.ssl.selfSigned ? 0.33 : 1.0);
656
+ }
657
+
658
+ // Determine strike count (if evidence tracks it)
659
+ const strikes = Math.min(3, evidence.strikes || 0);
660
+
661
+ // Days since last evidence update
662
+ const daysSinceUpdate = Math.min(90, (Date.now() - evidence.lastUpdated) / 86400000);
663
+
664
+ // Build 14-feature input vector (must match training data order)
665
+ const features = new Float32Array([
666
+ tritNorm(sources.doko.verified),
667
+ sources.doko.hash ? 1.0 : 0.0,
668
+ tritNorm(sources.meshQuorum.verified),
669
+ Math.min(1.0, (sources.meshQuorum.quorumSize || 0) / 10),
670
+ sources.meshQuorum.diversity?.sufficient ? 1.0 : 0.0,
671
+ tritNorm(sources.ssl.verified),
672
+ sslType,
673
+ tritNorm(sources.domain.verified),
674
+ Math.min(1.0, age / (365 * 86400000)), // age in days normalized
675
+ Math.min(1.0, evidence.uptime || 0.5),
676
+ Math.min(1.0, (evidence.trustScore || 0) / 100),
677
+ evidence.calculateBeaconConsistency?.(this.config.beaconCheckWindow) || 0,
678
+ strikes / 3,
679
+ daysSinceUpdate / 90,
680
+ ]);
681
+
682
+ // NPU path: use ONNX model if available
683
+ const engine = this._inferenceEngine;
684
+ if (engine && engine.hasModel(this._modelName)) {
685
+ try {
686
+ const result = await engine.infer(this._modelName, {
687
+ trust_evidence: features,
688
+ });
689
+ if (result && result.karma_level) {
690
+ const probs = result.karma_level;
691
+ const levels = ['UNTRUSTED', 'SEEKING', 'AWAKENED', 'ENLIGHTENED'];
692
+ const predicted = levels[probs.indexOf(Math.max(...probs))];
693
+
694
+ return {
695
+ source: 'NPU',
696
+ predicted,
697
+ probabilities: {
698
+ UNTRUSTED: probs[0],
699
+ SEEKING: probs[1],
700
+ AWAKENED: probs[2],
701
+ ENLIGHTENED: probs[3],
702
+ },
703
+ features,
704
+ };
705
+ }
706
+ } catch (err) {
707
+ // Fall through to CPU
708
+ }
709
+ }
710
+
711
+ // CPU fallback: use rule-based assessment
712
+ const ruleResult = this.calculateTrustLevel(evidence);
713
+ const levelNames = ['UNTRUSTED', 'SEEKING', 'AWAKENED', 'ENLIGHTENED'];
714
+ const predicted = levelNames[ruleResult.level] || 'UNTRUSTED';
715
+
716
+ // Build approximate probability distribution from rule-based score
717
+ const probs = [0.05, 0.05, 0.05, 0.05];
718
+ probs[ruleResult.level] = 0.85;
719
+
720
+ return {
721
+ source: 'CPU',
722
+ predicted,
723
+ probabilities: {
724
+ UNTRUSTED: probs[0],
725
+ SEEKING: probs[1],
726
+ AWAKENED: probs[2],
727
+ ENLIGHTENED: probs[3],
728
+ },
729
+ features,
590
730
  };
591
731
  }
592
732
 
@@ -596,8 +736,8 @@ export class KarmaTrustModel extends EventEmitter {
596
736
  getTrustLevel(nodeId) {
597
737
  if (!this.evidence.has(nodeId)) {
598
738
  return {
599
- level: TrustLevel.UNTRUSTED,
600
- levelInfo: TrustLevelInfo[TrustLevel.UNTRUSTED],
739
+ level: KarmaLevel.UNTRUSTED,
740
+ levelInfo: KarmaLevelInfo[KarmaLevel.UNTRUSTED],
601
741
  score: 0,
602
742
  reason: 'Unknown node',
603
743
  };
@@ -727,7 +867,7 @@ export class KarmaTrustModel extends EventEmitter {
727
867
  this.evidence.clear();
728
868
 
729
869
  for (const evidenceData of data.evidence || []) {
730
- const evidence = TrustEvidence.deserialize(evidenceData);
870
+ const evidence = KarmaEvidence.deserialize(evidenceData);
731
871
  this.evidence.set(evidence.nodeId, evidence);
732
872
  }
733
873
 
@@ -740,12 +880,12 @@ export class KarmaTrustModel extends EventEmitter {
740
880
  * Get statistics
741
881
  */
742
882
  getStats() {
743
- // Recount nodes by level
883
+ // Recount nodes by level (KARMA naming)
744
884
  const byLevel = {
745
- [TrustLevel.UNTRUSTED]: 0,
746
- [TrustLevel.BRONZE]: 0,
747
- [TrustLevel.GOLD]: 0,
748
- [TrustLevel.PLATINUM]: 0,
885
+ [KarmaLevel.UNTRUSTED]: 0,
886
+ [KarmaLevel.SEEKING]: 0,
887
+ [KarmaLevel.AWAKENED]: 0,
888
+ [KarmaLevel.ENLIGHTENED]: 0,
749
889
  };
750
890
 
751
891
  for (const evidence of this.evidence.values()) {
@@ -769,10 +909,10 @@ export class KarmaTrustModel extends EventEmitter {
769
909
  promotions: 0,
770
910
  demotions: 0,
771
911
  nodesByLevel: {
772
- [TrustLevel.UNTRUSTED]: 0,
773
- [TrustLevel.BRONZE]: 0,
774
- [TrustLevel.GOLD]: 0,
775
- [TrustLevel.PLATINUM]: 0,
912
+ [KarmaLevel.UNTRUSTED]: 0,
913
+ [KarmaLevel.SEEKING]: 0,
914
+ [KarmaLevel.AWAKENED]: 0,
915
+ [KarmaLevel.ENLIGHTENED]: 0,
776
916
  },
777
917
  };
778
918
  }
@@ -787,23 +927,23 @@ export class TrustBasedAccessControl {
787
927
  constructor(trustModel) {
788
928
  this.trustModel = trustModel;
789
929
 
790
- // Default access requirements
930
+ // Default access requirements (KARMA naming)
791
931
  this.accessRequirements = {
792
932
  // Content serving/requesting
793
- 'content:request': TrustLevel.BRONZE,
794
- 'content:serve': TrustLevel.BRONZE,
933
+ 'content:request': KarmaLevel.SEEKING,
934
+ 'content:serve': KarmaLevel.SEEKING,
795
935
 
796
936
  // Mesh participation
797
- 'mesh:relay': TrustLevel.GOLD,
798
- 'mesh:route': TrustLevel.GOLD,
937
+ 'mesh:relay': KarmaLevel.AWAKENED,
938
+ 'mesh:route': KarmaLevel.AWAKENED,
799
939
 
800
940
  // Verification participation
801
- 'verify:domain': TrustLevel.GOLD,
802
- 'verify:quorum': TrustLevel.GOLD,
941
+ 'verify:domain': KarmaLevel.AWAKENED,
942
+ 'verify:quorum': KarmaLevel.AWAKENED,
803
943
 
804
944
  // Admin functions
805
- 'admin:revoke': TrustLevel.PLATINUM,
806
- 'admin:announce': TrustLevel.GOLD,
945
+ 'admin:revoke': KarmaLevel.ENLIGHTENED,
946
+ 'admin:announce': KarmaLevel.AWAKENED,
807
947
  };
808
948
  }
809
949