@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/topicProjectOverlay.ts","../src/resolvers.ts","../src/topicScope.ts","../src/epistemicEvidenceHelpers.ts","../src/workspaceIsolation.ts","../src/epistemicEvidenceQueries.ts"],"names":["isMissingLucernChildComponentError","getErrorMessage","LEGACY_SCOPE_FIELD","query","normalizeScopeValue","v"],"mappings":"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","file":"epistemicEvidenceQueries.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.\nimport type {\n DatabaseReader,\n DatabaseWriter,\n Id,\n MutationCtx,\n QueryCtx,\n} from \"./convex\";\nimport { api } from \"./convex\";\nimport { debugGraphPrimitiveFallback } from \"./debug\";\n\ntype OverlayIdMode = \"legacy\" | \"topic\";\nconst LEGACY_SCOPE_FIELD = \"graphScopeProjectId\";\n\ninterface LegacyProjectThesis {\n confidence: number;\n lastUpdated: number;\n statement: string;\n}\n\ntype LegacyPillarImportance = \"critical\" | \"major\" | \"minor\" | \"not_applicable\";\n\ninterface LegacyThesisPillarConfig {\n aiSuggestion?: {\n suggestedAt: number;\n reasoning: string;\n };\n configuredAt?: number;\n configuredBy?: string;\n pillarImportance?: Record<string, LegacyPillarImportance | undefined>;\n}\n\ninterface LegacyBeliefArchitecture {\n lastCalculated: number;\n overallMaturity: number;\n pillarScores: Record<string, unknown>[];\n}\n\ninterface LegacyOntologyClassification {\n classifiedAt: number;\n functions: Record<string, unknown>[];\n overallConfidence: number;\n valueChains: Record<string, unknown>[];\n}\n\ntype TopicDocLike = Record<string, unknown> & {\n _id: string;\n _creationTime?: number;\n globalId?: string;\n name?: string;\n description?: string;\n type?: string;\n tenantId?: string;\n workspaceId?: string;\n status?: string;\n visibility?: string;\n createdBy?: string;\n /** FR.7 creator-grant: the exact acting principal recorded as owner-principal. */\n ownerPrincipalId?: string;\n createdAt?: number;\n updatedAt?: number;\n metadata?: Record<string, unknown>;\n};\n\nexport type TopicProjectOverlay = Record<string, unknown> & {\n _id: string;\n projectId: string;\n topicId: string;\n storageProjectId: string;\n legacyProjectId?: string;\n name: string;\n type: string;\n description?: string;\n ownerId: string;\n /** FR.7 creator-grant: principal-shaped owner; distinct from clerkId-shaped ownerId. */\n ownerPrincipalId?: string;\n sharedWith: string[];\n visibility: \"private\" | \"team\" | \"firm\" | \"external\" | \"public\";\n tenantId?: string;\n workspaceId?: string;\n status: \"active\" | \"archived\" | \"watching\";\n tags: string[];\n chatCount: number;\n artifactCount: number;\n lastActivityAt: number;\n thesis?: LegacyProjectThesis;\n wedgeHypothesis?: string;\n founderArchetype?: string;\n investmentCriteria?: string[];\n sprintPhase?:\n | \"pre_sprint\"\n | \"readiness_check\"\n | \"thesis_crystallization\"\n | \"sprint_planning\"\n | \"active_sprint\"\n | \"theme_assembly\"\n | \"evolution\";\n currentSprintIndex?: number;\n thesisPillarConfig?: LegacyThesisPillarConfig;\n beliefArchitecture?: LegacyBeliefArchitecture;\n ontologyClassification?: LegacyOntologyClassification;\n _creationTime: number;\n createdAt: number;\n updatedAt: number;\n};\n\ninterface OverlayContext {\n db?: Pick<DatabaseReader, \"get\" | \"query\"> &\n Partial<Pick<DatabaseWriter, \"patch\">>;\n runMutation?: MutationCtx[\"runMutation\"];\n runQuery?: QueryCtx[\"runQuery\"];\n}\n\ninterface TopicPatchPlan {\n nextMetadata: Record<string, unknown>;\n patch: Record<string, unknown>;\n topicUpdateArgs: Record<string, unknown> & { id: string };\n}\n\nfunction readNonEmptyString(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 readStringArray(value: unknown): string[] {\n if (!Array.isArray(value)) {\n return [];\n }\n return value\n .map((entry) => readNonEmptyString(entry))\n .filter((entry): entry is string => Boolean(entry));\n}\n\nfunction readMetadata(topic: TopicDocLike): Record<string, unknown> {\n return topic.metadata && typeof topic.metadata === \"object\"\n ? topic.metadata\n : {};\n}\n\nfunction omitMetadataKey(\n metadata: Record<string, unknown>,\n key: string\n): Record<string, unknown> {\n const { [key]: _omitted, ...rest } = metadata;\n return rest;\n}\n\nfunction readLegacyProjectId(\n value: Record<string, unknown> | null | undefined\n): string | undefined {\n if (!value) {\n return;\n }\n return readNonEmptyString(value[LEGACY_SCOPE_FIELD]);\n}\n\nfunction coerceVisibility(\n value: unknown\n): TopicProjectOverlay[\"visibility\"] | undefined {\n return value === \"private\" ||\n value === \"team\" ||\n value === \"firm\" ||\n value === \"external\" ||\n value === \"public\"\n ? value\n : undefined;\n}\n\nfunction coerceStatus(\n value: unknown\n): TopicProjectOverlay[\"status\"] | undefined {\n return value === \"active\" || value === \"archived\" || value === \"watching\"\n ? value\n : undefined;\n}\n\nfunction mapProjectType(\n topic: TopicDocLike,\n metadata: Record<string, unknown>\n): string {\n const explicit = readNonEmptyString(metadata.projectType);\n if (explicit) {\n return explicit;\n }\n if (topic.type === \"theme\") {\n return \"thematic\";\n }\n return readNonEmptyString(topic.type) || \"general\";\n}\n\nfunction isProjectLikeTopic(topic: TopicDocLike): boolean {\n const metadata = readMetadata(topic);\n return (\n topic.type === \"theme\" ||\n topic.type === \"thematic\" ||\n topic.type === \"deal\" ||\n topic.type === \"monitoring\" ||\n readLegacyProjectId(topic) !== undefined ||\n readNonEmptyString(metadata.projectType) !== undefined\n );\n}\n\nfunction isMissingLucernChildComponentError(error: unknown): boolean {\n const message = getErrorMessage(error);\n return (\n message.includes(\n 'Child component ComponentName(Identifier(\"lucern\")) not found'\n ) ||\n (message.includes(\"Child component\") &&\n message.includes(\"lucern\") &&\n message.includes(\"not found\"))\n );\n}\n\nfunction getErrorMessage(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n if (\n typeof error === \"object\" &&\n error !== null &&\n \"message\" in error &&\n typeof (error as { message?: unknown }).message === \"string\"\n ) {\n return (error as { message: string }).message;\n }\n return \"unknown error\";\n}\n\nasync function resolveTopicDoc(\n ctx: OverlayContext,\n scopeId: string\n): Promise<TopicDocLike | null> {\n if (ctx?.db && typeof ctx.db.get === \"function\") {\n try {\n const directTopic = (await ctx.db.get(\n scopeId as Id<\"topics\">\n )) as TopicDocLike | null;\n if (directTopic) {\n return directTopic;\n }\n } catch (error) {\n debugGraphPrimitiveFallback(\n \"[topicProjectOverlay] Failed to resolve topic by direct ID\",\n {\n error,\n scopeId,\n }\n );\n // Not a direct topics-table id.\n }\n }\n\n if (typeof ctx.runQuery !== \"function\") {\n return null;\n }\n\n try {\n const topic = await ctx.runQuery<TopicDocLike | null>(api.topics.get, {\n id: String(scopeId),\n });\n if (topic?.name !== undefined && topic?.type !== undefined) {\n return topic as TopicDocLike;\n }\n } catch (error) {\n debugGraphPrimitiveFallback(\n \"[topicProjectOverlay] Failed to resolve topic by ID query\",\n {\n error,\n scopeId,\n }\n );\n // Fall through to legacy-scope lookup.\n }\n\n try {\n const topic = await ctx.runQuery<TopicDocLike | null>(\n api.topics.getByLegacyScopeId,\n {\n projectId: String(scopeId),\n }\n );\n if (topic?.name !== undefined && topic?.type !== undefined) {\n return topic as TopicDocLike;\n }\n } catch (error) {\n debugGraphPrimitiveFallback(\n \"[topicProjectOverlay] Failed to resolve topic by legacy scope ID\",\n { error, scopeId }\n );\n // Best-effort compat lookup only.\n }\n\n return null;\n}\n\nexport function materializeTopicProjectOverlay(\n topic: TopicDocLike,\n idMode: OverlayIdMode = \"legacy\"\n): TopicProjectOverlay {\n const metadata = readMetadata(topic);\n const topicId = String(topic._id);\n const legacyProjectId =\n readLegacyProjectId(topic) ||\n readLegacyProjectId(metadata) ||\n readNonEmptyString(metadata.legacyProjectId);\n const storageProjectId = legacyProjectId || topicId;\n const outwardId = idMode === \"topic\" ? topicId : storageProjectId;\n const visibility =\n coerceVisibility(topic.visibility) ||\n coerceVisibility(metadata.visibility) ||\n \"private\";\n const status =\n coerceStatus(topic.status) || coerceStatus(metadata.status) || \"active\";\n let createdAt = 0;\n if (typeof topic.createdAt === \"number\") {\n createdAt = topic.createdAt;\n } else if (typeof topic._creationTime === \"number\") {\n createdAt = topic._creationTime;\n }\n let updatedAt = createdAt;\n if (typeof topic.updatedAt === \"number\") {\n updatedAt = topic.updatedAt;\n } else if (typeof metadata.updatedAt === \"number\") {\n updatedAt = metadata.updatedAt;\n }\n\n return {\n ...metadata,\n _id: outwardId,\n projectId: outwardId,\n topicId,\n storageProjectId,\n legacyProjectId,\n name: readNonEmptyString(topic.name) || \"Untitled Theme\",\n type: mapProjectType(topic, metadata),\n description: readNonEmptyString(topic.description),\n ownerId:\n readNonEmptyString(metadata.ownerId) ||\n readNonEmptyString(topic.createdBy) ||\n \"system\",\n // FR.7 creator-grant: surface the principal-shaped owner field (column-first,\n // metadata fallback for legacy rows that recorded it in metadata).\n ownerPrincipalId:\n readNonEmptyString(topic.ownerPrincipalId) ||\n readNonEmptyString(metadata.ownerPrincipalId),\n // RR.1 carrier: preserve the nested metadata carrier so the kernel's\n // `checkProjectAccessDetailed` metadata-PRIMARY read\n // (`project.metadata?.ownerPrincipalId`) resolves the grant. The `...metadata`\n // spread above only flattens keys; it does not leave a nested `metadata`.\n metadata,\n sharedWith: readStringArray(metadata.sharedWith),\n visibility,\n tenantId:\n readNonEmptyString(topic.tenantId) ||\n readNonEmptyString(metadata.tenantId),\n workspaceId:\n readNonEmptyString(topic.workspaceId) ||\n readNonEmptyString(metadata.workspaceId),\n status,\n tags: readStringArray(metadata.tags),\n chatCount:\n typeof metadata.chatCount === \"number\"\n ? (metadata.chatCount as number)\n : 0,\n artifactCount:\n typeof metadata.artifactCount === \"number\"\n ? (metadata.artifactCount as number)\n : 0,\n lastActivityAt:\n typeof metadata.lastActivityAt === \"number\"\n ? (metadata.lastActivityAt as number)\n : updatedAt,\n _creationTime:\n typeof topic._creationTime === \"number\" ? topic._creationTime : createdAt,\n createdAt,\n updatedAt,\n };\n}\n\nexport async function resolveTopicProjectOverlay(\n ctx: OverlayContext,\n scopeId: string,\n options: {\n idMode?: OverlayIdMode;\n projectLikeOnly?: boolean;\n } = {}\n): Promise<TopicProjectOverlay | null> {\n const topic = await resolveTopicDoc(ctx, scopeId);\n if (!topic) {\n return null;\n }\n if (options.projectLikeOnly !== false && !isProjectLikeTopic(topic)) {\n return null;\n }\n return materializeTopicProjectOverlay(topic, options.idMode);\n}\n\nexport async function listTopicProjectOverlays(\n ctx: OverlayContext,\n options: {\n idMode?: OverlayIdMode;\n projectLikeOnly?: boolean;\n } = {}\n): Promise<TopicProjectOverlay[]> {\n let allTopics: TopicDocLike[] = [];\n\n if (ctx?.db?.query && typeof ctx.db.query === \"function\") {\n try {\n allTopics = (await ctx.db.query(\"topics\").collect()) as TopicDocLike[];\n } catch (error) {\n debugGraphPrimitiveFallback(\n \"[topicProjectOverlay] Failed to read topics table; falling back to API\",\n { error }\n );\n allTopics = [];\n }\n }\n\n if (allTopics.length === 0 && typeof ctx.runQuery === \"function\") {\n allTopics =\n (((await ctx.runQuery(api.topics.list, {})) ?? []) as TopicDocLike[]) ||\n [];\n }\n\n return allTopics\n .filter(\n (topic) => options.projectLikeOnly === false || isProjectLikeTopic(topic)\n )\n .map((topic) => materializeTopicProjectOverlay(topic, options.idMode));\n}\n\nexport async function patchTopicProjectOverlay(\n ctx: OverlayContext,\n scopeId: string,\n value: Record<string, unknown>\n): Promise<TopicProjectOverlay | null> {\n const topic = await resolveTopicDoc(ctx, scopeId);\n if (!topic) {\n return null;\n }\n\n const plan = buildTopicProjectOverlayPatchPlan(topic, value);\n await applyTopicProjectOverlayPatch(ctx, topic, plan);\n\n return materializeTopicProjectOverlay({\n ...topic,\n ...plan.patch,\n metadata: plan.nextMetadata,\n } as TopicDocLike);\n}\n\nfunction buildTopicProjectOverlayPatchPlan(\n topic: TopicDocLike,\n value: Record<string, unknown>\n): TopicPatchPlan {\n const plan: TopicPatchPlan = {\n nextMetadata: { ...readMetadata(topic) },\n patch: {},\n topicUpdateArgs: {\n id: String(topic._id),\n },\n };\n for (const [key, rawValue] of Object.entries(value)) {\n applyTopicProjectOverlayPatchEntry(plan, key, rawValue);\n }\n\n plan.patch.updatedAt = Date.now();\n plan.patch.metadata = plan.nextMetadata;\n plan.topicUpdateArgs.metadata = plan.nextMetadata;\n\n return plan;\n}\n\nfunction applyTopicProjectOverlayPatchEntry(\n plan: TopicPatchPlan,\n key: string,\n rawValue: unknown\n) {\n switch (key) {\n case \"_id\":\n case \"projectId\":\n case \"topicId\":\n case \"legacyProjectId\":\n case \"storageProjectId\":\n case \"updatedAt\":\n case \"createdAt\":\n return;\n case \"name\":\n case \"description\":\n plan.patch[key] = rawValue;\n plan.topicUpdateArgs[key] = rawValue;\n return;\n case \"tenantId\":\n case \"workspaceId\":\n case \"ownerId\":\n throw new Error(\n `patchTopicProjectOverlay cannot mutate ${key} via component-owned topics`\n );\n case \"status\":\n applyTopicStatusPatch(plan, rawValue);\n return;\n case \"visibility\":\n applyTopicVisibilityPatch(plan, rawValue);\n return;\n case \"type\":\n applyTopicProjectTypePatch(plan, rawValue);\n return;\n default:\n applyTopicMetadataPatch(plan, key, rawValue);\n }\n}\n\nfunction applyTopicStatusPatch(plan: TopicPatchPlan, rawValue: unknown) {\n const status = coerceStatus(rawValue);\n if (status) {\n plan.patch.status = status;\n plan.topicUpdateArgs.status = status;\n }\n}\n\nfunction applyTopicVisibilityPatch(plan: TopicPatchPlan, rawValue: unknown) {\n const visibility = coerceVisibility(rawValue);\n if (visibility) {\n plan.patch.visibility = visibility;\n plan.topicUpdateArgs.visibility = visibility;\n }\n}\n\nfunction applyTopicProjectTypePatch(plan: TopicPatchPlan, rawValue: unknown) {\n const projectType = readNonEmptyString(rawValue);\n if (projectType) {\n plan.nextMetadata.projectType = projectType;\n return;\n }\n plan.nextMetadata = omitMetadataKey(plan.nextMetadata, \"projectType\");\n}\n\nfunction applyTopicMetadataPatch(\n plan: TopicPatchPlan,\n key: string,\n rawValue: unknown\n) {\n if (rawValue === undefined) {\n plan.nextMetadata = omitMetadataKey(plan.nextMetadata, key);\n return;\n }\n plan.nextMetadata[key] = rawValue;\n}\n\nasync function applyTopicProjectOverlayPatch(\n ctx: OverlayContext,\n topic: TopicDocLike,\n plan: TopicPatchPlan\n): Promise<void> {\n if (typeof ctx.runMutation === \"function\") {\n try {\n await ctx.runMutation(api.topics.update, plan.topicUpdateArgs);\n } catch (error) {\n if (!canPatchTopicViaLocalDb(ctx, error)) {\n throw error;\n }\n await ctx.db.patch(topic._id as Id<\"topics\">, plan.patch);\n }\n } else if (ctx?.db && typeof ctx.db.patch === \"function\") {\n await ctx.db.patch(topic._id as Id<\"topics\">, plan.patch);\n } else {\n throw new Error(\n \"Cannot patch topic without component adapter (ctx.runMutation unavailable)\"\n );\n }\n}\n\nfunction canPatchTopicViaLocalDb(\n ctx: OverlayContext,\n error: unknown\n): ctx is {\n db: Pick<DatabaseReader, \"get\" | \"query\"> & Pick<DatabaseWriter, \"patch\">;\n} {\n return (\n isMissingLucernChildComponentError(error) &&\n Boolean(ctx?.db) &&\n typeof ctx.db?.patch === \"function\"\n );\n}\n\nexport function matchesTopicProjectOverlayAccess(\n accessibleProjectIds: Set<string>,\n project: {\n topicId: string;\n legacyProjectId?: string;\n storageProjectId?: string;\n }\n): boolean {\n return (\n accessibleProjectIds.has(project.storageProjectId || project.topicId) ||\n accessibleProjectIds.has(project.topicId) ||\n (typeof project.legacyProjectId === \"string\" &&\n accessibleProjectIds.has(project.legacyProjectId))\n );\n}\n","/** Data-source resolver wiring for the graph-primitives module. */\n\nimport type {\n GraphPrimitivesAppResolverContext,\n GraphPrimitivesAppResolvers,\n} from \"./resolverTypes\";\nimport {\n listTopicProjectOverlays,\n patchTopicProjectOverlay,\n resolveTopicProjectOverlay,\n} from \"./topicProjectOverlay\";\n\nfunction isMissingLucernChildComponentError(error: unknown): boolean {\n const message = getErrorMessage(error);\n return (\n message.includes(\n 'Child component ComponentName(Identifier(\"lucern\")) not found'\n ) ||\n (message.includes(\"Child component\") &&\n message.includes(\"lucern\") &&\n message.includes(\"not found\"))\n );\n}\n\nfunction getErrorMessage(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n if (\n typeof error === \"object\" &&\n error !== null &&\n \"message\" in error &&\n typeof (error as { message?: unknown }).message === \"string\"\n ) {\n return (error as { message: string }).message;\n }\n return \"unknown error\";\n}\n\nfunction isAdvisoryTopicPatch(value: Record<string, unknown>): boolean {\n const advisoryKeys = new Set([\"lastActivityAt\", \"updatedAt\"]);\n const keys = Object.keys(value);\n return keys.length > 0 && keys.every((key) => advisoryKeys.has(key));\n}\n\nasync function patchProjectWithTolerance(\n ctx: GraphPrimitivesAppResolverContext,\n projectId: string,\n value: Record<string, unknown>\n): Promise<void> {\n try {\n await patchTopicProjectOverlay(ctx, projectId, value);\n } catch (error) {\n if (\n !(\n isAdvisoryTopicPatch(value) && isMissingLucernChildComponentError(error)\n )\n ) {\n throw error;\n }\n\n console.warn(\n \"[lucern graph-primitives] Non-fatal advisory topic patch failure\",\n {\n projectId,\n keys: Object.keys(value),\n error: getErrorMessage(error),\n }\n );\n }\n}\n\nfunction defaultResolvers(): GraphPrimitivesAppResolvers {\n return {\n getProject: (ctx, projectId) =>\n resolveTopicProjectOverlay(ctx, projectId, {\n idMode: \"legacy\",\n projectLikeOnly: false,\n }),\n patchProject: (ctx, projectId, value) =>\n patchProjectWithTolerance(ctx, projectId, value),\n listTopics: (ctx) =>\n listTopicProjectOverlays(ctx, {\n idMode: \"legacy\",\n }),\n getFinalArtifact: (ctx, artifactId) => ctx.db.get(artifactId),\n };\n}\n\nlet resolverOverrides: Partial<GraphPrimitivesAppResolvers> = {};\n\nexport function configureGraphPrimitivesAppResolvers(\n overrides: Partial<GraphPrimitivesAppResolvers>\n): void {\n resolverOverrides = {\n ...resolverOverrides,\n ...overrides,\n };\n}\n\nexport function resetGraphPrimitivesAppResolvers(): void {\n resolverOverrides = {};\n}\n\nexport function resolveGraphPrimitivesAppResolvers(\n _ctx: GraphPrimitivesAppResolverContext\n): GraphPrimitivesAppResolvers {\n return {\n ...defaultResolvers(),\n ...resolverOverrides,\n };\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.\nimport {\n classFromAudienceKey,\n normalizeAudienceKey,\n} from \"@lucern/access-control/audience\";\nimport type { Doc, MutationCtx, QueryCtx } from \"./convex\";\nimport { internal } from \"./convex\";\nimport { debugGraphPrimitiveFallback } from \"./debug\";\nimport { resolveGraphPrimitivesAppResolvers } from \"./resolvers\";\nimport { optionalScopeArgs, resolveTopicProjectScope } from \"./topicScope\";\n\nexport type EvidenceKind =\n | \"fact\"\n | \"observation\"\n | \"claim\"\n | \"quote\"\n | \"statistic\"\n | \"signal\";\n\nexport type AudienceClass = \"internal\" | \"restricted_external\" | \"public\";\n\nexport interface EvidenceScopeArgs {\n projectId?: string | null;\n topicId?: string | null;\n}\n\nexport type EvidenceNodeDoc = Doc<\"epistemicNodes\">;\ninterface TopicIndexQuery {\n eq(field: string, value: unknown): TopicIndexQuery;\n}\n\nexport const optionalEvidenceScopeArgs = optionalScopeArgs;\n\nconst DEFAULT_EVIDENCE_PAGE_SIZE = 250;\nconst MAX_EVIDENCE_PAGE_SIZE = 1000;\nconst LEGACY_SPRINT_LINK_KEY = \"linkedSprintId\";\n\nexport function generateContentHash(text: string): string {\n const content = `evidence:${text.trim().toLowerCase().replace(/\\s+/g, \" \").slice(0, 500)}`;\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 evidence metadata compatibility.\n hash = (hash << 5) + hash + content.charCodeAt(i);\n // biome-ignore lint/suspicious/noBitwiseOperators: Preserve deterministic djb2 hash semantics for persisted evidence metadata compatibility.\n hash &= hash;\n }\n return Math.abs(hash).toString(16).padStart(8, \"0\");\n}\n\nexport function normalizeKind(kind?: string): EvidenceKind {\n if (!kind) {\n return \"observation\";\n }\n const validKinds: EvidenceKind[] = [\n \"fact\",\n \"observation\",\n \"claim\",\n \"quote\",\n \"statistic\",\n \"signal\",\n ];\n return (validKinds.find((k) => kind.toLowerCase() === k) ||\n \"observation\") as EvidenceKind;\n}\n\nexport function normalizeSourceType(\n sourceType?: string\n): \"proprietary\" | \"verified\" | \"ai_generated\" {\n if (sourceType === \"proprietary\" || sourceType === \"verified\") {\n return sourceType;\n }\n return \"ai_generated\";\n}\n\nexport async function markProjectGraphDirty(\n ctx: QueryCtx | MutationCtx,\n projectId: string | undefined | null,\n topicId?: string | undefined | null\n): Promise<void> {\n const normalizedProjectId =\n typeof projectId === \"string\" && projectId.trim().length > 0\n ? projectId\n : undefined;\n const normalizedTopicId =\n typeof topicId === \"string\" && topicId.trim().length > 0\n ? topicId\n : undefined;\n\n if (!(normalizedProjectId || normalizedTopicId)) {\n return;\n }\n\n if (normalizedProjectId) {\n await ctx.scheduler.runAfter(\n 0,\n internal.graphAnalysisCache.markCacheStaleInternal,\n {\n projectId: normalizedProjectId,\n }\n );\n }\n if (normalizedTopicId) {\n await ctx.scheduler.runAfter(\n 0,\n internal.graphAnalysisCache.markCacheStaleByTopic,\n {\n topicId: normalizedTopicId,\n }\n );\n }\n const activityScopeId = normalizedTopicId ?? normalizedProjectId;\n if (!activityScopeId) {\n throw new Error(\n \"Expected evidence graph dirty scope to include a topic or project id.\"\n );\n }\n await resolveGraphPrimitivesAppResolvers(ctx).patchProject(\n ctx,\n activityScopeId,\n {\n lastActivityAt: Date.now(),\n }\n );\n}\n\nexport function clampEvidenceLimit(\n limit: number | undefined,\n fallback = DEFAULT_EVIDENCE_PAGE_SIZE\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_EVIDENCE_PAGE_SIZE)\n );\n}\n\nexport function dedupeEvidenceNodes(\n nodes: EvidenceNodeDoc[]\n): EvidenceNodeDoc[] {\n const seen = new Set<string>();\n const deduped: EvidenceNodeDoc[] = [];\n for (const node of nodes) {\n const id = String(node._id);\n if (seen.has(id)) {\n continue;\n }\n seen.add(id);\n deduped.push(node);\n }\n return deduped;\n}\n\nexport function evidenceMatchesScope(\n node: unknown,\n scope: Awaited<ReturnType<typeof resolveTopicProjectScope>>\n): boolean {\n const record =\n node && typeof node === \"object\" && !Array.isArray(node)\n ? (node as Record<string, unknown>)\n : null;\n if (!record) {\n return false;\n }\n const nodeTopicId =\n typeof record.topicId === \"string\" ? record.topicId : undefined;\n const nodeProjectId =\n typeof record.projectId === \"string\" ? record.projectId : undefined;\n const scopeTopicId =\n scope.topicId === undefined ? undefined : String(scope.topicId);\n const scopeProjectId =\n scope.projectId === undefined ? undefined : String(scope.projectId);\n return (\n (scopeTopicId !== undefined && nodeTopicId === scopeTopicId) ||\n (scopeProjectId !== undefined && nodeProjectId === scopeProjectId)\n );\n}\n\nexport function resolveEvidenceLinkedWorktreeId(\n metadata: Record<string, unknown> | undefined\n): string | undefined {\n const worktreeId = metadata?.linkedWorktreeId;\n if (typeof worktreeId === \"string\" && worktreeId.trim().length > 0) {\n return worktreeId;\n }\n const sprintId = metadata?.[LEGACY_SPRINT_LINK_KEY];\n return typeof sprintId === \"string\" && sprintId.trim().length > 0\n ? sprintId\n : undefined;\n}\n\nexport async function resolveEvidenceScopeOrNull(\n ctx: QueryCtx | MutationCtx,\n args: EvidenceScopeArgs\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 \"[epistemicEvidence] Failed to resolve evidence scope\",\n {\n error,\n projectId: args.projectId,\n topicId: args.topicId,\n }\n );\n return null;\n }\n}\n\nexport async function getEvidenceNodesForScope(\n ctx: QueryCtx,\n scope: Awaited<ReturnType<typeof resolveTopicProjectScope>>,\n args?: { scanLimit?: number }\n): Promise<EvidenceNodeDoc[]> {\n const scanLimit =\n typeof args?.scanLimit === \"number\" ? args.scanLimit : undefined;\n const topicNodes = await (scanLimit\n ? ctx.db\n .query(\"epistemicNodes\")\n .withIndex(\"by_topic_type\", (q: TopicIndexQuery) =>\n q.eq(\"topicId\", scope.topicId).eq(\"nodeType\", \"evidence\")\n )\n .order(\"desc\")\n .take(scanLimit)\n : ctx.db\n .query(\"epistemicNodes\")\n .withIndex(\"by_topic_type\", (q: TopicIndexQuery) =>\n q.eq(\"topicId\", scope.topicId).eq(\"nodeType\", \"evidence\")\n )\n .order(\"desc\")\n .collect());\n\n return dedupeEvidenceNodes(topicNodes).filter((node) =>\n evidenceMatchesScope(node, scope)\n );\n}\n\ninterface AudienceRow {\n audienceClass: AudienceClass;\n audienceKey?: string | null;\n}\n\nexport function createEvidenceAudienceResolver(registryRows: AudienceRow[]) {\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 flattenEvidenceNode(n: EvidenceNodeDoc) {\n const meta = (n.metadata || {}) as Record<string, unknown>;\n const linkedWorktreeId = resolveEvidenceLinkedWorktreeId(meta);\n return {\n ...n,\n text: n.canonicalText || \"\",\n title: n.title || \"\",\n kind: (meta.kind as string) || \"observation\",\n tags: (meta.tags as string[]) || [],\n sourceQuestionId: (meta.sourceQuestionId as string) || undefined,\n linkedBeliefId:\n (meta.linkedBeliefNodeId as string) ||\n (meta.linkedBeliefId as string) ||\n undefined,\n linkedWorktreeId,\n [LEGACY_SPRINT_LINK_KEY]:\n (meta[LEGACY_SPRINT_LINK_KEY] as string) || undefined,\n sprintIndex: (meta.sprintIndex as number) || undefined,\n externalSourceUrl: (meta.sourceUrl as string) || undefined,\n externalSourceType: (meta.externalSourceType as string) || undefined,\n };\n}\n\nexport function formatEvidenceNode(n: {\n _id: string;\n projectId: string;\n topicId?: string;\n canonicalText: string;\n sourceType: string;\n status: string;\n metadata?: unknown;\n createdBy: string;\n createdAt: number;\n updatedAt: number;\n}) {\n const metadata = (n.metadata || {}) as Record<string, unknown>;\n const linkedWorktreeId = resolveEvidenceLinkedWorktreeId(metadata);\n return {\n _id: n._id,\n _epistemicNodeId: n._id,\n _creationTime: n.createdAt,\n projectId: n.projectId,\n topicId: n.topicId,\n text: n.canonicalText,\n kind: metadata.kind || \"observation\",\n tags: (metadata.tags as string[]) || [],\n sourceType: n.sourceType,\n externalSourceType: metadata.externalSourceType,\n externalSourceUrl: metadata.sourceUrl,\n sourceArtifactId: metadata.sourceArtifactId,\n sourceQuestionId: metadata.sourceQuestionId,\n linkedWorktreeId,\n [LEGACY_SPRINT_LINK_KEY]:\n (metadata[LEGACY_SPRINT_LINK_KEY] as string) || undefined,\n sourceAnchor: metadata.sourceAnchor,\n aiProvider: metadata.aiProvider,\n verificationStatus: metadata.verificationStatus,\n status: n.status,\n createdBy: n.createdBy,\n createdAt: n.createdAt,\n updatedAt: n.updatedAt,\n };\n}\n","// biome-ignore-all lint/style/useFilenamingConvention: Public graph-primitives wildcard-export path; rename requires an export-map migration.\nimport {\n getLayerForNodeType,\n isNodeType,\n} from \"@lucern/contracts/schema-helpers/spine/tables/epistemicNodes\";\nimport type { MutationCtx, QueryCtx } from \"./convex\";\nimport { resolveTopicProjectScope, type TopicProjectScope } from \"./topicScope\";\n\ntype StructuredInvariantError = Error & {\n status: number;\n code: string;\n invariantCode?: string;\n suggestion?: string;\n details?: unknown;\n};\n\ninterface ScopeLike {\n epistemicLayer?: unknown;\n nodeType?: unknown;\n projectId?: unknown;\n publicationStatus?: unknown;\n tenantId?: unknown;\n topicId?: unknown;\n workspaceId?: unknown;\n}\n\nexport interface RuntimePackMutationContext {\n packInstallScope?: \"tenant\" | \"workspace\";\n packKey?: string;\n toolName?: string;\n}\n\nexport function 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 throwWorkspaceIsolationError(args: {\n message: string;\n invariantCode: string;\n suggestion: string;\n details?: unknown;\n}): never {\n const error = new Error(args.message) as StructuredInvariantError;\n error.status = 409;\n error.code = \"INVARIANT_VIOLATION\";\n error.invariantCode = args.invariantCode;\n error.suggestion = args.suggestion;\n error.details = args.details;\n throw error;\n}\n\nexport function assertWorkspaceScopedEpistemicNodeScope(args: {\n scope: TopicProjectScope;\n nodeType: string;\n mutationName: string;\n}): void {\n const layer = isNodeType(args.nodeType)\n ? getLayerForNodeType(args.nodeType)\n : undefined;\n if (layer === \"ontological\") {\n return;\n }\n\n const workspaceId = normalizeScopeValue(args.scope.workspaceId);\n if (workspaceId) {\n return;\n }\n\n throwWorkspaceIsolationError({\n message:\n \"Workspace-scoped reasoning isolation requires workspaceId on non-ontological node creation.\",\n invariantCode: \"workspace.scope_required_for_epistemic_nodes\",\n suggestion:\n \"Resolve the topic/project scope through a workspace-bound topic before creating epistemic nodes.\",\n details: {\n mutationName: args.mutationName,\n nodeType: args.nodeType,\n topicId: args.scope.topicId,\n projectId: args.scope.projectId,\n },\n });\n}\n\nexport function nodeMatchesWorkspaceReasoningScope(\n node: ScopeLike | null | undefined,\n scope: Pick<TopicProjectScope, \"tenantId\" | \"workspaceId\">\n): boolean {\n if (!node) {\n return false;\n }\n\n const scopeTenantId = normalizeScopeValue(scope.tenantId);\n const scopeWorkspaceId = normalizeScopeValue(scope.workspaceId);\n const nodeTenantId = normalizeScopeValue(node.tenantId);\n const nodeWorkspaceId = normalizeScopeValue(node.workspaceId);\n const epistemicLayer =\n typeof node.epistemicLayer === \"string\" ? node.epistemicLayer : undefined;\n\n if (scopeTenantId && nodeTenantId && scopeTenantId !== nodeTenantId) {\n return false;\n }\n\n // Ontological entities are tenant-global (no workspace required)\n if (epistemicLayer === \"ontological\" && nodeWorkspaceId === undefined) {\n return true;\n }\n\n // Published nodes are visible at tenant scope — the microservice API surface.\n // The node stays in its workspace, but tenant-scope queries can see it.\n if (!scopeWorkspaceId && node.publicationStatus === \"published\") {\n return true;\n }\n\n if (!scopeWorkspaceId) {\n return nodeWorkspaceId === undefined;\n }\n\n return scopeWorkspaceId === nodeWorkspaceId;\n}\n\nexport function edgeMatchesWorkspaceReasoningScope(\n edge: ScopeLike | null | undefined,\n scope: Pick<TopicProjectScope, \"tenantId\" | \"workspaceId\">\n): boolean {\n if (!edge) {\n return false;\n }\n\n const scopeTenantId = normalizeScopeValue(scope.tenantId);\n const scopeWorkspaceId = normalizeScopeValue(scope.workspaceId);\n const edgeTenantId = normalizeScopeValue(edge.tenantId);\n const edgeWorkspaceId = normalizeScopeValue(edge.workspaceId);\n\n if (scopeTenantId && edgeTenantId && scopeTenantId !== edgeTenantId) {\n return false;\n }\n\n if (!scopeWorkspaceId) {\n return edgeWorkspaceId === undefined;\n }\n\n return scopeWorkspaceId === edgeWorkspaceId;\n}\n\nexport async function resolveNodeScopeForWorkspaceIsolation(\n ctx: QueryCtx | MutationCtx,\n node: ScopeLike | null | undefined\n): Promise<{\n tenantId?: string;\n workspaceId?: string;\n epistemicLayer?: string;\n nodeType?: string;\n}> {\n const epistemicLayer =\n typeof node?.epistemicLayer === \"string\" ? node.epistemicLayer : undefined;\n const resolved = {\n tenantId: normalizeScopeValue(node?.tenantId),\n workspaceId: normalizeScopeValue(node?.workspaceId),\n epistemicLayer,\n nodeType: typeof node?.nodeType === \"string\" ? node.nodeType : undefined,\n };\n\n if (!node) {\n return resolved;\n }\n\n if (resolved.epistemicLayer === \"ontological\") {\n return resolved;\n }\n\n if (resolved.tenantId || resolved.workspaceId) {\n return resolved;\n }\n\n const topicId = normalizeScopeValue(node.topicId);\n if (topicId) {\n const topicScope = await resolveTopicProjectScope(ctx, {\n topicId,\n });\n return {\n ...resolved,\n tenantId: topicScope.tenantId,\n workspaceId: topicScope.workspaceId,\n };\n }\n\n if (node.projectId) {\n const topicScope = await resolveTopicProjectScope(ctx, {\n projectId: String(node.projectId),\n });\n return {\n ...resolved,\n tenantId: topicScope.tenantId,\n workspaceId: topicScope.workspaceId,\n };\n }\n\n return resolved;\n}\n\nexport function resolveRuntimePackMutationContext(args: {\n runtimeToolName?: string;\n runtimePackKey?: string;\n runtimePackInstallScope?: \"tenant\" | \"workspace\";\n}): RuntimePackMutationContext | undefined {\n if (\n !(\n args.runtimeToolName ||\n args.runtimePackKey ||\n args.runtimePackInstallScope\n )\n ) {\n return;\n }\n\n return {\n toolName: args.runtimeToolName,\n packKey: args.runtimePackKey,\n packInstallScope: args.runtimePackInstallScope,\n };\n}\n\nexport function assertTenantPackWorkspaceMutationAllowed(args: {\n runtime?: RuntimePackMutationContext;\n target: ScopeLike;\n mutationName: string;\n}): void {\n if (!args.runtime?.packKey || args.runtime.packInstallScope !== \"tenant\") {\n return;\n }\n\n const targetWorkspaceId = normalizeScopeValue(args.target.workspaceId);\n const targetLayer =\n typeof args.target.epistemicLayer === \"string\"\n ? args.target.epistemicLayer\n : undefined;\n\n if (!targetWorkspaceId || targetLayer === \"ontological\") {\n return;\n }\n\n throwWorkspaceIsolationError({\n message: `Tenant-scoped pack \"${args.runtime.packKey}\" cannot mutate workspace-scoped reasoning state.`,\n invariantCode: \"workspace.tenant_pack_reasoning_write_forbidden\",\n suggestion:\n \"Use a workspace-scoped pack for workspace-local graph mutations, or route the change through tenant-global canonical entity flows.\",\n details: {\n mutationName: args.mutationName,\n toolName: args.runtime.toolName,\n packKey: args.runtime.packKey,\n targetWorkspaceId,\n targetNodeType: args.target.nodeType,\n targetLayer,\n },\n });\n}\n","// biome-ignore-all lint/style/useFilenamingConvention: Public graph-primitives wildcard-export path; rename requires an export-map migration.\nimport { checkScopeAccess } from \"@lucern/access-control/access\";\nimport { canAudienceClassAccess } from \"@lucern/access-control/audience\";\nimport { listAudienceRegistryRows } from \"@lucern/access-control/audienceRegistry\";\nimport { permissiveReturn } from \"@lucern/contracts/schema-helpers/validators\";\nimport { v } from \"convex/values\";\nimport type { Id, QueryCtx } from \"./convex\";\nimport { internalQuery, query } from \"./convex\";\nimport { debugGraphPrimitiveFallback } from \"./debug\";\nimport {\n clampEvidenceLimit,\n createEvidenceAudienceResolver,\n type EvidenceNodeDoc,\n evidenceMatchesScope,\n flattenEvidenceNode,\n formatEvidenceNode,\n getEvidenceNodesForScope,\n optionalEvidenceScopeArgs,\n resolveEvidenceScopeOrNull,\n} from \"./epistemicEvidenceHelpers\";\nimport { resolveGraphPrimitivesAppResolvers } from \"./resolvers\";\nimport { resolveTopicProjectScope } from \"./topicScope\";\nimport { nodeMatchesWorkspaceReasoningScope } from \"./workspaceIsolation\";\n\ninterface IndexQuery {\n eq(field: string, value: unknown): IndexQuery;\n}\n\ninterface EvidenceScopeQueryArgs {\n projectId?: string;\n status?: string;\n tenantId?: string;\n topicId?: string;\n workspaceId?: string;\n}\n\ninterface GetByIdArgs {\n evidenceId?: string;\n insightId?: string;\n nodeId?: Id<\"epistemicNodes\">;\n}\n\ninterface GetByProjectArgs extends EvidenceScopeQueryArgs {\n limit?: number;\n userId?: string;\n}\n\ninterface GetByTopicArgs {\n limit?: number;\n status?: string;\n topicId: string;\n userId?: string;\n}\n\ninterface GetForBeliefArgs {\n beliefNodeId: Id<\"epistemicNodes\">;\n}\n\ninterface InternalGetByProjectArgs extends EvidenceScopeQueryArgs {\n audienceMode?: string;\n limit?: number;\n}\n\ninterface InternalGetByTopicArgs {\n audienceMode?: string;\n limit?: number;\n status?: string;\n topicId: string;\n}\n\ninterface GetByProjectSystemArgs extends EvidenceScopeQueryArgs {\n kind?: string;\n limit?: number;\n}\n\ninterface GetEvidenceBalanceArgs extends EvidenceScopeQueryArgs {\n userId: string;\n}\n\ninterface EvidenceNodeRow extends EvidenceNodeDoc {\n _id: Id<\"epistemicNodes\">;\n audienceLabel?: string;\n canonicalText: string;\n createdAt: number;\n createdBy: string;\n epistemicLayer?: string;\n exportClass?: string;\n globalId?: string;\n metadata?: Record<string, unknown>;\n nodeType: \"evidence\";\n policyTags?: string[];\n projectId?: string;\n sensitivityTier?: string;\n sourceType: string;\n status: string;\n tenantId?: string;\n title?: string;\n topicId?: Id<\"topics\"> | string;\n updatedAt: number;\n workspaceId?: string;\n}\n\ninterface EvidenceEdgeRow {\n _id: Id<\"epistemicEdges\">;\n edgeType: string;\n fromGlobalId?: string;\n fromLayer?: string;\n fromNodeId?: string;\n sourceGlobalId?: string;\n targetGlobalId?: string;\n toGlobalId?: string;\n toLayer?: string;\n toNodeId?: string;\n topicId?: string;\n weight?: number;\n}\n\nfunction readOptionalString(value: unknown): string | undefined {\n return typeof value === \"string\" && value.trim().length > 0\n ? value\n : undefined;\n}\n\nfunction readOptionalNumber(value: unknown): number | undefined {\n return typeof value === \"number\" && Number.isFinite(value)\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 readRecord(value: unknown): Record<string, unknown> | null {\n return value && typeof value === \"object\" && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : null;\n}\n\nfunction readOptionalStringArray(value: unknown): string[] | undefined {\n return Array.isArray(value) && value.every((item) => typeof item === \"string\")\n ? value\n : undefined;\n}\n\nfunction readEvidenceNodeRow(\n value: unknown,\n fallbackProjectId?: string\n): EvidenceNodeRow | null {\n const record = readRecord(value);\n if (!record) {\n return null;\n }\n\n const id = readConvexId<\"epistemicNodes\">(record._id);\n const canonicalText = readOptionalString(record.canonicalText);\n const createdAt = readOptionalNumber(record.createdAt);\n const createdBy = readOptionalString(record.createdBy);\n const nodeType = readOptionalString(record.nodeType);\n const sourceType = readOptionalString(record.sourceType);\n const status = readOptionalString(record.status);\n const updatedAt = readOptionalNumber(record.updatedAt);\n if (\n !(\n id &&\n canonicalText &&\n createdAt !== undefined &&\n createdBy &&\n nodeType === \"evidence\" &&\n sourceType &&\n status &&\n updatedAt !== undefined\n )\n ) {\n return null;\n }\n\n const metadata = readRecord(record.metadata) ?? undefined;\n const node: EvidenceNodeRow = {\n ...record,\n _id: id,\n canonicalText,\n createdAt,\n createdBy,\n nodeType: \"evidence\",\n sourceType,\n status,\n updatedAt,\n };\n\n const projectId =\n readOptionalString(record.projectId) ??\n readOptionalString(fallbackProjectId);\n if (projectId !== undefined) {\n node.projectId = projectId;\n }\n const topicId = readOptionalString(record.topicId);\n if (topicId !== undefined) {\n node.topicId = topicId;\n }\n const tenantId = readOptionalString(record.tenantId);\n if (tenantId !== undefined) {\n node.tenantId = tenantId;\n }\n const workspaceId = readOptionalString(record.workspaceId);\n if (workspaceId !== undefined) {\n node.workspaceId = workspaceId;\n }\n const globalId = readOptionalString(record.globalId);\n if (globalId !== undefined) {\n node.globalId = globalId;\n }\n const title = readOptionalString(record.title);\n if (title !== undefined) {\n node.title = title;\n }\n const audienceLabel = readOptionalString(record.audienceLabel);\n if (audienceLabel !== undefined) {\n node.audienceLabel = audienceLabel;\n }\n const epistemicLayer = readOptionalString(record.epistemicLayer);\n if (epistemicLayer !== undefined) {\n node.epistemicLayer = epistemicLayer;\n }\n const sensitivityTier = readOptionalString(record.sensitivityTier);\n if (sensitivityTier !== undefined) {\n node.sensitivityTier = sensitivityTier;\n }\n const exportClass = readOptionalString(record.exportClass);\n if (exportClass !== undefined) {\n node.exportClass = exportClass;\n }\n const policyTags = readOptionalStringArray(record.policyTags);\n if (policyTags !== undefined) {\n node.policyTags = policyTags;\n }\n if (metadata !== undefined) {\n node.metadata = metadata;\n }\n return node;\n}\n\nfunction readEvidenceNodeRows(\n values: readonly unknown[],\n fallbackProjectId?: string\n): EvidenceNodeRow[] {\n return values.flatMap((value) => {\n const node = readEvidenceNodeRow(value, fallbackProjectId);\n return node ? [node] : [];\n });\n}\n\nfunction dedupeEvidenceNodeRows(nodes: readonly EvidenceNodeRow[]) {\n const seen = new Set<string>();\n const deduped: EvidenceNodeRow[] = [];\n for (const node of nodes) {\n const id = String(node._id);\n if (seen.has(id)) {\n continue;\n }\n seen.add(id);\n deduped.push(node);\n }\n return deduped;\n}\n\nfunction readEvidenceEdgeRow(value: unknown): EvidenceEdgeRow | null {\n const record = readRecord(value);\n if (!record) {\n return null;\n }\n\n const id = readConvexId<\"epistemicEdges\">(record._id);\n const edgeType = readOptionalString(record.edgeType);\n if (!(id && edgeType)) {\n return null;\n }\n\n const edge: EvidenceEdgeRow = { _id: id, edgeType };\n const weight = readOptionalNumber(record.weight);\n if (weight !== undefined) {\n edge.weight = weight;\n }\n for (const field of [\n \"fromNodeId\",\n \"toNodeId\",\n \"sourceGlobalId\",\n \"targetGlobalId\",\n \"fromGlobalId\",\n \"toGlobalId\",\n \"fromLayer\",\n \"toLayer\",\n \"topicId\",\n ] as const) {\n const valueForField = readOptionalString(record[field]);\n if (valueForField !== undefined) {\n edge[field] = valueForField;\n }\n }\n return edge;\n}\n\nfunction readEvidenceEdgeRows(values: readonly unknown[]): EvidenceEdgeRow[] {\n return values.flatMap((value) => {\n const edge = readEvidenceEdgeRow(value);\n return edge ? [edge] : [];\n });\n}\n\nfunction dedupeEvidenceEdges(edges: readonly EvidenceEdgeRow[]) {\n const seen = new Set<string>();\n const deduped: EvidenceEdgeRow[] = [];\n for (const edge of edges) {\n const id = String(edge._id);\n if (seen.has(id)) {\n continue;\n }\n seen.add(id);\n deduped.push(edge);\n }\n return deduped;\n}\n\nfunction evidenceSourceRef(edge: EvidenceEdgeRow): string | undefined {\n return edge.sourceGlobalId ?? edge.fromGlobalId ?? edge.fromNodeId;\n}\n\nasync function resolveEvidenceNodeSoft(\n ctx: QueryCtx,\n nodeRef: string\n): Promise<EvidenceNodeRow | null> {\n const normalizedId =\n ctx.db.normalizeId?.(\"epistemicNodes\", nodeRef) ??\n readConvexId<\"epistemicNodes\">(nodeRef);\n\n if (normalizedId) {\n try {\n const direct = readEvidenceNodeRow(await ctx.db.get(normalizedId));\n if (direct) {\n return direct;\n }\n } catch (error) {\n debugGraphPrimitiveFallback(\n \"[epistemicEvidence] Direct evidence lookup failed\",\n { error, nodeRef }\n );\n }\n }\n\n return readEvidenceNodeRow(\n await ctx.db\n .query(\"epistemicNodes\")\n .withIndex(\"by_globalId\", (q: IndexQuery) => q.eq(\"globalId\", nodeRef))\n .first()\n );\n}\n\nasync function collectNodeReferenceIds(\n ctx: QueryCtx,\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 = readOptionalString(readRecord(node)?.globalId);\n if (globalId) {\n refs.add(globalId);\n }\n return [...refs];\n}\n\nasync function collectInformsEdgesToNode(\n ctx: QueryCtx,\n nodeId: Id<\"epistemicNodes\">\n): Promise<EvidenceEdgeRow[]> {\n const refs = await collectNodeReferenceIds(ctx, nodeId);\n const reads: Promise<unknown[]>[] = [];\n for (const ref of refs) {\n reads.push(\n ctx.db\n .query(\"epistemicEdges\")\n .withIndex(\"by_to_type\", (q: IndexQuery) =>\n q.eq(\"toNodeId\", ref).eq(\"edgeType\", \"informs\")\n )\n .collect(),\n ctx.db\n .query(\"epistemicEdges\")\n .withIndex(\"by_target_global_id\", (q: IndexQuery) =>\n q.eq(\"targetGlobalId\", ref)\n )\n .collect()\n );\n }\n\n const edges = readEvidenceEdgeRows((await Promise.all(reads)).flat()).filter(\n (edge) => edge.edgeType === \"informs\"\n );\n return dedupeEvidenceEdges(edges);\n}\n\nfunction hasProjectId(\n node: EvidenceNodeRow\n): node is EvidenceNodeRow & { projectId: string } {\n return typeof node.projectId === \"string\" && node.projectId.length > 0;\n}\n\nexport const getById = query({\n args: {\n nodeId: v.optional(v.id(\"epistemicNodes\")),\n insightId: v.optional(v.string()),\n evidenceId: v.optional(v.string()),\n },\n returns: permissiveReturn,\n handler: async (ctx, args: GetByIdArgs) => {\n const id = args.nodeId ?? args.insightId ?? args.evidenceId;\n if (!id) {\n return null;\n }\n return await resolveEvidenceNodeSoft(ctx, String(id));\n },\n});\n\nexport const getByProject = query({\n args: {\n ...optionalEvidenceScopeArgs,\n status: v.optional(v.string()),\n userId: v.optional(v.string()),\n limit: v.optional(v.number()),\n },\n returns: permissiveReturn,\n handler: async (ctx, args: GetByProjectArgs) => {\n if (!args.topicId) {\n return [];\n }\n\n const pageSize = clampEvidenceLimit(args.limit);\n const scanLimit = Math.min(pageSize * 3, 1000);\n let scope:\n | Awaited<ReturnType<typeof resolveTopicProjectScope>>\n | {\n tenantId: undefined;\n workspaceId: undefined;\n topicId?: undefined;\n projectId?: undefined;\n };\n try {\n scope = await resolveTopicProjectScope(ctx, {\n projectId: args.projectId,\n topicId: args.topicId,\n });\n } catch (error) {\n debugGraphPrimitiveFallback(\n \"[epistemicEvidence] Failed to resolve getByProject scope\",\n {\n error,\n projectId: args.projectId,\n topicId: args.topicId,\n }\n );\n return [];\n }\n\n if (args.userId) {\n const scopeId = scope.topicId ? String(scope.topicId) : undefined;\n if (!scopeId) {\n return [];\n }\n const hasAccess = await checkScopeAccess(ctx, scopeId, args.userId);\n if (!hasAccess) {\n return [];\n }\n }\n\n const topicNodes = await ctx.db\n .query(\"epistemicNodes\")\n .withIndex(\"by_topic_type\", (q: IndexQuery) =>\n q.eq(\"topicId\", scope.topicId).eq(\"nodeType\", \"evidence\")\n )\n .order(\"desc\")\n .take(scanLimit);\n\n const scopedNodes = dedupeEvidenceNodeRows(\n readEvidenceNodeRows(topicNodes, scope.projectId)\n ).filter((node) => evidenceMatchesScope(node, scope));\n\n const filteredNodes = args.status\n ? scopedNodes.filter((node) => node.status === args.status)\n : scopedNodes;\n\n return filteredNodes.map(flattenEvidenceNode).slice(0, pageSize);\n },\n});\n\nexport const getByTopic = query({\n args: {\n topicId: v.string(),\n status: v.optional(v.string()),\n userId: v.optional(v.string()),\n limit: v.optional(v.number()),\n },\n returns: permissiveReturn,\n handler: async (ctx, args: GetByTopicArgs) => {\n const pageSize = clampEvidenceLimit(args.limit);\n const scanLimit = Math.min(pageSize * 3, 1000);\n const scope = await resolveTopicProjectScope(ctx, {\n topicId: args.topicId,\n });\n const topicNodes = await ctx.db\n .query(\"epistemicNodes\")\n .withIndex(\"by_topic_type\", (q: IndexQuery) =>\n q.eq(\"topicId\", scope.topicId).eq(\"nodeType\", \"evidence\")\n )\n .order(\"desc\")\n .take(scanLimit);\n\n const scopedNodes = dedupeEvidenceNodeRows(\n readEvidenceNodeRows(topicNodes, scope.projectId)\n ).filter((node) => evidenceMatchesScope(node, scope));\n\n const filteredNodes = args.status\n ? scopedNodes.filter((node) => node.status === args.status)\n : scopedNodes;\n\n return filteredNodes.map(flattenEvidenceNode).slice(0, pageSize);\n },\n});\n\nexport const getForBelief = query({\n args: {\n beliefNodeId: v.id(\"epistemicNodes\"),\n },\n returns: permissiveReturn,\n handler: async (ctx, args: GetForBeliefArgs) => {\n const edges = await collectInformsEdgesToNode(ctx, args.beliefNodeId);\n const evidenceNodeIds = edges.flatMap((edge) => {\n const sourceRef = evidenceSourceRef(edge);\n return sourceRef ? [sourceRef] : [];\n });\n const evidenceNodes = await Promise.all(\n evidenceNodeIds.map((id) => resolveEvidenceNodeSoft(ctx, id))\n );\n\n return evidenceNodes.flatMap((e, i) => {\n const edge = edges[i];\n if (!(e && edge)) {\n return [];\n }\n const weight = edge.weight ?? 0;\n return [\n {\n ...e,\n relation: weight >= 0 ? \"supports\" : \"contradicts\",\n confidence: Math.abs(weight),\n edgeId: edge._id,\n },\n ];\n });\n },\n});\n\nexport const internalGetByProject = internalQuery({\n args: {\n ...optionalEvidenceScopeArgs,\n status: v.optional(v.string()),\n limit: v.optional(v.number()),\n audienceMode: v.optional(v.string()),\n },\n returns: permissiveReturn,\n handler: async (ctx, args: InternalGetByProjectArgs) => {\n const pageSize = clampEvidenceLimit(args.limit, 500);\n const scanLimit = Math.min(pageSize * 3, 1000);\n const scope = await resolveEvidenceScopeOrNull(ctx, args);\n if (!scope) {\n return [];\n }\n const audienceMode = args.audienceMode ?? \"internal\";\n const projectScopeId = scope.topicId ? String(scope.topicId) : undefined;\n if (!projectScopeId) {\n return [];\n }\n const project = await resolveGraphPrimitivesAppResolvers(ctx).getProject(\n ctx,\n projectScopeId\n );\n const tenantId = project?.tenantId;\n const workspaceId = project?.workspaceId;\n const registryRows = await listAudienceRegistryRows(ctx, {\n tenantId,\n workspaceId,\n });\n const resolveAudienceClass = createEvidenceAudienceResolver(registryRows);\n const viewerClass = resolveAudienceClass(audienceMode, \"public\");\n const nodes = readEvidenceNodeRows(\n await getEvidenceNodesForScope(ctx, scope, { scanLimit }),\n scope.projectId\n );\n const workspaceScopedNodes = nodes.filter((node) =>\n nodeMatchesWorkspaceReasoningScope(node, {\n tenantId,\n workspaceId,\n })\n );\n\n return workspaceScopedNodes\n .filter(\n (n) =>\n canAudienceClassAccess(\n viewerClass,\n resolveAudienceClass(n.audienceLabel, \"internal\")\n ) &&\n (!args.status || n.status === args.status)\n )\n .slice(0, pageSize)\n .map((n) => {\n const metadata = n.metadata || {};\n return {\n _id: n._id,\n _creationTime: n.createdAt,\n projectId: n.projectId,\n topicId: n.topicId,\n text: n.canonicalText,\n kind: metadata.kind || \"observation\",\n tags: metadata.tags || [],\n sourceType: n.sourceType,\n externalSourceType: metadata.externalSourceType,\n sourceUrl: metadata.sourceUrl,\n status: n.status,\n createdBy: n.createdBy,\n createdAt: n.createdAt,\n updatedAt: n.updatedAt,\n audienceLabel: n.audienceLabel,\n policyTags: n.policyTags,\n sensitivityTier: n.sensitivityTier,\n exportClass: n.exportClass,\n anonymizationClass: n.anonymizationClass,\n };\n });\n },\n});\n\nexport const internalGetByTopic = internalQuery({\n args: {\n topicId: v.string(),\n status: v.optional(v.string()),\n limit: v.optional(v.number()),\n audienceMode: v.optional(v.string()),\n },\n returns: permissiveReturn,\n handler: async (ctx, args: InternalGetByTopicArgs) => {\n const pageSize = clampEvidenceLimit(args.limit, 500);\n const scanLimit = Math.min(pageSize * 3, 1000);\n const audienceMode = args.audienceMode ?? \"internal\";\n const scope = await resolveTopicProjectScope(ctx, {\n topicId: args.topicId,\n });\n const registryRows = await listAudienceRegistryRows(ctx, {\n tenantId: scope.tenantId,\n workspaceId: scope.workspaceId,\n });\n const resolveAudienceClass = createEvidenceAudienceResolver(registryRows);\n const viewerClass = resolveAudienceClass(audienceMode, \"public\");\n\n const nodes = await ctx.db\n .query(\"epistemicNodes\")\n .withIndex(\"by_topic_type\", (q: IndexQuery) =>\n q.eq(\"topicId\", args.topicId).eq(\"nodeType\", \"evidence\")\n )\n .order(\"desc\")\n .take(scanLimit);\n const workspaceScopedNodes = readEvidenceNodeRows(\n nodes,\n scope.projectId\n ).filter((node) =>\n nodeMatchesWorkspaceReasoningScope(node, {\n tenantId: scope.tenantId,\n workspaceId: scope.workspaceId,\n })\n );\n\n return workspaceScopedNodes\n .filter(\n (n) =>\n canAudienceClassAccess(\n viewerClass,\n resolveAudienceClass(n.audienceLabel, \"internal\")\n ) &&\n (!args.status || n.status === args.status)\n )\n .slice(0, pageSize)\n .map((n) => {\n const metadata = n.metadata || {};\n return {\n _id: n._id,\n _creationTime: n.createdAt,\n projectId: n.projectId,\n topicId: n.topicId,\n text: n.canonicalText,\n kind: metadata.kind || \"observation\",\n tags: metadata.tags || [],\n sourceType: n.sourceType,\n externalSourceType: metadata.externalSourceType,\n sourceUrl: metadata.sourceUrl,\n status: n.status,\n createdBy: n.createdBy,\n createdAt: n.createdAt,\n updatedAt: n.updatedAt,\n audienceLabel: n.audienceLabel,\n policyTags: n.policyTags,\n sensitivityTier: n.sensitivityTier,\n exportClass: n.exportClass,\n anonymizationClass: n.anonymizationClass,\n };\n });\n },\n});\n\nexport const getByProjectSystem = query({\n args: {\n ...optionalEvidenceScopeArgs,\n kind: v.optional(v.string()),\n limit: v.optional(v.number()),\n },\n returns: permissiveReturn,\n handler: async (ctx, args: GetByProjectSystemArgs) => {\n const pageSize = clampEvidenceLimit(args.limit, 500);\n const scanLimit = Math.min(pageSize * 3, 1000);\n const scope = await resolveEvidenceScopeOrNull(ctx, args);\n if (!scope) {\n return [];\n }\n const nodes = readEvidenceNodeRows(\n await getEvidenceNodesForScope(ctx, scope, { scanLimit }),\n scope.projectId\n );\n\n const filtered = args.kind\n ? nodes.filter((n) => {\n const meta = n.metadata || {};\n return meta.kind === args.kind;\n })\n : nodes;\n\n filtered.sort((a, b) => b.createdAt - a.createdAt);\n return filtered\n .filter(hasProjectId)\n .slice(0, pageSize)\n .map((n) => formatEvidenceNode(n));\n },\n});\n\nexport const getEvidenceBalance = query({\n args: {\n ...optionalEvidenceScopeArgs,\n userId: v.string(),\n },\n returns: permissiveReturn,\n handler: async (ctx, args: GetEvidenceBalanceArgs) => {\n const scope = await resolveTopicProjectScope(ctx, {\n topicId: args.topicId,\n projectId: args.projectId,\n });\n const scopeId = scope.topicId ? String(scope.topicId) : undefined;\n if (!scopeId) {\n return { supporting: 0, challenging: 0, total: 0 };\n }\n const hasAccess = await checkScopeAccess(ctx, scopeId, args.userId);\n if (!hasAccess) {\n return { supporting: 0, challenging: 0, total: 0 };\n }\n\n const resolvedTopicId = scope.topicId;\n const edges = resolvedTopicId\n ? readEvidenceEdgeRows(\n await ctx.db\n .query(\"epistemicEdges\")\n .withIndex(\"by_topic\", (q: IndexQuery) =>\n q.eq(\"topicId\", resolvedTopicId)\n )\n .collect()\n )\n : [];\n\n const evidenceEdges = edges.filter(\n (e) =>\n e.edgeType === \"informs\" && e.fromLayer === \"L2\" && e.toLayer === \"L3\"\n );\n\n let supporting = 0;\n let challenging = 0;\n\n for (const edge of evidenceEdges) {\n const weight = edge.weight ?? 0;\n if (weight > 0) {\n supporting++;\n } else if (weight < 0) {\n challenging++;\n }\n }\n\n return { supporting, challenging, total: evidenceEdges.length };\n },\n});\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/convex.ts","../src/epistemicLayerRules.ts","../src/epistemicEdgeCreation.ts","../src/epistemicInsert.ts","../src/epistemicNodeCreation.ts","../src/graphTypes.ts"],"names":["readOptionalString","readRecord","readConvexId","contentHash","existing"],"mappings":"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","file":"epistemicHelpers.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 Spine helper module split from epistemicHelpers.ts.\n */\n\nimport type { Id } from \"./convex\";\n\n// =============================================================================\n// TYPE MAPPINGS\n// =============================================================================\n\n// =============================================================================\n// EPISTEMIC LAYER ARCHITECTURE (Lucern Invariant Compliance)\n// =============================================================================\n\n/**\n * Epistemic Layer - governs traversal rules\n * L4 → L3 → L2 → L1 (never skip layers)\n */\nexport type EpistemicLayer =\n | \"L4\"\n | \"L3\"\n | \"L2\"\n | \"L1\"\n | \"ontological\"\n | \"organizational\";\n\n/**\n * Map nodeType to its epistemic layer\n *\n * Layer semantics:\n * - L4: Audit targets (decisions, outcomes) - what we committed to\n * - L3: Traversal anchors (beliefs, questions, themes) - epistemic structure\n * - L2: Compression boundary (claims, evidence, synthesis) - minimum reasoning unit\n * - L1: Terminal leaves (atomic_fact, excerpt, source) - non-traversable grounding\n * - ontological: Entities in the world (companies, people) - not epistemic\n * - organizational: Structural containers (topics, lenses, worktrees) - not epistemic\n */\nexport function getNodeLayer(nodeType: string): EpistemicLayer {\n switch (nodeType) {\n // L4: Audit targets\n case \"decision\":\n return \"L4\";\n\n // L3: Traversal anchors\n case \"belief\":\n case \"question\":\n case \"theme\":\n case \"deal\":\n return \"L3\";\n\n // L2: Compression boundary\n case \"claim\":\n case \"evidence\":\n case \"synthesis\":\n case \"answer\":\n return \"L2\";\n\n // L1: Terminal leaves\n case \"atomic_fact\":\n case \"excerpt\":\n case \"source\":\n return \"L1\";\n\n // Ontological entities\n case \"company\":\n case \"person\":\n case \"investor\":\n case \"function\":\n case \"value_chain\":\n return \"ontological\";\n\n // Organizational containers\n case \"topic\":\n return \"organizational\";\n\n default:\n // Unknown types default to L2 (safest for traversal)\n console.warn(\n `[EpistemicLayer] Unknown nodeType: ${nodeType}, defaulting to L2`\n );\n return \"L2\";\n }\n}\n\n/**\n * Layer traversal rules\n * Key constraint: Cannot skip layers during traversal\n */\nexport const LAYER_TRAVERSAL_RULES = {\n L4: {\n canReach: [\"L3\", \"L4\"], // Decisions can reach beliefs/questions\n mustPassThrough: \"L3\", // Must go through L3 to reach L2\n },\n L3: {\n canReach: [\"L2\", \"L3\", \"L4\"], // Beliefs can reach evidence, other beliefs, or decisions\n mustPassThrough: \"L2\", // Must go through L2 to reach L1\n },\n L2: {\n canReach: [\"L1\", \"L2\", \"L3\"], // Evidence can reach sources, other evidence, or beliefs\n mustPassThrough: null, // L2 can reach L1 directly\n },\n L1: {\n canReach: [\"L1\"], // Sources can only reach other sources\n mustPassThrough: null, // Terminal - no traversal beyond\n },\n ontological: {\n canReach: [\"L3\", \"L2\", \"ontological\"], // Entities can link to epistemic structure\n mustPassThrough: null, // No layer constraints for entities\n },\n organizational: {\n canReach: [\"L3\", \"L2\", \"organizational\"], // Containers scope epistemic structure + nest\n mustPassThrough: null, // No layer constraints for containers\n },\n} as const;\n\n/**\n * Check if a direct edge between two layers is allowed\n */\nexport function isValidLayerConnection(\n fromLayer: EpistemicLayer,\n toLayer: EpistemicLayer\n): boolean {\n const rules = LAYER_TRAVERSAL_RULES[fromLayer];\n return (rules.canReach as readonly string[]).includes(toLayer);\n}\n\n/**\n * Get layer hierarchy number (for comparison)\n * Higher number = higher layer\n */\nexport function getLayerDepth(layer: EpistemicLayer): number {\n switch (layer) {\n case \"L4\":\n return 4;\n case \"L3\":\n return 3;\n case \"L2\":\n return 2;\n case \"L1\":\n return 1;\n case \"ontological\":\n return 0; // Ontological exists outside the epistemic hierarchy\n case \"organizational\":\n return 0; // Organizational exists outside the epistemic hierarchy\n default:\n return 2;\n }\n}\n\n/**\n * Check if we can traverse from one layer to another\n * (considering intermediate layers)\n */\nexport function canTraverseToLayer(\n fromLayer: EpistemicLayer,\n toLayer: EpistemicLayer\n): boolean {\n const fromDepth = getLayerDepth(fromLayer);\n const toDepth = getLayerDepth(toLayer);\n\n // Ontological/organizational layers are special - use explicit rules\n if (\n fromLayer === \"ontological\" ||\n toLayer === \"ontological\" ||\n fromLayer === \"organizational\" ||\n toLayer === \"organizational\"\n ) {\n return isValidLayerConnection(fromLayer, toLayer);\n }\n\n // Can always stay at same layer\n if (fromDepth === toDepth) {\n return true;\n }\n\n // Can go up (L1→L2→L3→L4) or down (L4→L3→L2→L1)\n // But must respect layer rules\n return isValidLayerConnection(fromLayer, toLayer);\n}\n\n// =============================================================================\n// PHASE 2D: LAYER-AWARE TRAVERSAL\n// =============================================================================\n\n/**\n * Traversal mode - determines how to traverse the graph\n *\n * anchor_down: Start at L3 belief, traverse to L2 evidence, stop at L1 sources\n * anchor_up: Start at L2 evidence, traverse to L3 beliefs it supports\n * same_layer: Traverse within a single layer (e.g., belief → belief)\n * decision_trace: Start at L4 decision, traverse to L3 beliefs it was based on\n */\nexport type TraversalMode =\n | \"anchor_down\"\n | \"anchor_up\"\n | \"same_layer\"\n | \"decision_trace\";\n\n/**\n * Traversal options for layer-aware queries\n */\nexport interface TraversalOptions {\n /** Edge types to follow (empty = all valid for mode) */\n allowedEdgeTypes?: string[];\n /** Maximum depth */\n maxDepth?: number;\n /** Maximum layer to reach */\n maxLayer?: number;\n /** Minimum layer to stop at (L1 = 1, L4 = 4) */\n minLayer?: number;\n /** Traversal mode */\n mode: TraversalMode;\n /** Starting node ID */\n startNodeId: Id<\"epistemicNodes\">;\n}\n\n/**\n * Check if traversal should continue based on layer constraints\n */\nexport function shouldContinueTraversal(\n currentLayer: EpistemicLayer,\n targetLayer: EpistemicLayer,\n options: {\n mode: TraversalMode;\n minLayer?: number;\n maxLayer?: number;\n }\n): boolean {\n const currentDepth = getLayerDepth(currentLayer);\n const targetDepth = getLayerDepth(targetLayer);\n\n // Check min/max layer constraints\n if (options.minLayer !== undefined && targetDepth < options.minLayer) {\n return false; // Would go below minimum layer\n }\n if (options.maxLayer !== undefined && targetDepth > options.maxLayer) {\n return false; // Would go above maximum layer\n }\n\n // Mode-specific rules\n switch (options.mode) {\n case \"anchor_down\":\n // Can only go down (L4→L3→L2→L1)\n return targetDepth <= currentDepth;\n\n case \"anchor_up\":\n // Can only go up (L1→L2→L3→L4)\n return targetDepth >= currentDepth;\n\n case \"same_layer\":\n // Must stay at same layer\n return targetDepth === currentDepth;\n\n case \"decision_trace\":\n // Decisions (L4) can trace to beliefs (L3), stop there\n return currentDepth === 4\n ? targetDepth === 3\n : targetDepth === currentDepth;\n\n default:\n return true;\n }\n}\n\n/**\n * Get default minLayer for a traversal mode\n */\nexport function getDefaultMinLayer(mode: TraversalMode): number {\n switch (mode) {\n case \"anchor_down\":\n return 1; // Can go all the way to L1 sources\n case \"anchor_up\":\n return 2; // Start at L2 evidence minimum\n case \"same_layer\":\n return 1; // No constraint\n case \"decision_trace\":\n return 3; // Stop at L3 beliefs (don't go to L2 evidence)\n default:\n return 1;\n }\n}\n\n/**\n * Get allowed edge types for a traversal mode\n */\nexport function getDefaultEdgeTypesForMode(mode: TraversalMode): string[] {\n switch (mode) {\n case \"anchor_down\":\n // From beliefs/questions down to evidence and sources\n return [\n \"informs\", // evidence → belief (traverse backwards)\n \"derived_from\", // evidence → source (provenance) + evidence → question\n ];\n case \"anchor_up\":\n // From evidence up to beliefs\n return [\"informs\", \"derived_from\"];\n case \"same_layer\":\n // Within-layer relationships\n return [\n // L3: Belief ↔ Belief\n \"depends_on\",\n \"supports\",\n \"contains\",\n // L3: Question ↔ Question\n \"prerequisite_for\",\n \"parallel_to\",\n // L2: Evidence ↔ Evidence\n \"corroborates\",\n \"extends\",\n \"same_source_as\",\n \"same_theme_as\",\n ];\n case \"decision_trace\":\n // From decisions to beliefs\n return [\"derived_from\", \"depends_on\", \"contains\"];\n default:\n return [];\n }\n}\n\n// =============================================================================\n// PHASE 2C: EDGE LAYER RULES\n// =============================================================================\n\n/**\n * Edge Layer Rules - defines valid layer combinations for each edge type\n *\n * Format: { from: [allowed source layers], to: [allowed target layers] }\n *\n * Key rules:\n * - L4 edges: Decision → L3 (beliefs, questions, themes)\n * - Cross-layer edges: L2 → L3 (evidence informs beliefs)\n * - Same-layer edges: L3 → L3, L2 → L2 (beliefs depend on beliefs)\n * - Downward edges: L2 → L1 (evidence extracted from source)\n * - Lifecycle edges: same layer only (supersedes)\n */\nexport const EDGE_LAYER_RULES: Record<\n string,\n { from: EpistemicLayer[]; to: EpistemicLayer[]; description: string }\n> = {\n // === L4 Decision Edges ===\n based_on_belief: {\n from: [\"L4\"],\n to: [\"L3\"],\n description: \"Decision → Belief (L4 → L3)\",\n },\n based_on_question: {\n from: [\"L4\"],\n to: [\"L3\"],\n description: \"Decision → Question (L4 → L3)\",\n },\n blocked_by_contradiction: {\n from: [\"L4\"],\n to: [\"L3\"],\n description: \"Decision → Contradiction (L4 → L3)\",\n },\n informed_by_theme: {\n from: [\"L4\"],\n to: [\"L3\"],\n description: \"Decision → Theme (L4 → L3)\",\n },\n\n // === Evidence Flow (L2 → L3, L2 → L1) ===\n derived_from: {\n from: [\"L2\", \"L3\", \"L4\"],\n to: [\"L1\", \"L2\", \"L3\"],\n description: \"A was produced from B (provenance chain)\",\n },\n answers: {\n from: [\"L2\"],\n to: [\"L3\"],\n description: \"Evidence → Question (L2 → L3)\",\n },\n responds_to: {\n from: [\"L2\"],\n to: [\"L3\"],\n description: \"Answer → Question (L2 → L3)\",\n },\n informs: {\n from: [\"L2\"],\n to: [\"L3\"],\n description: \"Evidence → Belief (L2 → L3)\",\n },\n qualifies: {\n from: [\"L2\"],\n to: [\"L3\"],\n description: \"Evidence → Belief (L2 → L3)\",\n },\n\n // === Question → Belief (L3 → L3) ===\n tests: {\n from: [\"L3\"],\n to: [\"L3\"],\n description: \"Question → Belief (L3 → L3)\",\n },\n explores: {\n from: [\"L3\"],\n to: [\"L3\"],\n description: \"Question → Belief assumption (L3 → L3)\",\n },\n\n // === Synthesis (L2 → L2, L2 → L1) ===\n based_on: {\n from: [\"L2\"],\n to: [\"L2\", \"L1\"],\n description: \"Synthesis → Evidence/Source (L2 → L2/L1)\",\n },\n\n // === Theme Relationships (L3 → L3) ===\n relates_to_thesis: {\n from: [\"L3\"],\n to: [\"L3\"],\n description: \"Belief → Theme (L3 → L3)\",\n },\n belongs_to: {\n from: [\"L3\", \"L2\"], // Can belong to theme from L3 or L2\n to: [\"L3\"],\n description: \"Any → Theme (L3/L2 → L3)\",\n },\n plays_theme: {\n from: [\"L3\"],\n to: [\"L3\"],\n description: \"Deal → Theme (L3 → L3)\",\n },\n\n // === Topic Hierarchy (L3 → organizational) ===\n scoped_by: {\n from: [\"L3\"],\n to: [\"organizational\"],\n description: \"Belief/Question → Topic (L3 → organizational)\",\n },\n\n // === Deal/Company ===\n evaluates: {\n from: [\"L3\"],\n to: [\"ontological\"],\n description: \"Deal → Company (L3 → ontological)\",\n },\n\n // === People (ontological → ontological, ontological → L3) ===\n perspective_on: {\n from: [\"ontological\"],\n to: [\"L3\"],\n description: \"Person → Belief/Theme (ontological → L3)\",\n },\n works_at: {\n from: [\"ontological\"],\n to: [\"ontological\"],\n description: \"Person → Company (ontological → ontological)\",\n },\n\n // === Value Chain (ontological) ===\n participates_in: {\n from: [\"ontological\"],\n to: [\"ontological\"],\n description: \"Company → ValueChain (ontological → ontological)\",\n },\n performs: {\n from: [\"ontological\"],\n to: [\"ontological\"],\n description: \"Company → Function (ontological → ontological)\",\n },\n function_in: {\n from: [\"ontological\"],\n to: [\"ontological\"],\n description: \"Function → ValueChain (ontological → ontological)\",\n },\n impacts: {\n from: [\"L3\"],\n to: [\"ontological\"],\n description: \"Theme → ValueChain (L3 → ontological)\",\n },\n\n // === Investment (ontological) ===\n invested_in: {\n from: [\"ontological\"],\n to: [\"ontological\"],\n description: \"Investor → Company (ontological → ontological)\",\n },\n raised_from: {\n from: [\"ontological\"],\n to: [\"ontological\"],\n description: \"Company → Investor (ontological → ontological)\",\n },\n\n // === Entity↔Belief Bridge (OE-B) ===\n about_entity: {\n from: [\"L3\"],\n to: [\"ontological\"],\n description: \"Belief/Question/Theme → Entity (L3 → ontological)\",\n },\n entity_referenced_in: {\n from: [\"ontological\"],\n to: [\"L2\"],\n description: \"Entity → Evidence (ontological → L2)\",\n },\n mentioned_in: {\n from: [\"ontological\"],\n to: [\"L1\"],\n description: \"Entity → Source document (ontological → L1)\",\n },\n founded_by: {\n from: [\"ontological\"],\n to: [\"ontological\"],\n description: \"Company → Person (ontological → ontological)\",\n },\n competes_with: {\n from: [\"ontological\"],\n to: [\"ontological\"],\n description: \"Company → Company (ontological → ontological)\",\n },\n contains: {\n from: [\"ontological\"],\n to: [\"ontological\"],\n description: \"ValueChain → Function (ontological → ontological)\",\n },\n\n // === Lifecycle (same layer only) ===\n supersedes: {\n from: [\"L4\", \"L3\", \"L2\", \"L1\", \"ontological\", \"organizational\"],\n to: [\"L4\", \"L3\", \"L2\", \"L1\", \"ontological\", \"organizational\"],\n description: \"NewNode → OldNode (same layer only - validated separately)\",\n },\n same_as: {\n from: [\"L4\", \"L3\", \"L2\", \"L1\", \"ontological\", \"organizational\"],\n to: [\"L4\", \"L3\", \"L2\", \"L1\", \"ontological\", \"organizational\"],\n description: \"Duplicate detection (same layer only - validated separately)\",\n },\n\n // === Same-Type: Belief ↔ Belief (L3 → L3) ===\n depends_on: {\n from: [\"L3\"],\n to: [\"L3\"],\n description: \"Belief B requires Belief A (L3 → L3)\",\n },\n reinforces: {\n from: [\"L3\"],\n to: [\"L3\"],\n description: \"Beliefs strengthen each other (L3 → L3)\",\n },\n parent_of: {\n from: [\"L3\", \"organizational\"],\n to: [\"L3\", \"organizational\"],\n description:\n \"A is higher-level than B (L3 → L3, organizational → organizational)\",\n },\n child_of: {\n from: [\"L3\"],\n to: [\"L3\"],\n description: \"Belief A is more specific (L3 → L3)\",\n },\n\n // === Same-Type: Question ↔ Question (L3 → L3) ===\n prerequisite_for: {\n from: [\"L3\"],\n to: [\"L3\"],\n description: \"Question A must be answered first (L3 → L3)\",\n },\n parallel_to: {\n from: [\"L3\"],\n to: [\"L3\"],\n description: \"Same topic, different angles (L3 → L3)\",\n },\n\n // === Same-Type: Evidence ↔ Evidence (L2 → L2) ===\n corroborates: {\n from: [\"L2\"],\n to: [\"L2\"],\n description: \"Independent support (L2 → L2)\",\n },\n extends: {\n from: [\"L2\"],\n to: [\"L2\"],\n description: \"Adds depth (L2 → L2)\",\n },\n same_source_as: {\n from: [\"L2\"],\n to: [\"L2\"],\n description: \"Same document/study (L2 → L2)\",\n },\n same_theme_as: {\n from: [\"L2\"],\n to: [\"L2\"],\n description: \"Same topic/entity (L2 → L2)\",\n },\n\n // === NEW: Deep Epistemic Analysis Edges (Phase: Schema Upgrade) ===\n assumes: {\n from: [\"L3\"],\n to: [\"L3\"],\n description:\n \"Hidden dependency - Belief B implicitly assumes Belief A (L3 → L3)\",\n },\n would_predict: {\n from: [\"L3\"],\n to: [\"L2\"],\n description:\n \"Pre-registered prediction - If Belief true, expect Evidence (L3 → L2)\",\n },\n analogous_to: {\n from: [\"L3\"],\n to: [\"L3\"],\n description: \"Explicit analogy - Belief A is like Belief B (L3 → L3)\",\n },\n independent_of: {\n from: [\"L2\"],\n to: [\"L2\"],\n description:\n \"True evidence independence - Evidence A independent of B (L2 → L2)\",\n },\n\n // NOTE: Deprecated edge types (supports, contradicts, derived_from, cites,\n // summarizes, related_to, partially_answers, blocks, refines, branches_from)\n // have been REMOVED from the system. Use compliant alternatives instead.\n};\n\n/**\n * Validate an edge against layer rules\n *\n * Returns { valid: true } or { valid: false, reason: string }\n */\nexport function validateEdgeLayers(\n edgeType: string,\n fromLayer: EpistemicLayer,\n toLayer: EpistemicLayer\n): { valid: boolean; reason?: string } {\n const rules = EDGE_LAYER_RULES[edgeType];\n\n // Unknown edge type - allow but warn\n if (!rules) {\n console.warn(\n `[EdgeValidation] Unknown edge type: ${edgeType}, allowing by default`\n );\n return { valid: true };\n }\n\n // Special handling for same-layer edges (supersedes)\n if (edgeType === \"supersedes\") {\n if (fromLayer !== toLayer) {\n return {\n valid: false,\n reason: `${edgeType} edges must be between nodes of the same layer. Got ${fromLayer} → ${toLayer}`,\n };\n }\n return { valid: true };\n }\n\n // Check from layer\n if (!rules.from.includes(fromLayer)) {\n return {\n valid: false,\n reason: `Edge type '${edgeType}' does not allow source layer ${fromLayer}. Allowed: ${rules.from.join(\", \")}`,\n };\n }\n\n // Check to layer\n if (!rules.to.includes(toLayer)) {\n return {\n valid: false,\n reason: `Edge type '${edgeType}' does not allow target layer ${toLayer}. Allowed: ${rules.to.join(\", \")}`,\n };\n }\n\n return { valid: true };\n}\n","// biome-ignore-all lint/style/useFilenamingConvention: Public graph-primitives wildcard-export path; rename requires an export-map migration.\n/**\n * Epistemic Spine helper module split from epistemicHelpers.ts.\n */\n\nimport type { Id, MutationCtx } from \"./convex\";\nimport { internal } from \"./convex\";\nimport {\n type EpistemicLayer,\n getNodeLayer,\n validateEdgeLayers,\n} from \"./epistemicLayerRules\";\nimport { generateGlobalId } from \"./globalId\";\n\ninterface NodeTypeIndexQuery {\n eq(field: string, value: unknown): NodeTypeIndexQuery;\n}\n\ntype LegacyNodeType = \"insight\" | \"belief\" | \"question\" | \"artifact\";\ninterface EdgeNodeRow {\n _id: Id<\"epistemicNodes\">;\n epistemicLayer?: EpistemicLayer;\n globalId: string;\n metadata?: Record<string, unknown>;\n nodeType: string;\n projectId?: string;\n}\n\nconst EPISTEMIC_LAYERS = new Set<EpistemicLayer>([\n \"L4\",\n \"L3\",\n \"L2\",\n \"L1\",\n \"ontological\",\n \"organizational\",\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 readEpistemicLayer(value: unknown): EpistemicLayer | undefined {\n const layer = readOptionalString(value);\n return layer && EPISTEMIC_LAYERS.has(layer as EpistemicLayer)\n ? (layer as EpistemicLayer)\n : undefined;\n}\n\nfunction readRecord(value: unknown): Record<string, unknown> | undefined {\n return value && typeof value === \"object\" && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : undefined;\n}\n\nfunction readEdgeNodeRow(value: unknown): EdgeNodeRow | null {\n const record = readRecord(value);\n if (!record) {\n return null;\n }\n\n const id = readConvexId<\"epistemicNodes\">(record._id);\n const globalId = readOptionalString(record.globalId);\n const nodeType = readOptionalString(record.nodeType);\n if (!(id && globalId && nodeType)) {\n return null;\n }\n\n const node: EdgeNodeRow = { _id: id, globalId, nodeType };\n const epistemicLayer = readEpistemicLayer(record.epistemicLayer);\n if (epistemicLayer !== undefined) {\n node.epistemicLayer = epistemicLayer;\n }\n const metadata = readRecord(record.metadata);\n if (metadata !== undefined) {\n node.metadata = metadata;\n }\n const projectId = readOptionalString(record.projectId);\n if (projectId !== undefined) {\n node.projectId = projectId;\n }\n return node;\n}\n\nfunction requireEdgeNodeRow(value: unknown, context: string): EdgeNodeRow {\n const node = readEdgeNodeRow(value);\n if (!node) {\n throw new Error(`${context} requires a canonical epistemic node row.`);\n }\n return node;\n}\n\n/**\n * Edge type union for createEpistemicEdge\n * Phase 2C: Updated to include L4 edges and modern edge types\n * Phase 3: Added full epistemic impact edges for confidence propagation\n */\ntype EpistemicEdgeType =\n // Canonical edge types (K-tier compliant)\n | \"derived_from\" // replaces: answers, extracted_from, based_on, same_as, based_on_belief, based_on_question\n | \"supports\" // replaces: reinforces, strengthened_by, validated_by, weakened_by, alternative_to, falsified_by, exclusive_with (with appropriate weight)\n | \"contains\" // replaces: parent_of, child_of, about_entity, entity_referenced_in, subsumes, informed_by_theme\n | \"depends_on\" // replaces: collapses_if, cascade_from, required_for, blocks, blocked_by_contradiction\n | \"informs\"\n | \"tests\" // replaces: explores\n | \"responds_to\"\n // Theme relationships\n | \"relates_to_thesis\"\n | \"belongs_to\"\n | \"plays_theme\"\n // Lifecycle\n | \"supersedes\"\n // Same-type: Belief - Cluster Mapping (Thesis Validation Sprints)\n | \"counterfactual_of\"\n | \"cascade_to\"\n | \"mutually_exclusive\"\n | \"correlates_with\"\n | \"amplifies\"\n | \"precondition_for\"\n | \"in_tension_with\"\n // Same-type: Belief - Deep Epistemic Analysis (Tier 2)\n | \"assumes\"\n | \"would_predict\"\n | \"analogous_to\"\n | \"independent_of\"\n // Same-type: Question\n | \"prerequisite_for\"\n | \"parallel_to\"\n // Same-type: Evidence\n | \"corroborates\"\n | \"extends\"\n | \"same_source_as\"\n | \"same_theme_as\"\n // Ontological\n | \"evaluates\"\n | \"perspective_on\"\n | \"works_at\"\n | \"participates_in\"\n | \"performs\"\n | \"function_in\"\n | \"impacts\"\n | \"invested_in\"\n | \"raised_from\"\n // People/Entity References\n | \"mentioned_in\"\n | \"founded_by\"\n | \"competes_with\";\n\n// NOTE: Deprecated edge types have been REMOVED from this type.\n// See schema.ts for the list of removed types and their compliant alternatives.\n\n// =============================================================================\n// CONFIDENCE NORMALIZATION\n// =============================================================================\n\n/**\n * Normalize confidence to a 0-1 number regardless of input format.\n *\n * Handles:\n * - number (0-1): returned as-is\n * - number (1-100): divided by 100\n * - string (\"high\"/\"medium\"/\"low\"): mapped to 0.8/0.5/0.3\n * - undefined/null/other: returns 0.5 default\n *\n * This is the canonical way to read confidence from any source.\n */\nexport function normalizeConfidence(confidence: unknown): number {\n if (typeof confidence === \"number\") {\n return confidence > 1 ? confidence / 100 : confidence;\n }\n if (typeof confidence === \"string\") {\n switch (confidence) {\n case \"high\":\n return 0.8;\n case \"medium\":\n return 0.5;\n case \"low\":\n return 0.3;\n default:\n return 0.5;\n }\n }\n return 0.5;\n}\n\n/**\n * Epistemic Edge Propagation Semantics\n *\n * Each edge type has specific propagation rules for confidence cascades:\n *\n * | Edge Type | Direction | Propagation Rule |\n * |-------------------|--------------|-----------------------------------------------------------|\n * | depends_on | B → A | A.conf = min(A.conf, B.conf + 0.2) |\n * | reinforces | A ↔ B | Both get boost when either validated |\n * | falsified_by | B → A | A.conf = 1 - B.conf (inverse) |\n * | exclusive_with | A ↔ B | A.conf + B.conf ≤ 1.0 (redistribute on evidence) |\n * | contradicts | A ↔ B | Creates tension - neither can be validated without fork |\n * | collapses_if | A → B | If A.conf < threshold, B.conf → 0 |\n * | cascade_from | A → B | B.conf_delta = A.conf_delta * damping_factor |\n * | strengthened_by | A → B | B.conf += A.conf_delta * correlation |\n * | weakened_by | A → B | B.conf -= A.conf_delta * correlation |\n * | alternative_to | A ↔ B | Evidence for A reduces B, and vice versa |\n * | subsumes | A → B | A.conf >= B.conf always |\n * | validated_by | A → B | If A validated, B gains confidence |\n * | required_for | A → B | B cannot be validated until A is validated |\n * | blocks | A → B | B resolution blocked until A resolved |\n */\n\n/**\n * Create an epistemic edge between two nodes\n *\n * Phase 1 (Graph Architecture): Writes to Neo4j directly - Neo4j is source of truth.\n * Returns globalId (string) instead of Convex edge ID.\n *\n * Phase 2C: Validates layer rules before creation\n */\nexport async function createEpistemicEdge(\n ctx: MutationCtx,\n params: {\n fromNodeId: Id<\"epistemicNodes\">;\n toNodeId: Id<\"epistemicNodes\">;\n edgeType: EpistemicEdgeType;\n weight?: number;\n confidence?: number;\n context?: string;\n // NOTE: 'relation' field has been removed. Use 'weight' instead.\n projectId?: string;\n createdBy: string;\n // Phase 2C: Allow skipping validation for migrations\n skipLayerValidation?: boolean;\n }\n): Promise<string> {\n const globalId = generateGlobalId();\n\n // Get node types for denormalization\n const fromNode = requireEdgeNodeRow(\n await ctx.db.get(params.fromNodeId),\n \"Create epistemic edge source\"\n );\n const toNode = requireEdgeNodeRow(\n await ctx.db.get(params.toNodeId),\n \"Create epistemic edge target\"\n );\n\n // Phase 2C: Get layers (use stored or derive from nodeType)\n const fromLayer = fromNode.epistemicLayer ?? getNodeLayer(fromNode.nodeType);\n const toLayer = toNode.epistemicLayer ?? getNodeLayer(toNode.nodeType);\n\n // Phase 2C: Validate layer rules\n if (!params.skipLayerValidation) {\n const validation = validateEdgeLayers(params.edgeType, fromLayer, toLayer);\n if (!validation.valid) {\n throw new Error(\n `[EdgeValidation] Invalid edge: ${validation.reason}. ` +\n `Attempted: ${params.edgeType} from ${fromNode.nodeType}(${fromLayer}) → ${toNode.nodeType}(${toLayer})`\n );\n }\n }\n\n // Phase 1 (Graph Architecture): Write to Neo4j directly - Neo4j is source of truth\n await ctx.scheduler.runAfter(0, internal.neo4jEdgeAPI.createEdge, {\n globalId,\n fromGlobalId: fromNode.globalId,\n toGlobalId: toNode.globalId,\n edgeType: params.edgeType,\n weight: params.weight,\n confidence: params.confidence,\n context: params.context,\n createdBy: params.createdBy,\n topicId: params.projectId ? String(params.projectId) : undefined,\n fromNodeType: fromNode.nodeType,\n toNodeType: toNode.nodeType,\n fromLayer,\n toLayer,\n });\n\n return globalId;\n}\n\n/**\n * Create an edge when linking an insight to a question\n * This creates a \"derived_from\" edge (evidence answers/informs question)\n */\nexport async function createEdgeForInsightQuestionLink(\n ctx: MutationCtx,\n questionId: Id<\"epistemicNodes\">,\n insightId: Id<\"epistemicNodes\">,\n createdBy: string\n): Promise<string | null> {\n console.log(\"[EpistemicSpine] Creating edge for insight-question link:\", {\n questionId: String(questionId),\n insightId: String(insightId),\n });\n\n // Find the epistemic nodes for both entities\n const questionNode = await findNodeByLegacyId(ctx, \"question\", questionId);\n const insightNode = await findNodeByLegacyId(ctx, \"insight\", insightId);\n\n console.log(\"[EpistemicSpine] Found nodes:\", {\n questionNode: questionNode ? String(questionNode) : null,\n insightNode: insightNode ? String(insightNode) : null,\n });\n\n if (!(questionNode && insightNode)) {\n // Nodes don't exist yet - this can happen for legacy data\n // They'll be created during backfill\n console.log(\"[EpistemicSpine] Missing nodes, skipping edge creation\");\n return null;\n }\n\n // Get the question for projectId\n const question = readEdgeNodeRow(await ctx.db.get(questionId));\n const projectId = question?.projectId;\n\n // Create the edge: Evidence -> Question\n // Use \"derived_from\" - canonical replacement for \"answers\" edge type\n return await createEpistemicEdge(ctx, {\n fromNodeId: insightNode,\n toNodeId: questionNode,\n edgeType: \"derived_from\",\n projectId,\n createdBy,\n context: \"Linked from questions workspace\",\n });\n}\n\n/**\n * Find an epistemic node by its legacy ID (stored in metadata)\n */\nasync function findNodeByLegacyId(\n ctx: MutationCtx,\n legacyType: LegacyNodeType,\n legacyId: Id<\"epistemicNodes\"> | Id<\"finalArtifacts\">\n): Promise<Id<\"epistemicNodes\"> | null> {\n // Query all nodes and find the one with matching legacy ID\n // This is not ideal for performance, but works for now\n // TODO: Add a dedicated index for legacy IDs\n const nodeType = normalizeLegacyNodeType(legacyType);\n\n const nodes = await ctx.db\n .query(\"epistemicNodes\")\n .withIndex(\"by_nodeType\", (q: NodeTypeIndexQuery) =>\n q.eq(\"nodeType\", nodeType)\n )\n .collect();\n\n const legacyKey = `legacy${legacyType.charAt(0).toUpperCase() + legacyType.slice(1)}Id`;\n\n // Convert legacyId to string for comparison (Convex Id objects need string comparison)\n const legacyIdStr = String(legacyId);\n\n const found = nodes.find((candidate) => {\n const node = readEdgeNodeRow(candidate);\n const storedId = node?.metadata?.[legacyKey];\n // Compare as strings to handle Convex Id serialization\n return storedId && String(storedId) === legacyIdStr;\n });\n\n if (!found) {\n console.log(\n `[EpistemicSpine] Node not found for ${legacyType}:${legacyIdStr}, searched ${nodes.length} ${nodeType} nodes`\n );\n }\n\n return readEdgeNodeRow(found)?._id ?? null;\n}\n\nfunction normalizeLegacyNodeType(\n legacyType: LegacyNodeType\n): \"evidence\" | \"source\" | \"belief\" | \"question\" {\n if (legacyType === \"insight\") {\n return \"evidence\";\n }\n if (legacyType === \"artifact\") {\n return \"source\";\n }\n return legacyType;\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 ABI filename consumed by existing import paths.\n/**\n * Epistemic Spine helper module split from epistemicHelpers.ts.\n */\n\nimport type { Id, MutationCtx } from \"./convex\";\nimport { createEpistemicEdge } from \"./epistemicEdgeCreation\";\nimport { insertEpistemicNode } from \"./epistemicInsert.js\";\nimport { generateGlobalId } from \"./globalId\";\n\n// =============================================================================\n// CONTENT HASHING (Convex-compatible sync version)\n// =============================================================================\n\n/**\n * Generate a simple content hash for deduplication\n * Uses a basic hash since crypto.subtle isn't available in Convex runtime\n */\nfunction generateContentHash(nodeType: string, text: string): string {\n const content = `${nodeType}:${normalizeText(text)}`;\n\n // Simple hash function (djb2)\n let hash = 5381;\n for (let i = 0; i < content.length; i++) {\n const nextHash = hash * 33 + content.charCodeAt(i);\n hash = nextHash - Math.floor(nextHash / 4_294_967_296) * 4_294_967_296;\n if (hash >= 2_147_483_648) {\n hash -= 4_294_967_296;\n }\n }\n\n // Convert to hex string and pad to consistent length\n const hashHex = Math.abs(hash).toString(16).padStart(8, \"0\");\n // Add length and checksum for better uniqueness\n const lengthHex = content.length.toString(16).padStart(4, \"0\");\n const checksum = content\n .split(\"\")\n .reduce((a, c) => a + c.charCodeAt(0), 0)\n .toString(16)\n .padStart(8, \"0\");\n\n return `${hashHex}${lengthHex}${checksum}`;\n}\n\n/**\n * Normalize text for consistent hashing\n */\nfunction normalizeText(text: string): string {\n return text.trim().toLowerCase().replace(/\\s+/g, \" \");\n}\n\ntype EpistemicNodeType =\n | \"claim\"\n | \"evidence\"\n | \"synthesis\"\n | \"answer\"\n | \"atomic_fact\"\n | \"excerpt\"\n | \"source\";\n\ntype EpistemicSourceType =\n | \"human\"\n | \"ai_extracted\"\n | \"ai_generated\"\n | \"imported\";\ntype EpistemicVerificationStatus =\n | \"unverified\"\n | \"human_verified\"\n | \"ai_verified\"\n | \"contradicted\"\n | \"outdated\";\n\ninterface ExistingEpistemicNodeRow {\n _id: Id<\"epistemicNodes\">;\n metadata?: Record<string, unknown>;\n projectId?: string;\n status?: string;\n}\n\ninterface SourceArtifactRow {\n content?: string;\n metadata?: Record<string, unknown>;\n projectId?: string;\n stage?: string;\n topicId?: string;\n}\n\nfunction readOptionalString(value: unknown): string | undefined {\n return typeof value === \"string\" && value.trim().length > 0\n ? value\n : undefined;\n}\n\nfunction readOptionalBoolean(value: unknown): boolean | undefined {\n return typeof value === \"boolean\" ? value : undefined;\n}\n\nfunction readRecord(value: unknown): Record<string, unknown> | null {\n return value && typeof value === \"object\" && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : null;\n}\n\nfunction readConvexId<TableName extends string>(\n value: unknown\n): Id<TableName> | null {\n const normalized = readOptionalString(value);\n return normalized ? (normalized as Id<TableName>) : null;\n}\n\nfunction readExistingEpistemicNodeRow(\n value: unknown\n): ExistingEpistemicNodeRow | null {\n const record = readRecord(value);\n if (!record) {\n return null;\n }\n\n const id = readConvexId<\"epistemicNodes\">(record._id);\n if (!id) {\n return null;\n }\n\n const node: ExistingEpistemicNodeRow = { _id: id };\n const metadata = readRecord(record.metadata);\n if (metadata) {\n node.metadata = metadata;\n }\n const projectId = readOptionalString(record.projectId);\n if (projectId !== undefined) {\n node.projectId = projectId;\n }\n const status = readOptionalString(record.status);\n if (status !== undefined) {\n node.status = status;\n }\n return node;\n}\n\nfunction readSourceArtifactRow(value: unknown): SourceArtifactRow | null {\n const record = readRecord(value);\n if (!record) {\n return null;\n }\n\n const artifact: SourceArtifactRow = {};\n const content = readOptionalString(record.content);\n if (content !== undefined) {\n artifact.content = content;\n }\n const metadata = readRecord(record.metadata);\n if (metadata) {\n artifact.metadata = metadata;\n }\n const projectId = readOptionalString(record.projectId);\n if (projectId !== undefined) {\n artifact.projectId = projectId;\n }\n const stage = readOptionalString(record.stage);\n if (stage !== undefined) {\n artifact.stage = stage;\n }\n const topicId = readOptionalString(record.topicId);\n if (topicId !== undefined) {\n artifact.topicId = topicId;\n }\n return artifact;\n}\n\n/**\n * Map legacy insight sourceType to epistemic sourceType\n */\nfunction mapInsightSourceType(sourceType?: string): EpistemicSourceType {\n switch (sourceType) {\n case \"verified\":\n case \"proprietary\":\n return \"human\";\n case \"ai_generated\":\n return \"ai_generated\";\n default:\n return \"human\";\n }\n}\n\n/**\n * Map legacy verification status to epistemic verification status\n */\nfunction mapVerificationStatus(status?: string): EpistemicVerificationStatus {\n switch (status) {\n case \"manually_verified\":\n return \"human_verified\";\n case \"deep_verified\":\n case \"pre_screened\":\n return \"ai_verified\";\n default:\n return \"unverified\";\n }\n}\n\nfunction inferInsightConfidence(verificationStatus?: string): number {\n if (verificationStatus === \"manually_verified\") {\n return 0.9;\n }\n if (verificationStatus === \"deep_verified\") {\n return 0.7;\n }\n if (verificationStatus === \"pre_screened\") {\n return 0.5;\n }\n return 0.3;\n}\n\nfunction mapQuestionSourceType(source: string): EpistemicSourceType {\n if (source === \"manual\") {\n return \"human\";\n }\n if (source === \"ai_suggested\") {\n return \"ai_generated\";\n }\n return \"ai_extracted\";\n}\n\n// =============================================================================\n// DUAL-WRITE FUNCTIONS\n// =============================================================================\n\n/**\n * Create an epistemic node for an insight (evidence)\n * Called after inserting into the insights table\n */\nexport async function createEpistemicNodeForInsight(\n ctx: MutationCtx,\n _insightId: Id<\"epistemicNodes\">,\n insight: {\n projectId: string;\n text: string;\n kind: string;\n tags?: string[];\n sourceType?: string;\n aiProvider?: string;\n verificationStatus?: string;\n sourceArtifactId?: Id<\"finalArtifacts\">;\n sourceQuestionId?: Id<\"epistemicNodes\">; // If this evidence was created to answer a question\n sourceAnchor?: {\n artifactId: string;\n artifactType: string;\n artifactTitle?: string;\n sectionHeading?: string;\n selectedText?: string;\n startOffset?: number;\n endOffset?: number;\n pageNumber?: number;\n };\n createdBy: string;\n }\n): Promise<Id<\"epistemicNodes\">> {\n const now = Date.now();\n const globalId = generateGlobalId();\n const contentHash = generateContentHash(\"evidence\", insight.text);\n\n // Check for duplicate\n const existing = await ctx.db\n .query(\"epistemicNodes\")\n .withIndex(\"by_contentHash\", (q) => q.eq(\"contentHash\", contentHash))\n .first();\n\n const existingInsightNode = readExistingEpistemicNodeRow(existing);\n if (existingInsightNode?.status === \"active\") {\n await ctx.db.patch(existingInsightNode._id, {\n updatedAt: now,\n });\n return existingInsightNode._id;\n }\n\n const nodeId = await insertEpistemicNode(ctx, {\n globalId,\n nodeType: \"evidence\",\n epistemicLayer: \"L2\", // Evidence is at L2 (compression boundary)\n canonicalText: insight.text,\n contentHash,\n title:\n insight.text.slice(0, 100) + (insight.text.length > 100 ? \"...\" : \"\"),\n tags: insight.tags,\n metadata: {\n kind: insight.kind,\n pillar: insight.tags?.find((t) =>\n [\n \"market\",\n \"competition\",\n \"product\",\n \"team\",\n \"financials\",\n \"regulatory\",\n \"timing\",\n \"customer\",\n \"technology\",\n \"distribution\",\n ].includes(t)\n ),\n // Include sourceArtifactId for source document panel\n sourceArtifactId: insight.sourceArtifactId,\n // Include sourceQuestionId if this evidence was created to answer a question\n sourceQuestionId: insight.sourceQuestionId,\n // Include sourceAnchor for linking evidence back to source documents\n sourceAnchor: insight.sourceAnchor,\n },\n sourceType: mapInsightSourceType(insight.sourceType),\n aiProvider: insight.aiProvider,\n confidence: inferInsightConfidence(insight.verificationStatus),\n verificationStatus: mapVerificationStatus(insight.verificationStatus),\n status: \"active\",\n topicId: insight.projectId,\n createdBy: insight.createdBy,\n createdAt: now,\n updatedAt: now,\n });\n\n // If there's a source artifact, create a derived_from edge\n if (insight.sourceArtifactId) {\n // Find or create the source node\n const sourceNode = await findOrCreateSourceNode(\n ctx,\n insight.sourceArtifactId,\n insight.createdBy,\n insight.projectId\n );\n if (sourceNode) {\n await createEpistemicEdge(ctx, {\n fromNodeId: nodeId,\n toNodeId: sourceNode,\n edgeType: \"derived_from\",\n projectId: insight.projectId,\n createdBy: insight.createdBy,\n });\n }\n }\n\n return nodeId;\n}\n\n/**\n * Create an epistemic node for a belief\n * Called after inserting into the beliefs table\n */\nexport async function createEpistemicNodeForBelief(\n ctx: MutationCtx,\n beliefId: Id<\"epistemicNodes\">,\n belief: {\n projectId: string;\n belief: string;\n rationale?: string;\n confidence: string;\n topic?: string;\n sourceAnchor?: {\n artifactId: string;\n artifactType: string;\n artifactTitle?: string;\n sectionHeading?: string;\n selectedText?: string;\n startOffset?: number;\n endOffset?: number;\n };\n createdBy: string;\n }\n): Promise<Id<\"epistemicNodes\">> {\n const now = Date.now();\n const globalId = generateGlobalId();\n const contentHash = generateContentHash(\"belief\", belief.belief);\n\n // Check for duplicate\n const existing = await ctx.db\n .query(\"epistemicNodes\")\n .withIndex(\"by_contentHash\", (q) => q.eq(\"contentHash\", contentHash))\n .first();\n\n const existingBeliefNode = readExistingEpistemicNodeRow(existing);\n if (existingBeliefNode?.status === \"active\") {\n await ctx.db.patch(existingBeliefNode._id, {\n metadata: {\n ...existingBeliefNode.metadata,\n sourceBeliefId: beliefId,\n },\n updatedAt: now,\n });\n return existingBeliefNode._id;\n }\n\n const nodeId = await insertEpistemicNode(ctx, {\n globalId,\n nodeType: \"belief\",\n epistemicLayer: \"L3\", // Beliefs are at L3 (traversal anchors)\n canonicalText: belief.belief,\n contentHash,\n content: belief.rationale,\n title:\n belief.belief.slice(0, 100) + (belief.belief.length > 100 ? \"...\" : \"\"),\n metadata: {\n sourceBeliefId: beliefId,\n beliefStatus: \"assumption\",\n topic: belief.topic, // Use 'topic' for consistency with legacy schema\n pillar: belief.topic, // Keep 'pillar' for backward compat with existing data\n // No confidence/confidenceLevel — only set after sprint completion\n rationale: belief.rationale,\n status: \"active\",\n // Include sourceAnchor for linking beliefs back to source documents\n sourceAnchor: belief.sourceAnchor,\n },\n beliefStatus: \"assumption\",\n epistemicStatus: \"assumption\",\n sourceType: \"human\",\n confidence: undefined, // No confidence until sprint completion\n verificationStatus: \"unverified\",\n status: \"active\",\n topicId: belief.projectId,\n createdBy: belief.createdBy,\n createdAt: now,\n updatedAt: now,\n });\n\n return nodeId;\n}\n\n/**\n * Create an epistemic node for a question\n * Called after inserting into the questions table\n */\nexport async function createEpistemicNodeForQuestion(\n ctx: MutationCtx,\n _questionId: Id<\"epistemicNodes\">,\n question: {\n projectId: string;\n question: string;\n category?: string;\n priority: string;\n source: string;\n sourceAnchor?: {\n artifactId: string;\n artifactType: string;\n artifactTitle?: string;\n sectionHeading?: string;\n selectedText?: string;\n startOffset?: number;\n endOffset?: number;\n };\n createdBy: string;\n }\n): Promise<Id<\"epistemicNodes\">> {\n const now = Date.now();\n const globalId = generateGlobalId();\n const contentHash = generateContentHash(\"question\", question.question);\n\n // Check for duplicate\n const existing = await ctx.db\n .query(\"epistemicNodes\")\n .withIndex(\"by_contentHash\", (q) => q.eq(\"contentHash\", contentHash))\n .first();\n\n const existingQuestionNode = readExistingEpistemicNodeRow(existing);\n if (existingQuestionNode?.status === \"active\") {\n await ctx.db.patch(existingQuestionNode._id, {\n updatedAt: now,\n });\n return existingQuestionNode._id;\n }\n\n const sourceType = mapQuestionSourceType(question.source);\n\n const nodeId = await insertEpistemicNode(ctx, {\n globalId,\n nodeType: \"question\",\n epistemicLayer: \"L3\", // Questions are at L3 (traversal anchors)\n canonicalText: question.question,\n contentHash,\n title:\n question.question.slice(0, 100) +\n (question.question.length > 100 ? \"...\" : \"\"),\n metadata: {\n pillar: question.category,\n priority: question.priority,\n source: question.source,\n // Include sourceAnchor for linking questions back to source documents\n sourceAnchor: question.sourceAnchor,\n },\n sourceType,\n verificationStatus: \"unverified\",\n status: \"active\",\n topicId: question.projectId,\n createdBy: question.createdBy,\n createdAt: now,\n updatedAt: now,\n });\n\n return nodeId;\n}\n\n/**\n * Create an epistemic node for a synthesis artifact (primer or deep research).\n *\n * ⚠️ IMPORTANT: This function should NOT be called for primers/deep research\n * unless the node is being connected to evidence as a source.\n * Standalone synthesis nodes create orphans in the graph.\n *\n * The correct pattern is:\n * 1. Store the artifact in finalArtifacts (for UI display)\n * 2. Only create epistemic node when extracting evidence FROM the artifact\n * 3. Create edge: evidence -> derived_from -> synthesis\n *\n * @deprecated Consider removing automatic node creation for primers.\n * Use the artifact ID reference in evidence metadata instead.\n */\nexport async function createEpistemicNodeForArtifact(\n ctx: MutationCtx,\n artifactId: Id<\"finalArtifacts\">,\n artifact: {\n projectId?: string;\n title: string;\n content: string;\n type: string;\n isDeepResearch?: boolean;\n aiProvider?: string;\n createdBy: string;\n }\n): Promise<Id<\"epistemicNodes\">> {\n const now = Date.now();\n const globalId = generateGlobalId();\n\n // Determine node type\n let nodeType: EpistemicNodeType = \"source\";\n const isSynthesis =\n artifact.isDeepResearch ||\n artifact.type.includes(\"deep\") ||\n artifact.type.includes(\"research\") ||\n artifact.type.includes(\"primer\");\n\n if (isSynthesis) {\n nodeType = \"synthesis\";\n\n // ⚠️ DO NOT create standalone synthesis nodes\n // Primers/deep research should be stored in finalArtifacts for UI display\n // Epistemic nodes should only be created when:\n // 1. Evidence is extracted FROM the artifact\n // 2. The node is connected via derived_from edge\n console.log(\n `[EpistemicHelpers] Skipping synthesis node creation for \"${artifact.type}\" - ` +\n \"will create when evidence is extracted\"\n );\n\n // Return a placeholder - callers should handle null\n // For backward compatibility, we check for existing node first\n const contentHash = generateContentHash(\n nodeType,\n artifact.title + artifact.content.slice(0, 500)\n );\n const existing = await ctx.db\n .query(\"epistemicNodes\")\n .withIndex(\"by_contentHash\", (q) => q.eq(\"contentHash\", contentHash))\n .first();\n\n const existingSynthesisNode = readExistingEpistemicNodeRow(existing);\n if (existingSynthesisNode?.status === \"active\") {\n return existingSynthesisNode._id; // Return existing node if found\n }\n\n // Don't create new synthesis nodes - they become orphans\n // Throw to signal to callers that no node was created\n throw new Error(\"SKIP_SYNTHESIS_NODE_CREATION\");\n }\n\n const contentHash = generateContentHash(\n nodeType,\n artifact.title + artifact.content.slice(0, 500)\n );\n\n // Check for duplicate\n const existing = await ctx.db\n .query(\"epistemicNodes\")\n .withIndex(\"by_contentHash\", (q) => q.eq(\"contentHash\", contentHash))\n .first();\n\n const existingArtifactNode = readExistingEpistemicNodeRow(existing);\n if (existingArtifactNode?.status === \"active\") {\n await ctx.db.patch(existingArtifactNode._id, {\n metadata: {\n ...existingArtifactNode.metadata,\n legacyArtifactId: artifactId,\n },\n updatedAt: now,\n });\n return existingArtifactNode._id;\n }\n\n // Source artifacts are L1 terminal leaves.\n const epistemicLayer = \"L1\";\n\n const nodeId = await insertEpistemicNode(ctx, {\n globalId,\n nodeType,\n epistemicLayer, // Synthesis is L2, Source is L1\n canonicalText: artifact.title,\n contentHash,\n content: artifact.content,\n contentType: \"markdown\",\n title: artifact.title,\n metadata: {\n legacyArtifactId: artifactId,\n artifactType: artifact.type,\n },\n sourceType: \"ai_generated\",\n aiProvider:\n artifact.aiProvider || (artifact.isDeepResearch ? \"gemini\" : \"anthropic\"),\n verificationStatus: \"unverified\",\n status: \"active\",\n topicId: artifact.projectId,\n createdBy: artifact.createdBy,\n createdAt: now,\n updatedAt: now,\n });\n\n return nodeId;\n}\n\n/**\n * Find or create an epistemic node for a source artifact\n */\nasync function findOrCreateSourceNode(\n ctx: MutationCtx,\n artifactId: Id<\"finalArtifacts\">,\n createdBy: string,\n scopeProjectId?: string\n): Promise<Id<\"epistemicNodes\"> | null> {\n // Check if we already have a node for this artifact.\n // Scope by topicId when available; projectId indexes have been removed.\n const artifact = readSourceArtifactRow(await ctx.db.get(artifactId));\n const effectiveProjectId = scopeProjectId || artifact?.projectId;\n const effectiveTopicId = artifact?.topicId;\n\n let existingNodes: ExistingEpistemicNodeRow[];\n if (effectiveTopicId) {\n const collectedNodes = await ctx.db\n .query(\"epistemicNodes\")\n .withIndex(\"by_topic\", (q) => q.eq(\"topicId\", effectiveTopicId))\n .collect();\n existingNodes = collectedNodes.flatMap((node) => {\n const row = readExistingEpistemicNodeRow(node);\n return row ? [row] : [];\n });\n } else {\n // Last resort: scan by nodeType and filter below.\n const collectedNodes = await ctx.db\n .query(\"epistemicNodes\")\n .withIndex(\"by_nodeType\", (q) => q.eq(\"nodeType\", \"source\"))\n .collect();\n existingNodes = collectedNodes.flatMap((node) => {\n const row = readExistingEpistemicNodeRow(node);\n return row ? [row] : [];\n });\n }\n\n const existing = existingNodes.find((n) => {\n if (\n effectiveProjectId &&\n n.projectId &&\n n.projectId !== effectiveProjectId\n ) {\n return false;\n }\n return n.metadata?.legacyArtifactId === artifactId;\n });\n\n if (existing) {\n return existing._id;\n }\n\n // artifact was already fetched above for scoping; recheck in case it was null\n if (!artifact) {\n return null;\n }\n\n const now = Date.now();\n const globalId = generateGlobalId();\n\n // Determine node type based on artifact metadata\n const artifactType = readOptionalString(artifact.metadata?.type) ?? \"\";\n const isDeepResearch =\n readOptionalBoolean(artifact.metadata?.isDeepResearch) ?? false;\n\n let nodeType: EpistemicNodeType = \"source\";\n if (\n isDeepResearch ||\n artifactType.includes(\"deep\") ||\n artifactType.includes(\"research\")\n ) {\n nodeType = \"synthesis\";\n } else if (artifactType.includes(\"primer\")) {\n nodeType = \"synthesis\";\n }\n\n const title =\n readOptionalString(artifact.metadata?.title) ||\n readOptionalString(artifact.metadata?.theme) ||\n \"Untitled\";\n\n const contentHash = generateContentHash(\n nodeType,\n title + (artifact.content?.slice(0, 500) ?? \"\")\n );\n\n // Determine layer based on nodeType\n const epistemicLayer = nodeType === \"synthesis\" ? \"L2\" : \"L1\";\n\n const nodeId = await insertEpistemicNode(ctx, {\n globalId,\n nodeType,\n epistemicLayer, // Synthesis is L2, Source is L1\n canonicalText: title,\n contentHash,\n content: artifact.content,\n contentType: \"markdown\",\n title,\n metadata: {\n legacyArtifactId: artifactId,\n artifactType,\n stage: artifact.stage,\n },\n sourceType: isDeepResearch ? \"ai_generated\" : \"ai_extracted\",\n aiProvider: isDeepResearch ? \"gemini\" : \"anthropic\",\n verificationStatus: \"unverified\",\n status: \"active\",\n topicId: artifact.projectId,\n createdBy,\n createdAt: now,\n updatedAt: now,\n });\n\n return nodeId;\n}\n","// biome-ignore-all lint/style/useFilenamingConvention: Public graph-primitives wildcard-export path; rename requires an export-map migration.\n/**\n * Graph Type Registry for Convex\n *\n * This file mirrors the canonical type registry at lib/ontology/types.ts\n * but is compatible with Convex's bundling requirements.\n *\n * IMPORTANT: Keep this file in sync with lib/ontology/types.ts\n * The frontend uses lib/ontology/types.ts, Convex uses this file.\n *\n * @see /docs/architecture/UNIFIED_GRAPH_ARCHITECTURE.md\n */\n\n// =============================================================================\n// EPISTEMIC LAYERS\n// =============================================================================\n\nexport type EpistemicLayer =\n | \"L4\"\n | \"L3\"\n | \"L2\"\n | \"L1\"\n | \"ontological\"\n | \"organizational\";\n\n// =============================================================================\n// NODE TYPE TO LABEL MAPPING\n// =============================================================================\n\nexport const NODE_TYPE_TO_LABEL: Record<string, string> = {\n // L4: Audit Targets\n decision: \"Decision\",\n\n // L3: Traversal Anchors\n belief: \"Belief\",\n question: \"Question\",\n theme: \"Theme\",\n deal: \"Deal\",\n topic: \"Topic\",\n\n // L2: Compression Boundary\n claim: \"Claim\",\n evidence: \"Evidence\",\n synthesis: \"Synthesis\",\n answer: \"Answer\",\n\n // L1: Terminal Leaves\n atomic_fact: \"AtomicFact\",\n excerpt: \"Excerpt\",\n source: \"Source\",\n\n // Ontological (Neo4j is SOT)\n company: \"Company\",\n person: \"Person\",\n investor: \"Investor\",\n function: \"Function\",\n value_chain: \"ValueChain\",\n};\n\n// =============================================================================\n// EDGE TYPE TO NEO4J RELATIONSHIP MAPPING\n// =============================================================================\n\n/**\n * Epistemic Kernel v2: 6 canonical edge types + ontological edges.\n *\n * Weight and metadata carry nuance that previously required 67 separate type strings.\n * See: docs/architecture/epistemic-kernel-v2.md\n */\nexport const EDGE_TYPE_TO_REL: Record<string, string> = {\n // === THE SIX CANONICAL EPISTEMIC EDGE TYPES ===\n supports: \"SUPPORTS\", // L3↔L3: belief bears on belief (weight -1 to +1)\n informs: \"INFORMS\", // L2→L3: evidence bears on belief\n depends_on: \"DEPENDS_ON\", // L3→L3, Q→Q: structural gate\n derived_from: \"DERIVED_FROM\", // Any→Any: provenance chain (fork, synthesis, extraction, answer)\n contains: \"CONTAINS\", // Any→Any: hierarchy, scoping, membership\n tests: \"TESTS\", // Q→L3: question interrogates belief\n\n // === L4 DECISION EDGES (derived_from with derivationType=decision) ===\n // Kept as separate Neo4j relationship types for backward compat with L4 queries.\n // New code should use derived_from + metadata.\n based_on_belief: \"BASED_ON_BELIEF\",\n based_on_question: \"BASED_ON_QUESTION\",\n blocked_by_contradiction: \"BLOCKED_BY_CONTRADICTION\",\n informed_by_theme: \"INFORMED_BY_THEME\",\n\n // === ONTOLOGICAL EDGES (tenant-extensible, managed by ontology system) ===\n works_at: \"WORKS_AT\",\n invested_in: \"INVESTED_IN\",\n competes_with: \"COMPETES_WITH\",\n participates_in: \"PARTICIPATES_IN\",\n founded_by: \"FOUNDED_BY\",\n evaluates: \"EVALUATES\",\n performs: \"PERFORMS\",\n function_in: \"FUNCTION_IN\",\n impacts: \"IMPACTS\",\n raised_from: \"RAISED_FROM\",\n mentioned_in: \"MENTIONED_IN\",\n perspective_on: \"PERSPECTIVE_ON\",\n about_entity: \"ABOUT_ENTITY\",\n entity_referenced_in: \"ENTITY_REFERENCED_IN\",\n};\n\n// =============================================================================\n// HELPER FUNCTIONS\n// =============================================================================\n\n/**\n * Get the epistemic layer for a node type\n */\nexport function getNodeLayer(nodeType: string): EpistemicLayer {\n const L4_TYPES = [\"decision\"];\n const L3_TYPES = [\"belief\", \"question\", \"theme\", \"deal\"];\n const L2_TYPES = [\"claim\", \"evidence\", \"synthesis\", \"answer\"];\n const L1_TYPES = [\"atomic_fact\", \"excerpt\", \"source\"];\n const ONTOLOGICAL_TYPES = [\n \"company\",\n \"person\",\n \"investor\",\n \"function\",\n \"value_chain\",\n ];\n const ORGANIZATIONAL_TYPES = [\"topic\"];\n\n if (L4_TYPES.includes(nodeType)) {\n return \"L4\";\n }\n if (L3_TYPES.includes(nodeType)) {\n return \"L3\";\n }\n if (L2_TYPES.includes(nodeType)) {\n return \"L2\";\n }\n if (L1_TYPES.includes(nodeType)) {\n return \"L1\";\n }\n if (ONTOLOGICAL_TYPES.includes(nodeType)) {\n return \"ontological\";\n }\n if (ORGANIZATIONAL_TYPES.includes(nodeType)) {\n return \"organizational\";\n }\n\n // Unknown types default to L2\n console.warn(`[GraphTypes] Unknown nodeType \"${nodeType}\", defaulting to L2`);\n return \"L2\";\n}\n\n/**\n * Get the Neo4j label for a node type\n */\nexport function getNeo4jLabel(nodeType: string): string {\n return (\n NODE_TYPE_TO_LABEL[nodeType] ||\n nodeType.charAt(0).toUpperCase() + nodeType.slice(1)\n );\n}\n\n/**\n * Get the Neo4j relationship type for an edge type\n */\nexport function getNeo4jRelType(edgeType: string): string {\n return EDGE_TYPE_TO_REL[edgeType] || edgeType.toUpperCase();\n}\n\n/**\n * The 6 canonical epistemic edge types (Kernel v2).\n * Anything not in this set or the ontological/L4 sets is deprecated.\n */\nconst CANONICAL_EPISTEMIC_TYPES = new Set([\n \"supports\",\n \"informs\",\n \"depends_on\",\n \"derived_from\",\n \"contains\",\n \"tests\",\n]);\n\n/**\n * Check if an edge type is deprecated.\n *\n * Kernel v2: only the 6 canonical epistemic types, L4 decision types,\n * and ontological types are active. All legacy types (67 old types) are deprecated.\n */\nexport function isDeprecatedEdgeType(edgeType: string): boolean {\n // Canonical epistemic types are NOT deprecated\n if (CANONICAL_EPISTEMIC_TYPES.has(edgeType)) {\n return false;\n }\n // Types in the EDGE_TYPE_TO_REL map (ontological + L4) are NOT deprecated\n if (edgeType in EDGE_TYPE_TO_REL) {\n return false;\n }\n // Everything else is a legacy type\n return true;\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/epistemicInsert.ts"],"names":[],"mappings":";;;;AA8BO,SAAS,mBAAA,CACd,KACA,GAAA,EAC+B;AAC/B,EAAA,oBAAA,CAAqB,gBAAA,EAAkB,IAAI,QAAQ,CAAA;AACnD,EAAA,OAAO,GAAA,CAAI,EAAA,CAAG,MAAA,CAAO,gBAAA,EAAkB,GAAG,CAAA;AAC5C;AAUA,eAAe,0BAAA,CACb,GAAA,EACA,YAAA,EACA,QAAA,EACe;AACf,EAAA,4BAAA,CAA6B,cAAc,QAAQ,CAAA;AACnD,EAAA,MAAM,OAAO,MAAM,GAAA,CAAI,EAAA,CACpB,KAAA,CAAM,gBAAgB,CAAA,CACtB,SAAA;AAAA,IAAU,aAAA;AAAA,IAAe,CAAC,CAAA,KACzB,CAAA,CAAE,EAAA,CAAG,YAAY,QAAQ;AAAA,IAE1B,KAAA,EAAM;AACT,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,4DAAA,EAA+D,YAAY,CAAA,gEAAA,EAAmE,QAAQ,CAAA,6BAAA;AAAA,KACxJ;AAAA,EACF;AACF;AAEA,eAAsB,mBAAA,CACpB,KACA,GAAA,EAC+B;AAC/B,EAAA,oBAAA,CAAqB,gBAAA,EAAkB,IAAI,QAAQ,CAAA;AAGnD,EAAA,2BAAA,CAA4B,IAAI,QAAQ,CAAA;AAGxC,EAAA,IAAI,CAAC,GAAA,CAAI,UAAA,IAAc,OAAO,GAAA,CAAI,eAAe,QAAA,EAAU;AACzD,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AACA,EAAA,IAAI,CAAC,GAAA,CAAI,QAAA,IAAY,OAAO,GAAA,CAAI,aAAa,QAAA,EAAU;AACrD,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AAOA,EAAA,MAAM,0BAAA,CAA2B,GAAA,EAAK,YAAA,EAAc,GAAA,CAAI,UAAU,CAAA;AAClE,EAAA,MAAM,0BAAA,CAA2B,GAAA,EAAK,UAAA,EAAY,GAAA,CAAI,QAAQ,CAAA;AAG9D,EAAA,IAAI,IAAI,YAAA,IAAgB,GAAA,CAAI,UAAA,IAAc,GAAA,CAAI,aAAa,gBAAA,EAAkB;AAC3E,IAAA,uBAAA;AAAA,MACE,kBAAA;AAAA,MACA,GAAA,CAAI,QAAA;AAAA,MACJ;AAAA,QACE,IAAA,EAAM,gBAAA;AAAA,QACN,QAAQ,GAAA,CAAI,UAAA;AAAA,QACZ,UAAU,GAAA,CAAI;AAAA,OAChB;AAAA,MACA;AAAA,QACE,IAAA,EAAM,gBAAA;AAAA,QACN,QAAQ,GAAA,CAAI,QAAA;AAAA,QACZ,UAAU,GAAA,CAAI;AAAA;AAChB,KACF;AAAA,EACF;AAEA,EAAA,OAAO,GAAA,CAAI,EAAA,CAAG,MAAA,CAAO,gBAAA,EAAkB,GAAG,CAAA;AAC5C","file":"epistemicInsert.js","sourcesContent":["// 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"]}