@lucern/graph-primitives 1.0.22 → 1.0.23

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 (127) hide show
  1. package/dist/beliefDecay.js +46 -0
  2. package/dist/beliefDecay.js.map +1 -1
  3. package/dist/beliefEvidenceLinks.js +87 -5
  4. package/dist/beliefEvidenceLinks.js.map +1 -1
  5. package/dist/beliefEvidenceLinks.operational.js +41 -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/entityLifecycle.js +90 -5
  14. package/dist/entityLifecycle.js.map +1 -1
  15. package/dist/epistemicAnswers.js +64 -11
  16. package/dist/epistemicAnswers.js.map +1 -1
  17. package/dist/epistemicBeliefs.admin.js +46 -0
  18. package/dist/epistemicBeliefs.admin.js.map +1 -1
  19. package/dist/epistemicBeliefs.backfills.js +46 -0
  20. package/dist/epistemicBeliefs.backfills.js.map +1 -1
  21. package/dist/epistemicBeliefs.confidence.d.ts +1 -1
  22. package/dist/epistemicBeliefs.confidence.js +53 -6
  23. package/dist/epistemicBeliefs.confidence.js.map +1 -1
  24. package/dist/epistemicBeliefs.core.js +91 -11
  25. package/dist/epistemicBeliefs.core.js.map +1 -1
  26. package/dist/epistemicBeliefs.d.ts +1 -1
  27. package/dist/epistemicBeliefs.forkEvidence.js.map +1 -1
  28. package/dist/epistemicBeliefs.helpers.d.ts +2 -2
  29. package/dist/epistemicBeliefs.helpers.js +46 -0
  30. package/dist/epistemicBeliefs.helpers.js.map +1 -1
  31. package/dist/epistemicBeliefs.internal.js +90 -10
  32. package/dist/epistemicBeliefs.internal.js.map +1 -1
  33. package/dist/epistemicBeliefs.js +103 -22
  34. package/dist/epistemicBeliefs.js.map +1 -1
  35. package/dist/epistemicBeliefs.lifecycle.js +53 -6
  36. package/dist/epistemicBeliefs.lifecycle.js.map +1 -1
  37. package/dist/epistemicBeliefs.links.js +85 -4
  38. package/dist/epistemicBeliefs.links.js.map +1 -1
  39. package/dist/epistemicBeliefs.topicAnchor.js +39 -8
  40. package/dist/epistemicBeliefs.topicAnchor.js.map +1 -1
  41. package/dist/epistemicContracts.evaluators.js +53 -6
  42. package/dist/epistemicContracts.evaluators.js.map +1 -1
  43. package/dist/epistemicContracts.handlers.js +54 -10
  44. package/dist/epistemicContracts.handlers.js.map +1 -1
  45. package/dist/epistemicContracts.js +54 -10
  46. package/dist/epistemicContracts.js.map +1 -1
  47. package/dist/epistemicEdges.d.ts +1 -1
  48. package/dist/epistemicEdges.handlers.js +48 -3
  49. package/dist/epistemicEdges.handlers.js.map +1 -1
  50. package/dist/epistemicEdges.helpers.d.ts +3 -3
  51. package/dist/epistemicEdges.js +162 -4
  52. package/dist/epistemicEdges.js.map +1 -1
  53. package/dist/epistemicEdges.mutations.js +112 -1
  54. package/dist/epistemicEdges.mutations.js.map +1 -1
  55. package/dist/epistemicEdges.queries.js +46 -0
  56. package/dist/epistemicEdges.queries.js.map +1 -1
  57. package/dist/epistemicEdges.types.d.ts +1 -1
  58. package/dist/epistemicEvidence.d.ts +1 -1
  59. package/dist/epistemicEvidence.js +168 -14
  60. package/dist/epistemicEvidence.js.map +1 -1
  61. package/dist/epistemicEvidenceHelpers.d.ts +1 -1
  62. package/dist/epistemicEvidenceHelpers.js +46 -0
  63. package/dist/epistemicEvidenceHelpers.js.map +1 -1
  64. package/dist/epistemicEvidenceMutations.js +168 -14
  65. package/dist/epistemicEvidenceMutations.js.map +1 -1
  66. package/dist/epistemicEvidenceQueries.js +46 -0
  67. package/dist/epistemicEvidenceQueries.js.map +1 -1
  68. package/dist/epistemicHelpers.js +11 -6
  69. package/dist/epistemicHelpers.js.map +1 -1
  70. package/dist/epistemicInsert.d.ts +8 -0
  71. package/dist/epistemicInsert.js +45 -0
  72. package/dist/epistemicInsert.js.map +1 -0
  73. package/dist/epistemicNodeCreation.js +11 -6
  74. package/dist/epistemicNodeCreation.js.map +1 -1
  75. package/dist/epistemicNodes.helpers.d.ts +1 -1
  76. package/dist/epistemicNodes.internal.js +53 -1
  77. package/dist/epistemicNodes.internal.js.map +1 -1
  78. package/dist/epistemicNodes.js +56 -4
  79. package/dist/epistemicNodes.js.map +1 -1
  80. package/dist/epistemicNodes.mutations.js +55 -3
  81. package/dist/epistemicNodes.mutations.js.map +1 -1
  82. package/dist/epistemicNodes.queries.js +46 -0
  83. package/dist/epistemicNodes.queries.js.map +1 -1
  84. package/dist/epistemicNodes.validators.d.ts +1 -1
  85. package/dist/epistemicQuestions.conviction.js +46 -0
  86. package/dist/epistemicQuestions.conviction.js.map +1 -1
  87. package/dist/epistemicQuestions.create.js +58 -7
  88. package/dist/epistemicQuestions.create.js.map +1 -1
  89. package/dist/epistemicQuestions.d.ts +1 -1
  90. package/dist/epistemicQuestions.evidence.js +53 -2
  91. package/dist/epistemicQuestions.evidence.js.map +1 -1
  92. package/dist/epistemicQuestions.helpers.d.ts +1 -1
  93. package/dist/epistemicQuestions.helpers.js +46 -0
  94. package/dist/epistemicQuestions.helpers.js.map +1 -1
  95. package/dist/epistemicQuestions.js +60 -9
  96. package/dist/epistemicQuestions.js.map +1 -1
  97. package/dist/epistemicQuestions.lifecycle.js +46 -0
  98. package/dist/epistemicQuestions.lifecycle.js.map +1 -1
  99. package/dist/epistemicQuestions.queries.js +46 -0
  100. package/dist/epistemicQuestions.queries.js.map +1 -1
  101. package/dist/epistemicQuestions.sprint.js +46 -0
  102. package/dist/epistemicQuestions.sprint.js.map +1 -1
  103. package/dist/epistemicQuestions.tail.js +53 -2
  104. package/dist/epistemicQuestions.tail.js.map +1 -1
  105. package/dist/epistemicSources.js +53 -2
  106. package/dist/epistemicSources.js.map +1 -1
  107. package/dist/helpers.js +66 -1
  108. package/dist/helpers.js.map +1 -1
  109. package/dist/index.d.ts +1 -1
  110. package/dist/index.js +304 -76
  111. package/dist/index.js.map +1 -1
  112. package/dist/proof-attestation.json +1 -1
  113. package/dist/questionEvidenceLinks.js +46 -0
  114. package/dist/questionEvidenceLinks.js.map +1 -1
  115. package/dist/scopeResolverCompat.d.ts +1 -1
  116. package/dist/scopeResolverCompat.js +46 -0
  117. package/dist/scopeResolverCompat.js.map +1 -1
  118. package/dist/{topicScope-By_zp4tt.d.ts → topicScope-7zhyeGl7.d.ts} +1 -1
  119. package/dist/topicScope.d.ts +1 -1
  120. package/dist/topicScope.js +46 -0
  121. package/dist/topicScope.js.map +1 -1
  122. package/dist/workflowBridge.js +46 -0
  123. package/dist/workflowBridge.js.map +1 -1
  124. package/dist/workspaceIsolation.d.ts +1 -1
  125. package/dist/workspaceIsolation.js +46 -0
  126. package/dist/workspaceIsolation.js.map +1 -1
  127. package/package.json +4 -4
@@ -3,8 +3,9 @@ import { componentsGeneric, anyApi, mutationGeneric, internalMutationGeneric, qu
3
3
  import { v } from 'convex/values';
4
4
  import { requireProjectAccess, checkProjectAccess, checkScopeAccess } from '@lucern/access-control/access';
5
5
  import { permissiveReturn } from '@lucern/contracts/schema-helpers/validators';
6
- import { generateGlobalId } from '@lucern/contracts/ids';
6
+ import { generateGlobalId, assertUuidV7Identity, assertStorageEdgeVocabulary, assertCanonicalEdgeEndpoint } from '@lucern/contracts/ids';
7
7
  import { isNodeType, getLayerForNodeType } from '@lucern/contracts/schema-helpers/spine/tables/epistemicNodes';
8
+ import { assertEdgePolicyAllowed, edgePolicyManifest } from '@lucern/contracts';
8
9
  import { listAudienceRegistryRows } from '@lucern/access-control/audienceRegistry';
9
10
 
10
11
  // src/epistemicEvidenceHelpers.ts
@@ -355,6 +356,35 @@ function resolveGraphPrimitivesAppResolvers(_ctx) {
355
356
  };
356
357
  }
357
358
  var LEGACY_SCOPE_FIELD2 = "graphScopeProjectId";
359
+ async function resolveTopicNodeScopeOrNull(ctx, ref) {
360
+ if (!ctx?.db || typeof ctx.db.query !== "function") {
361
+ return null;
362
+ }
363
+ let node = null;
364
+ try {
365
+ const byGlobalId = await ctx.db.query("epistemicNodes").withIndex("by_globalId", (q) => q.eq("globalId", ref)).first();
366
+ if (byGlobalId && byGlobalId.nodeType === "topic") {
367
+ node = byGlobalId;
368
+ }
369
+ } catch (error) {
370
+ debugGraphPrimitiveFallback(
371
+ "[topicScope] topic-node scope lookup by globalId failed",
372
+ { error, ref }
373
+ );
374
+ }
375
+ if (!node) {
376
+ return null;
377
+ }
378
+ const scopeKey = normalizeScopeValue(node.topicId) ?? normalizeScopeValue(node.globalId);
379
+ if (!scopeKey) {
380
+ return null;
381
+ }
382
+ return {
383
+ topicId: scopeKey,
384
+ projectId: asMappedProjectId(node),
385
+ source: "topic_node"
386
+ };
387
+ }
358
388
  function asMappedProjectId(topic) {
359
389
  if (!topic) {
360
390
  return;
@@ -495,6 +525,13 @@ async function resolveTopicProjectScope(ctx, args) {
495
525
  ) ?? null;
496
526
  }
497
527
  if (!topic) {
528
+ const nodeScope = await resolveTopicNodeScopeOrNull(
529
+ ctx,
530
+ String(args.topicId)
531
+ );
532
+ if (nodeScope) {
533
+ return nodeScope;
534
+ }
498
535
  throw new Error(`Topic not found: ${String(args.topicId)}`);
499
536
  }
500
537
  const inherited = await resolveInheritedWorkspaceScope(ctx, topic);
@@ -565,6 +602,16 @@ async function resolveTopicProjectScope(ctx, args) {
565
602
  source: "project_mapped_topic"
566
603
  };
567
604
  }
605
+ const nodeScope = await resolveTopicNodeScopeOrNull(
606
+ ctx,
607
+ String(args.projectId)
608
+ );
609
+ if (nodeScope) {
610
+ return {
611
+ ...nodeScope,
612
+ projectId: nodeScope.projectId ?? String(args.projectId)
613
+ };
614
+ }
568
615
  throw new Error(
569
616
  `Legacy project scope ${String(args.projectId)} has no mapped topic.`
570
617
  );
@@ -894,6 +941,43 @@ function assertTenantPackWorkspaceMutationAllowed(args) {
894
941
  }
895
942
  });
896
943
  }
944
+ async function insertEpistemicNode(ctx, doc) {
945
+ assertUuidV7Identity("epistemicNodes", doc.globalId);
946
+ return ctx.db.insert("epistemicNodes", doc);
947
+ }
948
+ async function insertEpistemicEdge(ctx, doc) {
949
+ assertUuidV7Identity("epistemicEdges", doc.globalId);
950
+ assertStorageEdgeVocabulary(doc.edgeType);
951
+ if (!doc.fromNodeId || typeof doc.fromNodeId !== "string") {
952
+ throw new Error(
953
+ "edge_endpoint_missing: epistemicEdges insert requires a non-empty fromNodeId"
954
+ );
955
+ }
956
+ if (!doc.toNodeId || typeof doc.toNodeId !== "string") {
957
+ throw new Error(
958
+ "edge_endpoint_missing: epistemicEdges insert requires a non-empty toNodeId"
959
+ );
960
+ }
961
+ assertCanonicalEdgeEndpoint("fromNodeId", doc.fromNodeId);
962
+ assertCanonicalEdgeEndpoint("toNodeId", doc.toNodeId);
963
+ if (doc.fromNodeType && doc.toNodeType && doc.edgeType !== "extracted_from") {
964
+ assertEdgePolicyAllowed(
965
+ edgePolicyManifest,
966
+ doc.edgeType,
967
+ {
968
+ kind: "epistemic_node",
969
+ nodeId: doc.fromNodeId,
970
+ nodeType: doc.fromNodeType
971
+ },
972
+ {
973
+ kind: "epistemic_node",
974
+ nodeId: doc.toNodeId,
975
+ nodeType: doc.toNodeType
976
+ }
977
+ );
978
+ }
979
+ return ctx.db.insert("epistemicEdges", doc);
980
+ }
897
981
 
898
982
  // src/epistemicEvidenceMutations.ts
899
983
  function assertSignedImpactScore(value, context) {
@@ -915,17 +999,17 @@ function normalizeEvidenceRelation(relation, weight, context) {
915
999
  return weight < 0 ? "contradicts" : "supports";
916
1000
  }
917
1001
  async function createEvidenceBeliefEdge(ctx, args) {
918
- const edgeGlobalId = crypto.randomUUID();
1002
+ const edgeGlobalId = generateGlobalId();
919
1003
  const confidence = Math.abs(args.weight);
920
1004
  const existingEdges = await ctx.db.query("epistemicEdges").withIndex(
921
1005
  "by_from_to",
922
- (q) => q.eq("fromNodeId", args.evidenceNodeId).eq("toNodeId", args.beliefNodeId)
1006
+ (q) => q.eq("fromNodeId", args.evidenceGlobalId).eq("toNodeId", args.beliefGlobalId)
923
1007
  ).collect();
924
1008
  const existing = existingEdges.find((edge) => edge.edgeType === "informs");
925
1009
  const edgeDoc = {
926
1010
  globalId: edgeGlobalId,
927
- fromNodeId: args.evidenceNodeId,
928
- toNodeId: args.beliefNodeId,
1011
+ fromNodeId: args.evidenceGlobalId,
1012
+ toNodeId: args.beliefGlobalId,
929
1013
  sourceGlobalId: args.evidenceGlobalId,
930
1014
  targetGlobalId: args.beliefGlobalId,
931
1015
  edgeType: "informs",
@@ -957,7 +1041,7 @@ async function createEvidenceBeliefEdge(ctx, args) {
957
1041
  createdAt: existing.createdAt ?? edgeDoc.createdAt
958
1042
  });
959
1043
  } else {
960
- await ctx.db.insert("epistemicEdges", edgeDoc);
1044
+ await insertEpistemicEdge(ctx, edgeDoc);
961
1045
  }
962
1046
  await ctx.scheduler.runAfter(5e3, internal.neo4jEdgeAPI.createEdge, {
963
1047
  globalId: existing?.globalId ?? edgeGlobalId,
@@ -996,10 +1080,23 @@ var create = mutation({
996
1080
  sourceQuestionId: v.optional(v.string()),
997
1081
  userId: v.string(),
998
1082
  rationale: v.string(),
999
- // Classification fields (from AI tools)
1083
+ // RC.1 taxonomy fields — top-level projection (mirroring kernel evidenceCreate.ts)
1084
+ sourceRef: v.optional(v.string()),
1085
+ sourceQuality: v.optional(
1086
+ v.union(
1087
+ v.literal("primary"),
1088
+ v.literal("analyzed"),
1089
+ v.literal("secondary"),
1090
+ v.literal("tertiary"),
1091
+ v.literal("unknown")
1092
+ )
1093
+ ),
1000
1094
  methodology: v.optional(v.string()),
1001
1095
  informationAsymmetry: v.optional(v.string()),
1002
1096
  sourceDescription: v.optional(v.string()),
1097
+ // signedImpact is derived from weight; accepted as an explicit override for
1098
+ // callers that already have the signed value (kernel parity).
1099
+ signedImpact: v.optional(v.number()),
1003
1100
  metadata: v.optional(v.any()),
1004
1101
  // Required belief impact link.
1005
1102
  linkedBeliefNodeId: v.id("epistemicNodes"),
@@ -1029,6 +1126,7 @@ var create = mutation({
1029
1126
  const kind = normalizeKind(args.kind);
1030
1127
  const sourceType = normalizeSourceType(args.sourceType);
1031
1128
  const weight = assertSignedImpactScore(args.weight, "Evidence creation");
1129
+ const signedImpact = args.signedImpact !== void 0 ? assertSignedImpactScore(args.signedImpact, "Evidence creation signedImpact") : weight;
1032
1130
  const evidenceRelation = normalizeEvidenceRelation(
1033
1131
  args.evidenceRelation,
1034
1132
  weight,
@@ -1039,7 +1137,7 @@ var create = mutation({
1039
1137
  throw new Error("Evidence creation requires a linked belief node");
1040
1138
  }
1041
1139
  const additionalMetadata = args.metadata && typeof args.metadata === "object" ? args.metadata : {};
1042
- const nodeId = await ctx.db.insert("epistemicNodes", {
1140
+ const nodeId = await insertEpistemicNode(ctx, {
1043
1141
  globalId,
1044
1142
  topicId: scope.topicId,
1045
1143
  projectId: scope.projectId,
@@ -1054,6 +1152,15 @@ var create = mutation({
1054
1152
  status: "active",
1055
1153
  epistemicLayer: "L2",
1056
1154
  sourceType,
1155
+ // RC.1 taxonomy fields — top-level projection
1156
+ evidenceRelation,
1157
+ signedImpact,
1158
+ targetBeliefId: String(args.linkedBeliefNodeId),
1159
+ ...typeof args.sourceRef === "string" && args.sourceRef.trim().length > 0 ? { sourceRef: args.sourceRef.trim() } : {},
1160
+ ...typeof args.sourceQuality === "string" && args.sourceQuality.length > 0 ? { sourceQuality: args.sourceQuality } : {},
1161
+ ...typeof args.methodology === "string" && args.methodology.length > 0 ? { methodology: args.methodology } : {},
1162
+ ...typeof args.informationAsymmetry === "string" && args.informationAsymmetry.length > 0 ? { informationAsymmetry: args.informationAsymmetry } : {},
1163
+ ...typeof args.sourceDescription === "string" && args.sourceDescription.trim().length > 0 ? { sourceDescription: args.sourceDescription.trim() } : {},
1057
1164
  createdAt: now,
1058
1165
  updatedAt: now,
1059
1166
  createdBy: args.userId,
@@ -1089,7 +1196,6 @@ var create = mutation({
1089
1196
  text: args.text
1090
1197
  });
1091
1198
  await createEvidenceBeliefEdge(ctx, {
1092
- evidenceNodeId: nodeId,
1093
1199
  evidenceGlobalId: globalId,
1094
1200
  beliefNodeId: args.linkedBeliefNodeId,
1095
1201
  beliefGlobalId: linkedBeliefNode.globalId,
@@ -1159,7 +1265,22 @@ var createAndLink = mutation({
1159
1265
  beliefNodeId: v.id("epistemicNodes"),
1160
1266
  relation: v.union(v.literal("supports"), v.literal("contradicts")),
1161
1267
  weight: v.number(),
1162
- confidence: v.optional(v.number())
1268
+ confidence: v.optional(v.number()),
1269
+ // RC.1 taxonomy fields — top-level projection (mirroring kernel evidenceCreate.ts)
1270
+ sourceRef: v.optional(v.string()),
1271
+ sourceQuality: v.optional(
1272
+ v.union(
1273
+ v.literal("primary"),
1274
+ v.literal("analyzed"),
1275
+ v.literal("secondary"),
1276
+ v.literal("tertiary"),
1277
+ v.literal("unknown")
1278
+ )
1279
+ ),
1280
+ methodology: v.optional(v.string()),
1281
+ informationAsymmetry: v.optional(v.string()),
1282
+ sourceDescription: v.optional(v.string()),
1283
+ signedImpact: v.optional(v.number())
1163
1284
  },
1164
1285
  returns: permissiveReturn,
1165
1286
  handler: async (ctx, args) => {
@@ -1174,6 +1295,7 @@ var createAndLink = mutation({
1174
1295
  const kind = normalizeKind(args.kind);
1175
1296
  const sourceType = normalizeSourceType(args.sourceType);
1176
1297
  const weight = assertSignedImpactScore(args.weight, "Evidence createAndLink");
1298
+ const signedImpact = args.signedImpact !== void 0 ? assertSignedImpactScore(args.signedImpact, "Evidence createAndLink signedImpact") : weight;
1177
1299
  const relation = normalizeEvidenceRelation(
1178
1300
  args.relation,
1179
1301
  weight,
@@ -1184,7 +1306,7 @@ var createAndLink = mutation({
1184
1306
  if (!beliefNode || beliefNode.nodeType !== "belief") {
1185
1307
  throw new Error("Belief node not found for edge creation");
1186
1308
  }
1187
- const nodeId = await ctx.db.insert("epistemicNodes", {
1309
+ const nodeId = await insertEpistemicNode(ctx, {
1188
1310
  globalId,
1189
1311
  topicId: scope.topicId,
1190
1312
  projectId: scope.projectId,
@@ -1196,6 +1318,15 @@ var createAndLink = mutation({
1196
1318
  status: "active",
1197
1319
  epistemicLayer: "L2",
1198
1320
  sourceType,
1321
+ // RC.1 taxonomy fields — top-level projection
1322
+ evidenceRelation: relation,
1323
+ signedImpact,
1324
+ targetBeliefId: String(args.beliefNodeId),
1325
+ ...typeof args.sourceRef === "string" && args.sourceRef.trim().length > 0 ? { sourceRef: args.sourceRef.trim() } : {},
1326
+ ...typeof args.sourceQuality === "string" && args.sourceQuality.length > 0 ? { sourceQuality: args.sourceQuality } : {},
1327
+ ...typeof args.methodology === "string" && args.methodology.length > 0 ? { methodology: args.methodology } : {},
1328
+ ...typeof args.informationAsymmetry === "string" && args.informationAsymmetry.length > 0 ? { informationAsymmetry: args.informationAsymmetry } : {},
1329
+ ...typeof args.sourceDescription === "string" && args.sourceDescription.trim().length > 0 ? { sourceDescription: args.sourceDescription.trim() } : {},
1199
1330
  createdAt: now,
1200
1331
  updatedAt: now,
1201
1332
  createdBy: args.userId,
@@ -1214,7 +1345,6 @@ var createAndLink = mutation({
1214
1345
  operation: "upsert"
1215
1346
  });
1216
1347
  const edgeGlobalId = await createEvidenceBeliefEdge(ctx, {
1217
- evidenceNodeId: nodeId,
1218
1348
  evidenceGlobalId: globalId,
1219
1349
  beliefNodeId: args.beliefNodeId,
1220
1350
  beliefGlobalId: beliefNode.globalId,
@@ -1287,6 +1417,21 @@ var internalCreate = internalMutation({
1287
1417
  evidenceRelation: v.optional(v.string()),
1288
1418
  weight: v.number(),
1289
1419
  confidence: v.optional(v.number()),
1420
+ // RC.1 taxonomy fields — top-level projection (mirroring kernel evidenceCreate.ts)
1421
+ sourceRef: v.optional(v.string()),
1422
+ sourceQuality: v.optional(
1423
+ v.union(
1424
+ v.literal("primary"),
1425
+ v.literal("analyzed"),
1426
+ v.literal("secondary"),
1427
+ v.literal("tertiary"),
1428
+ v.literal("unknown")
1429
+ )
1430
+ ),
1431
+ methodology: v.optional(v.string()),
1432
+ informationAsymmetry: v.optional(v.string()),
1433
+ sourceDescription: v.optional(v.string()),
1434
+ signedImpact: v.optional(v.number()),
1290
1435
  metadata: v.optional(v.any()),
1291
1436
  runtimeToolName: v.optional(v.string()),
1292
1437
  runtimePackKey: v.optional(v.string()),
@@ -1321,6 +1466,7 @@ var internalCreate = internalMutation({
1321
1466
  const kind = normalizeKind(args.kind);
1322
1467
  const sourceType = normalizeSourceType(args.sourceType);
1323
1468
  const weight = assertSignedImpactScore(args.weight, "Internal evidence creation");
1469
+ const signedImpact = args.signedImpact !== void 0 ? assertSignedImpactScore(args.signedImpact, "Internal evidence creation signedImpact") : weight;
1324
1470
  const evidenceRelation = normalizeEvidenceRelation(
1325
1471
  args.evidenceRelation,
1326
1472
  weight,
@@ -1331,7 +1477,7 @@ var internalCreate = internalMutation({
1331
1477
  throw new Error("Internal evidence creation requires a linked belief node");
1332
1478
  }
1333
1479
  const additionalMetadata = args.metadata && typeof args.metadata === "object" ? args.metadata : {};
1334
- const nodeId = await ctx.db.insert("epistemicNodes", {
1480
+ const nodeId = await insertEpistemicNode(ctx, {
1335
1481
  globalId,
1336
1482
  topicId: scope.topicId,
1337
1483
  projectId: scope.projectId,
@@ -1346,6 +1492,15 @@ var internalCreate = internalMutation({
1346
1492
  status: "active",
1347
1493
  epistemicLayer: "L2",
1348
1494
  sourceType,
1495
+ // RC.1 taxonomy fields — top-level projection
1496
+ evidenceRelation,
1497
+ signedImpact,
1498
+ targetBeliefId: String(args.linkedBeliefNodeId),
1499
+ ...typeof args.sourceRef === "string" && args.sourceRef.trim().length > 0 ? { sourceRef: args.sourceRef.trim() } : {},
1500
+ ...typeof args.sourceQuality === "string" && args.sourceQuality.length > 0 ? { sourceQuality: args.sourceQuality } : {},
1501
+ ...typeof args.methodology === "string" && args.methodology.length > 0 ? { methodology: args.methodology } : {},
1502
+ ...typeof args.informationAsymmetry === "string" && args.informationAsymmetry.length > 0 ? { informationAsymmetry: args.informationAsymmetry } : {},
1503
+ ...typeof args.sourceDescription === "string" && args.sourceDescription.trim().length > 0 ? { sourceDescription: args.sourceDescription.trim() } : {},
1349
1504
  createdAt: now,
1350
1505
  updatedAt: now,
1351
1506
  createdBy: args.userId,
@@ -1391,7 +1546,6 @@ var internalCreate = internalMutation({
1391
1546
  operation: "upsert"
1392
1547
  });
1393
1548
  await createEvidenceBeliefEdge(ctx, {
1394
- evidenceNodeId: nodeId,
1395
1549
  evidenceGlobalId: globalId,
1396
1550
  beliefNodeId: args.linkedBeliefNodeId,
1397
1551
  beliefGlobalId: linkedBeliefNode.globalId,