@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
@@ -2,9 +2,10 @@ import { v } from 'convex/values';
2
2
  import { requireProjectAccess, checkProjectAccess } from '@lucern/access-control/access';
3
3
  import { permissiveReturn } from '@lucern/contracts/schema-helpers/validators';
4
4
  import { componentsGeneric, anyApi, mutationGeneric, internalMutationGeneric } from 'convex/server';
5
- import { generateGlobalId } from '@lucern/contracts/ids';
5
+ import { generateGlobalId, assertUuidV7Identity, assertStorageEdgeVocabulary, assertCanonicalEdgeEndpoint } from '@lucern/contracts/ids';
6
6
  import { isNodeType, getLayerForNodeType } from '@lucern/contracts/schema-helpers/spine/tables/epistemicNodes';
7
7
  import '@lucern/access-control/audience';
8
+ import { assertEdgePolicyAllowed, edgePolicyManifest } from '@lucern/contracts';
8
9
 
9
10
  // src/epistemicEvidenceMutations.ts
10
11
  var api = anyApi;
@@ -54,6 +55,35 @@ async function scheduleEmbeddingGeneration(args) {
54
55
  }
55
56
  }
56
57
  var LEGACY_SCOPE_FIELD = "graphScopeProjectId";
58
+ async function resolveTopicNodeScopeOrNull(ctx, ref) {
59
+ if (!ctx?.db || typeof ctx.db.query !== "function") {
60
+ return null;
61
+ }
62
+ let node = null;
63
+ try {
64
+ const byGlobalId = await ctx.db.query("epistemicNodes").withIndex("by_globalId", (q) => q.eq("globalId", ref)).first();
65
+ if (byGlobalId && byGlobalId.nodeType === "topic") {
66
+ node = byGlobalId;
67
+ }
68
+ } catch (error) {
69
+ debugGraphPrimitiveFallback(
70
+ "[topicScope] topic-node scope lookup by globalId failed",
71
+ { error, ref }
72
+ );
73
+ }
74
+ if (!node) {
75
+ return null;
76
+ }
77
+ const scopeKey = normalizeScopeValue(node.topicId) ?? normalizeScopeValue(node.globalId);
78
+ if (!scopeKey) {
79
+ return null;
80
+ }
81
+ return {
82
+ topicId: scopeKey,
83
+ projectId: asMappedProjectId(node),
84
+ source: "topic_node"
85
+ };
86
+ }
57
87
  function asMappedProjectId(topic) {
58
88
  if (!topic) {
59
89
  return;
@@ -194,6 +224,13 @@ async function resolveTopicProjectScope(ctx, args) {
194
224
  ) ?? null;
195
225
  }
196
226
  if (!topic) {
227
+ const nodeScope = await resolveTopicNodeScopeOrNull(
228
+ ctx,
229
+ String(args.topicId)
230
+ );
231
+ if (nodeScope) {
232
+ return nodeScope;
233
+ }
197
234
  throw new Error(`Topic not found: ${String(args.topicId)}`);
198
235
  }
199
236
  const inherited = await resolveInheritedWorkspaceScope(ctx, topic);
@@ -264,6 +301,16 @@ async function resolveTopicProjectScope(ctx, args) {
264
301
  source: "project_mapped_topic"
265
302
  };
266
303
  }
304
+ const nodeScope = await resolveTopicNodeScopeOrNull(
305
+ ctx,
306
+ String(args.projectId)
307
+ );
308
+ if (nodeScope) {
309
+ return {
310
+ ...nodeScope,
311
+ projectId: nodeScope.projectId ?? String(args.projectId)
312
+ };
313
+ }
267
314
  throw new Error(
268
315
  `Legacy project scope ${String(args.projectId)} has no mapped topic.`
269
316
  );
@@ -760,6 +807,43 @@ async function resolveEvidenceScopeOrNull(ctx, args) {
760
807
  return null;
761
808
  }
762
809
  }
810
+ async function insertEpistemicNode(ctx, doc) {
811
+ assertUuidV7Identity("epistemicNodes", doc.globalId);
812
+ return ctx.db.insert("epistemicNodes", doc);
813
+ }
814
+ async function insertEpistemicEdge(ctx, doc) {
815
+ assertUuidV7Identity("epistemicEdges", doc.globalId);
816
+ assertStorageEdgeVocabulary(doc.edgeType);
817
+ if (!doc.fromNodeId || typeof doc.fromNodeId !== "string") {
818
+ throw new Error(
819
+ "edge_endpoint_missing: epistemicEdges insert requires a non-empty fromNodeId"
820
+ );
821
+ }
822
+ if (!doc.toNodeId || typeof doc.toNodeId !== "string") {
823
+ throw new Error(
824
+ "edge_endpoint_missing: epistemicEdges insert requires a non-empty toNodeId"
825
+ );
826
+ }
827
+ assertCanonicalEdgeEndpoint("fromNodeId", doc.fromNodeId);
828
+ assertCanonicalEdgeEndpoint("toNodeId", doc.toNodeId);
829
+ if (doc.fromNodeType && doc.toNodeType && doc.edgeType !== "extracted_from") {
830
+ assertEdgePolicyAllowed(
831
+ edgePolicyManifest,
832
+ doc.edgeType,
833
+ {
834
+ kind: "epistemic_node",
835
+ nodeId: doc.fromNodeId,
836
+ nodeType: doc.fromNodeType
837
+ },
838
+ {
839
+ kind: "epistemic_node",
840
+ nodeId: doc.toNodeId,
841
+ nodeType: doc.toNodeType
842
+ }
843
+ );
844
+ }
845
+ return ctx.db.insert("epistemicEdges", doc);
846
+ }
763
847
 
764
848
  // src/epistemicEvidenceMutations.ts
765
849
  function assertSignedImpactScore(value, context) {
@@ -781,17 +865,17 @@ function normalizeEvidenceRelation(relation, weight, context) {
781
865
  return weight < 0 ? "contradicts" : "supports";
782
866
  }
783
867
  async function createEvidenceBeliefEdge(ctx, args) {
784
- const edgeGlobalId = crypto.randomUUID();
868
+ const edgeGlobalId = generateGlobalId();
785
869
  const confidence = Math.abs(args.weight);
786
870
  const existingEdges = await ctx.db.query("epistemicEdges").withIndex(
787
871
  "by_from_to",
788
- (q) => q.eq("fromNodeId", args.evidenceNodeId).eq("toNodeId", args.beliefNodeId)
872
+ (q) => q.eq("fromNodeId", args.evidenceGlobalId).eq("toNodeId", args.beliefGlobalId)
789
873
  ).collect();
790
874
  const existing = existingEdges.find((edge) => edge.edgeType === "informs");
791
875
  const edgeDoc = {
792
876
  globalId: edgeGlobalId,
793
- fromNodeId: args.evidenceNodeId,
794
- toNodeId: args.beliefNodeId,
877
+ fromNodeId: args.evidenceGlobalId,
878
+ toNodeId: args.beliefGlobalId,
795
879
  sourceGlobalId: args.evidenceGlobalId,
796
880
  targetGlobalId: args.beliefGlobalId,
797
881
  edgeType: "informs",
@@ -823,7 +907,7 @@ async function createEvidenceBeliefEdge(ctx, args) {
823
907
  createdAt: existing.createdAt ?? edgeDoc.createdAt
824
908
  });
825
909
  } else {
826
- await ctx.db.insert("epistemicEdges", edgeDoc);
910
+ await insertEpistemicEdge(ctx, edgeDoc);
827
911
  }
828
912
  await ctx.scheduler.runAfter(5e3, internal.neo4jEdgeAPI.createEdge, {
829
913
  globalId: existing?.globalId ?? edgeGlobalId,
@@ -862,10 +946,23 @@ var create = mutation({
862
946
  sourceQuestionId: v.optional(v.string()),
863
947
  userId: v.string(),
864
948
  rationale: v.string(),
865
- // Classification fields (from AI tools)
949
+ // RC.1 taxonomy fields — top-level projection (mirroring kernel evidenceCreate.ts)
950
+ sourceRef: v.optional(v.string()),
951
+ sourceQuality: v.optional(
952
+ v.union(
953
+ v.literal("primary"),
954
+ v.literal("analyzed"),
955
+ v.literal("secondary"),
956
+ v.literal("tertiary"),
957
+ v.literal("unknown")
958
+ )
959
+ ),
866
960
  methodology: v.optional(v.string()),
867
961
  informationAsymmetry: v.optional(v.string()),
868
962
  sourceDescription: v.optional(v.string()),
963
+ // signedImpact is derived from weight; accepted as an explicit override for
964
+ // callers that already have the signed value (kernel parity).
965
+ signedImpact: v.optional(v.number()),
869
966
  metadata: v.optional(v.any()),
870
967
  // Required belief impact link.
871
968
  linkedBeliefNodeId: v.id("epistemicNodes"),
@@ -895,6 +992,7 @@ var create = mutation({
895
992
  const kind = normalizeKind(args.kind);
896
993
  const sourceType = normalizeSourceType(args.sourceType);
897
994
  const weight = assertSignedImpactScore(args.weight, "Evidence creation");
995
+ const signedImpact = args.signedImpact !== void 0 ? assertSignedImpactScore(args.signedImpact, "Evidence creation signedImpact") : weight;
898
996
  const evidenceRelation = normalizeEvidenceRelation(
899
997
  args.evidenceRelation,
900
998
  weight,
@@ -905,7 +1003,7 @@ var create = mutation({
905
1003
  throw new Error("Evidence creation requires a linked belief node");
906
1004
  }
907
1005
  const additionalMetadata = args.metadata && typeof args.metadata === "object" ? args.metadata : {};
908
- const nodeId = await ctx.db.insert("epistemicNodes", {
1006
+ const nodeId = await insertEpistemicNode(ctx, {
909
1007
  globalId,
910
1008
  topicId: scope.topicId,
911
1009
  projectId: scope.projectId,
@@ -920,6 +1018,15 @@ var create = mutation({
920
1018
  status: "active",
921
1019
  epistemicLayer: "L2",
922
1020
  sourceType,
1021
+ // RC.1 taxonomy fields — top-level projection
1022
+ evidenceRelation,
1023
+ signedImpact,
1024
+ targetBeliefId: String(args.linkedBeliefNodeId),
1025
+ ...typeof args.sourceRef === "string" && args.sourceRef.trim().length > 0 ? { sourceRef: args.sourceRef.trim() } : {},
1026
+ ...typeof args.sourceQuality === "string" && args.sourceQuality.length > 0 ? { sourceQuality: args.sourceQuality } : {},
1027
+ ...typeof args.methodology === "string" && args.methodology.length > 0 ? { methodology: args.methodology } : {},
1028
+ ...typeof args.informationAsymmetry === "string" && args.informationAsymmetry.length > 0 ? { informationAsymmetry: args.informationAsymmetry } : {},
1029
+ ...typeof args.sourceDescription === "string" && args.sourceDescription.trim().length > 0 ? { sourceDescription: args.sourceDescription.trim() } : {},
923
1030
  createdAt: now,
924
1031
  updatedAt: now,
925
1032
  createdBy: args.userId,
@@ -955,7 +1062,6 @@ var create = mutation({
955
1062
  text: args.text
956
1063
  });
957
1064
  await createEvidenceBeliefEdge(ctx, {
958
- evidenceNodeId: nodeId,
959
1065
  evidenceGlobalId: globalId,
960
1066
  beliefNodeId: args.linkedBeliefNodeId,
961
1067
  beliefGlobalId: linkedBeliefNode.globalId,
@@ -1025,7 +1131,22 @@ var createAndLink = mutation({
1025
1131
  beliefNodeId: v.id("epistemicNodes"),
1026
1132
  relation: v.union(v.literal("supports"), v.literal("contradicts")),
1027
1133
  weight: v.number(),
1028
- confidence: v.optional(v.number())
1134
+ confidence: v.optional(v.number()),
1135
+ // RC.1 taxonomy fields — top-level projection (mirroring kernel evidenceCreate.ts)
1136
+ sourceRef: v.optional(v.string()),
1137
+ sourceQuality: v.optional(
1138
+ v.union(
1139
+ v.literal("primary"),
1140
+ v.literal("analyzed"),
1141
+ v.literal("secondary"),
1142
+ v.literal("tertiary"),
1143
+ v.literal("unknown")
1144
+ )
1145
+ ),
1146
+ methodology: v.optional(v.string()),
1147
+ informationAsymmetry: v.optional(v.string()),
1148
+ sourceDescription: v.optional(v.string()),
1149
+ signedImpact: v.optional(v.number())
1029
1150
  },
1030
1151
  returns: permissiveReturn,
1031
1152
  handler: async (ctx, args) => {
@@ -1040,6 +1161,7 @@ var createAndLink = mutation({
1040
1161
  const kind = normalizeKind(args.kind);
1041
1162
  const sourceType = normalizeSourceType(args.sourceType);
1042
1163
  const weight = assertSignedImpactScore(args.weight, "Evidence createAndLink");
1164
+ const signedImpact = args.signedImpact !== void 0 ? assertSignedImpactScore(args.signedImpact, "Evidence createAndLink signedImpact") : weight;
1043
1165
  const relation = normalizeEvidenceRelation(
1044
1166
  args.relation,
1045
1167
  weight,
@@ -1050,7 +1172,7 @@ var createAndLink = mutation({
1050
1172
  if (!beliefNode || beliefNode.nodeType !== "belief") {
1051
1173
  throw new Error("Belief node not found for edge creation");
1052
1174
  }
1053
- const nodeId = await ctx.db.insert("epistemicNodes", {
1175
+ const nodeId = await insertEpistemicNode(ctx, {
1054
1176
  globalId,
1055
1177
  topicId: scope.topicId,
1056
1178
  projectId: scope.projectId,
@@ -1062,6 +1184,15 @@ var createAndLink = mutation({
1062
1184
  status: "active",
1063
1185
  epistemicLayer: "L2",
1064
1186
  sourceType,
1187
+ // RC.1 taxonomy fields — top-level projection
1188
+ evidenceRelation: relation,
1189
+ signedImpact,
1190
+ targetBeliefId: String(args.beliefNodeId),
1191
+ ...typeof args.sourceRef === "string" && args.sourceRef.trim().length > 0 ? { sourceRef: args.sourceRef.trim() } : {},
1192
+ ...typeof args.sourceQuality === "string" && args.sourceQuality.length > 0 ? { sourceQuality: args.sourceQuality } : {},
1193
+ ...typeof args.methodology === "string" && args.methodology.length > 0 ? { methodology: args.methodology } : {},
1194
+ ...typeof args.informationAsymmetry === "string" && args.informationAsymmetry.length > 0 ? { informationAsymmetry: args.informationAsymmetry } : {},
1195
+ ...typeof args.sourceDescription === "string" && args.sourceDescription.trim().length > 0 ? { sourceDescription: args.sourceDescription.trim() } : {},
1065
1196
  createdAt: now,
1066
1197
  updatedAt: now,
1067
1198
  createdBy: args.userId,
@@ -1080,7 +1211,6 @@ var createAndLink = mutation({
1080
1211
  operation: "upsert"
1081
1212
  });
1082
1213
  const edgeGlobalId = await createEvidenceBeliefEdge(ctx, {
1083
- evidenceNodeId: nodeId,
1084
1214
  evidenceGlobalId: globalId,
1085
1215
  beliefNodeId: args.beliefNodeId,
1086
1216
  beliefGlobalId: beliefNode.globalId,
@@ -1153,6 +1283,21 @@ var internalCreate = internalMutation({
1153
1283
  evidenceRelation: v.optional(v.string()),
1154
1284
  weight: v.number(),
1155
1285
  confidence: v.optional(v.number()),
1286
+ // RC.1 taxonomy fields — top-level projection (mirroring kernel evidenceCreate.ts)
1287
+ sourceRef: v.optional(v.string()),
1288
+ sourceQuality: v.optional(
1289
+ v.union(
1290
+ v.literal("primary"),
1291
+ v.literal("analyzed"),
1292
+ v.literal("secondary"),
1293
+ v.literal("tertiary"),
1294
+ v.literal("unknown")
1295
+ )
1296
+ ),
1297
+ methodology: v.optional(v.string()),
1298
+ informationAsymmetry: v.optional(v.string()),
1299
+ sourceDescription: v.optional(v.string()),
1300
+ signedImpact: v.optional(v.number()),
1156
1301
  metadata: v.optional(v.any()),
1157
1302
  runtimeToolName: v.optional(v.string()),
1158
1303
  runtimePackKey: v.optional(v.string()),
@@ -1187,6 +1332,7 @@ var internalCreate = internalMutation({
1187
1332
  const kind = normalizeKind(args.kind);
1188
1333
  const sourceType = normalizeSourceType(args.sourceType);
1189
1334
  const weight = assertSignedImpactScore(args.weight, "Internal evidence creation");
1335
+ const signedImpact = args.signedImpact !== void 0 ? assertSignedImpactScore(args.signedImpact, "Internal evidence creation signedImpact") : weight;
1190
1336
  const evidenceRelation = normalizeEvidenceRelation(
1191
1337
  args.evidenceRelation,
1192
1338
  weight,
@@ -1197,7 +1343,7 @@ var internalCreate = internalMutation({
1197
1343
  throw new Error("Internal evidence creation requires a linked belief node");
1198
1344
  }
1199
1345
  const additionalMetadata = args.metadata && typeof args.metadata === "object" ? args.metadata : {};
1200
- const nodeId = await ctx.db.insert("epistemicNodes", {
1346
+ const nodeId = await insertEpistemicNode(ctx, {
1201
1347
  globalId,
1202
1348
  topicId: scope.topicId,
1203
1349
  projectId: scope.projectId,
@@ -1212,6 +1358,15 @@ var internalCreate = internalMutation({
1212
1358
  status: "active",
1213
1359
  epistemicLayer: "L2",
1214
1360
  sourceType,
1361
+ // RC.1 taxonomy fields — top-level projection
1362
+ evidenceRelation,
1363
+ signedImpact,
1364
+ targetBeliefId: String(args.linkedBeliefNodeId),
1365
+ ...typeof args.sourceRef === "string" && args.sourceRef.trim().length > 0 ? { sourceRef: args.sourceRef.trim() } : {},
1366
+ ...typeof args.sourceQuality === "string" && args.sourceQuality.length > 0 ? { sourceQuality: args.sourceQuality } : {},
1367
+ ...typeof args.methodology === "string" && args.methodology.length > 0 ? { methodology: args.methodology } : {},
1368
+ ...typeof args.informationAsymmetry === "string" && args.informationAsymmetry.length > 0 ? { informationAsymmetry: args.informationAsymmetry } : {},
1369
+ ...typeof args.sourceDescription === "string" && args.sourceDescription.trim().length > 0 ? { sourceDescription: args.sourceDescription.trim() } : {},
1215
1370
  createdAt: now,
1216
1371
  updatedAt: now,
1217
1372
  createdBy: args.userId,
@@ -1257,7 +1412,6 @@ var internalCreate = internalMutation({
1257
1412
  operation: "upsert"
1258
1413
  });
1259
1414
  await createEvidenceBeliefEdge(ctx, {
1260
- evidenceNodeId: nodeId,
1261
1415
  evidenceGlobalId: globalId,
1262
1416
  beliefNodeId: args.linkedBeliefNodeId,
1263
1417
  beliefGlobalId: linkedBeliefNode.globalId,