@lucern/graph-primitives 1.0.37 → 1.0.38

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 (216) hide show
  1. package/dist/beliefDecay.js +0 -2
  2. package/dist/beliefEvidenceLinks.js +2 -3
  3. package/dist/beliefEvidenceLinks.operational.js +2 -3
  4. package/dist/beliefLifecycle.js +0 -2
  5. package/dist/confidencePropagationDispatch.js +0 -2
  6. package/dist/contradictions.js +0 -2
  7. package/dist/convex.js +0 -2
  8. package/dist/debug.js +0 -2
  9. package/dist/edgeValidation.js +0 -2
  10. package/dist/edges/contains.js +0 -2
  11. package/dist/edges/contradicts.js +0 -2
  12. package/dist/edges/depends-on.js +0 -2
  13. package/dist/edges/derived-from.js +0 -2
  14. package/dist/edges/elaborates.js +0 -2
  15. package/dist/edges/index.js +0 -2
  16. package/dist/edges/informs.js +0 -2
  17. package/dist/edges/propagation-types.js +0 -2
  18. package/dist/edges/refutes.js +0 -2
  19. package/dist/edges/supports.js +0 -2
  20. package/dist/edges/tests.js +0 -2
  21. package/dist/edges/utils.js +0 -2
  22. package/dist/embeddingTrigger.js +0 -2
  23. package/dist/entityBridge.js +0 -2
  24. package/dist/entityCanonicalMatch.js +0 -2
  25. package/dist/entityLifecycle.js +2 -3
  26. package/dist/entityValidation.js +0 -2
  27. package/dist/epistemicAnswers.js +2 -3
  28. package/dist/epistemicBeliefs.admin.js +0 -2
  29. package/dist/epistemicBeliefs.backfills.js +0 -2
  30. package/dist/epistemicBeliefs.confidence.js +0 -2
  31. package/dist/epistemicBeliefs.core.js +2 -3
  32. package/dist/epistemicBeliefs.forkEvidence.js +0 -2
  33. package/dist/epistemicBeliefs.helpers.js +0 -2
  34. package/dist/epistemicBeliefs.internal.js +2 -3
  35. package/dist/epistemicBeliefs.js +2 -3
  36. package/dist/epistemicBeliefs.lifecycle.js +0 -2
  37. package/dist/epistemicBeliefs.links.js +2 -3
  38. package/dist/epistemicBeliefs.queries.js +0 -2
  39. package/dist/epistemicBeliefs.topicAnchor.js +2 -3
  40. package/dist/epistemicContractHelpers.js +0 -2
  41. package/dist/epistemicContracts.evaluators.js +0 -2
  42. package/dist/epistemicContracts.handlers.js +0 -2
  43. package/dist/epistemicContracts.js +0 -2
  44. package/dist/epistemicContracts.metrics.js +0 -2
  45. package/dist/epistemicContracts.types.js +0 -2
  46. package/dist/epistemicEdgeCreation.js +0 -2
  47. package/dist/epistemicEdges.handlers.js +3 -3
  48. package/dist/epistemicEdges.helpers.js +0 -2
  49. package/dist/epistemicEdges.js +3 -3
  50. package/dist/epistemicEdges.mutations.js +0 -2
  51. package/dist/epistemicEdges.queries.js +0 -2
  52. package/dist/epistemicEdges.types.js +0 -2
  53. package/dist/epistemicEvidence.js +3 -3
  54. package/dist/epistemicEvidenceHelpers.js +0 -2
  55. package/dist/epistemicEvidenceMutations.js +3 -3
  56. package/dist/epistemicEvidenceQueries.js +0 -2
  57. package/dist/epistemicHelpers.js +2 -3
  58. package/dist/epistemicInsert.js +2 -3
  59. package/dist/epistemicLayerRules.js +0 -2
  60. package/dist/epistemicLinking.js +0 -2
  61. package/dist/epistemicNodeCreation.js +2 -3
  62. package/dist/epistemicNodes.helpers.js +0 -2
  63. package/dist/epistemicNodes.internal.js +2 -3
  64. package/dist/epistemicNodes.js +2 -3
  65. package/dist/epistemicNodes.mutations.js +2 -3
  66. package/dist/epistemicNodes.queries.js +0 -2
  67. package/dist/epistemicNodes.validators.js +0 -2
  68. package/dist/epistemicQuestions.conviction.js +0 -2
  69. package/dist/epistemicQuestions.create.js +2 -3
  70. package/dist/epistemicQuestions.evidence.js +2 -3
  71. package/dist/epistemicQuestions.helpers.js +0 -2
  72. package/dist/epistemicQuestions.js +2 -3
  73. package/dist/epistemicQuestions.lifecycle.js +0 -2
  74. package/dist/epistemicQuestions.queries.js +0 -2
  75. package/dist/epistemicQuestions.sprint.js +0 -2
  76. package/dist/epistemicQuestions.tail.js +2 -3
  77. package/dist/epistemicSources.js +2 -3
  78. package/dist/evaluators/index.js +0 -2
  79. package/dist/evaluators/lint-checker-evaluator.js +0 -2
  80. package/dist/evaluators/sentry-checker-evaluator.js +0 -2
  81. package/dist/evaluators/shared.js +0 -2
  82. package/dist/evaluators/test-runner-evaluator.js +0 -2
  83. package/dist/evaluators/tsc-checker-evaluator.js +0 -2
  84. package/dist/globalId.js +0 -2
  85. package/dist/graphTypes.js +0 -2
  86. package/dist/helpers.js +0 -2
  87. package/dist/index.js +4 -3
  88. package/dist/invariantEnforcement.js +0 -2
  89. package/dist/logicalRoleInference.js +0 -2
  90. package/dist/matcherFeedbackUtils.js +0 -2
  91. package/dist/ontology-matching.js +0 -2
  92. package/dist/ontologyApproval.js +0 -2
  93. package/dist/ontologyDefinitions.js +0 -2
  94. package/dist/ontologyHelpers.js +0 -2
  95. package/dist/ontologyRegistry.js +0 -2
  96. package/dist/projectionReconciliation.js +0 -2
  97. package/dist/projectionStaleness.js +0 -2
  98. package/dist/proof-attestation.json +1 -1
  99. package/dist/questionEvidenceLinks.js +0 -2
  100. package/dist/resolverTypes.js +0 -2
  101. package/dist/resolvers.js +0 -2
  102. package/dist/scopeResolverCompat.js +0 -2
  103. package/dist/text-matching.js +0 -2
  104. package/dist/topicOntologyResolver.js +0 -2
  105. package/dist/topicProjectOverlay.js +0 -2
  106. package/dist/topicScope.js +0 -2
  107. package/dist/workflowBridge.js +0 -2
  108. package/dist/workspaceIsolation.js +0 -2
  109. package/package.json +4 -4
  110. package/dist/beliefDecay.js.map +0 -1
  111. package/dist/beliefEvidenceLinks.js.map +0 -1
  112. package/dist/beliefEvidenceLinks.operational.js.map +0 -1
  113. package/dist/beliefLifecycle.js.map +0 -1
  114. package/dist/confidencePropagationDispatch.js.map +0 -1
  115. package/dist/contradictions.js.map +0 -1
  116. package/dist/convex.js.map +0 -1
  117. package/dist/debug.js.map +0 -1
  118. package/dist/edgeValidation.js.map +0 -1
  119. package/dist/edges/contains.js.map +0 -1
  120. package/dist/edges/contradicts.js.map +0 -1
  121. package/dist/edges/depends-on.js.map +0 -1
  122. package/dist/edges/derived-from.js.map +0 -1
  123. package/dist/edges/elaborates.js.map +0 -1
  124. package/dist/edges/index.js.map +0 -1
  125. package/dist/edges/informs.js.map +0 -1
  126. package/dist/edges/propagation-types.js.map +0 -1
  127. package/dist/edges/refutes.js.map +0 -1
  128. package/dist/edges/supports.js.map +0 -1
  129. package/dist/edges/tests.js.map +0 -1
  130. package/dist/edges/utils.js.map +0 -1
  131. package/dist/embeddingTrigger.js.map +0 -1
  132. package/dist/entityBridge.js.map +0 -1
  133. package/dist/entityCanonicalMatch.js.map +0 -1
  134. package/dist/entityLifecycle.js.map +0 -1
  135. package/dist/entityValidation.js.map +0 -1
  136. package/dist/epistemicAnswers.js.map +0 -1
  137. package/dist/epistemicBeliefs.admin.js.map +0 -1
  138. package/dist/epistemicBeliefs.backfills.js.map +0 -1
  139. package/dist/epistemicBeliefs.confidence.js.map +0 -1
  140. package/dist/epistemicBeliefs.core.js.map +0 -1
  141. package/dist/epistemicBeliefs.forkEvidence.js.map +0 -1
  142. package/dist/epistemicBeliefs.helpers.js.map +0 -1
  143. package/dist/epistemicBeliefs.internal.js.map +0 -1
  144. package/dist/epistemicBeliefs.js.map +0 -1
  145. package/dist/epistemicBeliefs.lifecycle.js.map +0 -1
  146. package/dist/epistemicBeliefs.links.js.map +0 -1
  147. package/dist/epistemicBeliefs.queries.js.map +0 -1
  148. package/dist/epistemicBeliefs.topicAnchor.js.map +0 -1
  149. package/dist/epistemicContractHelpers.js.map +0 -1
  150. package/dist/epistemicContracts.evaluators.js.map +0 -1
  151. package/dist/epistemicContracts.handlers.js.map +0 -1
  152. package/dist/epistemicContracts.js.map +0 -1
  153. package/dist/epistemicContracts.metrics.js.map +0 -1
  154. package/dist/epistemicContracts.types.js.map +0 -1
  155. package/dist/epistemicEdgeCreation.js.map +0 -1
  156. package/dist/epistemicEdges.handlers.js.map +0 -1
  157. package/dist/epistemicEdges.helpers.js.map +0 -1
  158. package/dist/epistemicEdges.js.map +0 -1
  159. package/dist/epistemicEdges.mutations.js.map +0 -1
  160. package/dist/epistemicEdges.queries.js.map +0 -1
  161. package/dist/epistemicEdges.types.js.map +0 -1
  162. package/dist/epistemicEvidence.js.map +0 -1
  163. package/dist/epistemicEvidenceHelpers.js.map +0 -1
  164. package/dist/epistemicEvidenceMutations.js.map +0 -1
  165. package/dist/epistemicEvidenceQueries.js.map +0 -1
  166. package/dist/epistemicHelpers.js.map +0 -1
  167. package/dist/epistemicInsert.js.map +0 -1
  168. package/dist/epistemicLayerRules.js.map +0 -1
  169. package/dist/epistemicLinking.js.map +0 -1
  170. package/dist/epistemicNodeCreation.js.map +0 -1
  171. package/dist/epistemicNodes.helpers.js.map +0 -1
  172. package/dist/epistemicNodes.internal.js.map +0 -1
  173. package/dist/epistemicNodes.js.map +0 -1
  174. package/dist/epistemicNodes.mutations.js.map +0 -1
  175. package/dist/epistemicNodes.queries.js.map +0 -1
  176. package/dist/epistemicNodes.validators.js.map +0 -1
  177. package/dist/epistemicQuestions.conviction.js.map +0 -1
  178. package/dist/epistemicQuestions.create.js.map +0 -1
  179. package/dist/epistemicQuestions.evidence.js.map +0 -1
  180. package/dist/epistemicQuestions.helpers.js.map +0 -1
  181. package/dist/epistemicQuestions.js.map +0 -1
  182. package/dist/epistemicQuestions.lifecycle.js.map +0 -1
  183. package/dist/epistemicQuestions.queries.js.map +0 -1
  184. package/dist/epistemicQuestions.sprint.js.map +0 -1
  185. package/dist/epistemicQuestions.tail.js.map +0 -1
  186. package/dist/epistemicSources.js.map +0 -1
  187. package/dist/evaluators/index.js.map +0 -1
  188. package/dist/evaluators/lint-checker-evaluator.js.map +0 -1
  189. package/dist/evaluators/sentry-checker-evaluator.js.map +0 -1
  190. package/dist/evaluators/shared.js.map +0 -1
  191. package/dist/evaluators/test-runner-evaluator.js.map +0 -1
  192. package/dist/evaluators/tsc-checker-evaluator.js.map +0 -1
  193. package/dist/globalId.js.map +0 -1
  194. package/dist/graphTypes.js.map +0 -1
  195. package/dist/helpers.js.map +0 -1
  196. package/dist/index.js.map +0 -1
  197. package/dist/invariantEnforcement.js.map +0 -1
  198. package/dist/logicalRoleInference.js.map +0 -1
  199. package/dist/matcherFeedbackUtils.js.map +0 -1
  200. package/dist/ontology-matching.js.map +0 -1
  201. package/dist/ontologyApproval.js.map +0 -1
  202. package/dist/ontologyDefinitions.js.map +0 -1
  203. package/dist/ontologyHelpers.js.map +0 -1
  204. package/dist/ontologyRegistry.js.map +0 -1
  205. package/dist/projectionReconciliation.js.map +0 -1
  206. package/dist/projectionStaleness.js.map +0 -1
  207. package/dist/questionEvidenceLinks.js.map +0 -1
  208. package/dist/resolverTypes.js.map +0 -1
  209. package/dist/resolvers.js.map +0 -1
  210. package/dist/scopeResolverCompat.js.map +0 -1
  211. package/dist/text-matching.js.map +0 -1
  212. package/dist/topicOntologyResolver.js.map +0 -1
  213. package/dist/topicProjectOverlay.js.map +0 -1
  214. package/dist/topicScope.js.map +0 -1
  215. package/dist/workflowBridge.js.map +0 -1
  216. package/dist/workspaceIsolation.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/convex.ts","../src/debug.ts","../src/topicScope.ts","../src/epistemicBeliefs.helpers.ts","../src/epistemicInsert.ts","../src/logicalRoleInference.ts","../src/epistemicBeliefs.links.ts"],"names":["query","v"],"mappings":"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","file":"epistemicBeliefs.links.js","sourcesContent":["import type { Doc as AccessControlDoc } from \"@lucern/access-control/convex\";\nimport {\n type UnsafeConvexAnyApi,\n unsafeConvexAnyApi,\n} from \"@lucern/contracts/convex/unsafeAnyApi\";\nimport {\n actionGeneric,\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\n// TODO(FR.11-structural): `api`/`internal`/`components` are `anyApi as any`\n// because this module source tree is bundled into the kernel host at deploy time\n// and has NO top-level Convex `_generated/` directory to import a typed surface\n// from. Every `api.*` / `internal.*` / string-literal cross-component ref in this\n// module (topicScope.ts, topicProjectOverlay.ts, questionEvidenceLinks.ts,\n// beliefEvidenceLinks*.ts, epistemicQuestions.helpers.ts) inherits `any` from\n// here. The fix is structural — generate a per-module typed surface or a shared\n// typed function-reference manifest (template: the typed `components.controlPlane`\n// in modules/control-plane/src/component/convex.ts and the\n// `KERNEL_API_REF_MANIFEST` pattern in packages/server-core/src/kernelApi.ts) —\n// owned by the FR.11 closing/synthesis pass, not a mechanical swap.\nconst unsafeApi = unsafeConvexAnyApi(\n \"graph-primitives top-level module bundle lacks a committed Convex _generated/api surface\"\n);\nexport const api = unsafeApi;\nexport const components =\n componentsGeneric() as unknown as UntypedFunctionReferenceSurface;\nexport const internal = unsafeApi;\n\ntype UntypedFunctionReferenceSurface = UnsafeConvexAnyApi;\ntype BoundaryValue = UntypedFunctionReferenceSurface[string];\n\nexport type TableNames = string;\nexport type Id<TableName extends TableNames = string> = GenericId<TableName>;\nexport type Doc<TableName extends TableNames = string> =\n AccessControlDoc<TableName>;\nexport type DataModel = Record<TableNames, unknown>;\ninterface IndexRangeBuilder {\n eq(fieldName: string, value: unknown): IndexRangeBuilder;\n field(fieldName: string): string;\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}\ninterface FilterBuilder {\n and(...clauses: unknown[]): FilterBuilder;\n eq(left: unknown, right: unknown): FilterBuilder;\n field(fieldName: string): string;\n gt(left: unknown, right: unknown): FilterBuilder;\n gte(left: unknown, right: unknown): FilterBuilder;\n lt(left: unknown, right: unknown): FilterBuilder;\n lte(left: unknown, right: unknown): FilterBuilder;\n neq(left: unknown, right: unknown): FilterBuilder;\n or(...clauses: unknown[]): FilterBuilder;\n [operator: string]: unknown;\n}\ninterface QueryInitializer<TableName extends TableNames> {\n collect(): Promise<Doc<TableName>[]>;\n filter(predicate: (q: FilterBuilder) => unknown): QueryInitializer<TableName>;\n first(): Promise<Doc<TableName> | null>;\n order(direction: \"asc\" | \"desc\"): QueryInitializer<TableName>;\n take(limit: number): Promise<Doc<TableName>[]>;\n unique(): Promise<Doc<TableName> | null>;\n withIndex(\n indexName: string,\n range?: (q: IndexRangeBuilder) => unknown\n ): QueryInitializer<TableName>;\n withSearchIndex(\n indexName: string,\n search?: (q: IndexRangeBuilder) => unknown\n ): QueryInitializer<TableName>;\n}\nexport interface DatabaseReader {\n get<TableName extends TableNames>(\n id: unknown\n ): Promise<Doc<TableName> | null>;\n normalizeId?<TableName extends TableNames>(\n tableName: TableName,\n id: string\n ): Id<TableName> | null;\n query<TableName extends TableNames>(\n tableName: TableName\n ): QueryInitializer<TableName>;\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};\ninterface Scheduler {\n runAfter(\n delayMs: number,\n functionReference: unknown,\n args?: unknown\n ): Promise<void>;\n}\ninterface AuthReader {\n getUserIdentity(): Promise<{\n readonly subject: string;\n readonly [claimName: string]: unknown;\n } | null>;\n}\ninterface RuntimeInvoker {\n runAction<Result = unknown>(\n functionReference: unknown,\n args?: unknown\n ): Promise<Result>;\n runMutation<Result = unknown>(\n functionReference: unknown,\n args?: unknown\n ): Promise<Result>;\n runQuery<Result = unknown>(\n functionReference: unknown,\n args?: unknown\n ): Promise<Result>;\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 Args = BoundaryValue,\n Result = BoundaryValue,\n>(definition: {\n args?: unknown;\n handler: (ctx: Ctx, args: Args) => Result;\n returns?: unknown;\n}) => unknown;\n\ntype OptionalHandlerConvexFunctionBuilder<Ctx> = <\n Args = BoundaryValue,\n Result = BoundaryValue,\n>(definition: {\n args?: unknown;\n handler?: (ctx: Ctx, args: Args) => Result;\n returns?: unknown;\n}) => unknown;\n\nexport const action =\n 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 OptionalHandlerConvexFunctionBuilder<MutationCtx>;\nexport const internalQuery =\n internalQueryGeneric as unknown as OptionalHandlerConvexFunctionBuilder<QueryCtx>;\nexport const mutation =\n mutationGeneric as unknown as ConvexFunctionBuilder<MutationCtx>;\nexport const query = queryGeneric as unknown as ConvexFunctionBuilder<QueryCtx>;\n","interface 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\" || 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","// biome-ignore-all lint/style/useFilenamingConvention: Public graph-primitives wildcard-export path; rename requires an export-map migration.\n/** Topic-scope resolution helpers for graph-primitive operations. */\nimport { v } from \"convex/values\";\nimport type { Id } from \"./convex\";\nimport { api as appApi } from \"./convex\";\nimport { debugGraphPrimitiveFallback } from \"./debug\";\n\nconst LEGACY_SCOPE_FIELD = \"graphScopeProjectId\";\n\ntype UnknownRecord = Record<string, unknown>;\n\ninterface TopicScopeContext {\n db: {\n get(id: string): Promise<unknown>;\n query(tableName: string): TopicScopeQuery;\n };\n runQuery?: <TResult>(fnRef: unknown, args: unknown) => Promise<TResult>;\n}\n\ninterface TopicScopeQuery {\n collect(): Promise<unknown[]>;\n first(): Promise<unknown | null>;\n withIndex(\n indexName: string,\n range?: (q: TopicScopeIndexRangeBuilder) => unknown\n ): TopicScopeQuery;\n}\n\ninterface TopicScopeIndexRangeBuilder {\n eq(field: string, value: unknown): TopicScopeIndexRangeBuilder;\n}\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 interface TopicProjectScope {\n projectId?: string;\n source: \"topic\" | \"project_mapped_topic\" | \"topic_inferred\" | \"topic_node\";\n tenantId?: string;\n topicId: Id<\"topics\">;\n workspaceId?: string;\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 */\ninterface TopicNodeScopeDoc {\n _id: string | Id<\"epistemicNodes\">;\n globalId?: string;\n metadata?: UnknownRecord;\n nodeType?: string;\n topicId?: string;\n}\n\nasync function resolveTopicNodeScopeOrNull(\n ctx: TopicScopeContext,\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) => 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),\n source: \"topic_node\",\n };\n}\n\ninterface MaterializedTopicNodeDoc {\n _id: string | Id<\"epistemicNodes\">;\n metadata?: Record<string, unknown>;\n}\n\nfunction asMappedProjectId(\n topic: Pick<TopicDoc, \"metadata\"> | TopicNodeScopeDoc | null | undefined\n): string | undefined {\n if (!topic) {\n return;\n }\n const directLegacyProjectId = normalizeScopeValue(\n (topic as UnknownRecord)[LEGACY_SCOPE_FIELD]\n );\n if (directLegacyProjectId) {\n return directLegacyProjectId;\n }\n const metadata = topic.metadata || {};\n const candidate =\n (metadata as UnknownRecord)[LEGACY_SCOPE_FIELD] ||\n (metadata as UnknownRecord).legacyProjectId ||\n (metadata as UnknownRecord).projectId ||\n (metadata as UnknownRecord).scopeProjectId;\n return typeof candidate === \"string\"\n ? normalizeScopeValue(candidate)\n : 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: TopicScopeContext,\n scopeId: string\n): Promise<TopicDoc[]> {\n const query = ctx.db.query(\"topics\") as TopicScopeQuery;\n try {\n return (await query\n .withIndex(\"by_graph_scope_project\", (q) =>\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 query.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: TopicScopeContext,\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, {\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: TopicScopeContext,\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, {\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: TopicScopeContext,\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) {\n break;\n }\n\n if (!tenantId) {\n tenantId = normalizeScopeValue(current.tenantId);\n }\n if (!workspaceId) {\n workspaceId = normalizeScopeValue(current.workspaceId);\n }\n if (tenantId && workspaceId) {\n break;\n }\n }\n\n return { tenantId, workspaceId };\n}\n\nexport async function resolveTopicProjectScope(\n ctx: TopicScopeContext,\n args: { topicId?: Id<\"topics\"> | string; projectId?: string }\n): Promise<TopicProjectScope> {\n if (args.topicId) {\n return await resolveScopeFromTopicId(ctx, args.topicId);\n }\n\n if (args.projectId) {\n return await resolveScopeFromLegacyProjectId(ctx, args.projectId);\n }\n\n throw new Error(\n \"Missing scope: provide topicId (preferred) or legacy projectId alias.\"\n );\n}\n\nasync function resolveScopeFromTopicId(\n ctx: TopicScopeContext,\n topicId: Id<\"topics\"> | string\n): Promise<TopicProjectScope> {\n const topic = await resolveTopicDocFromTopicId(ctx, topicId);\n if (topic) {\n return await buildTopicScope(ctx, topic, \"topic\");\n }\n\n const nodeScope = await resolveTopicNodeScopeOrNull(ctx, String(topicId));\n if (nodeScope) {\n return nodeScope;\n }\n throw new Error(`Topic not found: ${String(topicId)}`);\n}\n\nasync function resolveTopicDocFromTopicId(\n ctx: TopicScopeContext,\n topicId: Id<\"topics\"> | string\n): Promise<TopicDoc | null> {\n const direct = await tryReadTopicDoc(ctx, topicId, {\n failureLog: \"[topicScope] Failed to load topic by direct id\",\n idLogKey: \"topicId\",\n });\n if (direct) {\n return direct;\n }\n\n const hostTopic = await tryResolveHostTopicById(ctx, String(topicId));\n if (hostTopic) {\n return hostTopic;\n }\n\n return (\n pickPrimaryTopic(await findTopicsByScopeAlias(ctx, String(topicId))) ?? null\n );\n}\n\nasync function resolveScopeFromLegacyProjectId(\n ctx: TopicScopeContext,\n legacyProjectId: string\n): Promise<TopicProjectScope> {\n const directTopic = await resolveDirectLegacyProjectTopic(\n ctx,\n legacyProjectId\n );\n if (directTopic) {\n return await buildTopicScope(ctx, directTopic, \"topic_inferred\", {\n fallbackProjectId: legacyProjectId,\n });\n }\n\n const primary = pickPrimaryTopic(\n await findTopicsByScopeAlias(ctx, legacyProjectId)\n );\n if (primary) {\n return await buildTopicScope(ctx, primary, \"project_mapped_topic\", {\n fallbackProjectId: legacyProjectId,\n });\n }\n\n const nodeScope = await resolveTopicNodeScopeOrNull(ctx, legacyProjectId);\n if (nodeScope) {\n return {\n ...nodeScope,\n projectId: nodeScope.projectId ?? legacyProjectId,\n };\n }\n\n throw new Error(\n `Legacy project scope ${legacyProjectId} has no mapped topic.`\n );\n}\n\nasync function resolveDirectLegacyProjectTopic(\n ctx: TopicScopeContext,\n legacyProjectId: string\n): Promise<TopicDoc | null> {\n const directTopic = await tryReadTopicDoc(ctx, legacyProjectId, {\n failureLog: \"[topicScope] Failed to load direct project topic\",\n idLogKey: \"projectId\",\n });\n return directTopic ?? tryResolveHostTopicByLegacyScope(ctx, legacyProjectId);\n}\n\nasync function tryReadTopicDoc(\n ctx: TopicScopeContext,\n id: Id<\"topics\"> | string,\n log: { failureLog: string; idLogKey: \"projectId\" | \"topicId\" }\n): Promise<TopicDoc | null> {\n try {\n return (await ctx.db.get(id)) as TopicDoc | null;\n } catch (error) {\n debugGraphPrimitiveFallback(log.failureLog, {\n error,\n [log.idLogKey]: id,\n });\n return null;\n }\n}\n\nasync function buildTopicScope(\n ctx: TopicScopeContext,\n topic: TopicDoc,\n source: TopicProjectScope[\"source\"],\n options: { fallbackProjectId?: string } = {}\n): Promise<TopicProjectScope> {\n const inherited = await resolveInheritedWorkspaceScope(ctx, topic);\n const mapped = asMappedProjectId(topic);\n return {\n topicId: topic._id,\n ...(mapped || options.fallbackProjectId\n ? { projectId: mapped ?? options.fallbackProjectId }\n : {}),\n tenantId: inherited.tenantId,\n workspaceId: inherited.workspaceId,\n source,\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","// biome-ignore-all lint/style/useFilenamingConvention: Public graph-primitives wildcard-export path; rename requires an export-map migration.\n/**\n * Epistemic Beliefs API\n *\n * Clean API for managing beliefs in the epistemic spine (epistemicNodes).\n * This is the NEW API that replaces beliefs.ts.\n *\n * Key differences from beliefs.ts:\n * - Writes ONLY to epistemicNodes (no dual-write)\n * - Uses epistemicNodes IDs directly (no runtime ID translation fallback)\n * - Syncs to Neo4j after mutations\n * - Follows Lucern invariants strictly\n *\n * @see /docs/epistemic-invariants/00-epistemic-invariants.md\n */\n\nimport {\n classFromAudienceKey,\n normalizeAudienceKey,\n} from \"@lucern/access-control/audience\";\nimport { getCurrentUserId } from \"@lucern/access-control/auth\";\nimport { throwStructuredMutationError } from \"@lucern/access-control/structuredMutationError\";\nimport {\n type ConfidencePolicyConfig,\n confidenceFromSL,\n mkOpinion,\n normalizeTupleContradictionPolicy,\n type Opinion,\n readOpinionFromRecord,\n type SLOperator,\n type SLOpinion,\n} from \"@lucern/confidence\";\nimport { v } from \"convex/values\";\nimport {\n type BeliefLifecycleStatus,\n resolveBeliefLifecycleStatus,\n} from \"./beliefLifecycle\";\nimport type { Id, QueryCtx } from \"./convex\";\nimport { internal } from \"./convex\";\nimport { debugGraphPrimitiveFallback } from \"./debug\";\nimport type { VerificationConfidenceTrigger } from \"./epistemicContractHelpers\";\nimport { resolveGraphPrimitivesAppResolvers } from \"./resolvers\";\nimport { optionalScopeArgs, resolveTopicProjectScope } from \"./topicScope\";\nimport { nodeMatchesWorkspaceReasoningScope } from \"./workspaceIsolation\";\n\n// All IDs now use epistemicNodes exclusively\nexport const insightIdUnion = v.id(\"epistemicNodes\");\nconst DEFAULT_PROJECT_BELIEF_LIMIT = 250;\nexport const MAX_PROJECT_BELIEF_LIMIT = 1000;\nexport const optionalBeliefScopeArgs = optionalScopeArgs;\n\n// CQ.11: the structured-refusal primitive is the single shared copy in\n// `@lucern/access-control/structuredMutationError` (the same home the shared\n// access gate throws from). Re-exported here so the graph-primitives modules\n// that imported it from this helper keep their import path unchanged.\nexport type { StructuredMutationErrorData } from \"@lucern/access-control/structuredMutationError\";\n// biome-ignore lint/performance/noBarrelFile: Public helper compatibility re-export retained for existing graph-primitives consumers.\nexport { throwStructuredMutationError } from \"@lucern/access-control/structuredMutationError\";\n\ninterface BeliefScopeArgs {\n projectId?: string | null;\n topicId?: string | null;\n}\n\ninterface EpistemicNodeOpinionSource {\n _id?: unknown;\n metadata?: Record<string, unknown> | null;\n opinion_a?: number;\n opinion_b?: number;\n opinion_d?: number;\n opinion_u?: number;\n tupleContradicted?: boolean;\n userId?: string;\n}\n\nexport interface EpistemicNodeOpinionDoc extends EpistemicNodeOpinionSource {\n _creationTime?: number;\n _id: Id<\"epistemicNodes\">;\n anonymizationClass?: string;\n audienceLabel?: string;\n beliefStatus?: unknown;\n canonicalText?: string;\n confidence?: unknown;\n createdAt?: number;\n createdBy?: string;\n epistemicLayer?: string;\n exportClass?: string;\n globalId?: string;\n metadata?: Record<string, unknown> | null;\n nodeType: \"belief\";\n policyTags?: string[];\n predictionMeta?: unknown;\n projectId?: string;\n publicationStatus?: string;\n sensitivityTier?: string;\n status?: string;\n tenantId?: string;\n topicId?: string;\n updatedAt?: number;\n workspaceId?: string;\n}\n\ninterface EpistemicIndexQuery {\n eq(field: string, value: unknown): EpistemicIndexQuery;\n field(field: string): string;\n gt(field: string, value: unknown): EpistemicIndexQuery;\n lt(field: string, value: unknown): EpistemicIndexQuery;\n}\n\ntype EpistemicBeliefCtx = QueryCtx;\n\ntype AudienceClass = \"internal\" | \"restricted_external\" | \"public\";\n\nconst DEFAULT_CONFIDENCE_POLICY: ConfidencePolicyConfig = {\n scoringMode: \"after_worktree\",\n tupleContradiction: normalizeTupleContradictionPolicy(),\n};\n\nexport type BeliefConfidenceTrigger =\n | \"initial\"\n | \"evidence_added\"\n | \"evidence_removed\"\n | \"contradiction_detected\"\n | \"contradiction_resolved\"\n | \"propagation\"\n | \"agent_assessment\"\n | \"worktree_outcome\"\n | \"worktree_completed\"\n // SL-specific triggers\n | \"fusion\"\n | \"discount\"\n | \"deduction\"\n | \"backfill_synthetic\"\n | VerificationConfidenceTrigger;\n\nexport function readFiniteNumber(value: unknown): number | undefined {\n return typeof value === \"number\" && Number.isFinite(value)\n ? value\n : undefined;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction readOptionalString(value: unknown): string | undefined {\n return typeof value === \"string\" && value.trim().length > 0\n ? value\n : undefined;\n}\n\nfunction readStringArray(value: unknown): string[] | undefined {\n if (!Array.isArray(value)) {\n return;\n }\n const strings = value.filter(\n (item): item is string => typeof item === \"string\" && item.length > 0\n );\n return strings.length === value.length ? strings : undefined;\n}\n\nfunction readRecord(value: unknown): Record<string, unknown> | undefined {\n return isRecord(value) ? value : undefined;\n}\n\nexport function readBeliefNodeView(\n value: unknown\n): EpistemicNodeOpinionDoc | null {\n if (!isRecord(value)) {\n return null;\n }\n\n const id = readOptionalString(value._id) as Id<\"epistemicNodes\"> | undefined;\n const nodeType = readOptionalString(value.nodeType);\n if (!(id && nodeType === \"belief\")) {\n return null;\n }\n\n const node: EpistemicNodeOpinionDoc = {\n _id: id,\n nodeType,\n };\n const creationTime = readFiniteNumber(value._creationTime);\n if (creationTime !== undefined) {\n node._creationTime = creationTime;\n }\n const metadata = readRecord(value.metadata);\n if (metadata !== undefined) {\n node.metadata = metadata;\n }\n const opinionA = readFiniteNumber(value.opinion_a);\n if (opinionA !== undefined) {\n node.opinion_a = opinionA;\n }\n const opinionB = readFiniteNumber(value.opinion_b);\n if (opinionB !== undefined) {\n node.opinion_b = opinionB;\n }\n const opinionD = readFiniteNumber(value.opinion_d);\n if (opinionD !== undefined) {\n node.opinion_d = opinionD;\n }\n const opinionU = readFiniteNumber(value.opinion_u);\n if (opinionU !== undefined) {\n node.opinion_u = opinionU;\n }\n const tupleContradicted =\n typeof value.tupleContradicted === \"boolean\"\n ? value.tupleContradicted\n : undefined;\n if (tupleContradicted !== undefined) {\n node.tupleContradicted = tupleContradicted;\n }\n\n const stringFields = {\n anonymizationClass: value.anonymizationClass,\n audienceLabel: value.audienceLabel,\n canonicalText: value.canonicalText,\n createdBy: value.createdBy,\n epistemicLayer: value.epistemicLayer,\n exportClass: value.exportClass,\n globalId: value.globalId,\n projectId: value.projectId,\n publicationStatus: value.publicationStatus,\n sensitivityTier: value.sensitivityTier,\n status: value.status,\n tenantId: value.tenantId,\n topicId: value.topicId,\n userId: value.userId,\n workspaceId: value.workspaceId,\n };\n for (const [field, fieldValue] of Object.entries(stringFields)) {\n const normalized = readOptionalString(fieldValue);\n if (normalized !== undefined) {\n node[field as keyof typeof stringFields] = normalized;\n }\n }\n\n const createdAt = readFiniteNumber(value.createdAt);\n if (createdAt !== undefined) {\n node.createdAt = createdAt;\n }\n const updatedAt = readFiniteNumber(value.updatedAt);\n if (updatedAt !== undefined) {\n node.updatedAt = updatedAt;\n }\n if (value.beliefStatus !== undefined) {\n node.beliefStatus = value.beliefStatus;\n }\n if (value.confidence !== undefined) {\n node.confidence = value.confidence;\n }\n if (value.predictionMeta !== undefined) {\n node.predictionMeta = value.predictionMeta;\n }\n const policyTags = readStringArray(value.policyTags);\n if (policyTags !== undefined) {\n node.policyTags = policyTags;\n }\n\n return node;\n}\n\nfunction readBeliefNodeViews(\n values: readonly unknown[]\n): EpistemicNodeOpinionDoc[] {\n return values.flatMap((value) => {\n const node = readBeliefNodeView(value);\n return node ? [node] : [];\n });\n}\n\nfunction clamp01(value: number): number {\n return Math.max(0, Math.min(1, value));\n}\n\nexport function assertBaseRateInRange(\n baseRate: number,\n field = \"baseRate\"\n): number {\n if (baseRate < 0 || baseRate > 1) {\n throwStructuredMutationError({\n message: `${field} must be within [0, 1].`,\n status: 400,\n code: \"INVALID_ARGUMENT\",\n invariantCode: \"request.valid_shape\",\n suggestion: `Clamp ${field} into the inclusive [0, 1] interval.`,\n details: { field, baseRate },\n });\n }\n return baseRate;\n}\n\nexport function buildBeliefConfidenceRow(args: {\n beliefId: Id<\"epistemicNodes\">;\n belief: number;\n disbelief: number;\n uncertainty: number;\n baseRate: number;\n trigger: BeliefConfidenceTrigger;\n rationale?: string;\n assessedBy: string;\n assessedAt: number;\n slOperator?: SLOperator;\n triggeringEvidenceId?: Id<\"epistemicNodes\">;\n triggeringContradictionId?: Id<\"contradictions\">;\n triggeringWorktreeId?: string;\n}) {\n return {\n beliefId: args.beliefId,\n confidence: confidenceFromSL(\n args.belief,\n args.disbelief,\n args.uncertainty,\n args.baseRate\n ),\n belief: args.belief,\n disbelief: args.disbelief,\n uncertainty: args.uncertainty,\n baseRate: args.baseRate,\n slOperator: args.slOperator ?? (\"prior_seed\" as const),\n trigger: args.trigger,\n ...(args.rationale ? { rationale: args.rationale } : {}),\n assessedBy: args.assessedBy,\n assessedAt: args.assessedAt,\n ...(args.triggeringEvidenceId\n ? {\n triggeringEvidenceId: args.triggeringEvidenceId,\n triggeringEvidenceIds: [String(args.triggeringEvidenceId)],\n }\n : {}),\n ...(args.triggeringContradictionId\n ? {\n triggeringContradictionId: args.triggeringContradictionId,\n }\n : {}),\n ...(args.triggeringWorktreeId\n ? { triggeringWorktreeId: args.triggeringWorktreeId }\n : {}),\n };\n}\n\ntype BeliefStatusResult =\n | { success: true }\n | { success: false; message: \"Evidence node not found\" };\n\nexport function buildBeliefStatusSuccessResult(): BeliefStatusResult {\n return { success: true };\n}\n\nexport function buildBeliefEvidenceNotFoundResult(): BeliefStatusResult {\n const result = {} as Extract<BeliefStatusResult, { success: false }>;\n result.success = false;\n result.message = \"Evidence node not found\";\n return result;\n}\n\nexport function deriveSyntheticBackfillOpinion(\n source: Record<string, unknown>\n): SLOpinion {\n const belief =\n readFiniteNumber(source.opinion_b) ?? readFiniteNumber(source.belief);\n const disbelief =\n readFiniteNumber(source.opinion_d) ?? readFiniteNumber(source.disbelief);\n const uncertainty =\n readFiniteNumber(source.opinion_u) ?? readFiniteNumber(source.uncertainty);\n const baseRate =\n readFiniteNumber(source.opinion_a) ?? readFiniteNumber(source.baseRate);\n\n if (\n belief !== undefined ||\n disbelief !== undefined ||\n uncertainty !== undefined ||\n baseRate !== undefined\n ) {\n try {\n return readOpinionFromRecord(source);\n } catch (error) {\n debugGraphPrimitiveFallback(\n \"[epistemicBeliefs] Failed to decode legacy belief opinion\",\n {\n error,\n }\n );\n return mkOpinion(0, 0, 1, 0.5);\n }\n }\n\n const confidence = clamp01(readFiniteNumber(source.confidence) ?? 0);\n return mkOpinion(confidence, 1 - confidence, 0, 0.5);\n}\n\nexport function clampBeliefLimit(\n limit: number | undefined,\n fallback = DEFAULT_PROJECT_BELIEF_LIMIT\n): number {\n if (!Number.isFinite(limit)) {\n return fallback;\n }\n return Math.max(\n 1,\n Math.min(Math.floor(limit as number), MAX_PROJECT_BELIEF_LIMIT)\n );\n}\n\nexport function readTupleContradictedFlag(value: unknown): boolean | undefined {\n return typeof value === \"boolean\" ? value : undefined;\n}\n\nexport function readBeliefOpinionSnapshot(\n node: EpistemicNodeOpinionSource,\n metadata: Record<string, unknown>\n): SLOpinion {\n try {\n return readOpinionFromRecord({\n ...metadata,\n opinion_b: node.opinion_b,\n opinion_d: node.opinion_d,\n opinion_u: node.opinion_u,\n opinion_a: node.opinion_a,\n });\n } catch (error) {\n debugGraphPrimitiveFallback(\n \"[epistemicBeliefs] Failed to read belief opinion snapshot\",\n {\n error,\n beliefId: node._id,\n }\n );\n return mkOpinion(0, 0, 1, 0.5);\n }\n}\n\nexport function deriveTupleContradictionSeverity(node: {\n metadata?: Record<string, unknown> | null;\n}): \"critical\" | \"significant\" | \"minor\" {\n const metadata = node.metadata || {};\n const criticality =\n typeof metadata.criticality === \"string\" ? metadata.criticality : undefined;\n\n if (criticality === \"blocking\") {\n return \"critical\";\n }\n if (criticality === \"supporting\") {\n return \"minor\";\n }\n return \"significant\";\n}\n\nexport function formatTupleContradictionDescription(args: {\n opinion: Opinion;\n policy: ConfidencePolicyConfig[\"tupleContradiction\"];\n}): string {\n return `Tuple-space contradiction detected: b=${args.opinion.b.toFixed(2)} > ${args.policy.beliefThreshold.toFixed(2)} and d=${args.opinion.d.toFixed(2)} > ${args.policy.disbeliefThreshold.toFixed(2)}.`;\n}\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\nexport function generateContentHash(text: string): string {\n const content = `belief:${text.trim().toLowerCase().replace(/\\s+/g, \" \")}`;\n let hash = 5381;\n for (let i = 0; i < content.length; i++) {\n // biome-ignore lint/suspicious/noBitwiseOperators: Preserve deterministic djb2 hash semantics for persisted belief metadata compatibility.\n hash = (hash << 5) + hash + content.charCodeAt(i);\n // biome-ignore lint/suspicious/noBitwiseOperators: Preserve deterministic djb2 hash semantics for persisted belief metadata compatibility.\n hash &= hash;\n }\n return Math.abs(hash).toString(16).padStart(8, \"0\");\n}\n\nexport function resolveBeliefWorktreeId(\n metadata: Record<string, unknown> | undefined\n): string | undefined {\n const worktreeId = metadata?.worktreeId;\n if (typeof worktreeId === \"string\" && worktreeId.trim().length > 0) {\n return worktreeId;\n }\n\n const sprintId = metadata?.sprintId;\n return typeof sprintId === \"string\" && sprintId.trim().length > 0\n ? sprintId\n : undefined;\n}\n\n// Map pillar names to valid pillar literals\ntype ValidPillar =\n | \"market\"\n | \"competition\"\n | \"product\"\n | \"team\"\n | \"financials\"\n | \"regulatory\"\n | \"timing\"\n | \"customer\"\n | \"technology\"\n | \"distribution\"\n | \"deal\"\n | \"risks\"\n | \"other\";\n\nexport function normalizePillar(pillar?: string): ValidPillar {\n if (!pillar) {\n return \"other\";\n }\n const lower = pillar.toLowerCase();\n const validPillars: ValidPillar[] = [\n \"market\",\n \"competition\",\n \"product\",\n \"team\",\n \"financials\",\n \"regulatory\",\n \"timing\",\n \"customer\",\n \"technology\",\n \"distribution\",\n \"deal\",\n \"risks\",\n ];\n return (validPillars.find((p) => lower.includes(p)) ||\n \"other\") as ValidPillar;\n}\n\nexport async function markBeliefGraphDirty(\n ctx: EpistemicBeliefCtx,\n scope: { projectId?: string | null; topicId?: string | null }\n): Promise<void> {\n const projectId =\n typeof scope.projectId === \"string\" && scope.projectId.trim().length > 0\n ? scope.projectId\n : undefined;\n const topicId =\n typeof scope.topicId === \"string\" && scope.topicId.trim().length > 0\n ? scope.topicId\n : undefined;\n\n if (!(projectId || topicId)) {\n return;\n }\n\n if (projectId) {\n await ctx.scheduler.runAfter(\n 0,\n internal.graphAnalysisCache.markCacheStaleInternal,\n { projectId }\n );\n }\n if (topicId) {\n await ctx.scheduler.runAfter(\n 0,\n internal.graphAnalysisCache.markCacheStaleByTopic,\n { topicId }\n );\n }\n\n const activityScopeId = topicId ?? projectId;\n if (!activityScopeId) {\n throw new Error(\n \"Expected belief graph dirty scope to include a topic or project id.\"\n );\n }\n\n await resolveGraphPrimitivesAppResolvers(ctx).patchProject(\n ctx,\n activityScopeId,\n {\n lastActivityAt: Date.now(),\n }\n );\n}\n\nexport async function resolveBeliefScopeOrNull(\n ctx: QueryCtx,\n args: BeliefScopeArgs\n) {\n if (!args.topicId) {\n return null;\n }\n\n try {\n return await resolveTopicProjectScope(ctx, {\n projectId: args.projectId ?? undefined,\n topicId: args.topicId ?? undefined,\n });\n } catch (error) {\n debugGraphPrimitiveFallback(\n \"[epistemicBeliefs] Failed to resolve belief scope\",\n {\n error,\n projectId: args.projectId,\n topicId: args.topicId,\n }\n );\n return null;\n }\n}\n\nexport async function getBeliefNodesForScope(\n ctx: EpistemicBeliefCtx,\n scope: Awaited<ReturnType<typeof resolveTopicProjectScope>>,\n args?: { scanLimit?: number; status?: string }\n) {\n const baseQuery = ctx.db\n .query(\"epistemicNodes\")\n .withIndex(\"by_topic_type\", (q: EpistemicIndexQuery) =>\n q.eq(\"topicId\", scope.topicId).eq(\"nodeType\", \"belief\")\n );\n const rows =\n typeof args?.scanLimit === \"number\"\n ? await baseQuery.order(\"desc\").take(args.scanLimit)\n : await baseQuery.collect();\n const nodes = readBeliefNodeViews(rows);\n const scopedNodes = nodes.filter((node) =>\n nodeMatchesWorkspaceReasoningScope(node, scope)\n );\n\n if (!args?.status) {\n return scopedNodes;\n }\n\n return scopedNodes.filter(\n (node: EpistemicNodeOpinionDoc) => node.status === args.status\n );\n}\n\nexport function createBeliefAudienceResolver(\n registryRows: Array<{\n audienceKey?: string | null;\n audienceClass: AudienceClass;\n }>\n) {\n const audienceClassByKey = new Map<string, AudienceClass>(\n registryRows.map((row) => [\n normalizeAudienceKey(row.audienceKey),\n row.audienceClass,\n ])\n );\n\n return (\n audienceKey: string | undefined | null,\n fallback: AudienceClass\n ): AudienceClass => {\n const key = normalizeAudienceKey(audienceKey);\n if (!key) {\n return fallback;\n }\n return (\n audienceClassByKey.get(key) ??\n (classFromAudienceKey(key, fallback) as AudienceClass)\n );\n };\n}\n\nexport function flattenBeliefNode(node: EpistemicNodeOpinionDoc) {\n const meta = node.metadata || {};\n const worktreeId = resolveBeliefWorktreeId(meta);\n const tupleContradicted =\n readTupleContradictedFlag(node.tupleContradicted) ??\n readTupleContradictedFlag(meta.tupleContradicted) ??\n false;\n\n return {\n _id: node._id,\n _epistemicNodeId: node._id,\n _creationTime: node._creationTime,\n belief: node.canonicalText,\n formulation: node.canonicalText,\n projectId: node.projectId,\n topicId: node.topicId,\n userId: node.userId || node.createdBy || \"\",\n confidence: (meta.confidence as \"high\" | \"medium\" | \"low\") || \"untested\",\n status: node.status,\n beliefStatus: resolveBeliefStatus(node, meta),\n topic: (meta.topic as string) || (meta.pillar as string) || \"other\",\n pillar: (meta.pillar as string) || (meta.topic as string) || \"\",\n category: (meta.category as string) || \"\",\n subcategory: (meta.subcategory as string) || \"\",\n categoryIcon: (meta.categoryIcon as string) || \"\",\n supportingEvidence: (meta.supportingEvidenceIds as string[]) || [],\n contradictingEvidence: (meta.contradictingEvidenceIds as string[]) || [],\n testingQuestions: (meta.testingQuestionIds as string[]) || [],\n linkedInsights: (meta.linkedInsightIds as string[]) || [],\n createdAt: node.createdAt,\n updatedAt: node.updatedAt || node.createdAt,\n tupleContradicted,\n sprintId: (meta.sprintId as string) || undefined,\n worktreeId,\n sourceBeliefIds: (meta.sourceBeliefIds as string[]) || undefined,\n criticality:\n (meta.criticality as\n | \"critical\"\n | \"supporting\"\n | \"nice_to_have\"\n | \"unanalyzed\"\n | \"blocking\"\n | \"important\") || \"unanalyzed\",\n rationale: (meta.rationale as string) || \"\",\n audienceLabel: node.audienceLabel,\n policyTags: node.policyTags,\n sensitivityTier: node.sensitivityTier,\n exportClass: node.exportClass,\n anonymizationClass: node.anonymizationClass,\n };\n}\n\nexport function resolveBeliefStatus(\n node: {\n beliefStatus?: unknown;\n confidence?: unknown;\n predictionMeta?: unknown;\n },\n metadata: Record<string, unknown>\n): BeliefLifecycleStatus {\n return resolveBeliefLifecycleStatus({\n beliefStatus: node.beliefStatus,\n confidence: node.confidence,\n predictionMeta: node.predictionMeta,\n metadata,\n });\n}\n\nexport async function hasCompletedWorktreeForBelief(\n ctx: EpistemicBeliefCtx,\n beliefNodeId: Id<\"epistemicNodes\">\n): Promise<boolean> {\n // Check if the belief is linked to a completed worktree via worktreeBeliefCluster\n const clusterMembership = await ctx.db\n .query(\"worktreeBeliefCluster\")\n .withIndex(\"by_belief\", (q: EpistemicIndexQuery) =>\n q.eq(\"beliefId\", beliefNodeId)\n )\n .collect();\n for (const membership of clusterMembership) {\n const worktree = await ctx.db.get(membership.worktreeId);\n if (worktree?.status === \"completed\" || worktree?.status === \"merged\") {\n return true;\n }\n }\n return false;\n}\n\nexport async function getActiveConfidencePolicy(\n ctx: EpistemicBeliefCtx\n): Promise<ConfidencePolicyConfig> {\n try {\n const activeConfig = await ctx.db\n .query(\"logicSprintScoring\")\n .withIndex(\"by_active\", (q: EpistemicIndexQuery) =>\n q.eq(\"isActive\", true)\n )\n .first();\n\n return {\n scoringMode:\n activeConfig?.confidencePolicy === \"always\"\n ? \"always\"\n : DEFAULT_CONFIDENCE_POLICY.scoringMode,\n tupleContradiction: normalizeTupleContradictionPolicy(\n activeConfig?.tupleContradictionPolicy as\n | Partial<ConfidencePolicyConfig[\"tupleContradiction\"]>\n | undefined\n ),\n };\n } catch (error) {\n debugGraphPrimitiveFallback(\n \"[epistemicBeliefs] Failed to load active confidence policy\",\n {\n error,\n }\n );\n // K-tier/component environments do not carry logicSprintScoring.\n return DEFAULT_CONFIDENCE_POLICY;\n }\n}\n\nexport async function requireAuthenticatedUserId(ctx: {\n auth: { getUserIdentity: () => Promise<unknown> };\n}): Promise<string> {\n const userId = await getCurrentUserId(\n ctx as Parameters<typeof getCurrentUserId>[0]\n );\n if (!userId) {\n throwStructuredMutationError({\n message: \"Authentication required.\",\n status: 401,\n code: \"AUTHENTICATION_REQUIRED\",\n invariantCode: \"auth.required\",\n suggestion:\n \"Provide a valid bearer token before invoking belief mutations.\",\n });\n }\n return userId;\n}\n","// biome-ignore-all lint/style/useFilenamingConvention: Public graph-primitives wildcard-export path; rename requires an export-map migration.\nimport {\n assertEdgePolicyAllowed,\n type EpistemicNodeType,\n edgePolicyManifest,\n} from \"@lucern/contracts\";\nimport {\n assertStorageEdgeVocabulary,\n assertUuidShapedEdgeEndpoint,\n assertUuidV7Identity,\n} from \"@lucern/contracts/ids\";\nimport type { Id, MutationCtx } from \"./convex\";\n\ninterface GlobalIdIndexQuery {\n eq(field: \"globalId\", value: string): GlobalIdIndexQuery;\n}\n\ninterface EpistemicNodeInsertDoc extends Record<string, unknown> {\n globalId: string;\n}\n\ninterface EpistemicEdgeInsertDoc extends Record<string, unknown> {\n edgeType: string;\n fromNodeId: string;\n fromNodeType?: string;\n globalId: string;\n toNodeId: string;\n toNodeType?: string;\n}\n\nexport function insertEpistemicNode(\n ctx: MutationCtx,\n doc: EpistemicNodeInsertDoc\n): Promise<Id<\"epistemicNodes\">> {\n assertUuidV7Identity(\"epistemicNodes\", doc.globalId);\n return ctx.db.insert(\"epistemicNodes\", doc);\n}\n\n/**\n * C2-RR.4b — REFERENTIAL edge-endpoint canonicality (amends RR.4's FORMAT guard).\n *\n * Proves an endpoint is the UUIDv7 `globalId` of an EXISTING\n * `epistemicNodes` row. Refuses doc ids, fabricated/unknown endpoints, and\n * legacy UUIDv4 `globalId`s; those must be reminted through the identity\n * backfill ledger before participating in new edge writes.\n */\nasync function assertExistingNodeEndpoint(\n ctx: MutationCtx,\n endpointRole: \"fromNodeId\" | \"toNodeId\",\n endpoint: string\n): Promise<void> {\n assertUuidShapedEdgeEndpoint(endpointRole, endpoint);\n const node = await ctx.db\n .query(\"epistemicNodes\")\n .withIndex(\"by_globalId\", (q: GlobalIdIndexQuery) =>\n q.eq(\"globalId\", endpoint)\n )\n .first();\n if (!node) {\n throw new Error(\n `edge_endpoint_not_canonical: epistemicEdges insert requires ${endpointRole} to be the globalId of an existing epistemicNodes row, received ${endpoint} (no node with that globalId)`\n );\n }\n}\n\nexport async function insertEpistemicEdge(\n ctx: MutationCtx,\n doc: EpistemicEdgeInsertDoc\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.4b Defect E (REFERENTIAL) — ENDPOINT CANONICAL IDENTITY. Edge\n // endpoints must each be the globalId of an EXISTING epistemicNodes row,\n // never a Convex doc id, a legacy topic id, or a fabricated/unknown uuid.\n // This refuses mixed _id/globalId endpoint writes at the floor and keeps\n // legacy UUIDv4 graph rows inside the explicit remint/backfill lane.\n await assertExistingNodeEndpoint(ctx, \"fromNodeId\", doc.fromNodeId);\n await assertExistingNodeEndpoint(ctx, \"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","// biome-ignore-all lint/style/useFilenamingConvention: Public graph-primitives wildcard-export path; rename requires an export-map migration.\n/**\n * logicalRoleInference module implementation.\n */\n\nimport type { Id, MutationCtx, QueryCtx } from \"./convex\";\n\ntype LogicalRole =\n | \"necessary\"\n | \"sufficient\"\n | \"necessary_sufficient\"\n | \"contributory\"\n | \"corroborative\";\n\nconst PILLAR_IMPORTANCE: Record<string, number> = {\n market: 1,\n competition: 2,\n product: 3,\n team: 4,\n financials: 5,\n timing: 6,\n other: 10,\n};\n\ntype GraphCtx = QueryCtx | MutationCtx;\n\ninterface IndexQueryBuilder {\n eq(field: string, value: unknown): IndexQueryBuilder;\n}\n\ninterface EpistemicEdgeRecord {\n fromNodeId?: string;\n toNodeId?: string;\n}\n\nexport async function computeLogicalRole(\n ctx: GraphCtx,\n evidenceId: Id<\"epistemicNodes\">,\n beliefId: Id<\"epistemicNodes\">\n): Promise<LogicalRole> {\n const belief = await ctx.db.get(beliefId);\n if (belief?.nodeType !== \"belief\") {\n return \"contributory\";\n }\n\n const beliefMetadata = belief.metadata as Record<string, unknown> | undefined;\n const pillar = (beliefMetadata?.pillar as string) || \"other\";\n const pillarRank = PILLAR_IMPORTANCE[pillar] ?? 10;\n\n const isSynthesized = await checkIfSynthesizedHypothesis(ctx, beliefId);\n const testingQuestions = await getTestingQuestionsForBelief(ctx, beliefId);\n const answeredQuestions = await getQuestionsAnsweredByEvidence(\n ctx,\n evidenceId\n );\n const directlyTests = testingQuestions.filter((questionId) =>\n answeredQuestions.includes(questionId)\n );\n\n if (directlyTests.length === 0) {\n return \"contributory\";\n }\n\n if (isSynthesized && pillarRank <= 2) {\n return directlyTests.length > 1 ? \"necessary_sufficient\" : \"necessary\";\n }\n\n if (isSynthesized) {\n return \"necessary\";\n }\n\n return directlyTests.length > 1 ? \"necessary\" : \"contributory\";\n}\n\nasync function checkIfSynthesizedHypothesis(\n ctx: GraphCtx,\n beliefId: Id<\"epistemicNodes\">\n): Promise<boolean> {\n const belief = await ctx.db.get(beliefId);\n if (!belief) {\n return false;\n }\n\n const metadata = belief.metadata as Record<string, unknown> | undefined;\n return (\n metadata?.isSynthesized === true || metadata?.beliefStatus === \"hypothesis\"\n );\n}\n\nasync function getTestingQuestionsForBelief(\n ctx: GraphCtx,\n beliefId: Id<\"epistemicNodes\">\n): Promise<string[]> {\n const testEdges = (await ctx.db\n .query(\"epistemicEdges\")\n .withIndex(\"by_to_type\", (q: IndexQueryBuilder) =>\n q.eq(\"toNodeId\", beliefId).eq(\"edgeType\", \"tests\")\n )\n .collect()) as EpistemicEdgeRecord[];\n\n return testEdges\n .map((edge: EpistemicEdgeRecord) => edge.fromNodeId as string)\n .filter((id): id is string => id !== undefined);\n}\n\nasync function getQuestionsAnsweredByEvidence(\n ctx: GraphCtx,\n evidenceId: Id<\"epistemicNodes\">\n): Promise<string[]> {\n const answerEdges = (await ctx.db\n .query(\"epistemicEdges\")\n .withIndex(\"by_from_type\", (q: IndexQueryBuilder) =>\n q.eq(\"fromNodeId\", evidenceId).eq(\"edgeType\", \"derived_from\")\n )\n .collect()) as EpistemicEdgeRecord[];\n\n return answerEdges\n .map((edge: EpistemicEdgeRecord) => edge.toNodeId as string)\n .filter((id): id is string => id !== undefined);\n}\n","// biome-ignore-all lint/style/useFilenamingConvention: Public graph-primitives wildcard-export path; rename requires an export-map migration.\n/** Split belief linking and evidence wiring out of epistemicBeliefs.ts. */\n\nimport { requireScopeWriteAccess } from \"@lucern/access-control/access\";\nimport { permissiveReturn } from \"@lucern/contracts/schema-helpers/validators\";\nimport { v } from \"convex/values\";\nimport type { Id, MutationCtx, QueryCtx } from \"./convex\";\nimport { internal, mutation, query } from \"./convex\";\nimport {\n buildBeliefEvidenceNotFoundResult,\n buildBeliefStatusSuccessResult,\n insightIdUnion,\n optionalBeliefScopeArgs,\n requireAuthenticatedUserId,\n resolveBeliefScopeOrNull,\n} from \"./epistemicBeliefs.helpers\";\nimport { insertEpistemicEdge } from \"./epistemicInsert.js\";\nimport { generateGlobalId } from \"./globalId\";\nimport { computeLogicalRole } from \"./logicalRoleInference\";\n\ninterface TopicTypeIndexQuery {\n eq(field: \"topicId\" | \"nodeType\", value: unknown): TopicTypeIndexQuery;\n}\n\ninterface RelationshipFilterQuery {\n eq(left: unknown, right: unknown): unknown;\n field(name: string): unknown;\n or(...conditions: unknown[]): unknown;\n}\n\ntype Pillar =\n | \"competition\"\n | \"customer\"\n | \"deal\"\n | \"distribution\"\n | \"financials\"\n | \"market\"\n | \"other\"\n | \"product\"\n | \"regulatory\"\n | \"risks\"\n | \"team\"\n | \"technology\"\n | \"timing\";\n\ninterface UpdatePillarArgs {\n nodeId: Id<\"epistemicNodes\">;\n pillar: Pillar;\n userId: string;\n}\n\ninterface BeliefScopeQueryArgs {\n projectId?: string;\n topicId?: string;\n}\n\ntype LinkBeliefEdgeType =\n | \"contains\"\n | \"depends_on\"\n | \"derived_from\"\n | \"informs\"\n | \"supersedes\"\n | \"supports\"\n | \"tests\";\n\ninterface LinkBeliefsArgs {\n context?: string;\n edgeType: LinkBeliefEdgeType;\n fromNodeId: Id<\"epistemicNodes\">;\n toNodeId: Id<\"epistemicNodes\">;\n userId: string;\n weight?: number;\n}\n\ninterface LinkEvidenceArgs {\n beliefNodeId: Id<\"epistemicNodes\">;\n insightId: Id<\"epistemicNodes\">;\n rationale?: string;\n type: \"contradicting\" | \"supporting\";\n userId: string;\n weight: number;\n}\n\ninterface UnlinkEvidenceArgs {\n beliefNodeId: Id<\"epistemicNodes\">;\n insightId: Id<\"epistemicNodes\">;\n userId: string;\n}\n\ninterface GetWithEvidenceArgs {\n nodeId: Id<\"epistemicNodes\">;\n}\n\ninterface GetRelationshipsArgs {\n direction?: \"both\" | \"in\" | \"out\";\n nodeId: Id<\"epistemicNodes\">;\n}\n\ninterface EpistemicNodeRow {\n _id: Id<\"epistemicNodes\">;\n globalId?: string;\n metadata?: Record<string, unknown>;\n nodeType: string;\n projectId?: string;\n status?: string;\n topicId?: string;\n}\n\ninterface EpistemicEdgeRow {\n _id: Id<\"epistemicEdges\">;\n edgeType?: string;\n fromGlobalId?: string;\n fromNodeId?: string;\n fromNodeType?: string;\n fromUuid?: string;\n globalId: string;\n sourceGlobalId?: string;\n targetGlobalId?: string;\n toGlobalId?: string;\n toNodeId?: string;\n toUuid?: string;\n weight?: number;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction readOptionalNumber(value: unknown): number | undefined {\n return typeof value === \"number\" && Number.isFinite(value)\n ? value\n : undefined;\n}\n\nfunction readOptionalString(value: unknown): string | undefined {\n return typeof value === \"string\" && value.trim().length > 0\n ? value\n : undefined;\n}\n\nfunction readRecord(value: unknown): Record<string, unknown> | undefined {\n return isRecord(value) ? value : undefined;\n}\n\nfunction readConvexId<TableName extends string>(\n value: unknown\n): Id<TableName> | undefined {\n const normalized = readOptionalString(value);\n return normalized as Id<TableName> | undefined;\n}\n\nfunction readEpistemicNodeRow(value: unknown): EpistemicNodeRow | null {\n if (!isRecord(value)) {\n return null;\n }\n const id = readConvexId<\"epistemicNodes\">(value._id);\n const nodeType = readOptionalString(value.nodeType);\n if (!(id && nodeType)) {\n return null;\n }\n const row: EpistemicNodeRow = { _id: id, nodeType };\n const globalId = readOptionalString(value.globalId);\n if (globalId !== undefined) {\n row.globalId = globalId;\n }\n const metadata = readRecord(value.metadata);\n if (metadata !== undefined) {\n row.metadata = metadata;\n }\n const projectId = readOptionalString(value.projectId);\n if (projectId !== undefined) {\n row.projectId = projectId;\n }\n const status = readOptionalString(value.status);\n if (status !== undefined) {\n row.status = status;\n }\n const topicId = readOptionalString(value.topicId);\n if (topicId !== undefined) {\n row.topicId = topicId;\n }\n return row;\n}\n\nfunction requireEpistemicNodeRow(\n value: unknown,\n nodeType: \"belief\" | \"evidence\",\n message: string\n): EpistemicNodeRow {\n const node = readEpistemicNodeRow(value);\n if (!node || node.nodeType !== nodeType) {\n throw new Error(message);\n }\n return node;\n}\n\nfunction requireNodeGlobalId(node: EpistemicNodeRow, context: string): string {\n if (!node.globalId) {\n throw new Error(\n `${context} requires node.globalId for canonical edge endpoints`\n );\n }\n return node.globalId;\n}\n\nfunction readEpistemicEdgeRow(value: unknown): EpistemicEdgeRow | null {\n if (!isRecord(value)) {\n return null;\n }\n const id = readConvexId<\"epistemicEdges\">(value._id);\n const globalId = readOptionalString(value.globalId);\n if (!(id && globalId)) {\n return null;\n }\n const row: EpistemicEdgeRow = { _id: id, globalId };\n const edgeType = readOptionalString(value.edgeType);\n if (edgeType !== undefined) {\n row.edgeType = edgeType;\n }\n const fromGlobalId = readOptionalString(value.fromGlobalId);\n if (fromGlobalId !== undefined) {\n row.fromGlobalId = fromGlobalId;\n }\n const fromNodeId = readOptionalString(value.fromNodeId);\n if (fromNodeId !== undefined) {\n row.fromNodeId = fromNodeId;\n }\n const fromNodeType = readOptionalString(value.fromNodeType);\n if (fromNodeType !== undefined) {\n row.fromNodeType = fromNodeType;\n }\n const fromUuid = readOptionalString(value.fromUuid);\n if (fromUuid !== undefined) {\n row.fromUuid = fromUuid;\n }\n const sourceGlobalId = readOptionalString(value.sourceGlobalId);\n if (sourceGlobalId !== undefined) {\n row.sourceGlobalId = sourceGlobalId;\n }\n const targetGlobalId = readOptionalString(value.targetGlobalId);\n if (targetGlobalId !== undefined) {\n row.targetGlobalId = targetGlobalId;\n }\n const toGlobalId = readOptionalString(value.toGlobalId);\n if (toGlobalId !== undefined) {\n row.toGlobalId = toGlobalId;\n }\n const toNodeId = readOptionalString(value.toNodeId);\n if (toNodeId !== undefined) {\n row.toNodeId = toNodeId;\n }\n const toUuid = readOptionalString(value.toUuid);\n if (toUuid !== undefined) {\n row.toUuid = toUuid;\n }\n const weight = readOptionalNumber(value.weight);\n if (weight !== undefined) {\n row.weight = weight;\n }\n return row;\n}\n\nfunction readEpistemicEdgeRows(values: readonly unknown[]): EpistemicEdgeRow[] {\n return values.flatMap((value) => {\n const row = readEpistemicEdgeRow(value);\n return row ? [row] : [];\n });\n}\n\nfunction assertSignedImpactScore(value: unknown, context: string): number {\n if (\n typeof value !== \"number\" ||\n !Number.isFinite(value) ||\n value === 0 ||\n value < -1 ||\n value > 1\n ) {\n throw new Error(`${context} requires explicit nonzero weight in [-1, 1]`);\n }\n return value;\n}\n\nexport const updatePillar = mutation({\n args: {\n nodeId: v.id(\"epistemicNodes\"),\n pillar: v.union(\n v.literal(\"market\"),\n v.literal(\"competition\"),\n v.literal(\"product\"),\n v.literal(\"team\"),\n v.literal(\"financials\"),\n v.literal(\"regulatory\"),\n v.literal(\"timing\"),\n v.literal(\"customer\"),\n v.literal(\"technology\"),\n v.literal(\"distribution\"),\n v.literal(\"deal\"),\n v.literal(\"risks\"),\n v.literal(\"other\")\n ),\n userId: v.string(),\n },\n returns: permissiveReturn,\n handler: async (ctx: MutationCtx, args: UpdatePillarArgs) => {\n const authenticatedUserId = await requireAuthenticatedUserId(ctx);\n const now = Date.now();\n\n const existingNode = requireEpistemicNodeRow(\n await ctx.db.get(args.nodeId),\n \"belief\",\n \"Belief not found\"\n );\n if (!existingNode.projectId) {\n throw new Error(\"Belief has no project scope\");\n }\n await requireScopeWriteAccess(\n ctx,\n existingNode.projectId,\n authenticatedUserId\n );\n\n // Update the epistemicNode (canonical source of truth)\n let previousPillar: unknown = null;\n const metadata = existingNode.metadata ?? {};\n previousPillar = metadata.pillar;\n\n await ctx.db.patch(args.nodeId, {\n metadata: {\n ...metadata,\n pillar: args.pillar,\n topic: args.pillar,\n },\n updatedAt: now,\n });\n\n // Schedule Neo4j sync\n await ctx.scheduler.runAfter(0, internal.neo4jSync.syncNodeToNeo4j, {\n nodeId: args.nodeId,\n operation: \"upsert\",\n });\n\n // Audit log - Lucern Invariant #14: no silent state transitions\n await ctx.db.insert(\"epistemicAudit\", {\n entityType: \"belief\",\n entityId: String(args.nodeId),\n changeType: \"pillar_changed\",\n projectId: existingNode.projectId,\n changedBy: authenticatedUserId,\n changedAt: now,\n isAgent: false,\n previousState: { pillar: previousPillar },\n newState: { pillar: args.pillar },\n });\n\n return {\n nodeId: args.nodeId,\n previousPillar,\n newPillar: args.pillar,\n };\n },\n});\n\n// =============================================================================\n// COUNT BY STATUS\n// =============================================================================\n\n/**\n * Get counts of beliefs by status for a project.\n */\nexport const getCountByStatus = query({\n args: {\n ...optionalBeliefScopeArgs,\n },\n returns: permissiveReturn,\n handler: async (ctx: QueryCtx, args: BeliefScopeQueryArgs) => {\n const scope = await resolveBeliefScopeOrNull(ctx, args);\n if (!scope) {\n return { active: 0, superseded: 0, archived: 0, total: 0 };\n }\n\n const nodes = (\n await ctx.db\n .query(\"epistemicNodes\")\n .withIndex(\"by_topic_type\", (q: TopicTypeIndexQuery) =>\n q.eq(\"topicId\", scope.topicId).eq(\"nodeType\", \"belief\")\n )\n .collect()\n ).flatMap((row) => {\n const node = readEpistemicNodeRow(row);\n return node?.nodeType === \"belief\" ? [node] : [];\n });\n\n const counts = {\n active: 0,\n superseded: 0,\n archived: 0,\n total: nodes.length,\n };\n\n for (const node of nodes) {\n if (node.status === \"active\") {\n counts.active++;\n } else if (node.status === \"superseded\") {\n counts.superseded++;\n } else if (node.status === \"archived\") {\n counts.archived++;\n }\n }\n\n return counts;\n },\n});\n\n// =============================================================================\n// LINK BELIEFS (Direct epistemicNodes → epistemicNodes)\n// =============================================================================\n\n/**\n * Create an edge between two beliefs in the epistemic spine.\n * This works with epistemicNodes IDs directly (no legacy lookup needed).\n */\nexport const linkBeliefs = mutation({\n args: {\n fromNodeId: v.id(\"epistemicNodes\"),\n toNodeId: v.id(\"epistemicNodes\"),\n edgeType: v.union(\n // Basic belief relationships\n v.literal(\"supersedes\"),\n v.literal(\"depends_on\"),\n v.literal(\"supports\"),\n v.literal(\"contains\"),\n v.literal(\"informs\"),\n v.literal(\"derived_from\"),\n v.literal(\"tests\")\n ),\n weight: v.optional(v.number()), // -1 to 1\n context: v.optional(v.string()),\n userId: v.string(),\n },\n returns: permissiveReturn,\n handler: async (ctx: MutationCtx, args: LinkBeliefsArgs) => {\n const authenticatedUserId = await requireAuthenticatedUserId(ctx);\n const fromNode = requireEpistemicNodeRow(\n await ctx.db.get(args.fromNodeId),\n \"belief\",\n \"One or both belief nodes not found\"\n );\n const toNode = requireEpistemicNodeRow(\n await ctx.db.get(args.toNodeId),\n \"belief\",\n \"One or both belief nodes not found\"\n );\n if (fromNode.projectId !== toNode.projectId) {\n throw new Error(\"Cannot link beliefs across different projects\");\n }\n if (!fromNode.projectId) {\n throw new Error(\"Belief has no project scope\");\n }\n await requireScopeWriteAccess(ctx, fromNode.projectId, authenticatedUserId);\n const fromGlobalId = requireNodeGlobalId(fromNode, \"Belief link\");\n const toGlobalId = requireNodeGlobalId(toNode, \"Belief link\");\n\n const now = Date.now();\n\n // Create edge directly in Neo4j (MERGE handles duplicates)\n const edgeGlobalId = generateGlobalId();\n await ctx.scheduler.runAfter(0, internal.neo4jEdgeAPI.createEdge, {\n globalId: edgeGlobalId,\n fromGlobalId,\n toGlobalId,\n edgeType: args.edgeType,\n weight: args.weight ?? 1.0,\n context: args.context,\n createdBy: authenticatedUserId,\n topicId: fromNode.projectId ? String(fromNode.projectId) : undefined,\n fromNodeType: \"belief\",\n toNodeType: \"belief\",\n });\n\n // Log to epistemic audit\n await ctx.db.insert(\"epistemicAudit\", {\n entityType: \"edge\",\n entityId: edgeGlobalId as unknown as Id<\"epistemicNodes\">,\n changeType: \"created\",\n previousState: null,\n newState: {\n fromNodeId: args.fromNodeId,\n toNodeId: args.toNodeId,\n edgeType: args.edgeType,\n },\n changedBy: authenticatedUserId,\n isAgent: false,\n changedAt: now,\n projectId: fromNode.projectId,\n });\n\n return { edgeGlobalId, created: true };\n },\n});\n\n// =============================================================================\n// LINK EVIDENCE (Insight) to Belief\n// =============================================================================\n\n/**\n * Link an insight (evidence) to a belief.\n * Creates an edge from evidence → belief with appropriate type.\n */\nexport const linkEvidence = mutation({\n args: {\n beliefNodeId: v.id(\"epistemicNodes\"),\n insightId: insightIdUnion,\n type: v.union(v.literal(\"supporting\"), v.literal(\"contradicting\")),\n weight: v.number(),\n rationale: v.optional(v.string()),\n userId: v.string(),\n },\n returns: permissiveReturn,\n handler: async (ctx: MutationCtx, args: LinkEvidenceArgs) => {\n const authenticatedUserId = await requireAuthenticatedUserId(ctx);\n const _now = Date.now();\n\n // Verify the belief exists\n const belief = requireEpistemicNodeRow(\n await ctx.db.get(args.beliefNodeId),\n \"belief\",\n \"Belief not found\"\n );\n if (!belief.projectId) {\n throw new Error(\"Belief has no project scope\");\n }\n await requireScopeWriteAccess(ctx, belief.projectId, authenticatedUserId);\n\n // Verify the insight exists\n const insight = requireEpistemicNodeRow(\n await ctx.db.get(args.insightId),\n \"evidence\",\n \"Insight not found\"\n );\n if (insight.projectId && insight.projectId !== belief.projectId) {\n throw new Error(\"Insight belongs to a different project\");\n }\n\n const evidenceNodeId = insight._id;\n const evidenceGlobalId = requireNodeGlobalId(insight, \"Evidence link\");\n const beliefGlobalId = requireNodeGlobalId(belief, \"Evidence link\");\n\n const weight = assertSignedImpactScore(args.weight, \"Evidence link\");\n if (args.type === \"supporting\" && weight < 0) {\n throw new Error(\"Supporting evidence links require positive weight\");\n }\n if (args.type === \"contradicting\" && weight > 0) {\n throw new Error(\"Contradicting evidence links require negative weight\");\n }\n const confidence = Math.abs(weight);\n\n // Determine edge type based on supporting/contradicting\n const edgeType = \"informs\"; // Both use informs, weight determines support/contradict\n\n // Compute logicalRole from graph structure\n const logicalRole = evidenceNodeId\n ? await computeLogicalRole(ctx, evidenceNodeId, args.beliefNodeId)\n : \"contributory\";\n\n // Create the edge directly in Neo4j (MERGE handles duplicates)\n const edgeGlobalId = generateGlobalId();\n await insertEpistemicEdge(ctx, {\n globalId: edgeGlobalId,\n // C2-RR.4 Defect E — canonical UUIDv7 endpoints, not Convex doc ids.\n fromNodeId: evidenceGlobalId,\n toNodeId: beliefGlobalId,\n sourceGlobalId: evidenceGlobalId,\n targetGlobalId: beliefGlobalId,\n edgeType,\n weight,\n confidence,\n context: args.rationale || `${args.type} evidence`,\n reasoningMethod: \"testimonial\",\n logicalRole,\n temporalClass: \"structural\",\n derivationType: \"evidence_sl_scoring\",\n metadata: {\n relation: args.type,\n confidence,\n impactScore: weight,\n invariant: \"evidence.belief_impact_required\",\n },\n createdBy: authenticatedUserId,\n createdAt: Date.now(),\n updatedAt: Date.now(),\n topicId: belief.topicId ? String(belief.topicId) : undefined,\n projectId: belief.projectId ? String(belief.projectId) : undefined,\n fromNodeType: \"evidence\",\n toNodeType: \"belief\",\n fromLayer: \"L2\",\n toLayer: \"L3\",\n });\n await ctx.scheduler.runAfter(0, internal.neo4jEdgeAPI.createEdge, {\n globalId: edgeGlobalId,\n fromGlobalId: evidenceGlobalId,\n toGlobalId: beliefGlobalId,\n edgeType,\n weight,\n confidence,\n context: args.rationale || `${args.type} evidence`,\n createdBy: authenticatedUserId,\n topicId: belief.projectId ? String(belief.projectId) : undefined,\n fromNodeType: \"evidence\",\n toNodeType: \"belief\",\n fromLayer: \"L2\",\n toLayer: \"L3\",\n // Classification fields\n logicalRole,\n temporalClass: \"structural\", // Default - most evidence is long-lived\n });\n\n return { edgeGlobalId, evidenceNodeId, created: true };\n },\n});\n\n// =============================================================================\n// UNLINK EVIDENCE from Belief\n// =============================================================================\n\n/**\n * Remove the link between an insight and a belief.\n */\nexport const unlinkEvidence = mutation({\n args: {\n beliefNodeId: v.id(\"epistemicNodes\"),\n insightId: v.id(\"epistemicNodes\"),\n userId: v.string(),\n },\n returns: permissiveReturn,\n handler: async (ctx: MutationCtx, args: UnlinkEvidenceArgs) => {\n const authenticatedUserId = await requireAuthenticatedUserId(ctx);\n const now = Date.now();\n\n const evidenceNodeRaw = await ctx.db.get(args.insightId);\n const evidenceNode = readEpistemicNodeRow(evidenceNodeRaw);\n if (evidenceNode?.nodeType !== \"evidence\") {\n return buildBeliefEvidenceNotFoundResult();\n }\n if (!evidenceNode.projectId) {\n throw new Error(\"Evidence has no project scope\");\n }\n await requireScopeWriteAccess(\n ctx,\n evidenceNode.projectId,\n authenticatedUserId\n );\n const beliefNode = requireEpistemicNodeRow(\n await ctx.db.get(args.beliefNodeId),\n \"belief\",\n \"Belief not found\"\n );\n if (beliefNode.projectId !== evidenceNode.projectId) {\n throw new Error(\"Belief and evidence belong to different projects\");\n }\n\n const evidenceGlobalId = requireNodeGlobalId(\n evidenceNode,\n \"Evidence unlink\"\n );\n const beliefGlobalId = requireNodeGlobalId(beliefNode, \"Evidence unlink\");\n\n // Find and delete the edge\n const edge = readEpistemicEdgeRow(\n await ctx.db\n .query(\"epistemicEdges\")\n .withIndex(\"by_from_to\", (q) =>\n q.eq(\"fromNodeId\", evidenceGlobalId).eq(\"toNodeId\", beliefGlobalId)\n )\n .first()\n );\n\n if (edge) {\n await ctx.scheduler.runAfter(0, internal.neo4jEdgeAPI.deleteEdge, {\n globalId: edge.globalId,\n });\n await ctx.db.delete(edge._id);\n\n // Log to audit\n await ctx.db.insert(\"epistemicAudit\", {\n entityType: \"edge\",\n entityId: edge.globalId,\n changeType: \"edge_removed\",\n changedAt: now,\n changedBy: authenticatedUserId,\n isAgent: false,\n previousState: {\n fromNodeId: evidenceNode._id,\n toNodeId: args.beliefNodeId,\n },\n newState: null,\n projectId: evidenceNode.projectId,\n });\n }\n\n return buildBeliefStatusSuccessResult();\n },\n});\n\n// =============================================================================\n// GET BELIEF WITH EVIDENCE\n// =============================================================================\n\n/**\n * Get a belief along with all its linked evidence.\n */\nexport const getWithEvidence = query({\n args: {\n nodeId: v.id(\"epistemicNodes\"),\n },\n returns: permissiveReturn,\n handler: async (ctx: QueryCtx, args: GetWithEvidenceArgs) => {\n const belief = readEpistemicNodeRow(await ctx.db.get(args.nodeId));\n if (belief?.nodeType !== \"belief\") {\n return null;\n }\n const beliefGlobalId = requireNodeGlobalId(belief, \"Belief evidence read\");\n\n // Get all edges pointing TO this belief from evidence nodes\n const incomingEdges = readEpistemicEdgeRows(\n await ctx.db\n .query(\"epistemicEdges\")\n .withIndex(\"by_to_type\", (q) =>\n q.eq(\"toNodeId\", beliefGlobalId).eq(\"edgeType\", \"informs\")\n )\n .collect()\n );\n\n // Get the evidence nodes\n const supporting: EpistemicNodeRow[] = [];\n const contradicting: EpistemicNodeRow[] = [];\n\n for (const edge of incomingEdges.filter(\n (incomingEdge) => incomingEdge.fromNodeType === \"evidence\"\n )) {\n const node = readEpistemicNodeRow(\n await resolveRelationshipEndpoint(\n ctx,\n edge.fromNodeId,\n edge.sourceGlobalId ?? edge.fromGlobalId ?? edge.fromUuid\n )\n );\n if (node?.nodeType === \"evidence\") {\n if ((edge.weight ?? 0) >= 0) {\n supporting.push(node);\n } else {\n contradicting.push(node);\n }\n }\n }\n\n return {\n belief,\n evidence: {\n supporting,\n contradicting,\n total: supporting.length + contradicting.length,\n },\n };\n },\n});\n\n// =============================================================================\n// GET RELATIONSHIPS\n// =============================================================================\n\nasync function collectRelationshipNodeRefs(\n ctx: { db: Pick<MutationCtx[\"db\"], \"get\"> },\n nodeId: Id<\"epistemicNodes\">\n): Promise<string[]> {\n const refs = new Set<string>([String(nodeId)]);\n const node = await ctx.db.get(nodeId);\n const globalId =\n typeof node?.globalId === \"string\" ? node.globalId.trim() : \"\";\n if (globalId.length > 0) {\n refs.add(globalId);\n }\n return [...refs];\n}\n\nfunction endpointMatches(\n q: RelationshipFilterQuery,\n fields: string[],\n refs: string[]\n) {\n return q.or(\n ...fields.flatMap((field) => refs.map((ref) => q.eq(q.field(field), ref)))\n );\n}\n\nasync function resolveRelationshipEndpoint(\n ctx: { db: Pick<MutationCtx[\"db\"], \"get\" | \"query\"> },\n endpointId: unknown,\n globalEndpointId: unknown\n) {\n const candidates = [endpointId, globalEndpointId]\n .map((value) => (typeof value === \"string\" ? value.trim() : \"\"))\n .filter(\n (value, index, values) =>\n value.length > 0 && values.indexOf(value) === index\n );\n\n for (const candidate of candidates) {\n try {\n const direct = await ctx.db.get(candidate as Id<\"epistemicNodes\">);\n if (direct) {\n return direct;\n }\n } catch {\n // Public UUID/global endpoints are expected to miss direct storage lookup.\n }\n\n const byGlobalId = await ctx.db\n .query(\"epistemicNodes\")\n .withIndex(\"by_globalId\", (q) => q.eq(\"globalId\", candidate))\n .first();\n if (byGlobalId) {\n return byGlobalId;\n }\n }\n\n return null;\n}\n\n/**\n * Get all relationships (edges) for a belief.\n */\nexport const getRelationships = query({\n args: {\n nodeId: v.id(\"epistemicNodes\"),\n direction: v.optional(\n v.union(v.literal(\"in\"), v.literal(\"out\"), v.literal(\"both\"))\n ),\n },\n returns: permissiveReturn,\n handler: async (ctx: QueryCtx, args: GetRelationshipsArgs) => {\n const direction = args.direction || \"both\";\n const results: {\n incoming: Array<{ edge: unknown; node: unknown }>;\n outgoing: Array<{ edge: unknown; node: unknown }>;\n } = {\n incoming: [],\n outgoing: [],\n };\n const nodeRefs = await collectRelationshipNodeRefs(ctx, args.nodeId);\n\n if (direction === \"in\" || direction === \"both\") {\n // Get edges pointing TO this node\n const inEdges = readEpistemicEdgeRows(\n await ctx.db\n .query(\"epistemicEdges\")\n .filter((q) =>\n endpointMatches(\n q,\n [\"toNodeId\", \"targetGlobalId\", \"toGlobalId\", \"toUuid\"],\n nodeRefs\n )\n )\n .collect()\n );\n\n for (const edge of inEdges) {\n const sourceNode = await resolveRelationshipEndpoint(\n ctx,\n edge.fromNodeId,\n edge.sourceGlobalId ?? edge.fromGlobalId ?? edge.fromUuid\n );\n results.incoming.push({ edge, node: sourceNode });\n }\n }\n\n if (direction === \"out\" || direction === \"both\") {\n // Get edges pointing FROM this node\n const outEdges = readEpistemicEdgeRows(\n await ctx.db\n .query(\"epistemicEdges\")\n .filter((q) =>\n endpointMatches(\n q,\n [\"fromNodeId\", \"sourceGlobalId\", \"fromGlobalId\", \"fromUuid\"],\n nodeRefs\n )\n )\n .collect()\n );\n\n for (const edge of outEdges) {\n const targetNode = await resolveRelationshipEndpoint(\n ctx,\n edge.toNodeId,\n edge.targetGlobalId ?? edge.toGlobalId ?? edge.toUuid\n );\n results.outgoing.push({ edge, node: targetNode });\n }\n }\n\n return results;\n },\n});\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/convex.ts","../src/epistemicBeliefs.helpers.ts","../src/epistemicBeliefs.queries.ts"],"names":["isRecord","readOptionalString","v"],"mappings":"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","file":"epistemicBeliefs.queries.js","sourcesContent":["import type { Doc as AccessControlDoc } from \"@lucern/access-control/convex\";\nimport {\n type UnsafeConvexAnyApi,\n unsafeConvexAnyApi,\n} from \"@lucern/contracts/convex/unsafeAnyApi\";\nimport {\n actionGeneric,\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\n// TODO(FR.11-structural): `api`/`internal`/`components` are `anyApi as any`\n// because this module source tree is bundled into the kernel host at deploy time\n// and has NO top-level Convex `_generated/` directory to import a typed surface\n// from. Every `api.*` / `internal.*` / string-literal cross-component ref in this\n// module (topicScope.ts, topicProjectOverlay.ts, questionEvidenceLinks.ts,\n// beliefEvidenceLinks*.ts, epistemicQuestions.helpers.ts) inherits `any` from\n// here. The fix is structural — generate a per-module typed surface or a shared\n// typed function-reference manifest (template: the typed `components.controlPlane`\n// in modules/control-plane/src/component/convex.ts and the\n// `KERNEL_API_REF_MANIFEST` pattern in packages/server-core/src/kernelApi.ts) —\n// owned by the FR.11 closing/synthesis pass, not a mechanical swap.\nconst unsafeApi = unsafeConvexAnyApi(\n \"graph-primitives top-level module bundle lacks a committed Convex _generated/api surface\"\n);\nexport const api = unsafeApi;\nexport const components =\n componentsGeneric() as unknown as UntypedFunctionReferenceSurface;\nexport const internal = unsafeApi;\n\ntype UntypedFunctionReferenceSurface = UnsafeConvexAnyApi;\ntype BoundaryValue = UntypedFunctionReferenceSurface[string];\n\nexport type TableNames = string;\nexport type Id<TableName extends TableNames = string> = GenericId<TableName>;\nexport type Doc<TableName extends TableNames = string> =\n AccessControlDoc<TableName>;\nexport type DataModel = Record<TableNames, unknown>;\ninterface IndexRangeBuilder {\n eq(fieldName: string, value: unknown): IndexRangeBuilder;\n field(fieldName: string): string;\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}\ninterface FilterBuilder {\n and(...clauses: unknown[]): FilterBuilder;\n eq(left: unknown, right: unknown): FilterBuilder;\n field(fieldName: string): string;\n gt(left: unknown, right: unknown): FilterBuilder;\n gte(left: unknown, right: unknown): FilterBuilder;\n lt(left: unknown, right: unknown): FilterBuilder;\n lte(left: unknown, right: unknown): FilterBuilder;\n neq(left: unknown, right: unknown): FilterBuilder;\n or(...clauses: unknown[]): FilterBuilder;\n [operator: string]: unknown;\n}\ninterface QueryInitializer<TableName extends TableNames> {\n collect(): Promise<Doc<TableName>[]>;\n filter(predicate: (q: FilterBuilder) => unknown): QueryInitializer<TableName>;\n first(): Promise<Doc<TableName> | null>;\n order(direction: \"asc\" | \"desc\"): QueryInitializer<TableName>;\n take(limit: number): Promise<Doc<TableName>[]>;\n unique(): Promise<Doc<TableName> | null>;\n withIndex(\n indexName: string,\n range?: (q: IndexRangeBuilder) => unknown\n ): QueryInitializer<TableName>;\n withSearchIndex(\n indexName: string,\n search?: (q: IndexRangeBuilder) => unknown\n ): QueryInitializer<TableName>;\n}\nexport interface DatabaseReader {\n get<TableName extends TableNames>(\n id: unknown\n ): Promise<Doc<TableName> | null>;\n normalizeId?<TableName extends TableNames>(\n tableName: TableName,\n id: string\n ): Id<TableName> | null;\n query<TableName extends TableNames>(\n tableName: TableName\n ): QueryInitializer<TableName>;\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};\ninterface Scheduler {\n runAfter(\n delayMs: number,\n functionReference: unknown,\n args?: unknown\n ): Promise<void>;\n}\ninterface AuthReader {\n getUserIdentity(): Promise<{\n readonly subject: string;\n readonly [claimName: string]: unknown;\n } | null>;\n}\ninterface RuntimeInvoker {\n runAction<Result = unknown>(\n functionReference: unknown,\n args?: unknown\n ): Promise<Result>;\n runMutation<Result = unknown>(\n functionReference: unknown,\n args?: unknown\n ): Promise<Result>;\n runQuery<Result = unknown>(\n functionReference: unknown,\n args?: unknown\n ): Promise<Result>;\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 Args = BoundaryValue,\n Result = BoundaryValue,\n>(definition: {\n args?: unknown;\n handler: (ctx: Ctx, args: Args) => Result;\n returns?: unknown;\n}) => unknown;\n\ntype OptionalHandlerConvexFunctionBuilder<Ctx> = <\n Args = BoundaryValue,\n Result = BoundaryValue,\n>(definition: {\n args?: unknown;\n handler?: (ctx: Ctx, args: Args) => Result;\n returns?: unknown;\n}) => unknown;\n\nexport const action =\n 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 OptionalHandlerConvexFunctionBuilder<MutationCtx>;\nexport const internalQuery =\n internalQueryGeneric as unknown as OptionalHandlerConvexFunctionBuilder<QueryCtx>;\nexport const mutation =\n mutationGeneric as unknown as ConvexFunctionBuilder<MutationCtx>;\nexport const query = queryGeneric as unknown as ConvexFunctionBuilder<QueryCtx>;\n","// biome-ignore-all lint/style/useFilenamingConvention: Public graph-primitives wildcard-export path; rename requires an export-map migration.\n/**\n * Epistemic Beliefs API\n *\n * Clean API for managing beliefs in the epistemic spine (epistemicNodes).\n * This is the NEW API that replaces beliefs.ts.\n *\n * Key differences from beliefs.ts:\n * - Writes ONLY to epistemicNodes (no dual-write)\n * - Uses epistemicNodes IDs directly (no runtime ID translation fallback)\n * - Syncs to Neo4j after mutations\n * - Follows Lucern invariants strictly\n *\n * @see /docs/epistemic-invariants/00-epistemic-invariants.md\n */\n\nimport {\n classFromAudienceKey,\n normalizeAudienceKey,\n} from \"@lucern/access-control/audience\";\nimport { getCurrentUserId } from \"@lucern/access-control/auth\";\nimport { throwStructuredMutationError } from \"@lucern/access-control/structuredMutationError\";\nimport {\n type ConfidencePolicyConfig,\n confidenceFromSL,\n mkOpinion,\n normalizeTupleContradictionPolicy,\n type Opinion,\n readOpinionFromRecord,\n type SLOperator,\n type SLOpinion,\n} from \"@lucern/confidence\";\nimport { v } from \"convex/values\";\nimport {\n type BeliefLifecycleStatus,\n resolveBeliefLifecycleStatus,\n} from \"./beliefLifecycle\";\nimport type { Id, QueryCtx } from \"./convex\";\nimport { internal } from \"./convex\";\nimport { debugGraphPrimitiveFallback } from \"./debug\";\nimport type { VerificationConfidenceTrigger } from \"./epistemicContractHelpers\";\nimport { resolveGraphPrimitivesAppResolvers } from \"./resolvers\";\nimport { optionalScopeArgs, resolveTopicProjectScope } from \"./topicScope\";\nimport { nodeMatchesWorkspaceReasoningScope } from \"./workspaceIsolation\";\n\n// All IDs now use epistemicNodes exclusively\nexport const insightIdUnion = v.id(\"epistemicNodes\");\nconst DEFAULT_PROJECT_BELIEF_LIMIT = 250;\nexport const MAX_PROJECT_BELIEF_LIMIT = 1000;\nexport const optionalBeliefScopeArgs = optionalScopeArgs;\n\n// CQ.11: the structured-refusal primitive is the single shared copy in\n// `@lucern/access-control/structuredMutationError` (the same home the shared\n// access gate throws from). Re-exported here so the graph-primitives modules\n// that imported it from this helper keep their import path unchanged.\nexport type { StructuredMutationErrorData } from \"@lucern/access-control/structuredMutationError\";\n// biome-ignore lint/performance/noBarrelFile: Public helper compatibility re-export retained for existing graph-primitives consumers.\nexport { throwStructuredMutationError } from \"@lucern/access-control/structuredMutationError\";\n\ninterface BeliefScopeArgs {\n projectId?: string | null;\n topicId?: string | null;\n}\n\ninterface EpistemicNodeOpinionSource {\n _id?: unknown;\n metadata?: Record<string, unknown> | null;\n opinion_a?: number;\n opinion_b?: number;\n opinion_d?: number;\n opinion_u?: number;\n tupleContradicted?: boolean;\n userId?: string;\n}\n\nexport interface EpistemicNodeOpinionDoc extends EpistemicNodeOpinionSource {\n _creationTime?: number;\n _id: Id<\"epistemicNodes\">;\n anonymizationClass?: string;\n audienceLabel?: string;\n beliefStatus?: unknown;\n canonicalText?: string;\n confidence?: unknown;\n createdAt?: number;\n createdBy?: string;\n epistemicLayer?: string;\n exportClass?: string;\n globalId?: string;\n metadata?: Record<string, unknown> | null;\n nodeType: \"belief\";\n policyTags?: string[];\n predictionMeta?: unknown;\n projectId?: string;\n publicationStatus?: string;\n sensitivityTier?: string;\n status?: string;\n tenantId?: string;\n topicId?: string;\n updatedAt?: number;\n workspaceId?: string;\n}\n\ninterface EpistemicIndexQuery {\n eq(field: string, value: unknown): EpistemicIndexQuery;\n field(field: string): string;\n gt(field: string, value: unknown): EpistemicIndexQuery;\n lt(field: string, value: unknown): EpistemicIndexQuery;\n}\n\ntype EpistemicBeliefCtx = QueryCtx;\n\ntype AudienceClass = \"internal\" | \"restricted_external\" | \"public\";\n\nconst DEFAULT_CONFIDENCE_POLICY: ConfidencePolicyConfig = {\n scoringMode: \"after_worktree\",\n tupleContradiction: normalizeTupleContradictionPolicy(),\n};\n\nexport type BeliefConfidenceTrigger =\n | \"initial\"\n | \"evidence_added\"\n | \"evidence_removed\"\n | \"contradiction_detected\"\n | \"contradiction_resolved\"\n | \"propagation\"\n | \"agent_assessment\"\n | \"worktree_outcome\"\n | \"worktree_completed\"\n // SL-specific triggers\n | \"fusion\"\n | \"discount\"\n | \"deduction\"\n | \"backfill_synthetic\"\n | VerificationConfidenceTrigger;\n\nexport function readFiniteNumber(value: unknown): number | undefined {\n return typeof value === \"number\" && Number.isFinite(value)\n ? value\n : undefined;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction readOptionalString(value: unknown): string | undefined {\n return typeof value === \"string\" && value.trim().length > 0\n ? value\n : undefined;\n}\n\nfunction readStringArray(value: unknown): string[] | undefined {\n if (!Array.isArray(value)) {\n return;\n }\n const strings = value.filter(\n (item): item is string => typeof item === \"string\" && item.length > 0\n );\n return strings.length === value.length ? strings : undefined;\n}\n\nfunction readRecord(value: unknown): Record<string, unknown> | undefined {\n return isRecord(value) ? value : undefined;\n}\n\nexport function readBeliefNodeView(\n value: unknown\n): EpistemicNodeOpinionDoc | null {\n if (!isRecord(value)) {\n return null;\n }\n\n const id = readOptionalString(value._id) as Id<\"epistemicNodes\"> | undefined;\n const nodeType = readOptionalString(value.nodeType);\n if (!(id && nodeType === \"belief\")) {\n return null;\n }\n\n const node: EpistemicNodeOpinionDoc = {\n _id: id,\n nodeType,\n };\n const creationTime = readFiniteNumber(value._creationTime);\n if (creationTime !== undefined) {\n node._creationTime = creationTime;\n }\n const metadata = readRecord(value.metadata);\n if (metadata !== undefined) {\n node.metadata = metadata;\n }\n const opinionA = readFiniteNumber(value.opinion_a);\n if (opinionA !== undefined) {\n node.opinion_a = opinionA;\n }\n const opinionB = readFiniteNumber(value.opinion_b);\n if (opinionB !== undefined) {\n node.opinion_b = opinionB;\n }\n const opinionD = readFiniteNumber(value.opinion_d);\n if (opinionD !== undefined) {\n node.opinion_d = opinionD;\n }\n const opinionU = readFiniteNumber(value.opinion_u);\n if (opinionU !== undefined) {\n node.opinion_u = opinionU;\n }\n const tupleContradicted =\n typeof value.tupleContradicted === \"boolean\"\n ? value.tupleContradicted\n : undefined;\n if (tupleContradicted !== undefined) {\n node.tupleContradicted = tupleContradicted;\n }\n\n const stringFields = {\n anonymizationClass: value.anonymizationClass,\n audienceLabel: value.audienceLabel,\n canonicalText: value.canonicalText,\n createdBy: value.createdBy,\n epistemicLayer: value.epistemicLayer,\n exportClass: value.exportClass,\n globalId: value.globalId,\n projectId: value.projectId,\n publicationStatus: value.publicationStatus,\n sensitivityTier: value.sensitivityTier,\n status: value.status,\n tenantId: value.tenantId,\n topicId: value.topicId,\n userId: value.userId,\n workspaceId: value.workspaceId,\n };\n for (const [field, fieldValue] of Object.entries(stringFields)) {\n const normalized = readOptionalString(fieldValue);\n if (normalized !== undefined) {\n node[field as keyof typeof stringFields] = normalized;\n }\n }\n\n const createdAt = readFiniteNumber(value.createdAt);\n if (createdAt !== undefined) {\n node.createdAt = createdAt;\n }\n const updatedAt = readFiniteNumber(value.updatedAt);\n if (updatedAt !== undefined) {\n node.updatedAt = updatedAt;\n }\n if (value.beliefStatus !== undefined) {\n node.beliefStatus = value.beliefStatus;\n }\n if (value.confidence !== undefined) {\n node.confidence = value.confidence;\n }\n if (value.predictionMeta !== undefined) {\n node.predictionMeta = value.predictionMeta;\n }\n const policyTags = readStringArray(value.policyTags);\n if (policyTags !== undefined) {\n node.policyTags = policyTags;\n }\n\n return node;\n}\n\nfunction readBeliefNodeViews(\n values: readonly unknown[]\n): EpistemicNodeOpinionDoc[] {\n return values.flatMap((value) => {\n const node = readBeliefNodeView(value);\n return node ? [node] : [];\n });\n}\n\nfunction clamp01(value: number): number {\n return Math.max(0, Math.min(1, value));\n}\n\nexport function assertBaseRateInRange(\n baseRate: number,\n field = \"baseRate\"\n): number {\n if (baseRate < 0 || baseRate > 1) {\n throwStructuredMutationError({\n message: `${field} must be within [0, 1].`,\n status: 400,\n code: \"INVALID_ARGUMENT\",\n invariantCode: \"request.valid_shape\",\n suggestion: `Clamp ${field} into the inclusive [0, 1] interval.`,\n details: { field, baseRate },\n });\n }\n return baseRate;\n}\n\nexport function buildBeliefConfidenceRow(args: {\n beliefId: Id<\"epistemicNodes\">;\n belief: number;\n disbelief: number;\n uncertainty: number;\n baseRate: number;\n trigger: BeliefConfidenceTrigger;\n rationale?: string;\n assessedBy: string;\n assessedAt: number;\n slOperator?: SLOperator;\n triggeringEvidenceId?: Id<\"epistemicNodes\">;\n triggeringContradictionId?: Id<\"contradictions\">;\n triggeringWorktreeId?: string;\n}) {\n return {\n beliefId: args.beliefId,\n confidence: confidenceFromSL(\n args.belief,\n args.disbelief,\n args.uncertainty,\n args.baseRate\n ),\n belief: args.belief,\n disbelief: args.disbelief,\n uncertainty: args.uncertainty,\n baseRate: args.baseRate,\n slOperator: args.slOperator ?? (\"prior_seed\" as const),\n trigger: args.trigger,\n ...(args.rationale ? { rationale: args.rationale } : {}),\n assessedBy: args.assessedBy,\n assessedAt: args.assessedAt,\n ...(args.triggeringEvidenceId\n ? {\n triggeringEvidenceId: args.triggeringEvidenceId,\n triggeringEvidenceIds: [String(args.triggeringEvidenceId)],\n }\n : {}),\n ...(args.triggeringContradictionId\n ? {\n triggeringContradictionId: args.triggeringContradictionId,\n }\n : {}),\n ...(args.triggeringWorktreeId\n ? { triggeringWorktreeId: args.triggeringWorktreeId }\n : {}),\n };\n}\n\ntype BeliefStatusResult =\n | { success: true }\n | { success: false; message: \"Evidence node not found\" };\n\nexport function buildBeliefStatusSuccessResult(): BeliefStatusResult {\n return { success: true };\n}\n\nexport function buildBeliefEvidenceNotFoundResult(): BeliefStatusResult {\n const result = {} as Extract<BeliefStatusResult, { success: false }>;\n result.success = false;\n result.message = \"Evidence node not found\";\n return result;\n}\n\nexport function deriveSyntheticBackfillOpinion(\n source: Record<string, unknown>\n): SLOpinion {\n const belief =\n readFiniteNumber(source.opinion_b) ?? readFiniteNumber(source.belief);\n const disbelief =\n readFiniteNumber(source.opinion_d) ?? readFiniteNumber(source.disbelief);\n const uncertainty =\n readFiniteNumber(source.opinion_u) ?? readFiniteNumber(source.uncertainty);\n const baseRate =\n readFiniteNumber(source.opinion_a) ?? readFiniteNumber(source.baseRate);\n\n if (\n belief !== undefined ||\n disbelief !== undefined ||\n uncertainty !== undefined ||\n baseRate !== undefined\n ) {\n try {\n return readOpinionFromRecord(source);\n } catch (error) {\n debugGraphPrimitiveFallback(\n \"[epistemicBeliefs] Failed to decode legacy belief opinion\",\n {\n error,\n }\n );\n return mkOpinion(0, 0, 1, 0.5);\n }\n }\n\n const confidence = clamp01(readFiniteNumber(source.confidence) ?? 0);\n return mkOpinion(confidence, 1 - confidence, 0, 0.5);\n}\n\nexport function clampBeliefLimit(\n limit: number | undefined,\n fallback = DEFAULT_PROJECT_BELIEF_LIMIT\n): number {\n if (!Number.isFinite(limit)) {\n return fallback;\n }\n return Math.max(\n 1,\n Math.min(Math.floor(limit as number), MAX_PROJECT_BELIEF_LIMIT)\n );\n}\n\nexport function readTupleContradictedFlag(value: unknown): boolean | undefined {\n return typeof value === \"boolean\" ? value : undefined;\n}\n\nexport function readBeliefOpinionSnapshot(\n node: EpistemicNodeOpinionSource,\n metadata: Record<string, unknown>\n): SLOpinion {\n try {\n return readOpinionFromRecord({\n ...metadata,\n opinion_b: node.opinion_b,\n opinion_d: node.opinion_d,\n opinion_u: node.opinion_u,\n opinion_a: node.opinion_a,\n });\n } catch (error) {\n debugGraphPrimitiveFallback(\n \"[epistemicBeliefs] Failed to read belief opinion snapshot\",\n {\n error,\n beliefId: node._id,\n }\n );\n return mkOpinion(0, 0, 1, 0.5);\n }\n}\n\nexport function deriveTupleContradictionSeverity(node: {\n metadata?: Record<string, unknown> | null;\n}): \"critical\" | \"significant\" | \"minor\" {\n const metadata = node.metadata || {};\n const criticality =\n typeof metadata.criticality === \"string\" ? metadata.criticality : undefined;\n\n if (criticality === \"blocking\") {\n return \"critical\";\n }\n if (criticality === \"supporting\") {\n return \"minor\";\n }\n return \"significant\";\n}\n\nexport function formatTupleContradictionDescription(args: {\n opinion: Opinion;\n policy: ConfidencePolicyConfig[\"tupleContradiction\"];\n}): string {\n return `Tuple-space contradiction detected: b=${args.opinion.b.toFixed(2)} > ${args.policy.beliefThreshold.toFixed(2)} and d=${args.opinion.d.toFixed(2)} > ${args.policy.disbeliefThreshold.toFixed(2)}.`;\n}\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\nexport function generateContentHash(text: string): string {\n const content = `belief:${text.trim().toLowerCase().replace(/\\s+/g, \" \")}`;\n let hash = 5381;\n for (let i = 0; i < content.length; i++) {\n // biome-ignore lint/suspicious/noBitwiseOperators: Preserve deterministic djb2 hash semantics for persisted belief metadata compatibility.\n hash = (hash << 5) + hash + content.charCodeAt(i);\n // biome-ignore lint/suspicious/noBitwiseOperators: Preserve deterministic djb2 hash semantics for persisted belief metadata compatibility.\n hash &= hash;\n }\n return Math.abs(hash).toString(16).padStart(8, \"0\");\n}\n\nexport function resolveBeliefWorktreeId(\n metadata: Record<string, unknown> | undefined\n): string | undefined {\n const worktreeId = metadata?.worktreeId;\n if (typeof worktreeId === \"string\" && worktreeId.trim().length > 0) {\n return worktreeId;\n }\n\n const sprintId = metadata?.sprintId;\n return typeof sprintId === \"string\" && sprintId.trim().length > 0\n ? sprintId\n : undefined;\n}\n\n// Map pillar names to valid pillar literals\ntype ValidPillar =\n | \"market\"\n | \"competition\"\n | \"product\"\n | \"team\"\n | \"financials\"\n | \"regulatory\"\n | \"timing\"\n | \"customer\"\n | \"technology\"\n | \"distribution\"\n | \"deal\"\n | \"risks\"\n | \"other\";\n\nexport function normalizePillar(pillar?: string): ValidPillar {\n if (!pillar) {\n return \"other\";\n }\n const lower = pillar.toLowerCase();\n const validPillars: ValidPillar[] = [\n \"market\",\n \"competition\",\n \"product\",\n \"team\",\n \"financials\",\n \"regulatory\",\n \"timing\",\n \"customer\",\n \"technology\",\n \"distribution\",\n \"deal\",\n \"risks\",\n ];\n return (validPillars.find((p) => lower.includes(p)) ||\n \"other\") as ValidPillar;\n}\n\nexport async function markBeliefGraphDirty(\n ctx: EpistemicBeliefCtx,\n scope: { projectId?: string | null; topicId?: string | null }\n): Promise<void> {\n const projectId =\n typeof scope.projectId === \"string\" && scope.projectId.trim().length > 0\n ? scope.projectId\n : undefined;\n const topicId =\n typeof scope.topicId === \"string\" && scope.topicId.trim().length > 0\n ? scope.topicId\n : undefined;\n\n if (!(projectId || topicId)) {\n return;\n }\n\n if (projectId) {\n await ctx.scheduler.runAfter(\n 0,\n internal.graphAnalysisCache.markCacheStaleInternal,\n { projectId }\n );\n }\n if (topicId) {\n await ctx.scheduler.runAfter(\n 0,\n internal.graphAnalysisCache.markCacheStaleByTopic,\n { topicId }\n );\n }\n\n const activityScopeId = topicId ?? projectId;\n if (!activityScopeId) {\n throw new Error(\n \"Expected belief graph dirty scope to include a topic or project id.\"\n );\n }\n\n await resolveGraphPrimitivesAppResolvers(ctx).patchProject(\n ctx,\n activityScopeId,\n {\n lastActivityAt: Date.now(),\n }\n );\n}\n\nexport async function resolveBeliefScopeOrNull(\n ctx: QueryCtx,\n args: BeliefScopeArgs\n) {\n if (!args.topicId) {\n return null;\n }\n\n try {\n return await resolveTopicProjectScope(ctx, {\n projectId: args.projectId ?? undefined,\n topicId: args.topicId ?? undefined,\n });\n } catch (error) {\n debugGraphPrimitiveFallback(\n \"[epistemicBeliefs] Failed to resolve belief scope\",\n {\n error,\n projectId: args.projectId,\n topicId: args.topicId,\n }\n );\n return null;\n }\n}\n\nexport async function getBeliefNodesForScope(\n ctx: EpistemicBeliefCtx,\n scope: Awaited<ReturnType<typeof resolveTopicProjectScope>>,\n args?: { scanLimit?: number; status?: string }\n) {\n const baseQuery = ctx.db\n .query(\"epistemicNodes\")\n .withIndex(\"by_topic_type\", (q: EpistemicIndexQuery) =>\n q.eq(\"topicId\", scope.topicId).eq(\"nodeType\", \"belief\")\n );\n const rows =\n typeof args?.scanLimit === \"number\"\n ? await baseQuery.order(\"desc\").take(args.scanLimit)\n : await baseQuery.collect();\n const nodes = readBeliefNodeViews(rows);\n const scopedNodes = nodes.filter((node) =>\n nodeMatchesWorkspaceReasoningScope(node, scope)\n );\n\n if (!args?.status) {\n return scopedNodes;\n }\n\n return scopedNodes.filter(\n (node: EpistemicNodeOpinionDoc) => node.status === args.status\n );\n}\n\nexport function createBeliefAudienceResolver(\n registryRows: Array<{\n audienceKey?: string | null;\n audienceClass: AudienceClass;\n }>\n) {\n const audienceClassByKey = new Map<string, AudienceClass>(\n registryRows.map((row) => [\n normalizeAudienceKey(row.audienceKey),\n row.audienceClass,\n ])\n );\n\n return (\n audienceKey: string | undefined | null,\n fallback: AudienceClass\n ): AudienceClass => {\n const key = normalizeAudienceKey(audienceKey);\n if (!key) {\n return fallback;\n }\n return (\n audienceClassByKey.get(key) ??\n (classFromAudienceKey(key, fallback) as AudienceClass)\n );\n };\n}\n\nexport function flattenBeliefNode(node: EpistemicNodeOpinionDoc) {\n const meta = node.metadata || {};\n const worktreeId = resolveBeliefWorktreeId(meta);\n const tupleContradicted =\n readTupleContradictedFlag(node.tupleContradicted) ??\n readTupleContradictedFlag(meta.tupleContradicted) ??\n false;\n\n return {\n _id: node._id,\n _epistemicNodeId: node._id,\n _creationTime: node._creationTime,\n belief: node.canonicalText,\n formulation: node.canonicalText,\n projectId: node.projectId,\n topicId: node.topicId,\n userId: node.userId || node.createdBy || \"\",\n confidence: (meta.confidence as \"high\" | \"medium\" | \"low\") || \"untested\",\n status: node.status,\n beliefStatus: resolveBeliefStatus(node, meta),\n topic: (meta.topic as string) || (meta.pillar as string) || \"other\",\n pillar: (meta.pillar as string) || (meta.topic as string) || \"\",\n category: (meta.category as string) || \"\",\n subcategory: (meta.subcategory as string) || \"\",\n categoryIcon: (meta.categoryIcon as string) || \"\",\n supportingEvidence: (meta.supportingEvidenceIds as string[]) || [],\n contradictingEvidence: (meta.contradictingEvidenceIds as string[]) || [],\n testingQuestions: (meta.testingQuestionIds as string[]) || [],\n linkedInsights: (meta.linkedInsightIds as string[]) || [],\n createdAt: node.createdAt,\n updatedAt: node.updatedAt || node.createdAt,\n tupleContradicted,\n sprintId: (meta.sprintId as string) || undefined,\n worktreeId,\n sourceBeliefIds: (meta.sourceBeliefIds as string[]) || undefined,\n criticality:\n (meta.criticality as\n | \"critical\"\n | \"supporting\"\n | \"nice_to_have\"\n | \"unanalyzed\"\n | \"blocking\"\n | \"important\") || \"unanalyzed\",\n rationale: (meta.rationale as string) || \"\",\n audienceLabel: node.audienceLabel,\n policyTags: node.policyTags,\n sensitivityTier: node.sensitivityTier,\n exportClass: node.exportClass,\n anonymizationClass: node.anonymizationClass,\n };\n}\n\nexport function resolveBeliefStatus(\n node: {\n beliefStatus?: unknown;\n confidence?: unknown;\n predictionMeta?: unknown;\n },\n metadata: Record<string, unknown>\n): BeliefLifecycleStatus {\n return resolveBeliefLifecycleStatus({\n beliefStatus: node.beliefStatus,\n confidence: node.confidence,\n predictionMeta: node.predictionMeta,\n metadata,\n });\n}\n\nexport async function hasCompletedWorktreeForBelief(\n ctx: EpistemicBeliefCtx,\n beliefNodeId: Id<\"epistemicNodes\">\n): Promise<boolean> {\n // Check if the belief is linked to a completed worktree via worktreeBeliefCluster\n const clusterMembership = await ctx.db\n .query(\"worktreeBeliefCluster\")\n .withIndex(\"by_belief\", (q: EpistemicIndexQuery) =>\n q.eq(\"beliefId\", beliefNodeId)\n )\n .collect();\n for (const membership of clusterMembership) {\n const worktree = await ctx.db.get(membership.worktreeId);\n if (worktree?.status === \"completed\" || worktree?.status === \"merged\") {\n return true;\n }\n }\n return false;\n}\n\nexport async function getActiveConfidencePolicy(\n ctx: EpistemicBeliefCtx\n): Promise<ConfidencePolicyConfig> {\n try {\n const activeConfig = await ctx.db\n .query(\"logicSprintScoring\")\n .withIndex(\"by_active\", (q: EpistemicIndexQuery) =>\n q.eq(\"isActive\", true)\n )\n .first();\n\n return {\n scoringMode:\n activeConfig?.confidencePolicy === \"always\"\n ? \"always\"\n : DEFAULT_CONFIDENCE_POLICY.scoringMode,\n tupleContradiction: normalizeTupleContradictionPolicy(\n activeConfig?.tupleContradictionPolicy as\n | Partial<ConfidencePolicyConfig[\"tupleContradiction\"]>\n | undefined\n ),\n };\n } catch (error) {\n debugGraphPrimitiveFallback(\n \"[epistemicBeliefs] Failed to load active confidence policy\",\n {\n error,\n }\n );\n // K-tier/component environments do not carry logicSprintScoring.\n return DEFAULT_CONFIDENCE_POLICY;\n }\n}\n\nexport async function requireAuthenticatedUserId(ctx: {\n auth: { getUserIdentity: () => Promise<unknown> };\n}): Promise<string> {\n const userId = await getCurrentUserId(\n ctx as Parameters<typeof getCurrentUserId>[0]\n );\n if (!userId) {\n throwStructuredMutationError({\n message: \"Authentication required.\",\n status: 401,\n code: \"AUTHENTICATION_REQUIRED\",\n invariantCode: \"auth.required\",\n suggestion:\n \"Provide a valid bearer token before invoking belief mutations.\",\n });\n }\n return userId;\n}\n","// biome-ignore-all lint/style/useFilenamingConvention: Public graph-primitives wildcard-export path; rename requires an export-map migration.\n/** Split read-only belief queries out of epistemicBeliefs.ts. */\n\nimport { permissiveReturn } from \"@lucern/contracts/schema-helpers/validators\";\nimport { v } from \"convex/values\";\nimport type { Doc, Id, QueryCtx } from \"./convex\";\nimport { query } from \"./convex\";\nimport { readBeliefNodeView } from \"./epistemicBeliefs.helpers\";\n\ntype EpistemicNodeId = Id<\"epistemicNodes\">;\ninterface BeliefLineageEntry {\n createdAt: number;\n forkReason?: string;\n formulation: string;\n nodeId: EpistemicNodeId;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction readOptionalString(value: unknown): string | undefined {\n return typeof value === \"string\" && value.trim().length > 0\n ? value\n : undefined;\n}\n\nfunction readConvexId<TableName extends string>(\n value: unknown\n): Id<TableName> | undefined {\n const normalized = readOptionalString(value);\n return normalized as Id<TableName> | undefined;\n}\n\nfunction isBeliefNode(\n node: Doc<\"epistemicNodes\"> | null\n): node is Doc<\"epistemicNodes\"> & { nodeType: \"belief\" } {\n return readBeliefNodeView(node) !== null;\n}\n\nasync function resolveEpistemicNodeId(\n ctx: QueryCtx,\n ref: unknown\n): Promise<EpistemicNodeId | null> {\n const normalized = readOptionalString(ref);\n if (!normalized) {\n return null;\n }\n const direct = ctx.db.normalizeId?.(\"epistemicNodes\", normalized);\n if (direct) {\n return direct;\n }\n const byGlobalId = readBeliefNodeView(\n await ctx.db\n .query(\"epistemicNodes\")\n .withIndex(\"by_globalId\", (q) => q.eq(\"globalId\", normalized))\n .first()\n );\n return byGlobalId?._id ?? null;\n}\n\nfunction readLineageEdgeTarget(edge: unknown): string | undefined {\n if (!isRecord(edge)) {\n return;\n }\n return readOptionalString(edge.toNodeId);\n}\n\nexport const getConfidenceHistory = query({\n args: {\n nodeId: v.id(\"epistemicNodes\"),\n },\n returns: permissiveReturn,\n handler: async (ctx: QueryCtx, args: { nodeId: EpistemicNodeId }) => {\n const node = await ctx.db.get(args.nodeId);\n if (node?.nodeType !== \"belief\") {\n return [];\n }\n\n return await ctx.db\n .query(\"beliefConfidence\")\n .withIndex(\"by_beliefId_time\", (q) => q.eq(\"beliefId\", args.nodeId))\n .order(\"asc\")\n .collect();\n },\n});\n\n// =============================================================================\n// GET BELIEF LINEAGE\n// =============================================================================\n\n/**\n * Get the lineage of a belief (all forks and parents).\n */\nexport const getLineage = query({\n args: {\n nodeId: v.id(\"epistemicNodes\"),\n },\n returns: permissiveReturn,\n handler: async (ctx: QueryCtx, args: { nodeId: EpistemicNodeId }) => {\n const lineage: BeliefLineageEntry[] = [];\n\n let currentId: EpistemicNodeId | null = args.nodeId;\n\n while (currentId) {\n const beliefId: EpistemicNodeId = currentId;\n const node = readBeliefNodeView(await ctx.db.get(beliefId));\n if (!node) {\n break;\n }\n\n const metadata = node.metadata ?? {};\n\n lineage.push({\n nodeId: node._id,\n formulation: node.canonicalText ?? \"\",\n forkReason: readOptionalString(metadata.forkReason),\n createdAt: node.createdAt ?? 0,\n });\n\n // Find parent via supersedes edge\n const edges: Doc<\"epistemicEdges\">[] = await ctx.db\n .query(\"epistemicEdges\")\n .withIndex(\"by_from_type\", (q) =>\n q\n .eq(\"fromNodeId\", node.globalId ?? String(beliefId))\n .eq(\"edgeType\", \"supersedes\")\n )\n .collect();\n\n const edgeTarget = readLineageEdgeTarget(edges[0]);\n currentId =\n (await resolveEpistemicNodeId(ctx, edgeTarget)) ??\n readConvexId<\"epistemicNodes\">(metadata.forkedFrom) ??\n null;\n }\n\n return lineage;\n },\n});\n\n// =============================================================================\n// GET BELIEFS BY IDS\n// =============================================================================\n\n/**\n * Get multiple beliefs by their IDs.\n */\nexport const getByIds = query({\n args: {\n nodeIds: v.array(v.id(\"epistemicNodes\")),\n },\n returns: permissiveReturn,\n handler: async (ctx: QueryCtx, args: { nodeIds: EpistemicNodeId[] }) => {\n const beliefs = await Promise.all(args.nodeIds.map((id) => ctx.db.get(id)));\n return beliefs.filter(isBeliefNode);\n },\n});\n\n// =============================================================================\n// GET BY SPRINT\n// =============================================================================\n\n/**\n * Get all beliefs associated with a worktree via worktreeBeliefCluster.\n */\nexport const getByWorktree = query({\n args: {\n worktreeId: v.string(),\n },\n returns: permissiveReturn,\n handler: async (ctx: QueryCtx, args: { worktreeId: string }) => {\n const worktree = await ctx.db.get(args.worktreeId as Id<\"worktrees\">);\n if (!worktree) {\n return [];\n }\n\n const clusterLinks = await ctx.db\n .query(\"worktreeBeliefCluster\")\n .withIndex(\"by_worktree\", (q) => q.eq(\"worktreeId\", args.worktreeId))\n .collect();\n\n const beliefs: Doc<\"epistemicNodes\">[] = [];\n for (const link of clusterLinks) {\n const beliefId = isRecord(link)\n ? readConvexId<\"epistemicNodes\">(link.beliefId)\n : undefined;\n if (!beliefId) {\n continue;\n }\n const node = await ctx.db.get(beliefId);\n if (isBeliefNode(node)) {\n beliefs.push(node);\n }\n }\n return beliefs;\n },\n});\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/convex.ts","../src/epistemicInsert.ts","../src/epistemicBeliefs.topicAnchor.ts"],"names":[],"mappings":"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","file":"epistemicBeliefs.topicAnchor.js","sourcesContent":["import type { Doc as AccessControlDoc } from \"@lucern/access-control/convex\";\nimport {\n type UnsafeConvexAnyApi,\n unsafeConvexAnyApi,\n} from \"@lucern/contracts/convex/unsafeAnyApi\";\nimport {\n actionGeneric,\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\n// TODO(FR.11-structural): `api`/`internal`/`components` are `anyApi as any`\n// because this module source tree is bundled into the kernel host at deploy time\n// and has NO top-level Convex `_generated/` directory to import a typed surface\n// from. Every `api.*` / `internal.*` / string-literal cross-component ref in this\n// module (topicScope.ts, topicProjectOverlay.ts, questionEvidenceLinks.ts,\n// beliefEvidenceLinks*.ts, epistemicQuestions.helpers.ts) inherits `any` from\n// here. The fix is structural — generate a per-module typed surface or a shared\n// typed function-reference manifest (template: the typed `components.controlPlane`\n// in modules/control-plane/src/component/convex.ts and the\n// `KERNEL_API_REF_MANIFEST` pattern in packages/server-core/src/kernelApi.ts) —\n// owned by the FR.11 closing/synthesis pass, not a mechanical swap.\nconst unsafeApi = unsafeConvexAnyApi(\n \"graph-primitives top-level module bundle lacks a committed Convex _generated/api surface\"\n);\nexport const api = unsafeApi;\nexport const components =\n componentsGeneric() as unknown as UntypedFunctionReferenceSurface;\nexport const internal = unsafeApi;\n\ntype UntypedFunctionReferenceSurface = UnsafeConvexAnyApi;\ntype BoundaryValue = UntypedFunctionReferenceSurface[string];\n\nexport type TableNames = string;\nexport type Id<TableName extends TableNames = string> = GenericId<TableName>;\nexport type Doc<TableName extends TableNames = string> =\n AccessControlDoc<TableName>;\nexport type DataModel = Record<TableNames, unknown>;\ninterface IndexRangeBuilder {\n eq(fieldName: string, value: unknown): IndexRangeBuilder;\n field(fieldName: string): string;\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}\ninterface FilterBuilder {\n and(...clauses: unknown[]): FilterBuilder;\n eq(left: unknown, right: unknown): FilterBuilder;\n field(fieldName: string): string;\n gt(left: unknown, right: unknown): FilterBuilder;\n gte(left: unknown, right: unknown): FilterBuilder;\n lt(left: unknown, right: unknown): FilterBuilder;\n lte(left: unknown, right: unknown): FilterBuilder;\n neq(left: unknown, right: unknown): FilterBuilder;\n or(...clauses: unknown[]): FilterBuilder;\n [operator: string]: unknown;\n}\ninterface QueryInitializer<TableName extends TableNames> {\n collect(): Promise<Doc<TableName>[]>;\n filter(predicate: (q: FilterBuilder) => unknown): QueryInitializer<TableName>;\n first(): Promise<Doc<TableName> | null>;\n order(direction: \"asc\" | \"desc\"): QueryInitializer<TableName>;\n take(limit: number): Promise<Doc<TableName>[]>;\n unique(): Promise<Doc<TableName> | null>;\n withIndex(\n indexName: string,\n range?: (q: IndexRangeBuilder) => unknown\n ): QueryInitializer<TableName>;\n withSearchIndex(\n indexName: string,\n search?: (q: IndexRangeBuilder) => unknown\n ): QueryInitializer<TableName>;\n}\nexport interface DatabaseReader {\n get<TableName extends TableNames>(\n id: unknown\n ): Promise<Doc<TableName> | null>;\n normalizeId?<TableName extends TableNames>(\n tableName: TableName,\n id: string\n ): Id<TableName> | null;\n query<TableName extends TableNames>(\n tableName: TableName\n ): QueryInitializer<TableName>;\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};\ninterface Scheduler {\n runAfter(\n delayMs: number,\n functionReference: unknown,\n args?: unknown\n ): Promise<void>;\n}\ninterface AuthReader {\n getUserIdentity(): Promise<{\n readonly subject: string;\n readonly [claimName: string]: unknown;\n } | null>;\n}\ninterface RuntimeInvoker {\n runAction<Result = unknown>(\n functionReference: unknown,\n args?: unknown\n ): Promise<Result>;\n runMutation<Result = unknown>(\n functionReference: unknown,\n args?: unknown\n ): Promise<Result>;\n runQuery<Result = unknown>(\n functionReference: unknown,\n args?: unknown\n ): Promise<Result>;\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 Args = BoundaryValue,\n Result = BoundaryValue,\n>(definition: {\n args?: unknown;\n handler: (ctx: Ctx, args: Args) => Result;\n returns?: unknown;\n}) => unknown;\n\ntype OptionalHandlerConvexFunctionBuilder<Ctx> = <\n Args = BoundaryValue,\n Result = BoundaryValue,\n>(definition: {\n args?: unknown;\n handler?: (ctx: Ctx, args: Args) => Result;\n returns?: unknown;\n}) => unknown;\n\nexport const action =\n 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 OptionalHandlerConvexFunctionBuilder<MutationCtx>;\nexport const internalQuery =\n internalQueryGeneric as unknown as OptionalHandlerConvexFunctionBuilder<QueryCtx>;\nexport const mutation =\n mutationGeneric as unknown as ConvexFunctionBuilder<MutationCtx>;\nexport const query = queryGeneric as unknown as ConvexFunctionBuilder<QueryCtx>;\n","// biome-ignore-all lint/style/useFilenamingConvention: Public graph-primitives wildcard-export path; rename requires an export-map migration.\nimport {\n assertEdgePolicyAllowed,\n type EpistemicNodeType,\n edgePolicyManifest,\n} from \"@lucern/contracts\";\nimport {\n assertStorageEdgeVocabulary,\n assertUuidShapedEdgeEndpoint,\n assertUuidV7Identity,\n} from \"@lucern/contracts/ids\";\nimport type { Id, MutationCtx } from \"./convex\";\n\ninterface GlobalIdIndexQuery {\n eq(field: \"globalId\", value: string): GlobalIdIndexQuery;\n}\n\ninterface EpistemicNodeInsertDoc extends Record<string, unknown> {\n globalId: string;\n}\n\ninterface EpistemicEdgeInsertDoc extends Record<string, unknown> {\n edgeType: string;\n fromNodeId: string;\n fromNodeType?: string;\n globalId: string;\n toNodeId: string;\n toNodeType?: string;\n}\n\nexport function insertEpistemicNode(\n ctx: MutationCtx,\n doc: EpistemicNodeInsertDoc\n): Promise<Id<\"epistemicNodes\">> {\n assertUuidV7Identity(\"epistemicNodes\", doc.globalId);\n return ctx.db.insert(\"epistemicNodes\", doc);\n}\n\n/**\n * C2-RR.4b — REFERENTIAL edge-endpoint canonicality (amends RR.4's FORMAT guard).\n *\n * Proves an endpoint is the UUIDv7 `globalId` of an EXISTING\n * `epistemicNodes` row. Refuses doc ids, fabricated/unknown endpoints, and\n * legacy UUIDv4 `globalId`s; those must be reminted through the identity\n * backfill ledger before participating in new edge writes.\n */\nasync function assertExistingNodeEndpoint(\n ctx: MutationCtx,\n endpointRole: \"fromNodeId\" | \"toNodeId\",\n endpoint: string\n): Promise<void> {\n assertUuidShapedEdgeEndpoint(endpointRole, endpoint);\n const node = await ctx.db\n .query(\"epistemicNodes\")\n .withIndex(\"by_globalId\", (q: GlobalIdIndexQuery) =>\n q.eq(\"globalId\", endpoint)\n )\n .first();\n if (!node) {\n throw new Error(\n `edge_endpoint_not_canonical: epistemicEdges insert requires ${endpointRole} to be the globalId of an existing epistemicNodes row, received ${endpoint} (no node with that globalId)`\n );\n }\n}\n\nexport async function insertEpistemicEdge(\n ctx: MutationCtx,\n doc: EpistemicEdgeInsertDoc\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.4b Defect E (REFERENTIAL) — ENDPOINT CANONICAL IDENTITY. Edge\n // endpoints must each be the globalId of an EXISTING epistemicNodes row,\n // never a Convex doc id, a legacy topic id, or a fabricated/unknown uuid.\n // This refuses mixed _id/globalId endpoint writes at the floor and keeps\n // legacy UUIDv4 graph rows inside the explicit remint/backfill lane.\n await assertExistingNodeEndpoint(ctx, \"fromNodeId\", doc.fromNodeId);\n await assertExistingNodeEndpoint(ctx, \"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","// biome-ignore-all lint/style/useFilenamingConvention: Public ABI filename consumed by existing import paths.\n\nimport type { Doc, Id, MutationCtx } from \"./convex\";\nimport { internal } from \"./convex\";\nimport { insertEpistemicEdge } from \"./epistemicInsert.js\";\nimport { generateUuidV7, isUuidV7 } from \"./globalId\";\n\ninterface TopicAnchorInput {\n topicGlobalId?: string;\n topicId?: string;\n topicNodeId?: string;\n}\n\ntype TopicNodeDoc = Doc<\"epistemicNodes\"> & {\n globalId: string;\n nodeType: \"topic\";\n};\n\nfunction cleanString(value: unknown): string | undefined {\n return typeof value === \"string\" && value.trim().length > 0\n ? value.trim()\n : undefined;\n}\n\nfunction requireTopicGlobalId(topicRef: string): string {\n const normalized = topicRef.trim();\n if (!(normalized && isUuidV7(normalized))) {\n throw new Error(\n \"Belief creation topic anchors must be UUIDv7 epistemicNodes.globalId values.\"\n );\n }\n return normalized;\n}\n\nexport function readTopicNodeRef(args: TopicAnchorInput): string | undefined {\n return (\n cleanString(args.topicGlobalId) ??\n cleanString(args.topicNodeId) ??\n cleanString(args.topicId)\n );\n}\n\nexport async function resolveRequiredTopicAnchor(\n ctx: MutationCtx,\n topicRef: string\n): Promise<TopicNodeDoc> {\n const topicGlobalId = requireTopicGlobalId(topicRef);\n const byGlobalId = await ctx.db\n .query(\"epistemicNodes\")\n .withIndex(\"by_globalId\", (q) => q.eq(\"globalId\", topicGlobalId))\n .first();\n if (byGlobalId?.nodeType === \"topic\" && cleanString(byGlobalId.globalId)) {\n return byGlobalId as TopicNodeDoc;\n }\n\n throw new Error(\n \"Belief creation requires a UUIDv7 topicGlobalId for a topic node in epistemicNodes. Legacy topics-table IDs are not valid belief anchors.\"\n );\n}\n\nexport function scopeFromTopicAnchor(topicNode: TopicNodeDoc) {\n return {\n topicId: topicNode.globalId,\n projectId: cleanString(topicNode.projectId),\n tenantId: cleanString(topicNode.tenantId),\n workspaceId: cleanString(topicNode.workspaceId),\n source: \"topic\" as const,\n };\n}\n\nexport async function createRequiredBeliefTopicEdge(\n ctx: MutationCtx,\n args: {\n beliefNodeId: Id<\"epistemicNodes\">;\n beliefGlobalId: string;\n topicNode: TopicNodeDoc;\n createdBy: string;\n }\n) {\n const topicGlobalId = args.topicNode.globalId;\n const now = Date.now();\n\n // C2-RR.4 Defect E — query (and write) by canonical UUIDv7 endpoints, not\n // Convex doc ids. The endpoints are belief/topic globalIds.\n const existingEdges = await ctx.db\n .query(\"epistemicEdges\")\n .withIndex(\"by_from_to\", (q) =>\n q.eq(\"fromNodeId\", args.beliefGlobalId).eq(\"toNodeId\", topicGlobalId)\n )\n .collect();\n const existing = existingEdges.find((edge) => edge.edgeType === \"belongs_to\");\n const edgeGlobalId = cleanString(existing?.globalId) ?? generateUuidV7();\n\n if (!existing) {\n await insertEpistemicEdge(ctx, {\n globalId: edgeGlobalId,\n fromNodeId: args.beliefGlobalId,\n toNodeId: topicGlobalId,\n sourceGlobalId: args.beliefGlobalId,\n targetGlobalId: topicGlobalId,\n edgeType: \"belongs_to\",\n weight: 1,\n confidence: 1,\n context: \"Belief creation topic anchor invariant.\",\n reasoningMethod: \"implicit\",\n derivationType: \"topic_scope_invariant\",\n metadata: {\n invariant: \"belief.topic_edge_required\",\n edgeUuid: edgeGlobalId,\n fromUuid: args.beliefGlobalId,\n toUuid: topicGlobalId,\n },\n createdBy: args.createdBy,\n createdAt: now,\n updatedAt: now,\n projectId: cleanString(args.topicNode.projectId),\n topicId: topicGlobalId,\n tenantId: cleanString(args.topicNode.tenantId),\n workspaceId: cleanString(args.topicNode.workspaceId),\n fromNodeType: \"belief\",\n toNodeType: \"topic\",\n fromLayer: \"L3\",\n toLayer: args.topicNode.epistemicLayer ?? \"ontological\",\n });\n }\n\n await ctx.scheduler.runAfter(0, internal.neo4jEdgeAPI.createEdge, {\n globalId: edgeGlobalId,\n fromGlobalId: args.beliefGlobalId,\n toGlobalId: topicGlobalId,\n edgeType: \"belongs_to\",\n weight: 1,\n confidence: 1,\n context: \"Belief creation topic anchor invariant.\",\n projectId: cleanString(args.topicNode.projectId),\n topicId: topicGlobalId,\n createdBy: args.createdBy,\n fromNodeType: \"belief\",\n toNodeType: \"topic\",\n fromLayer: \"L3\",\n toLayer: args.topicNode.epistemicLayer ?? \"ontological\",\n metadata: {\n invariant: \"belief.topic_edge_required\",\n edgeUuid: edgeGlobalId,\n fromUuid: args.beliefGlobalId,\n toUuid: topicGlobalId,\n },\n });\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"epistemicContractHelpers.js","sourcesContent":[]}