@lucern/graph-primitives 1.0.21 → 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
@@ -1,8 +1,43 @@
1
1
  import { componentsGeneric, anyApi } from 'convex/server';
2
+ import { generateGlobalId, assertUuidV7Identity, assertStorageEdgeVocabulary, assertCanonicalEdgeEndpoint } from '@lucern/contracts/ids';
3
+ import { assertEdgePolicyAllowed, edgePolicyManifest } from '@lucern/contracts';
2
4
 
3
5
  // src/convex.ts
4
6
  componentsGeneric();
5
7
  var internal = anyApi;
8
+ async function insertEpistemicEdge(ctx, doc) {
9
+ assertUuidV7Identity("epistemicEdges", doc.globalId);
10
+ assertStorageEdgeVocabulary(doc.edgeType);
11
+ if (!doc.fromNodeId || typeof doc.fromNodeId !== "string") {
12
+ throw new Error(
13
+ "edge_endpoint_missing: epistemicEdges insert requires a non-empty fromNodeId"
14
+ );
15
+ }
16
+ if (!doc.toNodeId || typeof doc.toNodeId !== "string") {
17
+ throw new Error(
18
+ "edge_endpoint_missing: epistemicEdges insert requires a non-empty toNodeId"
19
+ );
20
+ }
21
+ assertCanonicalEdgeEndpoint("fromNodeId", doc.fromNodeId);
22
+ assertCanonicalEdgeEndpoint("toNodeId", doc.toNodeId);
23
+ if (doc.fromNodeType && doc.toNodeType && doc.edgeType !== "extracted_from") {
24
+ assertEdgePolicyAllowed(
25
+ edgePolicyManifest,
26
+ doc.edgeType,
27
+ {
28
+ kind: "epistemic_node",
29
+ nodeId: doc.fromNodeId,
30
+ nodeType: doc.fromNodeType
31
+ },
32
+ {
33
+ kind: "epistemic_node",
34
+ nodeId: doc.toNodeId,
35
+ nodeType: doc.toNodeType
36
+ }
37
+ );
38
+ }
39
+ return ctx.db.insert("epistemicEdges", doc);
40
+ }
6
41
 
7
42
  // src/beliefEvidenceLinks.operational.ts
8
43
  function assertEvidenceImpact(args) {
@@ -42,7 +77,7 @@ async function applyOperationalLinkEffects(ctx, args) {
42
77
  if (beliefSpineNode?.nodeType === "belief" && evidenceSpineNode?.nodeType === "evidence") {
43
78
  const existingEdges = await ctx.db.query("epistemicEdges").withIndex(
44
79
  "by_from_to",
45
- (q) => q.eq("fromNodeId", evidenceSpineNode._id).eq("toNodeId", beliefSpineNode._id)
80
+ (q) => q.eq("fromNodeId", evidenceSpineNode.globalId).eq("toNodeId", beliefSpineNode.globalId)
46
81
  ).collect();
47
82
  for (const edge of existingEdges) {
48
83
  if (edge.edgeType === "informs") {
@@ -52,12 +87,13 @@ async function applyOperationalLinkEffects(ctx, args) {
52
87
  await ctx.db.delete(edge._id);
53
88
  }
54
89
  }
55
- const globalId = `edge-${Date.now()}-${Math.random().toString(36).slice(2, 11)}`;
90
+ const globalId = generateGlobalId();
56
91
  const context = args.rationale || `Linked as ${args.relation}`;
57
- await ctx.db.insert("epistemicEdges", {
92
+ await insertEpistemicEdge(ctx, {
58
93
  globalId,
59
- fromNodeId: evidenceSpineNode._id,
60
- toNodeId: beliefSpineNode._id,
94
+ // C2-RR.4 Defect E — canonical UUIDv7 endpoints, not Convex doc ids.
95
+ fromNodeId: evidenceSpineNode.globalId,
96
+ toNodeId: beliefSpineNode.globalId,
61
97
  sourceGlobalId: evidenceSpineNode.globalId,
62
98
  targetGlobalId: beliefSpineNode.globalId,
63
99
  edgeType: "informs",
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/convex.ts","../src/beliefEvidenceLinks.operational.ts"],"names":[],"mappings":"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","file":"beliefEvidenceLinks.operational.js","sourcesContent":["import {\n actionGeneric,\n anyApi,\n componentsGeneric,\n httpActionGeneric,\n internalActionGeneric,\n internalMutationGeneric,\n internalQueryGeneric,\n mutationGeneric,\n queryGeneric,\n} from \"convex/server\";\nimport type { GenericId } from \"convex/values\";\n\nexport const api = anyApi as any;\nexport const components = componentsGeneric() as any;\nexport const internal = anyApi as any;\n\nexport type TableNames = string;\nexport type Id<TableName extends TableNames = string> = GenericId<TableName>;\nexport type Doc<TableName extends TableNames = string> = any;\nexport type DataModel = any;\ntype IndexRangeBuilder = {\n field(fieldName: string): string;\n eq(fieldName: string, value: unknown): IndexRangeBuilder;\n gt(fieldName: string, value: unknown): IndexRangeBuilder;\n gte(fieldName: string, value: unknown): IndexRangeBuilder;\n lt(fieldName: string, value: unknown): IndexRangeBuilder;\n lte(fieldName: string, value: unknown): IndexRangeBuilder;\n};\ntype FilterBuilder = {\n eq(left: unknown, right: unknown): unknown;\n neq(left: unknown, right: unknown): unknown;\n gt(left: unknown, right: unknown): unknown;\n gte(left: unknown, right: unknown): unknown;\n lt(left: unknown, right: unknown): unknown;\n lte(left: unknown, right: unknown): unknown;\n and(...clauses: unknown[]): unknown;\n or(...clauses: unknown[]): unknown;\n field(fieldName: string): unknown;\n};\ntype QueryInitializer<TableName extends TableNames> = {\n withIndex(\n indexName: string,\n range?: (q: any) => unknown\n ): QueryInitializer<TableName>;\n filter(predicate: (q: any) => unknown): QueryInitializer<TableName>;\n order(direction: \"asc\" | \"desc\"): QueryInitializer<TableName>;\n collect(): Promise<Doc<TableName>[]>;\n take(limit: number): Promise<Doc<TableName>[]>;\n first(): Promise<Doc<TableName> | null>;\n unique(): Promise<Doc<TableName> | null>;\n};\nexport type DatabaseReader = {\n get<TableName extends TableNames>(\n id: Id<TableName>\n ): Promise<Doc<TableName> | null>;\n query<TableName extends TableNames>(\n tableName: TableName\n ): QueryInitializer<TableName>;\n normalizeId?<TableName extends TableNames>(\n tableName: TableName,\n id: string\n ): Id<TableName> | null;\n};\nexport type DatabaseWriter = DatabaseReader & {\n insert<TableName extends TableNames>(\n tableName: TableName,\n value: Record<string, unknown>\n ): Promise<Id<TableName>>;\n patch<TableName extends TableNames>(\n id: Id<TableName>,\n value: Record<string, unknown>\n ): Promise<void>;\n replace<TableName extends TableNames>(\n id: Id<TableName>,\n value: Record<string, unknown>\n ): Promise<void>;\n delete<TableName extends TableNames>(id: Id<TableName>): Promise<void>;\n};\ntype Scheduler = {\n runAfter(delayMs: number, functionReference: unknown, args?: unknown): Promise<void>;\n};\ntype AuthReader = {\n getUserIdentity(): Promise<unknown>;\n};\ntype RuntimeInvoker = {\n runQuery(functionReference: unknown, args?: unknown): Promise<any>;\n runMutation(functionReference: unknown, args?: unknown): Promise<any>;\n runAction(functionReference: unknown, args?: unknown): Promise<any>;\n};\nexport type QueryCtx = RuntimeInvoker & {\n auth: AuthReader;\n db: DatabaseReader;\n scheduler: Scheduler;\n};\nexport type MutationCtx = RuntimeInvoker & {\n auth: AuthReader;\n db: DatabaseWriter;\n scheduler: Scheduler;\n};\nexport type ActionCtx = RuntimeInvoker & {\n auth: AuthReader;\n scheduler: Scheduler;\n};\n\ntype ConvexFunctionBuilder<Ctx> = <\n Definition extends { handler?: (ctx: Ctx, args: any) => any },\n>(\n definition: Definition\n) => any;\n\nexport const action = actionGeneric as unknown as ConvexFunctionBuilder<ActionCtx>;\nexport const httpAction =\n httpActionGeneric as unknown as ConvexFunctionBuilder<ActionCtx>;\nexport const internalAction =\n internalActionGeneric as unknown as ConvexFunctionBuilder<ActionCtx>;\nexport const internalMutation =\n internalMutationGeneric as unknown as ConvexFunctionBuilder<MutationCtx>;\nexport const internalQuery =\n internalQueryGeneric as unknown as ConvexFunctionBuilder<QueryCtx>;\nexport const mutation =\n mutationGeneric as unknown as ConvexFunctionBuilder<MutationCtx>;\nexport const query = queryGeneric as unknown as ConvexFunctionBuilder<QueryCtx>;\n","import type { Id, MutationCtx } from \"./convex\";\nimport { internal } from \"./convex\";\n\ntype BeliefEvidenceRelation = \"supports\" | \"contradicts\";\ntype IndexRangeBuilder = {\n eq(fieldName: string, value: unknown): IndexRangeBuilder;\n};\ntype EpistemicNode = {\n _id: Id<\"epistemicNodes\">;\n nodeType?: string;\n globalId?: string;\n projectId?: string;\n topicId?: string | Id<\"topics\">;\n supportingInsightIds?: Id<\"epistemicNodes\">[];\n contradictingInsightIds?: Id<\"epistemicNodes\">[];\n};\n\nfunction assertEvidenceImpact(args: {\n relation: BeliefEvidenceRelation;\n weight: number;\n}) {\n if (\n !Number.isFinite(args.weight) ||\n args.weight === 0 ||\n args.weight < -1 ||\n args.weight > 1\n ) {\n throw new Error(\"Belief evidence links require explicit nonzero weight in [-1, 1]\");\n }\n if (args.relation === \"supports\" && args.weight < 0) {\n throw new Error(\"Supporting evidence links require positive weight\");\n }\n if (args.relation === \"contradicts\" && args.weight > 0) {\n throw new Error(\"Contradicting evidence links require negative weight\");\n }\n}\n\nexport async function applyOperationalLinkEffects(\n ctx: MutationCtx,\n args: {\n beliefNode: EpistemicNode;\n beliefId: Id<\"epistemicNodes\">;\n insightId: Id<\"epistemicNodes\">;\n relation: BeliefEvidenceRelation;\n weight: number;\n rationale?: string;\n createdBy: string;\n },\n): Promise<void> {\n assertEvidenceImpact({ relation: args.relation, weight: args.weight });\n const confidence = Math.abs(args.weight);\n const currentSupporting = args.beliefNode.supportingInsightIds ?? [];\n const currentContradicting = args.beliefNode.contradictingInsightIds ?? [];\n\n if (args.relation === \"supports\" && !currentSupporting.includes(args.insightId)) {\n await ctx.db.patch(args.beliefId, {\n supportingInsightIds: [...currentSupporting, args.insightId],\n contradictingInsightIds: currentContradicting.filter(\n (id: Id<\"epistemicNodes\">) => id !== args.insightId,\n ),\n });\n } else if (\n args.relation === \"contradicts\" &&\n !currentContradicting.includes(args.insightId)\n ) {\n await ctx.db.patch(args.beliefId, {\n contradictingInsightIds: [...currentContradicting, args.insightId],\n supportingInsightIds: currentSupporting.filter(\n (id: Id<\"epistemicNodes\">) => id !== args.insightId,\n ),\n });\n }\n\n try {\n const beliefSpineNode = await ctx.db.get(args.beliefId);\n const evidenceSpineNode = await ctx.db.get(args.insightId);\n\n if (\n beliefSpineNode?.nodeType === \"belief\" &&\n evidenceSpineNode?.nodeType === \"evidence\"\n ) {\n const existingEdges = await ctx.db\n .query(\"epistemicEdges\")\n .withIndex(\"by_from_to\", (q: IndexRangeBuilder) =>\n q.eq(\"fromNodeId\", evidenceSpineNode._id).eq(\"toNodeId\", beliefSpineNode._id),\n )\n .collect();\n\n for (const edge of existingEdges) {\n if (edge.edgeType === \"informs\") {\n await ctx.scheduler.runAfter(0, internal.neo4jEdgeAPI.deleteEdge, {\n globalId: edge.globalId,\n });\n await ctx.db.delete(edge._id);\n }\n }\n\n const globalId = `edge-${Date.now()}-${Math.random().toString(36).slice(2, 11)}`;\n const context = args.rationale || `Linked as ${args.relation}`;\n await ctx.db.insert(\"epistemicEdges\", {\n globalId,\n fromNodeId: evidenceSpineNode._id,\n toNodeId: beliefSpineNode._id,\n sourceGlobalId: evidenceSpineNode.globalId,\n targetGlobalId: beliefSpineNode.globalId,\n edgeType: \"informs\",\n weight: args.weight,\n confidence,\n context,\n reasoningMethod: \"testimonial\",\n derivationType: \"evidence_sl_scoring\",\n metadata: {\n relation: args.relation,\n confidence,\n impactScore: args.weight,\n invariant: \"evidence.belief_impact_required\",\n },\n createdBy: args.createdBy,\n createdAt: Date.now(),\n updatedAt: Date.now(),\n projectId: args.beliefNode.projectId,\n topicId: args.beliefNode.topicId ? String(args.beliefNode.topicId) : undefined,\n fromNodeType: \"evidence\",\n toNodeType: \"belief\",\n fromLayer: \"L2\",\n toLayer: \"L3\",\n });\n\n await ctx.scheduler.runAfter(0, internal.neo4jEdgeAPI.createEdge, {\n globalId,\n fromGlobalId: evidenceSpineNode.globalId,\n toGlobalId: beliefSpineNode.globalId,\n edgeType: \"informs\",\n weight: args.weight,\n confidence,\n context,\n projectId: args.beliefNode.projectId ? String(args.beliefNode.projectId) : undefined,\n createdBy: args.createdBy,\n fromNodeType: \"evidence\",\n toNodeType: \"belief\",\n fromLayer: \"L2\",\n toLayer: \"L3\",\n });\n }\n } catch (e) {\n console.error(\"[EpistemicSpine] Failed to create informs edge:\", e);\n }\n\n if (args.beliefNode.projectId) {\n await ctx.scheduler.runAfter(0, \"verificationActions:deepVerifyEvidence\", {\n insightId: args.insightId,\n targetType: \"belief\",\n targetId: args.beliefId,\n projectId: args.beliefNode.projectId,\n userId: args.createdBy,\n });\n }\n}\n\nexport async function removeOperationalLinkEffects(\n ctx: MutationCtx,\n args: {\n beliefId: Id<\"epistemicNodes\">;\n insightId: Id<\"epistemicNodes\">;\n relation: BeliefEvidenceRelation;\n },\n): Promise<void> {\n const belief = await ctx.db.get(args.beliefId);\n if (belief) {\n const currentSupporting = belief.supportingInsightIds ?? [];\n const currentContradicting = belief.contradictingInsightIds ?? [];\n\n if (args.relation === \"supports\") {\n await ctx.db.patch(args.beliefId, {\n supportingInsightIds: currentSupporting.filter(\n (id: Id<\"epistemicNodes\">) => id !== args.insightId,\n ),\n });\n } else {\n await ctx.db.patch(args.beliefId, {\n contradictingInsightIds: currentContradicting.filter(\n (id: Id<\"epistemicNodes\">) => id !== args.insightId,\n ),\n });\n }\n }\n\n try {\n const beliefSpineNode = await ctx.db.get(args.beliefId);\n const evidenceSpineNode = await ctx.db.get(args.insightId);\n\n if (\n beliefSpineNode?.nodeType === \"belief\" &&\n evidenceSpineNode?.nodeType === \"evidence\"\n ) {\n const edges = await ctx.db\n .query(\"epistemicEdges\")\n .withIndex(\"by_from_to\", (q: IndexRangeBuilder) =>\n q.eq(\"fromNodeId\", evidenceSpineNode._id).eq(\"toNodeId\", beliefSpineNode._id),\n )\n .collect();\n\n for (const edge of edges) {\n if (edge.edgeType === \"informs\") {\n await ctx.scheduler.runAfter(0, internal.neo4jEdgeAPI.deleteEdge, {\n globalId: edge.globalId,\n });\n await ctx.db.delete(edge._id);\n }\n }\n }\n } catch (e) {\n console.error(\"[EpistemicSpine] Failed to remove informs edge:\", e);\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/convex.ts","../src/epistemicInsert.ts","../src/beliefEvidenceLinks.operational.ts"],"names":[],"mappings":"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","file":"beliefEvidenceLinks.operational.js","sourcesContent":["import {\n actionGeneric,\n anyApi,\n componentsGeneric,\n httpActionGeneric,\n internalActionGeneric,\n internalMutationGeneric,\n internalQueryGeneric,\n mutationGeneric,\n queryGeneric,\n} from \"convex/server\";\nimport type { GenericId } from \"convex/values\";\n\nexport const api = anyApi as any;\nexport const components = componentsGeneric() as any;\nexport const internal = anyApi as any;\n\nexport type TableNames = string;\nexport type Id<TableName extends TableNames = string> = GenericId<TableName>;\nexport type Doc<TableName extends TableNames = string> = any;\nexport type DataModel = any;\ntype IndexRangeBuilder = {\n field(fieldName: string): string;\n eq(fieldName: string, value: unknown): IndexRangeBuilder;\n gt(fieldName: string, value: unknown): IndexRangeBuilder;\n gte(fieldName: string, value: unknown): IndexRangeBuilder;\n lt(fieldName: string, value: unknown): IndexRangeBuilder;\n lte(fieldName: string, value: unknown): IndexRangeBuilder;\n};\ntype FilterBuilder = {\n eq(left: unknown, right: unknown): unknown;\n neq(left: unknown, right: unknown): unknown;\n gt(left: unknown, right: unknown): unknown;\n gte(left: unknown, right: unknown): unknown;\n lt(left: unknown, right: unknown): unknown;\n lte(left: unknown, right: unknown): unknown;\n and(...clauses: unknown[]): unknown;\n or(...clauses: unknown[]): unknown;\n field(fieldName: string): unknown;\n};\ntype QueryInitializer<TableName extends TableNames> = {\n withIndex(\n indexName: string,\n range?: (q: any) => unknown\n ): QueryInitializer<TableName>;\n filter(predicate: (q: any) => unknown): QueryInitializer<TableName>;\n order(direction: \"asc\" | \"desc\"): QueryInitializer<TableName>;\n collect(): Promise<Doc<TableName>[]>;\n take(limit: number): Promise<Doc<TableName>[]>;\n first(): Promise<Doc<TableName> | null>;\n unique(): Promise<Doc<TableName> | null>;\n};\nexport type DatabaseReader = {\n get<TableName extends TableNames>(\n id: Id<TableName>\n ): Promise<Doc<TableName> | null>;\n query<TableName extends TableNames>(\n tableName: TableName\n ): QueryInitializer<TableName>;\n normalizeId?<TableName extends TableNames>(\n tableName: TableName,\n id: string\n ): Id<TableName> | null;\n};\nexport type DatabaseWriter = DatabaseReader & {\n insert<TableName extends TableNames>(\n tableName: TableName,\n value: Record<string, unknown>\n ): Promise<Id<TableName>>;\n patch<TableName extends TableNames>(\n id: Id<TableName>,\n value: Record<string, unknown>\n ): Promise<void>;\n replace<TableName extends TableNames>(\n id: Id<TableName>,\n value: Record<string, unknown>\n ): Promise<void>;\n delete<TableName extends TableNames>(id: Id<TableName>): Promise<void>;\n};\ntype Scheduler = {\n runAfter(delayMs: number, functionReference: unknown, args?: unknown): Promise<void>;\n};\ntype AuthReader = {\n getUserIdentity(): Promise<unknown>;\n};\ntype RuntimeInvoker = {\n runQuery(functionReference: unknown, args?: unknown): Promise<any>;\n runMutation(functionReference: unknown, args?: unknown): Promise<any>;\n runAction(functionReference: unknown, args?: unknown): Promise<any>;\n};\nexport type QueryCtx = RuntimeInvoker & {\n auth: AuthReader;\n db: DatabaseReader;\n scheduler: Scheduler;\n};\nexport type MutationCtx = RuntimeInvoker & {\n auth: AuthReader;\n db: DatabaseWriter;\n scheduler: Scheduler;\n};\nexport type ActionCtx = RuntimeInvoker & {\n auth: AuthReader;\n scheduler: Scheduler;\n};\n\ntype ConvexFunctionBuilder<Ctx> = <\n Definition extends { handler?: (ctx: Ctx, args: any) => any },\n>(\n definition: Definition\n) => any;\n\nexport const action = actionGeneric as unknown as ConvexFunctionBuilder<ActionCtx>;\nexport const httpAction =\n httpActionGeneric as unknown as ConvexFunctionBuilder<ActionCtx>;\nexport const internalAction =\n internalActionGeneric as unknown as ConvexFunctionBuilder<ActionCtx>;\nexport const internalMutation =\n internalMutationGeneric as unknown as ConvexFunctionBuilder<MutationCtx>;\nexport const internalQuery =\n internalQueryGeneric as unknown as ConvexFunctionBuilder<QueryCtx>;\nexport const mutation =\n mutationGeneric as unknown as ConvexFunctionBuilder<MutationCtx>;\nexport const query = queryGeneric as unknown as ConvexFunctionBuilder<QueryCtx>;\n","import type { WithoutSystemFields } from \"convex/server\";\nimport {\n assertUuidV7Identity,\n assertStorageEdgeVocabulary,\n assertCanonicalEdgeEndpoint,\n} from \"@lucern/contracts/ids\";\nimport {\n assertEdgePolicyAllowed,\n edgePolicyManifest,\n type EpistemicNodeType,\n} from \"@lucern/contracts\";\nimport type { Doc, Id, MutationCtx } from \"./convex\";\n\nexport async function insertEpistemicNode(\n ctx: MutationCtx,\n doc: WithoutSystemFields<Doc<\"epistemicNodes\">>,\n): Promise<Id<\"epistemicNodes\">> {\n assertUuidV7Identity(\"epistemicNodes\", doc.globalId);\n return ctx.db.insert(\"epistemicNodes\", doc);\n}\n\nexport async function insertEpistemicEdge(\n ctx: MutationCtx,\n doc: WithoutSystemFields<Doc<\"epistemicEdges\">>,\n): Promise<Id<\"epistemicEdges\">> {\n assertUuidV7Identity(\"epistemicEdges\", doc.globalId);\n\n // R1.1a — STORAGE-VOCABULARY MEMBERSHIP\n assertStorageEdgeVocabulary(doc.edgeType);\n\n // R1.1b — ENDPOINT PRESENCE\n if (!doc.fromNodeId || typeof doc.fromNodeId !== \"string\") {\n throw new Error(\n \"edge_endpoint_missing: epistemicEdges insert requires a non-empty fromNodeId\"\n );\n }\n if (!doc.toNodeId || typeof doc.toNodeId !== \"string\") {\n throw new Error(\n \"edge_endpoint_missing: epistemicEdges insert requires a non-empty toNodeId\"\n );\n }\n\n // C2-RR.4 Defect E — ENDPOINT CANONICAL IDENTITY. Edge endpoints must be the\n // UUIDv7 globalIds of the connected nodes, never Convex doc ids or legacy\n // topic ids. This refuses the mixed _id/globalId endpoint writes at the floor.\n assertCanonicalEdgeEndpoint(\"fromNodeId\", doc.fromNodeId);\n assertCanonicalEdgeEndpoint(\"toNodeId\", doc.toNodeId);\n\n // R1.1c — FULL POLICY ASSERT (when nodeTypes are present and edgeType is in public manifest)\n if (doc.fromNodeType && doc.toNodeType && doc.edgeType !== \"extracted_from\") {\n assertEdgePolicyAllowed(\n edgePolicyManifest,\n doc.edgeType,\n {\n kind: \"epistemic_node\",\n nodeId: doc.fromNodeId,\n nodeType: doc.fromNodeType as EpistemicNodeType,\n },\n {\n kind: \"epistemic_node\",\n nodeId: doc.toNodeId,\n nodeType: doc.toNodeType as EpistemicNodeType,\n }\n );\n }\n\n return ctx.db.insert(\"epistemicEdges\", doc);\n}\n","import type { Id, MutationCtx } from \"./convex\";\nimport { internal } from \"./convex\";\nimport { generateGlobalId } from \"./globalId\";\nimport { insertEpistemicEdge } from \"./epistemicInsert.js\";\n\ntype BeliefEvidenceRelation = \"supports\" | \"contradicts\";\ntype IndexRangeBuilder = {\n eq(fieldName: string, value: unknown): IndexRangeBuilder;\n};\ntype EpistemicNode = {\n _id: Id<\"epistemicNodes\">;\n nodeType?: string;\n globalId?: string;\n projectId?: string;\n topicId?: string | Id<\"topics\">;\n supportingInsightIds?: Id<\"epistemicNodes\">[];\n contradictingInsightIds?: Id<\"epistemicNodes\">[];\n};\n\nfunction assertEvidenceImpact(args: {\n relation: BeliefEvidenceRelation;\n weight: number;\n}) {\n if (\n !Number.isFinite(args.weight) ||\n args.weight === 0 ||\n args.weight < -1 ||\n args.weight > 1\n ) {\n throw new Error(\"Belief evidence links require explicit nonzero weight in [-1, 1]\");\n }\n if (args.relation === \"supports\" && args.weight < 0) {\n throw new Error(\"Supporting evidence links require positive weight\");\n }\n if (args.relation === \"contradicts\" && args.weight > 0) {\n throw new Error(\"Contradicting evidence links require negative weight\");\n }\n}\n\nexport async function applyOperationalLinkEffects(\n ctx: MutationCtx,\n args: {\n beliefNode: EpistemicNode;\n beliefId: Id<\"epistemicNodes\">;\n insightId: Id<\"epistemicNodes\">;\n relation: BeliefEvidenceRelation;\n weight: number;\n rationale?: string;\n createdBy: string;\n },\n): Promise<void> {\n assertEvidenceImpact({ relation: args.relation, weight: args.weight });\n const confidence = Math.abs(args.weight);\n const currentSupporting = args.beliefNode.supportingInsightIds ?? [];\n const currentContradicting = args.beliefNode.contradictingInsightIds ?? [];\n\n if (args.relation === \"supports\" && !currentSupporting.includes(args.insightId)) {\n await ctx.db.patch(args.beliefId, {\n supportingInsightIds: [...currentSupporting, args.insightId],\n contradictingInsightIds: currentContradicting.filter(\n (id: Id<\"epistemicNodes\">) => id !== args.insightId,\n ),\n });\n } else if (\n args.relation === \"contradicts\" &&\n !currentContradicting.includes(args.insightId)\n ) {\n await ctx.db.patch(args.beliefId, {\n contradictingInsightIds: [...currentContradicting, args.insightId],\n supportingInsightIds: currentSupporting.filter(\n (id: Id<\"epistemicNodes\">) => id !== args.insightId,\n ),\n });\n }\n\n try {\n const beliefSpineNode = await ctx.db.get(args.beliefId);\n const evidenceSpineNode = await ctx.db.get(args.insightId);\n\n if (\n beliefSpineNode?.nodeType === \"belief\" &&\n evidenceSpineNode?.nodeType === \"evidence\"\n ) {\n const existingEdges = await ctx.db\n .query(\"epistemicEdges\")\n .withIndex(\"by_from_to\", (q: IndexRangeBuilder) =>\n q\n .eq(\"fromNodeId\", evidenceSpineNode.globalId)\n .eq(\"toNodeId\", beliefSpineNode.globalId),\n )\n .collect();\n\n for (const edge of existingEdges) {\n if (edge.edgeType === \"informs\") {\n await ctx.scheduler.runAfter(0, internal.neo4jEdgeAPI.deleteEdge, {\n globalId: edge.globalId,\n });\n await ctx.db.delete(edge._id);\n }\n }\n\n const globalId = generateGlobalId();\n const context = args.rationale || `Linked as ${args.relation}`;\n await insertEpistemicEdge(ctx, {\n globalId,\n // C2-RR.4 Defect E — canonical UUIDv7 endpoints, not Convex doc ids.\n fromNodeId: evidenceSpineNode.globalId,\n toNodeId: beliefSpineNode.globalId,\n sourceGlobalId: evidenceSpineNode.globalId,\n targetGlobalId: beliefSpineNode.globalId,\n edgeType: \"informs\",\n weight: args.weight,\n confidence,\n context,\n reasoningMethod: \"testimonial\",\n derivationType: \"evidence_sl_scoring\",\n metadata: {\n relation: args.relation,\n confidence,\n impactScore: args.weight,\n invariant: \"evidence.belief_impact_required\",\n },\n createdBy: args.createdBy,\n createdAt: Date.now(),\n updatedAt: Date.now(),\n projectId: args.beliefNode.projectId,\n topicId: args.beliefNode.topicId ? String(args.beliefNode.topicId) : undefined,\n fromNodeType: \"evidence\",\n toNodeType: \"belief\",\n fromLayer: \"L2\",\n toLayer: \"L3\",\n });\n\n await ctx.scheduler.runAfter(0, internal.neo4jEdgeAPI.createEdge, {\n globalId,\n fromGlobalId: evidenceSpineNode.globalId,\n toGlobalId: beliefSpineNode.globalId,\n edgeType: \"informs\",\n weight: args.weight,\n confidence,\n context,\n projectId: args.beliefNode.projectId ? String(args.beliefNode.projectId) : undefined,\n createdBy: args.createdBy,\n fromNodeType: \"evidence\",\n toNodeType: \"belief\",\n fromLayer: \"L2\",\n toLayer: \"L3\",\n });\n }\n } catch (e) {\n console.error(\"[EpistemicSpine] Failed to create informs edge:\", e);\n }\n\n if (args.beliefNode.projectId) {\n await ctx.scheduler.runAfter(0, \"verificationActions:deepVerifyEvidence\", {\n insightId: args.insightId,\n targetType: \"belief\",\n targetId: args.beliefId,\n projectId: args.beliefNode.projectId,\n userId: args.createdBy,\n });\n }\n}\n\nexport async function removeOperationalLinkEffects(\n ctx: MutationCtx,\n args: {\n beliefId: Id<\"epistemicNodes\">;\n insightId: Id<\"epistemicNodes\">;\n relation: BeliefEvidenceRelation;\n },\n): Promise<void> {\n const belief = await ctx.db.get(args.beliefId);\n if (belief) {\n const currentSupporting = belief.supportingInsightIds ?? [];\n const currentContradicting = belief.contradictingInsightIds ?? [];\n\n if (args.relation === \"supports\") {\n await ctx.db.patch(args.beliefId, {\n supportingInsightIds: currentSupporting.filter(\n (id: Id<\"epistemicNodes\">) => id !== args.insightId,\n ),\n });\n } else {\n await ctx.db.patch(args.beliefId, {\n contradictingInsightIds: currentContradicting.filter(\n (id: Id<\"epistemicNodes\">) => id !== args.insightId,\n ),\n });\n }\n }\n\n try {\n const beliefSpineNode = await ctx.db.get(args.beliefId);\n const evidenceSpineNode = await ctx.db.get(args.insightId);\n\n if (\n beliefSpineNode?.nodeType === \"belief\" &&\n evidenceSpineNode?.nodeType === \"evidence\"\n ) {\n const edges = await ctx.db\n .query(\"epistemicEdges\")\n .withIndex(\"by_from_to\", (q: IndexRangeBuilder) =>\n q.eq(\"fromNodeId\", evidenceSpineNode._id).eq(\"toNodeId\", beliefSpineNode._id),\n )\n .collect();\n\n for (const edge of edges) {\n if (edge.edgeType === \"informs\") {\n await ctx.scheduler.runAfter(0, internal.neo4jEdgeAPI.deleteEdge, {\n globalId: edge.globalId,\n });\n await ctx.db.delete(edge._id);\n }\n }\n }\n } catch (e) {\n console.error(\"[EpistemicSpine] Failed to remove informs edge:\", e);\n }\n}\n"]}
@@ -24,6 +24,35 @@ function debugGraphPrimitiveFallback(message, context) {
24
24
 
25
25
  // src/topicScope.ts
26
26
  var LEGACY_SCOPE_FIELD = "graphScopeProjectId";
27
+ async function resolveTopicNodeScopeOrNull(ctx, ref) {
28
+ if (!ctx?.db || typeof ctx.db.query !== "function") {
29
+ return null;
30
+ }
31
+ let node = null;
32
+ try {
33
+ const byGlobalId = await ctx.db.query("epistemicNodes").withIndex("by_globalId", (q) => q.eq("globalId", ref)).first();
34
+ if (byGlobalId && byGlobalId.nodeType === "topic") {
35
+ node = byGlobalId;
36
+ }
37
+ } catch (error) {
38
+ debugGraphPrimitiveFallback(
39
+ "[topicScope] topic-node scope lookup by globalId failed",
40
+ { error, ref }
41
+ );
42
+ }
43
+ if (!node) {
44
+ return null;
45
+ }
46
+ const scopeKey = normalizeScopeValue(node.topicId) ?? normalizeScopeValue(node.globalId);
47
+ if (!scopeKey) {
48
+ return null;
49
+ }
50
+ return {
51
+ topicId: scopeKey,
52
+ projectId: asMappedProjectId(node),
53
+ source: "topic_node"
54
+ };
55
+ }
27
56
  function asMappedProjectId(topic) {
28
57
  if (!topic) {
29
58
  return;
@@ -164,6 +193,13 @@ async function resolveTopicProjectScope(ctx, args) {
164
193
  ) ?? null;
165
194
  }
166
195
  if (!topic) {
196
+ const nodeScope = await resolveTopicNodeScopeOrNull(
197
+ ctx,
198
+ String(args.topicId)
199
+ );
200
+ if (nodeScope) {
201
+ return nodeScope;
202
+ }
167
203
  throw new Error(`Topic not found: ${String(args.topicId)}`);
168
204
  }
169
205
  const inherited = await resolveInheritedWorkspaceScope(ctx, topic);
@@ -234,6 +270,16 @@ async function resolveTopicProjectScope(ctx, args) {
234
270
  source: "project_mapped_topic"
235
271
  };
236
272
  }
273
+ const nodeScope = await resolveTopicNodeScopeOrNull(
274
+ ctx,
275
+ String(args.projectId)
276
+ );
277
+ if (nodeScope) {
278
+ return {
279
+ ...nodeScope,
280
+ projectId: nodeScope.projectId ?? String(args.projectId)
281
+ };
282
+ }
237
283
  throw new Error(
238
284
  `Legacy project scope ${String(args.projectId)} has no mapped topic.`
239
285
  );
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/convex.ts","../src/debug.ts","../src/topicScope.ts","../src/scopeResolverCompat.ts","../src/contradictions.ts"],"names":["normalizeScopeValue","topicId","v"],"mappings":"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","file":"contradictions.js","sourcesContent":["import {\n actionGeneric,\n anyApi,\n componentsGeneric,\n httpActionGeneric,\n internalActionGeneric,\n internalMutationGeneric,\n internalQueryGeneric,\n mutationGeneric,\n queryGeneric,\n} from \"convex/server\";\nimport type { GenericId } from \"convex/values\";\n\nexport const api = anyApi as any;\nexport const components = componentsGeneric() as any;\nexport const internal = anyApi as any;\n\nexport type TableNames = string;\nexport type Id<TableName extends TableNames = string> = GenericId<TableName>;\nexport type Doc<TableName extends TableNames = string> = any;\nexport type DataModel = any;\ntype IndexRangeBuilder = {\n field(fieldName: string): string;\n eq(fieldName: string, value: unknown): IndexRangeBuilder;\n gt(fieldName: string, value: unknown): IndexRangeBuilder;\n gte(fieldName: string, value: unknown): IndexRangeBuilder;\n lt(fieldName: string, value: unknown): IndexRangeBuilder;\n lte(fieldName: string, value: unknown): IndexRangeBuilder;\n};\ntype FilterBuilder = {\n eq(left: unknown, right: unknown): unknown;\n neq(left: unknown, right: unknown): unknown;\n gt(left: unknown, right: unknown): unknown;\n gte(left: unknown, right: unknown): unknown;\n lt(left: unknown, right: unknown): unknown;\n lte(left: unknown, right: unknown): unknown;\n and(...clauses: unknown[]): unknown;\n or(...clauses: unknown[]): unknown;\n field(fieldName: string): unknown;\n};\ntype QueryInitializer<TableName extends TableNames> = {\n withIndex(\n indexName: string,\n range?: (q: any) => unknown\n ): QueryInitializer<TableName>;\n filter(predicate: (q: any) => unknown): QueryInitializer<TableName>;\n order(direction: \"asc\" | \"desc\"): QueryInitializer<TableName>;\n collect(): Promise<Doc<TableName>[]>;\n take(limit: number): Promise<Doc<TableName>[]>;\n first(): Promise<Doc<TableName> | null>;\n unique(): Promise<Doc<TableName> | null>;\n};\nexport type DatabaseReader = {\n get<TableName extends TableNames>(\n id: Id<TableName>\n ): Promise<Doc<TableName> | null>;\n query<TableName extends TableNames>(\n tableName: TableName\n ): QueryInitializer<TableName>;\n normalizeId?<TableName extends TableNames>(\n tableName: TableName,\n id: string\n ): Id<TableName> | null;\n};\nexport type DatabaseWriter = DatabaseReader & {\n insert<TableName extends TableNames>(\n tableName: TableName,\n value: Record<string, unknown>\n ): Promise<Id<TableName>>;\n patch<TableName extends TableNames>(\n id: Id<TableName>,\n value: Record<string, unknown>\n ): Promise<void>;\n replace<TableName extends TableNames>(\n id: Id<TableName>,\n value: Record<string, unknown>\n ): Promise<void>;\n delete<TableName extends TableNames>(id: Id<TableName>): Promise<void>;\n};\ntype Scheduler = {\n runAfter(delayMs: number, functionReference: unknown, args?: unknown): Promise<void>;\n};\ntype AuthReader = {\n getUserIdentity(): Promise<unknown>;\n};\ntype RuntimeInvoker = {\n runQuery(functionReference: unknown, args?: unknown): Promise<any>;\n runMutation(functionReference: unknown, args?: unknown): Promise<any>;\n runAction(functionReference: unknown, args?: unknown): Promise<any>;\n};\nexport type QueryCtx = RuntimeInvoker & {\n auth: AuthReader;\n db: DatabaseReader;\n scheduler: Scheduler;\n};\nexport type MutationCtx = RuntimeInvoker & {\n auth: AuthReader;\n db: DatabaseWriter;\n scheduler: Scheduler;\n};\nexport type ActionCtx = RuntimeInvoker & {\n auth: AuthReader;\n scheduler: Scheduler;\n};\n\ntype ConvexFunctionBuilder<Ctx> = <\n Definition extends { handler?: (ctx: Ctx, args: any) => any },\n>(\n definition: Definition\n) => any;\n\nexport const action = actionGeneric as unknown as ConvexFunctionBuilder<ActionCtx>;\nexport const httpAction =\n httpActionGeneric as unknown as ConvexFunctionBuilder<ActionCtx>;\nexport const internalAction =\n internalActionGeneric as unknown as ConvexFunctionBuilder<ActionCtx>;\nexport const internalMutation =\n internalMutationGeneric as unknown as ConvexFunctionBuilder<MutationCtx>;\nexport const internalQuery =\n internalQueryGeneric as unknown as ConvexFunctionBuilder<QueryCtx>;\nexport const mutation =\n mutationGeneric as unknown as ConvexFunctionBuilder<MutationCtx>;\nexport const query = queryGeneric as unknown as ConvexFunctionBuilder<QueryCtx>;\n","type GraphPrimitiveDebugEnvironment = {\n process?: {\n env?: Record<string, string | undefined>;\n };\n};\n\nfunction isGraphPrimitiveDebugEnabled(): boolean {\n const env = (globalThis as GraphPrimitiveDebugEnvironment).process?.env;\n return (\n env?.LUCERN_COMPAT_FALLBACK_DEBUG === \"1\" ||\n env?.LUCERN_GRAPH_DEBUG === \"1\"\n );\n}\n\nexport function formatGraphPrimitiveError(error: unknown): string {\n if (error instanceof Error) {\n return `${error.name}: ${error.message}`;\n }\n if (typeof error === \"string\") {\n return error;\n }\n if (error === null) {\n return \"null\";\n }\n if (error === undefined) {\n return \"undefined\";\n }\n try {\n return JSON.stringify(error);\n } catch {\n return Object.prototype.toString.call(error);\n }\n}\n\nexport function debugGraphPrimitiveFallback(\n message: string,\n context?: Record<string, unknown>\n): void {\n if (!isGraphPrimitiveDebugEnabled()) {\n return;\n }\n console.debug(message, context ?? {});\n}\n","/** Topic-scope resolution helpers for graph-primitive operations. */\nimport { v } from \"convex/values\";\nimport { api as appApi } from \"./convex\";\nimport type { Id } from \"./convex\";\nimport { debugGraphPrimitiveFallback } from \"./debug\";\n\nconst LEGACY_SCOPE_FIELD = \"graphScope\" + \"ProjectId\";\n\ntype TopicDoc = Record<string, unknown> & {\n _id: Id<\"topics\">;\n globalId?: string;\n name?: string;\n depth?: number;\n createdAt?: number;\n parentTopicId?: Id<\"topics\">;\n tenantId?: string;\n workspaceId?: string;\n metadata?: Record<string, unknown>;\n};\n\nexport type TopicProjectScope = {\n topicId: Id<\"topics\">;\n projectId?: string;\n tenantId?: string;\n workspaceId?: string;\n source: \"topic\" | \"project_mapped_topic\" | \"topic_inferred\";\n};\n\ntype MaterializedTopicNodeDoc = {\n _id: string | Id<\"epistemicNodes\">;\n metadata?: Record<string, unknown>;\n};\n\nfunction asMappedProjectId(\n topic: TopicDoc | null | undefined,\n): string | undefined {\n if (!topic) {\n return;\n }\n const directLegacyProjectId = normalizeScopeValue(topic[LEGACY_SCOPE_FIELD]);\n if (directLegacyProjectId) {\n return directLegacyProjectId;\n }\n const metadata = (topic.metadata || {}) as Record<string, unknown>;\n const candidate =\n (metadata[LEGACY_SCOPE_FIELD] as string | undefined) ||\n (metadata.legacyProjectId as string | undefined) ||\n (metadata.projectId as string | undefined) ||\n (metadata.scopeProjectId as string | undefined);\n return candidate ? (candidate as string) : undefined;\n}\n\nfunction normalizeScopeValue(value: unknown): string | undefined {\n if (typeof value !== \"string\") {\n return;\n }\n const normalized = value.trim();\n return normalized.length > 0 ? normalized : undefined;\n}\n\nfunction pickPrimaryTopic(candidates: TopicDoc[]): TopicDoc | undefined {\n return [...candidates].sort((a, b) => {\n const depthA = a.depth ?? 9999;\n const depthB = b.depth ?? 9999;\n if (depthA !== depthB) {\n return depthA - depthB;\n }\n const createdA = a.createdAt ?? Number.MAX_SAFE_INTEGER;\n const createdB = b.createdAt ?? Number.MAX_SAFE_INTEGER;\n if (createdA !== createdB) {\n return createdA - createdB;\n }\n return String(a.name || \"\").localeCompare(String(b.name || \"\"));\n })[0];\n}\n\nasync function findTopicsByScopeAlias(\n ctx: any,\n scopeId: string,\n): Promise<TopicDoc[]> {\n try {\n return (await ctx.db\n .query(\"topics\")\n .withIndex(\"by_graph_scope_project\", (q: any) =>\n q.eq(LEGACY_SCOPE_FIELD, scopeId),\n )\n .collect()) as TopicDoc[];\n } catch (error) {\n debugGraphPrimitiveFallback(\n \"[topicScope] Failed to resolve scope alias via index\",\n {\n error,\n scopeId,\n },\n );\n // Older Lucern dev deployments can lag index backfills while still carrying\n // the underlying topics table. Scan and filter so scope resolution keeps\n // working during the rollout.\n const topics = (await ctx.db.query(\"topics\").collect()) as TopicDoc[];\n return topics.filter((topic) => {\n const normalizedGlobalId = normalizeScopeValue(topic.globalId);\n const mappedProjectId = asMappedProjectId(topic);\n return (\n String(topic._id) === scopeId ||\n normalizedGlobalId === scopeId ||\n mappedProjectId === scopeId\n );\n });\n }\n}\n\nasync function tryResolveHostTopicById(\n ctx: any,\n topicId: string,\n): Promise<TopicDoc | null> {\n if (typeof ctx.runQuery !== \"function\") {\n return null;\n }\n try {\n return ((await ctx.runQuery(appApi.topics.get as any, {\n id: topicId,\n })) ?? null) as TopicDoc | null;\n } catch (error) {\n debugGraphPrimitiveFallback(\n \"[topicScope] Failed to resolve topic by host query\",\n {\n error,\n topicId,\n },\n );\n return null;\n }\n}\n\nasync function tryResolveHostTopicByLegacyScope(\n ctx: any,\n legacyScopeId: string,\n): Promise<TopicDoc | null> {\n if (typeof ctx.runQuery !== \"function\") {\n return null;\n }\n try {\n return ((await ctx.runQuery(appApi.topics.getByLegacyScopeId as any, {\n projectId: legacyScopeId,\n })) ?? null) as TopicDoc | null;\n } catch (error) {\n debugGraphPrimitiveFallback(\n \"[topicScope] Failed to resolve topic by legacy scope\",\n {\n error,\n legacyScopeId,\n },\n );\n return null;\n }\n}\n\nexport function readMaterializedTopicTableId(\n topicNode: MaterializedTopicNodeDoc | null | undefined,\n): string | undefined {\n if (!topicNode) {\n return;\n }\n\n const metadata = (topicNode.metadata || {}) as Record<string, unknown>;\n const topicTableId =\n (metadata.topicTableId as string | undefined) ||\n (metadata.topicId as string | undefined);\n\n return typeof topicTableId === \"string\" && topicTableId.trim().length > 0\n ? topicTableId.trim()\n : undefined;\n}\n\n/**\n * Walk the topic parent chain to find inherited workspaceId and tenantId.\n * Mirrors the pattern used by resolveTopicOntology for ontologyId inheritance.\n * Max depth: 10 (defensive limit against pathological nesting).\n */\nasync function resolveInheritedWorkspaceScope(\n ctx: any,\n topic: TopicDoc,\n): Promise<{ tenantId?: string; workspaceId?: string }> {\n const MAX_DEPTH = 10;\n let tenantId = normalizeScopeValue(topic.tenantId);\n let workspaceId = normalizeScopeValue(topic.workspaceId);\n\n if (tenantId && workspaceId) {\n return { tenantId, workspaceId };\n }\n\n let current: TopicDoc | null = topic;\n for (let i = 0; i < MAX_DEPTH && current?.parentTopicId; i++) {\n current = (await ctx.db.get(current.parentTopicId)) as TopicDoc | null;\n if (!current) break;\n\n if (!tenantId) {\n tenantId = normalizeScopeValue(current.tenantId);\n }\n if (!workspaceId) {\n workspaceId = normalizeScopeValue(current.workspaceId);\n }\n if (tenantId && workspaceId) break;\n }\n\n return { tenantId, workspaceId };\n}\n\nexport async function resolveTopicProjectScope(\n ctx: any,\n args: { topicId?: Id<\"topics\"> | string; projectId?: string },\n): Promise<TopicProjectScope> {\n if (args.topicId) {\n // Try direct lookup, fall back to the legacy mapped-project bridge\n let topic: TopicDoc | null = null;\n try {\n topic = (await ctx.db.get(\n args.topicId as Id<\"topics\">,\n )) as TopicDoc | null;\n } catch (error) {\n debugGraphPrimitiveFallback(\n \"[topicScope] Failed to load topic by direct id\",\n {\n error,\n topicId: args.topicId,\n },\n );\n // Not a valid topics table ID\n }\n if (!topic) {\n topic = await tryResolveHostTopicById(ctx, String(args.topicId));\n }\n if (!topic) {\n // Try as legacy projectId / globalId via the mapped-project bridge.\n topic =\n pickPrimaryTopic(\n await findTopicsByScopeAlias(ctx, String(args.topicId)),\n ) ?? null;\n }\n if (!topic) {\n throw new Error(`Topic not found: ${String(args.topicId)}`);\n }\n const inherited = await resolveInheritedWorkspaceScope(ctx, topic);\n const mapped = asMappedProjectId(topic);\n if (mapped) {\n return {\n topicId: topic._id,\n projectId: mapped,\n tenantId: inherited.tenantId,\n workspaceId: inherited.workspaceId,\n source: \"topic\",\n };\n }\n return {\n topicId: topic._id,\n tenantId: inherited.tenantId,\n workspaceId: inherited.workspaceId,\n source: \"topic\",\n };\n }\n\n if (args.projectId) {\n let directTopic: TopicDoc | null = null;\n try {\n directTopic = (await ctx.db.get(\n args.projectId as Id<\"topics\">,\n )) as TopicDoc | null;\n } catch (error) {\n debugGraphPrimitiveFallback(\n \"[topicScope] Failed to load direct project topic\",\n {\n error,\n projectId: args.projectId,\n },\n );\n // Not a valid topics table ID, continue to legacy graph-scope lookup.\n }\n\n if (directTopic) {\n const inherited = await resolveInheritedWorkspaceScope(ctx, directTopic);\n const mapped = asMappedProjectId(directTopic);\n return {\n topicId: directTopic._id,\n projectId: mapped ?? args.projectId,\n tenantId: inherited.tenantId,\n workspaceId: inherited.workspaceId,\n source: \"topic_inferred\",\n };\n }\n\n directTopic = await tryResolveHostTopicByLegacyScope(ctx, args.projectId);\n if (directTopic) {\n const inherited = await resolveInheritedWorkspaceScope(ctx, directTopic);\n const mapped = asMappedProjectId(directTopic);\n return {\n topicId: directTopic._id,\n projectId: mapped ?? args.projectId,\n tenantId: inherited.tenantId,\n workspaceId: inherited.workspaceId,\n source: \"topic_inferred\",\n };\n }\n\n const topics = await findTopicsByScopeAlias(ctx, args.projectId);\n const primary = pickPrimaryTopic(topics);\n if (primary) {\n const inherited = await resolveInheritedWorkspaceScope(ctx, primary);\n return {\n topicId: primary._id,\n projectId: args.projectId,\n tenantId: inherited.tenantId,\n workspaceId: inherited.workspaceId,\n source: \"project_mapped_topic\",\n };\n }\n throw new Error(\n `Legacy project scope ${String(args.projectId)} has no mapped topic.`,\n );\n }\n\n throw new Error(\n \"Missing scope: provide topicId (preferred) or legacy projectId alias.\",\n );\n}\n\n/** Shared scope args for graph-primitive functions. topicId is canonical; projectId is a legacy alias. */\nexport const optionalScopeArgs = {\n projectId: v.optional(v.string()),\n topicId: v.optional(v.string()),\n} as const;\n","import { optionalScopeArgs, resolveTopicProjectScope } from \"./topicScope\";\nimport { debugGraphPrimitiveFallback } from \"./debug\";\n\nexport const scopeArgs = optionalScopeArgs;\n\nexport type ResolvedScope = Awaited<\n ReturnType<typeof resolveTopicProjectScope>\n>;\nexport type SoftResolvedScope = {\n topicId?: string;\n projectId?: string;\n tenantId?: string;\n workspaceId?: string;\n source?: ResolvedScope[\"source\"];\n};\n\nfunction normalizeScopeValue(value: unknown): string | undefined {\n if (typeof value !== \"string\") {\n return;\n }\n const normalized = value.trim();\n return normalized.length > 0 ? normalized : undefined;\n}\n\nexport async function resolveScope(\n ctx: any,\n args: { topicId?: string | null; projectId?: string | null },\n): Promise<ResolvedScope | null> {\n const topicId = normalizeScopeValue(args.topicId);\n const projectId = normalizeScopeValue(args.projectId);\n if (!topicId && !projectId) {\n return null;\n }\n\n try {\n return await resolveTopicProjectScope(ctx, {\n topicId,\n projectId,\n });\n } catch (error) {\n debugGraphPrimitiveFallback(\n \"[scopeResolverCompat] Failed to resolve scope\",\n {\n error,\n topicId,\n projectId,\n },\n );\n return null;\n }\n}\n\nexport async function resolveScopeSoft(\n ctx: any,\n args: { topicId?: string | null; projectId?: string | null },\n): Promise<SoftResolvedScope> {\n const resolved = await resolveScope(ctx, args);\n if (resolved) {\n const topicId = normalizeScopeValue(resolved.topicId);\n return {\n ...(topicId ? { topicId } : {}),\n ...(resolved.projectId ? { projectId: resolved.projectId } : {}),\n ...(resolved.tenantId ? { tenantId: resolved.tenantId } : {}),\n ...(resolved.workspaceId ? { workspaceId: resolved.workspaceId } : {}),\n ...(resolved.source ? { source: resolved.source } : {}),\n };\n }\n\n const topicId = normalizeScopeValue(args.topicId);\n const projectId = normalizeScopeValue(args.projectId);\n return {\n ...(topicId ? { topicId } : {}),\n ...(projectId ? { projectId } : {}),\n };\n}\n","/**\n * Contradiction Detection & Surfacing (Phase 8.3)\n *\n * Contradictions are GOLD. When evidence conflicts for a belief,\n * that's a signal to dig deeper. This module detects, tracks, and\n * helps resolve contradictions in the belief system.\n */\n\nimport { v } from \"convex/values\";\nimport { internal } from \"./convex\";\nimport type { Id } from \"./convex\";\nimport { mutation, query } from \"./convex\";\nimport { checkProjectAccess, requireProjectAccess } from \"@lucern/access-control/access\";\nimport { resolveScopeSoft, scopeArgs } from \"./scopeResolverCompat\";\nimport { permissiveReturn } from \"@lucern/contracts/schema-helpers/validators\";\nimport type { MutationCtx, QueryCtx } from \"./convex\";\n\ntype ContradictionSource = \"evidence_links\" | \"tuple_space\";\ntype ContradictionStatus =\n | \"unresolved\"\n | \"investigating\"\n | \"resolved_support\"\n | \"resolved_contra\"\n | \"belief_forked\";\ntype ContradictionSeverity = \"critical\" | \"significant\" | \"minor\";\ntype IndexQueryBuilder = {\n eq(field: string, value: unknown): IndexQueryBuilder;\n};\n\n// IDs are now always epistemicNodes IDs (backfill complete)\nconst _beliefIdUnion = v.id(\"epistemicNodes\");\nconst _insightIdUnion = v.id(\"epistemicNodes\");\nconst DEFAULT_CONTRADICTION_SOURCE: ContradictionSource = \"evidence_links\";\nconst TUPLE_SPACE_CONTRADICTION_SOURCE: ContradictionSource = \"tuple_space\";\n\ntype BeliefRecord = {\n _id: Id<\"epistemicNodes\">;\n canonicalText: string;\n status: string;\n criticality?: string | null;\n};\n\ntype EvidenceLink = {\n relation: \"supports\" | \"contradicts\";\n insightId: Id<\"epistemicNodes\">;\n};\n\ntype ContradictionRow = {\n _id: Id<\"contradictions\">;\n beliefId: Id<\"epistemicNodes\">;\n beliefBId?: Id<\"epistemicNodes\"> | null;\n projectId?: string | null;\n topicId: string;\n supportingInsightIds: Id<\"epistemicNodes\">[];\n contradictingInsightIds: Id<\"epistemicNodes\">[];\n status: ContradictionStatus;\n severity: ContradictionSeverity;\n source?: ContradictionSource | null;\n description?: string | null;\n detectionMethod?: string | null;\n aiAnalysis?:\n | {\n summary: string;\n likelyExplanation: string;\n suggestedResolution: string;\n confidenceInAnalysis: number;\n analyzedAt: number;\n }\n | null;\n resolutionSprintId?: string | null;\n resolution?: unknown;\n resolvedAt?: number | null;\n createdBy?: string;\n detectedAt?: number;\n};\n\nfunction contradictionSourceOf(\n contradiction: { source?: unknown } | null | undefined\n): ContradictionSource {\n return contradiction?.source === TUPLE_SPACE_CONTRADICTION_SOURCE\n ? TUPLE_SPACE_CONTRADICTION_SOURCE\n : DEFAULT_CONTRADICTION_SOURCE;\n}\n\n// =============================================================================\n// QUERIES\n// =============================================================================\n\n/**\n * Detect contradictions for a project\n * Finds beliefs that have both supporting AND contradicting evidence\n */\nexport const detectContradictions = query({\n args: {\n ...scopeArgs,\n includeResolved: v.optional(v.boolean()),\n },\n returns: permissiveReturn,\n handler: async (\n ctx: QueryCtx,\n args: { includeResolved?: boolean; projectId?: string; topicId?: string }\n ) => {\n const scope = await resolveScopeSoft(ctx, args);\n const projectId = scope.projectId;\n if (!projectId) {\n return []; // graceful: scope resolver guarantees projectId\n }\n\n // Get all beliefs from epistemic spine\n const beliefs = (await ctx.runQuery(\n internal.epistemicBeliefs.internalGetByProject,\n {\n projectId,\n }\n )) as BeliefRecord[];\n\n // Get all belief-evidence links\n const contradictionCandidates: Array<{\n beliefId: Id<\"epistemicNodes\">;\n belief: BeliefRecord;\n supportingInsights: Array<BeliefRecord>;\n contradictingInsights: Array<BeliefRecord>;\n existingContradiction?: ContradictionRow;\n }> = [];\n\n for (const belief of beliefs) {\n // Get evidence links for this belief\n const evidenceLinks = (await ctx.db\n .query(\"beliefEvidenceLinks\")\n .withIndex(\"by_beliefId\", (q: IndexQueryBuilder) =>\n q.eq(\"beliefId\", belief._id),\n )\n .collect()) as EvidenceLink[];\n\n const supportingLinks = evidenceLinks.filter(\n (l) => l.relation === \"supports\"\n );\n const contradictingLinks = evidenceLinks.filter(\n (l) => l.relation === \"contradicts\"\n );\n\n // Only flag as contradiction if BOTH supporting AND contradicting evidence exists\n if (supportingLinks.length > 0 && contradictingLinks.length > 0) {\n // Fetch the actual insights\n const supportingInsights = await Promise.all(\n supportingLinks.map((l) => ctx.db.get(l.insightId))\n );\n const contradictingInsights = await Promise.all(\n contradictingLinks.map((l) => ctx.db.get(l.insightId))\n );\n\n // Check if there's already a tracked contradiction\n const existingContradictions = (await ctx.db\n .query(\"contradictions\")\n .withIndex(\"by_beliefId\", (q: IndexQueryBuilder) =>\n q.eq(\"beliefId\", belief._id),\n )\n .collect()) as ContradictionRow[];\n const existingContradiction = existingContradictions.find(\n (candidate) =>\n contradictionSourceOf(candidate) === DEFAULT_CONTRADICTION_SOURCE\n );\n\n // Skip resolved contradictions unless explicitly requested\n if (\n existingContradiction &&\n !args.includeResolved &&\n existingContradiction.status !== \"unresolved\" &&\n existingContradiction.status !== \"investigating\"\n ) {\n continue;\n }\n\n contradictionCandidates.push({\n beliefId: belief._id,\n belief,\n supportingInsights: supportingInsights.filter(\n Boolean\n ) as BeliefRecord[],\n contradictingInsights: contradictingInsights.filter(\n Boolean\n ) as BeliefRecord[],\n existingContradiction: existingContradiction ?? undefined,\n });\n }\n }\n\n return contradictionCandidates;\n },\n});\n\n/**\n * Get all tracked contradictions for a project\n */\nexport const getByProject = query({\n args: {\n ...scopeArgs,\n userId: v.string(),\n status: v.optional(\n v.union(\n v.literal(\"unresolved\"),\n v.literal(\"investigating\"),\n v.literal(\"resolved_support\"),\n v.literal(\"resolved_contra\"),\n v.literal(\"belief_forked\")\n )\n ),\n limit: v.optional(v.number()),\n },\n returns: permissiveReturn,\n handler: async (\n ctx: QueryCtx,\n args: {\n projectId?: string;\n topicId?: string;\n userId: string;\n status?:\n | \"unresolved\"\n | \"investigating\"\n | \"resolved_support\"\n | \"resolved_contra\"\n | \"belief_forked\";\n limit?: number;\n }\n ) => {\n const scope = await resolveScopeSoft(ctx, args);\n const projectId = scope.projectId;\n if (!projectId) {\n return []; // graceful: scope resolver guarantees projectId\n }\n\n const hasAccess = await checkProjectAccess(ctx, projectId, args.userId);\n if (!hasAccess) {\n return [];\n }\n const pageSize = Math.max(1, Math.min(Math.floor(args.limit ?? 200), 1000));\n const scanLimit = Math.min(pageSize * 3, 1000);\n\n let contradictions: ContradictionRow[];\n\n if (args.status) {\n const status = args.status; // Capture in local variable for type narrowing\n contradictions = await ctx.db\n .query(\"contradictions\")\n .withIndex(\"by_topic_status\", (q: IndexQueryBuilder) =>\n q.eq(\"topicId\", String(scope.topicId ?? projectId)).eq(\"status\", status)\n )\n .order(\"desc\")\n .take(scanLimit);\n } else {\n contradictions = await ctx.db\n .query(\"contradictions\")\n .withIndex(\"by_topicId\", (q: IndexQueryBuilder) =>\n q.eq(\"topicId\", String(scope.topicId ?? projectId))\n )\n .order(\"desc\")\n .take(scanLimit);\n }\n\n // Enrich with belief and insight data\n const enriched = await Promise.all(\n contradictions.slice(0, pageSize).map(async (c: ContradictionRow) => {\n const belief = await ctx.db.get(c.beliefId);\n const supportingInsights = await Promise.all(\n c.supportingInsightIds.map((id) => ctx.db.get(id))\n );\n const contradictingInsights = await Promise.all(\n c.contradictingInsightIds.map((id) => ctx.db.get(id))\n );\n\n return {\n ...c,\n belief,\n supportingInsights: supportingInsights.filter(Boolean),\n contradictingInsights: contradictingInsights.filter(Boolean),\n };\n })\n );\n\n return enriched;\n },\n});\n\n/**\n * Get unresolved contradiction count for dashboard\n */\nexport const getUnresolvedCount = query({\n args: {\n ...scopeArgs,\n },\n returns: permissiveReturn,\n handler: async (\n ctx: QueryCtx,\n args: { projectId?: string; topicId?: string }\n ) => {\n const scope = await resolveScopeSoft(ctx, args);\n const projectId = scope.projectId;\n if (!projectId) {\n return {\n total: 0,\n critical: 0,\n significant: 0,\n minor: 0,\n };\n }\n\n const contradictions = (await ctx.db\n .query(\"contradictions\")\n .withIndex(\"by_topic_status\", (q: IndexQueryBuilder) =>\n q.eq(\"topicId\", String(scope.topicId ?? projectId)).eq(\"status\", \"unresolved\")\n )\n .collect()) as ContradictionRow[];\n\n const critical = contradictions.filter(\n (c) => c.severity === \"critical\"\n ).length;\n const significant = contradictions.filter(\n (c) => c.severity === \"significant\"\n ).length;\n const minor = contradictions.filter((c) => c.severity === \"minor\").length;\n\n return {\n total: contradictions.length,\n critical,\n significant,\n minor,\n };\n },\n});\n\n/**\n * Get a single contradiction with full context\n */\nexport const getById = query({\n args: { contradictionId: v.id(\"contradictions\") },\n returns: permissiveReturn,\n handler: async (\n ctx: QueryCtx,\n args: { contradictionId: Id<\"contradictions\"> }\n ) => {\n const contradiction = (await ctx.db.get(args.contradictionId)) as\n | ContradictionRow\n | null;\n if (!contradiction) {\n return null;\n }\n\n const belief = await ctx.db.get(contradiction.beliefId);\n const supportingInsights = await Promise.all(\n contradiction.supportingInsightIds.map((id) => ctx.db.get(id))\n );\n const contradictingInsights = await Promise.all(\n contradiction.contradictingInsightIds.map((id) => ctx.db.get(id))\n );\n\n return {\n ...contradiction,\n belief,\n supportingInsights: supportingInsights.filter(Boolean),\n contradictingInsights: contradictingInsights.filter(Boolean),\n resolutionSprintId: contradiction.resolutionSprintId ?? null,\n };\n },\n});\n\n// =============================================================================\n// MUTATIONS\n// =============================================================================\n\n/**\n * Track a new contradiction\n */\nexport const create = mutation({\n args: {\n ...scopeArgs,\n beliefId: v.id(\"epistemicNodes\"),\n beliefBId: v.optional(v.id(\"epistemicNodes\")),\n supportingInsightIds: v.array(v.id(\"epistemicNodes\")),\n contradictingInsightIds: v.array(v.id(\"epistemicNodes\")),\n severity: v.union(\n v.literal(\"critical\"),\n v.literal(\"significant\"),\n v.literal(\"minor\")\n ),\n source: v.optional(\n v.union(\n v.literal(\"evidence_links\"),\n v.literal(\"tuple_space\")\n )\n ),\n description: v.optional(v.string()),\n detectionMethod: v.optional(\n v.union(\n v.literal(\"semantic\"),\n v.literal(\"keyword\"),\n v.literal(\"manual\"),\n v.literal(\"agent\")\n )\n ),\n aiAnalysis: v.optional(\n v.object({\n summary: v.string(),\n likelyExplanation: v.string(),\n suggestedResolution: v.string(),\n confidenceInAnalysis: v.number(),\n analyzedAt: v.number(),\n })\n ),\n createdBy: v.string(),\n },\n returns: permissiveReturn,\n handler: async (\n ctx: MutationCtx,\n args: {\n projectId?: string;\n topicId?: string;\n beliefId: Id<\"epistemicNodes\">;\n beliefBId?: Id<\"epistemicNodes\">;\n supportingInsightIds: Id<\"epistemicNodes\">[];\n contradictingInsightIds: Id<\"epistemicNodes\">[];\n severity: ContradictionSeverity;\n source?: ContradictionSource;\n description?: string;\n detectionMethod?: string;\n aiAnalysis?:\n | {\n summary: string;\n likelyExplanation: string;\n suggestedResolution: string;\n confidenceInAnalysis: number;\n analyzedAt: number;\n }\n | null;\n createdBy: string;\n }\n ) => {\n const scope = await resolveScopeSoft(ctx, args);\n const projectId = scope.projectId;\n if (!projectId) {\n return {\n created: 0,\n updated: 0,\n };\n }\n\n const now = Date.now();\n const source = args.source ?? DEFAULT_CONTRADICTION_SOURCE;\n\n // Evidence-link contradictions preserve the current \"merge evidence into the\n // active record\" behavior. Tuple-space contradictions are append-only and\n // should create a fresh record on each threshold crossing.\n const existingRows = (await ctx.db\n .query(\"contradictions\")\n .withIndex(\"by_beliefId\", (q: IndexQueryBuilder) => q.eq(\"beliefId\", args.beliefId))\n .collect()) as ContradictionRow[];\n const existing = existingRows.find(\n (row) =>\n contradictionSourceOf(row) === source &&\n (args.beliefBId ? String(row.beliefBId ?? \"\") === String(args.beliefBId) : true)\n );\n\n if (existing && source !== TUPLE_SPACE_CONTRADICTION_SOURCE) {\n // Update existing contradiction with new evidence\n await ctx.db.patch(existing._id, {\n supportingInsightIds: [\n ...new Set([\n ...existing.supportingInsightIds,\n ...args.supportingInsightIds,\n ]),\n ],\n contradictingInsightIds: [\n ...new Set([\n ...existing.contradictingInsightIds,\n ...args.contradictingInsightIds,\n ]),\n ],\n severity: args.severity,\n description: args.description ?? existing.description,\n detectionMethod: args.detectionMethod ?? existing.detectionMethod,\n aiAnalysis: args.aiAnalysis,\n });\n return existing._id;\n }\n\n // Create new contradiction\n return await ctx.db.insert(\"contradictions\", {\n projectId,\n topicId: String(scope.topicId ?? projectId),\n beliefId: args.beliefId,\n ...(args.beliefBId ? { beliefBId: args.beliefBId } : {}),\n supportingInsightIds: args.supportingInsightIds,\n contradictingInsightIds: args.contradictingInsightIds,\n source,\n ...(args.description ? { description: args.description } : {}),\n ...(args.detectionMethod ? { detectionMethod: args.detectionMethod } : {}),\n resolutionStatus: \"unresolved\", // Lucern: required field\n status: \"unresolved\", // Legacy: kept for backward compat\n severity: args.severity,\n aiAnalysis: args.aiAnalysis,\n detectedAt: now,\n createdBy: args.createdBy,\n });\n },\n});\n\n/**\n * Update contradiction status\n *\n * INVARIANT #14 ENFORCEMENT: All state transitions logged to epistemicAudit\n */\nexport const updateStatus = mutation({\n args: {\n contradictionId: v.id(\"contradictions\"),\n status: v.union(\n v.literal(\"unresolved\"),\n v.literal(\"investigating\"),\n v.literal(\"resolved_support\"),\n v.literal(\"resolved_contra\"),\n v.literal(\"belief_forked\")\n ),\n resolutionSprintId: v.optional(v.string()),\n userId: v.optional(v.string()), // Added for audit trail\n },\n returns: permissiveReturn,\n handler: async (\n ctx: MutationCtx,\n args: {\n contradictionId: Id<\"contradictions\">;\n status: ContradictionStatus;\n resolutionSprintId?: string;\n userId?: string;\n }\n ) => {\n const existing = await ctx.db.get(args.contradictionId);\n if (!existing) {\n throw new Error(\"Contradiction not found\");\n }\n\n // Access control\n if (existing.projectId && args.userId) {\n await requireProjectAccess(ctx, existing.projectId, args.userId);\n }\n\n const now = Date.now();\n const update: Record<string, unknown> = { status: args.status };\n\n if (args.resolutionSprintId) {\n update.resolutionSprintId = args.resolutionSprintId;\n }\n\n if (\n args.status.startsWith(\"resolved_\") ||\n args.status === \"belief_forked\"\n ) {\n update.resolvedAt = now;\n }\n\n await ctx.db.patch(args.contradictionId, update);\n\n // ============================================================\n // INVARIANT #14: No silent state transitions\n // Log all status changes to epistemicAudit\n // ============================================================\n if (existing.status !== args.status) {\n await ctx.db.insert(\"epistemicAudit\", {\n entityType: \"contradiction\",\n entityId: args.contradictionId as unknown as string,\n changeType: \"status_changed\",\n changedAt: now,\n changedBy: args.userId ?? \"system\",\n isAgent: !args.userId,\n previousState: { status: existing.status },\n newState: {\n status: args.status,\n resolutionSprintId: args.resolutionSprintId,\n },\n rationale: `Contradiction status changed from ${existing.status} to ${args.status}`,\n projectId: existing.projectId,\n });\n }\n\n return { success: true };\n },\n});\n\n/**\n * Resolve a contradiction with findings\n *\n * INVARIANT #14 ENFORCEMENT: All state transitions logged to epistemicAudit\n */\nexport const resolve = mutation({\n args: {\n contradictionId: v.id(\"contradictions\"),\n verdict: v.string(),\n reasoning: v.string(),\n beliefUpdate: v.string(),\n resolvedBy: v.string(),\n newStatus: v.union(\n v.literal(\"resolved_support\"),\n v.literal(\"resolved_contra\"),\n v.literal(\"belief_forked\")\n ),\n },\n returns: permissiveReturn,\n handler: async (\n ctx: MutationCtx,\n args: {\n contradictionId: Id<\"contradictions\">;\n verdict: string;\n reasoning: string;\n beliefUpdate: string;\n resolvedBy: string;\n newStatus: Exclude<ContradictionStatus, \"unresolved\" | \"investigating\">;\n }\n ) => {\n const existing = await ctx.db.get(args.contradictionId);\n if (!existing) {\n throw new Error(\"Contradiction not found\");\n }\n\n // Access control\n if (existing.projectId) {\n await requireProjectAccess(ctx, existing.projectId, args.resolvedBy);\n }\n\n const now = Date.now();\n\n await ctx.db.patch(args.contradictionId, {\n status: args.newStatus,\n resolution: {\n verdict: args.verdict,\n reasoning: args.reasoning,\n beliefUpdate: args.beliefUpdate,\n resolvedBy: args.resolvedBy,\n },\n resolvedAt: now,\n });\n\n // ============================================================\n // INVARIANT #14: No silent state transitions\n // Log resolution to epistemicAudit with full context\n // ============================================================\n await ctx.db.insert(\"epistemicAudit\", {\n entityType: \"contradiction\",\n entityId: args.contradictionId as unknown as string,\n changeType: \"resolved\",\n changedAt: now,\n changedBy: args.resolvedBy,\n isAgent: false,\n previousState: { status: existing.status },\n newState: {\n status: args.newStatus,\n verdict: args.verdict,\n beliefUpdate: args.beliefUpdate,\n },\n rationale: `Contradiction resolved: ${args.verdict}. Reasoning: ${args.reasoning}`,\n projectId: existing.projectId,\n });\n\n // Flywheel: After resolution, re-scan the affected belief neighborhood\n // Resolution may shift confidence, revealing new contradictions\n await ctx.scheduler.runAfter(\n 5000, // 5s delay\n internal.bi.contradictionSemanticDetector.scanAffectedBeliefs,\n {\n beliefId: existing.beliefId as string,\n projectId: existing.projectId,\n }\n );\n\n return { success: true };\n },\n});\n\n/**\n * Update severity assessment\n *\n * INVARIANT #14 ENFORCEMENT: All state transitions logged to epistemicAudit\n */\nexport const updateSeverity = mutation({\n args: {\n contradictionId: v.id(\"contradictions\"),\n severity: v.union(\n v.literal(\"critical\"),\n v.literal(\"significant\"),\n v.literal(\"minor\")\n ),\n userId: v.optional(v.string()), // Added for audit trail\n },\n returns: permissiveReturn,\n handler: async (\n ctx: MutationCtx,\n args: {\n contradictionId: Id<\"contradictions\">;\n severity: ContradictionSeverity;\n userId?: string;\n }\n ) => {\n const existing = await ctx.db.get(args.contradictionId);\n if (!existing) {\n throw new Error(\"Contradiction not found\");\n }\n\n const now = Date.now();\n await ctx.db.patch(args.contradictionId, { severity: args.severity });\n\n // ============================================================\n // INVARIANT #14: No silent state transitions\n // Log severity changes to epistemicAudit\n // ============================================================\n if (existing.severity !== args.severity) {\n await ctx.db.insert(\"epistemicAudit\", {\n entityType: \"contradiction\",\n entityId: args.contradictionId as unknown as string,\n changeType: \"severity_changed\",\n changedAt: now,\n changedBy: args.userId ?? \"system\",\n isAgent: !args.userId,\n previousState: { severity: existing.severity },\n newState: { severity: args.severity },\n rationale: `Contradiction severity changed from ${existing.severity} to ${args.severity}`,\n projectId: existing.projectId,\n });\n }\n\n return { success: true };\n },\n});\n\n/**\n * Add AI analysis to a contradiction\n */\nexport const addAiAnalysis = mutation({\n args: {\n contradictionId: v.id(\"contradictions\"),\n summary: v.string(),\n likelyExplanation: v.string(),\n suggestedResolution: v.string(),\n confidenceInAnalysis: v.number(),\n },\n returns: permissiveReturn,\n handler: async (\n ctx: MutationCtx,\n args: {\n contradictionId: Id<\"contradictions\">;\n summary: string;\n likelyExplanation: string;\n suggestedResolution: string;\n confidenceInAnalysis: number;\n }\n ) => {\n await ctx.db.patch(args.contradictionId, {\n aiAnalysis: {\n summary: args.summary,\n likelyExplanation: args.likelyExplanation,\n suggestedResolution: args.suggestedResolution,\n confidenceInAnalysis: args.confidenceInAnalysis,\n analyzedAt: Date.now(),\n },\n });\n return { success: true };\n },\n});\n\n/**\n * Scan project and auto-create contradictions for any beliefs with conflicting evidence\n * Called by cron job or manually\n */\nexport const scanAndCreateContradictions = mutation({\n args: {\n ...scopeArgs,\n createdBy: v.string(),\n },\n returns: permissiveReturn,\n handler: async (\n ctx: MutationCtx,\n args: { projectId?: string; topicId?: string; createdBy: string }\n ) => {\n const scope = await resolveScopeSoft(ctx, args);\n const projectId = scope.projectId;\n if (!projectId) {\n return { created: 0, updated: 0 }; // graceful: scope resolver guarantees projectId\n }\n\n const now = Date.now();\n\n // Get all beliefs from epistemic spine\n const beliefs = (await ctx.runQuery(\n internal.epistemicBeliefs.internalGetByProject,\n {\n projectId,\n }\n )) as BeliefRecord[];\n\n let created = 0;\n let updated = 0;\n\n for (const belief of beliefs) {\n // Get evidence links for this belief\n const evidenceLinks = (await ctx.db\n .query(\"beliefEvidenceLinks\")\n .withIndex(\"by_beliefId\", (q: IndexQueryBuilder) =>\n q.eq(\"beliefId\", belief._id),\n )\n .collect()) as EvidenceLink[];\n\n const supportingIds = evidenceLinks\n .filter((l) => l.relation === \"supports\")\n .map((l) => l.insightId);\n const contradictingIds = evidenceLinks\n .filter((l) => l.relation === \"contradicts\")\n .map((l) => l.insightId);\n\n // Only create contradiction if BOTH sides have evidence\n if (supportingIds.length > 0 && contradictingIds.length > 0) {\n // Check if contradiction already exists\n const existingRows = (await ctx.db\n .query(\"contradictions\")\n .withIndex(\"by_beliefId\", (q: IndexQueryBuilder) =>\n q.eq(\"beliefId\", belief._id),\n )\n .collect()) as ContradictionRow[];\n const existing = existingRows.find(\n (candidate) =>\n contradictionSourceOf(candidate) === DEFAULT_CONTRADICTION_SOURCE\n );\n\n // Determine severity based on belief criticality\n let severity: ContradictionSeverity = \"significant\";\n if (belief.criticality === \"blocking\") {\n severity = \"critical\";\n } else if (belief.criticality === \"supporting\") {\n severity = \"minor\";\n }\n\n if (existing) {\n // Update existing with any new evidence\n const newSupporting = supportingIds.filter(\n (id) => !existing.supportingInsightIds.includes(id)\n );\n const newContradicting = contradictingIds.filter(\n (id) => !existing.contradictingInsightIds.includes(id)\n );\n\n if (newSupporting.length > 0 || newContradicting.length > 0) {\n await ctx.db.patch(existing._id, {\n supportingInsightIds: [\n ...existing.supportingInsightIds,\n ...newSupporting,\n ],\n contradictingInsightIds: [\n ...existing.contradictingInsightIds,\n ...newContradicting,\n ],\n severity,\n });\n updated++;\n }\n } else {\n // Create new contradiction\n await ctx.db.insert(\"contradictions\", {\n projectId,\n topicId: String(scope.topicId ?? projectId),\n beliefId: belief._id,\n supportingInsightIds: supportingIds,\n contradictingInsightIds: contradictingIds,\n source: DEFAULT_CONTRADICTION_SOURCE,\n resolutionStatus: \"unresolved\", // Lucern: required field\n status: \"unresolved\", // Legacy: kept for backward compat\n severity,\n detectedAt: now,\n createdBy: args.createdBy,\n });\n created++;\n }\n }\n }\n\n return { created, updated };\n },\n});\n"]}
1
+ {"version":3,"sources":["../src/convex.ts","../src/debug.ts","../src/topicScope.ts","../src/scopeResolverCompat.ts","../src/contradictions.ts"],"names":["normalizeScopeValue","topicId","v"],"mappings":"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","file":"contradictions.js","sourcesContent":["import {\n actionGeneric,\n anyApi,\n componentsGeneric,\n httpActionGeneric,\n internalActionGeneric,\n internalMutationGeneric,\n internalQueryGeneric,\n mutationGeneric,\n queryGeneric,\n} from \"convex/server\";\nimport type { GenericId } from \"convex/values\";\n\nexport const api = anyApi as any;\nexport const components = componentsGeneric() as any;\nexport const internal = anyApi as any;\n\nexport type TableNames = string;\nexport type Id<TableName extends TableNames = string> = GenericId<TableName>;\nexport type Doc<TableName extends TableNames = string> = any;\nexport type DataModel = any;\ntype IndexRangeBuilder = {\n field(fieldName: string): string;\n eq(fieldName: string, value: unknown): IndexRangeBuilder;\n gt(fieldName: string, value: unknown): IndexRangeBuilder;\n gte(fieldName: string, value: unknown): IndexRangeBuilder;\n lt(fieldName: string, value: unknown): IndexRangeBuilder;\n lte(fieldName: string, value: unknown): IndexRangeBuilder;\n};\ntype FilterBuilder = {\n eq(left: unknown, right: unknown): unknown;\n neq(left: unknown, right: unknown): unknown;\n gt(left: unknown, right: unknown): unknown;\n gte(left: unknown, right: unknown): unknown;\n lt(left: unknown, right: unknown): unknown;\n lte(left: unknown, right: unknown): unknown;\n and(...clauses: unknown[]): unknown;\n or(...clauses: unknown[]): unknown;\n field(fieldName: string): unknown;\n};\ntype QueryInitializer<TableName extends TableNames> = {\n withIndex(\n indexName: string,\n range?: (q: any) => unknown\n ): QueryInitializer<TableName>;\n filter(predicate: (q: any) => unknown): QueryInitializer<TableName>;\n order(direction: \"asc\" | \"desc\"): QueryInitializer<TableName>;\n collect(): Promise<Doc<TableName>[]>;\n take(limit: number): Promise<Doc<TableName>[]>;\n first(): Promise<Doc<TableName> | null>;\n unique(): Promise<Doc<TableName> | null>;\n};\nexport type DatabaseReader = {\n get<TableName extends TableNames>(\n id: Id<TableName>\n ): Promise<Doc<TableName> | null>;\n query<TableName extends TableNames>(\n tableName: TableName\n ): QueryInitializer<TableName>;\n normalizeId?<TableName extends TableNames>(\n tableName: TableName,\n id: string\n ): Id<TableName> | null;\n};\nexport type DatabaseWriter = DatabaseReader & {\n insert<TableName extends TableNames>(\n tableName: TableName,\n value: Record<string, unknown>\n ): Promise<Id<TableName>>;\n patch<TableName extends TableNames>(\n id: Id<TableName>,\n value: Record<string, unknown>\n ): Promise<void>;\n replace<TableName extends TableNames>(\n id: Id<TableName>,\n value: Record<string, unknown>\n ): Promise<void>;\n delete<TableName extends TableNames>(id: Id<TableName>): Promise<void>;\n};\ntype Scheduler = {\n runAfter(delayMs: number, functionReference: unknown, args?: unknown): Promise<void>;\n};\ntype AuthReader = {\n getUserIdentity(): Promise<unknown>;\n};\ntype RuntimeInvoker = {\n runQuery(functionReference: unknown, args?: unknown): Promise<any>;\n runMutation(functionReference: unknown, args?: unknown): Promise<any>;\n runAction(functionReference: unknown, args?: unknown): Promise<any>;\n};\nexport type QueryCtx = RuntimeInvoker & {\n auth: AuthReader;\n db: DatabaseReader;\n scheduler: Scheduler;\n};\nexport type MutationCtx = RuntimeInvoker & {\n auth: AuthReader;\n db: DatabaseWriter;\n scheduler: Scheduler;\n};\nexport type ActionCtx = RuntimeInvoker & {\n auth: AuthReader;\n scheduler: Scheduler;\n};\n\ntype ConvexFunctionBuilder<Ctx> = <\n Definition extends { handler?: (ctx: Ctx, args: any) => any },\n>(\n definition: Definition\n) => any;\n\nexport const action = actionGeneric as unknown as ConvexFunctionBuilder<ActionCtx>;\nexport const httpAction =\n httpActionGeneric as unknown as ConvexFunctionBuilder<ActionCtx>;\nexport const internalAction =\n internalActionGeneric as unknown as ConvexFunctionBuilder<ActionCtx>;\nexport const internalMutation =\n internalMutationGeneric as unknown as ConvexFunctionBuilder<MutationCtx>;\nexport const internalQuery =\n internalQueryGeneric as unknown as ConvexFunctionBuilder<QueryCtx>;\nexport const mutation =\n mutationGeneric as unknown as ConvexFunctionBuilder<MutationCtx>;\nexport const query = queryGeneric as unknown as ConvexFunctionBuilder<QueryCtx>;\n","type GraphPrimitiveDebugEnvironment = {\n process?: {\n env?: Record<string, string | undefined>;\n };\n};\n\nfunction isGraphPrimitiveDebugEnabled(): boolean {\n const env = (globalThis as GraphPrimitiveDebugEnvironment).process?.env;\n return (\n env?.LUCERN_COMPAT_FALLBACK_DEBUG === \"1\" ||\n env?.LUCERN_GRAPH_DEBUG === \"1\"\n );\n}\n\nexport function formatGraphPrimitiveError(error: unknown): string {\n if (error instanceof Error) {\n return `${error.name}: ${error.message}`;\n }\n if (typeof error === \"string\") {\n return error;\n }\n if (error === null) {\n return \"null\";\n }\n if (error === undefined) {\n return \"undefined\";\n }\n try {\n return JSON.stringify(error);\n } catch {\n return Object.prototype.toString.call(error);\n }\n}\n\nexport function debugGraphPrimitiveFallback(\n message: string,\n context?: Record<string, unknown>\n): void {\n if (!isGraphPrimitiveDebugEnabled()) {\n return;\n }\n console.debug(message, context ?? {});\n}\n","/** Topic-scope resolution helpers for graph-primitive operations. */\nimport { v } from \"convex/values\";\nimport { api as appApi } from \"./convex\";\nimport type { Id } from \"./convex\";\nimport { debugGraphPrimitiveFallback } from \"./debug\";\n\nconst LEGACY_SCOPE_FIELD = \"graphScope\" + \"ProjectId\";\n\ntype TopicDoc = Record<string, unknown> & {\n _id: Id<\"topics\">;\n globalId?: string;\n name?: string;\n depth?: number;\n createdAt?: number;\n parentTopicId?: Id<\"topics\">;\n tenantId?: string;\n workspaceId?: string;\n metadata?: Record<string, unknown>;\n};\n\nexport type TopicProjectScope = {\n topicId: Id<\"topics\">;\n projectId?: string;\n tenantId?: string;\n workspaceId?: string;\n source:\n | \"topic\"\n | \"project_mapped_topic\"\n | \"topic_inferred\"\n | \"topic_node\";\n};\n\n/**\n * RR.5 (legacy topics-table retirement) — graph-primitives mirror of the\n * kernel's epistemicNodes-first topic-scope fallback. Kept in lockstep with\n * `packages/reasoning-kernel/src/adapters/lib/topicScope.ts`\n * (`tests/unit/convex/topic-scope-fallbacks.test.ts` asserts parity).\n *\n * Resolves a topic that exists only as `epistemicNodes(nodeType=\"topic\")` —\n * the write-of-record — when no legacy `topics` row backs the ref, returning the\n * node's `topicId` self-key so scoped beliefs/evidence/questions stay reachable.\n * See the kernel module for the full silent-empty-result rationale.\n */\ntype TopicNodeScopeDoc = {\n _id: string | Id<\"epistemicNodes\">;\n globalId?: string;\n nodeType?: string;\n topicId?: string;\n metadata?: Record<string, unknown>;\n};\n\nasync function resolveTopicNodeScopeOrNull(\n ctx: any,\n ref: string,\n): Promise<TopicProjectScope | null> {\n if (!ctx?.db || typeof ctx.db.query !== \"function\") {\n return null;\n }\n\n let node: TopicNodeScopeDoc | null = null;\n\n // 1. The ref IS the topic node's UUIDv7 globalId.\n try {\n const byGlobalId = (await ctx.db\n .query(\"epistemicNodes\")\n .withIndex(\"by_globalId\", (q: any) => q.eq(\"globalId\", ref))\n .first()) as TopicNodeScopeDoc | null;\n if (byGlobalId && byGlobalId.nodeType === \"topic\") {\n node = byGlobalId;\n }\n } catch (error) {\n debugGraphPrimitiveFallback(\n \"[topicScope] topic-node scope lookup by globalId failed\",\n { error, ref },\n );\n }\n\n if (!node) {\n return null;\n }\n\n const scopeKey =\n normalizeScopeValue(node.topicId) ?? normalizeScopeValue(node.globalId);\n if (!scopeKey) {\n return null;\n }\n\n return {\n topicId: scopeKey as Id<\"topics\">,\n projectId: asMappedProjectId(node as unknown as TopicDoc),\n source: \"topic_node\",\n };\n}\n\ntype MaterializedTopicNodeDoc = {\n _id: string | Id<\"epistemicNodes\">;\n metadata?: Record<string, unknown>;\n};\n\nfunction asMappedProjectId(\n topic: TopicDoc | null | undefined,\n): string | undefined {\n if (!topic) {\n return;\n }\n const directLegacyProjectId = normalizeScopeValue(topic[LEGACY_SCOPE_FIELD]);\n if (directLegacyProjectId) {\n return directLegacyProjectId;\n }\n const metadata = (topic.metadata || {}) as Record<string, unknown>;\n const candidate =\n (metadata[LEGACY_SCOPE_FIELD] as string | undefined) ||\n (metadata.legacyProjectId as string | undefined) ||\n (metadata.projectId as string | undefined) ||\n (metadata.scopeProjectId as string | undefined);\n return candidate ? (candidate as string) : undefined;\n}\n\nfunction normalizeScopeValue(value: unknown): string | undefined {\n if (typeof value !== \"string\") {\n return;\n }\n const normalized = value.trim();\n return normalized.length > 0 ? normalized : undefined;\n}\n\nfunction pickPrimaryTopic(candidates: TopicDoc[]): TopicDoc | undefined {\n return [...candidates].sort((a, b) => {\n const depthA = a.depth ?? 9999;\n const depthB = b.depth ?? 9999;\n if (depthA !== depthB) {\n return depthA - depthB;\n }\n const createdA = a.createdAt ?? Number.MAX_SAFE_INTEGER;\n const createdB = b.createdAt ?? Number.MAX_SAFE_INTEGER;\n if (createdA !== createdB) {\n return createdA - createdB;\n }\n return String(a.name || \"\").localeCompare(String(b.name || \"\"));\n })[0];\n}\n\nasync function findTopicsByScopeAlias(\n ctx: any,\n scopeId: string,\n): Promise<TopicDoc[]> {\n try {\n return (await ctx.db\n .query(\"topics\")\n .withIndex(\"by_graph_scope_project\", (q: any) =>\n q.eq(LEGACY_SCOPE_FIELD, scopeId),\n )\n .collect()) as TopicDoc[];\n } catch (error) {\n debugGraphPrimitiveFallback(\n \"[topicScope] Failed to resolve scope alias via index\",\n {\n error,\n scopeId,\n },\n );\n // Older Lucern dev deployments can lag index backfills while still carrying\n // the underlying topics table. Scan and filter so scope resolution keeps\n // working during the rollout.\n const topics = (await ctx.db.query(\"topics\").collect()) as TopicDoc[];\n return topics.filter((topic) => {\n const normalizedGlobalId = normalizeScopeValue(topic.globalId);\n const mappedProjectId = asMappedProjectId(topic);\n return (\n String(topic._id) === scopeId ||\n normalizedGlobalId === scopeId ||\n mappedProjectId === scopeId\n );\n });\n }\n}\n\nasync function tryResolveHostTopicById(\n ctx: any,\n topicId: string,\n): Promise<TopicDoc | null> {\n if (typeof ctx.runQuery !== \"function\") {\n return null;\n }\n try {\n return ((await ctx.runQuery(appApi.topics.get as any, {\n id: topicId,\n })) ?? null) as TopicDoc | null;\n } catch (error) {\n debugGraphPrimitiveFallback(\n \"[topicScope] Failed to resolve topic by host query\",\n {\n error,\n topicId,\n },\n );\n return null;\n }\n}\n\nasync function tryResolveHostTopicByLegacyScope(\n ctx: any,\n legacyScopeId: string,\n): Promise<TopicDoc | null> {\n if (typeof ctx.runQuery !== \"function\") {\n return null;\n }\n try {\n return ((await ctx.runQuery(appApi.topics.getByLegacyScopeId as any, {\n projectId: legacyScopeId,\n })) ?? null) as TopicDoc | null;\n } catch (error) {\n debugGraphPrimitiveFallback(\n \"[topicScope] Failed to resolve topic by legacy scope\",\n {\n error,\n legacyScopeId,\n },\n );\n return null;\n }\n}\n\nexport function readMaterializedTopicTableId(\n topicNode: MaterializedTopicNodeDoc | null | undefined,\n): string | undefined {\n if (!topicNode) {\n return;\n }\n\n const metadata = (topicNode.metadata || {}) as Record<string, unknown>;\n const topicTableId =\n (metadata.topicTableId as string | undefined) ||\n (metadata.topicId as string | undefined);\n\n return typeof topicTableId === \"string\" && topicTableId.trim().length > 0\n ? topicTableId.trim()\n : undefined;\n}\n\n/**\n * Walk the topic parent chain to find inherited workspaceId and tenantId.\n * Mirrors the pattern used by resolveTopicOntology for ontologyId inheritance.\n * Max depth: 10 (defensive limit against pathological nesting).\n */\nasync function resolveInheritedWorkspaceScope(\n ctx: any,\n topic: TopicDoc,\n): Promise<{ tenantId?: string; workspaceId?: string }> {\n const MAX_DEPTH = 10;\n let tenantId = normalizeScopeValue(topic.tenantId);\n let workspaceId = normalizeScopeValue(topic.workspaceId);\n\n if (tenantId && workspaceId) {\n return { tenantId, workspaceId };\n }\n\n let current: TopicDoc | null = topic;\n for (let i = 0; i < MAX_DEPTH && current?.parentTopicId; i++) {\n current = (await ctx.db.get(current.parentTopicId)) as TopicDoc | null;\n if (!current) break;\n\n if (!tenantId) {\n tenantId = normalizeScopeValue(current.tenantId);\n }\n if (!workspaceId) {\n workspaceId = normalizeScopeValue(current.workspaceId);\n }\n if (tenantId && workspaceId) break;\n }\n\n return { tenantId, workspaceId };\n}\n\nexport async function resolveTopicProjectScope(\n ctx: any,\n args: { topicId?: Id<\"topics\"> | string; projectId?: string },\n): Promise<TopicProjectScope> {\n if (args.topicId) {\n // Try direct lookup, fall back to the legacy mapped-project bridge\n let topic: TopicDoc | null = null;\n try {\n topic = (await ctx.db.get(\n args.topicId as Id<\"topics\">,\n )) as TopicDoc | null;\n } catch (error) {\n debugGraphPrimitiveFallback(\n \"[topicScope] Failed to load topic by direct id\",\n {\n error,\n topicId: args.topicId,\n },\n );\n // Not a valid topics table ID\n }\n if (!topic) {\n topic = await tryResolveHostTopicById(ctx, String(args.topicId));\n }\n if (!topic) {\n // Try as legacy projectId / globalId via the mapped-project bridge.\n topic =\n pickPrimaryTopic(\n await findTopicsByScopeAlias(ctx, String(args.topicId)),\n ) ?? null;\n }\n if (!topic) {\n // RR.5: no legacy topics row — resolve the canonical topic node store\n // before throwing (silent-empty-result fix).\n const nodeScope = await resolveTopicNodeScopeOrNull(\n ctx,\n String(args.topicId),\n );\n if (nodeScope) {\n return nodeScope;\n }\n throw new Error(`Topic not found: ${String(args.topicId)}`);\n }\n const inherited = await resolveInheritedWorkspaceScope(ctx, topic);\n const mapped = asMappedProjectId(topic);\n if (mapped) {\n return {\n topicId: topic._id,\n projectId: mapped,\n tenantId: inherited.tenantId,\n workspaceId: inherited.workspaceId,\n source: \"topic\",\n };\n }\n return {\n topicId: topic._id,\n tenantId: inherited.tenantId,\n workspaceId: inherited.workspaceId,\n source: \"topic\",\n };\n }\n\n if (args.projectId) {\n let directTopic: TopicDoc | null = null;\n try {\n directTopic = (await ctx.db.get(\n args.projectId as Id<\"topics\">,\n )) as TopicDoc | null;\n } catch (error) {\n debugGraphPrimitiveFallback(\n \"[topicScope] Failed to load direct project topic\",\n {\n error,\n projectId: args.projectId,\n },\n );\n // Not a valid topics table ID, continue to legacy graph-scope lookup.\n }\n\n if (directTopic) {\n const inherited = await resolveInheritedWorkspaceScope(ctx, directTopic);\n const mapped = asMappedProjectId(directTopic);\n return {\n topicId: directTopic._id,\n projectId: mapped ?? args.projectId,\n tenantId: inherited.tenantId,\n workspaceId: inherited.workspaceId,\n source: \"topic_inferred\",\n };\n }\n\n directTopic = await tryResolveHostTopicByLegacyScope(ctx, args.projectId);\n if (directTopic) {\n const inherited = await resolveInheritedWorkspaceScope(ctx, directTopic);\n const mapped = asMappedProjectId(directTopic);\n return {\n topicId: directTopic._id,\n projectId: mapped ?? args.projectId,\n tenantId: inherited.tenantId,\n workspaceId: inherited.workspaceId,\n source: \"topic_inferred\",\n };\n }\n\n const topics = await findTopicsByScopeAlias(ctx, args.projectId);\n const primary = pickPrimaryTopic(topics);\n if (primary) {\n const inherited = await resolveInheritedWorkspaceScope(ctx, primary);\n return {\n topicId: primary._id,\n projectId: args.projectId,\n tenantId: inherited.tenantId,\n workspaceId: inherited.workspaceId,\n source: \"project_mapped_topic\",\n };\n }\n // RR.5: try the canonical topic node store before failing.\n const nodeScope = await resolveTopicNodeScopeOrNull(\n ctx,\n String(args.projectId),\n );\n if (nodeScope) {\n return {\n ...nodeScope,\n projectId: nodeScope.projectId ?? String(args.projectId),\n };\n }\n\n throw new Error(\n `Legacy project scope ${String(args.projectId)} has no mapped topic.`,\n );\n }\n\n throw new Error(\n \"Missing scope: provide topicId (preferred) or legacy projectId alias.\",\n );\n}\n\n/** Shared scope args for graph-primitive functions. topicId is canonical; projectId is a legacy alias. */\nexport const optionalScopeArgs = {\n projectId: v.optional(v.string()),\n topicId: v.optional(v.string()),\n} as const;\n","import { optionalScopeArgs, resolveTopicProjectScope } from \"./topicScope\";\nimport { debugGraphPrimitiveFallback } from \"./debug\";\n\nexport const scopeArgs = optionalScopeArgs;\n\nexport type ResolvedScope = Awaited<\n ReturnType<typeof resolveTopicProjectScope>\n>;\nexport type SoftResolvedScope = {\n topicId?: string;\n projectId?: string;\n tenantId?: string;\n workspaceId?: string;\n source?: ResolvedScope[\"source\"];\n};\n\nfunction normalizeScopeValue(value: unknown): string | undefined {\n if (typeof value !== \"string\") {\n return;\n }\n const normalized = value.trim();\n return normalized.length > 0 ? normalized : undefined;\n}\n\nexport async function resolveScope(\n ctx: any,\n args: { topicId?: string | null; projectId?: string | null },\n): Promise<ResolvedScope | null> {\n const topicId = normalizeScopeValue(args.topicId);\n const projectId = normalizeScopeValue(args.projectId);\n if (!topicId && !projectId) {\n return null;\n }\n\n try {\n return await resolveTopicProjectScope(ctx, {\n topicId,\n projectId,\n });\n } catch (error) {\n debugGraphPrimitiveFallback(\n \"[scopeResolverCompat] Failed to resolve scope\",\n {\n error,\n topicId,\n projectId,\n },\n );\n return null;\n }\n}\n\nexport async function resolveScopeSoft(\n ctx: any,\n args: { topicId?: string | null; projectId?: string | null },\n): Promise<SoftResolvedScope> {\n const resolved = await resolveScope(ctx, args);\n if (resolved) {\n const topicId = normalizeScopeValue(resolved.topicId);\n return {\n ...(topicId ? { topicId } : {}),\n ...(resolved.projectId ? { projectId: resolved.projectId } : {}),\n ...(resolved.tenantId ? { tenantId: resolved.tenantId } : {}),\n ...(resolved.workspaceId ? { workspaceId: resolved.workspaceId } : {}),\n ...(resolved.source ? { source: resolved.source } : {}),\n };\n }\n\n const topicId = normalizeScopeValue(args.topicId);\n const projectId = normalizeScopeValue(args.projectId);\n return {\n ...(topicId ? { topicId } : {}),\n ...(projectId ? { projectId } : {}),\n };\n}\n","/**\n * Contradiction Detection & Surfacing (Phase 8.3)\n *\n * Contradictions are GOLD. When evidence conflicts for a belief,\n * that's a signal to dig deeper. This module detects, tracks, and\n * helps resolve contradictions in the belief system.\n */\n\nimport { v } from \"convex/values\";\nimport { internal } from \"./convex\";\nimport type { Id } from \"./convex\";\nimport { mutation, query } from \"./convex\";\nimport { checkProjectAccess, requireProjectAccess } from \"@lucern/access-control/access\";\nimport { resolveScopeSoft, scopeArgs } from \"./scopeResolverCompat\";\nimport { permissiveReturn } from \"@lucern/contracts/schema-helpers/validators\";\nimport type { MutationCtx, QueryCtx } from \"./convex\";\n\ntype ContradictionSource = \"evidence_links\" | \"tuple_space\";\ntype ContradictionStatus =\n | \"unresolved\"\n | \"investigating\"\n | \"resolved_support\"\n | \"resolved_contra\"\n | \"belief_forked\";\ntype ContradictionSeverity = \"critical\" | \"significant\" | \"minor\";\ntype IndexQueryBuilder = {\n eq(field: string, value: unknown): IndexQueryBuilder;\n};\n\n// IDs are now always epistemicNodes IDs (backfill complete)\nconst _beliefIdUnion = v.id(\"epistemicNodes\");\nconst _insightIdUnion = v.id(\"epistemicNodes\");\nconst DEFAULT_CONTRADICTION_SOURCE: ContradictionSource = \"evidence_links\";\nconst TUPLE_SPACE_CONTRADICTION_SOURCE: ContradictionSource = \"tuple_space\";\n\ntype BeliefRecord = {\n _id: Id<\"epistemicNodes\">;\n canonicalText: string;\n status: string;\n criticality?: string | null;\n};\n\ntype EvidenceLink = {\n relation: \"supports\" | \"contradicts\";\n insightId: Id<\"epistemicNodes\">;\n};\n\ntype ContradictionRow = {\n _id: Id<\"contradictions\">;\n beliefId: Id<\"epistemicNodes\">;\n beliefBId?: Id<\"epistemicNodes\"> | null;\n projectId?: string | null;\n topicId: string;\n supportingInsightIds: Id<\"epistemicNodes\">[];\n contradictingInsightIds: Id<\"epistemicNodes\">[];\n status: ContradictionStatus;\n severity: ContradictionSeverity;\n source?: ContradictionSource | null;\n description?: string | null;\n detectionMethod?: string | null;\n aiAnalysis?:\n | {\n summary: string;\n likelyExplanation: string;\n suggestedResolution: string;\n confidenceInAnalysis: number;\n analyzedAt: number;\n }\n | null;\n resolutionSprintId?: string | null;\n resolution?: unknown;\n resolvedAt?: number | null;\n createdBy?: string;\n detectedAt?: number;\n};\n\nfunction contradictionSourceOf(\n contradiction: { source?: unknown } | null | undefined\n): ContradictionSource {\n return contradiction?.source === TUPLE_SPACE_CONTRADICTION_SOURCE\n ? TUPLE_SPACE_CONTRADICTION_SOURCE\n : DEFAULT_CONTRADICTION_SOURCE;\n}\n\n// =============================================================================\n// QUERIES\n// =============================================================================\n\n/**\n * Detect contradictions for a project\n * Finds beliefs that have both supporting AND contradicting evidence\n */\nexport const detectContradictions = query({\n args: {\n ...scopeArgs,\n includeResolved: v.optional(v.boolean()),\n },\n returns: permissiveReturn,\n handler: async (\n ctx: QueryCtx,\n args: { includeResolved?: boolean; projectId?: string; topicId?: string }\n ) => {\n const scope = await resolveScopeSoft(ctx, args);\n const projectId = scope.projectId;\n if (!projectId) {\n return []; // graceful: scope resolver guarantees projectId\n }\n\n // Get all beliefs from epistemic spine\n const beliefs = (await ctx.runQuery(\n internal.epistemicBeliefs.internalGetByProject,\n {\n projectId,\n }\n )) as BeliefRecord[];\n\n // Get all belief-evidence links\n const contradictionCandidates: Array<{\n beliefId: Id<\"epistemicNodes\">;\n belief: BeliefRecord;\n supportingInsights: Array<BeliefRecord>;\n contradictingInsights: Array<BeliefRecord>;\n existingContradiction?: ContradictionRow;\n }> = [];\n\n for (const belief of beliefs) {\n // Get evidence links for this belief\n const evidenceLinks = (await ctx.db\n .query(\"beliefEvidenceLinks\")\n .withIndex(\"by_beliefId\", (q: IndexQueryBuilder) =>\n q.eq(\"beliefId\", belief._id),\n )\n .collect()) as EvidenceLink[];\n\n const supportingLinks = evidenceLinks.filter(\n (l) => l.relation === \"supports\"\n );\n const contradictingLinks = evidenceLinks.filter(\n (l) => l.relation === \"contradicts\"\n );\n\n // Only flag as contradiction if BOTH supporting AND contradicting evidence exists\n if (supportingLinks.length > 0 && contradictingLinks.length > 0) {\n // Fetch the actual insights\n const supportingInsights = await Promise.all(\n supportingLinks.map((l) => ctx.db.get(l.insightId))\n );\n const contradictingInsights = await Promise.all(\n contradictingLinks.map((l) => ctx.db.get(l.insightId))\n );\n\n // Check if there's already a tracked contradiction\n const existingContradictions = (await ctx.db\n .query(\"contradictions\")\n .withIndex(\"by_beliefId\", (q: IndexQueryBuilder) =>\n q.eq(\"beliefId\", belief._id),\n )\n .collect()) as ContradictionRow[];\n const existingContradiction = existingContradictions.find(\n (candidate) =>\n contradictionSourceOf(candidate) === DEFAULT_CONTRADICTION_SOURCE\n );\n\n // Skip resolved contradictions unless explicitly requested\n if (\n existingContradiction &&\n !args.includeResolved &&\n existingContradiction.status !== \"unresolved\" &&\n existingContradiction.status !== \"investigating\"\n ) {\n continue;\n }\n\n contradictionCandidates.push({\n beliefId: belief._id,\n belief,\n supportingInsights: supportingInsights.filter(\n Boolean\n ) as BeliefRecord[],\n contradictingInsights: contradictingInsights.filter(\n Boolean\n ) as BeliefRecord[],\n existingContradiction: existingContradiction ?? undefined,\n });\n }\n }\n\n return contradictionCandidates;\n },\n});\n\n/**\n * Get all tracked contradictions for a project\n */\nexport const getByProject = query({\n args: {\n ...scopeArgs,\n userId: v.string(),\n status: v.optional(\n v.union(\n v.literal(\"unresolved\"),\n v.literal(\"investigating\"),\n v.literal(\"resolved_support\"),\n v.literal(\"resolved_contra\"),\n v.literal(\"belief_forked\")\n )\n ),\n limit: v.optional(v.number()),\n },\n returns: permissiveReturn,\n handler: async (\n ctx: QueryCtx,\n args: {\n projectId?: string;\n topicId?: string;\n userId: string;\n status?:\n | \"unresolved\"\n | \"investigating\"\n | \"resolved_support\"\n | \"resolved_contra\"\n | \"belief_forked\";\n limit?: number;\n }\n ) => {\n const scope = await resolveScopeSoft(ctx, args);\n const projectId = scope.projectId;\n if (!projectId) {\n return []; // graceful: scope resolver guarantees projectId\n }\n\n const hasAccess = await checkProjectAccess(ctx, projectId, args.userId);\n if (!hasAccess) {\n return [];\n }\n const pageSize = Math.max(1, Math.min(Math.floor(args.limit ?? 200), 1000));\n const scanLimit = Math.min(pageSize * 3, 1000);\n\n let contradictions: ContradictionRow[];\n\n if (args.status) {\n const status = args.status; // Capture in local variable for type narrowing\n contradictions = await ctx.db\n .query(\"contradictions\")\n .withIndex(\"by_topic_status\", (q: IndexQueryBuilder) =>\n q.eq(\"topicId\", String(scope.topicId ?? projectId)).eq(\"status\", status)\n )\n .order(\"desc\")\n .take(scanLimit);\n } else {\n contradictions = await ctx.db\n .query(\"contradictions\")\n .withIndex(\"by_topicId\", (q: IndexQueryBuilder) =>\n q.eq(\"topicId\", String(scope.topicId ?? projectId))\n )\n .order(\"desc\")\n .take(scanLimit);\n }\n\n // Enrich with belief and insight data\n const enriched = await Promise.all(\n contradictions.slice(0, pageSize).map(async (c: ContradictionRow) => {\n const belief = await ctx.db.get(c.beliefId);\n const supportingInsights = await Promise.all(\n c.supportingInsightIds.map((id) => ctx.db.get(id))\n );\n const contradictingInsights = await Promise.all(\n c.contradictingInsightIds.map((id) => ctx.db.get(id))\n );\n\n return {\n ...c,\n belief,\n supportingInsights: supportingInsights.filter(Boolean),\n contradictingInsights: contradictingInsights.filter(Boolean),\n };\n })\n );\n\n return enriched;\n },\n});\n\n/**\n * Get unresolved contradiction count for dashboard\n */\nexport const getUnresolvedCount = query({\n args: {\n ...scopeArgs,\n },\n returns: permissiveReturn,\n handler: async (\n ctx: QueryCtx,\n args: { projectId?: string; topicId?: string }\n ) => {\n const scope = await resolveScopeSoft(ctx, args);\n const projectId = scope.projectId;\n if (!projectId) {\n return {\n total: 0,\n critical: 0,\n significant: 0,\n minor: 0,\n };\n }\n\n const contradictions = (await ctx.db\n .query(\"contradictions\")\n .withIndex(\"by_topic_status\", (q: IndexQueryBuilder) =>\n q.eq(\"topicId\", String(scope.topicId ?? projectId)).eq(\"status\", \"unresolved\")\n )\n .collect()) as ContradictionRow[];\n\n const critical = contradictions.filter(\n (c) => c.severity === \"critical\"\n ).length;\n const significant = contradictions.filter(\n (c) => c.severity === \"significant\"\n ).length;\n const minor = contradictions.filter((c) => c.severity === \"minor\").length;\n\n return {\n total: contradictions.length,\n critical,\n significant,\n minor,\n };\n },\n});\n\n/**\n * Get a single contradiction with full context\n */\nexport const getById = query({\n args: { contradictionId: v.id(\"contradictions\") },\n returns: permissiveReturn,\n handler: async (\n ctx: QueryCtx,\n args: { contradictionId: Id<\"contradictions\"> }\n ) => {\n const contradiction = (await ctx.db.get(args.contradictionId)) as\n | ContradictionRow\n | null;\n if (!contradiction) {\n return null;\n }\n\n const belief = await ctx.db.get(contradiction.beliefId);\n const supportingInsights = await Promise.all(\n contradiction.supportingInsightIds.map((id) => ctx.db.get(id))\n );\n const contradictingInsights = await Promise.all(\n contradiction.contradictingInsightIds.map((id) => ctx.db.get(id))\n );\n\n return {\n ...contradiction,\n belief,\n supportingInsights: supportingInsights.filter(Boolean),\n contradictingInsights: contradictingInsights.filter(Boolean),\n resolutionSprintId: contradiction.resolutionSprintId ?? null,\n };\n },\n});\n\n// =============================================================================\n// MUTATIONS\n// =============================================================================\n\n/**\n * Track a new contradiction\n */\nexport const create = mutation({\n args: {\n ...scopeArgs,\n beliefId: v.id(\"epistemicNodes\"),\n beliefBId: v.optional(v.id(\"epistemicNodes\")),\n supportingInsightIds: v.array(v.id(\"epistemicNodes\")),\n contradictingInsightIds: v.array(v.id(\"epistemicNodes\")),\n severity: v.union(\n v.literal(\"critical\"),\n v.literal(\"significant\"),\n v.literal(\"minor\")\n ),\n source: v.optional(\n v.union(\n v.literal(\"evidence_links\"),\n v.literal(\"tuple_space\")\n )\n ),\n description: v.optional(v.string()),\n detectionMethod: v.optional(\n v.union(\n v.literal(\"semantic\"),\n v.literal(\"keyword\"),\n v.literal(\"manual\"),\n v.literal(\"agent\")\n )\n ),\n aiAnalysis: v.optional(\n v.object({\n summary: v.string(),\n likelyExplanation: v.string(),\n suggestedResolution: v.string(),\n confidenceInAnalysis: v.number(),\n analyzedAt: v.number(),\n })\n ),\n createdBy: v.string(),\n },\n returns: permissiveReturn,\n handler: async (\n ctx: MutationCtx,\n args: {\n projectId?: string;\n topicId?: string;\n beliefId: Id<\"epistemicNodes\">;\n beliefBId?: Id<\"epistemicNodes\">;\n supportingInsightIds: Id<\"epistemicNodes\">[];\n contradictingInsightIds: Id<\"epistemicNodes\">[];\n severity: ContradictionSeverity;\n source?: ContradictionSource;\n description?: string;\n detectionMethod?: string;\n aiAnalysis?:\n | {\n summary: string;\n likelyExplanation: string;\n suggestedResolution: string;\n confidenceInAnalysis: number;\n analyzedAt: number;\n }\n | null;\n createdBy: string;\n }\n ) => {\n const scope = await resolveScopeSoft(ctx, args);\n const projectId = scope.projectId;\n if (!projectId) {\n return {\n created: 0,\n updated: 0,\n };\n }\n\n const now = Date.now();\n const source = args.source ?? DEFAULT_CONTRADICTION_SOURCE;\n\n // Evidence-link contradictions preserve the current \"merge evidence into the\n // active record\" behavior. Tuple-space contradictions are append-only and\n // should create a fresh record on each threshold crossing.\n const existingRows = (await ctx.db\n .query(\"contradictions\")\n .withIndex(\"by_beliefId\", (q: IndexQueryBuilder) => q.eq(\"beliefId\", args.beliefId))\n .collect()) as ContradictionRow[];\n const existing = existingRows.find(\n (row) =>\n contradictionSourceOf(row) === source &&\n (args.beliefBId ? String(row.beliefBId ?? \"\") === String(args.beliefBId) : true)\n );\n\n if (existing && source !== TUPLE_SPACE_CONTRADICTION_SOURCE) {\n // Update existing contradiction with new evidence\n await ctx.db.patch(existing._id, {\n supportingInsightIds: [\n ...new Set([\n ...existing.supportingInsightIds,\n ...args.supportingInsightIds,\n ]),\n ],\n contradictingInsightIds: [\n ...new Set([\n ...existing.contradictingInsightIds,\n ...args.contradictingInsightIds,\n ]),\n ],\n severity: args.severity,\n description: args.description ?? existing.description,\n detectionMethod: args.detectionMethod ?? existing.detectionMethod,\n aiAnalysis: args.aiAnalysis,\n });\n return existing._id;\n }\n\n // Create new contradiction\n return await ctx.db.insert(\"contradictions\", {\n projectId,\n topicId: String(scope.topicId ?? projectId),\n beliefId: args.beliefId,\n ...(args.beliefBId ? { beliefBId: args.beliefBId } : {}),\n supportingInsightIds: args.supportingInsightIds,\n contradictingInsightIds: args.contradictingInsightIds,\n source,\n ...(args.description ? { description: args.description } : {}),\n ...(args.detectionMethod ? { detectionMethod: args.detectionMethod } : {}),\n resolutionStatus: \"unresolved\", // Lucern: required field\n status: \"unresolved\", // Legacy: kept for backward compat\n severity: args.severity,\n aiAnalysis: args.aiAnalysis,\n detectedAt: now,\n createdBy: args.createdBy,\n });\n },\n});\n\n/**\n * Update contradiction status\n *\n * INVARIANT #14 ENFORCEMENT: All state transitions logged to epistemicAudit\n */\nexport const updateStatus = mutation({\n args: {\n contradictionId: v.id(\"contradictions\"),\n status: v.union(\n v.literal(\"unresolved\"),\n v.literal(\"investigating\"),\n v.literal(\"resolved_support\"),\n v.literal(\"resolved_contra\"),\n v.literal(\"belief_forked\")\n ),\n resolutionSprintId: v.optional(v.string()),\n userId: v.optional(v.string()), // Added for audit trail\n },\n returns: permissiveReturn,\n handler: async (\n ctx: MutationCtx,\n args: {\n contradictionId: Id<\"contradictions\">;\n status: ContradictionStatus;\n resolutionSprintId?: string;\n userId?: string;\n }\n ) => {\n const existing = await ctx.db.get(args.contradictionId);\n if (!existing) {\n throw new Error(\"Contradiction not found\");\n }\n\n // Access control\n if (existing.projectId && args.userId) {\n await requireProjectAccess(ctx, existing.projectId, args.userId);\n }\n\n const now = Date.now();\n const update: Record<string, unknown> = { status: args.status };\n\n if (args.resolutionSprintId) {\n update.resolutionSprintId = args.resolutionSprintId;\n }\n\n if (\n args.status.startsWith(\"resolved_\") ||\n args.status === \"belief_forked\"\n ) {\n update.resolvedAt = now;\n }\n\n await ctx.db.patch(args.contradictionId, update);\n\n // ============================================================\n // INVARIANT #14: No silent state transitions\n // Log all status changes to epistemicAudit\n // ============================================================\n if (existing.status !== args.status) {\n await ctx.db.insert(\"epistemicAudit\", {\n entityType: \"contradiction\",\n entityId: args.contradictionId as unknown as string,\n changeType: \"status_changed\",\n changedAt: now,\n changedBy: args.userId ?? \"system\",\n isAgent: !args.userId,\n previousState: { status: existing.status },\n newState: {\n status: args.status,\n resolutionSprintId: args.resolutionSprintId,\n },\n rationale: `Contradiction status changed from ${existing.status} to ${args.status}`,\n projectId: existing.projectId,\n });\n }\n\n return { success: true };\n },\n});\n\n/**\n * Resolve a contradiction with findings\n *\n * INVARIANT #14 ENFORCEMENT: All state transitions logged to epistemicAudit\n */\nexport const resolve = mutation({\n args: {\n contradictionId: v.id(\"contradictions\"),\n verdict: v.string(),\n reasoning: v.string(),\n beliefUpdate: v.string(),\n resolvedBy: v.string(),\n newStatus: v.union(\n v.literal(\"resolved_support\"),\n v.literal(\"resolved_contra\"),\n v.literal(\"belief_forked\")\n ),\n },\n returns: permissiveReturn,\n handler: async (\n ctx: MutationCtx,\n args: {\n contradictionId: Id<\"contradictions\">;\n verdict: string;\n reasoning: string;\n beliefUpdate: string;\n resolvedBy: string;\n newStatus: Exclude<ContradictionStatus, \"unresolved\" | \"investigating\">;\n }\n ) => {\n const existing = await ctx.db.get(args.contradictionId);\n if (!existing) {\n throw new Error(\"Contradiction not found\");\n }\n\n // Access control\n if (existing.projectId) {\n await requireProjectAccess(ctx, existing.projectId, args.resolvedBy);\n }\n\n const now = Date.now();\n\n await ctx.db.patch(args.contradictionId, {\n status: args.newStatus,\n resolution: {\n verdict: args.verdict,\n reasoning: args.reasoning,\n beliefUpdate: args.beliefUpdate,\n resolvedBy: args.resolvedBy,\n },\n resolvedAt: now,\n });\n\n // ============================================================\n // INVARIANT #14: No silent state transitions\n // Log resolution to epistemicAudit with full context\n // ============================================================\n await ctx.db.insert(\"epistemicAudit\", {\n entityType: \"contradiction\",\n entityId: args.contradictionId as unknown as string,\n changeType: \"resolved\",\n changedAt: now,\n changedBy: args.resolvedBy,\n isAgent: false,\n previousState: { status: existing.status },\n newState: {\n status: args.newStatus,\n verdict: args.verdict,\n beliefUpdate: args.beliefUpdate,\n },\n rationale: `Contradiction resolved: ${args.verdict}. Reasoning: ${args.reasoning}`,\n projectId: existing.projectId,\n });\n\n // Flywheel: After resolution, re-scan the affected belief neighborhood\n // Resolution may shift confidence, revealing new contradictions\n await ctx.scheduler.runAfter(\n 5000, // 5s delay\n internal.bi.contradictionSemanticDetector.scanAffectedBeliefs,\n {\n beliefId: existing.beliefId as string,\n projectId: existing.projectId,\n }\n );\n\n return { success: true };\n },\n});\n\n/**\n * Update severity assessment\n *\n * INVARIANT #14 ENFORCEMENT: All state transitions logged to epistemicAudit\n */\nexport const updateSeverity = mutation({\n args: {\n contradictionId: v.id(\"contradictions\"),\n severity: v.union(\n v.literal(\"critical\"),\n v.literal(\"significant\"),\n v.literal(\"minor\")\n ),\n userId: v.optional(v.string()), // Added for audit trail\n },\n returns: permissiveReturn,\n handler: async (\n ctx: MutationCtx,\n args: {\n contradictionId: Id<\"contradictions\">;\n severity: ContradictionSeverity;\n userId?: string;\n }\n ) => {\n const existing = await ctx.db.get(args.contradictionId);\n if (!existing) {\n throw new Error(\"Contradiction not found\");\n }\n\n const now = Date.now();\n await ctx.db.patch(args.contradictionId, { severity: args.severity });\n\n // ============================================================\n // INVARIANT #14: No silent state transitions\n // Log severity changes to epistemicAudit\n // ============================================================\n if (existing.severity !== args.severity) {\n await ctx.db.insert(\"epistemicAudit\", {\n entityType: \"contradiction\",\n entityId: args.contradictionId as unknown as string,\n changeType: \"severity_changed\",\n changedAt: now,\n changedBy: args.userId ?? \"system\",\n isAgent: !args.userId,\n previousState: { severity: existing.severity },\n newState: { severity: args.severity },\n rationale: `Contradiction severity changed from ${existing.severity} to ${args.severity}`,\n projectId: existing.projectId,\n });\n }\n\n return { success: true };\n },\n});\n\n/**\n * Add AI analysis to a contradiction\n */\nexport const addAiAnalysis = mutation({\n args: {\n contradictionId: v.id(\"contradictions\"),\n summary: v.string(),\n likelyExplanation: v.string(),\n suggestedResolution: v.string(),\n confidenceInAnalysis: v.number(),\n },\n returns: permissiveReturn,\n handler: async (\n ctx: MutationCtx,\n args: {\n contradictionId: Id<\"contradictions\">;\n summary: string;\n likelyExplanation: string;\n suggestedResolution: string;\n confidenceInAnalysis: number;\n }\n ) => {\n await ctx.db.patch(args.contradictionId, {\n aiAnalysis: {\n summary: args.summary,\n likelyExplanation: args.likelyExplanation,\n suggestedResolution: args.suggestedResolution,\n confidenceInAnalysis: args.confidenceInAnalysis,\n analyzedAt: Date.now(),\n },\n });\n return { success: true };\n },\n});\n\n/**\n * Scan project and auto-create contradictions for any beliefs with conflicting evidence\n * Called by cron job or manually\n */\nexport const scanAndCreateContradictions = mutation({\n args: {\n ...scopeArgs,\n createdBy: v.string(),\n },\n returns: permissiveReturn,\n handler: async (\n ctx: MutationCtx,\n args: { projectId?: string; topicId?: string; createdBy: string }\n ) => {\n const scope = await resolveScopeSoft(ctx, args);\n const projectId = scope.projectId;\n if (!projectId) {\n return { created: 0, updated: 0 }; // graceful: scope resolver guarantees projectId\n }\n\n const now = Date.now();\n\n // Get all beliefs from epistemic spine\n const beliefs = (await ctx.runQuery(\n internal.epistemicBeliefs.internalGetByProject,\n {\n projectId,\n }\n )) as BeliefRecord[];\n\n let created = 0;\n let updated = 0;\n\n for (const belief of beliefs) {\n // Get evidence links for this belief\n const evidenceLinks = (await ctx.db\n .query(\"beliefEvidenceLinks\")\n .withIndex(\"by_beliefId\", (q: IndexQueryBuilder) =>\n q.eq(\"beliefId\", belief._id),\n )\n .collect()) as EvidenceLink[];\n\n const supportingIds = evidenceLinks\n .filter((l) => l.relation === \"supports\")\n .map((l) => l.insightId);\n const contradictingIds = evidenceLinks\n .filter((l) => l.relation === \"contradicts\")\n .map((l) => l.insightId);\n\n // Only create contradiction if BOTH sides have evidence\n if (supportingIds.length > 0 && contradictingIds.length > 0) {\n // Check if contradiction already exists\n const existingRows = (await ctx.db\n .query(\"contradictions\")\n .withIndex(\"by_beliefId\", (q: IndexQueryBuilder) =>\n q.eq(\"beliefId\", belief._id),\n )\n .collect()) as ContradictionRow[];\n const existing = existingRows.find(\n (candidate) =>\n contradictionSourceOf(candidate) === DEFAULT_CONTRADICTION_SOURCE\n );\n\n // Determine severity based on belief criticality\n let severity: ContradictionSeverity = \"significant\";\n if (belief.criticality === \"blocking\") {\n severity = \"critical\";\n } else if (belief.criticality === \"supporting\") {\n severity = \"minor\";\n }\n\n if (existing) {\n // Update existing with any new evidence\n const newSupporting = supportingIds.filter(\n (id) => !existing.supportingInsightIds.includes(id)\n );\n const newContradicting = contradictingIds.filter(\n (id) => !existing.contradictingInsightIds.includes(id)\n );\n\n if (newSupporting.length > 0 || newContradicting.length > 0) {\n await ctx.db.patch(existing._id, {\n supportingInsightIds: [\n ...existing.supportingInsightIds,\n ...newSupporting,\n ],\n contradictingInsightIds: [\n ...existing.contradictingInsightIds,\n ...newContradicting,\n ],\n severity,\n });\n updated++;\n }\n } else {\n // Create new contradiction\n await ctx.db.insert(\"contradictions\", {\n projectId,\n topicId: String(scope.topicId ?? projectId),\n beliefId: belief._id,\n supportingInsightIds: supportingIds,\n contradictingInsightIds: contradictingIds,\n source: DEFAULT_CONTRADICTION_SOURCE,\n resolutionStatus: \"unresolved\", // Lucern: required field\n status: \"unresolved\", // Legacy: kept for backward compat\n severity,\n detectedAt: now,\n createdBy: args.createdBy,\n });\n created++;\n }\n }\n }\n\n return { created, updated };\n },\n});\n"]}