@lucern/graph-primitives 1.0.16 → 1.0.17

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 (65) hide show
  1. package/dist/beliefEvidenceLinks.js +144 -99
  2. package/dist/beliefEvidenceLinks.js.map +1 -1
  3. package/dist/beliefEvidenceLinks.operational.d.ts +29 -0
  4. package/dist/beliefEvidenceLinks.operational.js +157 -0
  5. package/dist/beliefEvidenceLinks.operational.js.map +1 -0
  6. package/dist/{beliefLifecycle-y8WLXqQj.d.ts → beliefLifecycle-CXwdDw5e.d.ts} +7 -4
  7. package/dist/beliefLifecycle.d.ts +1 -1
  8. package/dist/beliefLifecycle.js +75 -18
  9. package/dist/beliefLifecycle.js.map +1 -1
  10. package/dist/epistemicBeliefs.admin.js.map +1 -1
  11. package/dist/epistemicBeliefs.backfills.d.ts +1 -1
  12. package/dist/epistemicBeliefs.backfills.js +63 -35
  13. package/dist/epistemicBeliefs.backfills.js.map +1 -1
  14. package/dist/epistemicBeliefs.confidence.d.ts +1 -1
  15. package/dist/epistemicBeliefs.confidence.js +70 -41
  16. package/dist/epistemicBeliefs.confidence.js.map +1 -1
  17. package/dist/epistemicBeliefs.core.js +957 -566
  18. package/dist/epistemicBeliefs.core.js.map +1 -1
  19. package/dist/epistemicBeliefs.d.ts +2 -2
  20. package/dist/epistemicBeliefs.forkEvidence.d.ts +18 -0
  21. package/dist/epistemicBeliefs.forkEvidence.js +121 -0
  22. package/dist/epistemicBeliefs.forkEvidence.js.map +1 -0
  23. package/dist/epistemicBeliefs.helpers.d.ts +2 -2
  24. package/dist/epistemicBeliefs.helpers.js +60 -32
  25. package/dist/epistemicBeliefs.helpers.js.map +1 -1
  26. package/dist/epistemicBeliefs.internal.js +174 -39
  27. package/dist/epistemicBeliefs.internal.js.map +1 -1
  28. package/dist/epistemicBeliefs.js +436 -72
  29. package/dist/epistemicBeliefs.js.map +1 -1
  30. package/dist/epistemicBeliefs.lifecycle.d.ts +2 -2
  31. package/dist/epistemicBeliefs.lifecycle.js +75 -47
  32. package/dist/epistemicBeliefs.lifecycle.js.map +1 -1
  33. package/dist/epistemicBeliefs.links.js +46 -1
  34. package/dist/epistemicBeliefs.links.js.map +1 -1
  35. package/dist/epistemicBeliefs.topicAnchor.d.ts +29 -0
  36. package/dist/epistemicBeliefs.topicAnchor.js +105 -0
  37. package/dist/epistemicBeliefs.topicAnchor.js.map +1 -0
  38. package/dist/epistemicContracts.evaluators.js +71 -42
  39. package/dist/epistemicContracts.evaluators.js.map +1 -1
  40. package/dist/epistemicContracts.handlers.js +71 -42
  41. package/dist/epistemicContracts.handlers.js.map +1 -1
  42. package/dist/epistemicContracts.js +71 -42
  43. package/dist/epistemicContracts.js.map +1 -1
  44. package/dist/epistemicContracts.metrics.js +1 -1
  45. package/dist/epistemicContracts.metrics.js.map +1 -1
  46. package/dist/epistemicContracts.types.d.ts +1 -1
  47. package/dist/epistemicEdges.helpers.d.ts +1 -1
  48. package/dist/epistemicEvidence.js +172 -81
  49. package/dist/epistemicEvidence.js.map +1 -1
  50. package/dist/epistemicEvidenceMutations.js +172 -81
  51. package/dist/epistemicEvidenceMutations.js.map +1 -1
  52. package/dist/epistemicNodes.internal.js.map +1 -1
  53. package/dist/epistemicNodes.js +2 -2
  54. package/dist/epistemicNodes.js.map +1 -1
  55. package/dist/epistemicNodes.mutations.js +2 -2
  56. package/dist/epistemicNodes.mutations.js.map +1 -1
  57. package/dist/evaluators/index.js +1 -1
  58. package/dist/evaluators/index.js.map +1 -1
  59. package/dist/index.d.ts +2 -2
  60. package/dist/index.js +767 -236
  61. package/dist/index.js.map +1 -1
  62. package/dist/invariantEnforcement.js +2 -2
  63. package/dist/invariantEnforcement.js.map +1 -1
  64. package/dist/proof-attestation.json +3 -3
  65. package/package.json +4 -4
@@ -264,6 +264,102 @@ var optionalScopeArgs = {
264
264
  projectId: v.optional(v.string()),
265
265
  topicId: v.optional(v.string())
266
266
  };
267
+
268
+ // src/epistemicBeliefs.topicAnchor.ts
269
+ function cleanString(value) {
270
+ return typeof value === "string" && value.trim().length > 0 ? value.trim() : void 0;
271
+ }
272
+ function topicNodeCandidates(topicRef) {
273
+ const normalized = topicRef.trim();
274
+ if (!normalized) {
275
+ return [];
276
+ }
277
+ const candidates = [normalized];
278
+ if (normalized.startsWith("top_")) {
279
+ candidates.push(normalized.slice(4));
280
+ }
281
+ return [...new Set(candidates)];
282
+ }
283
+ function readTopicNodeRef(args) {
284
+ return cleanString(args.topicGlobalId) ?? cleanString(args.topicNodeId) ?? cleanString(args.topicId);
285
+ }
286
+ async function resolveRequiredTopicAnchor(ctx, topicRef) {
287
+ for (const candidate of topicNodeCandidates(topicRef)) {
288
+ try {
289
+ const direct = await ctx.db.get(candidate);
290
+ if (direct?.nodeType === "topic" && cleanString(direct.globalId)) {
291
+ return direct;
292
+ }
293
+ } catch (_) {
294
+ }
295
+ const byGlobalId = await ctx.db.query("epistemicNodes").withIndex("by_globalId", (q) => q.eq("globalId", candidate)).first();
296
+ if (byGlobalId?.nodeType === "topic" && cleanString(byGlobalId.globalId)) {
297
+ return byGlobalId;
298
+ }
299
+ }
300
+ throw new Error(
301
+ "Belief creation requires topicGlobalId or topicNodeId for a topic node in epistemicNodes. Legacy topics-table IDs are not valid belief anchors."
302
+ );
303
+ }
304
+ function scopeFromTopicAnchor(topicNode) {
305
+ return {
306
+ topicId: topicNode.globalId,
307
+ projectId: cleanString(topicNode.projectId),
308
+ tenantId: cleanString(topicNode.tenantId),
309
+ workspaceId: cleanString(topicNode.workspaceId),
310
+ source: "topic"
311
+ };
312
+ }
313
+ async function createRequiredBeliefTopicEdge(ctx, args) {
314
+ const topicGlobalId = args.topicNode.globalId;
315
+ const edgeGlobalId = `edge:${args.beliefGlobalId}:${topicGlobalId}:scoped_by`;
316
+ const now = Date.now();
317
+ const existing = await ctx.db.query("epistemicEdges").withIndex("by_globalId", (q) => q.eq("globalId", edgeGlobalId)).first();
318
+ if (!existing) {
319
+ await ctx.db.insert("epistemicEdges", {
320
+ globalId: edgeGlobalId,
321
+ fromNodeId: String(args.beliefNodeId),
322
+ toNodeId: String(args.topicNode._id),
323
+ sourceGlobalId: args.beliefGlobalId,
324
+ targetGlobalId: topicGlobalId,
325
+ edgeType: "scoped_by",
326
+ weight: 1,
327
+ confidence: 1,
328
+ context: "Belief creation topic anchor invariant.",
329
+ reasoningMethod: "implicit",
330
+ derivationType: "topic_scope_invariant",
331
+ metadata: { invariant: "belief.topic_edge_required" },
332
+ createdBy: args.createdBy,
333
+ createdAt: now,
334
+ updatedAt: now,
335
+ projectId: cleanString(args.topicNode.projectId),
336
+ topicId: topicGlobalId,
337
+ tenantId: cleanString(args.topicNode.tenantId),
338
+ workspaceId: cleanString(args.topicNode.workspaceId),
339
+ fromNodeType: "belief",
340
+ toNodeType: "topic",
341
+ fromLayer: "L3",
342
+ toLayer: args.topicNode.epistemicLayer ?? "ontological"
343
+ });
344
+ }
345
+ await ctx.scheduler.runAfter(0, internal.neo4jEdgeAPI.createEdge, {
346
+ globalId: edgeGlobalId,
347
+ fromGlobalId: args.beliefGlobalId,
348
+ toGlobalId: topicGlobalId,
349
+ edgeType: "scoped_by",
350
+ weight: 1,
351
+ confidence: 1,
352
+ context: "Belief creation topic anchor invariant.",
353
+ projectId: cleanString(args.topicNode.projectId),
354
+ topicId: topicGlobalId,
355
+ createdBy: args.createdBy,
356
+ fromNodeType: "belief",
357
+ toNodeType: "topic",
358
+ fromLayer: "L3",
359
+ toLayer: args.topicNode.epistemicLayer ?? "ontological",
360
+ metadata: { invariant: "belief.topic_edge_required" }
361
+ });
362
+ }
267
363
  function normalizeScopeValue2(value) {
268
364
  if (typeof value !== "string") {
269
365
  return;
@@ -362,18 +458,32 @@ function assertTenantPackWorkspaceMutationAllowed(args) {
362
458
  var BELIEF_STATUS_VALUES = [
363
459
  "assumption",
364
460
  "hypothesis",
365
- "belief",
366
- "fact"
367
- ];
368
- var RESOLVED_PREDICTION_OUTCOMES = [
369
- "confirmed",
370
- "disconfirmed",
371
- "partial",
372
- "expired"
461
+ "active",
462
+ "superseded",
463
+ "resolved_true",
464
+ "resolved_false"
373
465
  ];
374
466
  function isBeliefLifecycleStatus(value) {
375
467
  return typeof value === "string" && BELIEF_STATUS_VALUES.includes(value);
376
468
  }
469
+ function normalizeLegacyBeliefStatus(value) {
470
+ if (isBeliefLifecycleStatus(value)) {
471
+ return value;
472
+ }
473
+ if (value === "belief" || value === "established" || value === "emerging") {
474
+ return "active";
475
+ }
476
+ if (value === "fact" || value === "confirmed") {
477
+ return "resolved_true";
478
+ }
479
+ if (value === "disconfirmed" || value === "expired") {
480
+ return "resolved_false";
481
+ }
482
+ if (value === "deprecated") {
483
+ return "superseded";
484
+ }
485
+ return null;
486
+ }
377
487
  function normalizeBeliefConfidence(confidence) {
378
488
  if (typeof confidence !== "number" || !Number.isFinite(confidence)) {
379
489
  return null;
@@ -393,47 +503,61 @@ function isResolvedByConfidence(confidence) {
393
503
  }
394
504
  return normalized <= 0 || normalized >= 1;
395
505
  }
396
- function hasResolvedPredictionOutcome(predictionMeta) {
506
+ function getPredictionMetaFromMetadata(metadata) {
507
+ return metadata?.predictionMeta;
508
+ }
509
+ function resolvedPredictionStatus(predictionMeta) {
397
510
  if (!predictionMeta || typeof predictionMeta !== "object") {
398
- return false;
511
+ return null;
399
512
  }
400
513
  const outcome = predictionMeta.outcome;
401
- return typeof outcome === "string" && RESOLVED_PREDICTION_OUTCOMES.includes(outcome);
402
- }
403
- function getPredictionMetaFromMetadata(metadata) {
404
- return metadata?.predictionMeta;
514
+ if (outcome === "confirmed") {
515
+ return "resolved_true";
516
+ }
517
+ if (outcome === "disconfirmed" || outcome === "expired") {
518
+ return "resolved_false";
519
+ }
520
+ return null;
405
521
  }
406
- function shouldTreatBeliefAsFact(opts) {
522
+ function shouldTreatBeliefAsResolved(opts) {
407
523
  if (isResolvedByConfidence(opts.confidence)) {
408
- return true;
524
+ const normalized = normalizeBeliefConfidence(opts.confidence);
525
+ return normalized === 0 ? "resolved_false" : "resolved_true";
409
526
  }
410
- if (hasResolvedPredictionOutcome(opts.predictionMeta)) {
411
- return true;
527
+ const directPredictionStatus = resolvedPredictionStatus(opts.predictionMeta);
528
+ if (directPredictionStatus) {
529
+ return directPredictionStatus;
412
530
  }
413
- if (hasResolvedPredictionOutcome(getPredictionMetaFromMetadata(opts.metadata))) {
414
- return true;
531
+ const metadataPredictionStatus = resolvedPredictionStatus(
532
+ getPredictionMetaFromMetadata(opts.metadata)
533
+ );
534
+ if (metadataPredictionStatus) {
535
+ return metadataPredictionStatus;
415
536
  }
416
- return false;
537
+ return null;
417
538
  }
418
539
  function resolveBeliefLifecycleStatus(opts) {
419
- if (shouldTreatBeliefAsFact(opts)) {
420
- return "fact";
540
+ const resolvedStatus = shouldTreatBeliefAsResolved(opts);
541
+ if (resolvedStatus) {
542
+ return resolvedStatus;
421
543
  }
422
544
  const direct = opts.beliefStatus;
423
- if (isBeliefLifecycleStatus(direct)) {
545
+ const normalizedDirect = normalizeLegacyBeliefStatus(direct);
546
+ if (normalizedDirect) {
424
547
  const normalized = normalizeBeliefConfidence(opts.confidence);
425
- if (normalized !== null && isPreValidationBeliefStatus(direct)) {
426
- return "belief";
548
+ if (normalized !== null && isPreValidationBeliefStatus(normalizedDirect)) {
549
+ return "active";
427
550
  }
428
- return direct;
551
+ return normalizedDirect;
429
552
  }
430
553
  const metaStatus = opts.metadata?.beliefStatus;
431
- if (isBeliefLifecycleStatus(metaStatus)) {
554
+ const normalizedMetaStatus = normalizeLegacyBeliefStatus(metaStatus);
555
+ if (normalizedMetaStatus) {
432
556
  const normalized = normalizeBeliefConfidence(opts.confidence);
433
- if (normalized !== null && isPreValidationBeliefStatus(metaStatus)) {
434
- return "belief";
557
+ if (normalized !== null && isPreValidationBeliefStatus(normalizedMetaStatus)) {
558
+ return "active";
435
559
  }
436
- return metaStatus;
560
+ return normalizedMetaStatus;
437
561
  }
438
562
  return "assumption";
439
563
  }
@@ -811,7 +935,7 @@ function buildBeliefConfidenceRow(args) {
811
935
  disbelief: args.disbelief,
812
936
  uncertainty: args.uncertainty,
813
937
  baseRate: args.baseRate,
814
- slOperator: args.slOperator ?? "manual_assessment",
938
+ slOperator: args.slOperator ?? "prior_seed",
815
939
  trigger: args.trigger,
816
940
  ...args.rationale ? { rationale: args.rationale } : {},
817
941
  assessedBy: args.assessedBy,
@@ -1131,6 +1255,8 @@ var internalGetById = internalQuery({
1131
1255
  var internalCreate = internalMutation({
1132
1256
  args: {
1133
1257
  ...optionalBeliefScopeArgs,
1258
+ topicNodeId: v.optional(v.string()),
1259
+ topicGlobalId: v.optional(v.string()),
1134
1260
  formulation: v.string(),
1135
1261
  baseRate: v.optional(v.number()),
1136
1262
  confidence: v.optional(
@@ -1169,10 +1295,14 @@ var internalCreate = internalMutation({
1169
1295
  handler: async (ctx, args) => {
1170
1296
  const now = Date.now();
1171
1297
  const baseRate = assertBaseRateInRange(args.baseRate ?? 0.5);
1172
- const scope = await resolveTopicProjectScope(ctx, {
1173
- topicId: args.topicId,
1174
- projectId: args.projectId
1175
- });
1298
+ const topicRef = readTopicNodeRef(args);
1299
+ if (!topicRef) {
1300
+ throw new Error(
1301
+ "Belief creation requires topicGlobalId or topicNodeId for a topic node in epistemicNodes."
1302
+ );
1303
+ }
1304
+ const topicNode = await resolveRequiredTopicAnchor(ctx, topicRef);
1305
+ const scope = scopeFromTopicAnchor(topicNode);
1176
1306
  assertWorkspaceScopedEpistemicNodeScope({
1177
1307
  scope,
1178
1308
  nodeType: "belief",
@@ -1188,11 +1318,10 @@ var internalCreate = internalMutation({
1188
1318
  },
1189
1319
  mutationName: "epistemicBeliefs.internalCreate"
1190
1320
  });
1191
- const topic = await ctx.db.get(scope.topicId);
1192
1321
  const normalizedBeliefType = await assertSchemaEnumValue(ctx, {
1193
1322
  category: "belief_type",
1194
1323
  value: args.beliefType,
1195
- tenantId: topic?.tenantId,
1324
+ tenantId: scope.tenantId,
1196
1325
  context: "epistemicBeliefs.internalCreate"
1197
1326
  });
1198
1327
  const globalId = generateGlobalId();
@@ -1256,9 +1385,15 @@ var internalCreate = internalMutation({
1256
1385
  rationale: "LKC-2 mandatory prior: seeded vacuous opinion at belief creation.",
1257
1386
  assessedBy: args.userId,
1258
1387
  assessedAt: now,
1259
- slOperator: "manual_assessment"
1388
+ slOperator: "prior_seed"
1260
1389
  })
1261
1390
  );
1391
+ await createRequiredBeliefTopicEdge(ctx, {
1392
+ beliefNodeId: nodeId,
1393
+ beliefGlobalId: globalId,
1394
+ topicNode,
1395
+ createdBy: args.userId
1396
+ });
1262
1397
  await ctx.scheduler.runAfter(0, internal.neo4jSync.syncNodeToNeo4j, {
1263
1398
  nodeId,
1264
1399
  operation: "upsert"