@lucern/graph-primitives 1.0.16 → 1.0.18

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 (92) 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/entityLifecycle.js +1 -12
  11. package/dist/entityLifecycle.js.map +1 -1
  12. package/dist/epistemicAnswers.js +1 -12
  13. package/dist/epistemicAnswers.js.map +1 -1
  14. package/dist/epistemicBeliefs.admin.js.map +1 -1
  15. package/dist/epistemicBeliefs.backfills.d.ts +1 -1
  16. package/dist/epistemicBeliefs.backfills.js +63 -35
  17. package/dist/epistemicBeliefs.backfills.js.map +1 -1
  18. package/dist/epistemicBeliefs.confidence.d.ts +1 -1
  19. package/dist/epistemicBeliefs.confidence.js +70 -41
  20. package/dist/epistemicBeliefs.confidence.js.map +1 -1
  21. package/dist/epistemicBeliefs.core.js +946 -566
  22. package/dist/epistemicBeliefs.core.js.map +1 -1
  23. package/dist/epistemicBeliefs.d.ts +2 -2
  24. package/dist/epistemicBeliefs.forkEvidence.d.ts +18 -0
  25. package/dist/epistemicBeliefs.forkEvidence.js +121 -0
  26. package/dist/epistemicBeliefs.forkEvidence.js.map +1 -0
  27. package/dist/epistemicBeliefs.helpers.d.ts +2 -2
  28. package/dist/epistemicBeliefs.helpers.js +60 -32
  29. package/dist/epistemicBeliefs.helpers.js.map +1 -1
  30. package/dist/epistemicBeliefs.internal.js +175 -51
  31. package/dist/epistemicBeliefs.internal.js.map +1 -1
  32. package/dist/epistemicBeliefs.js +437 -84
  33. package/dist/epistemicBeliefs.js.map +1 -1
  34. package/dist/epistemicBeliefs.lifecycle.d.ts +2 -2
  35. package/dist/epistemicBeliefs.lifecycle.js +75 -47
  36. package/dist/epistemicBeliefs.lifecycle.js.map +1 -1
  37. package/dist/epistemicBeliefs.links.js +47 -13
  38. package/dist/epistemicBeliefs.links.js.map +1 -1
  39. package/dist/epistemicBeliefs.topicAnchor.d.ts +29 -0
  40. package/dist/epistemicBeliefs.topicAnchor.js +105 -0
  41. package/dist/epistemicBeliefs.topicAnchor.js.map +1 -0
  42. package/dist/epistemicContracts.evaluators.js +71 -42
  43. package/dist/epistemicContracts.evaluators.js.map +1 -1
  44. package/dist/epistemicContracts.handlers.js +72 -54
  45. package/dist/epistemicContracts.handlers.js.map +1 -1
  46. package/dist/epistemicContracts.js +72 -54
  47. package/dist/epistemicContracts.js.map +1 -1
  48. package/dist/epistemicContracts.metrics.js +1 -1
  49. package/dist/epistemicContracts.metrics.js.map +1 -1
  50. package/dist/epistemicContracts.types.d.ts +1 -1
  51. package/dist/epistemicEdgeCreation.js +1 -12
  52. package/dist/epistemicEdgeCreation.js.map +1 -1
  53. package/dist/epistemicEdges.helpers.d.ts +1 -1
  54. package/dist/epistemicEvidence.js +173 -93
  55. package/dist/epistemicEvidence.js.map +1 -1
  56. package/dist/epistemicEvidenceMutations.js +173 -93
  57. package/dist/epistemicEvidenceMutations.js.map +1 -1
  58. package/dist/epistemicHelpers.js +1 -12
  59. package/dist/epistemicHelpers.js.map +1 -1
  60. package/dist/epistemicNodeCreation.js +1 -10
  61. package/dist/epistemicNodeCreation.js.map +1 -1
  62. package/dist/epistemicNodes.internal.js.map +1 -1
  63. package/dist/epistemicNodes.js +2 -2
  64. package/dist/epistemicNodes.js.map +1 -1
  65. package/dist/epistemicNodes.mutations.js +2 -2
  66. package/dist/epistemicNodes.mutations.js.map +1 -1
  67. package/dist/epistemicQuestions.create.js +1 -12
  68. package/dist/epistemicQuestions.create.js.map +1 -1
  69. package/dist/epistemicQuestions.evidence.js +1 -12
  70. package/dist/epistemicQuestions.evidence.js.map +1 -1
  71. package/dist/epistemicQuestions.js +1 -12
  72. package/dist/epistemicQuestions.js.map +1 -1
  73. package/dist/epistemicQuestions.tail.js +1 -12
  74. package/dist/epistemicQuestions.tail.js.map +1 -1
  75. package/dist/epistemicSources.js +1 -12
  76. package/dist/epistemicSources.js.map +1 -1
  77. package/dist/evaluators/index.js +1 -1
  78. package/dist/evaluators/index.js.map +1 -1
  79. package/dist/globalId-4y9SPpC_.d.ts +10 -0
  80. package/dist/globalId.d.ts +1 -1
  81. package/dist/globalId.js +1 -13
  82. package/dist/globalId.js.map +1 -1
  83. package/dist/helpers.js +1 -12
  84. package/dist/helpers.js.map +1 -1
  85. package/dist/index.d.ts +4 -3
  86. package/dist/index.js +771 -247
  87. package/dist/index.js.map +1 -1
  88. package/dist/invariantEnforcement.js +2 -2
  89. package/dist/invariantEnforcement.js.map +1 -1
  90. package/dist/proof-attestation.json +3 -3
  91. package/package.json +4 -4
  92. package/dist/globalId-DKh9d_uD.d.ts +0 -20
@@ -3,6 +3,7 @@ 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
7
  import { isNodeType, getLayerForNodeType } from '@lucern/contracts/schema-helpers/spine/tables/epistemicNodes';
7
8
  import { listAudienceRegistryRows } from '@lucern/access-control/audienceRegistry';
8
9
 
@@ -800,18 +801,6 @@ async function scheduleEmbeddingGeneration(args) {
800
801
  );
801
802
  }
802
803
  }
803
-
804
- // src/globalId.ts
805
- function generateGlobalId() {
806
- const bytes = new Uint8Array(16);
807
- crypto.getRandomValues(bytes);
808
- bytes[6] = bytes[6] & 15 | 64;
809
- bytes[8] = bytes[8] & 63 | 128;
810
- const hex = Array.from(bytes, (b) => b.toString(16).padStart(2, "0")).join(
811
- ""
812
- );
813
- return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;
814
- }
815
804
  function normalizeScopeValue2(value) {
816
805
  if (typeof value !== "string") {
817
806
  return;
@@ -907,6 +896,91 @@ function assertTenantPackWorkspaceMutationAllowed(args) {
907
896
  }
908
897
 
909
898
  // src/epistemicEvidenceMutations.ts
899
+ function assertSignedImpactScore(value, context) {
900
+ if (typeof value !== "number" || !Number.isFinite(value) || value === 0 || value < -1 || value > 1) {
901
+ throw new Error(`${context} requires explicit nonzero weight in [-1, 1]`);
902
+ }
903
+ return value;
904
+ }
905
+ function normalizeEvidenceRelation(relation, weight, context) {
906
+ if (relation === "supports" || relation === "contradicts") {
907
+ if (relation === "supports" && weight < 0) {
908
+ throw new Error(`${context} supports relation requires positive weight`);
909
+ }
910
+ if (relation === "contradicts" && weight > 0) {
911
+ throw new Error(`${context} contradicts relation requires negative weight`);
912
+ }
913
+ return relation;
914
+ }
915
+ return weight < 0 ? "contradicts" : "supports";
916
+ }
917
+ async function createEvidenceBeliefEdge(ctx, args) {
918
+ const edgeGlobalId = crypto.randomUUID();
919
+ const confidence = Math.abs(args.weight);
920
+ const existingEdges = await ctx.db.query("epistemicEdges").withIndex(
921
+ "by_from_to",
922
+ (q) => q.eq("fromNodeId", args.evidenceNodeId).eq("toNodeId", args.beliefNodeId)
923
+ ).collect();
924
+ const existing = existingEdges.find((edge) => edge.edgeType === "informs");
925
+ const edgeDoc = {
926
+ globalId: edgeGlobalId,
927
+ fromNodeId: args.evidenceNodeId,
928
+ toNodeId: args.beliefNodeId,
929
+ sourceGlobalId: args.evidenceGlobalId,
930
+ targetGlobalId: args.beliefGlobalId,
931
+ edgeType: "informs",
932
+ weight: args.weight,
933
+ confidence,
934
+ context: args.rationale,
935
+ reasoningMethod: "testimonial",
936
+ derivationType: "evidence_sl_scoring",
937
+ metadata: {
938
+ relation: args.relation,
939
+ confidence,
940
+ impactScore: args.weight,
941
+ invariant: "evidence.belief_impact_required"
942
+ },
943
+ createdBy: args.userId,
944
+ createdAt: Date.now(),
945
+ updatedAt: Date.now(),
946
+ topicId: args.topicId,
947
+ projectId: args.projectId,
948
+ fromNodeType: "evidence",
949
+ toNodeType: "belief",
950
+ fromLayer: "L2",
951
+ toLayer: "L3"
952
+ };
953
+ if (existing) {
954
+ await ctx.db.patch(existing._id, {
955
+ ...edgeDoc,
956
+ globalId: existing.globalId,
957
+ createdAt: existing.createdAt ?? edgeDoc.createdAt
958
+ });
959
+ } else {
960
+ await ctx.db.insert("epistemicEdges", edgeDoc);
961
+ }
962
+ await ctx.scheduler.runAfter(5e3, internal.neo4jEdgeAPI.createEdge, {
963
+ globalId: existing?.globalId ?? edgeGlobalId,
964
+ fromGlobalId: args.evidenceGlobalId,
965
+ toGlobalId: args.beliefGlobalId,
966
+ edgeType: "informs",
967
+ weight: args.weight,
968
+ confidence,
969
+ createdBy: args.userId,
970
+ topicId: args.projectId ?? args.topicId,
971
+ fromNodeType: "evidence",
972
+ toNodeType: "belief",
973
+ fromLayer: "L2",
974
+ toLayer: "L3",
975
+ metadata: {
976
+ relation: args.relation,
977
+ confidence,
978
+ impactScore: args.weight,
979
+ invariant: "evidence.belief_impact_required"
980
+ }
981
+ });
982
+ return existing?.globalId ?? edgeGlobalId;
983
+ }
910
984
  var create = mutation({
911
985
  args: {
912
986
  ...optionalEvidenceScopeArgs,
@@ -927,11 +1001,12 @@ var create = mutation({
927
1001
  informationAsymmetry: v.optional(v.string()),
928
1002
  sourceDescription: v.optional(v.string()),
929
1003
  metadata: v.optional(v.any()),
930
- // Optional linking to beliefs
931
- linkedBeliefNodeId: v.optional(v.id("epistemicNodes")),
1004
+ // Required belief impact link.
1005
+ linkedBeliefNodeId: v.id("epistemicNodes"),
932
1006
  evidenceRelation: v.optional(
933
1007
  v.union(v.literal("supports"), v.literal("contradicts"))
934
1008
  ),
1009
+ weight: v.number(),
935
1010
  confidence: v.optional(v.number())
936
1011
  },
937
1012
  returns: permissiveReturn,
@@ -953,6 +1028,16 @@ var create = mutation({
953
1028
  const contentHash = generateContentHash(args.text);
954
1029
  const kind = normalizeKind(args.kind);
955
1030
  const sourceType = normalizeSourceType(args.sourceType);
1031
+ const weight = assertSignedImpactScore(args.weight, "Evidence creation");
1032
+ const evidenceRelation = normalizeEvidenceRelation(
1033
+ args.evidenceRelation,
1034
+ weight,
1035
+ "Evidence creation"
1036
+ );
1037
+ const linkedBeliefNode = await ctx.db.get(args.linkedBeliefNodeId);
1038
+ if (!linkedBeliefNode || linkedBeliefNode.nodeType !== "belief") {
1039
+ throw new Error("Evidence creation requires a linked belief node");
1040
+ }
956
1041
  const additionalMetadata = args.metadata && typeof args.metadata === "object" ? args.metadata : {};
957
1042
  const nodeId = await ctx.db.insert("epistemicNodes", {
958
1043
  globalId,
@@ -980,8 +1065,10 @@ var create = mutation({
980
1065
  sourceQuestionId: args.sourceQuestionId,
981
1066
  rationale: args.rationale,
982
1067
  linkedBeliefNodeId: args.linkedBeliefNodeId,
983
- evidenceRelation: args.evidenceRelation,
984
- confidence: args.confidence,
1068
+ evidenceRelation,
1069
+ confidence: Math.abs(weight),
1070
+ weight,
1071
+ impactScore: weight,
985
1072
  methodology: args.methodology,
986
1073
  informationAsymmetry: args.informationAsymmetry,
987
1074
  sourceDescription: args.sourceDescription,
@@ -1001,29 +1088,18 @@ var create = mutation({
1001
1088
  nodeType: "evidence",
1002
1089
  text: args.text
1003
1090
  });
1004
- if (args.linkedBeliefNodeId && args.evidenceRelation) {
1005
- const beliefNode = await ctx.db.get(args.linkedBeliefNodeId);
1006
- if (beliefNode) {
1007
- const weight = args.evidenceRelation === "supports" ? 1 : -1;
1008
- await ctx.scheduler.runAfter(5e3, internal.neo4jEdgeAPI.createEdge, {
1009
- globalId: crypto.randomUUID(),
1010
- fromGlobalId: globalId,
1011
- toGlobalId: beliefNode.globalId,
1012
- edgeType: "informs",
1013
- weight: weight * (args.confidence || 0.7),
1014
- createdBy: args.userId,
1015
- topicId: scope.projectId ? String(scope.projectId) : void 0,
1016
- fromNodeType: "evidence",
1017
- toNodeType: "belief",
1018
- fromLayer: "L2",
1019
- toLayer: "L3",
1020
- metadata: {
1021
- relation: args.evidenceRelation,
1022
- confidence: args.confidence
1023
- }
1024
- });
1025
- }
1026
- }
1091
+ await createEvidenceBeliefEdge(ctx, {
1092
+ evidenceNodeId: nodeId,
1093
+ evidenceGlobalId: globalId,
1094
+ beliefNodeId: args.linkedBeliefNodeId,
1095
+ beliefGlobalId: linkedBeliefNode.globalId,
1096
+ relation: evidenceRelation,
1097
+ weight,
1098
+ userId: args.userId,
1099
+ topicId: scope.topicId ? String(scope.topicId) : void 0,
1100
+ projectId: scope.projectId ? String(scope.projectId) : void 0,
1101
+ rationale: args.rationale
1102
+ });
1027
1103
  await ctx.db.insert("epistemicAudit", {
1028
1104
  entityType: "evidence",
1029
1105
  entityId: nodeId,
@@ -1038,7 +1114,8 @@ var create = mutation({
1038
1114
  kind,
1039
1115
  sourceType,
1040
1116
  linkedBeliefNodeId: args.linkedBeliefNodeId,
1041
- evidenceRelation: args.evidenceRelation
1117
+ evidenceRelation,
1118
+ weight
1042
1119
  }
1043
1120
  });
1044
1121
  if (scope.projectId || scope.topicId) {
@@ -1081,6 +1158,7 @@ var createAndLink = mutation({
1081
1158
  userId: v.string(),
1082
1159
  beliefNodeId: v.id("epistemicNodes"),
1083
1160
  relation: v.union(v.literal("supports"), v.literal("contradicts")),
1161
+ weight: v.number(),
1084
1162
  confidence: v.optional(v.number())
1085
1163
  },
1086
1164
  returns: permissiveReturn,
@@ -1095,7 +1173,17 @@ var createAndLink = mutation({
1095
1173
  const contentHash = generateContentHash(args.text);
1096
1174
  const kind = normalizeKind(args.kind);
1097
1175
  const sourceType = normalizeSourceType(args.sourceType);
1098
- const confidence = args.confidence ?? 0.7;
1176
+ const weight = assertSignedImpactScore(args.weight, "Evidence createAndLink");
1177
+ const relation = normalizeEvidenceRelation(
1178
+ args.relation,
1179
+ weight,
1180
+ "Evidence createAndLink"
1181
+ );
1182
+ const confidence = Math.abs(weight);
1183
+ const beliefNode = await ctx.db.get(args.beliefNodeId);
1184
+ if (!beliefNode || beliefNode.nodeType !== "belief") {
1185
+ throw new Error("Belief node not found for edge creation");
1186
+ }
1099
1187
  const nodeId = await ctx.db.insert("epistemicNodes", {
1100
1188
  globalId,
1101
1189
  topicId: scope.topicId,
@@ -1115,36 +1203,26 @@ var createAndLink = mutation({
1115
1203
  kind,
1116
1204
  tags: args.tags || [],
1117
1205
  linkedBeliefNodeId: args.beliefNodeId,
1118
- evidenceRelation: args.relation,
1119
- confidence
1206
+ evidenceRelation: relation,
1207
+ confidence,
1208
+ weight,
1209
+ impactScore: weight
1120
1210
  }
1121
1211
  });
1122
1212
  await ctx.scheduler.runAfter(0, internal.neo4jSync.syncNodeToNeo4j, {
1123
1213
  nodeId,
1124
1214
  operation: "upsert"
1125
1215
  });
1126
- const beliefNode = await ctx.db.get(args.beliefNodeId);
1127
- if (!beliefNode) {
1128
- throw new Error("Belief node not found for edge creation");
1129
- }
1130
- const weight = args.relation === "supports" ? confidence : -confidence;
1131
- const edgeGlobalId = crypto.randomUUID();
1132
- await ctx.scheduler.runAfter(5e3, internal.neo4jEdgeAPI.createEdge, {
1133
- globalId: edgeGlobalId,
1134
- fromGlobalId: globalId,
1135
- toGlobalId: beliefNode.globalId,
1136
- edgeType: "informs",
1216
+ const edgeGlobalId = await createEvidenceBeliefEdge(ctx, {
1217
+ evidenceNodeId: nodeId,
1218
+ evidenceGlobalId: globalId,
1219
+ beliefNodeId: args.beliefNodeId,
1220
+ beliefGlobalId: beliefNode.globalId,
1221
+ relation,
1137
1222
  weight,
1138
- createdBy: args.userId,
1139
- topicId: scope.projectId,
1140
- fromNodeType: "evidence",
1141
- toNodeType: "belief",
1142
- fromLayer: "L2",
1143
- toLayer: "L3",
1144
- metadata: {
1145
- relation: args.relation,
1146
- confidence
1147
- }
1223
+ userId: args.userId,
1224
+ topicId: scope.topicId ? String(scope.topicId) : void 0,
1225
+ projectId: scope.projectId ? String(scope.projectId) : void 0
1148
1226
  });
1149
1227
  await markProjectGraphDirty(ctx, scope.projectId, String(scope.topicId));
1150
1228
  return { nodeId, edgeGlobalId };
@@ -1205,8 +1283,9 @@ var internalCreate = internalMutation({
1205
1283
  sourceQuestionId: v.optional(v.string()),
1206
1284
  userId: v.string(),
1207
1285
  rationale: v.string(),
1208
- linkedBeliefNodeId: v.optional(v.id("epistemicNodes")),
1286
+ linkedBeliefNodeId: v.id("epistemicNodes"),
1209
1287
  evidenceRelation: v.optional(v.string()),
1288
+ weight: v.number(),
1210
1289
  confidence: v.optional(v.number()),
1211
1290
  metadata: v.optional(v.any()),
1212
1291
  runtimeToolName: v.optional(v.string()),
@@ -1241,6 +1320,16 @@ var internalCreate = internalMutation({
1241
1320
  const contentHash = generateContentHash(args.text);
1242
1321
  const kind = normalizeKind(args.kind);
1243
1322
  const sourceType = normalizeSourceType(args.sourceType);
1323
+ const weight = assertSignedImpactScore(args.weight, "Internal evidence creation");
1324
+ const evidenceRelation = normalizeEvidenceRelation(
1325
+ args.evidenceRelation,
1326
+ weight,
1327
+ "Internal evidence creation"
1328
+ );
1329
+ const linkedBeliefNode = await ctx.db.get(args.linkedBeliefNodeId);
1330
+ if (!linkedBeliefNode || linkedBeliefNode.nodeType !== "belief") {
1331
+ throw new Error("Internal evidence creation requires a linked belief node");
1332
+ }
1244
1333
  const additionalMetadata = args.metadata && typeof args.metadata === "object" ? args.metadata : {};
1245
1334
  const nodeId = await ctx.db.insert("epistemicNodes", {
1246
1335
  globalId,
@@ -1268,8 +1357,10 @@ var internalCreate = internalMutation({
1268
1357
  sourceQuestionId: args.sourceQuestionId,
1269
1358
  rationale: args.rationale,
1270
1359
  linkedBeliefNodeId: args.linkedBeliefNodeId,
1271
- evidenceRelation: args.evidenceRelation,
1272
- confidence: args.confidence,
1360
+ evidenceRelation,
1361
+ confidence: Math.abs(weight),
1362
+ weight,
1363
+ impactScore: weight,
1273
1364
  ...additionalMetadata
1274
1365
  }
1275
1366
  });
@@ -1289,8 +1380,9 @@ var internalCreate = internalMutation({
1289
1380
  externalSourceType: args.externalSourceType,
1290
1381
  sourceUrl: args.sourceUrl,
1291
1382
  linkedBeliefNodeId: args.linkedBeliefNodeId,
1292
- evidenceRelation: args.evidenceRelation,
1293
- confidence: args.confidence
1383
+ evidenceRelation,
1384
+ confidence: Math.abs(weight),
1385
+ weight
1294
1386
  },
1295
1387
  triggeringAction: "epistemicEvidence.internalCreate"
1296
1388
  });
@@ -1298,30 +1390,18 @@ var internalCreate = internalMutation({
1298
1390
  nodeId,
1299
1391
  operation: "upsert"
1300
1392
  });
1301
- if (args.linkedBeliefNodeId && args.evidenceRelation) {
1302
- const beliefNode = await ctx.db.get(args.linkedBeliefNodeId);
1303
- if (beliefNode) {
1304
- const confidence = args.confidence ?? 0.7;
1305
- const weight = args.evidenceRelation === "supports" ? confidence : -confidence;
1306
- await ctx.scheduler.runAfter(5e3, internal.neo4jEdgeAPI.createEdge, {
1307
- globalId: crypto.randomUUID(),
1308
- fromGlobalId: globalId,
1309
- toGlobalId: beliefNode.globalId,
1310
- edgeType: "informs",
1311
- weight,
1312
- createdBy: args.userId,
1313
- topicId: scope.projectId ? String(scope.projectId) : void 0,
1314
- fromNodeType: "evidence",
1315
- toNodeType: "belief",
1316
- fromLayer: "L2",
1317
- toLayer: "L3",
1318
- metadata: {
1319
- relation: args.evidenceRelation,
1320
- confidence
1321
- }
1322
- });
1323
- }
1324
- }
1393
+ await createEvidenceBeliefEdge(ctx, {
1394
+ evidenceNodeId: nodeId,
1395
+ evidenceGlobalId: globalId,
1396
+ beliefNodeId: args.linkedBeliefNodeId,
1397
+ beliefGlobalId: linkedBeliefNode.globalId,
1398
+ relation: evidenceRelation,
1399
+ weight,
1400
+ userId: args.userId,
1401
+ topicId: scope.topicId ? String(scope.topicId) : void 0,
1402
+ projectId: scope.projectId ? String(scope.projectId) : void 0,
1403
+ rationale: args.rationale
1404
+ });
1325
1405
  if (scope.projectId || scope.topicId) {
1326
1406
  await ctx.scheduler.runAfter(
1327
1407
  0,