@lucern/graph-primitives 1.0.22 → 1.0.24

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 (136) hide show
  1. package/dist/beliefDecay.js +49 -0
  2. package/dist/beliefDecay.js.map +1 -1
  3. package/dist/beliefEvidenceLinks.js +99 -5
  4. package/dist/beliefEvidenceLinks.js.map +1 -1
  5. package/dist/beliefEvidenceLinks.operational.js +50 -5
  6. package/dist/beliefEvidenceLinks.operational.js.map +1 -1
  7. package/dist/contradictions.js +46 -0
  8. package/dist/contradictions.js.map +1 -1
  9. package/dist/edgeValidation.js +66 -1
  10. package/dist/edgeValidation.js.map +1 -1
  11. package/dist/entityBridge.js +66 -1
  12. package/dist/entityBridge.js.map +1 -1
  13. package/dist/entityCanonicalMatch.d.ts +40 -0
  14. package/dist/entityCanonicalMatch.js +33 -0
  15. package/dist/entityCanonicalMatch.js.map +1 -0
  16. package/dist/entityLifecycle.js +149 -39
  17. package/dist/entityLifecycle.js.map +1 -1
  18. package/dist/epistemicAnswers.js +64 -11
  19. package/dist/epistemicAnswers.js.map +1 -1
  20. package/dist/epistemicBeliefs.admin.js +63 -6
  21. package/dist/epistemicBeliefs.admin.js.map +1 -1
  22. package/dist/epistemicBeliefs.backfills.js +59 -2
  23. package/dist/epistemicBeliefs.backfills.js.map +1 -1
  24. package/dist/epistemicBeliefs.confidence.d.ts +1 -1
  25. package/dist/epistemicBeliefs.confidence.js +70 -12
  26. package/dist/epistemicBeliefs.confidence.js.map +1 -1
  27. package/dist/epistemicBeliefs.core.js +120 -17
  28. package/dist/epistemicBeliefs.core.js.map +1 -1
  29. package/dist/epistemicBeliefs.d.ts +1 -1
  30. package/dist/epistemicBeliefs.forkEvidence.js +13 -2
  31. package/dist/epistemicBeliefs.forkEvidence.js.map +1 -1
  32. package/dist/epistemicBeliefs.helpers.d.ts +18 -3
  33. package/dist/epistemicBeliefs.helpers.js +66 -6
  34. package/dist/epistemicBeliefs.helpers.js.map +1 -1
  35. package/dist/epistemicBeliefs.internal.js +115 -12
  36. package/dist/epistemicBeliefs.internal.js.map +1 -1
  37. package/dist/epistemicBeliefs.js +132 -28
  38. package/dist/epistemicBeliefs.js.map +1 -1
  39. package/dist/epistemicBeliefs.lifecycle.js +70 -12
  40. package/dist/epistemicBeliefs.lifecycle.js.map +1 -1
  41. package/dist/epistemicBeliefs.links.js +111 -10
  42. package/dist/epistemicBeliefs.links.js.map +1 -1
  43. package/dist/epistemicBeliefs.topicAnchor.js +48 -8
  44. package/dist/epistemicBeliefs.topicAnchor.js.map +1 -1
  45. package/dist/epistemicContracts.evaluators.js +70 -12
  46. package/dist/epistemicContracts.evaluators.js.map +1 -1
  47. package/dist/epistemicContracts.handlers.js +71 -16
  48. package/dist/epistemicContracts.handlers.js.map +1 -1
  49. package/dist/epistemicContracts.js +71 -16
  50. package/dist/epistemicContracts.js.map +1 -1
  51. package/dist/epistemicEdges.d.ts +1 -1
  52. package/dist/epistemicEdges.handlers.js +57 -3
  53. package/dist/epistemicEdges.handlers.js.map +1 -1
  54. package/dist/epistemicEdges.helpers.d.ts +2 -2
  55. package/dist/epistemicEdges.js +174 -4
  56. package/dist/epistemicEdges.js.map +1 -1
  57. package/dist/epistemicEdges.mutations.js +115 -1
  58. package/dist/epistemicEdges.mutations.js.map +1 -1
  59. package/dist/epistemicEdges.queries.js +46 -0
  60. package/dist/epistemicEdges.queries.js.map +1 -1
  61. package/dist/epistemicEdges.types.d.ts +1 -1
  62. package/dist/epistemicEvidence.d.ts +1 -1
  63. package/dist/epistemicEvidence.js +180 -14
  64. package/dist/epistemicEvidence.js.map +1 -1
  65. package/dist/epistemicEvidenceHelpers.d.ts +1 -1
  66. package/dist/epistemicEvidenceHelpers.js +49 -0
  67. package/dist/epistemicEvidenceHelpers.js.map +1 -1
  68. package/dist/epistemicEvidenceMutations.js +180 -14
  69. package/dist/epistemicEvidenceMutations.js.map +1 -1
  70. package/dist/epistemicEvidenceQueries.js +49 -0
  71. package/dist/epistemicEvidenceQueries.js.map +1 -1
  72. package/dist/epistemicHelpers.js +11 -6
  73. package/dist/epistemicHelpers.js.map +1 -1
  74. package/dist/epistemicInsert.d.ts +8 -0
  75. package/dist/epistemicInsert.js +54 -0
  76. package/dist/epistemicInsert.js.map +1 -0
  77. package/dist/epistemicNodeCreation.js +11 -6
  78. package/dist/epistemicNodeCreation.js.map +1 -1
  79. package/dist/epistemicNodes.helpers.d.ts +1 -1
  80. package/dist/epistemicNodes.internal.js +53 -1
  81. package/dist/epistemicNodes.internal.js.map +1 -1
  82. package/dist/epistemicNodes.js +56 -4
  83. package/dist/epistemicNodes.js.map +1 -1
  84. package/dist/epistemicNodes.mutations.js +55 -3
  85. package/dist/epistemicNodes.mutations.js.map +1 -1
  86. package/dist/epistemicNodes.queries.js +46 -0
  87. package/dist/epistemicNodes.queries.js.map +1 -1
  88. package/dist/epistemicNodes.validators.d.ts +1 -1
  89. package/dist/epistemicQuestions.conviction.js +49 -0
  90. package/dist/epistemicQuestions.conviction.js.map +1 -1
  91. package/dist/epistemicQuestions.create.js +61 -7
  92. package/dist/epistemicQuestions.create.js.map +1 -1
  93. package/dist/epistemicQuestions.d.ts +1 -1
  94. package/dist/epistemicQuestions.evidence.js +56 -2
  95. package/dist/epistemicQuestions.evidence.js.map +1 -1
  96. package/dist/epistemicQuestions.helpers.d.ts +1 -1
  97. package/dist/epistemicQuestions.helpers.js +49 -0
  98. package/dist/epistemicQuestions.helpers.js.map +1 -1
  99. package/dist/epistemicQuestions.js +63 -9
  100. package/dist/epistemicQuestions.js.map +1 -1
  101. package/dist/epistemicQuestions.lifecycle.js +49 -0
  102. package/dist/epistemicQuestions.lifecycle.js.map +1 -1
  103. package/dist/epistemicQuestions.queries.js +49 -0
  104. package/dist/epistemicQuestions.queries.js.map +1 -1
  105. package/dist/epistemicQuestions.sprint.js +46 -0
  106. package/dist/epistemicQuestions.sprint.js.map +1 -1
  107. package/dist/epistemicQuestions.tail.js +56 -2
  108. package/dist/epistemicQuestions.tail.js.map +1 -1
  109. package/dist/epistemicSources.js +53 -2
  110. package/dist/epistemicSources.js.map +1 -1
  111. package/dist/helpers.js +66 -1
  112. package/dist/helpers.js.map +1 -1
  113. package/dist/index.d.ts +1 -1
  114. package/dist/index.js +379 -115
  115. package/dist/index.js.map +1 -1
  116. package/dist/proof-attestation.json +1 -1
  117. package/dist/questionEvidenceLinks.js +49 -0
  118. package/dist/questionEvidenceLinks.js.map +1 -1
  119. package/dist/resolvers.js +3 -0
  120. package/dist/resolvers.js.map +1 -1
  121. package/dist/scopeResolverCompat.d.ts +1 -1
  122. package/dist/scopeResolverCompat.js +46 -0
  123. package/dist/scopeResolverCompat.js.map +1 -1
  124. package/dist/topicProjectOverlay.d.ts +4 -0
  125. package/dist/topicProjectOverlay.js +3 -0
  126. package/dist/topicProjectOverlay.js.map +1 -1
  127. package/dist/{topicScope-By_zp4tt.d.ts → topicScope-7zhyeGl7.d.ts} +1 -1
  128. package/dist/topicScope.d.ts +1 -1
  129. package/dist/topicScope.js +46 -0
  130. package/dist/topicScope.js.map +1 -1
  131. package/dist/workflowBridge.js +46 -0
  132. package/dist/workflowBridge.js.map +1 -1
  133. package/dist/workspaceIsolation.d.ts +1 -1
  134. package/dist/workspaceIsolation.js +46 -0
  135. package/dist/workspaceIsolation.js.map +1 -1
  136. package/package.json +4 -4
@@ -1,4 +1,4 @@
1
- import { v } from 'convex/values';
1
+ import { v, ConvexError } from 'convex/values';
2
2
  import { normalizeTupleContradictionPolicy, mkOpinion, createInheritedContractRecord, confidenceFromSL, conditionalDeduction, project, dampedDependencyCascade, hasProjectedOpinionChanged, detectTupleContradiction, evaluateTupleContradictionTransition, readOpinionFromRecord, trustDiscount, applyNegativeSupport, cumulativeFusion, applyNegativeEvidence } from '@lucern/confidence';
3
3
  import { checkScopeAccess, checkProjectAccess } from '@lucern/access-control/access';
4
4
  import { canAudienceClassAccess, normalizeAudienceKey, classFromAudienceKey } from '@lucern/access-control/audience';
@@ -7,7 +7,8 @@ import { componentsGeneric, anyApi, internalMutationGeneric, mutationGeneric, qu
7
7
  import { isNodeType, getLayerForNodeType } from '@lucern/contracts/schema-helpers/spine/tables/epistemicNodes';
8
8
  import { permissiveReturn } from '@lucern/contracts/schema-helpers/validators';
9
9
  import { assertSchemaEnumValue } from '@lucern/contracts/schema-helpers/enumValidation';
10
- import { generateGlobalId, generateUuidV7 } from '@lucern/contracts/ids';
10
+ import { generateGlobalId, assertUuidV7Identity, generateUuidV7, assertStorageEdgeVocabulary, assertUuidShapedEdgeEndpoint } from '@lucern/contracts/ids';
11
+ import { assertEdgePolicyAllowed, edgePolicyManifest } from '@lucern/contracts';
11
12
  import { listAudienceRegistryRows } from '@lucern/access-control/audienceRegistry';
12
13
 
13
14
  // src/epistemicBeliefs.helpers.ts
@@ -285,6 +286,9 @@ function materializeTopicProjectOverlay(topic, idMode = "legacy") {
285
286
  type: mapProjectType(topic, metadata),
286
287
  description: readNonEmptyString(topic.description),
287
288
  ownerId: readNonEmptyString(metadata.ownerId) || readNonEmptyString(topic.createdBy) || "system",
289
+ // FR.7 creator-grant: surface the principal-shaped owner field (column-first,
290
+ // metadata fallback for legacy rows that recorded it in metadata).
291
+ ownerPrincipalId: readNonEmptyString(topic.ownerPrincipalId) || readNonEmptyString(metadata.ownerPrincipalId),
288
292
  sharedWith: readStringArray(metadata.sharedWith),
289
293
  visibility,
290
294
  tenantId: readNonEmptyString(topic.tenantId) || readNonEmptyString(metadata.tenantId),
@@ -479,6 +483,35 @@ function resolveGraphPrimitivesAppResolvers(_ctx) {
479
483
  };
480
484
  }
481
485
  var LEGACY_SCOPE_FIELD2 = "graphScopeProjectId";
486
+ async function resolveTopicNodeScopeOrNull(ctx, ref) {
487
+ if (!ctx?.db || typeof ctx.db.query !== "function") {
488
+ return null;
489
+ }
490
+ let node = null;
491
+ try {
492
+ const byGlobalId = await ctx.db.query("epistemicNodes").withIndex("by_globalId", (q) => q.eq("globalId", ref)).first();
493
+ if (byGlobalId && byGlobalId.nodeType === "topic") {
494
+ node = byGlobalId;
495
+ }
496
+ } catch (error) {
497
+ debugGraphPrimitiveFallback(
498
+ "[topicScope] topic-node scope lookup by globalId failed",
499
+ { error, ref }
500
+ );
501
+ }
502
+ if (!node) {
503
+ return null;
504
+ }
505
+ const scopeKey = normalizeScopeValue(node.topicId) ?? normalizeScopeValue(node.globalId);
506
+ if (!scopeKey) {
507
+ return null;
508
+ }
509
+ return {
510
+ topicId: scopeKey,
511
+ projectId: asMappedProjectId(node),
512
+ source: "topic_node"
513
+ };
514
+ }
482
515
  function asMappedProjectId(topic) {
483
516
  if (!topic) {
484
517
  return;
@@ -619,6 +652,13 @@ async function resolveTopicProjectScope(ctx, args) {
619
652
  ) ?? null;
620
653
  }
621
654
  if (!topic) {
655
+ const nodeScope = await resolveTopicNodeScopeOrNull(
656
+ ctx,
657
+ String(args.topicId)
658
+ );
659
+ if (nodeScope) {
660
+ return nodeScope;
661
+ }
622
662
  throw new Error(`Topic not found: ${String(args.topicId)}`);
623
663
  }
624
664
  const inherited = await resolveInheritedWorkspaceScope(ctx, topic);
@@ -689,6 +729,16 @@ async function resolveTopicProjectScope(ctx, args) {
689
729
  source: "project_mapped_topic"
690
730
  };
691
731
  }
732
+ const nodeScope = await resolveTopicNodeScopeOrNull(
733
+ ctx,
734
+ String(args.projectId)
735
+ );
736
+ if (nodeScope) {
737
+ return {
738
+ ...nodeScope,
739
+ projectId: nodeScope.projectId ?? String(args.projectId)
740
+ };
741
+ }
692
742
  throw new Error(
693
743
  `Legacy project scope ${String(args.projectId)} has no mapped topic.`
694
744
  );
@@ -860,7 +910,18 @@ var DEFAULT_CONFIDENCE_POLICY = {
860
910
  tupleContradiction: normalizeTupleContradictionPolicy()
861
911
  };
862
912
  function throwStructuredMutationError(args) {
863
- const error = new Error(args.message);
913
+ const data = {
914
+ structuredMutationError: true,
915
+ message: args.message,
916
+ status: args.status,
917
+ code: args.code,
918
+ invariantCode: args.invariantCode,
919
+ suggestion: args.suggestion,
920
+ details: args.details
921
+ };
922
+ const error = new ConvexError(
923
+ data
924
+ );
864
925
  error.status = args.status;
865
926
  error.code = args.code;
866
927
  error.invariantCode = args.invariantCode;
@@ -1209,12 +1270,12 @@ async function requireProjectWriteAccess(ctx, projectId, userId) {
1209
1270
  );
1210
1271
  if (!hasAccess) {
1211
1272
  throwStructuredMutationError({
1212
- message: "Project access required.",
1273
+ message: `Project write access denied for topic ${projectId}.`,
1213
1274
  status: 403,
1214
- code: "FORBIDDEN",
1275
+ code: "PROJECT_ACCESS_DENIED",
1215
1276
  invariantCode: "policy.scope_required",
1216
- suggestion: "Request write access for the project and retry.",
1217
- details: { projectId, userId }
1277
+ suggestion: "The acting principal lacks project-write access to this topic. Request a topic grant (or, if the principal created this topic, run the creator-grant backfill) and retry.",
1278
+ details: { topicId: projectId, principalId: userId }
1218
1279
  });
1219
1280
  }
1220
1281
  }
@@ -1870,14 +1931,14 @@ async function applyBeliefConfidenceChange(ctx, args) {
1870
1931
  beliefConfidenceId
1871
1932
  };
1872
1933
  }
1873
- function propagationTriggerForEdge(edgeType, weight) {
1934
+ function propagationPressureLabel(edgeType, weight) {
1874
1935
  if (edgeType === "contradicts" || edgeType === "refutes") {
1875
- return "contradiction_detected";
1936
+ return "contradictory";
1876
1937
  }
1877
1938
  if ((edgeType === "supports" || edgeType === "informs") && weight < 0) {
1878
- return "contradiction_detected";
1939
+ return "contradictory";
1879
1940
  }
1880
- return "evidence_added";
1941
+ return "supportive";
1881
1942
  }
1882
1943
  var propagateConfidenceChange = internalMutation({
1883
1944
  args: {
@@ -1914,14 +1975,15 @@ var propagateConfidenceChange = internalMutation({
1914
1975
  getNode: async (nodeId) => await ctx.db.get(nodeId)
1915
1976
  });
1916
1977
  for (const dispatch of dispatches) {
1978
+ const pressureLabel = propagationPressureLabel(dispatch.edgeType, dispatch.weight);
1917
1979
  await applyBeliefConfidenceChange(ctx, {
1918
1980
  nodeId: dispatch.targetNodeId,
1919
1981
  belief: dispatch.opinion.b,
1920
1982
  disbelief: dispatch.opinion.d,
1921
1983
  uncertainty: dispatch.opinion.u,
1922
1984
  baseRate: dispatch.opinion.a,
1923
- trigger: propagationTriggerForEdge(dispatch.edgeType, dispatch.weight),
1924
- rationale: `SL propagation via ${dispatch.edgeType} edge: ${dispatch.rationale}`,
1985
+ trigger: "propagation",
1986
+ rationale: `SL propagation via ${dispatch.edgeType} edge (pressure: ${pressureLabel}): ${dispatch.rationale}`,
1925
1987
  authenticatedUserId: args.userId,
1926
1988
  slOperator: dispatch.operator
1927
1989
  });
@@ -2033,6 +2095,52 @@ async function resolveForkTriggerEvidence(ctx, args) {
2033
2095
  }
2034
2096
  return { evidenceNodeId: args.triggeringEvidenceId, relation };
2035
2097
  }
2098
+ async function insertEpistemicNode(ctx, doc) {
2099
+ assertUuidV7Identity("epistemicNodes", doc.globalId);
2100
+ return ctx.db.insert("epistemicNodes", doc);
2101
+ }
2102
+ async function assertExistingNodeEndpoint(ctx, endpointRole, endpoint) {
2103
+ assertUuidShapedEdgeEndpoint(endpointRole, endpoint);
2104
+ const node = await ctx.db.query("epistemicNodes").withIndex("by_globalId", (q) => q.eq("globalId", endpoint)).first();
2105
+ if (!node) {
2106
+ throw new Error(
2107
+ `edge_endpoint_not_canonical: epistemicEdges insert requires ${endpointRole} to be the globalId of an existing epistemicNodes row, received ${endpoint} (no node with that globalId)`
2108
+ );
2109
+ }
2110
+ }
2111
+ async function insertEpistemicEdge(ctx, doc) {
2112
+ assertUuidV7Identity("epistemicEdges", doc.globalId);
2113
+ assertStorageEdgeVocabulary(doc.edgeType);
2114
+ if (!doc.fromNodeId || typeof doc.fromNodeId !== "string") {
2115
+ throw new Error(
2116
+ "edge_endpoint_missing: epistemicEdges insert requires a non-empty fromNodeId"
2117
+ );
2118
+ }
2119
+ if (!doc.toNodeId || typeof doc.toNodeId !== "string") {
2120
+ throw new Error(
2121
+ "edge_endpoint_missing: epistemicEdges insert requires a non-empty toNodeId"
2122
+ );
2123
+ }
2124
+ await assertExistingNodeEndpoint(ctx, "fromNodeId", doc.fromNodeId);
2125
+ await assertExistingNodeEndpoint(ctx, "toNodeId", doc.toNodeId);
2126
+ if (doc.fromNodeType && doc.toNodeType && doc.edgeType !== "extracted_from") {
2127
+ assertEdgePolicyAllowed(
2128
+ edgePolicyManifest,
2129
+ doc.edgeType,
2130
+ {
2131
+ kind: "epistemic_node",
2132
+ nodeId: doc.fromNodeId,
2133
+ nodeType: doc.fromNodeType
2134
+ },
2135
+ {
2136
+ kind: "epistemic_node",
2137
+ nodeId: doc.toNodeId,
2138
+ nodeType: doc.toNodeType
2139
+ }
2140
+ );
2141
+ }
2142
+ return ctx.db.insert("epistemicEdges", doc);
2143
+ }
2036
2144
 
2037
2145
  // src/epistemicBeliefs.topicAnchor.ts
2038
2146
  function cleanString(value) {
@@ -2084,18 +2192,15 @@ async function createRequiredBeliefTopicEdge(ctx, args) {
2084
2192
  const now = Date.now();
2085
2193
  const existingEdges = await ctx.db.query("epistemicEdges").withIndex(
2086
2194
  "by_from_to",
2087
- (q) => q.eq("fromNodeId", String(args.beliefNodeId)).eq(
2088
- "toNodeId",
2089
- String(args.topicNode._id)
2090
- )
2195
+ (q) => q.eq("fromNodeId", args.beliefGlobalId).eq("toNodeId", topicGlobalId)
2091
2196
  ).collect();
2092
2197
  const existing = existingEdges.find((edge) => edge.edgeType === "belongs_to");
2093
2198
  const edgeGlobalId = cleanString(existing?.globalId) ?? generateUuidV7();
2094
2199
  if (!existing) {
2095
- await ctx.db.insert("epistemicEdges", {
2200
+ await insertEpistemicEdge(ctx, {
2096
2201
  globalId: edgeGlobalId,
2097
- fromNodeId: String(args.beliefNodeId),
2098
- toNodeId: String(args.topicNode._id),
2202
+ fromNodeId: args.beliefGlobalId,
2203
+ toNodeId: topicGlobalId,
2099
2204
  sourceGlobalId: args.beliefGlobalId,
2100
2205
  targetGlobalId: topicGlobalId,
2101
2206
  edgeType: "belongs_to",
@@ -2274,7 +2379,7 @@ var create = mutation({
2274
2379
  const pillar = normalizePillar(args.pillar);
2275
2380
  const additionalMeta = args.metadata || {};
2276
2381
  const beliefGlobalId = generateGlobalId();
2277
- const nodeId = await ctx.db.insert("epistemicNodes", {
2382
+ const nodeId = await insertEpistemicNode(ctx, {
2278
2383
  globalId: beliefGlobalId,
2279
2384
  nodeType: "belief",
2280
2385
  epistemicLayer: "L3",
@@ -2332,7 +2437,6 @@ var create = mutation({
2332
2437
  })
2333
2438
  );
2334
2439
  await createRequiredBeliefTopicEdge(ctx, {
2335
- beliefNodeId: nodeId,
2336
2440
  beliefGlobalId,
2337
2441
  topicNode,
2338
2442
  createdBy: authenticatedUserId
@@ -2747,7 +2851,7 @@ var forkBelief = mutation({
2747
2851
  });
2748
2852
  }
2749
2853
  const newBeliefGlobalId = generateGlobalId();
2750
- const newNodeId = await ctx.db.insert("epistemicNodes", {
2854
+ const newNodeId = await insertEpistemicNode(ctx, {
2751
2855
  globalId: newBeliefGlobalId,
2752
2856
  nodeType: "belief",
2753
2857
  epistemicLayer: "L3",
@@ -3531,10 +3635,11 @@ var linkEvidence = mutation({
3531
3635
  const edgeType = "informs";
3532
3636
  const logicalRole = evidenceNodeId ? await computeLogicalRole(ctx, evidenceNodeId, args.beliefNodeId) : "contributory";
3533
3637
  const edgeGlobalId = generateGlobalId();
3534
- await ctx.db.insert("epistemicEdges", {
3638
+ await insertEpistemicEdge(ctx, {
3535
3639
  globalId: edgeGlobalId,
3536
- fromNodeId: evidenceNodeId,
3537
- toNodeId: args.beliefNodeId,
3640
+ // C2-RR.4 Defect E — canonical UUIDv7 endpoints, not Convex doc ids.
3641
+ fromNodeId: evidenceGlobalId,
3642
+ toNodeId: belief.globalId,
3538
3643
  sourceGlobalId: evidenceGlobalId,
3539
3644
  targetGlobalId: belief.globalId,
3540
3645
  edgeType,
@@ -4330,7 +4435,7 @@ var internalCreate = internalMutation({
4330
4435
  opinion_u: 1,
4331
4436
  opinion_a: baseRate
4332
4437
  };
4333
- const nodeId = await ctx.db.insert("epistemicNodes", {
4438
+ const nodeId = await insertEpistemicNode(ctx, {
4334
4439
  globalId,
4335
4440
  topicId: scope.topicId,
4336
4441
  projectId: scope.projectId,
@@ -4386,7 +4491,6 @@ var internalCreate = internalMutation({
4386
4491
  })
4387
4492
  );
4388
4493
  await createRequiredBeliefTopicEdge(ctx, {
4389
- beliefNodeId: nodeId,
4390
4494
  beliefGlobalId: globalId,
4391
4495
  topicNode,
4392
4496
  createdBy: args.userId