@lucern/graph-primitives 0.1.0-alpha.4 → 0.3.0-alpha.1
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.
- package/dist/beliefDecay.js +229 -1115
- package/dist/beliefDecay.js.map +1 -1
- package/dist/beliefEvidenceLinks.js +53 -834
- package/dist/beliefEvidenceLinks.js.map +1 -1
- package/dist/confidencePropagationDispatch.d.ts +3 -3
- package/dist/confidencePropagationDispatch.js +30 -308
- package/dist/confidencePropagationDispatch.js.map +1 -1
- package/dist/contradictions.js +5 -797
- package/dist/contradictions.js.map +1 -1
- package/dist/edges/contradicts.js +1 -122
- package/dist/edges/contradicts.js.map +1 -1
- package/dist/edges/dependsOn.js +14 -172
- package/dist/edges/dependsOn.js.map +1 -1
- package/dist/edges/elaborates.js +1 -49
- package/dist/edges/elaborates.js.map +1 -1
- package/dist/edges/index.js +14 -277
- package/dist/edges/index.js.map +1 -1
- package/dist/edges/informs.js +1 -62
- package/dist/edges/informs.js.map +1 -1
- package/dist/edges/propagationTypes.d.ts +2 -2
- package/dist/edges/propagationTypes.js.map +1 -1
- package/dist/edges/refutes.js +1 -62
- package/dist/edges/refutes.js.map +1 -1
- package/dist/edges/supports.js +1 -122
- package/dist/edges/supports.js.map +1 -1
- package/dist/edges/utils.d.ts +6 -6
- package/dist/edges/utils.js +1 -130
- package/dist/edges/utils.js.map +1 -1
- package/dist/entityBridge.js +2 -17
- package/dist/entityBridge.js.map +1 -1
- package/dist/entityLifecycle.js +62 -848
- package/dist/entityLifecycle.js.map +1 -1
- package/dist/epistemicAnswers.js +27 -838
- package/dist/epistemicAnswers.js.map +1 -1
- package/dist/epistemicBeliefs.js +186 -2214
- package/dist/epistemicBeliefs.js.map +1 -1
- package/dist/epistemicContractHelpers.js +1 -318
- package/dist/epistemicContractHelpers.js.map +1 -1
- package/dist/epistemicContracts.js +163 -2467
- package/dist/epistemicContracts.js.map +1 -1
- package/dist/epistemicEdges.js +60 -863
- package/dist/epistemicEdges.js.map +1 -1
- package/dist/epistemicEvidence.js +116 -1647
- package/dist/epistemicEvidence.js.map +1 -1
- package/dist/epistemicHelpers.js +3 -2
- package/dist/epistemicHelpers.js.map +1 -1
- package/dist/epistemicLinking.js +2 -785
- package/dist/epistemicLinking.js.map +1 -1
- package/dist/epistemicNodes.js +34 -1427
- package/dist/epistemicNodes.js.map +1 -1
- package/dist/epistemicQuestions.js +88 -1637
- package/dist/epistemicQuestions.js.map +1 -1
- package/dist/epistemicSources.js +28 -1421
- package/dist/epistemicSources.js.map +1 -1
- package/dist/evaluators/index.js +163 -2467
- package/dist/evaluators/index.js.map +1 -1
- package/dist/index.js +486 -3649
- package/dist/index.js.map +1 -1
- package/dist/ontology-matching.js +1 -344
- package/dist/ontology-matching.js.map +1 -1
- package/dist/ontologyApproval.js +1 -13
- package/dist/ontologyApproval.js.map +1 -1
- package/dist/ontologyDefinitions.js +2 -17
- package/dist/ontologyDefinitions.js.map +1 -1
- package/dist/ontologyRegistry.js +2 -17
- package/dist/ontologyRegistry.js.map +1 -1
- package/dist/projectionReconciliation.js +2 -17
- package/dist/projectionReconciliation.js.map +1 -1
- package/dist/questionEvidenceLinks.js +242 -837
- package/dist/questionEvidenceLinks.js.map +1 -1
- package/dist/text-matching.js +1 -244
- package/dist/text-matching.js.map +1 -1
- package/dist/workflowBridge.d.ts +27 -0
- package/dist/workflowBridge.js +303 -0
- package/dist/workflowBridge.js.map +1 -0
- package/dist/workspaceIsolation.js +8 -609
- package/dist/workspaceIsolation.js.map +1 -1
- package/package.json +6 -6
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../access-control/src/convex.ts","../../access-control/src/topicProjectOverlay.ts","../../access-control/src/projectGrantsBridge.ts","../../access-control/src/resolvers.ts","../../access-control/src/principalContext.ts","../../access-control/src/access.ts","../../access-control/src/audience.ts","../../access-control/src/audienceRegistry.ts","../../access-control/src/auth.ts","../../schema-management/src/validators.ts","../src/convex.ts","../src/embeddingTrigger.ts","../src/globalId.ts","../src/topicProjectOverlay.ts","../src/resolvers.ts","../src/topicScope.ts","../../schema-management/src/shared/common.ts","../../schema-management/src/spine/tables/epistemicNodes.ts","../src/workspaceIsolation.ts","../../worktrees/src/v1/engine/scopeBridge.ts","../../worktrees/src/v1/engine/worktreeWorkflowBridge.ts","../src/epistemicQuestions.ts"],"names":["resolvedUser","user","api","anyApi","componentsGeneric","internalMutationGeneric","internalQueryGeneric","mutationGeneric","queryGeneric","LEGACY_SCOPE_FIELD","readNonEmptyString","readStringArray","readMetadata","readLegacyProjectId","coerceVisibility","coerceStatus","mapProjectType","isProjectLikeTopic","resolveTopicDoc","materializeTopicProjectOverlay","resolveTopicProjectOverlay","listTopicProjectOverlays","isMissingLucernChildComponentError","defaultResolvers","resolverOverrides","v","sourceType","externalIds","normalizeScopeValue","epistemicLayer","normalizeString","resolveTopicProjectScope","worktree","content","query","questionType"],"mappings":"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","file":"epistemicQuestions.js","sourcesContent":["import {\n actionGeneric,\n anyApi,\n componentsGeneric,\n httpActionGeneric,\n internalActionGeneric,\n internalMutationGeneric,\n internalQueryGeneric,\n mutationGeneric,\n queryGeneric,\n} from \"convex/server\";\nimport type { GenericId } from \"convex/values\";\n\nexport const api = anyApi as any;\nexport const components = componentsGeneric() as any;\nexport const internal = anyApi as any;\n\nexport type TableNames = string;\nexport type Id<TableName extends TableNames = string> = GenericId<TableName>;\nexport type Doc<TableName extends TableNames = string> = any;\nexport type DataModel = any;\nexport type ActionCtx = any;\nexport type DatabaseReader = any;\nexport type DatabaseWriter = any;\nexport type MutationCtx = any;\nexport type QueryCtx = any;\n\nexport const action = actionGeneric as any;\nexport const httpAction = httpActionGeneric as any;\nexport const internalAction = internalActionGeneric as any;\nexport const internalMutation = internalMutationGeneric as any;\nexport const internalQuery = internalQueryGeneric as any;\nexport const mutation = mutationGeneric as any;\nexport const query = queryGeneric as any;\n","import { api } from \"./convex\";\n\ntype OverlayIdMode = \"legacy\" | \"topic\";\nconst LEGACY_SCOPE_FIELD = \"graphScope\" + \"ProjectId\";\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 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 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 _creationTime: number;\n createdAt: number;\n updatedAt: number;\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 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\nasync function resolveTopicDoc(\n ctx: any,\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(scopeId as any)) as TopicDocLike | null;\n if (directTopic) {\n return directTopic;\n }\n } catch {\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(api.topics.get as any, {\n id: String(scopeId),\n });\n if (topic?.name !== undefined && topic?.type !== undefined) {\n return topic as TopicDocLike;\n }\n } catch {\n // Fall through to legacy-scope lookup.\n }\n\n try {\n const topic = await ctx.runQuery(api.topics.getByLegacyScopeId as any, {\n projectId: String(scopeId),\n });\n if (topic?.name !== undefined && topic?.type !== undefined) {\n return topic as TopicDocLike;\n }\n } catch {\n // Best-effort compat lookup only.\n }\n\n return null;\n}\n\nfunction 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 const createdAt =\n typeof topic.createdAt === \"number\"\n ? topic.createdAt\n : typeof topic._creationTime === \"number\"\n ? topic._creationTime\n : 0;\n const updatedAt =\n typeof topic.updatedAt === \"number\"\n ? topic.updatedAt\n : typeof metadata.updatedAt === \"number\"\n ? (metadata.updatedAt as number)\n : createdAt;\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 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\" ? (metadata.chatCount as number) : 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: any,\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: any,\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 {\n allTopics = [];\n }\n }\n\n if (allTopics.length === 0 && typeof ctx.runQuery === \"function\") {\n allTopics =\n (((await ctx.runQuery(api.topics.list as any, {})) ?? []) 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","import type { Id } from \"./convex\";\nimport { resolveTopicProjectOverlay } from \"./topicProjectOverlay.js\";\n\nconst PROJECT_GRANT_STATUSES = [\"active\", \"revoked\", \"expired\"] as const;\n\ntype ProjectGrantStatus = (typeof PROJECT_GRANT_STATUSES)[number];\n\ntype ProjectGrantRow = Record<string, unknown> & {\n _id: Id<\"projectGrants\">;\n topicId?: string;\n projectId?: string;\n principalId?: string;\n groupId?: string;\n status?: ProjectGrantStatus;\n};\n\ntype ProjectGrantWrite = Record<string, unknown> & {\n topicId?: string;\n projectId?: string;\n};\n\nfunction normalizeString(value: unknown): string | undefined {\n if (typeof value !== \"string\") {\n return;\n }\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n}\n\nasync function resolveGrantScopeIds(\n ctx: any,\n args: {\n topicId?: unknown;\n projectId?: unknown;\n }\n): Promise<{ topicId?: string; projectId?: string }> {\n const topicId = normalizeString(args.topicId);\n const projectId = normalizeString(args.projectId);\n\n for (const scopeId of [topicId, projectId]) {\n if (!scopeId) {\n continue;\n }\n\n try {\n const overlay = await resolveTopicProjectOverlay(ctx, scopeId, {\n idMode: \"legacy\",\n projectLikeOnly: false,\n });\n if (overlay) {\n return {\n topicId: normalizeString(overlay.topicId) ?? topicId,\n projectId:\n normalizeString(overlay.projectId) ?? projectId ?? scopeId,\n };\n }\n } catch {\n // Fall back to the raw ids when the topic overlay bridge is unavailable.\n }\n }\n\n return { topicId, projectId };\n}\n\nasync function normalizeProjectGrantRow(\n ctx: any,\n row: ProjectGrantRow\n): Promise<ProjectGrantRow> {\n const scope = await resolveGrantScopeIds(ctx, {\n topicId: row.topicId,\n projectId: row.projectId,\n });\n\n return {\n ...row,\n ...(scope.topicId ? { topicId: scope.topicId } : {}),\n ...(scope.projectId ?? scope.topicId\n ? { projectId: scope.projectId ?? scope.topicId }\n : {}),\n };\n}\n\nasync function normalizeProjectGrantRows(\n ctx: any,\n rows: ProjectGrantRow[]\n): Promise<ProjectGrantRow[]> {\n return await Promise.all(rows.map((row) => normalizeProjectGrantRow(ctx, row)));\n}\n\nasync function listProjectGrantsByPrincipal(\n ctx: any,\n principalId: string\n): Promise<ProjectGrantRow[]> {\n const rows = await Promise.all(\n PROJECT_GRANT_STATUSES.map((status) =>\n ctx.db\n .query(\"projectGrants\")\n .withIndex(\"by_principal_status\", (q: any) =>\n q.eq(\"principalId\", principalId).eq(\"status\", status)\n )\n .collect()\n )\n );\n return await normalizeProjectGrantRows(ctx, rows.flat() as ProjectGrantRow[]);\n}\n\nasync function listProjectGrantsByGroup(\n ctx: any,\n groupId: string\n): Promise<ProjectGrantRow[]> {\n const rows = await Promise.all(\n PROJECT_GRANT_STATUSES.map((status) =>\n ctx.db\n .query(\"projectGrants\")\n .withIndex(\"by_group_status\", (q: any) =>\n q.eq(\"groupId\", groupId).eq(\"status\", status)\n )\n .collect()\n )\n );\n return await normalizeProjectGrantRows(ctx, rows.flat() as ProjectGrantRow[]);\n}\n\nfunction buildScopeMatchers(\n inputScopeId: string,\n resolved: { topicId?: string; projectId?: string }\n): Set<string> {\n return new Set(\n [inputScopeId, resolved.topicId, resolved.projectId]\n .map((value) => normalizeString(value))\n .filter((value): value is string => Boolean(value))\n );\n}\n\nfunction matchesResolvedScope(\n row: ProjectGrantRow,\n scopeIds: Set<string>\n): boolean {\n const rowTopicId = normalizeString(row.topicId);\n const rowProjectId = normalizeString(row.projectId);\n return (\n (rowTopicId !== undefined && scopeIds.has(rowTopicId)) ||\n (rowProjectId !== undefined && scopeIds.has(rowProjectId))\n );\n}\n\nexport async function bridgeListProjectGrants(ctx: any): Promise<any[]> {\n const rows = (await ctx.db.query(\"projectGrants\").collect()) as ProjectGrantRow[];\n return await normalizeProjectGrantRows(ctx, rows);\n}\n\nexport async function bridgeListProjectGrantsByTopicId(\n ctx: any,\n topicId: string\n): Promise<any[]> {\n const resolved = await resolveGrantScopeIds(ctx, { topicId });\n const rows = await bridgeListProjectGrants(ctx);\n const scopeIds = buildScopeMatchers(topicId, resolved);\n return rows.filter((row) => matchesResolvedScope(row as ProjectGrantRow, scopeIds));\n}\n\nexport async function bridgeListProjectGrantsByTopicAndPrincipal(\n ctx: any,\n topicId: string,\n principalId: string\n): Promise<any[]> {\n const resolved = await resolveGrantScopeIds(ctx, { topicId });\n const scopeIds = buildScopeMatchers(topicId, resolved);\n const rows = await listProjectGrantsByPrincipal(ctx, principalId);\n return rows.filter((row) => matchesResolvedScope(row, scopeIds));\n}\n\nexport async function bridgeListProjectGrantsByTopicAndGroup(\n ctx: any,\n topicId: string,\n groupId: string\n): Promise<any[]> {\n const resolved = await resolveGrantScopeIds(ctx, { topicId });\n const scopeIds = buildScopeMatchers(topicId, resolved);\n const rows = await listProjectGrantsByGroup(ctx, groupId);\n return rows.filter((row) => matchesResolvedScope(row, scopeIds));\n}\n\nexport async function bridgeListProjectGrantsByPrincipalStatus(\n ctx: any,\n principalId: string,\n status: ProjectGrantStatus\n): Promise<any[]> {\n const rows = await listProjectGrantsByPrincipal(ctx, principalId);\n return rows.filter((row) => row.status === status);\n}\n\nexport async function bridgeListProjectGrantsByGroupStatus(\n ctx: any,\n groupId: string,\n status: ProjectGrantStatus\n): Promise<any[]> {\n const rows = await listProjectGrantsByGroup(ctx, groupId);\n return rows.filter((row) => row.status === status);\n}\n\nexport async function bridgeInsertProjectGrant(\n ctx: any,\n value: ProjectGrantWrite\n): Promise<Id<\"projectGrants\">> {\n const resolved = await resolveGrantScopeIds(ctx, value);\n return await ctx.db.insert(\"projectGrants\", {\n ...value,\n ...(resolved.topicId ? { topicId: resolved.topicId } : {}),\n ...(resolved.projectId ?? resolved.topicId\n ? { projectId: resolved.projectId ?? resolved.topicId }\n : {}),\n });\n}\n\nexport async function bridgePatchProjectGrant(\n ctx: any,\n projectGrantId: string,\n value: ProjectGrantWrite\n): Promise<void> {\n const resolved = await resolveGrantScopeIds(ctx, value);\n await ctx.db.patch(projectGrantId, {\n ...value,\n ...(resolved.topicId ? { topicId: resolved.topicId } : {}),\n ...(resolved.projectId ?? resolved.topicId\n ? { projectId: resolved.projectId ?? resolved.topicId }\n : {}),\n });\n}\n","/** Data-source resolver wiring for topic-scoped access control. */\nimport { api as appApi } from \"./convex\";\nimport {\n bridgeInsertProjectGrant,\n bridgeListProjectGrantsByGroupStatus,\n bridgeListProjectGrantsByPrincipalStatus,\n bridgeListProjectGrantsByTopicAndGroup,\n bridgeListProjectGrantsByTopicAndPrincipal,\n} from \"./projectGrantsBridge.js\";\nimport {\n listTopicProjectOverlays,\n resolveTopicProjectOverlay,\n} from \"./topicProjectOverlay.js\";\nimport type {\n AccessControlAppResolverContext,\n AccessControlAppResolvers,\n} from \"./resolverTypes\";\n\nasync function findUserByClerkId(\n ctx: AccessControlAppResolverContext,\n clerkId: string\n): Promise<Record<string, unknown> | null> {\n const normalizedClerkId = clerkId.trim();\n if (!normalizedClerkId) {\n return null;\n }\n\n if (typeof ctx.runQuery === \"function\") {\n try {\n const bridgedUser = await ctx.runQuery(appApi.users.getUserByClerkId as any, {\n clerkId: normalizedClerkId,\n });\n if (bridgedUser) {\n return bridgedUser as Record<string, unknown>;\n }\n } catch {\n // Some dev deployments still carry the users table without the legacy\n // by_clerkId index. Fall through to a direct table scan instead of failing\n // the MCP request path closed on index drift alone.\n }\n }\n\n try {\n const users = await ctx.db.query(\"users\").collect();\n return (\n users.find((user) => String((user as { clerkId?: unknown }).clerkId ?? \"\") === normalizedClerkId) ??\n null\n ) as Record<string, unknown> | null;\n } catch {\n return null;\n }\n}\n\nasync function findUserByPrincipalId(\n ctx: AccessControlAppResolverContext,\n principalId: string\n): Promise<Record<string, unknown> | null> {\n const normalizedPrincipalId = principalId.trim();\n if (!normalizedPrincipalId) {\n return null;\n }\n\n try {\n const users = await ctx.db.query(\"users\").collect();\n return (\n users.find(\n (user) =>\n String((user as { defaultPrincipalId?: unknown }).defaultPrincipalId ?? \"\") ===\n normalizedPrincipalId\n ) ?? null\n ) as Record<string, unknown> | null;\n } catch {\n return null;\n }\n}\n\nasync function findAgentByPrincipalId(\n ctx: AccessControlAppResolverContext,\n principalId: string\n): Promise<Record<string, unknown> | null> {\n const normalizedPrincipalId = principalId.trim();\n if (!normalizedPrincipalId) {\n return null;\n }\n\n if (typeof ctx.runQuery === \"function\") {\n try {\n const bridgedAgent = await ctx.runQuery(\n (appApi as any).agents.getAgentByPrincipalId,\n {\n principalId: normalizedPrincipalId,\n }\n );\n if (bridgedAgent) {\n return bridgedAgent as Record<string, unknown>;\n }\n } catch {\n // Fall through to direct scan for local index drift in dev deployments.\n }\n }\n\n try {\n const agents = await ctx.db.query(\"agents\").collect();\n return (\n agents.find(\n (agent) =>\n String((agent as { principalId?: unknown }).principalId ?? \"\") ===\n normalizedPrincipalId\n ) ?? null\n ) as Record<string, unknown> | null;\n } catch {\n return null;\n }\n}\n\nfunction defaultResolvers(): AccessControlAppResolvers {\n return {\n async getProject(ctx, topicId) {\n return await resolveTopicProjectOverlay(ctx, topicId, {\n idMode: \"legacy\",\n projectLikeOnly: false,\n });\n },\n async listTopics(ctx) {\n return await listTopicProjectOverlays(ctx, { idMode: \"legacy\" });\n },\n async listTopicsByOwner(ctx, ownerId) {\n const topics = await listTopicProjectOverlays(ctx, { idMode: \"legacy\" });\n return topics.filter((topic) => topic.ownerId === ownerId);\n },\n async listTopicsByVisibility(ctx, visibility) {\n const topics = await listTopicProjectOverlays(ctx, { idMode: \"legacy\" });\n return topics.filter((topic) => topic.visibility === visibility);\n },\n async listProjectGrantsByProjectAndPrincipal(ctx, topicId, principalId) {\n return await bridgeListProjectGrantsByTopicAndPrincipal(\n ctx,\n topicId,\n principalId\n );\n },\n async listProjectGrantsByProjectAndGroup(ctx, topicId, groupId) {\n return await bridgeListProjectGrantsByTopicAndGroup(ctx, topicId, groupId);\n },\n async listProjectGrantsByPrincipalStatus(ctx, principalId, status) {\n return await bridgeListProjectGrantsByPrincipalStatus(\n ctx,\n principalId,\n status\n );\n },\n async listProjectGrantsByGroupStatus(ctx, groupId, status) {\n return await bridgeListProjectGrantsByGroupStatus(ctx, groupId, status);\n },\n async insertProjectGrant(ctx, value) {\n return (await bridgeInsertProjectGrant(ctx, value)) as any;\n },\n async getAgentByPrincipalId(ctx, principalId) {\n return await findAgentByPrincipalId(ctx, principalId);\n },\n async getUserByClerkId(ctx, clerkId) {\n return await findUserByClerkId(ctx, clerkId);\n },\n async getUserByPrincipalId(ctx, principalId) {\n return await findUserByPrincipalId(ctx, principalId);\n },\n };\n}\n\nlet resolverOverrides: Partial<AccessControlAppResolvers> = {};\n\nexport function configureAccessControlAppResolvers(\n overrides: Partial<AccessControlAppResolvers>\n): void {\n resolverOverrides = {\n ...resolverOverrides,\n ...overrides,\n };\n}\n\nexport function resetAccessControlAppResolvers(): void {\n resolverOverrides = {};\n}\n\nexport function resolveAccessControlAppResolvers(\n _ctx: AccessControlAppResolverContext\n): AccessControlAppResolvers {\n return {\n ...defaultResolvers(),\n ...resolverOverrides,\n };\n}\n","/**\n * Principal Context Resolver\n *\n * Derives principal context from the local `users` table only.\n * Governance tables (platformPrincipals, platformMemberships,\n * platformGroupMemberships) have been migrated to Master Control\n * and no longer exist in the tenant deployment.\n */\n\nimport type { MutationCtx, QueryCtx } from \"./convex\";\nimport { resolveAccessControlAppResolvers } from \"./resolvers\";\n\ntype DbCtx = QueryCtx | MutationCtx;\n\nexport type PlatformRole =\n | \"platform_admin\"\n | \"tenant_admin\"\n | \"workspace_admin\"\n | \"editor\"\n | \"viewer\"\n | \"auditor\"\n | \"service_agent\";\n\ntype ResolvedPrincipalType = \"user\" | \"group\" | \"service\" | \"external_viewer\";\n\nexport type ResolvedPrincipalContext = {\n principalId: string;\n principalType: ResolvedPrincipalType;\n clerkId: string;\n tenantId: string | null;\n workspaceId: string | null;\n roles: PlatformRole[];\n groupIds: string[];\n isPlatformAdmin: boolean;\n isTenantAdmin: boolean;\n isWorkspaceAdmin: boolean;\n isSystemFallback: boolean;\n};\n\ntype ResolvedUserRecord = {\n mcRole?: unknown;\n defaultTenantId?: unknown;\n defaultWorkspaceId?: unknown;\n defaultPrincipalId?: unknown;\n principalGroupIds?: unknown;\n};\n\ntype ResolvedAgentRecord = {\n principalId?: unknown;\n tenantId?: unknown;\n workspaceId?: unknown;\n roles?: unknown;\n groupIds?: unknown;\n};\n\ntype CanonicalResolvedUser = {\n mcRole: PlatformRole;\n defaultTenantId: string;\n defaultWorkspaceId: string;\n defaultPrincipalId: string;\n};\n\nfunction requireCanonicalResolvedUser(\n user: Record<string, unknown> | null,\n clerkId: string\n): CanonicalResolvedUser {\n const resolved = user as ResolvedUserRecord | null;\n if (!resolved) {\n throw new Error(\n `[AccessControl] Canonical user identity required for ${clerkId}. Sync users.upsertUser before user-bound access checks.`\n );\n }\n\n const { mcRole, defaultTenantId, defaultWorkspaceId, defaultPrincipalId } = resolved;\n if (\n mcRole !== \"platform_admin\" &&\n mcRole !== \"tenant_admin\" &&\n mcRole !== \"workspace_admin\" &&\n mcRole !== \"editor\" &&\n mcRole !== \"viewer\" &&\n mcRole !== \"auditor\" &&\n mcRole !== \"service_agent\"\n ) {\n throw new Error(\n `[AccessControl] Canonical MC role required for ${clerkId}. Re-sync Master Control identity before user-bound access checks.`\n );\n }\n\n if (typeof defaultTenantId !== \"string\" || defaultTenantId.trim().length === 0) {\n throw new Error(\n `[AccessControl] Canonical home tenant required for ${clerkId}. Re-sync Master Control identity before user-bound access checks.`\n );\n }\n\n if (\n typeof defaultWorkspaceId !== \"string\" ||\n defaultWorkspaceId.trim().length === 0\n ) {\n throw new Error(\n `[AccessControl] Canonical home workspace required for ${clerkId}. Re-sync Master Control identity before user-bound access checks.`\n );\n }\n\n if (\n typeof defaultPrincipalId !== \"string\" ||\n defaultPrincipalId.trim().length === 0\n ) {\n throw new Error(\n `[AccessControl] Canonical federated principal required for ${clerkId}. Re-sync Master Control identity before user-bound access checks.`\n );\n }\n\n return {\n mcRole,\n defaultTenantId: defaultTenantId.trim(),\n defaultWorkspaceId: defaultWorkspaceId.trim(),\n defaultPrincipalId: defaultPrincipalId.trim(),\n };\n}\n\nfunction isPrincipalIdInput(value: string): boolean {\n return (\n value.startsWith(\"user:\") ||\n value.startsWith(\"group:\") ||\n value.startsWith(\"service:\") ||\n value.startsWith(\"agent:\") ||\n value.startsWith(\"external_viewer:\")\n );\n}\n\nasync function resolveCanonicalUserRecord(\n ctx: DbCtx,\n actorId: string\n): Promise<{\n resolvedUser: Record<string, unknown> | null;\n clerkId: string;\n contextClerkId: string;\n}> {\n const normalizedActorId = actorId.trim();\n const clerkId =\n isPrincipalIdInput(normalizedActorId) && normalizedActorId.startsWith(\"user:\")\n ? normalizedActorId.slice(\"user:\".length)\n : normalizedActorId;\n const resolvers = resolveAccessControlAppResolvers(ctx);\n const resolvedByClerkId = await resolvers.getUserByClerkId(ctx, clerkId);\n\n if (resolvedByClerkId) {\n return {\n resolvedUser: resolvedByClerkId as Record<string, unknown>,\n clerkId,\n contextClerkId: clerkId,\n };\n }\n\n const resolvedByPrincipalId = await resolvers.getUserByPrincipalId(\n ctx,\n normalizedActorId\n );\n return {\n resolvedUser: (resolvedByPrincipalId as Record<string, unknown> | null) ?? null,\n clerkId,\n contextClerkId:\n normalizedActorId.startsWith(\"user:\") && clerkId.length > 0\n ? clerkId\n : normalizedActorId,\n };\n}\n\nfunction uniqRoles(roles: string[]): PlatformRole[] {\n const roleSet = new Set<PlatformRole>();\n for (const role of roles) {\n if (\n role === \"platform_admin\" ||\n role === \"tenant_admin\" ||\n role === \"workspace_admin\" ||\n role === \"editor\" ||\n role === \"viewer\" ||\n role === \"auditor\" ||\n role === \"service_agent\"\n ) {\n roleSet.add(role);\n }\n }\n return [...roleSet];\n}\n\nfunction normalizeGroupIds(value: unknown): string[] {\n if (!Array.isArray(value)) {\n return [];\n }\n\n return [...new Set(\n value\n .filter((entry): entry is string => typeof entry === \"string\")\n .map((entry) => entry.trim())\n .filter(Boolean)\n )];\n}\n\nfunction requireServiceAgentUser(\n user: Record<string, unknown> | null,\n actorId: string\n): CanonicalResolvedUser {\n const canonicalUser = requireCanonicalResolvedUser(user, actorId);\n if (canonicalUser.mcRole !== \"service_agent\") {\n throw new Error(\n `[AccessControl] Canonical service_agent identity required for ${actorId}. Sync users.upsertUser before agent-bound access checks.`\n );\n }\n return canonicalUser;\n}\n\nfunction requireCanonicalResolvedAgent(\n agent: Record<string, unknown> | null,\n actorId: string\n): {\n principalId: string;\n tenantId: string;\n workspaceId: string;\n roles: PlatformRole[];\n groupIds: string[];\n} {\n const resolved = agent as ResolvedAgentRecord | null;\n if (!resolved) {\n throw new Error(\n `[AccessControl] Agent \"${actorId}\" not found in agents or users table.`\n );\n }\n\n if (typeof resolved.principalId !== \"string\" || resolved.principalId.trim().length === 0) {\n throw new Error(\n `[AccessControl] Canonical agent principalId required for ${actorId}.`\n );\n }\n\n if (typeof resolved.tenantId !== \"string\" || resolved.tenantId.trim().length === 0) {\n throw new Error(\n `[AccessControl] Canonical home tenant required for ${actorId}.`\n );\n }\n\n if (\n typeof resolved.workspaceId !== \"string\" ||\n resolved.workspaceId.trim().length === 0\n ) {\n throw new Error(\n `[AccessControl] Canonical home workspace required for ${actorId}.`\n );\n }\n\n return {\n principalId: resolved.principalId.trim(),\n tenantId: resolved.tenantId.trim(),\n workspaceId: resolved.workspaceId.trim(),\n roles:\n uniqRoles(Array.isArray(resolved.roles) ? (resolved.roles as string[]) : []) ??\n [\"service_agent\"],\n groupIds: normalizeGroupIds(resolved.groupIds),\n };\n}\n\nfunction _pickHomeMembership(\n memberships: Array<{\n tenantId: string;\n workspaceId?: string;\n role: PlatformRole;\n }>\n) {\n const rolePriority: Record<PlatformRole, number> = {\n platform_admin: 7,\n tenant_admin: 6,\n workspace_admin: 5,\n editor: 4,\n auditor: 3,\n viewer: 2,\n service_agent: 1,\n };\n\n const sorted = [...memberships].sort(\n (a, b) => rolePriority[b.role] - rolePriority[a.role]\n );\n\n return sorted[0] ?? null;\n}\n\n/**\n * Resolve principal context from the local `users` table.\n *\n * Governance tables (platformPrincipals, platformMemberships,\n * platformGroupMemberships) have been migrated to Master Control.\n * This function now derives all context from the `users` table\n * via the app resolver layer.\n */\nexport async function resolvePrincipalContext(\n ctx: DbCtx,\n actorId: string\n): Promise<ResolvedPrincipalContext> {\n if (actorId.startsWith(\"agent:\")) {\n const resolvers = resolveAccessControlAppResolvers(ctx);\n const resolvedAgent = await resolvers.getAgentByPrincipalId(ctx, actorId);\n\n if (resolvedAgent) {\n const agent = requireCanonicalResolvedAgent(\n resolvedAgent as Record<string, unknown> | null,\n actorId\n );\n return {\n principalId: agent.principalId,\n principalType: \"service\",\n clerkId: actorId,\n tenantId: agent.tenantId,\n workspaceId: agent.workspaceId,\n roles: agent.roles.length > 0 ? agent.roles : [\"service_agent\"],\n groupIds: agent.groupIds,\n isPlatformAdmin: false,\n isTenantAdmin: false,\n isWorkspaceAdmin: false,\n isSystemFallback: false,\n };\n }\n\n const resolvedUser = (await resolvers.getUserByClerkId(\n ctx,\n actorId\n )) as ResolvedUserRecord | null;\n if (!resolvedUser) {\n throw new Error(\n `[AccessControl] Agent \"${actorId}\" not found in agents or users table.`\n );\n }\n const user = requireServiceAgentUser(\n resolvedUser as Record<string, unknown> | null,\n actorId\n );\n console.warn(\n `[AccessControl] Deprecated legacy service-agent fallback for ${actorId}; migrate this principal into identity.agents.`\n );\n\n return {\n principalId: user.defaultPrincipalId,\n principalType: \"service\",\n clerkId: actorId,\n tenantId: user.defaultTenantId,\n workspaceId: user.defaultWorkspaceId,\n roles: [\"service_agent\"],\n groupIds: normalizeGroupIds(resolvedUser?.principalGroupIds),\n isPlatformAdmin: false,\n isTenantAdmin: false,\n isWorkspaceAdmin: false,\n isSystemFallback: false,\n };\n }\n\n const {\n resolvedUser,\n contextClerkId,\n } = await resolveCanonicalUserRecord(ctx, actorId);\n const user = requireCanonicalResolvedUser(\n resolvedUser as Record<string, unknown> | null,\n contextClerkId\n );\n if (!user.defaultPrincipalId) {\n throw new Error(\n `[AccessControl] Canonical federated principal required for ${contextClerkId}. Re-sync Master Control identity before user-bound access checks.`\n );\n }\n\n if (user.mcRole === \"service_agent\") {\n return {\n principalId: user.defaultPrincipalId,\n principalType: \"service\",\n clerkId: contextClerkId,\n tenantId: user.defaultTenantId,\n workspaceId: user.defaultWorkspaceId,\n roles: [\"service_agent\"],\n groupIds: normalizeGroupIds(resolvedUser?.principalGroupIds),\n isPlatformAdmin: false,\n isTenantAdmin: false,\n isWorkspaceAdmin: false,\n isSystemFallback: false,\n };\n }\n\n const principalId = user.defaultPrincipalId;\n\n const effectiveRole = user.mcRole;\n\n const roles: PlatformRole[] = effectiveRole === \"platform_admin\"\n ? [\"platform_admin\", \"tenant_admin\"]\n : effectiveRole === \"tenant_admin\"\n ? [\"tenant_admin\"]\n : [effectiveRole];\n\n const tenantId = user.defaultTenantId;\n const workspaceId = user.defaultWorkspaceId;\n\n const isPlatformAdmin = effectiveRole === \"platform_admin\";\n\n return {\n principalId,\n principalType: \"user\",\n clerkId: contextClerkId,\n tenantId,\n workspaceId,\n roles: uniqRoles(roles),\n groupIds: normalizeGroupIds(resolvedUser?.principalGroupIds),\n isPlatformAdmin,\n isTenantAdmin: isPlatformAdmin || effectiveRole === \"tenant_admin\",\n isWorkspaceAdmin: isPlatformAdmin || effectiveRole === \"tenant_admin\" || effectiveRole === \"workspace_admin\",\n isSystemFallback: false,\n };\n}\n\n/**\n * Ensure a user principal context exists.\n *\n * Governance bootstrap (creating platformPrincipals, memberships, etc.)\n * has moved to Master Control. This tenant-side stub resolves the\n * existing context from the local `users` table without creating\n * any governance records.\n */\nexport async function ensureUserPrincipalContext(\n ctx: MutationCtx,\n args: {\n clerkId: string;\n email?: string;\n name?: string;\n isAdmin?: boolean;\n actorPrincipalId?: string;\n }\n): Promise<ResolvedPrincipalContext> {\n return resolvePrincipalContext(ctx, args.clerkId);\n}\n","/**\n * Centralized Access Control for Convex\n *\n * This module provides consistent authorization patterns across all Convex\n * mutations and queries. Access checks are principal-context driven and honor\n * tenant ringfencing, explicit topic grants, and broad visibility semantics.\n *\n * Access Rules:\n * - Platform admins have access to all topics\n * - Topic owners have full access to their topics\n * - Explicit topic grants (principal/group) provide access across visibility modes\n * - Legacy `sharedWith` remains a compatibility bridge during migration\n * - `firm` visibility is tenant-scoped and blocked for principals marked external\n * - `public` visibility is available to any authenticated user\n * - Resources without a topic are accessible only to their creator\n */\n\nimport type { MutationCtx, QueryCtx } from \"./convex\";\nimport {\n resolvePrincipalContext,\n type ResolvedPrincipalContext,\n} from \"./principalContext\";\nimport { resolveAccessControlAppResolvers } from \"./resolvers\";\n\ntype DbCtx = QueryCtx | MutationCtx;\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type TopicRecord = {\n _id: string;\n ownerId: string;\n sharedWith: string[];\n visibility: \"private\" | \"team\" | \"firm\" | \"external\" | \"public\";\n tenantId?: string;\n workspaceId?: string;\n};\n\n/** @deprecated Use TopicRecord inside access-control. */\nexport type Project = {\n _id: string;\n ownerId: string;\n sharedWith: string[];\n visibility: \"private\" | \"team\" | \"firm\" | \"external\" | \"public\";\n tenantId?: string;\n workspaceId?: string;\n};\n\nexport type ResourceWithTopic = {\n topicId?: string;\n /** @deprecated Use topicId inside access-control. */\n projectId?: string;\n userId?: string;\n createdBy?: string;\n};\n\n/** @deprecated Use ResourceWithTopic inside access-control. */\nexport type ResourceWithProject = ResourceWithTopic;\n\nexport type AccessCheckResult = {\n hasAccess: boolean;\n isAdmin: boolean;\n isOwner: boolean;\n isShared: boolean;\n hasGrant: boolean;\n isFirmVisible: boolean;\n isExternalVisible: boolean;\n isPublicVisible: boolean;\n isTenantScopeMatch: boolean;\n isWorkspaceScopeMatch: boolean;\n isPrincipalExternal: boolean;\n};\n\nfunction isTopicInPrincipalTenant(\n topic: { tenantId?: string },\n principalTenantId: string | null\n): boolean {\n if (!topic.tenantId) {\n return false;\n }\n if (!principalTenantId) {\n return false;\n }\n return String(topic.tenantId) === String(principalTenantId);\n}\n\nfunction isTopicInPrincipalWorkspace(\n topic: { workspaceId?: string },\n principalWorkspaceId: string | null\n): boolean {\n if (!topic.workspaceId) {\n return false;\n }\n if (!principalWorkspaceId) {\n return false;\n }\n return String(topic.workspaceId) === String(principalWorkspaceId);\n}\n\nfunction isLegacyUnscopedTopic(topic: {\n tenantId?: string;\n workspaceId?: string;\n}): boolean {\n return !topic.tenantId || !topic.workspaceId;\n}\n\nexport function isGrantScopeAlignedToTopic(\n topic: {\n tenantId?: string;\n workspaceId?: string;\n },\n grant: {\n tenantId?: string;\n workspaceId?: string;\n }\n): boolean {\n if (\n topic.tenantId &&\n grant.tenantId &&\n String(topic.tenantId) !== String(grant.tenantId)\n ) {\n return false;\n }\n if (\n topic.workspaceId &&\n grant.workspaceId &&\n String(topic.workspaceId) !== String(grant.workspaceId)\n ) {\n return false;\n }\n return true;\n}\n\n/** @deprecated Use isGrantScopeAlignedToTopic. */\nexport const isGrantScopeAlignedToProject = isGrantScopeAlignedToTopic;\n\nexport function isGroupScopeAlignedToTopic(\n topic: {\n tenantId?: string;\n workspaceId?: string;\n },\n group: {\n tenantId?: string;\n workspaceId?: string;\n }\n): boolean {\n if (\n topic.tenantId &&\n group.tenantId &&\n String(topic.tenantId) !== String(group.tenantId)\n ) {\n return false;\n }\n if (\n topic.workspaceId &&\n group.workspaceId &&\n String(topic.workspaceId) !== String(group.workspaceId)\n ) {\n return false;\n }\n return true;\n}\n\n/** @deprecated Use isGroupScopeAlignedToTopic. */\nexport const isGroupScopeAlignedToProject = isGroupScopeAlignedToTopic;\n\nexport function isGrantSourceAllowedForVisibility(\n visibility: \"private\" | \"team\" | \"firm\" | \"external\" | \"public\",\n source: string | undefined\n): boolean {\n if (source !== \"external_share\") {\n return true;\n }\n return visibility === \"external\" || visibility === \"public\";\n}\n\nfunction isGrantActive(grant: {\n status: \"active\" | \"revoked\" | \"expired\";\n expiresAt?: number;\n}): boolean {\n if (grant.status !== \"active\") {\n return false;\n }\n if (grant.expiresAt !== undefined && grant.expiresAt <= Date.now()) {\n return false;\n }\n return true;\n}\n\nasync function hasPrincipalGrant(\n ctx: DbCtx,\n args: {\n topic: TopicRecord;\n principalId: string;\n principalIsExternal: boolean;\n }\n): Promise<boolean> {\n const grants = await resolveAccessControlAppResolvers(\n ctx\n ).listProjectGrantsByProjectAndPrincipal(\n ctx,\n args.topic._id,\n args.principalId\n );\n\n if (\n grants.some(\n (grant) =>\n isGrantActive(grant as any) &&\n isGrantScopeAlignedToTopic(args.topic, grant) &&\n isGrantSourceAllowedForVisibility(\n args.topic.visibility,\n grant.source\n ) &&\n (!args.principalIsExternal ||\n args.topic.visibility === \"public\" ||\n grant.source === \"external_share\")\n )\n ) {\n return true;\n }\n\n return false;\n}\n\nasync function hasGroupGrant(\n ctx: DbCtx,\n args: {\n topic: TopicRecord;\n groupIds: string[];\n }\n): Promise<boolean> {\n // Group-based grant checks require MC group resolution.\n // With groupIds=[] from tenant-local principal context, this is a no-op.\n // Future: call MC to resolve group grants for cross-tenant scenarios.\n if (args.groupIds.length === 0) {\n return false;\n }\n\n for (const groupId of args.groupIds) {\n const grants = await resolveAccessControlAppResolvers(\n ctx\n ).listProjectGrantsByProjectAndGroup(ctx, args.topic._id, groupId);\n\n if (\n grants.some(\n (grant) =>\n isGrantActive(grant as any) &&\n isGrantScopeAlignedToTopic(args.topic, grant) &&\n isGrantSourceAllowedForVisibility(\n args.topic.visibility,\n grant.source\n )\n )\n ) {\n return true;\n }\n }\n return false;\n}\n\nfunction isExternalPrincipal(\n _ctx: DbCtx,\n _args: {\n groupIds: string[];\n topicTenantId?: string;\n topicWorkspaceId?: string;\n }\n): boolean {\n // External principal detection requires MC group resolution.\n // With groupIds=[] from tenant-local principal context, always false.\n // Future: call MC to check external group membership.\n return false;\n}\n\n// =============================================================================\n// ADMIN CHECK\n// =============================================================================\n\n/**\n * Check if a user has admin-tier access.\n *\n * Identity bridge: prefers mcRole (synced from Master Control),\n * falls back to legacy isAdmin boolean during migration.\n */\nexport async function isAdmin(ctx: DbCtx, userId: string): Promise<boolean> {\n const user = await resolveAccessControlAppResolvers(ctx).getUserByClerkId(\n ctx,\n userId\n );\n if (!user) return false;\n\n // Identity bridge: mcRole preferred, isAdmin fallback\n if (user.mcRole) {\n return user.mcRole === \"platform_admin\" || user.mcRole === \"tenant_admin\";\n }\n return user.isAdmin === true;\n}\n\n// =============================================================================\n// TOPIC ACCESS\n// =============================================================================\n\n/**\n * Check if a user has access to a topic scope.\n *\n * Returns detailed access info including why access was granted.\n */\n/**\n * STACK_MC_AUTH_BYPASS: All authenticated Stack MC users get full access\n * until RBAC and topic-native grant matching are production-ready.\n * When RBAC is complete, remove this constant and the early-return below.\n */\nconst STACK_MC_AUTH_BYPASS = true;\n\nasync function evaluateTopicAccessDetailed(\n ctx: DbCtx,\n args: {\n topicId: string;\n legacyUserId: string;\n principalContext: ResolvedPrincipalContext;\n }\n): Promise<AccessCheckResult> {\n // Single bypass: authenticated users get full access until RBAC is ready\n if (STACK_MC_AUTH_BYPASS && args.legacyUserId) {\n return {\n hasAccess: true,\n isAdmin: false,\n isOwner: false,\n isShared: false,\n hasGrant: true,\n isFirmVisible: true,\n isExternalVisible: false,\n isPublicVisible: false,\n isTenantScopeMatch: true,\n isWorkspaceScopeMatch: true,\n isPrincipalExternal: false,\n };\n }\n\n const topic = await resolveAccessControlAppResolvers(ctx).getProject(\n ctx,\n args.topicId\n );\n if (!topic) {\n return {\n hasAccess: false,\n isAdmin: false,\n isOwner: false,\n isShared: false,\n hasGrant: false,\n isFirmVisible: false,\n isExternalVisible: false,\n isPublicVisible: false,\n isTenantScopeMatch: false,\n isWorkspaceScopeMatch: false,\n isPrincipalExternal: false,\n };\n }\n\n const { principalContext, legacyUserId } = args;\n const userIsAdmin = principalContext.isPlatformAdmin;\n const isOwner = topic.ownerId === legacyUserId;\n const isShared = (topic.sharedWith ?? []).includes(legacyUserId);\n const principalIsExternal = await isExternalPrincipal(ctx, {\n groupIds: principalContext.groupIds,\n topicTenantId: topic.tenantId,\n topicWorkspaceId: topic.workspaceId,\n });\n\n const hasPrincipalGrantResult = await hasPrincipalGrant(ctx, {\n topic,\n principalId: principalContext.principalId,\n principalIsExternal,\n });\n const hasGroupGrantResult = await hasGroupGrant(ctx, {\n topic,\n groupIds: principalContext.groupIds,\n });\n\n const hasGrant = isShared || hasPrincipalGrantResult || hasGroupGrantResult;\n const legacyUnscoped = isLegacyUnscopedTopic(topic);\n const tenantScopeMatch = isTopicInPrincipalTenant(\n topic,\n principalContext.tenantId\n );\n const workspaceScopeMatch = isTopicInPrincipalWorkspace(\n topic,\n principalContext.workspaceId\n );\n\n const isPublicVisible = topic.visibility === \"public\";\n const isFirmVisible =\n topic.visibility === \"firm\" &&\n !legacyUnscoped &&\n tenantScopeMatch &&\n workspaceScopeMatch &&\n !principalIsExternal;\n const hasScopedGrant =\n hasGrant && (legacyUnscoped || (tenantScopeMatch && workspaceScopeMatch));\n const isExternalVisible = topic.visibility === \"external\" && hasScopedGrant;\n\n const hasAccess =\n userIsAdmin ||\n isOwner ||\n hasScopedGrant ||\n isPublicVisible ||\n isFirmVisible;\n\n return {\n hasAccess,\n isAdmin: userIsAdmin,\n isOwner,\n isShared,\n hasGrant,\n isFirmVisible,\n isExternalVisible,\n isPublicVisible,\n isTenantScopeMatch: tenantScopeMatch,\n isWorkspaceScopeMatch: workspaceScopeMatch,\n isPrincipalExternal: principalIsExternal,\n };\n}\n\nexport async function checkTopicAccessDetailedWithPrincipalContext(\n ctx: DbCtx,\n topicId: string,\n principalContext: ResolvedPrincipalContext\n): Promise<AccessCheckResult> {\n return evaluateTopicAccessDetailed(ctx, {\n topicId,\n legacyUserId: principalContext.clerkId,\n principalContext,\n });\n}\n\nexport async function checkTopicAccessDetailed(\n ctx: DbCtx,\n topicId: string,\n userId: string\n): Promise<AccessCheckResult> {\n const principalContext = await resolvePrincipalContext(ctx, userId);\n return evaluateTopicAccessDetailed(ctx, {\n topicId,\n legacyUserId: userId,\n principalContext,\n });\n}\n\n/**\n * Check if a user has access to a topic scope (simple boolean).\n */\nexport async function checkTopicAccess(\n ctx: DbCtx,\n topicId: string,\n userId: string\n): Promise<boolean> {\n const result = await checkTopicAccessDetailed(ctx, topicId, userId);\n return result.hasAccess;\n}\n\nexport async function checkTopicAccessWithPrincipalContext(\n ctx: DbCtx,\n topicId: string,\n principalContext: ResolvedPrincipalContext\n): Promise<boolean> {\n const result = await checkTopicAccessDetailedWithPrincipalContext(\n ctx,\n topicId,\n principalContext\n );\n return result.hasAccess;\n}\n\n/**\n * Check if a user has access to a scope (topic or legacy project compatibility id).\n *\n * TC-C: topic-canonical access bridge. Tries to resolve the scopeId as a\n * topic first (from the topics table). If found, allows access for any\n * authenticated user (topic-level ACL will be added in TC-D).\n * Falls back to legacy project-based access checks for compatibility.\n */\nexport async function checkScopeAccess(\n ctx: DbCtx,\n scopeId: string,\n userId: string\n): Promise<boolean> {\n // Try as topic first — topics table uses string IDs\n try {\n const topic = await (ctx.db as any).get(scopeId);\n if (\n topic &&\n (topic as any).name !== undefined &&\n (topic as any).type !== undefined\n ) {\n // Valid topic — allow access for any authenticated user.\n // Full topic-level ACL (visibility, tenant ringfencing) deferred to TC-D.\n return true;\n }\n } catch {\n // Not a valid document ID for this deployment, try the legacy project scope.\n }\n\n // Fall back to the legacy project-based access check.\n try {\n return await checkTopicAccess(ctx, scopeId as string, userId);\n } catch {\n // Neither topic nor legacy project scope resolved — deny access.\n return false;\n }\n}\n\n/**\n * Require access to a topic scope, throws if not authorized.\n */\nexport async function requireTopicAccess(\n ctx: DbCtx,\n topicId: string,\n userId: string\n): Promise<void> {\n const hasAccess = await checkTopicAccess(ctx, topicId, userId);\n if (!hasAccess) {\n throw new Error(\n \"Access denied: You don't have permission to access this topic\"\n );\n }\n}\n\n/**\n * Get a topic record with access check.\n *\n * Returns the topic record if the user has access, null otherwise.\n */\nexport async function getTopicWithAccess(\n ctx: DbCtx,\n topicId: string,\n userId: string\n): Promise<TopicRecord | null> {\n const topic = await resolveAccessControlAppResolvers(ctx).getProject(\n ctx,\n topicId\n );\n if (!topic) {\n return null;\n }\n\n const hasAccess = await checkTopicAccess(ctx, topicId, userId);\n if (!hasAccess) {\n return null;\n }\n\n return topic as TopicRecord;\n}\n\n/** @deprecated Use checkTopicAccessDetailed. */\nexport const checkProjectAccessDetailed = checkTopicAccessDetailed;\n\n/** @deprecated Use checkTopicAccess. */\nexport const checkProjectAccess = checkTopicAccess;\n\n/** @deprecated Use requireTopicAccess. */\nexport const requireProjectAccess = requireTopicAccess;\n\n/** @deprecated Use getTopicWithAccess. */\nexport const getProjectWithAccess = getTopicWithAccess;\n\n// =============================================================================\n// RESOURCE ACCESS (for items with optional topic compatibility ids)\n// =============================================================================\n\n/**\n * Check if a user can access a resource that may or may not belong to a topic.\n */\nexport function checkResourceAccess(\n ctx: DbCtx,\n resource: ResourceWithTopic,\n userId: string\n): boolean | Promise<boolean> {\n const topicId = resource.topicId ?? resource.projectId;\n if (topicId) {\n return checkTopicAccess(ctx, topicId, userId);\n }\n\n // No topic - only creator can access.\n const creatorId = resource.userId ?? resource.createdBy;\n return creatorId === userId;\n}\n\n/**\n * Require access to a resource, throws if not authorized.\n */\nexport async function requireResourceAccess(\n ctx: DbCtx,\n resource: ResourceWithTopic,\n userId: string\n): Promise<void> {\n const hasAccess = await checkResourceAccess(ctx, resource, userId);\n if (!hasAccess) {\n throw new Error(\n \"Access denied: You don't have permission to access this resource\"\n );\n }\n}\n\n// =============================================================================\n// CONVENIENCE HELPERS\n// =============================================================================\n\n/**\n * Check if user can modify a resource (stricter than read access).\n *\n * For now, same as checkResourceAccess. In the future, this could be\n * extended to support read-only sharing.\n */\nexport function checkModifyAccess(\n ctx: DbCtx,\n resource: ResourceWithTopic,\n userId: string\n): boolean | Promise<boolean> {\n return checkResourceAccess(ctx, resource, userId);\n}\n\n/**\n * Check if user is the creator of a resource.\n */\nexport function isCreator(\n resource: { userId?: string; createdBy?: string },\n userId: string\n): boolean {\n const creatorId = resource.userId ?? resource.createdBy;\n return creatorId === userId;\n}\n\n/**\n * Build the accessible topic ID set for list-style queries.\n */\nexport async function getAccessibleTopicIds(\n ctx: DbCtx,\n userId: string\n): Promise<Set<string>> {\n const principalContext = await resolvePrincipalContext(ctx, userId);\n\n if (principalContext.isPlatformAdmin) {\n // Admins can access all topics.\n const allTopics =\n await resolveAccessControlAppResolvers(ctx).listTopics(ctx);\n return new Set(allTopics.map((topic) => topic._id));\n }\n\n const topicIds = new Set<string>();\n\n // Owned topics.\n const ownedTopics = await resolveAccessControlAppResolvers(\n ctx\n ).listTopicsByOwner(ctx, userId);\n for (const topic of ownedTopics) {\n topicIds.add(topic._id);\n }\n\n // Public topics.\n const publicTopics = await resolveAccessControlAppResolvers(\n ctx\n ).listTopicsByVisibility(ctx, \"public\");\n for (const topic of publicTopics) {\n topicIds.add(topic._id);\n }\n\n // Firm topics (tenant ringfenced, and hidden from principals in external groups).\n const principalIsExternal = await isExternalPrincipal(ctx, {\n groupIds: principalContext.groupIds,\n topicTenantId: principalContext.tenantId ?? undefined,\n topicWorkspaceId: principalContext.workspaceId ?? undefined,\n });\n if (!principalIsExternal) {\n const firmTopics = await resolveAccessControlAppResolvers(\n ctx\n ).listTopicsByVisibility(ctx, \"firm\");\n\n for (const topic of firmTopics) {\n if (\n isTopicInPrincipalTenant(topic, principalContext.tenantId) &&\n isTopicInPrincipalWorkspace(topic, principalContext.workspaceId)\n ) {\n topicIds.add(topic._id);\n }\n }\n }\n\n // Explicit principal grants\n const directGrants = await resolveAccessControlAppResolvers(\n ctx\n ).listProjectGrantsByPrincipalStatus(\n ctx,\n principalContext.principalId,\n \"active\"\n );\n\n for (const grant of directGrants) {\n if (!isGrantActive(grant as any)) {\n continue;\n }\n const topic = await resolveAccessControlAppResolvers(ctx).getProject(\n ctx,\n grant.projectId\n );\n if (!topic) {\n continue;\n }\n if (!isLegacyUnscopedTopic(topic)) {\n if (!isTopicInPrincipalTenant(topic, principalContext.tenantId)) {\n continue;\n }\n if (\n !isTopicInPrincipalWorkspace(topic, principalContext.workspaceId)\n ) {\n continue;\n }\n }\n if (!isGrantScopeAlignedToTopic(topic, grant)) {\n continue;\n }\n if (\n !isGrantSourceAllowedForVisibility(topic.visibility, grant.source)\n ) {\n continue;\n }\n if (\n principalIsExternal &&\n topic.visibility !== \"public\" &&\n grant.source !== \"external_share\"\n ) {\n continue;\n }\n topicIds.add(grant.projectId);\n }\n\n // Group grants — skipped in tenant-local context (groups live in MC).\n // principalContext.groupIds is [] when resolved locally.\n\n // Legacy shared-with list compatibility while grant backfill is in progress.\n const allTopics =\n await resolveAccessControlAppResolvers(ctx).listTopics(ctx);\n for (const topic of allTopics) {\n if (\n (topic.sharedWith ?? []).includes(userId) &&\n (isLegacyUnscopedTopic(topic) ||\n (isTopicInPrincipalTenant(topic, principalContext.tenantId) &&\n isTopicInPrincipalWorkspace(topic, principalContext.workspaceId)))\n ) {\n topicIds.add(topic._id);\n }\n }\n\n return topicIds;\n}\n\n/** @deprecated Use getAccessibleTopicIds. */\nexport const getAccessibleProjectIds = getAccessibleTopicIds;\n","/**\n * Audience Helpers\n *\n * Shared audience normalization and exposure-class utilities for policy/runtime paths.\n */\n\nexport type AudienceMode = \"internal\" | \"lp\" | \"public\";\nexport type AudienceClass = \"internal\" | \"restricted_external\" | \"public\";\n\nexport type ResolvedAudience = {\n audienceKey: string;\n audienceClass: AudienceClass;\n audienceMode: AudienceMode;\n};\n\nexport const AUDIENCE_CLASS_RANK: Record<AudienceClass, number> = {\n public: 0,\n restricted_external: 1,\n internal: 2,\n};\n\nfunction normalizeKey(key: string | undefined | null): string {\n return (key ?? \"\")\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9:_-]+/g, \"_\")\n .replace(/_+/g, \"_\")\n .replace(/^_+|_+$/g, \"\");\n}\n\nexport function normalizeAudienceKey(key: string | undefined | null): string {\n return normalizeKey(key);\n}\n\nexport function normalizeAudienceMode(\n mode: string | undefined | null\n): AudienceMode {\n if (mode === \"public\" || mode === \"lp\" || mode === \"internal\") {\n return mode;\n }\n return \"internal\";\n}\n\nexport function classFromAudienceMode(mode: AudienceMode): AudienceClass {\n if (mode === \"public\") {\n return \"public\";\n }\n if (mode === \"lp\") {\n return \"restricted_external\";\n }\n return \"internal\";\n}\n\nexport function modeFromAudienceClass(\n audienceClass: AudienceClass\n): AudienceMode {\n if (audienceClass === \"public\") {\n return \"public\";\n }\n if (audienceClass === \"restricted_external\") {\n return \"lp\";\n }\n return \"internal\";\n}\n\nexport function classFromAudienceKey(\n audienceKey: string | undefined | null,\n fallback: AudienceClass = \"internal\"\n): AudienceClass {\n const key = normalizeKey(audienceKey);\n if (!key) {\n return fallback;\n }\n if (key === \"internal\") {\n return \"internal\";\n }\n if (key === \"public\") {\n return \"public\";\n }\n if (\n key === \"lp\" ||\n key === \"external\" ||\n key === \"client\" ||\n key === \"partner\" ||\n key === \"portfolio\" ||\n key === \"network\" ||\n key === \"restricted_external\"\n ) {\n return \"restricted_external\";\n }\n return fallback;\n}\n\nexport function resolveAudience(args?: {\n audienceMode?: string | null;\n audienceKey?: string | null;\n audienceClass?: AudienceClass | null;\n}): ResolvedAudience {\n const fallbackMode = normalizeAudienceMode(args?.audienceMode);\n const fallbackKey = normalizeKey(args?.audienceKey) || fallbackMode;\n const fallbackClass =\n args?.audienceClass ?? classFromAudienceKey(fallbackKey);\n\n return {\n audienceKey: fallbackKey,\n audienceClass: fallbackClass,\n audienceMode: modeFromAudienceClass(fallbackClass),\n };\n}\n\nexport function canViewAudienceLabel(\n viewerAudience: string,\n resourceAudienceLabel: string | undefined | null\n): boolean {\n // Viewer fallback is least privilege; resource fallback is most restrictive.\n const viewerClass = classFromAudienceKey(viewerAudience, \"public\");\n const resourceClass = classFromAudienceKey(resourceAudienceLabel, \"internal\");\n return canAudienceClassAccess(viewerClass, resourceClass);\n}\n\nexport function canAudienceClassAccess(\n viewerClass: AudienceClass,\n resourceClass: AudienceClass\n): boolean {\n return AUDIENCE_CLASS_RANK[viewerClass] >= AUDIENCE_CLASS_RANK[resourceClass];\n}\n","/**\n * Audience Registry Kernel\n *\n * Tenant/workspace audience taxonomy resolution and principal audience-scope derivation.\n */\n\nimport {\n type AudienceClass,\n type AudienceMode,\n canAudienceClassAccess,\n classFromAudienceKey,\n classFromAudienceMode,\n modeFromAudienceClass,\n normalizeAudienceKey,\n normalizeAudienceMode,\n type ResolvedAudience,\n} from \"./audience\";\nimport type { MutationCtx, QueryCtx } from \"./convex\";\n\ntype DbCtx = QueryCtx | MutationCtx;\n\ntype AudienceRegistryRow = {\n audienceKey: string;\n audienceLabel: string;\n audienceClass: AudienceClass;\n workspaceId?: string;\n};\n\nconst DEFAULT_AUDIENCES: AudienceRegistryRow[] = [\n {\n audienceKey: \"internal\",\n audienceLabel: \"Internal\",\n audienceClass: \"internal\",\n },\n {\n audienceKey: \"lp\",\n audienceLabel: \"Limited Partners\",\n audienceClass: \"restricted_external\",\n },\n {\n audienceKey: \"public\",\n audienceLabel: \"Public\",\n audienceClass: \"public\",\n },\n];\n\nconst AUDIENCE_CLASS_PRIORITY: Record<AudienceClass, number> = {\n internal: 0,\n restricted_external: 1,\n public: 2,\n};\n\nexport type AllowedAudienceScope = {\n allowedAudienceClasses: AudienceClass[];\n allowedAudienceKeys: string[];\n allowedAudienceModes: AudienceMode[];\n};\n\nexport type PrincipalAudienceScope = {\n mode: \"legacy_open\" | \"grant_enforced\" | \"admin_override\";\n grantModelEnabled: boolean;\n grantedAudienceKeys: string[];\n grantedAudienceClasses: AudienceClass[];\n allowedAudienceKeys: string[];\n allowedAudienceClasses: AudienceClass[];\n allowedAudienceModes: AudienceMode[];\n};\n\nexport function deriveAllowedAudienceClasses(\n visibility: string | undefined | null\n): AudienceClass[] {\n if (visibility === \"public\") {\n return [\"internal\", \"restricted_external\", \"public\"];\n }\n if (visibility === \"firm\" || visibility === \"external\") {\n return [\"internal\", \"restricted_external\"];\n }\n return [\"internal\"];\n}\n\nfunction unique<T>(items: T[]): T[] {\n return [...new Set(items)];\n}\n\nfunction intersect<T>(left: T[], right: T[]): T[] {\n const rightSet = new Set(right);\n return left.filter((entry) => rightSet.has(entry));\n}\n\nfunction fallbackAudienceKeyForClass(audienceClass: AudienceClass): string {\n if (audienceClass === \"public\") {\n return \"public\";\n }\n if (audienceClass === \"restricted_external\") {\n return \"lp\";\n }\n return \"internal\";\n}\n\nfunction normalizeRegistryRow(row: {\n audienceKey: string;\n audienceLabel: string;\n audienceClass: AudienceClass;\n workspaceId?: string;\n}): AudienceRegistryRow {\n return {\n audienceKey: normalizeAudienceKey(row.audienceKey),\n audienceLabel: row.audienceLabel,\n audienceClass: row.audienceClass,\n workspaceId: row.workspaceId,\n };\n}\n\nfunction dedupeRegistryRows(\n rows: AudienceRegistryRow[]\n): AudienceRegistryRow[] {\n const byKey = new Map<string, AudienceRegistryRow>();\n\n for (const row of rows) {\n const key = normalizeAudienceKey(row.audienceKey);\n if (!key) {\n continue;\n }\n const existing = byKey.get(key);\n const isWorkspaceScoped = row.workspaceId !== undefined;\n const existingWorkspaceScoped = existing?.workspaceId !== undefined;\n\n if (!existing || (isWorkspaceScoped && !existingWorkspaceScoped)) {\n byKey.set(key, {\n ...row,\n audienceKey: key,\n });\n }\n }\n\n const normalized = [...byKey.values()];\n normalized.sort((a, b) => {\n const classDelta =\n AUDIENCE_CLASS_PRIORITY[a.audienceClass] -\n AUDIENCE_CLASS_PRIORITY[b.audienceClass];\n if (classDelta !== 0) {\n return classDelta;\n }\n return a.audienceKey.localeCompare(b.audienceKey);\n });\n return normalized;\n}\n\nfunction isGrantActive(grant: {\n status: \"active\" | \"revoked\" | \"expired\";\n expiresAt?: number;\n}): boolean {\n if (grant.status !== \"active\") {\n return false;\n }\n if (grant.expiresAt !== undefined && grant.expiresAt <= Date.now()) {\n return false;\n }\n return true;\n}\n\nfunction isWorkspaceScopeMatch(args: {\n rowWorkspaceId?: string;\n workspaceId?: string | null;\n}): boolean {\n if (!args.rowWorkspaceId) {\n return true;\n }\n if (!args.workspaceId) {\n return false;\n }\n return String(args.rowWorkspaceId) === String(args.workspaceId);\n}\n\nasync function queryRegistryRows(\n ctx: DbCtx,\n args: {\n tenantId?: string | null;\n workspaceId?: string | null;\n }\n): Promise<AudienceRegistryRow[]> {\n if (!args.tenantId) {\n return [...DEFAULT_AUDIENCES];\n }\n\n const rows = await ctx.db\n .query(\"platformAudiences\")\n .withIndex(\"by_tenantId\", (q) => q.eq(\"tenantId\", args.tenantId!))\n .collect();\n\n const workspaceIdString = args.workspaceId ? String(args.workspaceId) : null;\n const tenantScoped = rows.filter((row) => row.status === \"active\");\n const applicable = tenantScoped.filter((row) => {\n if (!row.workspaceId) {\n return true;\n }\n if (!workspaceIdString) {\n return false;\n }\n return String(row.workspaceId) === workspaceIdString;\n });\n\n return dedupeRegistryRows([\n ...DEFAULT_AUDIENCES,\n ...applicable.map((row) =>\n normalizeRegistryRow({\n audienceKey: row.audienceKey,\n audienceLabel: row.audienceLabel,\n audienceClass: row.audienceClass,\n workspaceId: row.workspaceId,\n })\n ),\n ]);\n}\n\nexport async function listAudienceRegistryRows(\n ctx: DbCtx,\n args: {\n tenantId?: string | null;\n workspaceId?: string | null;\n }\n): Promise<AudienceRegistryRow[]> {\n return queryRegistryRows(ctx, args);\n}\n\nexport async function resolveAudienceFromRegistry(\n ctx: DbCtx,\n args: {\n tenantId?: string | null;\n workspaceId?: string | null;\n audienceMode?: string | null;\n audienceKey?: string | null;\n audienceClass?: AudienceClass | null;\n }\n): Promise<ResolvedAudience> {\n const normalizedMode = normalizeAudienceMode(args.audienceMode);\n const requestedKey =\n normalizeAudienceKey(args.audienceKey) ||\n normalizeAudienceKey(normalizedMode) ||\n \"internal\";\n const registry = await queryRegistryRows(ctx, {\n tenantId: args.tenantId,\n workspaceId: args.workspaceId,\n });\n\n const registryMatch = registry.find(\n (entry) => normalizeAudienceKey(entry.audienceKey) === requestedKey\n );\n if (registryMatch) {\n return {\n audienceKey: requestedKey,\n audienceClass: registryMatch.audienceClass,\n audienceMode: modeFromAudienceClass(registryMatch.audienceClass),\n };\n }\n\n if (args.audienceClass) {\n return {\n audienceKey: requestedKey,\n audienceClass: args.audienceClass,\n audienceMode: modeFromAudienceClass(args.audienceClass),\n };\n }\n\n if (args.audienceKey) {\n return {\n audienceKey: requestedKey,\n audienceClass: \"internal\",\n audienceMode: \"internal\",\n };\n }\n\n return {\n audienceKey: requestedKey,\n audienceClass: classFromAudienceMode(normalizedMode),\n audienceMode: normalizedMode,\n };\n}\n\nexport async function resolveAudienceClassFromRegistry(\n ctx: DbCtx,\n args: {\n tenantId?: string | null;\n workspaceId?: string | null;\n audienceKey?: string | null;\n fallbackClass?: AudienceClass;\n }\n): Promise<AudienceClass> {\n const normalizedKey = normalizeAudienceKey(args.audienceKey);\n if (!normalizedKey) {\n return args.fallbackClass ?? \"internal\";\n }\n\n const registry = await queryRegistryRows(ctx, {\n tenantId: args.tenantId,\n workspaceId: args.workspaceId,\n });\n const match = registry.find(\n (entry) => normalizeAudienceKey(entry.audienceKey) === normalizedKey\n );\n if (match) {\n return match.audienceClass;\n }\n\n return classFromAudienceKey(normalizedKey, args.fallbackClass ?? \"internal\");\n}\n\nexport async function canViewAudienceLabelWithRegistry(\n ctx: DbCtx,\n args: {\n tenantId?: string | null;\n workspaceId?: string | null;\n viewerAudienceKey?: string | null;\n resourceAudienceKey?: string | null;\n }\n): Promise<boolean> {\n const viewerClass = await resolveAudienceClassFromRegistry(ctx, {\n tenantId: args.tenantId,\n workspaceId: args.workspaceId,\n audienceKey: args.viewerAudienceKey,\n fallbackClass: \"public\",\n });\n const resourceClass = await resolveAudienceClassFromRegistry(ctx, {\n tenantId: args.tenantId,\n workspaceId: args.workspaceId,\n audienceKey: args.resourceAudienceKey,\n fallbackClass: \"internal\",\n });\n return canAudienceClassAccess(viewerClass, resourceClass);\n}\n\nexport async function resolveAllowedAudienceScopeForVisibility(\n ctx: DbCtx,\n args: {\n tenantId?: string | null;\n workspaceId?: string | null;\n visibility?: string | null;\n }\n): Promise<AllowedAudienceScope> {\n const allowedAudienceClasses = deriveAllowedAudienceClasses(args.visibility);\n const registry = await queryRegistryRows(ctx, {\n tenantId: args.tenantId,\n workspaceId: args.workspaceId,\n });\n\n const allowedAudienceKeys = unique(\n registry\n .filter((entry) => allowedAudienceClasses.includes(entry.audienceClass))\n .map((entry) => normalizeAudienceKey(entry.audienceKey))\n .filter(Boolean)\n );\n\n const fallbackKeys = allowedAudienceClasses.map(fallbackAudienceKeyForClass);\n const mergedKeys = unique([...allowedAudienceKeys, ...fallbackKeys]);\n const allowedAudienceModes = unique(\n allowedAudienceClasses.map((audienceClass) =>\n modeFromAudienceClass(audienceClass)\n )\n );\n\n return {\n allowedAudienceClasses,\n allowedAudienceKeys: mergedKeys,\n allowedAudienceModes,\n };\n}\n\nexport async function resolvePrincipalAudienceScope(\n ctx: DbCtx,\n args: {\n tenantId?: string | null;\n workspaceId?: string | null;\n principalId: string;\n groupIds: string[];\n isPrivileged: boolean;\n }\n): Promise<PrincipalAudienceScope> {\n const registry = await queryRegistryRows(ctx, {\n tenantId: args.tenantId,\n workspaceId: args.workspaceId,\n });\n const registryKeys = unique(\n registry.map((row) => normalizeAudienceKey(row.audienceKey)).filter(Boolean)\n );\n const registryClasses = unique(registry.map((row) => row.audienceClass));\n\n if (!args.tenantId) {\n return {\n mode: \"legacy_open\",\n grantModelEnabled: false,\n grantedAudienceKeys: [\"internal\"],\n grantedAudienceClasses: [\"internal\"],\n allowedAudienceKeys: registryKeys,\n allowedAudienceClasses: registryClasses,\n allowedAudienceModes: registryClasses.map((entry) =>\n modeFromAudienceClass(entry)\n ),\n };\n }\n\n const tenantGrants = await ctx.db\n .query(\"platformAudienceGrants\")\n .withIndex(\"by_tenant_audienceKey\", (q) => q.eq(\"tenantId\", args.tenantId!))\n .collect();\n\n const activeTenantGrants = tenantGrants.filter((grant) => {\n if (!isGrantActive(grant as any)) {\n return false;\n }\n return isWorkspaceScopeMatch({\n rowWorkspaceId: grant.workspaceId,\n workspaceId: args.workspaceId,\n });\n });\n const grantModelEnabled = activeTenantGrants.length > 0;\n\n if (args.isPrivileged) {\n return {\n mode: \"admin_override\",\n grantModelEnabled,\n grantedAudienceKeys: registryKeys,\n grantedAudienceClasses: registryClasses,\n allowedAudienceKeys: registryKeys,\n allowedAudienceClasses: registryClasses,\n allowedAudienceModes: registryClasses.map((entry) =>\n modeFromAudienceClass(entry)\n ),\n };\n }\n\n if (!grantModelEnabled) {\n return {\n mode: \"legacy_open\",\n grantModelEnabled: false,\n grantedAudienceKeys: [\"internal\"],\n grantedAudienceClasses: [\"internal\"],\n allowedAudienceKeys: registryKeys,\n allowedAudienceClasses: registryClasses,\n allowedAudienceModes: registryClasses.map((entry) =>\n modeFromAudienceClass(entry)\n ),\n };\n }\n\n const directGrants = await ctx.db\n .query(\"platformAudienceGrants\")\n .withIndex(\"by_tenant_principal\", (q) =>\n q.eq(\"tenantId\", args.tenantId!).eq(\"principalId\", args.principalId)\n )\n .collect();\n\n const groupGrants: Array<{\n audienceKey: string;\n audienceClass: AudienceClass;\n status: \"active\" | \"revoked\" | \"expired\";\n expiresAt?: number;\n workspaceId?: string;\n }> = [];\n for (const groupId of args.groupIds) {\n const rows = await ctx.db\n .query(\"platformAudienceGrants\")\n .withIndex(\"by_tenant_group\", (q) =>\n q.eq(\"tenantId\", args.tenantId!).eq(\"groupId\", groupId)\n )\n .collect();\n groupGrants.push(...(rows as any));\n }\n\n const activeGrantRows = [...directGrants, ...groupGrants].filter((grant) => {\n if (!isGrantActive(grant as any)) {\n return false;\n }\n return isWorkspaceScopeMatch({\n rowWorkspaceId: grant.workspaceId,\n workspaceId: args.workspaceId,\n });\n });\n\n const registryKeySet = new Set(registryKeys);\n const grantedAudienceKeys = unique(\n activeGrantRows\n .map((grant) => normalizeAudienceKey(grant.audienceKey))\n .filter((key) => key && registryKeySet.has(key))\n );\n const grantedAudienceClasses = unique(\n activeGrantRows\n .map((grant) => grant.audienceClass)\n .filter((entry): entry is AudienceClass => Boolean(entry))\n );\n\n const allowedAudienceKeys = unique([\n \"internal\",\n ...grantedAudienceKeys,\n ]).filter((key) => key === \"internal\" || registryKeySet.has(key));\n const allowedAudienceClasses = unique<AudienceClass>([\n \"internal\",\n ...grantedAudienceClasses,\n ...allowedAudienceKeys.map((key): AudienceClass => {\n const registryMatch = registry.find(\n (row) => normalizeAudienceKey(row.audienceKey) === key\n );\n return registryMatch?.audienceClass ?? classFromAudienceMode(\"internal\");\n }),\n ]);\n\n return {\n mode: \"grant_enforced\",\n grantModelEnabled: true,\n grantedAudienceKeys: unique([\"internal\", ...grantedAudienceKeys]),\n grantedAudienceClasses: unique([\"internal\", ...grantedAudienceClasses]),\n allowedAudienceKeys,\n allowedAudienceClasses,\n allowedAudienceModes: unique(\n allowedAudienceClasses.map((entry) => modeFromAudienceClass(entry))\n ),\n };\n}\n\nexport function intersectAudienceScopes(\n visibilityScope: AllowedAudienceScope,\n principalScope: PrincipalAudienceScope\n): AllowedAudienceScope {\n const allowedAudienceClasses = intersect(\n visibilityScope.allowedAudienceClasses,\n principalScope.allowedAudienceClasses\n );\n const allowedAudienceKeys = intersect(\n visibilityScope.allowedAudienceKeys.map((entry) =>\n normalizeAudienceKey(entry)\n ),\n principalScope.allowedAudienceKeys.map((entry) =>\n normalizeAudienceKey(entry)\n )\n ).filter(Boolean);\n const mergedClasses = unique(allowedAudienceClasses);\n const mergedKeys = unique(allowedAudienceKeys);\n\n return {\n allowedAudienceClasses: mergedClasses,\n allowedAudienceKeys: mergedKeys,\n allowedAudienceModes: unique(\n mergedClasses.map((audienceClass) => modeFromAudienceClass(audienceClass))\n ),\n };\n}\n\nexport async function ensureDefaultAudienceRegistry(\n ctx: MutationCtx,\n args: {\n tenantId: string;\n actorPrincipalId: string;\n }\n): Promise<{\n inserted: number;\n updated: number;\n}> {\n const now = Date.now();\n let inserted = 0;\n let updated = 0;\n\n for (const seed of DEFAULT_AUDIENCES) {\n const existing = await ctx.db\n .query(\"platformAudiences\")\n .withIndex(\"by_tenant_audienceKey\", (q) =>\n q.eq(\"tenantId\", args.tenantId).eq(\"audienceKey\", seed.audienceKey)\n )\n .collect();\n\n const tenantScoped = existing.find((row) => row.workspaceId === undefined);\n if (!tenantScoped) {\n await ctx.db.insert(\"platformAudiences\", {\n tenantId: args.tenantId,\n audienceKey: seed.audienceKey,\n audienceLabel: seed.audienceLabel,\n audienceClass: seed.audienceClass,\n status: \"active\",\n createdBy: args.actorPrincipalId,\n createdAt: now,\n updatedAt: now,\n });\n inserted += 1;\n continue;\n }\n\n const needsPatch =\n tenantScoped.status !== \"active\" ||\n tenantScoped.audienceLabel !== seed.audienceLabel ||\n tenantScoped.audienceClass !== seed.audienceClass;\n if (!needsPatch) {\n continue;\n }\n\n await ctx.db.patch(tenantScoped._id, {\n audienceLabel: seed.audienceLabel,\n audienceClass: seed.audienceClass,\n status: \"active\",\n updatedAt: now,\n });\n updated += 1;\n }\n\n return { inserted, updated };\n}\n","/**\n * auth module implementation.\n */\n\nimport type { ActionCtx, MutationCtx, QueryCtx } from \"./convex\";\n\ntype AnyCtx = QueryCtx | MutationCtx | ActionCtx;\n\n/**\n * Get the current user's identity from Clerk.\n */\nexport async function getCurrentUser(ctx: AnyCtx) {\n const identity = await ctx.auth.getUserIdentity();\n return identity;\n}\n\n/**\n * Get the current user ID (Clerk subject).\n */\nexport async function getCurrentUserId(ctx: AnyCtx): Promise<string | null> {\n const identity = await ctx.auth.getUserIdentity();\n return identity?.subject ?? null;\n}\n","/**\n * validators module implementation.\n */\n\nimport { v } from \"convex/values\";\n\n/**\n * Permissive return validator used while contracts are tightened.\n */\nexport const permissiveReturn: any = v.optional(v.any());\n\n/**\n * Shallow JSON validators for dynamic payloads.\n */\nexport const looseJsonObject = v.record(v.string(), v.any());\nexport const looseJsonArray = v.array(v.any());\nexport const looseJsonValue = v.union(\n v.string(),\n v.number(),\n v.boolean(),\n v.null(),\n looseJsonObject,\n looseJsonArray\n);\n","import {\n actionGeneric,\n anyApi,\n componentsGeneric,\n httpActionGeneric,\n internalActionGeneric,\n internalMutationGeneric,\n internalQueryGeneric,\n mutationGeneric,\n queryGeneric,\n} from \"convex/server\";\nimport type { GenericId } from \"convex/values\";\n\nexport const api = anyApi as any;\nexport const components = componentsGeneric() as any;\nexport const internal = anyApi as any;\n\nexport type TableNames = string;\nexport type Id<TableName extends TableNames = string> = GenericId<TableName>;\nexport type Doc<TableName extends TableNames = string> = any;\nexport type DataModel = any;\nexport type ActionCtx = any;\nexport type DatabaseReader = any;\nexport type DatabaseWriter = any;\nexport type MutationCtx = any;\nexport type QueryCtx = any;\n\nexport const action = actionGeneric as any;\nexport const httpAction = httpActionGeneric as any;\nexport const internalAction = internalActionGeneric as any;\nexport const internalMutation = internalMutationGeneric as any;\nexport const internalQuery = internalQueryGeneric as any;\nexport const mutation = mutationGeneric as any;\nexport const query = queryGeneric as any;\n","/**\n * Shared helper to schedule embedding generation after epistemic node creation.\n *\n * Best-effort — failures are silently caught. The embedding generation action\n * is a public action in convex/embeddingActions.ts that calls Pinecone.\n */\n\nimport type { Id } from \"./convex\";\n\ninterface EmbeddingTriggerArgs {\n ctx: any;\n nodeId: Id<\"epistemicNodes\">;\n projectId?: string | null;\n topicId?: string | null;\n createdBy: string;\n nodeType:\n | \"belief\"\n | \"question\"\n | \"evidence\"\n | \"answer\"\n | \"synthesis\"\n | \"theme\"\n | \"source\";\n text: string;\n hasAnswer?: boolean;\n confidence?: number;\n}\n\nexport async function scheduleEmbeddingGeneration(args: EmbeddingTriggerArgs): Promise<void> {\n try {\n await args.ctx.scheduler.runAfter(\n 0,\n \"embeddingActions:generateEpistemicNodeEmbedding\" as any,\n {\n nodeId: args.nodeId,\n projectId: args.projectId ? String(args.projectId) : undefined,\n topicId: args.topicId ? String(args.topicId) : undefined,\n createdBy: args.createdBy,\n nodeType: args.nodeType,\n text: args.text.slice(0, 20_000),\n hasAnswer: args.hasAnswer,\n confidence: args.confidence,\n }\n );\n } catch {\n // Embedding generation is best-effort — never block node creation\n }\n}\n","/**\n * Shared UUID v4 generator for global IDs.\n *\n * Uses crypto.getRandomValues() for collision-safe generation.\n * Replaces the Math.random()-based UUID pattern that was duplicated\n * across 7+ files.\n *\n * @module convex/lib/globalId\n */\n\n/**\n * Generate a UUID v4 global ID using crypto-safe random bytes.\n */\nexport function generateGlobalId(): string {\n const bytes = new Uint8Array(16);\n crypto.getRandomValues(bytes);\n // Set version (4) and variant (RFC 4122)\n bytes[6] = (bytes[6] & 0x0f) | 0x40;\n bytes[8] = (bytes[8] & 0x3f) | 0x80;\n const hex = Array.from(bytes, (b) => b.toString(16).padStart(2, \"0\")).join(\n \"\"\n );\n return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;\n}\n","import { api } from \"./convex\";\n\ntype OverlayIdMode = \"legacy\" | \"topic\";\nconst LEGACY_SCOPE_FIELD = \"graphScope\" + \"ProjectId\";\n\ntype LegacyProjectThesis = {\n statement: string;\n confidence: number;\n lastUpdated: number;\n};\n\ntype LegacyPillarImportance =\n | \"critical\"\n | \"major\"\n | \"minor\"\n | \"not_applicable\";\n\ntype LegacyThesisPillarConfig = {\n pillarImportance?: Record<string, LegacyPillarImportance | undefined>;\n configuredAt?: number;\n configuredBy?: string;\n aiSuggestion?: {\n suggestedAt: number;\n reasoning: string;\n };\n};\n\ntype LegacyBeliefArchitecture = {\n overallMaturity: number;\n pillarScores: Array<Record<string, unknown>>;\n lastCalculated: number;\n};\n\ntype LegacyOntologyClassification = {\n valueChains: Array<Record<string, unknown>>;\n functions: Array<Record<string, unknown>>;\n overallConfidence: number;\n classifiedAt: number;\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 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 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\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 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 = error instanceof Error ? error.message : String(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\nasync function resolveTopicDoc(\n ctx: any,\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(scopeId as any)) as TopicDocLike | null;\n if (directTopic) {\n return directTopic;\n }\n } catch {\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(api.topics.get as any, {\n id: String(scopeId),\n });\n if (topic?.name !== undefined && topic?.type !== undefined) {\n return topic as TopicDocLike;\n }\n } catch {\n // Fall through to legacy-scope lookup.\n }\n\n try {\n const topic = await ctx.runQuery(api.topics.getByLegacyScopeId as any, {\n projectId: String(scopeId),\n });\n if (topic?.name !== undefined && topic?.type !== undefined) {\n return topic as TopicDocLike;\n }\n } catch {\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 const createdAt =\n typeof topic.createdAt === \"number\"\n ? topic.createdAt\n : typeof topic._creationTime === \"number\"\n ? topic._creationTime\n : 0;\n const updatedAt =\n typeof topic.updatedAt === \"number\"\n ? topic.updatedAt\n : typeof metadata.updatedAt === \"number\"\n ? (metadata.updatedAt as number)\n : createdAt;\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 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\" ? (metadata.chatCount as number) : 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: any,\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: any,\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 {\n allTopics = [];\n }\n }\n\n if (allTopics.length === 0 && typeof ctx.runQuery === \"function\") {\n allTopics =\n (((await ctx.runQuery(api.topics.list as any, {})) ?? []) 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: any,\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 nextMetadata = { ...readMetadata(topic) };\n const patch: Record<string, unknown> = {};\n const topicUpdateArgs: Record<string, unknown> = {\n id: String(topic._id),\n };\n\n for (const [key, rawValue] of Object.entries(value)) {\n switch (key) {\n case \"_id\":\n case \"projectId\":\n case \"topicId\":\n case \"legacyProjectId\":\n case \"storageProjectId\":\n break;\n case \"name\":\n case \"description\":\n patch[key] = rawValue;\n topicUpdateArgs[key] = rawValue;\n break;\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 const status = coerceStatus(rawValue);\n if (status) {\n patch.status = status;\n topicUpdateArgs.status = status;\n }\n break;\n }\n case \"visibility\": {\n const visibility = coerceVisibility(rawValue);\n if (visibility) {\n patch.visibility = visibility;\n topicUpdateArgs.visibility = visibility;\n }\n break;\n }\n case \"type\": {\n const projectType = readNonEmptyString(rawValue);\n if (projectType) {\n nextMetadata.projectType = projectType;\n } else {\n delete nextMetadata.projectType;\n }\n break;\n }\n case \"updatedAt\":\n case \"createdAt\":\n break;\n default:\n if (rawValue === undefined) {\n delete nextMetadata[key];\n } else {\n nextMetadata[key] = rawValue;\n }\n }\n }\n\n patch.updatedAt = Date.now();\n patch.metadata = nextMetadata;\n topicUpdateArgs.metadata = nextMetadata;\n\n if (typeof ctx.runMutation === \"function\") {\n try {\n await ctx.runMutation(api.topics.update as any, topicUpdateArgs);\n } catch (error) {\n if (\n !isMissingLucernChildComponentError(error) ||\n !ctx?.db ||\n typeof ctx.db.patch !== \"function\"\n ) {\n throw error;\n }\n await ctx.db.patch(String(topic._id) as any, patch);\n }\n } else if (ctx?.db && typeof ctx.db.patch === \"function\") {\n await ctx.db.patch(String(topic._id) as any, patch);\n } else {\n throw new Error(\n \"Cannot patch topic without component adapter (ctx.runMutation unavailable)\"\n );\n }\n\n return materializeTopicProjectOverlay(\n {\n ...topic,\n ...patch,\n metadata: nextMetadata,\n } as TopicDocLike\n );\n}\n\nexport function matchesTopicProjectOverlayAccess(\n accessibleProjectIds: Set<string>,\n project: { topicId: string; legacyProjectId?: string; storageProjectId?: string }\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. */\nimport {\n listTopicProjectOverlays,\n patchTopicProjectOverlay,\n resolveTopicProjectOverlay,\n} from \"./topicProjectOverlay\";\nimport type {\n GraphPrimitivesAppResolverContext,\n GraphPrimitivesAppResolvers,\n} from \"./resolverTypes\";\n\nfunction isMissingLucernChildComponentError(error: unknown): boolean {\n const message = error instanceof Error ? error.message : String(error);\n return (\n message.includes('Child component ComponentName(Identifier(\"lucern\")) not found') ||\n (message.includes(\"Child component\") &&\n message.includes(\"lucern\") &&\n message.includes(\"not found\"))\n );\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 !isAdvisoryTopicPatch(value) ||\n !isMissingLucernChildComponentError(error)\n ) {\n throw error;\n }\n\n console.warn(\"[lucern graph-primitives] Non-fatal advisory topic patch failure\", {\n projectId,\n keys: Object.keys(value),\n error: error instanceof Error ? error.message : error,\n });\n }\n}\n\nfunction defaultResolvers(): GraphPrimitivesAppResolvers {\n return {\n async getProject(ctx, projectId) {\n return await resolveTopicProjectOverlay(ctx, projectId, {\n idMode: \"legacy\",\n projectLikeOnly: false,\n });\n },\n async patchProject(ctx, projectId, value) {\n await patchProjectWithTolerance(ctx, projectId, value);\n },\n async listTopics(ctx) {\n return await listTopicProjectOverlays(ctx, {\n idMode: \"legacy\",\n });\n },\n async getFinalArtifact(ctx, artifactId) {\n return await ctx.db.get(artifactId);\n },\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","/** Topic-scope resolution helpers for graph-primitive operations. */\nimport { v } from \"convex/values\";\nimport { api as appApi } from \"./convex\";\nimport type { Id } from \"./convex\";\n\nconst LEGACY_SCOPE_FIELD = \"graphScope\" + \"ProjectId\";\n\ntype TopicDoc = Record<string, unknown> & {\n _id: Id<\"topics\">;\n globalId?: string;\n name?: string;\n depth?: number;\n createdAt?: number;\n parentTopicId?: Id<\"topics\">;\n tenantId?: string;\n workspaceId?: string;\n metadata?: Record<string, unknown>;\n};\n\nexport type TopicProjectScope = {\n topicId: Id<\"topics\">;\n projectId?: string;\n tenantId?: string;\n workspaceId?: string;\n source: \"topic\" | \"project_mapped_topic\" | \"topic_inferred\";\n};\n\ntype MaterializedTopicNodeDoc = {\n _id: string | Id<\"epistemicNodes\">;\n metadata?: Record<string, unknown>;\n};\n\nfunction asMappedProjectId(\n topic: TopicDoc | null | undefined\n): string | undefined {\n if (!topic) {\n return;\n }\n const directLegacyProjectId = normalizeScopeValue(topic[LEGACY_SCOPE_FIELD]);\n if (directLegacyProjectId) {\n return directLegacyProjectId;\n }\n const metadata = (topic.metadata || {}) as Record<string, unknown>;\n const candidate =\n (metadata[LEGACY_SCOPE_FIELD] as string | undefined) ||\n (metadata.legacyProjectId as string | undefined) ||\n (metadata.projectId as string | undefined) ||\n (metadata.scopeProjectId as string | undefined);\n return candidate ? (candidate as string) : undefined;\n}\n\nfunction normalizeScopeValue(value: unknown): string | undefined {\n if (typeof value !== \"string\") {\n return;\n }\n const normalized = value.trim();\n return normalized.length > 0 ? normalized : undefined;\n}\n\nfunction pickPrimaryTopic(candidates: TopicDoc[]): TopicDoc | undefined {\n return [...candidates].sort((a, b) => {\n const depthA = a.depth ?? 9999;\n const depthB = b.depth ?? 9999;\n if (depthA !== depthB) {\n return depthA - depthB;\n }\n const createdA = a.createdAt ?? Number.MAX_SAFE_INTEGER;\n const createdB = b.createdAt ?? Number.MAX_SAFE_INTEGER;\n if (createdA !== createdB) {\n return createdA - createdB;\n }\n return String(a.name || \"\").localeCompare(String(b.name || \"\"));\n })[0];\n}\n\nasync function findTopicsByScopeAlias(ctx: any, scopeId: string): Promise<TopicDoc[]> {\n try {\n return (await ctx.db\n .query(\"topics\")\n .withIndex(\"by_graph_scope_project\", (q: any) =>\n q.eq(LEGACY_SCOPE_FIELD, scopeId)\n )\n .collect()) as TopicDoc[];\n } catch {\n // Older Lucern dev deployments can lag index backfills while still carrying\n // the underlying topics table. Scan and filter so scope resolution keeps\n // working during the rollout.\n const topics = (await ctx.db.query(\"topics\").collect()) as TopicDoc[];\n return topics.filter((topic) => {\n const normalizedGlobalId = normalizeScopeValue(topic.globalId);\n const mappedProjectId = asMappedProjectId(topic);\n return (\n String(topic._id) === scopeId ||\n normalizedGlobalId === scopeId ||\n mappedProjectId === scopeId\n );\n });\n }\n}\n\nasync function tryResolveHostTopicById(\n ctx: any,\n topicId: string\n): Promise<TopicDoc | null> {\n if (typeof ctx.runQuery !== \"function\") {\n return null;\n }\n try {\n return ((await ctx.runQuery(appApi.topics.get as any, {\n id: topicId,\n })) ?? null) as TopicDoc | null;\n } catch {\n return null;\n }\n}\n\nasync function tryResolveHostTopicByLegacyScope(\n ctx: any,\n legacyScopeId: string\n): Promise<TopicDoc | null> {\n if (typeof ctx.runQuery !== \"function\") {\n return null;\n }\n try {\n return ((await ctx.runQuery(appApi.topics.getByLegacyScopeId as any, {\n projectId: legacyScopeId,\n })) ?? null) as TopicDoc | null;\n } catch {\n return null;\n }\n}\n\nexport function readMaterializedTopicTableId(\n topicNode: MaterializedTopicNodeDoc | null | undefined\n): string | undefined {\n if (!topicNode) {\n return;\n }\n\n const metadata = (topicNode.metadata || {}) as Record<string, unknown>;\n const topicTableId =\n (metadata.topicTableId as string | undefined) ||\n (metadata.topicId as string | undefined);\n\n return typeof topicTableId === \"string\" && topicTableId.trim().length > 0\n ? topicTableId.trim()\n : undefined;\n}\n\n/**\n * Walk the topic parent chain to find inherited workspaceId and tenantId.\n * Mirrors the pattern used by resolveTopicOntology for ontologyId inheritance.\n * Max depth: 10 (defensive limit against pathological nesting).\n */\nasync function resolveInheritedWorkspaceScope(\n ctx: any,\n topic: TopicDoc\n): Promise<{ tenantId?: string; workspaceId?: string }> {\n const MAX_DEPTH = 10;\n let tenantId = normalizeScopeValue(topic.tenantId);\n let workspaceId = normalizeScopeValue(topic.workspaceId);\n\n if (tenantId && workspaceId) {\n return { tenantId, workspaceId };\n }\n\n let current: TopicDoc | null = topic;\n for (let i = 0; i < MAX_DEPTH && current?.parentTopicId; i++) {\n current = (await ctx.db.get(current.parentTopicId)) as TopicDoc | null;\n if (!current) break;\n\n if (!tenantId) {\n tenantId = normalizeScopeValue(current.tenantId);\n }\n if (!workspaceId) {\n workspaceId = normalizeScopeValue(current.workspaceId);\n }\n if (tenantId && workspaceId) break;\n }\n\n return { tenantId, workspaceId };\n}\n\nexport async function resolveTopicProjectScope(\n ctx: any,\n args: { topicId?: Id<\"topics\"> | string; projectId?: string }\n): Promise<TopicProjectScope> {\n if (args.topicId) {\n // Try direct lookup, fall back to the legacy mapped-project bridge\n let topic: TopicDoc | null = null;\n try {\n topic = (await ctx.db.get(args.topicId as Id<\"topics\">)) as TopicDoc | null;\n } catch {\n // Not a valid topics table ID\n }\n if (!topic) {\n topic = await tryResolveHostTopicById(ctx, String(args.topicId));\n }\n if (!topic) {\n // Try as legacy projectId / globalId via the mapped-project bridge.\n topic =\n pickPrimaryTopic(\n await findTopicsByScopeAlias(ctx, String(args.topicId))\n ) ?? null;\n }\n if (!topic) {\n throw new Error(`Topic not found: ${String(args.topicId)}`);\n }\n const inherited = await resolveInheritedWorkspaceScope(ctx, topic);\n const mapped = asMappedProjectId(topic);\n if (mapped) {\n return {\n topicId: topic._id,\n projectId: mapped,\n tenantId: inherited.tenantId,\n workspaceId: inherited.workspaceId,\n source: \"topic\",\n };\n }\n return {\n topicId: topic._id,\n tenantId: inherited.tenantId,\n workspaceId: inherited.workspaceId,\n source: \"topic\",\n };\n }\n\n if (args.projectId) {\n let directTopic: TopicDoc | null = null;\n try {\n directTopic = (await ctx.db.get(\n args.projectId as Id<\"topics\">\n )) as TopicDoc | null;\n } catch {\n // Not a valid topics table ID, continue to legacy graph-scope lookup.\n }\n\n if (directTopic) {\n const inherited = await resolveInheritedWorkspaceScope(ctx, directTopic);\n const mapped = asMappedProjectId(directTopic);\n return {\n topicId: directTopic._id,\n projectId: mapped ?? args.projectId,\n tenantId: inherited.tenantId,\n workspaceId: inherited.workspaceId,\n source: \"topic_inferred\",\n };\n }\n\n directTopic = await tryResolveHostTopicByLegacyScope(ctx, args.projectId);\n if (directTopic) {\n const inherited = await resolveInheritedWorkspaceScope(ctx, directTopic);\n const mapped = asMappedProjectId(directTopic);\n return {\n topicId: directTopic._id,\n projectId: mapped ?? args.projectId,\n tenantId: inherited.tenantId,\n workspaceId: inherited.workspaceId,\n source: \"topic_inferred\",\n };\n }\n\n const topics = await findTopicsByScopeAlias(ctx, args.projectId);\n const primary = pickPrimaryTopic(topics);\n if (primary) {\n const inherited = await resolveInheritedWorkspaceScope(ctx, primary);\n return {\n topicId: primary._id,\n projectId: args.projectId,\n tenantId: inherited.tenantId,\n workspaceId: inherited.workspaceId,\n source: \"project_mapped_topic\",\n };\n }\n throw new Error(\n `Legacy project scope ${String(args.projectId)} has no mapped topic.`\n );\n }\n\n throw new Error(\n \"Missing scope: provide topicId (preferred) or legacy projectId alias.\"\n );\n}\n\n/** Shared scope args for graph-primitive functions. topicId is canonical; projectId is a legacy alias. */\nexport const optionalScopeArgs = {\n projectId: v.optional(v.string()),\n topicId: v.optional(v.string()),\n} as const;\n","/**\n * Common Validators\n *\n * Shared validators for patterns used across domains.\n *\n * @module schema/shared/common\n */\n\nimport { v } from \"convex/values\";\nimport { looseJsonArray, looseJsonObject, looseJsonValue } from \"../validators\";\n\n// =============================================================================\n// CONFIDENCE\n// =============================================================================\n\n/**\n * Confidence level (0-1 scale).\n */\nexport const confidence = v.number();\n\n/**\n * Named confidence levels.\n */\nexport const confidenceLevel = v.union(\n v.literal(\"very_high\"), // 0.9+\n v.literal(\"high\"), // 0.7-0.9\n v.literal(\"medium\"), // 0.4-0.7\n v.literal(\"low\"), // 0.2-0.4\n v.literal(\"very_low\") // 0-0.2\n);\n\n/**\n * Convert numeric confidence to level.\n */\nexport function toConfidenceLevel(\n confidence: number\n): \"very_high\" | \"high\" | \"medium\" | \"low\" | \"very_low\" {\n if (confidence >= 0.9) {\n return \"very_high\";\n }\n if (confidence >= 0.7) {\n return \"high\";\n }\n if (confidence >= 0.4) {\n return \"medium\";\n }\n if (confidence >= 0.2) {\n return \"low\";\n }\n return \"very_low\";\n}\n\n// =============================================================================\n// PRIORITY\n// =============================================================================\n\n/**\n * Standard priority levels (1 = highest).\n */\nexport const priorityLevel = v.union(\n v.literal(1), // Critical\n v.literal(2), // High\n v.literal(3), // Medium\n v.literal(4), // Low\n v.literal(5) // Backlog\n);\n\n/**\n * Named priority levels.\n */\nexport const namedPriority = v.union(\n v.literal(\"critical\"),\n v.literal(\"high\"),\n v.literal(\"medium\"),\n v.literal(\"low\"),\n v.literal(\"backlog\")\n);\n\n// =============================================================================\n// STATUS\n// =============================================================================\n\n/**\n * Generic lifecycle status.\n */\nexport const lifecycleStatus = v.union(\n v.literal(\"active\"),\n v.literal(\"paused\"),\n v.literal(\"completed\"),\n v.literal(\"archived\")\n);\n\n/**\n * Processing status.\n */\nexport const processingStatus = v.union(\n v.literal(\"pending\"),\n v.literal(\"processing\"),\n v.literal(\"completed\"),\n v.literal(\"failed\")\n);\n\n// =============================================================================\n// EXTERNAL IDS\n// =============================================================================\n\n/**\n * Common external ID references.\n */\nexport const externalIds = v.object({\n crunchbaseId: v.optional(v.string()),\n linkedinUrl: v.optional(v.string()),\n pitchbookId: v.optional(v.string()),\n twitterUrl: v.optional(v.string()),\n domain: v.optional(v.string()),\n});\n\n// =============================================================================\n// SOURCE ATTRIBUTION\n// =============================================================================\n\n/**\n * Source type for evidence/information.\n */\nexport const sourceType = v.union(\n v.literal(\"proprietary\"), // Internal Stack research\n v.literal(\"primary\"), // Direct interviews, calls\n v.literal(\"secondary\"), // Published sources\n v.literal(\"ai_generated\"), // AI-synthesized\n v.literal(\"user_input\"), // Manual user entry\n v.literal(\"inferred\") // System inference\n);\n\n/**\n * Source attribution.\n */\nexport const sourceAttribution = v.object({\n sourceType: v.optional(sourceType),\n sourceId: v.optional(v.string()), // Reference to source entity\n sourceUrl: v.optional(v.string()),\n sourceDate: v.optional(v.number()),\n sourceName: v.optional(v.string()),\n});\n\n// =============================================================================\n// LOOSE JSON\n// =============================================================================\n\n/**\n * Shallow JSON validators for dynamic payloads.\n *\n * Canonical source now lives in Lucern schema-management validators.\n */\nexport { looseJsonArray, looseJsonObject, looseJsonValue };\n\n// =============================================================================\n// PAGINATION\n// =============================================================================\n\n/**\n * Pagination parameters.\n */\nexport const pagination = v.object({\n cursor: v.optional(v.string()),\n limit: v.optional(v.number()),\n});\n\n/**\n * Pagination result metadata.\n */\nexport const paginationMeta = v.object({\n hasMore: v.boolean(),\n nextCursor: v.optional(v.string()),\n totalCount: v.optional(v.number()),\n});\n\n// =============================================================================\n// RICH TEXT\n// =============================================================================\n\n/**\n * Rich text content (for editors like TipTap).\n */\nexport const richTextContent = v.object({\n type: v.literal(\"doc\"),\n content: looseJsonArray,\n});\n\n/**\n * Content with optional rich text.\n */\nexport const content = v.union(v.string(), richTextContent);\n\n// =============================================================================\n// TOKEN USAGE\n// =============================================================================\n\n/**\n * LLM token usage tracking.\n */\nexport const tokenUsage = v.object({\n promptTokens: v.optional(v.number()),\n completionTokens: v.optional(v.number()),\n totalTokens: v.optional(v.number()),\n});\n\n// =============================================================================\n// FILE METADATA\n// =============================================================================\n\n/**\n * File upload metadata.\n */\nexport const fileMetadata = v.object({\n fileName: v.optional(v.string()),\n fileSize: v.optional(v.number()),\n mimeType: v.optional(v.string()),\n storageId: v.optional(v.id(\"_storage\")),\n externalUrl: v.optional(v.string()),\n});\n","/**\n * Epistemic Nodes Table\n *\n * Unified knowledge graph nodes: epistemic objects + ontological entities.\n * - Epistemic: beliefs, questions, evidence, sources, syntheses, themes, deals\n * - Ontological: companies, people, investors, functions, value chains\n *\n * This is THE source of truth for all knowledge objects in StackOS.\n *\n * @see /docs/epistemic-invariants/00-epistemic-invariants.md\n * @module schema/spine/tables/epistemicNodes\n */\n\nimport { defineTable } from \"convex/server\";\nimport { v } from \"convex/values\";\nimport { looseJsonObject } from \"../../shared/common\";\n\n// =============================================================================\n// NODE TYPE VALIDATORS\n// =============================================================================\n\n/**\n * All valid node types in the epistemic graph.\n * Organized by epistemic layer (L4 → L3 → L2 → L1 → Ontological)\n */\nexport const nodeType = v.union(\n // --- L4: Audit Targets (decisions, outcomes) ---\n v.literal(\"decision\"), // Investment decision with knowledge horizon snapshot\n\n // --- L3: Traversal Anchors (epistemic structure) ---\n v.literal(\"belief\"), // Structured conviction (immutable formulation)\n v.literal(\"question\"), // Unit of uncertainty\n v.literal(\"theme\"), // Investment thesis / conviction cluster\n v.literal(\"deal\"), // Investment evaluation process\n v.literal(\"topic\"), // Hierarchical knowledge container\n\n // --- L2: Compression Boundary (minimum reasoning unit) ---\n v.literal(\"claim\"), // Atomic assertion that can be true/false\n v.literal(\"evidence\"), // Interpreted signal linked to beliefs\n v.literal(\"synthesis\"), // Primers, deep research\n v.literal(\"answer\"), // Immutable answer snapshot for a question\n\n // --- L1: Terminal Leaves (non-traversable, grounding) ---\n v.literal(\"atomic_fact\"), // Raw fact from source (not interpreted)\n v.literal(\"excerpt\"), // Direct quote from source document\n v.literal(\"source\"), // News, documents, transcripts\n\n // --- Ontological Entities (things in the world) ---\n v.literal(\"company\"), // Organization (subtype: private, corporate, portfolio)\n v.literal(\"person\"), // Individual (founder, expert, LP, contact)\n v.literal(\"investor\"), // Investment entity (subtype: vc, lp, cvc, pe, family_office, angel)\n v.literal(\"function\"), // What a company does (from classifier)\n v.literal(\"value_chain\") // Market structure / value flow\n);\n\n/**\n * Epistemic layer for traversal rules.\n * Traversal: L4→L3→L2→L1, never skip layers.\n */\nexport const epistemicLayer = v.union(\n v.literal(\"L4\"), // Decisions, outcomes - audit targets\n v.literal(\"L3\"), // Beliefs, questions, themes - traversal anchors\n v.literal(\"L2\"), // Claims, evidence, synthesis - compression boundary\n v.literal(\"L1\"), // Atomic facts, excerpts, sources - terminal leaves\n v.literal(\"ontological\"), // Companies, people, etc - not epistemic\n v.literal(\"organizational\") // Topics, lenses, worktrees — structural containers\n);\n\n/**\n * Node lifecycle status.\n */\nexport const nodeStatus = v.union(\n v.literal(\"active\"),\n v.literal(\"superseded\"), // Replaced by newer version\n v.literal(\"archived\"),\n v.literal(\"deleted\")\n);\n\n/**\n * How the node was created.\n */\nexport const sourceType = v.union(\n v.literal(\"human\"), // User created directly\n v.literal(\"ai_extracted\"), // LLM extracted from a source\n v.literal(\"ai_generated\"), // LLM synthesized/created\n v.literal(\"imported\"), // External system import\n v.literal(\"system\"), // System-generated (migrations, classifiers)\n v.literal(\"verified\"), // Human-verified source\n v.literal(\"proprietary\") // Proprietary/internal data\n);\n\n/**\n * Verification status for nodes.\n */\nexport const verificationStatus = v.union(\n v.literal(\"unverified\"),\n v.literal(\"human_verified\"),\n v.literal(\"ai_verified\"),\n v.literal(\"contradicted\"),\n v.literal(\"outdated\")\n);\n\n/**\n * Neo4j sync status.\n */\nexport const syncStatus = v.union(\n v.literal(\"synced\"), // Node and edges fully synced to Neo4j\n v.literal(\"pending_edges\"), // Node created, edges being created\n v.literal(\"edge_creation_failed\") // Edge creation failed, needs retry\n);\n\n// =============================================================================\n// POLICY / ENTITLEMENT METADATA\n// =============================================================================\n\nexport const audienceLabel = v.string();\n\nexport const sensitivityTier = v.union(\n v.literal(\"low\"),\n v.literal(\"medium\"),\n v.literal(\"high\"),\n v.literal(\"restricted\")\n);\n\nexport const exportClass = v.union(\n v.literal(\"internal_only\"),\n v.literal(\"client_safe\"),\n v.literal(\"public_safe\"),\n v.literal(\"restricted\")\n);\n\nexport const anonymizationClass = v.union(\n v.literal(\"none\"),\n v.literal(\"standard\"),\n v.literal(\"strict\")\n);\n\n// =============================================================================\n// TYPED METADATA VALIDATORS\n// =============================================================================\n\n// --- BELIEF METADATA ---\n// Epistemic status tracks where a belief is in its lifecycle (computed display status)\nexport const epistemicStatus = v.union(\n v.literal(\"hypothesis\"), // Initial conjecture, low evidence\n v.literal(\"emerging\"), // Building evidence, gaining traction\n v.literal(\"established\"), // Well-evidenced, core to thesis\n v.literal(\"challenged\"), // Contradicting evidence appeared\n v.literal(\"assumption\"), // Taken as given, not actively tested\n v.literal(\"deprecated\") // Superseded or abandoned\n);\n\n/**\n * Canonical belief lifecycle status.\n *\n * This field is distinct from `status`:\n * - `status`: archival/supersession lifecycle of the node itself.\n * - `beliefStatus`: epistemic lifecycle of the claim.\n */\nexport const beliefStatus = v.union(\n v.literal(\"assumption\"),\n v.literal(\"hypothesis\"),\n v.literal(\"belief\"),\n v.literal(\"fact\")\n);\n\n// How easily can this belief be reversed if wrong?\nexport const reversibility = v.union(\n v.literal(\"irreversible\"), // One-way door decision\n v.literal(\"hard_to_reverse\"), // Significant cost to undo\n v.literal(\"reversible\"), // Can change course with moderate effort\n v.literal(\"trivial\") // Easy to adjust\n);\n\nexport const predictionOutcome = v.union(\n v.literal(\"pending\"),\n v.literal(\"confirmed\"),\n v.literal(\"disconfirmed\"),\n v.literal(\"partial\"),\n v.literal(\"expired\")\n);\n\nexport const predictionMeta = v.object({\n isPrediction: v.boolean(),\n registeredAt: v.number(), // When prediction was made\n expectedBy: v.optional(v.number()), // When we expect resolution\n outcome: v.optional(predictionOutcome),\n outcomeRecordedAt: v.optional(v.number()),\n outcomeEvidenceId: v.optional(v.string()), // globalId of confirming evidence\n confidenceAtPrediction: v.optional(v.number()), // 0-1\n actualVsPredicted: v.optional(v.string()), // Notes on how outcome compared\n});\n\n// --- EVIDENCE METADATA ---\nexport const methodology = v.union(\n // Primary Research (high value)\n v.literal(\"primary_research\"), // Direct investigation\n v.literal(\"expert_interview\"), // Expert call/interview\n v.literal(\"customer_interview\"), // Customer research\n v.literal(\"field_observation\"), // On-site observation\n v.literal(\"proprietary_data\"), // Internal data analysis\n\n // Secondary Research\n v.literal(\"desk_research\"), // Public sources\n v.literal(\"regulatory_filing\"), // SEC, regulatory docs\n v.literal(\"news_article\"), // News/press\n v.literal(\"academic_paper\"), // Academic research\n\n // AI-Assisted\n v.literal(\"ai_synthesis\"), // AI-generated synthesis\n v.literal(\"ai_extraction\") // AI-extracted from source\n);\n\nexport const informationAsymmetry = v.union(\n v.literal(\"proprietary\"), // Only we have this\n v.literal(\"early\"), // We're early but others will get it\n v.literal(\"common\") // Everyone has access\n);\n\n// Evidence temporal nature: factual (resolved outcome) vs forecast (prediction)\n// See convex/schema/spine/nodes/evidence.ts for full documentation.\nexport const temporalNature = v.union(\n v.literal(\"factual\"), // Resolved outcome. Grounded in reality.\n v.literal(\"forecast\"), // Prediction. Will resolve. Discounted weight.\n v.literal(\"unknown\") // Not yet classified.\n);\n\n// --- QUESTION METADATA ---\nexport const questionType = v.union(\n v.literal(\"validation\"), // Does evidence support this belief?\n v.literal(\"falsification\"), // What would prove this belief wrong?\n v.literal(\"assumption_probe\"), // Is this unstated assumption true?\n v.literal(\"prediction_test\"), // Will this predicted outcome occur?\n v.literal(\"counterfactual\"), // What would we expect if X were false?\n v.literal(\"discovery\"), // What don't we know yet?\n v.literal(\"clarification\"), // What does X actually mean?\n v.literal(\"comparison\"), // How does X compare to Y?\n v.literal(\"causal\"), // What caused X?\n v.literal(\"mechanism\"), // How does X work?\n v.literal(\"general\") // Unclassified\n);\n\nexport const questionPriority = v.union(\n v.literal(\"critical\"), // Blocks decision-making\n v.literal(\"high\"), // Important for thesis\n v.literal(\"medium\"), // Would be nice to know\n v.literal(\"low\") // Background/curiosity\n);\n\nexport const answerQuality = v.union(\n v.literal(\"definitive\"), // Clear, well-supported\n v.literal(\"strong\"), // Good evidence, high confidence\n v.literal(\"moderate\"), // Some evidence\n v.literal(\"weak\"), // Limited evidence\n v.literal(\"speculative\"), // Mostly conjecture\n v.literal(\"unanswered\") // No answer yet\n);\n\n// --- BELIEF CONSENSUS METADATA (for non-consensus detection) ---\nexport const consensusView = v.union(\n v.literal(\"aligned\"), // We agree with market consensus\n v.literal(\"ahead_of\"), // We see this before consensus does\n v.literal(\"contrarian\"), // We actively disagree with consensus\n v.literal(\"orthogonal\"), // We're looking at something consensus isn't discussing\n v.literal(\"unknown\") // We don't know what consensus thinks\n);\n\n// --- THEME METADATA ---\nexport const themeConviction = v.union(\n v.literal(\"high\"), // Strong conviction, actively deploying\n v.literal(\"medium\"), // Building conviction\n v.literal(\"low\"), // Exploring, not convicted\n v.literal(\"negative\") // Actively avoiding\n);\n\n// --- DECISION METADATA ---\nexport const decisionType = v.union(\n v.literal(\"invest\"),\n v.literal(\"pass\"),\n v.literal(\"follow_on\"),\n v.literal(\"exit\"),\n v.literal(\"deep_dive\"),\n v.literal(\"monitor\"),\n v.literal(\"deprioritize\"),\n v.literal(\"thesis_adopt\"),\n v.literal(\"thesis_revise\"),\n v.literal(\"thesis_abandon\")\n);\n\nexport const decisionOutcome = v.union(\n v.literal(\"pending\"),\n v.literal(\"successful\"),\n v.literal(\"unsuccessful\"),\n v.literal(\"mixed\"),\n v.literal(\"unknown\")\n);\n\n// --- EXTERNAL IDS ---\nexport const externalIds = v.object({\n crunchbase: v.optional(v.string()),\n linkedin: v.optional(v.string()),\n pitchbook: v.optional(v.string()),\n twitter: v.optional(v.string()),\n website: v.optional(v.string()),\n});\n\n// =============================================================================\n// TABLE DEFINITION\n// =============================================================================\n\n/**\n * Epistemic Nodes table.\n * The unified graph node store for all knowledge objects.\n */\nexport const epistemicNodes = defineTable({\n // === IDENTITY ===\n globalId: v.string(), // UUID - survives migration to Neo4j\n\n // === TYPE ===\n nodeType,\n\n // === EPISTEMIC LAYER ===\n epistemicLayer: v.optional(epistemicLayer),\n\n // === SUBTYPE (for typed entities) ===\n subtype: v.optional(v.string()), // company: private|corporate|portfolio, investor: vc|lp|cvc|pe|family_office|angel\n\n // === CONTENT ===\n canonicalText: v.string(), // The core content (belief statement, company name, etc.)\n contentHash: v.string(), // SHA256(nodeType + canonicalText) for deduplication\n\n // Extended content (for sources/syntheses)\n content: v.optional(v.string()), // Full text for documents/articles\n contentType: v.optional(v.string()), // \"markdown\", \"html\", \"pdf\", \"text\"\n\n // === METADATA ===\n title: v.optional(v.string()), // Display title\n tags: v.optional(v.array(v.string())),\n domain: v.optional(v.string()), // For companies: website domain\n\n // Type-specific metadata (flexible object - LEGACY)\n // New code should use the typed fields below when available\n metadata: v.optional(looseJsonObject),\n\n // === POLICY / ENTITLEMENT ===\n tenantId: v.optional(v.string()),\n workspaceId: v.optional(v.string()),\n ownerPrincipalId: v.optional(v.string()),\n audienceLabel: v.optional(audienceLabel),\n policyTags: v.optional(v.array(v.string())),\n sensitivityTier: v.optional(sensitivityTier),\n exportClass: v.optional(exportClass),\n anonymizationClass: v.optional(anonymizationClass),\n\n // === PUBLICATION (visibility-based, not copy-based) ===\n // Publication expands who can see a workspace-local node — the node stays\n // in its workspace, like a microservice exposing part of its API surface.\n // Rules-based: pack/tenant-level publicationRules auto-evaluate on\n // confidence changes and node creation. No manual click-by-click.\n publicationStatus: v.optional(\n v.union(\n v.literal(\"unpublished\"), // Default: workspace-local only\n v.literal(\"published\"), // Visible at tenant scope (rules matched)\n v.literal(\"suppressed\") // Manually blocked even if rules match\n )\n ),\n publishedAt: v.optional(v.number()), // When publication status last changed to published\n publishedBy: v.optional(v.string()), // userId or \"system:publication_rules\" for auto-publish\n\n // === TYPED METADATA FIELDS ===\n // --- Belief ---\n // Belief type — validated against schemaEnumConfig category \"belief_type\"\n // Platform core: hypothesis, belief, principle, invariant, assumption,\n // tenet, prior, preference, goal, forecast\n beliefType: v.optional(v.string()),\n beliefStatus: v.optional(beliefStatus),\n epistemicStatus: v.optional(epistemicStatus),\n reversibility: v.optional(reversibility),\n predictionMeta: v.optional(predictionMeta),\n // Consensus tracking (for non-consensus detection)\n consensusView: v.optional(consensusView),\n consensusConfidence: v.optional(v.number()), // 0-1: What we think consensus confidence is\n consensusSource: v.optional(v.string()), // Where we got the consensus view (twitter, reports, etc.)\n\n // --- Evidence ---\n methodology: v.optional(methodology),\n informationAsymmetry: v.optional(informationAsymmetry),\n temporalNature: v.optional(temporalNature),\n\n // --- Question ---\n questionType: v.optional(questionType),\n questionPriority: v.optional(questionPriority),\n answerQuality: v.optional(answerQuality),\n\n // --- Theme ---\n themeConviction: v.optional(themeConviction),\n // Market timing (for \"early on theme\" detection)\n marketAwarenessDate: v.optional(v.number()), // When this theme became broadly discussed\n marketAwarenessSource: v.optional(v.string()), // How we know (first major report, twitter volume spike, etc.)\n earlySignalIds: v.optional(v.array(v.string())), // globalIds of evidence we had before market awareness\n\n // --- Decision ---\n decisionType: v.optional(decisionType),\n decisionOutcome: v.optional(decisionOutcome),\n\n // === EXTERNAL IDS (for ontological entities) ===\n externalIds: v.optional(externalIds),\n\n // === PROVENANCE ===\n sourceType,\n aiProvider: v.optional(v.string()), // \"claude\", \"gemini\", \"gpt-4\", etc.\n extractedFromNodeId: v.optional(v.id(\"epistemicNodes\")), // Quick reference to source\n\n // === EXTRACTION CONTEXT ===\n extractionModel: v.optional(v.string()), // \"claude-sonnet-4-20250514\"\n extractionPromptName: v.optional(v.string()), // \"lucern/extract-evidence\"\n extractionPromptVersion: v.optional(v.number()),\n extractionTemperature: v.optional(v.number()),\n extractionLangfuseTraceId: v.optional(v.string()),\n\n // === GROUNDING VERIFICATION ===\n groundingVerified: v.optional(v.boolean()),\n groundingConfidence: v.optional(v.number()), // 0-1 match quality\n groundingMatchedText: v.optional(v.string()), // Actual text from source\n groundingStartOffset: v.optional(v.number()),\n groundingEndOffset: v.optional(v.number()),\n groundingRejectionReason: v.optional(v.string()),\n\n // === CONFIDENCE & VERIFICATION ===\n confidence: v.optional(v.number()), // 0-1 projected probability P(x) = b + a*u\n verificationStatus: v.optional(verificationStatus),\n\n // === SL OPINION (Subjective Logic — Kernel v2) ===\n // Replaces scalar confidence with rich epistemic state.\n // b + d + u = 1. P(x) = b + a*u is stored in `confidence` for backward compat.\n opinion_b: v.optional(v.number()), // Belief: evidence FOR (0-1)\n opinion_d: v.optional(v.number()), // Disbelief: evidence AGAINST (0-1)\n opinion_u: v.optional(v.number()), // Uncertainty: absence of evidence (0-1)\n opinion_a: v.optional(v.number()), // Base rate / prior probability (0-1)\n tupleContradicted: v.optional(v.boolean()), // Single-belief tuple-space contradiction flag\n\n // === LIFECYCLE ===\n status: nodeStatus,\n supersededBy: v.optional(v.id(\"epistemicNodes\")),\n\n // === OWNERSHIP ===\n topicId: v.optional(v.string()), // Canonical scope container (topic-first model)\n projectId: v.optional(v.string()), // DEPRECATED: Use belongs_to edges\n createdBy: v.string(), // Clerk user ID\n createdAt: v.number(),\n updatedAt: v.number(),\n\n // === NEO4J SYNC STATUS ===\n syncStatus: v.optional(syncStatus),\n syncError: v.optional(v.string()), // Error message if sync failed\n})\n .index(\"by_globalId\", [\"globalId\"])\n .index(\"by_contentHash\", [\"contentHash\"])\n .index(\"by_nodeType\", [\"nodeType\"])\n .index(\"by_subtype\", [\"nodeType\", \"subtype\"])\n .index(\"by_domain\", [\"domain\"])\n .index(\"by_project\", [\"projectId\"]) // DEPRECATED\n .index(\"by_project_type\", [\"projectId\", \"nodeType\"]) // DEPRECATED\n .index(\"by_topic\", [\"topicId\"])\n .index(\"by_topic_type\", [\"topicId\", \"nodeType\"])\n .index(\"by_tenantId\", [\"tenantId\"])\n .index(\"by_workspaceId\", [\"workspaceId\"])\n .index(\"by_tenant_workspace\", [\"tenantId\", \"workspaceId\"])\n .index(\"by_audienceLabel\", [\"audienceLabel\"])\n .index(\"by_sensitivityTier\", [\"sensitivityTier\"])\n .index(\"by_exportClass\", [\"exportClass\"])\n .index(\"by_status\", [\"status\"])\n .index(\"by_sourceType\", [\"sourceType\"])\n .index(\"by_verification\", [\"verificationStatus\"])\n .index(\"by_layer\", [\"epistemicLayer\"]) // For layer-constrained traversal\n .index(\"by_layer_type\", [\"epistemicLayer\", \"nodeType\"]) // For layer+type queries\n .index(\"by_syncStatus\", [\"syncStatus\"]) // For finding nodes needing edge retry\n // === PUBLICATION INDEXES ===\n .index(\"by_publicationStatus\", [\"publicationStatus\"])\n .index(\"by_tenant_publicationStatus\", [\"tenantId\", \"publicationStatus\"])\n // === CLASSIFICATION INDEXES (Phase 6) ===\n .index(\"by_belief_status\", [\"nodeType\", \"beliefStatus\"]) // Canonical belief lifecycle stage\n .index(\"by_epistemic_status\", [\"nodeType\", \"epistemicStatus\"]) // Belief lifecycle analysis\n .index(\"by_temporal_nature\", [\"nodeType\", \"temporalNature\"]) // Evidence factual vs forecast\n .index(\"by_methodology\", [\"nodeType\", \"methodology\"]) // Evidence research method analysis\n .index(\"by_reversibility\", [\"nodeType\", \"reversibility\"]) // Decision impact analysis\n .index(\"by_questionType\", [\"nodeType\", \"questionType\"]) // Question classification\n .index(\"by_questionPriority\", [\"nodeType\", \"questionPriority\"]) // Question urgency\n .searchIndex(\"search_canonicalText\", {\n searchField: \"canonicalText\",\n filterFields: [\"nodeType\", \"projectId\", \"topicId\", \"status\"],\n });\n\n// =============================================================================\n// TYPE EXPORTS\n// =============================================================================\n\nimport type { Infer } from \"convex/values\";\n\n// Types needed internally for helper functions\ntype NodeType = Infer<typeof nodeType>;\ntype EpistemicLayer = Infer<typeof epistemicLayer>;\n\n// Only export types that are unique to this file (not already in ./nodes/*.ts)\nexport type ExternalIds = Infer<typeof externalIds>;\n\n// =============================================================================\n// HELPER FUNCTIONS\n// =============================================================================\n\n/**\n * Get the epistemic layer for a node type.\n */\nexport function getLayerForNodeType(type: NodeType): EpistemicLayer {\n switch (type) {\n case \"decision\":\n return \"L4\";\n case \"belief\":\n case \"question\":\n case \"theme\":\n case \"deal\":\n return \"L3\";\n case \"claim\":\n case \"evidence\":\n case \"synthesis\":\n case \"answer\":\n return \"L2\";\n case \"atomic_fact\":\n case \"excerpt\":\n case \"source\":\n return \"L1\";\n case \"topic\":\n return \"organizational\";\n case \"company\":\n case \"person\":\n case \"investor\":\n case \"function\":\n case \"value_chain\":\n return \"ontological\";\n }\n}\n\n/**\n * Async layer resolver with schemaEnumConfig fallback for tenant-defined entity types.\n *\n * For hardcoded types (the switch above), returns immediately.\n * For unknown types, checks schemaEnumConfig for entity_type entries.\n * If found in the registry, returns \"ontological\". Otherwise returns undefined.\n *\n * Use this when you need to handle tenant-extensible entity types.\n * For known platform types, the synchronous `getLayerForNodeType` is sufficient.\n */\nexport async function resolveLayerForNodeType(\n ctx: { db: { query: (table: string) => any } },\n type: string\n): Promise<EpistemicLayer | undefined> {\n // First try the hardcoded switch for known types\n const knownLayer = getLayerForNodeType(type as NodeType);\n if (knownLayer !== undefined) {\n return knownLayer;\n }\n\n // Fallback: check schemaEnumConfig for tenant-registered entity types\n const registryEntry = await ctx.db\n .query(\"schemaEnumConfig\")\n .withIndex(\"by_category_value\", (q: any) =>\n q.eq(\"category\", \"entity_type\").eq(\"value\", type)\n )\n .first();\n\n if (registryEntry && registryEntry.status === \"active\") {\n return \"ontological\";\n }\n\n return;\n}\n\n/**\n * Check if a node type is epistemic (vs ontological).\n */\nexport function isEpistemicNodeType(type: NodeType): boolean {\n return getLayerForNodeType(type) !== \"ontological\";\n}\n","import { getLayerForNodeType } from \"@lucern/schema-management/spine/tables/epistemicNodes\";\nimport {\n resolveTopicProjectScope,\n type TopicProjectScope,\n} from \"./topicScope\";\n\ntype StructuredInvariantError = Error & {\n status: number;\n code: string;\n invariantCode?: string;\n suggestion?: string;\n details?: unknown;\n};\n\ntype ScopeLike = {\n tenantId?: unknown;\n workspaceId?: unknown;\n epistemicLayer?: unknown;\n nodeType?: unknown;\n topicId?: unknown;\n projectId?: unknown;\n publicationStatus?: unknown;\n};\n\nexport type RuntimePackMutationContext = {\n toolName?: string;\n packKey?: string;\n packInstallScope?: \"tenant\" | \"workspace\";\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 = getLayerForNodeType(args.nodeType as any);\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 (\n scopeTenantId &&\n nodeTenantId &&\n scopeTenantId !== nodeTenantId\n ) {\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 (\n scopeTenantId &&\n edgeTenantId &&\n scopeTenantId !== edgeTenantId\n ) {\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: any,\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 if (node.topicId) {\n const topicScope = await resolveTopicProjectScope(ctx, {\n topicId: node.topicId as any,\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 !args.runtimeToolName &&\n !args.runtimePackKey &&\n !args.runtimePackInstallScope\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 (\n !args.runtime?.packKey ||\n args.runtime.packInstallScope !== \"tenant\"\n ) {\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:\n `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","import { resolveTopicProjectScope as resolveLucernTopicProjectScope } from \"@lucern/graph-primitives/topicScope\";\n\ntype ScopeArgs = {\n projectId?: string | null;\n topicId?: string | null;\n};\n\nexport type CanonicalTopicProjectScope = {\n projectId: string;\n topicId?: string;\n};\n\nfunction normalizeString(value: unknown): string | undefined {\n if (typeof value !== \"string\") {\n return undefined;\n }\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n}\n\nexport function getCanonicalScopeAccessId(\n scope: CanonicalTopicProjectScope\n): string {\n return scope.topicId ?? scope.projectId;\n}\n\nexport function requireScopeId(...ids: unknown[]): string {\n for (const id of ids) {\n const normalized = normalizeString(id);\n if (normalized) {\n return normalized;\n }\n }\n throw new Error(\"No scope identifier provided (topicId or projectId required)\");\n}\n\nexport function scopeMatchesValue(\n scope: CanonicalTopicProjectScope,\n value: ScopeArgs\n): boolean {\n const candidates = new Set<string>();\n const valueTopicId = normalizeString(value.topicId);\n const valueProjectId = normalizeString(value.projectId);\n if (valueTopicId) {\n candidates.add(valueTopicId);\n }\n if (valueProjectId) {\n candidates.add(valueProjectId);\n }\n if (candidates.size === 0) {\n return false;\n }\n return (\n candidates.has(scope.projectId) ||\n (typeof scope.topicId === \"string\" && candidates.has(scope.topicId))\n );\n}\n\nexport function dedupeDocsById<T extends { _id: unknown }>(docs: T[]): T[] {\n const seen = new Map<string, T>();\n for (const doc of docs) {\n seen.set(String(doc._id), doc);\n }\n return Array.from(seen.values());\n}\n\nexport async function resolveTopicProjectScope(\n ctx: any,\n args: ScopeArgs\n): Promise<CanonicalTopicProjectScope> {\n const resolved = await resolveLucernTopicProjectScope(ctx, {\n topicId: normalizeString(args.topicId),\n projectId: normalizeString(args.projectId),\n });\n const topicId = normalizeString(resolved.topicId);\n const projectId = requireScopeId(\n resolved.projectId,\n args.projectId,\n topicId\n );\n return { projectId, ...(topicId ? { topicId } : {}) };\n}\n\nexport async function requireProjectBackedScope(\n ctx: any,\n args: ScopeArgs\n): Promise<CanonicalTopicProjectScope> {\n return await resolveTopicProjectScope(ctx, args);\n}\n","import {\n getCanonicalScopeAccessId,\n requireProjectBackedScope,\n resolveTopicProjectScope,\n type CanonicalTopicProjectScope,\n} from \"./scopeBridge\";\n\ntype WorkflowLikeDoc = {\n _id?: string;\n topicId?: string;\n projectId?: string;\n metadata?: Record<string, unknown>;\n [key: string]: unknown;\n};\n\nexport type WorkflowBridgeResolution = {\n inputId: string | null;\n sprint: WorkflowLikeDoc | null;\n worktree: WorkflowLikeDoc | null;\n sprintId: string | null;\n worktreeId: string | null;\n topicId?: string;\n projectId?: string;\n};\n\nexport type WorkflowBridgeScopeResolution = WorkflowBridgeResolution & {\n scope: CanonicalTopicProjectScope;\n scopeId: string;\n};\n\nexport function isLegacySprintDoc(doc: unknown): doc is WorkflowLikeDoc {\n if (!doc || typeof doc !== \"object\") {\n return false;\n }\n\n if (\"metadata\" in doc && (doc as any).metadata?.pairedSprintId) {\n return false;\n }\n\n return (\n \"sprintScope\" in doc ||\n \"targetPillar\" in doc ||\n \"pillarThesis\" in doc ||\n \"synthesisState\" in doc ||\n (\"projectId\" in doc && !(\"worktreeScope\" in doc))\n );\n}\n\nexport function isWorktreeDoc(doc: unknown): doc is WorkflowLikeDoc {\n if (!doc || typeof doc !== \"object\") {\n return false;\n }\n\n return (\n \"worktreeScope\" in doc ||\n \"targetBranch\" in doc ||\n \"executionBand\" in doc ||\n \"proofArtifacts\" in doc\n );\n}\n\nexport function getPairedSprintId(doc: WorkflowLikeDoc | null | undefined) {\n const pairedSprintId = doc?.metadata?.pairedSprintId;\n return typeof pairedSprintId === \"string\" && pairedSprintId.trim().length > 0\n ? pairedSprintId\n : null;\n}\n\nfunction getStringField(\n doc: WorkflowLikeDoc | null | undefined,\n field: \"topicId\" | \"projectId\"\n) {\n const value = doc?.[field];\n return typeof value === \"string\" && value.trim().length > 0 ? value : undefined;\n}\n\nasync function findPairedWorktreeForSprint(\n ctx: {\n db: {\n query?: (...args: any[]) => {\n withIndex: (...args: any[]) => { collect: () => Promise<unknown[]> };\n };\n };\n },\n sprint: WorkflowLikeDoc\n): Promise<WorkflowLikeDoc | null> {\n const sprintId =\n typeof sprint._id === \"string\" && sprint._id.length > 0 ? sprint._id : null;\n if (!sprintId || typeof ctx.db.query !== \"function\") {\n return null;\n }\n\n let topicId = getStringField(sprint, \"topicId\");\n if (!topicId) {\n try {\n const scope = await resolveTopicProjectScope(ctx as any, {\n topicId: getStringField(sprint, \"topicId\"),\n projectId: getStringField(sprint, \"projectId\"),\n });\n topicId = scope.topicId;\n } catch {\n topicId = undefined;\n }\n }\n\n if (!topicId) {\n return null;\n }\n\n const worktrees = (await ctx.db\n .query(\"worktrees\")\n .withIndex(\"by_topicId\", (q: any) => q.eq(\"topicId\", topicId))\n .collect()) as WorkflowLikeDoc[];\n\n return (\n worktrees.find(\n (worktree) =>\n String(worktree?.metadata?.pairedSprintId || \"\") === sprintId\n ) ?? null\n );\n}\n\nexport async function resolveWorkflowBridgeDoc(\n ctx: {\n db: {\n get: (...args: any[]) => Promise<unknown>;\n query?: (...args: any[]) => any;\n };\n },\n workflowId: string | null | undefined\n): Promise<WorkflowBridgeResolution> {\n const empty: WorkflowBridgeResolution = {\n inputId: workflowId ?? null,\n sprint: null,\n worktree: null,\n sprintId: null,\n worktreeId: null,\n };\n\n if (!workflowId) {\n return empty;\n }\n\n let doc: unknown;\n try {\n doc = await ctx.db.get(workflowId as any);\n } catch {\n return empty;\n }\n\n if (!doc || typeof doc !== \"object\") {\n return empty;\n }\n\n if (isLegacySprintDoc(doc)) {\n const worktree = await findPairedWorktreeForSprint(ctx, doc);\n return {\n ...empty,\n sprint: doc,\n worktree,\n sprintId:\n typeof doc._id === \"string\" && doc._id.length > 0 ? doc._id : workflowId,\n worktreeId:\n worktree && typeof worktree._id === \"string\" && worktree._id.length > 0\n ? worktree._id\n : null,\n topicId:\n getStringField(worktree, \"topicId\") ?? getStringField(doc, \"topicId\"),\n projectId:\n getStringField(doc, \"projectId\") ?? getStringField(worktree, \"projectId\"),\n };\n }\n\n const worktree = doc as WorkflowLikeDoc;\n const pairedSprintId = getPairedSprintId(worktree);\n let sprint: WorkflowLikeDoc | null = null;\n\n if (pairedSprintId) {\n try {\n const paired = await ctx.db.get(pairedSprintId as any);\n if (isLegacySprintDoc(paired)) {\n sprint = paired;\n }\n } catch {\n sprint = null;\n }\n }\n\n return {\n ...empty,\n worktree,\n sprint,\n worktreeId:\n typeof worktree._id === \"string\" && worktree._id.length > 0\n ? worktree._id\n : workflowId,\n sprintId:\n sprint && typeof sprint._id === \"string\" && sprint._id.length > 0\n ? sprint._id\n : pairedSprintId,\n topicId: getStringField(worktree, \"topicId\") ?? getStringField(sprint, \"topicId\"),\n projectId:\n getStringField(sprint, \"projectId\") ?? getStringField(worktree, \"projectId\"),\n };\n}\n\nexport async function resolveWorkflowBridgeScope(\n ctx: { db: { get: (...args: any[]) => Promise<unknown> } },\n args: {\n workflowId?: string | null;\n topicId?: string | null;\n projectId?: string | null;\n }\n): Promise<WorkflowBridgeScopeResolution> {\n const workflow = await resolveWorkflowBridgeDoc(ctx, args.workflowId);\n const scope = await requireProjectBackedScope(ctx, {\n topicId: args.topicId ?? workflow.topicId,\n projectId: args.projectId ?? workflow.projectId,\n });\n\n return {\n ...workflow,\n scope,\n scopeId: getCanonicalScopeAccessId(scope),\n };\n}\n","/**\n * Epistemic Questions API\n *\n * Clean API for managing questions in the epistemic spine (epistemicNodes).\n * This is the NEW API that replaces questions.ts for CREATE operations.\n *\n * Key differences from questions.ts:\n * - Writes ONLY to epistemicNodes (no dual-write)\n * - Uses epistemicNodes IDs directly (no legacyQuestionId lookups)\n * - Syncs to Neo4j after mutations\n * - Follows Lucern invariants strictly\n *\n * @see /docs/epistemic-invariants/00-epistemic-invariants.md\n */\n\nimport { v } from \"convex/values\";\nimport {\n checkProjectAccess,\n checkScopeAccess,\n} from \"@lucern/access-control/access\";\nimport {\n canAudienceClassAccess,\n classFromAudienceKey,\n normalizeAudienceKey,\n} from \"@lucern/access-control/audience\";\nimport { listAudienceRegistryRows } from \"@lucern/access-control/audienceRegistry\";\nimport { getCurrentUserId } from \"@lucern/access-control/auth\";\nimport { permissiveReturn } from \"@lucern/schema-management/validators\";\nimport type { Doc, Id } from \"./convex\";\nimport {\n internal,\n internalMutation,\n internalQuery,\n mutation,\n query,\n} from \"./convex\";\nimport { scheduleEmbeddingGeneration } from \"./embeddingTrigger\";\nimport { generateGlobalId } from \"./globalId\";\nimport { resolveGraphPrimitivesAppResolvers } from \"./resolvers\";\nimport { optionalScopeArgs, resolveTopicProjectScope } from \"./topicScope\";\nimport {\n assertTenantPackWorkspaceMutationAllowed,\n assertWorkspaceScopedEpistemicNodeScope,\n nodeMatchesWorkspaceReasoningScope,\n resolveNodeScopeForWorkspaceIsolation,\n resolveRuntimePackMutationContext,\n} from \"./workspaceIsolation\";\nimport { resolveWorkflowBridgeDoc } from \"../../worktrees/src/v1/engine/worktreeWorkflowBridge\";\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\nfunction generateContentHash(text: string): string {\n const content = `question:${text.trim().toLowerCase().replace(/\\s+/g, \" \")}`;\n let hash = 5381;\n for (let i = 0; i < content.length; i++) {\n hash = (hash << 5) + hash + content.charCodeAt(i);\n hash &= hash;\n }\n return Math.abs(hash).toString(16).padStart(8, \"0\");\n}\n\nfunction buildTestsEdgeGlobalId(\n fromGlobalId: string,\n toGlobalId: string\n): string {\n return `edge-${fromGlobalId}-tests-${toGlobalId}`;\n}\n\nasync function markProjectGraphDirty(\n ctx: any,\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 as any).markCacheStaleByTopic,\n {\n topicId: normalizedTopicId,\n }\n );\n }\n await resolveGraphPrimitivesAppResolvers(ctx).patchProject(\n ctx,\n normalizedTopicId ?? normalizedProjectId!,\n {\n lastActivityAt: Date.now(),\n }\n );\n}\n\n// Valid question categories (pillars)\ntype ValidCategory =\n | \"market\"\n | \"competition\"\n | \"product\"\n | \"team\"\n | \"financials\"\n | \"deal\"\n | \"risks\"\n | \"other\";\n\nfunction normalizeCategory(category?: string): ValidCategory {\n if (!category) {\n return \"other\";\n }\n const lower = category.toLowerCase();\n // Handle \"financial\" → \"financials\" mapping\n if (lower === \"financial\") {\n return \"financials\";\n }\n const validCategories: ValidCategory[] = [\n \"market\",\n \"competition\",\n \"product\",\n \"team\",\n \"financials\",\n \"deal\",\n \"risks\",\n ];\n return (validCategories.find((c) => lower.includes(c)) ||\n \"other\") as ValidCategory;\n}\n\ntype QuestionNodeDoc = Doc<\"epistemicNodes\">;\nconst DEFAULT_QUESTION_PAGE_SIZE = 250;\nconst MAX_QUESTION_PAGE_SIZE = 1000;\ntype QuestionScopeArgs = {\n projectId?: string | null;\n topicId?: string | null;\n};\nfunction clampQuestionLimit(\n limit: number | undefined,\n fallback = DEFAULT_QUESTION_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_QUESTION_PAGE_SIZE)\n );\n}\n\nfunction dedupeQuestionNodes(nodes: QuestionNodeDoc[]): QuestionNodeDoc[] {\n const seen = new Set<string>();\n const deduped: QuestionNodeDoc[] = [];\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 normalizeQuestionTopicId(\n topicId: string | undefined | null\n): string | undefined {\n return typeof topicId === \"string\" && topicId.trim().length > 0\n ? topicId\n : undefined;\n}\n\nfunction resolveQuestionScopeId(scope: {\n projectId?: string | undefined;\n topicId?: string | undefined;\n}): string | undefined {\n return normalizeQuestionTopicId(scope.topicId) ?? scope.projectId ?? undefined;\n}\n\nasync function resolveQuestionScopeOrNull(ctx: any, args: QuestionScopeArgs) {\n if (!args.projectId && !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 {\n return null;\n }\n}\n\nasync function getQuestionNodesForScope(\n ctx: any,\n scope: Awaited<ReturnType<typeof resolveTopicProjectScope>>,\n args?: { scanLimit?: number }\n): Promise<QuestionNodeDoc[]> {\n const fetchNodes = (query: any) =>\n typeof args?.scanLimit === \"number\"\n ? query.order(\"desc\").take(args.scanLimit)\n : query.collect();\n\n const [topicNodes, projectNodes] = await Promise.all([\n scope.topicId\n ? fetchNodes(\n ctx.db.query(\"epistemicNodes\").withIndex(\"by_topic_type\", (q: any) =>\n q.eq(\"topicId\", scope.topicId).eq(\"nodeType\", \"question\")\n )\n )\n : Promise.resolve([]),\n scope.projectId\n ? fetchNodes(\n ctx.db\n .query(\"epistemicNodes\")\n .withIndex(\"by_project_type\", (q: any) =>\n q.eq(\"projectId\", scope.projectId).eq(\"nodeType\", \"question\")\n )\n )\n : Promise.resolve([]),\n ]);\n\n return dedupeQuestionNodes([...topicNodes, ...projectNodes]).filter((node) =>\n questionMatchesScope(node, scope)\n );\n}\n\nasync function getQuestionEdgesForScope(\n ctx: any,\n scope: Awaited<ReturnType<typeof resolveTopicProjectScope>>\n) {\n const query = ctx.db\n .query(\"epistemicEdges\")\n .withIndex(\"by_topic\", (q: any) =>\n q.eq(\"topicId\", scope.topicId || scope.projectId)\n );\n\n return await query.collect();\n}\n\nfunction questionMatchesScope(\n node: Pick<QuestionNodeDoc, \"topicId\" | \"projectId\">,\n scope: Awaited<ReturnType<typeof resolveTopicProjectScope>>\n): boolean {\n return (\n (scope.topicId !== undefined && node.topicId === scope.topicId) ||\n (scope.projectId !== undefined && node.projectId === scope.projectId)\n );\n}\n\nexport function resolveLinkedWorktreeId(\n meta: Record<string, unknown>\n): string | null {\n const linkedWorktreeId = meta.linkedWorktreeId;\n return typeof linkedWorktreeId === \"string\" && linkedWorktreeId.trim()\n ? linkedWorktreeId\n : null;\n}\n\nfunction buildLinkedWorktreeMetadata(\n linkedWorktreeId: string | null | undefined\n): Record<string, string> {\n return linkedWorktreeId\n ? {\n linkedWorktreeId,\n }\n : {};\n}\n\nfunction questionMatchesWorkflowLink(\n meta: Record<string, unknown>,\n workflow: {\n worktreeId?: string | null;\n sprintId?: string | null;\n }\n): boolean {\n const linkedWorktreeId = resolveLinkedWorktreeId(meta);\n return Boolean(\n linkedWorktreeId &&\n (linkedWorktreeId === workflow.worktreeId ||\n linkedWorktreeId === workflow.sprintId)\n );\n}\n\nasync function resolveQuestionLinkedSprintId(\n ctx: {\n db: { get: (...args: any[]) => Promise<unknown>; query?: (...args: any[]) => any };\n },\n args: {\n sprintId?: string | null;\n worktreeId?: string | null;\n },\n meta: Record<string, unknown>\n): Promise<string | null> {\n const workflowId =\n args.sprintId ?? args.worktreeId ?? resolveLinkedWorktreeId(meta);\n if (!workflowId) {\n return null;\n }\n\n const workflow = await resolveWorkflowBridgeDoc(ctx, workflowId);\n return workflow.sprintId;\n}\n\nexport function flattenQuestionNode(n: QuestionNodeDoc) {\n const meta = (n.metadata || {}) as Record<string, unknown>;\n const linkedWorktreeId = resolveLinkedWorktreeId(meta);\n return {\n ...n,\n question: n.canonicalText || \"\",\n category: (meta.category as string) || \"other\",\n priority: (meta.priority as string) || \"medium\",\n status:\n (meta.questionStatus as string) || (meta.status as string) || \"open\",\n beliefId: meta.linkedBeliefNodeId || meta.beliefId || null,\n relatedBeliefIds: (meta.relatedBeliefIds as string[]) || [],\n relatedInsightIds: (meta.relatedInsightIds as string[]) || [],\n linkedWorktreeId,\n sprintIndex: (meta.sprintIndex as number) || undefined,\n linkedBeliefId: meta.linkedBeliefNodeId || null,\n testType: (meta.testType as string) || \"validates\",\n importance: (meta.importance as number) || 5,\n isKeyQuestion: (meta.isKeyQuestion as boolean) || false,\n answer: (meta.answer as string) || null,\n convictionStage: (meta.convictionStage as string) || null,\n conviction: meta.conviction ?? null,\n source: (meta.source as string) || \"ai_suggested\",\n };\n}\n\nfunction flattenInternalQuestionNode(n: QuestionNodeDoc) {\n const meta = (n.metadata || {}) as Record<string, unknown>;\n const flattened = flattenQuestionNode(n);\n return {\n ...flattened,\n _epistemicNodeId: n._id,\n questionType:\n n.questionType || (meta.questionType as string) || flattened.testType,\n linkedBeliefIds: flattened.relatedBeliefIds,\n audienceLabel: n.audienceLabel,\n policyTags: n.policyTags,\n sensitivityTier: n.sensitivityTier,\n exportClass: n.exportClass,\n anonymizationClass: n.anonymizationClass,\n };\n}\n\nconst INACTIVE_NODE_STATUSES = new Set([\"archived\", \"superseded\", \"deleted\"]);\n\nfunction requireScopeId(...ids: (string | undefined)[]): string {\n for (const id of ids) {\n if (typeof id === \"string\" && id.trim().length > 0) return id;\n }\n throw new Error(\"No scope identifier provided (topicId or projectId required)\");\n}\n\nconst INACTIVE_METADATA_STATUSES = new Set([\n \"archived\",\n \"superseded\",\n \"deleted\",\n]);\n\nfunction getQuestionStatusCandidates(node: QuestionNodeDoc): string[] {\n const meta = (node.metadata || {}) as Record<string, unknown>;\n return [meta.questionStatus, meta.status, node.status].filter(\n (value): value is string => typeof value === \"string\"\n );\n}\n\nexport function isActiveQuestionNode(node: QuestionNodeDoc): boolean {\n if (INACTIVE_NODE_STATUSES.has(node.status)) {\n return false;\n }\n return !getQuestionStatusCandidates(node).some((status) =>\n INACTIVE_METADATA_STATUSES.has(status.toLowerCase())\n );\n}\n\nexport function matchesRequestedQuestionStatus(\n node: QuestionNodeDoc,\n requestedStatus: string\n): boolean {\n const normalizedStatus = requestedStatus.toLowerCase();\n return getQuestionStatusCandidates(node).some(\n (status) => status.toLowerCase() === normalizedStatus\n );\n}\n\n// =============================================================================\n// CREATE\n// =============================================================================\n\n/**\n * Create a new question in the epistemic spine.\n * Returns the epistemicNodes ID directly (not a questions ID).\n */\nexport const create = mutation({\n args: {\n ...optionalScopeArgs,\n question: v.string(),\n category: v.optional(v.string()),\n priority: v.optional(\n v.union(v.literal(\"high\"), v.literal(\"medium\"), v.literal(\"low\"))\n ),\n source: v.optional(v.string()),\n userId: v.string(),\n // Optional linking\n linkedBeliefNodeId: v.optional(v.id(\"epistemicNodes\")),\n testType: v.optional(\n v.union(\n v.literal(\"validates\"),\n v.literal(\"invalidates\"),\n v.literal(\"clarifies\")\n )\n ),\n // Optional metadata\n importance: v.optional(v.number()),\n epistemicUnlock: v.optional(v.string()),\n // === SOURCE QUESTIONS (for key question derivation) ===\n // When a key question is synthesized from raw questions, track the source\n sourceQuestionIds: v.optional(v.array(v.string())), // globalIds of source questions\n // === WORKTREE LINKAGE ===\n linkedWorktreeId: v.optional(v.string()),\n // === CLASSIFICATION FIELDS ===\n questionType: v.optional(\n v.union(\n v.literal(\"validation\"),\n v.literal(\"falsification\"),\n v.literal(\"assumption_probe\"),\n v.literal(\"prediction_test\"),\n v.literal(\"counterfactual\"),\n v.literal(\"discovery\"),\n v.literal(\"clarification\"),\n v.literal(\"comparison\"),\n v.literal(\"causal\"),\n v.literal(\"mechanism\"),\n v.literal(\"general\")\n )\n ),\n questionPriority: v.optional(\n v.union(\n v.literal(\"critical\"),\n v.literal(\"high\"),\n v.literal(\"medium\"),\n v.literal(\"low\")\n )\n ),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const scope = await resolveTopicProjectScope(ctx, {\n topicId: args.topicId,\n projectId: args.projectId,\n });\n assertWorkspaceScopedEpistemicNodeScope({\n scope,\n nodeType: \"question\",\n mutationName: \"epistemicQuestions.create\",\n });\n if (scope.projectId) {\n await checkProjectAccess(ctx, scope.projectId, args.userId);\n }\n\n const now = Date.now();\n const globalId = generateGlobalId();\n const contentHash = generateContentHash(args.question);\n const category = normalizeCategory(args.category);\n\n // Create ONLY in epistemicNodes (no questions table!)\n const nodeId = await ctx.db.insert(\"epistemicNodes\", {\n globalId,\n topicId: scope.topicId,\n projectId: scope.projectId,\n tenantId: scope.tenantId,\n workspaceId: scope.workspaceId,\n nodeType: \"question\",\n canonicalText: args.question,\n contentHash,\n status: \"active\",\n epistemicLayer: \"L3\", // L3: Traversal Anchors (Questions)\n sourceType: args.source === \"user\" ? \"human\" : \"ai_generated\",\n // Classification fields\n questionType: args.questionType ?? \"general\",\n questionPriority: args.questionPriority ?? \"medium\",\n answerQuality: \"unanswered\", // New questions start unanswered\n createdAt: now,\n updatedAt: now,\n createdBy: args.userId,\n metadata: {\n category,\n priority: args.priority || \"medium\",\n source: args.source || \"ai_suggested\",\n questionStatus: \"open\",\n linkedBeliefNodeId: args.linkedBeliefNodeId,\n ...buildLinkedWorktreeMetadata(\n args.linkedWorktreeId\n ),\n testType: args.testType,\n importance: args.importance,\n epistemicUnlock: args.epistemicUnlock,\n // Track source questions for key question derivation\n prerequisiteQuestions: args.sourceQuestionIds,\n },\n });\n\n // Schedule Neo4j sync for the new node.\n await ctx.scheduler.runAfter(0, internal.neo4jSync.syncNodeToNeo4j, {\n nodeId,\n operation: \"upsert\",\n });\n\n // Schedule embedding generation\n await scheduleEmbeddingGeneration({\n ctx, nodeId, projectId: scope.projectId, topicId: scope.topicId,\n createdBy: args.userId, nodeType: \"question\", text: args.question,\n });\n\n // NOTE: We no longer create prerequisite_for edges between questions.\n // Raw questions are excluded from the graph once key questions exist,\n // so the edges create unnecessary noise without providing value.\n // The sourceQuestionIds are still tracked in metadata for reference only.\n\n // If linked to a belief, create tests edge through Neo4j authority path.\n if (args.linkedBeliefNodeId) {\n const beliefNode = await ctx.db.get(args.linkedBeliefNodeId);\n if (beliefNode?.globalId) {\n await ctx.scheduler.runAfter(100, internal.neo4jSync.syncNodeToNeo4j, {\n nodeId: args.linkedBeliefNodeId,\n operation: \"upsert\",\n });\n\n const edgeGlobalId = buildTestsEdgeGlobalId(\n beliefNode.globalId,\n globalId\n );\n await ctx.scheduler.runAfter(250, internal.neo4jEdgeAPI.createEdge, {\n globalId: edgeGlobalId,\n fromGlobalId: beliefNode.globalId,\n toGlobalId: globalId,\n edgeType: \"tests\",\n weight: 1.0,\n context: args.testType || \"tests\",\n createdBy: args.userId,\n topicId: scope.projectId ? String(scope.projectId) : undefined,\n fromNodeType: \"belief\",\n toNodeType: \"question\",\n fromLayer: \"L3\",\n toLayer: \"L3\",\n });\n }\n }\n\n // Log to audit\n await ctx.db.insert(\"epistemicAudit\", {\n entityType: \"question\",\n entityId: nodeId,\n changeType: \"created\",\n changedAt: now,\n changedBy: args.userId,\n isAgent: false,\n projectId: scope.projectId,\n newState: {\n question: args.question,\n category,\n priority: args.priority || \"medium\",\n },\n });\n\n // Schedule embedding generation for semantic search.\n // topicId alone is sufficient for Lucern deployments (no projects table).\n if (scope.projectId || scope.topicId) {\n await ctx.scheduler.runAfter(\n 0,\n \"embeddingActions:generateEpistemicNodeEmbedding\" as any,\n {\n nodeId,\n projectId: scope.projectId,\n topicId: scope.topicId ? String(scope.topicId) : undefined,\n createdBy: args.userId,\n nodeType: \"question\" as const,\n text: args.question,\n hasAnswer: false,\n }\n );\n }\n\n // ==========================================================================\n // ONTOLOGY: Schedule question classification for entity extraction\n // ==========================================================================\n if (scope.projectId || scope.topicId) {\n await ctx.scheduler.runAfter(\n 2000, // 2 second delay\n internal.nodeClassification.scheduleClassification,\n {\n nodeId,\n nodeType: \"question\",\n projectId: scope.projectId,\n topicId: normalizeQuestionTopicId(scope.topicId),\n }\n );\n }\n\n await markProjectGraphDirty(\n ctx,\n scope.projectId,\n normalizeQuestionTopicId(scope.topicId)\n );\n\n return { nodeId };\n },\n});\n\n/**\n * Create multiple questions in batch (for efficiency)\n */\nexport const createBatch = mutation({\n args: {\n ...optionalScopeArgs,\n questions: v.array(\n v.object({\n question: v.string(),\n category: v.optional(v.string()),\n priority: v.optional(\n v.union(v.literal(\"high\"), v.literal(\"medium\"), v.literal(\"low\"))\n ),\n linkedBeliefNodeId: v.optional(v.id(\"epistemicNodes\")),\n testType: v.optional(\n v.union(\n v.literal(\"validates\"),\n v.literal(\"invalidates\"),\n v.literal(\"clarifies\")\n )\n ),\n })\n ),\n source: v.optional(v.string()),\n userId: v.string(),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const scope = await resolveTopicProjectScope(ctx, {\n topicId: args.topicId,\n projectId: args.projectId,\n });\n const scopeId = resolveQuestionScopeId(scope);\n if (!scopeId) {\n throw new Error(\"No scope identifier provided\");\n }\n const hasAccess = await checkScopeAccess(ctx, scopeId, args.userId);\n if (!hasAccess) {\n throw new Error(\"Access denied\");\n }\n\n const now = Date.now();\n const nodeIds: Id<\"epistemicNodes\">[] = [];\n\n for (const q of args.questions) {\n const globalId = generateGlobalId();\n const contentHash = generateContentHash(q.question);\n const category = normalizeCategory(q.category);\n\n const nodeId = await ctx.db.insert(\"epistemicNodes\", {\n globalId,\n topicId: scope.topicId,\n projectId: scope.projectId,\n tenantId: scope.tenantId,\n workspaceId: scope.workspaceId,\n nodeType: \"question\",\n canonicalText: q.question,\n contentHash,\n status: \"active\",\n epistemicLayer: \"L3\",\n sourceType: args.source === \"user\" ? \"human\" : \"ai_generated\",\n createdAt: now,\n updatedAt: now,\n createdBy: args.userId,\n metadata: {\n category,\n priority: q.priority || \"medium\",\n source: args.source || \"ai_suggested\",\n questionStatus: \"open\",\n linkedBeliefNodeId: q.linkedBeliefNodeId,\n testType: q.testType,\n },\n });\n\n nodeIds.push(nodeId);\n\n await ctx.db.insert(\"epistemicAudit\", {\n entityType: \"question\",\n entityId: String(nodeId),\n changeType: \"created\",\n changedAt: now,\n changedBy: args.userId,\n isAgent: false,\n projectId: scope.projectId,\n topicId: normalizeQuestionTopicId(scope.topicId),\n newState: {\n question: q.question,\n category,\n priority: q.priority || \"medium\",\n source: args.source || \"ai_suggested\",\n linkedBeliefNodeId: q.linkedBeliefNodeId,\n testType: q.testType,\n },\n triggeringAction: \"epistemicQuestions.createBatch\",\n });\n\n // Schedule Neo4j sync\n await ctx.scheduler.runAfter(0, internal.neo4jSync.syncNodeToNeo4j, {\n nodeId,\n operation: \"upsert\",\n });\n\n // Create edge if linked to belief (directly in Neo4j)\n if (q.linkedBeliefNodeId) {\n const beliefNode = await ctx.db.get(q.linkedBeliefNodeId);\n if (beliefNode) {\n await ctx.scheduler.runAfter(0, internal.neo4jEdgeAPI.createEdge, {\n globalId: crypto.randomUUID(),\n fromGlobalId: beliefNode.globalId,\n toGlobalId: globalId,\n edgeType: \"tests\",\n weight: 1.0,\n createdBy: args.userId,\n topicId: scope.projectId,\n fromNodeType: \"belief\",\n toNodeType: \"question\",\n fromLayer: \"L3\",\n toLayer: \"L3\",\n });\n }\n }\n }\n\n await markProjectGraphDirty(\n ctx,\n scope.projectId,\n normalizeQuestionTopicId(scope.topicId)\n );\n\n return { nodeIds, count: nodeIds.length };\n },\n});\n\n// =============================================================================\n// UPDATE\n// =============================================================================\n\n/**\n * Update a question's status (open, researching, answered, etc.)\n */\nexport const updateStatus = mutation({\n args: {\n nodeId: v.optional(v.id(\"epistemicNodes\")),\n // Backward compatibility for older callers still sending questionId.\n questionId: v.optional(v.union(v.id(\"epistemicNodes\"), v.string())),\n status: v.union(\n v.literal(\"open\"),\n v.literal(\"researching\"),\n v.literal(\"answered\"),\n v.literal(\"parked\"),\n v.literal(\"closed\")\n ),\n userId: v.optional(v.string()),\n answer: v.optional(v.string()),\n answerStatus: v.optional(\n v.union(\n v.literal(\"ai_draft\"),\n v.literal(\"user_draft\"),\n v.literal(\"final\")\n )\n ),\n runtimeToolName: v.optional(v.string()),\n runtimePackKey: v.optional(v.string()),\n runtimePackInstallScope: v.optional(\n v.union(v.literal(\"tenant\"), v.literal(\"workspace\"))\n ),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const resolvedNodeId = (args.nodeId ?? args.questionId) as\n | Id<\"epistemicNodes\">\n | undefined;\n if (!resolvedNodeId) {\n throw new Error(\"Missing nodeId/questionId\");\n }\n const resolvedUserId = args.userId || (await getCurrentUserId(ctx));\n if (!resolvedUserId) {\n throw new Error(\"Not authenticated\");\n }\n\n const node = await ctx.db.get(resolvedNodeId);\n if (!node || node.nodeType !== \"question\") {\n throw new Error(\"Question not found\");\n }\n assertTenantPackWorkspaceMutationAllowed({\n runtime: resolveRuntimePackMutationContext(args),\n target: await resolveNodeScopeForWorkspaceIsolation(ctx, node),\n mutationName: \"epistemicQuestions.updateStatus\",\n });\n\n const now = Date.now();\n const metadata = (node.metadata || {}) as Record<string, unknown>;\n const previousStatus = metadata.questionStatus || \"open\";\n\n await ctx.db.patch(resolvedNodeId, {\n updatedAt: now,\n metadata: {\n ...metadata,\n questionStatus: args.status,\n answer: args.answer || metadata.answer,\n answerStatus: args.answerStatus || metadata.answerStatus,\n answeredAt: args.status === \"answered\" ? now : metadata.answeredAt,\n answeredBy:\n args.status === \"answered\" ? resolvedUserId : metadata.answeredBy,\n },\n });\n\n // If answered with answer text, schedule answer node creation\n if (args.status === \"answered\" && args.answer) {\n await ctx.scheduler.runAfter(\n 0,\n internal.epistemicAnswers.createInternal,\n {\n projectId: node.projectId,\n topicId: normalizeQuestionTopicId(node.topicId),\n questionNodeId: resolvedNodeId,\n answerText: args.answer,\n answerSource: \"human\",\n userId: resolvedUserId,\n }\n );\n }\n\n // Log to audit\n await ctx.db.insert(\"epistemicAudit\", {\n entityType: \"question\",\n entityId: resolvedNodeId,\n changeType: \"status_changed\",\n changedAt: now,\n changedBy: resolvedUserId,\n isAgent: false,\n projectId: node.projectId,\n previousState: { status: previousStatus },\n newState: { status: args.status },\n });\n\n // Sync to Neo4j\n await ctx.scheduler.runAfter(0, internal.neo4jSync.syncNodeToNeo4j, {\n nodeId: resolvedNodeId,\n operation: \"upsert\",\n });\n\n await markProjectGraphDirty(ctx, node.projectId, node.topicId);\n\n return { nodeId: resolvedNodeId, previousStatus, newStatus: args.status };\n },\n});\n\n/**\n * Update question priority\n *\n * Note: Convex mutations are serialized per-document, so concurrent updates\n * to the same question will be processed sequentially, not in parallel.\n */\nexport const updatePriority = mutation({\n args: {\n nodeId: v.id(\"epistemicNodes\"),\n priority: v.union(v.literal(\"high\"), v.literal(\"medium\"), v.literal(\"low\")),\n userId: v.string(),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const node = await ctx.db.get(args.nodeId);\n if (!node || node.nodeType !== \"question\") {\n throw new Error(\"Question not found\");\n }\n\n const now = Date.now();\n const metadata = (node.metadata || {}) as Record<string, unknown>;\n const previousPriority = metadata.priority || \"medium\";\n\n await ctx.db.patch(args.nodeId, {\n updatedAt: now,\n metadata: {\n ...metadata,\n priority: args.priority,\n },\n });\n\n // Log to audit (was missing)\n await ctx.db.insert(\"epistemicAudit\", {\n entityType: \"question\",\n entityId: args.nodeId,\n changeType: \"priority_changed\" as any,\n changedAt: now,\n changedBy: args.userId,\n isAgent: false,\n projectId: node.projectId,\n previousState: { priority: previousPriority },\n newState: { priority: args.priority },\n });\n\n await markProjectGraphDirty(ctx, node.projectId, node.topicId);\n\n return { nodeId: args.nodeId };\n },\n});\n\n// =============================================================================\n// QUERIES\n// =============================================================================\n\n/**\n * Get a question by ID\n */\nexport const getById = query({\n args: {\n nodeId: v.optional(v.id(\"epistemicNodes\")),\n questionId: v.optional(v.string()),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const id = args.nodeId ?? (args.questionId as any);\n if (!id) {\n return null;\n }\n const node = (await ctx.db.get(\n id as Id<\"epistemicNodes\">\n )) as QuestionNodeDoc | null;\n if (!node || node.nodeType !== \"question\") {\n return null;\n }\n return flattenQuestionNode(node);\n },\n});\n\n/**\n * Get all questions for a project\n */\nexport const getByProject = query({\n args: {\n ...optionalScopeArgs,\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) => {\n const scope = await resolveQuestionScopeOrNull(ctx, args);\n if (!scope) {\n return [];\n }\n\n const pageSize = clampQuestionLimit(args.limit);\n const scanLimit = Math.min(pageSize * 3, MAX_QUESTION_PAGE_SIZE);\n\n if (args.userId) {\n const scopeId = resolveQuestionScopeId(scope);\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 workspaceScopedNodes = await getQuestionNodesForScope(ctx, scope, {\n scanLimit,\n });\n\n const scopedNodes = args.status\n ? workspaceScopedNodes.filter((node) =>\n matchesRequestedQuestionStatus(node, args.status!)\n )\n : workspaceScopedNodes.filter(isActiveQuestionNode);\n\n return scopedNodes.map(flattenQuestionNode).slice(0, pageSize);\n },\n});\n\n/**\n * Get all questions for a topic.\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) => {\n const pageSize = clampQuestionLimit(args.limit);\n const scanLimit = Math.min(pageSize * 3, MAX_QUESTION_PAGE_SIZE);\n const scope = await resolveTopicProjectScope(ctx, { topicId: args.topicId });\n const scopedNodes = await getQuestionNodesForScope(ctx, scope, {\n scanLimit,\n });\n\n const filteredNodes = args.status\n ? scopedNodes.filter((node) =>\n matchesRequestedQuestionStatus(node, args.status!)\n )\n : scopedNodes.filter(isActiveQuestionNode);\n\n return filteredNodes.map(flattenQuestionNode).slice(0, pageSize);\n },\n});\n\n/**\n * Get questions by category/pillar\n */\nexport const getByCategory = query({\n args: {\n ...optionalScopeArgs,\n category: v.string(),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const scope = await resolveQuestionScopeOrNull(ctx, args);\n if (!scope) {\n return [];\n }\n\n const nodes = await getQuestionNodesForScope(ctx, scope);\n\n return nodes.filter((n) => {\n const metadata = (n.metadata || {}) as Record<string, unknown>;\n return questionMatchesScope(n, scope) && (\n isActiveQuestionNode(n) &&\n metadata.category === normalizeCategory(args.category)\n );\n });\n },\n});\n\n/**\n * Get questions linked to a specific belief\n */\nexport const getForBelief = query({\n args: {\n beliefNodeId: v.id(\"epistemicNodes\"),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n // Find edges from the belief to questions\n const edges = await ctx.db\n .query(\"epistemicEdges\")\n .withIndex(\"by_from_type\", (q) =>\n q.eq(\"fromNodeId\", args.beliefNodeId).eq(\"edgeType\", \"tests\")\n )\n .collect();\n\n // Get the question nodes\n const questionNodeIds = edges\n .map((e) => e.toNodeId)\n .filter(Boolean) as Id<\"epistemicNodes\">[];\n const questions = await Promise.all(\n questionNodeIds.map((id) => ctx.db.get(id))\n );\n\n return questions.filter(\n (q) =>\n q !== null &&\n (q as any).nodeType === \"question\" &&\n isActiveQuestionNode(q as QuestionNodeDoc)\n );\n },\n});\n\n// =============================================================================\n// INTERNAL QUERIES (for other Convex modules)\n// =============================================================================\n\n/**\n * Internal query to get questions for a project\n */\nexport const internalGetByProject = internalQuery({\n args: {\n ...optionalScopeArgs,\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) => {\n const pageSize = clampQuestionLimit(args.limit, 500);\n const scanLimit = Math.min(pageSize * 3, MAX_QUESTION_PAGE_SIZE);\n const audienceMode = args.audienceMode ?? \"internal\";\n const scope = await resolveTopicProjectScope(ctx, {\n projectId: args.projectId,\n topicId: args.topicId,\n });\n const projectScopeId = resolveQuestionScopeId(scope);\n if (!projectScopeId) {\n return [];\n }\n const project = await resolveGraphPrimitivesAppResolvers(ctx).getProject(\n ctx,\n projectScopeId\n );\n const registryRows = await listAudienceRegistryRows(ctx, {\n tenantId: project?.tenantId,\n workspaceId: project?.workspaceId,\n });\n const audienceClassByKey = new Map(\n registryRows.map((row) => [\n normalizeAudienceKey(row.audienceKey),\n row.audienceClass,\n ])\n );\n const resolveAudienceClass = (\n audienceKey: string | undefined | null,\n fallback: \"public\" | \"internal\"\n ) => {\n const key = normalizeAudienceKey(audienceKey);\n if (!key) {\n return fallback;\n }\n return audienceClassByKey.get(key) ?? classFromAudienceKey(key, fallback);\n };\n const viewerClass = resolveAudienceClass(audienceMode, \"public\");\n\n const nodes = await getQuestionNodesForScope(ctx, scope, { scanLimit });\n const workspaceScopedNodes = nodes.filter((node) =>\n nodeMatchesWorkspaceReasoningScope(node, {\n tenantId: project?.tenantId,\n workspaceId: project?.workspaceId,\n })\n );\n\n const visibleNodes = workspaceScopedNodes.filter((node) =>\n canAudienceClassAccess(\n viewerClass,\n resolveAudienceClass(node.audienceLabel, \"internal\")\n )\n );\n\n const scopedNodes = args.status\n ? visibleNodes.filter((node) =>\n matchesRequestedQuestionStatus(node, args.status!)\n )\n : visibleNodes.filter(isActiveQuestionNode);\n\n // Map to flattened format for internal callers\n return scopedNodes.slice(0, pageSize).map(flattenInternalQuestionNode);\n },\n});\n\n/**\n * Internal query to get questions for a topic.\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) => {\n const pageSize = clampQuestionLimit(args.limit, 500);\n const scanLimit = Math.min(pageSize * 3, MAX_QUESTION_PAGE_SIZE);\n const audienceMode = args.audienceMode ?? \"internal\";\n const scope = await resolveTopicProjectScope(ctx, { topicId: args.topicId });\n const registryRows = await listAudienceRegistryRows(ctx, {\n tenantId: scope.tenantId,\n workspaceId: scope.workspaceId,\n });\n const audienceClassByKey = new Map(\n registryRows.map((row) => [\n normalizeAudienceKey(row.audienceKey),\n row.audienceClass,\n ])\n );\n const resolveAudienceClass = (\n audienceKey: string | undefined | null,\n fallback: \"public\" | \"internal\"\n ) => {\n const key = normalizeAudienceKey(audienceKey);\n if (!key) {\n return fallback;\n }\n return audienceClassByKey.get(key) ?? classFromAudienceKey(key, fallback);\n };\n const viewerClass = resolveAudienceClass(audienceMode, \"public\");\n\n const nodes = await getQuestionNodesForScope(ctx, scope, { scanLimit });\n const workspaceScopedNodes = nodes.filter((node) =>\n nodeMatchesWorkspaceReasoningScope(node, {\n tenantId: scope.tenantId,\n workspaceId: scope.workspaceId,\n })\n );\n\n const visibleNodes = workspaceScopedNodes.filter((node) =>\n canAudienceClassAccess(\n viewerClass,\n resolveAudienceClass(node.audienceLabel, \"internal\")\n )\n );\n\n const scopedNodes = args.status\n ? visibleNodes.filter((node) =>\n matchesRequestedQuestionStatus(node, args.status!)\n )\n : visibleNodes.filter(isActiveQuestionNode);\n\n return scopedNodes.slice(0, pageSize).map(flattenInternalQuestionNode);\n },\n});\n\n/**\n * Internal mutation to create a question (for other Convex modules)\n */\nexport const internalCreate = internalMutation({\n args: {\n ...optionalScopeArgs,\n question: v.string(),\n category: v.optional(v.string()),\n priority: v.optional(v.string()),\n source: v.optional(v.string()),\n userId: v.string(),\n linkedBeliefNodeId: v.optional(v.id(\"epistemicNodes\")),\n testType: v.optional(v.string()),\n runtimeToolName: v.optional(v.string()),\n runtimePackKey: v.optional(v.string()),\n runtimePackInstallScope: v.optional(\n v.union(v.literal(\"tenant\"), v.literal(\"workspace\"))\n ),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const now = Date.now();\n const scope = await resolveTopicProjectScope(ctx, {\n topicId: args.topicId,\n projectId: args.projectId,\n });\n assertWorkspaceScopedEpistemicNodeScope({\n scope,\n nodeType: \"question\",\n mutationName: \"epistemicQuestions.internalCreate\",\n });\n assertTenantPackWorkspaceMutationAllowed({\n runtime: resolveRuntimePackMutationContext(args),\n target: {\n tenantId: scope.tenantId,\n workspaceId: scope.workspaceId,\n nodeType: \"question\",\n epistemicLayer: \"L3\",\n },\n mutationName: \"epistemicQuestions.internalCreate\",\n });\n const globalId = generateGlobalId();\n const contentHash = generateContentHash(args.question);\n const category = normalizeCategory(args.category);\n\n const nodeId = await ctx.db.insert(\"epistemicNodes\", {\n globalId,\n topicId: scope.topicId,\n projectId: scope.projectId,\n tenantId: scope.tenantId,\n workspaceId: scope.workspaceId,\n nodeType: \"question\",\n canonicalText: args.question,\n contentHash,\n status: \"active\",\n epistemicLayer: \"L3\",\n sourceType: args.source === \"user\" ? \"human\" : \"ai_generated\",\n createdAt: now,\n updatedAt: now,\n createdBy: args.userId,\n metadata: {\n category,\n priority: args.priority || \"medium\",\n source: args.source || \"ai_suggested\",\n questionStatus: \"open\",\n linkedBeliefNodeId: args.linkedBeliefNodeId,\n testType: args.testType,\n },\n });\n\n // Schedule Neo4j sync\n await ctx.scheduler.runAfter(0, internal.neo4jSync.syncNodeToNeo4j, {\n nodeId,\n operation: \"upsert\",\n });\n\n // Create edge if linked to belief (directly in Neo4j)\n if (args.linkedBeliefNodeId) {\n const beliefNode = await ctx.db.get(args.linkedBeliefNodeId);\n if (beliefNode) {\n await ctx.scheduler.runAfter(0, internal.neo4jEdgeAPI.createEdge, {\n globalId: crypto.randomUUID(),\n fromGlobalId: beliefNode.globalId,\n toGlobalId: globalId,\n edgeType: \"tests\",\n weight: 1.0,\n createdBy: args.userId,\n topicId: scope.projectId ? String(scope.projectId) : undefined,\n fromNodeType: \"belief\",\n toNodeType: \"question\",\n fromLayer: \"L3\",\n toLayer: \"L3\",\n });\n }\n }\n\n // Schedule embedding generation for semantic search.\n // topicId alone is sufficient for Lucern deployments (no projects table).\n if (scope.projectId || scope.topicId) {\n await ctx.scheduler.runAfter(\n 0,\n \"embeddingActions:generateEpistemicNodeEmbedding\" as any,\n {\n nodeId,\n projectId: scope.projectId,\n topicId: scope.topicId ? String(scope.topicId) : undefined,\n createdBy: args.userId,\n nodeType: \"question\" as const,\n text: args.question,\n hasAnswer: false,\n }\n );\n }\n\n await markProjectGraphDirty(\n ctx,\n scope.projectId,\n normalizeQuestionTopicId(scope.topicId)\n );\n\n return { nodeId };\n },\n});\n\n// =============================================================================\n// MUTATIONS\n// =============================================================================\n\n/**\n * Add a question to the epistemic graph\n */\nexport const addQuestion = mutation({\n args: {\n ...optionalScopeArgs,\n question: v.string(),\n category: v.optional(v.string()),\n priority: v.optional(v.string()),\n source: v.optional(v.string()),\n userId: v.string(),\n beliefId: v.optional(v.string()),\n chatId: v.optional(v.string()),\n importance: v.optional(v.number()),\n epistemicUnlock: v.optional(v.string()),\n metadata: v.optional(v.any()),\n questionType: v.optional(v.string()),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const scope = await resolveTopicProjectScope(ctx, {\n topicId: args.topicId,\n projectId: args.projectId,\n });\n const scopeId = resolveQuestionScopeId(scope);\n if (!scopeId) {\n throw new Error(\"No scope identifier provided\");\n }\n const hasAccess = await checkScopeAccess(ctx, scopeId, args.userId);\n if (!hasAccess) {\n throw new Error(\"Access denied\");\n }\n\n const now = Date.now();\n const globalId = generateGlobalId();\n const contentHash = generateContentHash(args.question);\n const category = normalizeCategory(args.category);\n const additionalMetadata =\n args.metadata && typeof args.metadata === \"object\"\n ? (args.metadata as Record<string, unknown>)\n : {};\n\n // Create in epistemicNodes\n const nodeId = await ctx.db.insert(\"epistemicNodes\", {\n globalId,\n topicId: scope.topicId,\n projectId: scope.projectId,\n tenantId: scope.tenantId,\n workspaceId: scope.workspaceId,\n nodeType: \"question\",\n canonicalText: args.question,\n contentHash,\n status: \"active\",\n epistemicLayer: \"L3\",\n sourceType: args.source === \"user\" ? \"human\" : \"ai_generated\",\n createdAt: now,\n updatedAt: now,\n createdBy: args.userId,\n metadata: {\n ...additionalMetadata,\n category,\n priority: args.priority || \"medium\",\n source: args.source || \"ai_suggested\",\n questionStatus: \"open\",\n beliefId: args.beliefId,\n linkedBeliefId: args.beliefId,\n chatId: args.chatId,\n importance: args.importance,\n epistemicUnlock: args.epistemicUnlock,\n },\n });\n\n await ctx.db.insert(\"epistemicAudit\", {\n entityType: \"question\",\n entityId: String(nodeId),\n changeType: \"created\",\n changedAt: now,\n changedBy: args.userId,\n isAgent: false,\n projectId: scope.projectId,\n topicId: normalizeQuestionTopicId(scope.topicId),\n newState: {\n ...additionalMetadata,\n question: args.question,\n category,\n priority: args.priority || \"medium\",\n source: args.source || \"ai_suggested\",\n beliefId: args.beliefId,\n chatId: args.chatId,\n importance: args.importance,\n epistemicUnlock: args.epistemicUnlock,\n },\n triggeringAction: \"epistemicQuestions.addQuestion\",\n });\n\n // Sync to Neo4j\n await ctx.scheduler.runAfter(0, internal.neo4jSync.syncNodeToNeo4j, {\n nodeId,\n operation: \"upsert\",\n });\n\n // Generate embedding\n await ctx.scheduler.runAfter(\n 0,\n \"embeddingActions:generateEpistemicNodeEmbedding\" as any,\n {\n nodeId,\n projectId: scope.projectId,\n topicId: normalizeQuestionTopicId(scope.topicId),\n createdBy: args.userId,\n nodeType: \"question\" as const,\n text: args.question,\n hasAnswer: false,\n }\n );\n\n await markProjectGraphDirty(\n ctx,\n scope.projectId,\n normalizeQuestionTopicId(scope.topicId)\n );\n\n return nodeId;\n },\n});\n\n// =============================================================================\n// EVIDENCE CREATION FROM SCORED QUESTIONS\n// =============================================================================\n\n/**\n * Create an L2 evidence node from a scored question's answer and link it to\n * the tested belief(s) via INFORMS edges. This bridges the sprint question\n * workflow to the evidence graph so computeSprintConviction can score beliefs.\n *\n * Called as a side-effect when a question is finalized with conviction scoring.\n */\nexport const createEvidenceFromScoredQuestion = internalMutation({\n args: {\n questionNodeId: v.id(\"epistemicNodes\"),\n questionText: v.string(),\n answerText: v.string(),\n beliefId: v.string(),\n relatedBeliefIds: v.array(v.string()),\n conviction: v.number(),\n rationale: v.string(),\n ...optionalScopeArgs,\n userId: v.string(),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const now = Date.now();\n\n // Check if evidence was already created for this question (idempotent)\n const questionNode = await ctx.db.get(args.questionNodeId);\n if (!questionNode) {\n return;\n }\n const qMeta = (questionNode.metadata || {}) as Record<string, unknown>;\n if (qMeta.evidenceNodeId) {\n return; // Already created\n }\n\n // Build evidence text from Q&A\n const evidenceText = `Q: ${args.questionText}\\n\\nA: ${args.answerText}`;\n const globalId = generateGlobalId();\n const contentHash = `evidence:${args.questionNodeId}:scored`;\n\n // Create L2 evidence node\n const evidenceNodeId = await ctx.db.insert(\"epistemicNodes\", {\n globalId,\n projectId: args.projectId,\n topicId: normalizeQuestionTopicId(args.topicId),\n nodeType: \"evidence\",\n canonicalText: evidenceText,\n contentHash,\n status: \"active\",\n epistemicLayer: \"L2\",\n sourceType: \"verified\", // Human-scored sprint answer\n createdAt: now,\n updatedAt: now,\n createdBy: args.userId,\n metadata: {\n kind: \"observation\",\n sourceQuestionId: args.questionNodeId,\n sprintConviction: args.conviction,\n rationale: args.rationale,\n origin: \"sprint_question_scoring\",\n },\n });\n\n // Mark the question with the evidence node ID (for idempotency)\n await ctx.db.patch(args.questionNodeId, {\n metadata: {\n ...qMeta,\n evidenceNodeId,\n },\n updatedAt: now,\n });\n\n // Schedule Neo4j sync for the evidence node\n await ctx.scheduler.runAfter(0, internal.neo4jSync.syncNodeToNeo4j, {\n nodeId: evidenceNodeId,\n operation: \"upsert\",\n });\n\n // Collect all belief IDs to link (primary + related)\n const allBeliefIds = new Set<string>();\n allBeliefIds.add(args.beliefId);\n for (const id of args.relatedBeliefIds) {\n allBeliefIds.add(id);\n }\n\n // Create INFORMS edges: Evidence → Belief(s)\n // Weight based on conviction: high conviction (>0.7) = supports, low (<0.3) = contradicts\n const weight =\n args.conviction >= 0.5 ? args.conviction : -(1 - args.conviction);\n\n // Helper: resolve belief ID to a canonical epistemic belief node.\n async function resolveBeliefNode(bId: string) {\n try {\n const node = await ctx.db.get(bId as Id<\"epistemicNodes\">);\n if (node?.nodeType === \"belief\") {\n return node;\n }\n } catch {\n return null;\n }\n return null;\n }\n\n for (const bId of allBeliefIds) {\n const beliefNode = await resolveBeliefNode(bId);\n if (!beliefNode) {\n continue;\n }\n\n const edgeGlobalId = generateGlobalId();\n await ctx.scheduler.runAfter(0, internal.neo4jEdgeAPI.createEdge, {\n globalId: edgeGlobalId,\n fromGlobalId: globalId,\n toGlobalId: beliefNode.globalId,\n edgeType: \"informs\",\n weight,\n confidence: Math.abs(weight),\n context: `origin=sprint_question_scoring | relation=${weight >= 0 ? \"supports\" : \"contradicts\"} | sourceQuestionId=${String(args.questionNodeId)}`,\n createdBy: args.userId,\n topicId: args.projectId ? String(args.projectId) : undefined,\n fromNodeType: \"evidence\",\n toNodeType: \"belief\",\n fromLayer: \"L2\",\n toLayer: \"L3\",\n });\n }\n\n // Create DERIVED_FROM edge: Evidence → Question (answer is derived from question — provenance)\n const answersEdgeGlobalId = generateGlobalId();\n await ctx.scheduler.runAfter(0, internal.neo4jEdgeAPI.createEdge, {\n globalId: answersEdgeGlobalId,\n fromGlobalId: globalId,\n toGlobalId: questionNode.globalId,\n edgeType: \"derived_from\",\n weight: 1.0,\n confidence: 1.0,\n context: `origin=sprint_question_scoring | sourceQuestionId=${String(args.questionNodeId)}`,\n createdBy: args.userId,\n topicId: args.projectId ? String(args.projectId) : undefined,\n fromNodeType: \"evidence\",\n toNodeType: \"question\",\n fromLayer: \"L2\",\n toLayer: \"L3\",\n });\n\n // Audit log\n await ctx.db.insert(\"epistemicAudit\", {\n entityType: \"evidence\",\n entityId: evidenceNodeId,\n changeType: \"created\",\n changedAt: now,\n changedBy: args.userId,\n isAgent: false,\n projectId: args.projectId,\n topicId: normalizeQuestionTopicId(args.topicId),\n newState: {\n text: evidenceText.slice(0, 200),\n kind: \"observation\",\n sourceType: \"verified\",\n origin: \"sprint_question_scoring\",\n linkedBeliefIds: [...allBeliefIds],\n },\n });\n\n await markProjectGraphDirty(\n ctx,\n args.projectId,\n normalizeQuestionTopicId(args.topicId)\n );\n\n return { evidenceNodeId };\n },\n});\n\n/**\n * Backfill: Create evidence nodes + INFORMS edges for all scored questions\n * that are missing them. Run once to fix existing sprint data.\n */\nexport const backfillScoredQuestionEvidence = internalMutation({\n args: {\n ...optionalScopeArgs,\n userId: v.string(),\n dryRun: v.optional(v.boolean()),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const dryRun = args.dryRun ?? false;\n const scope = await resolveQuestionScopeOrNull(ctx, args);\n if (!scope) {\n return {\n dryRun,\n totalQuestions: 0,\n candidateCount: 0,\n scheduled: 0,\n skipped: 0,\n candidates: [],\n };\n }\n\n const allQuestions = await getQuestionNodesForScope(ctx, scope);\n\n // Filter to scored questions with answers that don't yet have evidence\n const candidates = allQuestions.filter((n) => {\n const meta = (n.metadata || {}) as Record<string, unknown>;\n return (\n meta.convictionStage === \"scored\" &&\n meta.answer &&\n !meta.evidenceNodeId &&\n (meta.linkedBeliefId || meta.beliefId)\n );\n });\n\n if (dryRun) {\n return {\n dryRun: true,\n candidateCount: candidates.length,\n candidates: candidates.map((n) => {\n const meta = (n.metadata || {}) as Record<string, unknown>;\n return {\n questionId: n._id,\n questionText: n.canonicalText?.slice(0, 80),\n beliefId: meta.linkedBeliefId || meta.beliefId,\n conviction: meta.conviction,\n hasAnswer: !!meta.answer,\n };\n }),\n };\n }\n\n let created = 0;\n let skipped = 0;\n\n for (const questionNode of candidates) {\n const meta = (questionNode.metadata || {}) as Record<string, unknown>;\n const beliefId =\n (meta.linkedBeliefId as string) ?? (meta.beliefId as string);\n const answerText = meta.answer as string;\n const conviction = (meta.conviction as number) ?? 0.5;\n\n if (!beliefId || !answerText) {\n skipped++;\n continue;\n }\n\n await ctx.scheduler.runAfter(\n created * 100, // Stagger to avoid overwhelming Neo4j\n internal.epistemicQuestions.createEvidenceFromScoredQuestion,\n {\n questionNodeId: questionNode._id,\n questionText: questionNode.canonicalText || \"\",\n answerText,\n beliefId,\n relatedBeliefIds: (meta.relatedBeliefIds as string[]) || [],\n conviction,\n rationale: (meta.convictionRationale as string) || \"\",\n projectId: scope.projectId,\n topicId: normalizeQuestionTopicId(scope.topicId),\n userId: args.userId,\n }\n );\n created++;\n }\n\n if (created > 0) {\n await markProjectGraphDirty(\n ctx,\n scope.projectId,\n normalizeQuestionTopicId(scope.topicId)\n );\n }\n\n return {\n dryRun: false,\n totalQuestions: allQuestions.length,\n candidateCount: candidates.length,\n scheduled: created,\n skipped,\n };\n },\n});\n\n// =============================================================================\n// SPRINT CLUSTER QUERIES\n// =============================================================================\n\n/**\n * Get ALL questions for a sprint cluster, with linked belief details.\n * This is the main query for the Questions phase UI.\n *\n * CLUSTER = Hypotheses + Conditionals ONLY (no raw beliefs!)\n */\nexport const getForSprintCluster = query({\n args: {\n sprintId: v.optional(v.string()),\n worktreeId: v.optional(v.string()),\n userId: v.string(),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const docId = args.sprintId || args.worktreeId;\n if (!docId) return [];\n const workflow = await resolveWorkflowBridgeDoc(ctx, docId);\n const scopeDoc = workflow.worktree ?? workflow.sprint;\n if (!scopeDoc) {\n return [];\n }\n const scope = await resolveQuestionScopeOrNull(ctx, {\n projectId: workflow.projectId,\n topicId: workflow.topicId,\n });\n const scopeId = scope ? resolveQuestionScopeId(scope) : undefined;\n if (!scope || !scopeId) {\n return [];\n }\n\n const hasAccess = await checkScopeAccess(ctx, scopeId, args.userId);\n if (!hasAccess) {\n return [];\n }\n\n // Get hypothesis and raw belief IDs from sprint synthesis state\n const synthesisState = scopeDoc.synthesisState as\n | Record<string, unknown>\n | undefined;\n const hypothesisIds = new Set(\n ((synthesisState?.synthesizedBeliefIds as string[]) || []).map(\n (id: unknown) => String(id)\n )\n );\n const rawBeliefIds = new Set(\n ((synthesisState?.originalBeliefIds as string[]) || []).map(\n (id: unknown) => String(id)\n )\n );\n\n // Cluster = hypotheses + conditionals (exclude raw beliefs)\n const clusterBeliefIds = new Set<string>(hypothesisIds);\n\n // Find conditionals via edges connected to hypotheses\n const edges = await getQuestionEdgesForScope(ctx, scope);\n\n for (const edge of edges) {\n const fromStr = String(edge.fromNodeId || \"\");\n const toStr = String(edge.toNodeId || \"\");\n\n if (hypothesisIds.has(fromStr) && !rawBeliefIds.has(toStr)) {\n clusterBeliefIds.add(toStr);\n }\n if (hypothesisIds.has(toStr) && !rawBeliefIds.has(fromStr)) {\n clusterBeliefIds.add(fromStr);\n }\n }\n\n // Get all question-type epistemicNodes in the project\n const questionNodes = await getQuestionNodesForScope(ctx, scope);\n\n // Include questions explicitly linked to the sprint via targetQuestionIds\n const sprintQuestionIds = new Set(\n (((workflow.worktree?.targetQuestionIds as unknown[]) ||\n (workflow.sprint?.targetQuestionIds as unknown[]) ||\n []) as unknown[]).map((id: unknown) => String(id))\n );\n\n // Filter to questions linked to cluster beliefs OR explicitly in sprint\n const clusterQuestions = questionNodes.filter((q) => {\n // Always include questions explicitly added to this sprint\n if (sprintQuestionIds.has(String(q._id))) {\n return true;\n }\n // Include questions linked to cluster beliefs via metadata\n const meta = (q.metadata || {}) as Record<string, unknown>;\n const linkedId = String(meta.linkedBeliefNodeId || \"\");\n if (linkedId && clusterBeliefIds.has(linkedId)) {\n return true;\n }\n // Also check edges connecting this question to cluster beliefs\n return edges.some(\n (e) =>\n (String(e.fromNodeId) === String(q._id) &&\n clusterBeliefIds.has(String(e.toNodeId || \"\"))) ||\n (String(e.toNodeId) === String(q._id) &&\n clusterBeliefIds.has(String(e.fromNodeId || \"\")))\n );\n });\n\n // Enrich with linked belief details\n const enrichedQuestions = await Promise.all(\n clusterQuestions.map(async (q) => {\n const meta = (q.metadata || {}) as Record<string, unknown>;\n\n // Collect all belief IDs this question is linked to\n const linkedBeliefNodeIds = new Set<string>();\n const primaryBeliefId = String(meta.linkedBeliefNodeId || \"\");\n if (primaryBeliefId) {\n linkedBeliefNodeIds.add(primaryBeliefId);\n }\n\n for (const edge of edges) {\n if (String(edge.fromNodeId) === String(q._id)) {\n linkedBeliefNodeIds.add(String(edge.toNodeId || \"\"));\n }\n if (String(edge.toNodeId) === String(q._id)) {\n linkedBeliefNodeIds.add(String(edge.fromNodeId || \"\"));\n }\n }\n // Remove empty strings\n linkedBeliefNodeIds.delete(\"\");\n\n // Fetch belief details\n const linkedBeliefs = (\n await Promise.all(\n Array.from(linkedBeliefNodeIds).map(async (nodeId) => {\n const node = await ctx.db.get(nodeId as Id<\"epistemicNodes\">);\n if (!node || node.nodeType !== \"belief\") {\n return null;\n }\n\n const isHypothesis = hypothesisIds.has(nodeId);\n const isRaw = rawBeliefIds.has(nodeId);\n const isConditional =\n !isHypothesis && !isRaw && clusterBeliefIds.has(nodeId);\n\n return {\n beliefId: node._id,\n beliefText: node.canonicalText || \"\",\n isHypothesis,\n isConditional,\n isRaw,\n isPrimaryTarget: isHypothesis,\n };\n })\n )\n ).filter(Boolean);\n\n return {\n _id: q._id,\n _creationTime: q._creationTime,\n projectId: q.projectId,\n topicId: q.topicId,\n canonicalText: q.canonicalText,\n question: q.canonicalText, // legacy field name\n questionType:\n q.questionType || (meta.questionType as string) || \"general\",\n priority: (meta.priority as string) || \"medium\",\n isKeyQuestion: (meta.isKeyQuestion as boolean) || false,\n testType: (meta.testType as string) || \"validates\",\n category: (meta.category as string) || \"other\",\n status: q.status,\n linkedBeliefs,\n testLogic: (meta.testType as string) || \"validates\",\n testRationale: (meta.rationale as string) || null,\n beliefId: meta.linkedBeliefNodeId || null,\n relatedBeliefIds: Array.from(linkedBeliefNodeIds),\n // Conviction stage fields — needed by UI to show/hide action buttons\n convictionStage: (meta.convictionStage as string) || null,\n answer: (meta.answer as string) || null,\n conviction: (meta.conviction as number) ?? null,\n linkedWorktreeId: resolveLinkedWorktreeId(meta),\n metadata: q.metadata,\n };\n })\n );\n\n // Dedupe by question ID\n const seen = new Set<string>();\n return enrichedQuestions.filter((q) => {\n if (seen.has(String(q._id))) {\n return false;\n }\n seen.add(String(q._id));\n return true;\n });\n },\n});\n\n// =============================================================================\n// PORTED FROM questions.ts — 15 functions migrated to epistemicNodes\n// =============================================================================\n\n/**\n * 1. getInConviction - Get questions in conviction stage for a sprint\n * Ported from questions.ts lines 1008-1157\n */\nexport const getInConviction = query({\n args: {\n sprintId: v.optional(v.string()),\n worktreeId: v.optional(v.string()),\n userId: v.string(),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const docId = args.sprintId || args.worktreeId;\n if (!docId) return [];\n const workflow = await resolveWorkflowBridgeDoc(ctx, docId);\n const scopeDoc = workflow.worktree ?? workflow.sprint;\n if (!scopeDoc) {\n return [];\n }\n const scope = await resolveQuestionScopeOrNull(ctx, {\n projectId: workflow.projectId,\n topicId: workflow.topicId,\n });\n const scopeId = scope ? resolveQuestionScopeId(scope) : undefined;\n if (!scope || !scopeId) {\n return [];\n }\n\n const hasAccess = await checkScopeAccess(ctx, scopeId, args.userId);\n if (!hasAccess) {\n return [];\n }\n\n const allQuestions = await getQuestionNodesForScope(ctx, scope);\n\n // Filter to questions in conviction stages\n const convictionQuestions = allQuestions.filter((q) => {\n const meta = (q.metadata || {}) as Record<string, unknown>;\n return (\n meta.convictionStage === \"in_conviction\" ||\n meta.convictionStage === \"scored\"\n );\n });\n\n // Get synthesized belief IDs from sprint\n const sprintBeliefIds = new Set([\n ...((scopeDoc.synthesisState as any)?.synthesizedBeliefIds || []).map(\n String\n ),\n ...(((workflow.worktree?.targetBeliefIds as unknown[]) ||\n (workflow.sprint?.targetBeliefIds as unknown[]) ||\n []) as unknown[]).map(String),\n ]);\n\n // Filter to questions relevant to this sprint\n const sprintQuestions = convictionQuestions.filter((q) => {\n const meta = (q.metadata || {}) as Record<string, unknown>;\n\n // Direct sprint link\n if (questionMatchesWorkflowLink(meta, workflow)) {\n return true;\n }\n\n // Linked to sprint beliefs via linkedBeliefNodeId\n if (\n meta.linkedBeliefNodeId &&\n sprintBeliefIds.has(String(meta.linkedBeliefNodeId))\n ) {\n return true;\n }\n if (\n meta.linkedBeliefId &&\n sprintBeliefIds.has(String(meta.linkedBeliefId))\n ) {\n return true;\n }\n if (meta.beliefId && sprintBeliefIds.has(String(meta.beliefId))) {\n return true;\n }\n\n // Linked via relatedBeliefIds\n const relatedIds = (meta.relatedBeliefIds as string[]) || [];\n if (relatedIds.some((id) => sprintBeliefIds.has(String(id)))) {\n return true;\n }\n\n return false;\n });\n\n // Enrich with evidence and belief details\n const questionsWithDetails = await Promise.all(\n sprintQuestions.map(async (q) => {\n const meta = (q.metadata || {}) as Record<string, unknown>;\n\n // Fetch evidence from questionEvidenceLinks\n const evidenceLinks = await ctx.db\n .query(\"questionEvidenceLinks\")\n .withIndex(\"by_questionId\", (qb) => qb.eq(\"questionId\", q._id as any))\n .collect();\n\n const evidenceWithDetails = await Promise.all(\n evidenceLinks.map(async (link) => {\n const insight = await ctx.db.get(link.insightId);\n const insightMeta =\n ((insight as any)?.metadata as\n | Record<string, unknown>\n | undefined) || {};\n const canonicalText = (insight as any)?.canonicalText;\n const legacyText = (insight as any)?.text;\n const contentText = (insight as any)?.content;\n const titleText = (insight as any)?.title;\n const snippetText = insightMeta.snippet;\n return {\n ...link,\n insightText:\n (typeof canonicalText === \"string\" && canonicalText.trim()) ||\n (typeof legacyText === \"string\" && legacyText.trim()) ||\n (typeof contentText === \"string\" && contentText.trim()) ||\n (typeof titleText === \"string\" && titleText.trim()) ||\n (typeof snippetText === \"string\" && snippetText.trim()) ||\n \"\",\n insightSource: insight?.sourceType || \"unknown\",\n };\n })\n );\n\n // Fetch beliefs this question tests\n const beliefIds: string[] = [];\n const relatedIds = (meta.relatedBeliefIds as string[]) || [];\n if (meta.linkedBeliefNodeId) {\n beliefIds.push(String(meta.linkedBeliefNodeId));\n }\n if (meta.linkedBeliefId) {\n beliefIds.push(String(meta.linkedBeliefId));\n }\n if (meta.beliefId) {\n beliefIds.push(String(meta.beliefId));\n }\n for (const id of relatedIds) {\n if (!beliefIds.includes(String(id))) {\n beliefIds.push(String(id));\n }\n }\n\n const beliefsWithDetails = await Promise.all(\n beliefIds.map(async (beliefId) => {\n // Try as epistemicNodes ID first\n try {\n const node = await ctx.db.get(beliefId as Id<\"epistemicNodes\">);\n if (node && node.nodeType === \"belief\") {\n return {\n _id: node._id,\n belief: node.canonicalText || \"\",\n confidence: (node.metadata as any)?.confidence,\n pillar: (node.metadata as any)?.category,\n beliefType: node.status,\n dependsOnCount: 0,\n cascadesToCount: 0,\n exclusiveWithCount: 0,\n };\n }\n } catch {\n // Not a valid epistemicNodes ID\n }\n return null;\n })\n );\n\n return {\n _id: q._id,\n _creationTime: q._creationTime,\n projectId: q.projectId,\n question: q.canonicalText,\n canonicalText: q.canonicalText,\n category: (meta.category as string) || \"other\",\n priority: (meta.priority as string) || \"medium\",\n status: (meta.questionStatus as string) || q.status,\n questionType:\n q.questionType || (meta.questionType as string) || \"general\",\n testType: (meta.testType as string) || undefined,\n importance: (meta.importance as number) || undefined,\n isKeyQuestion: (meta.isKeyQuestion as boolean) || false,\n conviction: meta.conviction as number | undefined,\n convictionStage: meta.convictionStage as string,\n convictionRationale: meta.convictionRationale as string | undefined,\n convictionAdvancedAt: meta.convictionAdvancedAt as number | undefined,\n convictionAdvancedBy: meta.convictionAdvancedBy as string | undefined,\n convictionUpdatedAt: meta.convictionUpdatedAt as number | undefined,\n convictionUpdatedBy: meta.convictionUpdatedBy as string | undefined,\n answer: meta.answer as string | undefined,\n answerStatus: meta.answerStatus as string | undefined,\n answerCompleteness: meta.answerCompleteness as string | undefined,\n whatWeNeed: meta.whatWeNeed as string | undefined,\n linkedWorktreeId: resolveLinkedWorktreeId(meta) || undefined,\n beliefId: meta.linkedBeliefNodeId || meta.beliefId || null,\n linkedBeliefId: meta.linkedBeliefNodeId || meta.linkedBeliefId,\n relatedBeliefIds: relatedIds,\n evidenceCount: evidenceWithDetails.length,\n evidence: evidenceWithDetails,\n testedBeliefs: beliefsWithDetails.filter(Boolean),\n createdAt: q.createdAt,\n createdBy: q.createdBy,\n updatedAt: q.updatedAt,\n metadata: q.metadata,\n };\n })\n );\n\n // Sort: in_conviction first, then scored, then by importance\n return questionsWithDetails.sort((a, b) => {\n if (\n a.convictionStage === \"in_conviction\" &&\n b.convictionStage === \"scored\"\n ) {\n return -1;\n }\n if (\n a.convictionStage === \"scored\" &&\n b.convictionStage === \"in_conviction\"\n ) {\n return 1;\n }\n return (a.importance || 5) - (b.importance || 5);\n });\n },\n});\n\n/**\n * 2. advanceToConviction - Move a question to the conviction stage\n * Ported from questions.ts line 830\n */\nexport const advanceToConviction = mutation({\n args: {\n questionId: v.id(\"epistemicNodes\"),\n userId: v.string(),\n sprintId: v.optional(v.string()),\n worktreeId: v.optional(v.string()),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const node = await ctx.db.get(args.questionId);\n if (!node || node.nodeType !== \"question\") {\n throw new Error(\"Question not found\");\n }\n\n const meta = (node.metadata || {}) as Record<string, unknown>;\n\n // Only allow advancing questions that aren't already in conviction or scored\n if (\n meta.convictionStage === \"in_conviction\" ||\n meta.convictionStage === \"scored\"\n ) {\n throw new Error(\"Question is already in conviction stage\");\n }\n\n const now = Date.now();\n\n await ctx.db.patch(args.questionId, {\n updatedAt: now,\n metadata: {\n ...meta,\n convictionStage: \"in_conviction\",\n convictionAdvancedAt: now,\n convictionAdvancedBy: args.userId,\n ...buildLinkedWorktreeMetadata(args.worktreeId ?? args.sprintId),\n },\n });\n\n // Log to epistemic audit\n try {\n await ctx.db.insert(\"epistemicAudit\", {\n entityType: \"question\",\n entityId: args.questionId,\n changeType: \"status_changed\",\n changedAt: now,\n changedBy: args.userId,\n isAgent: false,\n projectId: node.projectId,\n previousState: {\n convictionStage: meta.convictionStage || \"researching\",\n },\n newState: { convictionStage: \"in_conviction\" },\n triggeringAction: \"question_advanced_to_conviction\",\n });\n } catch (e) {\n console.error(\"[EpistemicAudit] Failed to log advanceToConviction:\", e);\n }\n\n await markProjectGraphDirty(ctx, node.projectId, node.topicId);\n\n return {\n questionId: args.questionId,\n convictionStage: \"in_conviction\",\n advancedAt: now,\n };\n },\n});\n\n/**\n * 3. updateConviction - Update conviction score for a question\n * Ported from questions.ts line 775\n */\nexport const updateConviction = mutation({\n args: {\n questionId: v.id(\"epistemicNodes\"),\n conviction: v.optional(v.number()),\n answerCompleteness: v.optional(\n v.union(\n v.literal(\"unanswered\"),\n v.literal(\"partial\"),\n v.literal(\"sufficient\"),\n v.literal(\"comprehensive\")\n )\n ),\n convictionRationale: v.optional(v.string()),\n userId: v.string(),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const node = await ctx.db.get(args.questionId);\n if (!node || node.nodeType !== \"question\") {\n throw new Error(\"Question not found\");\n }\n\n const now = Date.now();\n const meta = (node.metadata || {}) as Record<string, unknown>;\n const updates: Record<string, unknown> = { ...meta };\n\n if (args.conviction !== undefined) {\n updates.conviction = Math.max(0, Math.min(1, args.conviction));\n }\n if (args.answerCompleteness !== undefined) {\n updates.answerCompleteness = args.answerCompleteness;\n }\n if (args.convictionRationale !== undefined) {\n updates.convictionRationale = args.convictionRationale;\n }\n\n updates.convictionUpdatedAt = now;\n updates.convictionUpdatedBy = args.userId;\n\n await ctx.db.patch(args.questionId, {\n updatedAt: now,\n metadata: updates,\n });\n\n await markProjectGraphDirty(ctx, node.projectId, node.topicId);\n\n return {\n questionId: args.questionId,\n conviction: updates.conviction ?? meta.conviction,\n answerCompleteness: updates.answerCompleteness ?? meta.answerCompleteness,\n };\n },\n});\n\n/**\n * 4. finalizeConviction - Finalize conviction scoring for a question\n * Ported from questions.ts line 893\n */\nexport const finalizeConviction = mutation({\n args: {\n questionId: v.id(\"epistemicNodes\"),\n conviction: v.number(),\n answer: v.string(),\n convictionRationale: v.optional(v.string()),\n userId: v.string(),\n answerCompleteness: v.optional(\n v.union(\n v.literal(\"unanswered\"),\n v.literal(\"partial\"),\n v.literal(\"sufficient\"),\n v.literal(\"comprehensive\"),\n v.literal(\"unanswerable\")\n )\n ),\n whatWeNeed: v.optional(v.string()),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const node = await ctx.db.get(args.questionId);\n if (!node || node.nodeType !== \"question\") {\n throw new Error(\"Question not found\");\n }\n\n const now = Date.now();\n const clampedConviction = Math.max(0, Math.min(1, args.conviction));\n const isUnanswerable = args.answerCompleteness === \"unanswerable\";\n const meta = (node.metadata || {}) as Record<string, unknown>;\n\n // Determine answer completeness\n let completeness = args.answerCompleteness;\n if (!completeness) {\n completeness =\n clampedConviction >= 0.8\n ? \"comprehensive\"\n : clampedConviction >= 0.6\n ? \"sufficient\"\n : clampedConviction >= 0.3\n ? \"partial\"\n : \"unanswered\";\n }\n\n await ctx.db.patch(args.questionId, {\n updatedAt: now,\n metadata: {\n ...meta,\n convictionStage: \"scored\",\n conviction: clampedConviction,\n convictionRationale: args.convictionRationale,\n convictionUpdatedAt: now,\n convictionUpdatedBy: args.userId,\n answer: args.answer,\n answerStatus: \"final\",\n questionStatus: isUnanswerable ? \"blocked\" : \"answered\",\n answeredAt: now,\n answeredBy: args.userId,\n answerCompleteness: completeness,\n whatWeNeed: args.whatWeNeed,\n },\n });\n\n // Log to epistemic audit\n try {\n await ctx.db.insert(\"epistemicAudit\", {\n entityType: \"question\",\n entityId: args.questionId,\n changeType: \"status_changed\",\n changedAt: now,\n changedBy: args.userId,\n isAgent: false,\n projectId: node.projectId,\n previousState: {\n convictionStage: meta.convictionStage || \"in_conviction\",\n },\n newState: {\n convictionStage: \"scored\",\n conviction: clampedConviction,\n },\n triggeringAction: \"question_conviction_finalized\",\n });\n } catch (e) {\n console.error(\"[EpistemicAudit] Failed to log finalizeConviction:\", e);\n }\n\n // Schedule evidence creation from scored question\n if (node.projectId || node.topicId) {\n const beliefId =\n (meta.linkedBeliefNodeId as string) ||\n (meta.linkedBeliefId as string) ||\n (meta.beliefId as string);\n if (beliefId) {\n try {\n await ctx.scheduler.runAfter(\n 0,\n internal.epistemicQuestions.createEvidenceFromScoredQuestion,\n {\n questionNodeId: args.questionId,\n questionText: node.canonicalText || \"\",\n answerText: args.answer,\n beliefId,\n relatedBeliefIds: (meta.relatedBeliefIds as string[]) || [],\n conviction: clampedConviction,\n rationale: args.convictionRationale || \"\",\n projectId: node.projectId,\n topicId: normalizeQuestionTopicId(node.topicId),\n userId: args.userId,\n }\n );\n } catch (e) {\n console.error(\n \"[finalizeConviction] Failed to schedule evidence creation:\",\n e\n );\n }\n }\n }\n\n // Sync to Neo4j\n await ctx.scheduler.runAfter(0, internal.neo4jSync.syncNodeToNeo4j, {\n nodeId: args.questionId,\n operation: \"upsert\",\n });\n\n await markProjectGraphDirty(ctx, node.projectId, node.topicId);\n\n return {\n questionId: args.questionId,\n convictionStage: \"scored\",\n conviction: clampedConviction,\n };\n },\n});\n\n/**\n * 5. getByBeliefWithAccess - Get questions linked to a belief with access check\n * Ported from questions.ts line 1806\n */\nexport const getByBeliefWithAccess = query({\n args: {\n beliefId: v.string(),\n userId: v.string(),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n // Try to get the belief node to find its project\n let beliefNode: any = null;\n try {\n beliefNode = await ctx.db.get(args.beliefId as Id<\"epistemicNodes\">);\n } catch {\n // Not a valid epistemicNodes ID - try legacy beliefs table\n try {\n beliefNode = await ctx.db.get(args.beliefId as Id<\"epistemicNodes\">);\n } catch {\n return [];\n }\n }\n\n if (!beliefNode) {\n return [];\n }\n\n const scope = await resolveQuestionScopeOrNull(ctx, {\n projectId: beliefNode.projectId,\n topicId: normalizeQuestionTopicId(beliefNode.topicId),\n });\n const scopeId = scope ? resolveQuestionScopeId(scope) : undefined;\n if (!scope || !scopeId) {\n return [];\n }\n\n const hasAccess = await checkScopeAccess(ctx, scopeId, args.userId);\n if (!hasAccess) {\n return [];\n }\n\n const questionNodes = await getQuestionNodesForScope(ctx, scope);\n\n // Filter to those linked to this belief\n const beliefIdStr = String(args.beliefId);\n return questionNodes.filter((q) => {\n const meta = (q.metadata || {}) as Record<string, unknown>;\n // Check primary belief link\n if (String(meta.linkedBeliefNodeId || \"\") === beliefIdStr) {\n return true;\n }\n if (String(meta.linkedBeliefId || \"\") === beliefIdStr) {\n return true;\n }\n if (String(meta.beliefId || \"\") === beliefIdStr) {\n return true;\n }\n // Check related belief IDs array\n const relatedIds = (meta.relatedBeliefIds as string[]) || [];\n if (relatedIds.some((id) => String(id) === beliefIdStr)) {\n return true;\n }\n return false;\n });\n },\n});\n\n/**\n * 6. updateQuestion - Update question text and properties\n * Ported from questions.ts line 655\n */\nexport const updateQuestion = mutation({\n args: {\n questionId: v.id(\"epistemicNodes\"),\n question: v.optional(v.string()),\n category: v.optional(\n v.union(\n v.literal(\"market\"),\n v.literal(\"competition\"),\n v.literal(\"product\"),\n v.literal(\"team\"),\n v.literal(\"financials\"),\n v.literal(\"financial\"),\n v.literal(\"regulatory\"),\n v.literal(\"timing\"),\n v.literal(\"customer\"),\n v.literal(\"technology\"),\n v.literal(\"distribution\"),\n v.literal(\"strategic\"),\n v.literal(\"other\")\n )\n ),\n priority: v.optional(\n v.union(v.literal(\"high\"), v.literal(\"medium\"), v.literal(\"low\"))\n ),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const node = await ctx.db.get(args.questionId);\n if (!node || node.nodeType !== \"question\") {\n throw new Error(\"Question not found\");\n }\n\n const now = Date.now();\n const meta = (node.metadata || {}) as Record<string, unknown>;\n const metaUpdates: Record<string, unknown> = { ...meta };\n\n // Update category if provided\n if (args.category) {\n const category =\n args.category === \"financial\" ? \"financials\" : args.category;\n metaUpdates.category = category;\n }\n\n // Update priority if provided\n if (args.priority) {\n metaUpdates.priority = args.priority;\n }\n\n // SOURCE CERTIFICATION: Re-tag as proprietary if user edits text\n const patchData: Record<string, unknown> = {\n updatedAt: now,\n metadata: metaUpdates,\n };\n\n if (args.question !== undefined) {\n patchData.canonicalText = args.question;\n patchData.contentHash = generateContentHash(args.question);\n if (node.sourceType === \"ai_generated\") {\n patchData.sourceType = \"human\";\n }\n }\n\n await ctx.db.patch(args.questionId, patchData);\n\n // Sync to Neo4j\n await ctx.scheduler.runAfter(0, internal.neo4jSync.syncNodeToNeo4j, {\n nodeId: args.questionId,\n operation: \"upsert\",\n });\n\n await markProjectGraphDirty(ctx, node.projectId, node.topicId);\n },\n});\n\n/**\n * 7. linkToBelief - Link a question to a belief\n * Ported from questions.ts line 1298\n */\nexport const linkToBelief = mutation({\n args: {\n questionId: v.id(\"epistemicNodes\"),\n beliefId: v.string(), // Accept string for backward compat\n userId: v.string(),\n testType: v.optional(\n v.union(\n v.literal(\"validates\"),\n v.literal(\"invalidates\"),\n v.literal(\"clarifies\")\n )\n ),\n answerImpact: v.optional(\n v.object({\n ifYes: v.string(),\n ifNo: v.string(),\n })\n ),\n isPrimaryBelief: v.optional(v.boolean()),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const questionNode = await ctx.db.get(args.questionId);\n if (!questionNode || questionNode.nodeType !== \"question\") {\n throw new Error(\"Question not found\");\n }\n\n // Verify project access\n const questionScopeId = resolveQuestionScopeId({\n projectId: questionNode.projectId,\n topicId: normalizeQuestionTopicId(questionNode.topicId),\n });\n if (questionScopeId) {\n const hasAccess = await checkScopeAccess(\n ctx,\n questionScopeId,\n args.userId\n );\n if (!hasAccess) {\n throw new Error(\"Access denied\");\n }\n }\n\n // Resolve belief node\n let beliefNode: any = null;\n try {\n beliefNode = await ctx.db.get(args.beliefId as Id<\"epistemicNodes\">);\n } catch {\n // Try legacy beliefs table\n try {\n beliefNode = await ctx.db.get(args.beliefId as Id<\"epistemicNodes\">);\n } catch {\n throw new Error(\"Belief not found\");\n }\n }\n if (!beliefNode) {\n throw new Error(\"Belief not found\");\n }\n\n const now = Date.now();\n const meta = (questionNode.metadata || {}) as Record<string, unknown>;\n\n // Add to related beliefs (avoid duplicates)\n const currentBeliefs = (meta.relatedBeliefIds as string[]) || [];\n const beliefIdStr = String(args.beliefId);\n const newRelated = currentBeliefs.includes(beliefIdStr)\n ? currentBeliefs\n : [...currentBeliefs, beliefIdStr];\n\n const metaUpdates: Record<string, unknown> = {\n ...meta,\n relatedBeliefIds: newRelated,\n };\n\n // If this is the primary belief being tested\n if (args.isPrimaryBelief || args.testType) {\n metaUpdates.linkedBeliefNodeId = args.beliefId;\n metaUpdates.linkedBeliefId = args.beliefId;\n metaUpdates.questionType = \"belief_test\";\n if (args.testType) {\n metaUpdates.testType = args.testType;\n }\n if (args.answerImpact) {\n metaUpdates.answerImpact = args.answerImpact;\n }\n }\n\n await ctx.db.patch(args.questionId, {\n updatedAt: now,\n metadata: metaUpdates,\n });\n\n // Create edge in Neo4j (Question → Belief via \"tests\")\n try {\n const beliefGlobalId = beliefNode.globalId;\n if (beliefGlobalId && questionNode.globalId) {\n await ctx.scheduler.runAfter(0, internal.neo4jSync.syncNodeToNeo4j, {\n nodeId: args.questionId,\n operation: \"upsert\",\n });\n await ctx.scheduler.runAfter(100, internal.neo4jSync.syncNodeToNeo4j, {\n nodeId: args.beliefId as Id<\"epistemicNodes\">,\n operation: \"upsert\",\n });\n\n const edgeGlobalId = buildTestsEdgeGlobalId(\n questionNode.globalId,\n beliefGlobalId\n );\n await ctx.scheduler.runAfter(250, internal.neo4jEdgeAPI.createEdge, {\n globalId: edgeGlobalId,\n fromGlobalId: questionNode.globalId,\n toGlobalId: beliefGlobalId,\n edgeType: \"tests\",\n context: args.testType || \"tests\",\n topicId: questionNode.projectId\n ? String(questionNode.projectId)\n : undefined,\n createdBy: args.userId,\n fromNodeType: \"question\",\n toNodeType: \"belief\",\n fromLayer: \"L3\",\n toLayer: \"L3\",\n });\n }\n } catch (e) {\n console.error(\"[linkToBelief] Failed to create tests edge:\", e);\n }\n\n await markProjectGraphDirty(\n ctx,\n questionNode.projectId,\n questionNode.topicId\n );\n },\n});\n\n/**\n * 8. linkToInsight - Link a question to an insight/evidence\n * Ported from questions.ts line 1437\n */\nexport const linkToInsight = mutation({\n args: {\n questionId: v.id(\"epistemicNodes\"),\n insightId: v.id(\"epistemicNodes\"),\n userId: v.string(),\n sprintId: v.optional(v.string()),\n worktreeId: v.optional(v.string()),\n relevance: v.optional(v.number()),\n rationale: v.optional(v.string()),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const questionNode = await ctx.db.get(args.questionId);\n if (!questionNode || questionNode.nodeType !== \"question\") {\n throw new Error(\"Question not found\");\n }\n\n // Verify insight exists\n const insight = await ctx.db.get(args.insightId);\n if (!insight) {\n throw new Error(\"Insight not found\");\n }\n\n // Verify project access\n const questionScopeId = resolveQuestionScopeId({\n projectId: questionNode.projectId,\n topicId: normalizeQuestionTopicId(questionNode.topicId),\n });\n if (questionScopeId) {\n const hasAccess = await checkScopeAccess(\n ctx,\n questionScopeId,\n args.userId\n );\n if (!hasAccess) {\n throw new Error(\"Access denied\");\n }\n }\n\n const now = Date.now();\n const meta = (questionNode.metadata || {}) as Record<string, unknown>;\n\n // Add to related insights (avoid duplicates)\n const currentInsights = (meta.relatedInsightIds as string[]) || [];\n const insightIdStr = String(args.insightId);\n\n if (!currentInsights.includes(insightIdStr)) {\n await ctx.db.patch(args.questionId, {\n updatedAt: now,\n metadata: {\n ...meta,\n relatedInsightIds: [...currentInsights, insightIdStr],\n },\n });\n\n // Create questionEvidenceLinks record\n try {\n const existingLinks = await ctx.db\n .query(\"questionEvidenceLinks\")\n .withIndex(\"by_questionId\", (q) =>\n q.eq(\"questionId\", args.questionId as any)\n )\n .collect();\n\n const duplicate = existingLinks.find(\n (link) => String(link.insightId) === String(args.insightId)\n );\n\n if (!duplicate) {\n await ctx.db.insert(\"questionEvidenceLinks\", {\n questionId: args.questionId as any,\n insightId: args.insightId,\n helpsAnswer: true,\n relevance: args.relevance ?? 0.7,\n rationale: args.rationale || \"Linked from research results\",\n createdBy: args.userId,\n createdAt: now,\n });\n }\n } catch (e) {\n console.error(\n \"[linkToInsight] Failed to create questionEvidenceLink:\",\n e\n );\n }\n\n // Evidence linking now goes through graph edges (epistemicEdges),\n // not denormalized sprint.linkedEvidenceIds. Sprint table removed from K-tier.\n }\n\n await markProjectGraphDirty(\n ctx,\n questionNode.projectId,\n questionNode.topicId\n );\n },\n});\n\n/**\n * 9. unlinkInsight - Unlink an insight from a question\n * Ported from questions.ts line 1647\n */\nexport const unlinkInsight = mutation({\n args: {\n questionId: v.id(\"epistemicNodes\"),\n insightId: v.id(\"epistemicNodes\"),\n userId: v.string(),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const questionNode = await ctx.db.get(args.questionId);\n if (!questionNode || questionNode.nodeType !== \"question\") {\n throw new Error(\"Question not found\");\n }\n\n // Verify project access\n const questionScopeId = resolveQuestionScopeId({\n projectId: questionNode.projectId,\n topicId: normalizeQuestionTopicId(questionNode.topicId),\n });\n if (questionScopeId) {\n const hasAccess = await checkScopeAccess(\n ctx,\n questionScopeId,\n args.userId\n );\n if (!hasAccess) {\n throw new Error(\"Access denied\");\n }\n }\n\n const now = Date.now();\n const meta = (questionNode.metadata || {}) as Record<string, unknown>;\n\n // Remove from related insights\n const currentInsights = (meta.relatedInsightIds as string[]) || [];\n const newInsights = currentInsights.filter(\n (id) => String(id) !== String(args.insightId)\n );\n\n await ctx.db.patch(args.questionId, {\n updatedAt: now,\n metadata: {\n ...meta,\n relatedInsightIds: newInsights,\n },\n });\n\n // Remove questionEvidenceLink\n try {\n const links = await ctx.db\n .query(\"questionEvidenceLinks\")\n .withIndex(\"by_questionId\", (q) =>\n q.eq(\"questionId\", args.questionId as any)\n )\n .collect();\n\n for (const link of links) {\n if (String(link.insightId) === String(args.insightId)) {\n await ctx.db.delete(link._id);\n }\n }\n } catch (e) {\n console.error(\n \"[unlinkInsight] Failed to remove questionEvidenceLink:\",\n e\n );\n }\n\n // Remove epistemic edge if exists\n try {\n const evidenceNode = await ctx.db.get(args.insightId);\n\n if (evidenceNode && evidenceNode.nodeType === \"evidence\") {\n const edges = await ctx.db\n .query(\"epistemicEdges\")\n .withIndex(\"by_from_to\", (q) =>\n q.eq(\"fromNodeId\", evidenceNode._id).eq(\"toNodeId\", args.questionId)\n )\n .collect();\n\n for (const edge of edges) {\n if (edge.edgeType === \"derived_from\") {\n await ctx.scheduler.runAfter(0, internal.neo4jEdgeAPI.deleteEdge, {\n globalId: edge.globalId,\n });\n await ctx.db.delete(edge._id);\n }\n }\n }\n } catch (e) {\n console.error(\"[unlinkInsight] Failed to remove edge:\", e);\n }\n\n await markProjectGraphDirty(\n ctx,\n questionNode.projectId,\n questionNode.topicId\n );\n },\n});\n\n/**\n * 10. list - List questions for a project (simple query for AI tools)\n * New function that maps to getByProject semantics for callers expecting `list`\n */\nexport const list = query({\n args: {\n ...optionalScopeArgs,\n userId: v.string(),\n status: v.optional(v.string()),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const scope = await resolveQuestionScopeOrNull(ctx, args);\n if (!scope) {\n return [];\n }\n\n const scopeId = resolveQuestionScopeId(scope);\n if (!scopeId) {\n return [];\n }\n\n const hasAccess = await checkScopeAccess(ctx, scopeId, args.userId);\n if (!hasAccess) {\n return [];\n }\n\n const nodes = await getQuestionNodesForScope(ctx, scope);\n\n const filtered = args.status\n ? nodes.filter((node) =>\n matchesRequestedQuestionStatus(node, args.status!)\n )\n : nodes.filter(isActiveQuestionNode);\n\n // Map to a flattened format that callers expect\n return filtered.map(flattenInternalQuestionNode);\n },\n});\n\n/**\n * 11. getByPillar - Get questions by pillar/category with linked beliefs\n * Ported from questions.ts line 2526\n */\nexport const getByPillar = query({\n args: {\n ...optionalScopeArgs,\n pillar: v.string(),\n includeAnswered: v.optional(v.boolean()),\n userId: v.string(),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const scope = await resolveQuestionScopeOrNull(ctx, args);\n if (!scope) {\n return { questions: [], beliefs: [] };\n }\n\n const scopeId = resolveQuestionScopeId(scope);\n if (!scopeId) {\n return { questions: [], beliefs: [] };\n }\n\n const hasAccess = await checkScopeAccess(ctx, scopeId, args.userId);\n if (!hasAccess) {\n return { questions: [], beliefs: [] };\n }\n\n // Get all belief nodes in this pillar\n const allBeliefNodes = await ctx.db\n .query(\"epistemicNodes\")\n .withIndex(\n scope.topicId ? \"by_topic_type\" : \"by_project_type\",\n (q) =>\n scope.topicId\n ? q.eq(\"topicId\", scope.topicId).eq(\"nodeType\", \"belief\")\n : q.eq(\"projectId\", scope.projectId).eq(\"nodeType\", \"belief\")\n )\n .collect();\n\n const beliefs = allBeliefNodes.filter((n) => {\n const meta = (n.metadata || {}) as Record<string, unknown>;\n return (\n (meta.category === args.pillar ||\n meta.topic === args.pillar ||\n meta.pillar === args.pillar) &&\n n.status !== \"archived\"\n );\n });\n\n if (beliefs.length === 0) {\n return { questions: [], beliefs: [] };\n }\n\n const beliefIds = new Set(beliefs.map((b) => String(b._id)));\n const beliefMap = new Map(\n beliefs.map((b) => [String(b._id), b.canonicalText || \"\"])\n );\n\n // Get all question nodes in the project\n const questionNodes = await getQuestionNodesForScope(ctx, scope);\n\n // Filter to questions linked to these beliefs\n const pillarQuestions = questionNodes.filter((q) => {\n const meta = (q.metadata || {}) as Record<string, unknown>;\n const linkedId = String(\n meta.linkedBeliefNodeId || meta.linkedBeliefId || meta.beliefId || \"\"\n );\n if (linkedId && beliefIds.has(linkedId)) {\n return true;\n }\n const relatedIds = (meta.relatedBeliefIds as string[]) || [];\n return relatedIds.some((id) => beliefIds.has(String(id)));\n });\n\n // Optionally filter out answered questions\n const includeAnswered = args.includeAnswered ?? true;\n const filteredQuestions = includeAnswered\n ? pillarQuestions\n : pillarQuestions.filter((q) => {\n const meta = (q.metadata || {}) as Record<string, unknown>;\n return meta.questionStatus !== \"answered\";\n });\n\n // Enrich with belief text\n const enrichedQuestions = filteredQuestions.map((q) => {\n const meta = (q.metadata || {}) as Record<string, unknown>;\n const linkedId = String(\n meta.linkedBeliefNodeId || meta.linkedBeliefId || meta.beliefId || \"\"\n );\n return {\n _id: q._id,\n _creationTime: q._creationTime,\n projectId: q.projectId,\n question: q.canonicalText,\n canonicalText: q.canonicalText,\n category: (meta.category as string) || \"other\",\n priority: (meta.priority as string) || \"medium\",\n status: (meta.questionStatus as string) || q.status,\n questionType:\n q.questionType || (meta.questionType as string) || \"general\",\n beliefId: linkedId || undefined,\n beliefText: linkedId ? beliefMap.get(linkedId) : undefined,\n createdAt: q.createdAt,\n createdBy: q.createdBy,\n updatedAt: q.updatedAt,\n };\n });\n\n // Sort by priority then creation date\n const priorityOrder: Record<string, number> = {\n high: 0,\n medium: 1,\n low: 2,\n };\n enrichedQuestions.sort((a, b) => {\n const aPriority = priorityOrder[a.priority || \"medium\"] ?? 1;\n const bPriority = priorityOrder[b.priority || \"medium\"] ?? 1;\n if (aPriority !== bPriority) {\n return aPriority - bPriority;\n }\n return (b.createdAt || 0) - (a.createdAt || 0);\n });\n\n return {\n questions: enrichedQuestions,\n beliefs: beliefs.map((b) => ({\n _id: b._id,\n belief: b.canonicalText,\n pillar:\n ((b.metadata as any)?.category as string) ||\n ((b.metadata as any)?.pillar as string),\n confidence: (b.metadata as any)?.confidence,\n })),\n };\n },\n});\n\n/**\n * 12. consolidate - Consolidate multiple questions into one\n * Ported from questions.ts line 2619\n */\nexport const consolidate = mutation({\n args: {\n ...optionalScopeArgs,\n questionIds: v.array(v.string()), // Accept string[] for backward compat\n consolidatedQuestion: v.string(),\n consolidationRationale: v.optional(v.string()),\n linkedBeliefIds: v.optional(v.array(v.string())),\n priority: v.optional(\n v.union(v.literal(\"high\"), v.literal(\"medium\"), v.literal(\"low\"))\n ),\n sprintId: v.optional(v.string()),\n consolidatedBy: v.string(),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const scope = await resolveTopicProjectScope(ctx, {\n projectId: args.projectId,\n topicId: args.topicId,\n });\n const scopeId = resolveQuestionScopeId(scope);\n if (!scopeId) {\n return [] as any; // graceful: topicId migration\n }\n const hasAccess = await checkScopeAccess(ctx, scopeId, args.consolidatedBy);\n if (!hasAccess) {\n throw new Error(\"Access denied\");\n }\n\n if (args.questionIds.length < 2) {\n throw new Error(\"At least 2 questions required for consolidation\");\n }\n\n // Fetch the original questions\n const originalQuestions = await Promise.all(\n args.questionIds.map(async (qid) => {\n try {\n return await ctx.db.get(qid as Id<\"epistemicNodes\">);\n } catch {\n return null;\n }\n })\n );\n\n // Validate all questions exist and belong to this scope\n const validQuestions = originalQuestions.filter((q) => {\n if (!q || q.nodeType !== \"question\") {\n return false;\n }\n if (scope.topicId) {\n return (\n String(q.topicId) === String(scope.topicId) ||\n (!q.topicId &&\n scope.projectId !== undefined &&\n String(q.projectId) === String(scope.projectId))\n );\n }\n return String(q.projectId) === String(scope.projectId);\n });\n if (validQuestions.length !== args.questionIds.length) {\n throw new Error(\n \"Some questions not found or do not belong to this topic scope\"\n );\n }\n\n // Determine priority\n const priorityOrder: Record<string, number> = {\n high: 0,\n medium: 1,\n low: 2,\n };\n let bestPriority = args.priority;\n if (!bestPriority) {\n let bestScore = 2;\n for (const q of validQuestions) {\n const meta = (q?.metadata || {}) as Record<string, unknown>;\n const score = priorityOrder[(meta.priority as string) || \"medium\"] ?? 1;\n if (score < bestScore) {\n bestScore = score;\n bestPriority =\n (meta.priority as \"high\" | \"medium\" | \"low\") || \"medium\";\n }\n }\n }\n\n // Collect linked beliefs\n const linkedBeliefSet = new Set<string>();\n if (args.linkedBeliefIds) {\n for (const bid of args.linkedBeliefIds) {\n linkedBeliefSet.add(String(bid));\n }\n } else {\n for (const q of validQuestions) {\n const meta = (q?.metadata || {}) as Record<string, unknown>;\n if (meta.linkedBeliefNodeId) {\n linkedBeliefSet.add(String(meta.linkedBeliefNodeId));\n }\n if (meta.linkedBeliefId) {\n linkedBeliefSet.add(String(meta.linkedBeliefId));\n }\n }\n }\n\n // Determine category\n let category = \"other\";\n if (linkedBeliefSet.size > 0) {\n const firstBeliefId = Array.from(linkedBeliefSet)[0];\n try {\n const belief = await ctx.db.get(firstBeliefId as Id<\"epistemicNodes\">);\n if (belief) {\n const bMeta = (belief.metadata || {}) as Record<string, unknown>;\n category =\n (bMeta.category as string) || (bMeta.pillar as string) || \"other\";\n }\n } catch {\n // Ignore\n }\n }\n\n // Create the new consolidated question in epistemicNodes\n const now = Date.now();\n const globalId = generateGlobalId();\n const contentHash = generateContentHash(args.consolidatedQuestion);\n\n const newNodeId = await ctx.db.insert(\"epistemicNodes\", {\n globalId,\n projectId: scope.projectId,\n topicId: scope.topicId,\n nodeType: \"question\",\n canonicalText: args.consolidatedQuestion,\n contentHash,\n status: \"active\",\n epistemicLayer: \"L3\",\n sourceType: \"human\",\n createdAt: now,\n updatedAt: now,\n createdBy: args.consolidatedBy,\n metadata: {\n category,\n priority: bestPriority || \"medium\",\n source: \"consolidated\",\n questionStatus: \"open\",\n linkedBeliefNodeId:\n linkedBeliefSet.size > 0 ? Array.from(linkedBeliefSet)[0] : undefined,\n consolidationMetadata: {\n originalQuestionIds: args.questionIds,\n rationale: args.consolidationRationale,\n consolidatedAt: now,\n consolidatedBy: args.consolidatedBy,\n },\n },\n });\n\n // Archive the original questions\n for (const qid of args.questionIds) {\n try {\n const node = await ctx.db.get(qid as Id<\"epistemicNodes\">);\n if (node) {\n const meta = (node.metadata || {}) as Record<string, unknown>;\n await ctx.db.patch(qid as Id<\"epistemicNodes\">, {\n status: \"archived\",\n updatedAt: now,\n metadata: {\n ...meta,\n questionStatus: \"archived\",\n archivedAt: now,\n archivedReason: `Consolidated into question ${newNodeId}`,\n consolidatedIntoId: newNodeId,\n },\n });\n }\n } catch {\n // Ignore invalid IDs\n }\n }\n\n // Sprint linking removed — K-tier uses worktrees exclusively.\n // Worktree question targets are managed via worktree.targetQuestionIds.\n\n // Schedule Neo4j sync\n await ctx.scheduler.runAfter(0, internal.neo4jSync.syncNodeToNeo4j, {\n nodeId: newNodeId,\n operation: \"upsert\",\n });\n\n await markProjectGraphDirty(\n ctx,\n scope.projectId,\n normalizeQuestionTopicId(scope.topicId)\n );\n\n return {\n newQuestionId: newNodeId,\n archivedCount: args.questionIds.length,\n linkedBeliefs: Array.from(linkedBeliefSet),\n };\n },\n});\n\n/**\n * 13. deleteQuestion - Archive a question (soft delete)\n * Ported from questions.ts line 1257\n */\nexport const deleteQuestion = mutation({\n args: {\n questionId: v.id(\"epistemicNodes\"),\n userId: v.string(),\n runtimeToolName: v.optional(v.string()),\n runtimePackKey: v.optional(v.string()),\n runtimePackInstallScope: v.optional(\n v.union(v.literal(\"tenant\"), v.literal(\"workspace\"))\n ),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const node = await ctx.db.get(args.questionId);\n if (!node || node.nodeType !== \"question\") {\n throw new Error(\"Question not found\");\n }\n assertTenantPackWorkspaceMutationAllowed({\n runtime: resolveRuntimePackMutationContext(args),\n target: await resolveNodeScopeForWorkspaceIsolation(ctx, node),\n mutationName: \"epistemicQuestions.deleteQuestion\",\n });\n\n const now = Date.now();\n const meta = (node.metadata || {}) as Record<string, unknown>;\n\n // Soft-delete: set status to archived (never hard-delete)\n await ctx.db.patch(args.questionId, {\n status: \"archived\",\n updatedAt: now,\n metadata: {\n ...meta,\n questionStatus: \"archived\",\n archivedAt: now,\n archivedBy: args.userId,\n },\n });\n\n // Log to audit\n await ctx.db.insert(\"epistemicAudit\", {\n entityType: \"question\",\n entityId: args.questionId,\n changeType: \"status_changed\",\n changedAt: now,\n changedBy: args.userId,\n isAgent: false,\n projectId: node.projectId,\n previousState: {\n status: meta.questionStatus || node.status,\n },\n newState: { status: \"archived\" },\n });\n\n // Sync to Neo4j\n await ctx.scheduler.runAfter(0, internal.neo4jSync.syncNodeToNeo4j, {\n nodeId: args.questionId,\n operation: \"upsert\",\n });\n\n await markProjectGraphDirty(ctx, node.projectId, node.topicId);\n },\n});\n\n/**\n * 14. markAnsweredWithArtifact - Mark question as answered with a specific artifact\n * Ported from questions.ts line 1728\n */\nexport const markAnsweredWithArtifact = mutation({\n args: {\n questionId: v.id(\"epistemicNodes\"),\n artifactId: v.id(\"finalArtifacts\"),\n answer: v.optional(v.string()),\n userId: v.string(),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const node = await ctx.db.get(args.questionId);\n if (!node || node.nodeType !== \"question\") {\n throw new Error(\"Question not found\");\n }\n\n // Verify artifact exists\n const artifact = await resolveGraphPrimitivesAppResolvers(\n ctx\n ).getFinalArtifact(ctx, args.artifactId);\n if (!artifact) {\n throw new Error(\"Artifact not found\");\n }\n\n // Verify project access\n const scopeId = resolveQuestionScopeId({\n projectId: node.projectId,\n topicId: normalizeQuestionTopicId(node.topicId),\n });\n if (scopeId) {\n const hasAccess = await checkScopeAccess(ctx, scopeId, args.userId);\n if (!hasAccess) {\n throw new Error(\"Access denied\");\n }\n }\n\n const now = Date.now();\n const meta = (node.metadata || {}) as Record<string, unknown>;\n\n await ctx.db.patch(args.questionId, {\n updatedAt: now,\n metadata: {\n ...meta,\n questionStatus: \"answered\",\n answeringArtifactId: args.artifactId,\n answer: args.answer,\n answeredAt: now,\n answeredBy: args.userId,\n },\n });\n\n // Sync to Neo4j\n await ctx.scheduler.runAfter(0, internal.neo4jSync.syncNodeToNeo4j, {\n nodeId: args.questionId,\n operation: \"upsert\",\n });\n\n await markProjectGraphDirty(ctx, node.projectId, node.topicId);\n },\n});\n\n/**\n * 15. getQuestionClusterPositions - Get cluster positions for visualization\n * Ported from questions.ts line 2788\n */\nexport const getQuestionClusterPositions = query({\n args: {\n ...optionalScopeArgs,\n userId: v.string(),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n let scope:\n | Awaited<ReturnType<typeof resolveTopicProjectScope>>\n | null = null;\n try {\n scope = await resolveTopicProjectScope(ctx, {\n projectId: args.projectId,\n topicId: args.topicId,\n });\n } catch {\n return {\n positions: {},\n counts: {\n cluster: 0,\n sprintLinked: 0,\n baseline: 0,\n total: 0,\n },\n };\n }\n\n // Get all question nodes for this project\n const questionNodes = await ctx.db\n .query(\"epistemicNodes\")\n .withIndex(scope.topicId ? \"by_topic_type\" : \"by_project_type\", (q) =>\n scope?.topicId\n ? q.eq(\"topicId\", scope.topicId).eq(\"nodeType\", \"question\")\n : q.eq(\"projectId\", scope?.projectId).eq(\"nodeType\", \"question\")\n )\n .collect();\n const activeQuestionNodes = questionNodes.filter(isActiveQuestionNode);\n\n // Build result mapping\n const positions: Record<string, \"cluster\" | \"sprint_linked\" | \"baseline\"> =\n {};\n let clusterCount = 0;\n let sprintLinkedCount = 0;\n let baselineCount = 0;\n\n for (const question of activeQuestionNodes) {\n const id = question._id.toString();\n const meta = (question.metadata || {}) as Record<string, unknown>;\n const questionType =\n typeof (question as any).questionType === \"string\"\n ? (question as any).questionType\n : typeof meta.questionType === \"string\"\n ? meta.questionType\n : undefined;\n\n // Questions with questionType === \"belief_test\" or testType set are cluster questions\n if (questionType === \"belief_test\" || meta.testType) {\n positions[id] = \"cluster\";\n clusterCount++;\n }\n // Questions linked to a sprint but not belief_test are sprint_linked\n else if (resolveLinkedWorktreeId(meta)) {\n positions[id] = \"sprint_linked\";\n sprintLinkedCount++;\n }\n // Everything else is baseline/raw\n else {\n positions[id] = \"baseline\";\n baselineCount++;\n }\n }\n\n return {\n positions,\n counts: {\n cluster: clusterCount,\n sprintLinked: sprintLinkedCount,\n baseline: baselineCount,\n total: activeQuestionNodes.length,\n },\n };\n },\n});\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/convex.ts","../src/embeddingTrigger.ts","../src/globalId.ts","../src/topicProjectOverlay.ts","../src/resolvers.ts","../src/topicScope.ts","../src/workspaceIsolation.ts","../src/workflowBridge.ts","../src/epistemicQuestions.ts"],"names":["isMissingLucernChildComponentError","LEGACY_SCOPE_FIELD","normalizeScopeValue","worktree","query","v"],"mappings":"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","file":"epistemicQuestions.js","sourcesContent":["import {\n actionGeneric,\n anyApi,\n componentsGeneric,\n httpActionGeneric,\n internalActionGeneric,\n internalMutationGeneric,\n internalQueryGeneric,\n mutationGeneric,\n queryGeneric,\n} from \"convex/server\";\nimport type { GenericId } from \"convex/values\";\n\nexport const api = anyApi as any;\nexport const components = componentsGeneric() as any;\nexport const internal = anyApi as any;\n\nexport type TableNames = string;\nexport type Id<TableName extends TableNames = string> = GenericId<TableName>;\nexport type Doc<TableName extends TableNames = string> = any;\nexport type DataModel = any;\nexport type ActionCtx = any;\nexport type DatabaseReader = any;\nexport type DatabaseWriter = any;\nexport type MutationCtx = any;\nexport type QueryCtx = any;\n\nexport const action = actionGeneric as any;\nexport const httpAction = httpActionGeneric as any;\nexport const internalAction = internalActionGeneric as any;\nexport const internalMutation = internalMutationGeneric as any;\nexport const internalQuery = internalQueryGeneric as any;\nexport const mutation = mutationGeneric as any;\nexport const query = queryGeneric as any;\n","/**\n * Shared helper to schedule embedding generation after epistemic node creation.\n *\n * Best-effort — failures are silently caught. The embedding generation action\n * is a public action in convex/embeddingActions.ts that calls Pinecone.\n */\n\nimport type { Id } from \"./convex\";\n\ninterface EmbeddingTriggerArgs {\n ctx: any;\n nodeId: Id<\"epistemicNodes\">;\n projectId?: string | null;\n topicId?: string | null;\n createdBy: string;\n nodeType:\n | \"belief\"\n | \"question\"\n | \"evidence\"\n | \"answer\"\n | \"synthesis\"\n | \"theme\"\n | \"source\";\n text: string;\n hasAnswer?: boolean;\n confidence?: number;\n}\n\nexport async function scheduleEmbeddingGeneration(args: EmbeddingTriggerArgs): Promise<void> {\n try {\n await args.ctx.scheduler.runAfter(\n 0,\n \"embeddingActions:generateEpistemicNodeEmbedding\" as any,\n {\n nodeId: args.nodeId,\n projectId: args.projectId ? String(args.projectId) : undefined,\n topicId: args.topicId ? String(args.topicId) : undefined,\n createdBy: args.createdBy,\n nodeType: args.nodeType,\n text: args.text.slice(0, 20_000),\n hasAnswer: args.hasAnswer,\n confidence: args.confidence,\n }\n );\n } catch {\n // Embedding generation is best-effort — never block node creation\n }\n}\n","/**\n * Shared UUID v4 generator for global IDs.\n *\n * Uses crypto.getRandomValues() for collision-safe generation.\n * Replaces the Math.random()-based UUID pattern that was duplicated\n * across 7+ files.\n *\n * @module convex/lib/globalId\n */\n\n/**\n * Generate a UUID v4 global ID using crypto-safe random bytes.\n */\nexport function generateGlobalId(): string {\n const bytes = new Uint8Array(16);\n crypto.getRandomValues(bytes);\n // Set version (4) and variant (RFC 4122)\n bytes[6] = (bytes[6] & 0x0f) | 0x40;\n bytes[8] = (bytes[8] & 0x3f) | 0x80;\n const hex = Array.from(bytes, (b) => b.toString(16).padStart(2, \"0\")).join(\n \"\"\n );\n return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;\n}\n","import { api } from \"./convex\";\n\ntype OverlayIdMode = \"legacy\" | \"topic\";\nconst LEGACY_SCOPE_FIELD = \"graphScope\" + \"ProjectId\";\n\ntype LegacyProjectThesis = {\n statement: string;\n confidence: number;\n lastUpdated: number;\n};\n\ntype LegacyPillarImportance =\n | \"critical\"\n | \"major\"\n | \"minor\"\n | \"not_applicable\";\n\ntype LegacyThesisPillarConfig = {\n pillarImportance?: Record<string, LegacyPillarImportance | undefined>;\n configuredAt?: number;\n configuredBy?: string;\n aiSuggestion?: {\n suggestedAt: number;\n reasoning: string;\n };\n};\n\ntype LegacyBeliefArchitecture = {\n overallMaturity: number;\n pillarScores: Array<Record<string, unknown>>;\n lastCalculated: number;\n};\n\ntype LegacyOntologyClassification = {\n valueChains: Array<Record<string, unknown>>;\n functions: Array<Record<string, unknown>>;\n overallConfidence: number;\n classifiedAt: number;\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 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 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\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 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 = error instanceof Error ? error.message : String(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\nasync function resolveTopicDoc(\n ctx: any,\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(scopeId as any)) as TopicDocLike | null;\n if (directTopic) {\n return directTopic;\n }\n } catch {\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(api.topics.get as any, {\n id: String(scopeId),\n });\n if (topic?.name !== undefined && topic?.type !== undefined) {\n return topic as TopicDocLike;\n }\n } catch {\n // Fall through to legacy-scope lookup.\n }\n\n try {\n const topic = await ctx.runQuery(api.topics.getByLegacyScopeId as any, {\n projectId: String(scopeId),\n });\n if (topic?.name !== undefined && topic?.type !== undefined) {\n return topic as TopicDocLike;\n }\n } catch {\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 const createdAt =\n typeof topic.createdAt === \"number\"\n ? topic.createdAt\n : typeof topic._creationTime === \"number\"\n ? topic._creationTime\n : 0;\n const updatedAt =\n typeof topic.updatedAt === \"number\"\n ? topic.updatedAt\n : typeof metadata.updatedAt === \"number\"\n ? (metadata.updatedAt as number)\n : createdAt;\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 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\" ? (metadata.chatCount as number) : 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: any,\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: any,\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 {\n allTopics = [];\n }\n }\n\n if (allTopics.length === 0 && typeof ctx.runQuery === \"function\") {\n allTopics =\n (((await ctx.runQuery(api.topics.list as any, {})) ?? []) 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: any,\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 nextMetadata = { ...readMetadata(topic) };\n const patch: Record<string, unknown> = {};\n const topicUpdateArgs: Record<string, unknown> = {\n id: String(topic._id),\n };\n\n for (const [key, rawValue] of Object.entries(value)) {\n switch (key) {\n case \"_id\":\n case \"projectId\":\n case \"topicId\":\n case \"legacyProjectId\":\n case \"storageProjectId\":\n break;\n case \"name\":\n case \"description\":\n patch[key] = rawValue;\n topicUpdateArgs[key] = rawValue;\n break;\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 const status = coerceStatus(rawValue);\n if (status) {\n patch.status = status;\n topicUpdateArgs.status = status;\n }\n break;\n }\n case \"visibility\": {\n const visibility = coerceVisibility(rawValue);\n if (visibility) {\n patch.visibility = visibility;\n topicUpdateArgs.visibility = visibility;\n }\n break;\n }\n case \"type\": {\n const projectType = readNonEmptyString(rawValue);\n if (projectType) {\n nextMetadata.projectType = projectType;\n } else {\n delete nextMetadata.projectType;\n }\n break;\n }\n case \"updatedAt\":\n case \"createdAt\":\n break;\n default:\n if (rawValue === undefined) {\n delete nextMetadata[key];\n } else {\n nextMetadata[key] = rawValue;\n }\n }\n }\n\n patch.updatedAt = Date.now();\n patch.metadata = nextMetadata;\n topicUpdateArgs.metadata = nextMetadata;\n\n if (typeof ctx.runMutation === \"function\") {\n try {\n await ctx.runMutation(api.topics.update as any, topicUpdateArgs);\n } catch (error) {\n if (\n !isMissingLucernChildComponentError(error) ||\n !ctx?.db ||\n typeof ctx.db.patch !== \"function\"\n ) {\n throw error;\n }\n await ctx.db.patch(String(topic._id) as any, patch);\n }\n } else if (ctx?.db && typeof ctx.db.patch === \"function\") {\n await ctx.db.patch(String(topic._id) as any, patch);\n } else {\n throw new Error(\n \"Cannot patch topic without component adapter (ctx.runMutation unavailable)\"\n );\n }\n\n return materializeTopicProjectOverlay(\n {\n ...topic,\n ...patch,\n metadata: nextMetadata,\n } as TopicDocLike\n );\n}\n\nexport function matchesTopicProjectOverlayAccess(\n accessibleProjectIds: Set<string>,\n project: { topicId: string; legacyProjectId?: string; storageProjectId?: string }\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. */\nimport {\n listTopicProjectOverlays,\n patchTopicProjectOverlay,\n resolveTopicProjectOverlay,\n} from \"./topicProjectOverlay\";\nimport type {\n GraphPrimitivesAppResolverContext,\n GraphPrimitivesAppResolvers,\n} from \"./resolverTypes\";\n\nfunction isMissingLucernChildComponentError(error: unknown): boolean {\n const message = error instanceof Error ? error.message : String(error);\n return (\n message.includes('Child component ComponentName(Identifier(\"lucern\")) not found') ||\n (message.includes(\"Child component\") &&\n message.includes(\"lucern\") &&\n message.includes(\"not found\"))\n );\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 !isAdvisoryTopicPatch(value) ||\n !isMissingLucernChildComponentError(error)\n ) {\n throw error;\n }\n\n console.warn(\"[lucern graph-primitives] Non-fatal advisory topic patch failure\", {\n projectId,\n keys: Object.keys(value),\n error: error instanceof Error ? error.message : error,\n });\n }\n}\n\nfunction defaultResolvers(): GraphPrimitivesAppResolvers {\n return {\n async getProject(ctx, projectId) {\n return await resolveTopicProjectOverlay(ctx, projectId, {\n idMode: \"legacy\",\n projectLikeOnly: false,\n });\n },\n async patchProject(ctx, projectId, value) {\n await patchProjectWithTolerance(ctx, projectId, value);\n },\n async listTopics(ctx) {\n return await listTopicProjectOverlays(ctx, {\n idMode: \"legacy\",\n });\n },\n async getFinalArtifact(ctx, artifactId) {\n return await ctx.db.get(artifactId);\n },\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","/** Topic-scope resolution helpers for graph-primitive operations. */\nimport { v } from \"convex/values\";\nimport { api as appApi } from \"./convex\";\nimport type { Id } from \"./convex\";\n\nconst LEGACY_SCOPE_FIELD = \"graphScope\" + \"ProjectId\";\n\ntype TopicDoc = Record<string, unknown> & {\n _id: Id<\"topics\">;\n globalId?: string;\n name?: string;\n depth?: number;\n createdAt?: number;\n parentTopicId?: Id<\"topics\">;\n tenantId?: string;\n workspaceId?: string;\n metadata?: Record<string, unknown>;\n};\n\nexport type TopicProjectScope = {\n topicId: Id<\"topics\">;\n projectId?: string;\n tenantId?: string;\n workspaceId?: string;\n source: \"topic\" | \"project_mapped_topic\" | \"topic_inferred\";\n};\n\ntype MaterializedTopicNodeDoc = {\n _id: string | Id<\"epistemicNodes\">;\n metadata?: Record<string, unknown>;\n};\n\nfunction asMappedProjectId(\n topic: TopicDoc | null | undefined\n): string | undefined {\n if (!topic) {\n return;\n }\n const directLegacyProjectId = normalizeScopeValue(topic[LEGACY_SCOPE_FIELD]);\n if (directLegacyProjectId) {\n return directLegacyProjectId;\n }\n const metadata = (topic.metadata || {}) as Record<string, unknown>;\n const candidate =\n (metadata[LEGACY_SCOPE_FIELD] as string | undefined) ||\n (metadata.legacyProjectId as string | undefined) ||\n (metadata.projectId as string | undefined) ||\n (metadata.scopeProjectId as string | undefined);\n return candidate ? (candidate as string) : undefined;\n}\n\nfunction normalizeScopeValue(value: unknown): string | undefined {\n if (typeof value !== \"string\") {\n return;\n }\n const normalized = value.trim();\n return normalized.length > 0 ? normalized : undefined;\n}\n\nfunction pickPrimaryTopic(candidates: TopicDoc[]): TopicDoc | undefined {\n return [...candidates].sort((a, b) => {\n const depthA = a.depth ?? 9999;\n const depthB = b.depth ?? 9999;\n if (depthA !== depthB) {\n return depthA - depthB;\n }\n const createdA = a.createdAt ?? Number.MAX_SAFE_INTEGER;\n const createdB = b.createdAt ?? Number.MAX_SAFE_INTEGER;\n if (createdA !== createdB) {\n return createdA - createdB;\n }\n return String(a.name || \"\").localeCompare(String(b.name || \"\"));\n })[0];\n}\n\nasync function findTopicsByScopeAlias(ctx: any, scopeId: string): Promise<TopicDoc[]> {\n try {\n return (await ctx.db\n .query(\"topics\")\n .withIndex(\"by_graph_scope_project\", (q: any) =>\n q.eq(LEGACY_SCOPE_FIELD, scopeId)\n )\n .collect()) as TopicDoc[];\n } catch {\n // Older Lucern dev deployments can lag index backfills while still carrying\n // the underlying topics table. Scan and filter so scope resolution keeps\n // working during the rollout.\n const topics = (await ctx.db.query(\"topics\").collect()) as TopicDoc[];\n return topics.filter((topic) => {\n const normalizedGlobalId = normalizeScopeValue(topic.globalId);\n const mappedProjectId = asMappedProjectId(topic);\n return (\n String(topic._id) === scopeId ||\n normalizedGlobalId === scopeId ||\n mappedProjectId === scopeId\n );\n });\n }\n}\n\nasync function tryResolveHostTopicById(\n ctx: any,\n topicId: string\n): Promise<TopicDoc | null> {\n if (typeof ctx.runQuery !== \"function\") {\n return null;\n }\n try {\n return ((await ctx.runQuery(appApi.topics.get as any, {\n id: topicId,\n })) ?? null) as TopicDoc | null;\n } catch {\n return null;\n }\n}\n\nasync function tryResolveHostTopicByLegacyScope(\n ctx: any,\n legacyScopeId: string\n): Promise<TopicDoc | null> {\n if (typeof ctx.runQuery !== \"function\") {\n return null;\n }\n try {\n return ((await ctx.runQuery(appApi.topics.getByLegacyScopeId as any, {\n projectId: legacyScopeId,\n })) ?? null) as TopicDoc | null;\n } catch {\n return null;\n }\n}\n\nexport function readMaterializedTopicTableId(\n topicNode: MaterializedTopicNodeDoc | null | undefined\n): string | undefined {\n if (!topicNode) {\n return;\n }\n\n const metadata = (topicNode.metadata || {}) as Record<string, unknown>;\n const topicTableId =\n (metadata.topicTableId as string | undefined) ||\n (metadata.topicId as string | undefined);\n\n return typeof topicTableId === \"string\" && topicTableId.trim().length > 0\n ? topicTableId.trim()\n : undefined;\n}\n\n/**\n * Walk the topic parent chain to find inherited workspaceId and tenantId.\n * Mirrors the pattern used by resolveTopicOntology for ontologyId inheritance.\n * Max depth: 10 (defensive limit against pathological nesting).\n */\nasync function resolveInheritedWorkspaceScope(\n ctx: any,\n topic: TopicDoc\n): Promise<{ tenantId?: string; workspaceId?: string }> {\n const MAX_DEPTH = 10;\n let tenantId = normalizeScopeValue(topic.tenantId);\n let workspaceId = normalizeScopeValue(topic.workspaceId);\n\n if (tenantId && workspaceId) {\n return { tenantId, workspaceId };\n }\n\n let current: TopicDoc | null = topic;\n for (let i = 0; i < MAX_DEPTH && current?.parentTopicId; i++) {\n current = (await ctx.db.get(current.parentTopicId)) as TopicDoc | null;\n if (!current) break;\n\n if (!tenantId) {\n tenantId = normalizeScopeValue(current.tenantId);\n }\n if (!workspaceId) {\n workspaceId = normalizeScopeValue(current.workspaceId);\n }\n if (tenantId && workspaceId) break;\n }\n\n return { tenantId, workspaceId };\n}\n\nexport async function resolveTopicProjectScope(\n ctx: any,\n args: { topicId?: Id<\"topics\"> | string; projectId?: string }\n): Promise<TopicProjectScope> {\n if (args.topicId) {\n // Try direct lookup, fall back to the legacy mapped-project bridge\n let topic: TopicDoc | null = null;\n try {\n topic = (await ctx.db.get(args.topicId as Id<\"topics\">)) as TopicDoc | null;\n } catch {\n // Not a valid topics table ID\n }\n if (!topic) {\n topic = await tryResolveHostTopicById(ctx, String(args.topicId));\n }\n if (!topic) {\n // Try as legacy projectId / globalId via the mapped-project bridge.\n topic =\n pickPrimaryTopic(\n await findTopicsByScopeAlias(ctx, String(args.topicId))\n ) ?? null;\n }\n if (!topic) {\n throw new Error(`Topic not found: ${String(args.topicId)}`);\n }\n const inherited = await resolveInheritedWorkspaceScope(ctx, topic);\n const mapped = asMappedProjectId(topic);\n if (mapped) {\n return {\n topicId: topic._id,\n projectId: mapped,\n tenantId: inherited.tenantId,\n workspaceId: inherited.workspaceId,\n source: \"topic\",\n };\n }\n return {\n topicId: topic._id,\n tenantId: inherited.tenantId,\n workspaceId: inherited.workspaceId,\n source: \"topic\",\n };\n }\n\n if (args.projectId) {\n let directTopic: TopicDoc | null = null;\n try {\n directTopic = (await ctx.db.get(\n args.projectId as Id<\"topics\">\n )) as TopicDoc | null;\n } catch {\n // Not a valid topics table ID, continue to legacy graph-scope lookup.\n }\n\n if (directTopic) {\n const inherited = await resolveInheritedWorkspaceScope(ctx, directTopic);\n const mapped = asMappedProjectId(directTopic);\n return {\n topicId: directTopic._id,\n projectId: mapped ?? args.projectId,\n tenantId: inherited.tenantId,\n workspaceId: inherited.workspaceId,\n source: \"topic_inferred\",\n };\n }\n\n directTopic = await tryResolveHostTopicByLegacyScope(ctx, args.projectId);\n if (directTopic) {\n const inherited = await resolveInheritedWorkspaceScope(ctx, directTopic);\n const mapped = asMappedProjectId(directTopic);\n return {\n topicId: directTopic._id,\n projectId: mapped ?? args.projectId,\n tenantId: inherited.tenantId,\n workspaceId: inherited.workspaceId,\n source: \"topic_inferred\",\n };\n }\n\n const topics = await findTopicsByScopeAlias(ctx, args.projectId);\n const primary = pickPrimaryTopic(topics);\n if (primary) {\n const inherited = await resolveInheritedWorkspaceScope(ctx, primary);\n return {\n topicId: primary._id,\n projectId: args.projectId,\n tenantId: inherited.tenantId,\n workspaceId: inherited.workspaceId,\n source: \"project_mapped_topic\",\n };\n }\n throw new Error(\n `Legacy project scope ${String(args.projectId)} has no mapped topic.`\n );\n }\n\n throw new Error(\n \"Missing scope: provide topicId (preferred) or legacy projectId alias.\"\n );\n}\n\n/** Shared scope args for graph-primitive functions. topicId is canonical; projectId is a legacy alias. */\nexport const optionalScopeArgs = {\n projectId: v.optional(v.string()),\n topicId: v.optional(v.string()),\n} as const;\n","import {\n getLayerForNodeType,\n isNodeType,\n} from \"@lucern/contracts/schema-helpers/spine/tables/epistemicNodes\";\nimport {\n resolveTopicProjectScope,\n type TopicProjectScope,\n} from \"./topicScope\";\n\ntype StructuredInvariantError = Error & {\n status: number;\n code: string;\n invariantCode?: string;\n suggestion?: string;\n details?: unknown;\n};\n\ntype ScopeLike = {\n tenantId?: unknown;\n workspaceId?: unknown;\n epistemicLayer?: unknown;\n nodeType?: unknown;\n topicId?: unknown;\n projectId?: unknown;\n publicationStatus?: unknown;\n};\n\nexport type RuntimePackMutationContext = {\n toolName?: string;\n packKey?: string;\n packInstallScope?: \"tenant\" | \"workspace\";\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 (\n scopeTenantId &&\n nodeTenantId &&\n scopeTenantId !== nodeTenantId\n ) {\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 (\n scopeTenantId &&\n edgeTenantId &&\n scopeTenantId !== edgeTenantId\n ) {\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: any,\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 if (node.topicId) {\n const topicScope = await resolveTopicProjectScope(ctx, {\n topicId: node.topicId as any,\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 !args.runtimeToolName &&\n !args.runtimePackKey &&\n !args.runtimePackInstallScope\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 (\n !args.runtime?.packKey ||\n args.runtime.packInstallScope !== \"tenant\"\n ) {\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:\n `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","import { resolveTopicProjectScope } from \"./topicScope\";\n\nexport type WorkflowLikeDoc = {\n _id?: string;\n topicId?: string;\n projectId?: string;\n metadata?: Record<string, unknown>;\n [key: string]: unknown;\n};\n\nexport type WorkflowBridgeResolution = {\n inputId: string | null;\n sprint: WorkflowLikeDoc | null;\n worktree: WorkflowLikeDoc | null;\n sprintId: string | null;\n worktreeId: string | null;\n topicId?: string;\n projectId?: string;\n};\n\nexport function isLegacySprintDoc(doc: unknown): doc is WorkflowLikeDoc {\n if (!doc || typeof doc !== \"object\") {\n return false;\n }\n\n if (\"metadata\" in doc && (doc as any).metadata?.pairedSprintId) {\n return false;\n }\n\n return (\n \"sprintScope\" in doc ||\n \"targetPillar\" in doc ||\n \"pillarThesis\" in doc ||\n \"synthesisState\" in doc ||\n (\"projectId\" in doc && !(\"worktreeScope\" in doc))\n );\n}\n\nexport function isWorktreeDoc(doc: unknown): doc is WorkflowLikeDoc {\n if (!doc || typeof doc !== \"object\") {\n return false;\n }\n\n return (\n \"worktreeScope\" in doc ||\n \"targetBranch\" in doc ||\n \"campaign\" in doc ||\n \"executionBand\" in doc ||\n \"proofArtifacts\" in doc\n );\n}\n\nexport function getPairedSprintId(doc: WorkflowLikeDoc | null | undefined) {\n const pairedSprintId = doc?.metadata?.pairedSprintId;\n return typeof pairedSprintId === \"string\" && pairedSprintId.trim().length > 0\n ? pairedSprintId\n : null;\n}\n\nfunction getStringField(\n doc: WorkflowLikeDoc | null | undefined,\n field: \"topicId\" | \"projectId\"\n) {\n const value = doc?.[field];\n return typeof value === \"string\" && value.trim().length > 0\n ? value\n : undefined;\n}\n\nasync function findPairedWorktreeForSprint(\n ctx: {\n db: {\n query?: (...args: any[]) => {\n withIndex: (...args: any[]) => { collect: () => Promise<unknown[]> };\n };\n };\n },\n sprint: WorkflowLikeDoc\n): Promise<WorkflowLikeDoc | null> {\n const sprintId =\n typeof sprint._id === \"string\" && sprint._id.length > 0 ? sprint._id : null;\n if (!sprintId || typeof ctx.db.query !== \"function\") {\n return null;\n }\n\n let topicId = getStringField(sprint, \"topicId\");\n if (!topicId) {\n try {\n const scope = await resolveTopicProjectScope(ctx as any, {\n topicId: getStringField(sprint, \"topicId\"),\n projectId: getStringField(sprint, \"projectId\"),\n });\n topicId = scope.topicId;\n } catch {\n topicId = undefined;\n }\n }\n\n if (!topicId) {\n return null;\n }\n\n const worktrees = (await ctx.db\n .query(\"worktrees\")\n .withIndex(\"by_topicId\", (q: any) => q.eq(\"topicId\", topicId))\n .collect()) as WorkflowLikeDoc[];\n\n return (\n worktrees.find(\n (worktree) =>\n String(worktree?.metadata?.pairedSprintId || \"\") === sprintId\n ) ?? null\n );\n}\n\nexport async function resolveWorkflowBridgeDoc(\n ctx: {\n db: {\n get: (...args: any[]) => Promise<unknown>;\n query?: (...args: any[]) => any;\n };\n },\n workflowId: string | null | undefined\n): Promise<WorkflowBridgeResolution> {\n const empty: WorkflowBridgeResolution = {\n inputId: workflowId ?? null,\n sprint: null,\n worktree: null,\n sprintId: null,\n worktreeId: null,\n };\n\n if (!workflowId) {\n return empty;\n }\n\n let doc: unknown;\n try {\n doc = await ctx.db.get(workflowId as any);\n } catch {\n return empty;\n }\n\n if (!doc || typeof doc !== \"object\") {\n return empty;\n }\n\n if (isLegacySprintDoc(doc)) {\n const worktree = await findPairedWorktreeForSprint(ctx, doc);\n return {\n ...empty,\n sprint: doc,\n worktree,\n sprintId:\n typeof doc._id === \"string\" && doc._id.length > 0 ? doc._id : workflowId,\n worktreeId:\n worktree && typeof worktree._id === \"string\" && worktree._id.length > 0\n ? worktree._id\n : null,\n topicId:\n getStringField(worktree, \"topicId\") ?? getStringField(doc, \"topicId\"),\n projectId:\n getStringField(doc, \"projectId\") ??\n getStringField(worktree, \"projectId\"),\n };\n }\n\n const worktree = doc as WorkflowLikeDoc;\n const pairedSprintId = getPairedSprintId(worktree);\n let sprint: WorkflowLikeDoc | null = null;\n\n if (pairedSprintId) {\n try {\n const paired = await ctx.db.get(pairedSprintId as any);\n if (isLegacySprintDoc(paired)) {\n sprint = paired;\n }\n } catch {\n sprint = null;\n }\n }\n\n return {\n ...empty,\n worktree,\n sprint,\n worktreeId:\n typeof worktree._id === \"string\" && worktree._id.length > 0\n ? worktree._id\n : workflowId,\n sprintId:\n sprint && typeof sprint._id === \"string\" && sprint._id.length > 0\n ? sprint._id\n : pairedSprintId,\n topicId:\n getStringField(worktree, \"topicId\") ?? getStringField(sprint, \"topicId\"),\n projectId:\n getStringField(sprint, \"projectId\") ??\n getStringField(worktree, \"projectId\"),\n };\n}\n","/**\n * Epistemic Questions API\n *\n * Clean API for managing questions in the epistemic spine (epistemicNodes).\n * This is the NEW API that replaces questions.ts for CREATE operations.\n *\n * Key differences from questions.ts:\n * - Writes ONLY to epistemicNodes (no dual-write)\n * - Uses epistemicNodes IDs directly (no legacyQuestionId lookups)\n * - Syncs to Neo4j after mutations\n * - Follows Lucern invariants strictly\n *\n * @see /docs/epistemic-invariants/00-epistemic-invariants.md\n */\n\nimport { v } from \"convex/values\";\nimport {\n checkProjectAccess,\n checkScopeAccess,\n} from \"@lucern/access-control/access\";\nimport {\n canAudienceClassAccess,\n classFromAudienceKey,\n normalizeAudienceKey,\n} from \"@lucern/access-control/audience\";\nimport { listAudienceRegistryRows } from \"@lucern/access-control/audienceRegistry\";\nimport { getCurrentUserId } from \"@lucern/access-control/auth\";\nimport { permissiveReturn } from \"@lucern/contracts/schema-helpers/validators\";\nimport type { Doc, Id } from \"./convex\";\nimport {\n internal,\n internalMutation,\n internalQuery,\n mutation,\n query,\n} from \"./convex\";\nimport { scheduleEmbeddingGeneration } from \"./embeddingTrigger\";\nimport { generateGlobalId } from \"./globalId\";\nimport { resolveGraphPrimitivesAppResolvers } from \"./resolvers\";\nimport { optionalScopeArgs, resolveTopicProjectScope } from \"./topicScope\";\nimport {\n assertTenantPackWorkspaceMutationAllowed,\n assertWorkspaceScopedEpistemicNodeScope,\n nodeMatchesWorkspaceReasoningScope,\n resolveNodeScopeForWorkspaceIsolation,\n resolveRuntimePackMutationContext,\n} from \"./workspaceIsolation\";\nimport { resolveWorkflowBridgeDoc } from \"./workflowBridge\";\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\nfunction generateContentHash(text: string): string {\n const content = `question:${text.trim().toLowerCase().replace(/\\s+/g, \" \")}`;\n let hash = 5381;\n for (let i = 0; i < content.length; i++) {\n hash = (hash << 5) + hash + content.charCodeAt(i);\n hash &= hash;\n }\n return Math.abs(hash).toString(16).padStart(8, \"0\");\n}\n\nfunction buildTestsEdgeGlobalId(\n fromGlobalId: string,\n toGlobalId: string\n): string {\n return `edge-${fromGlobalId}-tests-${toGlobalId}`;\n}\n\nasync function markProjectGraphDirty(\n ctx: any,\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 as any).markCacheStaleByTopic,\n {\n topicId: normalizedTopicId,\n }\n );\n }\n await resolveGraphPrimitivesAppResolvers(ctx).patchProject(\n ctx,\n normalizedTopicId ?? normalizedProjectId!,\n {\n lastActivityAt: Date.now(),\n }\n );\n}\n\n// Valid question categories (pillars)\ntype ValidCategory =\n | \"market\"\n | \"competition\"\n | \"product\"\n | \"team\"\n | \"financials\"\n | \"deal\"\n | \"risks\"\n | \"other\";\n\nfunction normalizeCategory(category?: string): ValidCategory {\n if (!category) {\n return \"other\";\n }\n const lower = category.toLowerCase();\n // Handle \"financial\" → \"financials\" mapping\n if (lower === \"financial\") {\n return \"financials\";\n }\n const validCategories: ValidCategory[] = [\n \"market\",\n \"competition\",\n \"product\",\n \"team\",\n \"financials\",\n \"deal\",\n \"risks\",\n ];\n return (validCategories.find((c) => lower.includes(c)) ||\n \"other\") as ValidCategory;\n}\n\ntype QuestionNodeDoc = Doc<\"epistemicNodes\">;\nconst DEFAULT_QUESTION_PAGE_SIZE = 250;\nconst MAX_QUESTION_PAGE_SIZE = 1000;\ntype QuestionScopeArgs = {\n projectId?: string | null;\n topicId?: string | null;\n};\nfunction clampQuestionLimit(\n limit: number | undefined,\n fallback = DEFAULT_QUESTION_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_QUESTION_PAGE_SIZE)\n );\n}\n\nfunction dedupeQuestionNodes(nodes: QuestionNodeDoc[]): QuestionNodeDoc[] {\n const seen = new Set<string>();\n const deduped: QuestionNodeDoc[] = [];\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 normalizeQuestionTopicId(\n topicId: string | undefined | null\n): string | undefined {\n return typeof topicId === \"string\" && topicId.trim().length > 0\n ? topicId\n : undefined;\n}\n\nfunction resolveQuestionScopeId(scope: {\n projectId?: string | undefined;\n topicId?: string | undefined;\n}): string | undefined {\n return normalizeQuestionTopicId(scope.topicId) ?? scope.projectId ?? undefined;\n}\n\nasync function resolveQuestionScopeOrNull(ctx: any, args: QuestionScopeArgs) {\n if (!args.projectId && !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 {\n return null;\n }\n}\n\nasync function getQuestionNodesForScope(\n ctx: any,\n scope: Awaited<ReturnType<typeof resolveTopicProjectScope>>,\n args?: { scanLimit?: number }\n): Promise<QuestionNodeDoc[]> {\n const fetchNodes = (query: any) =>\n typeof args?.scanLimit === \"number\"\n ? query.order(\"desc\").take(args.scanLimit)\n : query.collect();\n\n const topicNodes = await fetchNodes(\n ctx.db.query(\"epistemicNodes\").withIndex(\"by_topic_type\", (q: any) =>\n q.eq(\"topicId\", scope.topicId).eq(\"nodeType\", \"question\")\n )\n );\n\n return dedupeQuestionNodes(topicNodes).filter((node) =>\n questionMatchesScope(node, scope)\n );\n}\n\nasync function getQuestionEdgesForScope(\n ctx: any,\n scope: Awaited<ReturnType<typeof resolveTopicProjectScope>>\n) {\n const query = ctx.db\n .query(\"epistemicEdges\")\n .withIndex(\"by_topic\", (q: any) =>\n q.eq(\"topicId\", scope.topicId || scope.projectId)\n );\n\n return await query.collect();\n}\n\nfunction questionMatchesScope(\n node: Pick<QuestionNodeDoc, \"topicId\" | \"projectId\">,\n scope: Awaited<ReturnType<typeof resolveTopicProjectScope>>\n): boolean {\n return (\n (scope.topicId !== undefined && node.topicId === scope.topicId) ||\n (scope.projectId !== undefined && node.projectId === scope.projectId)\n );\n}\n\nexport function resolveLinkedWorktreeId(\n meta: Record<string, unknown>\n): string | null {\n const linkedWorktreeId = meta.linkedWorktreeId;\n return typeof linkedWorktreeId === \"string\" && linkedWorktreeId.trim()\n ? linkedWorktreeId\n : null;\n}\n\nfunction buildLinkedWorktreeMetadata(\n linkedWorktreeId: string | null | undefined\n): Record<string, string> {\n return linkedWorktreeId\n ? {\n linkedWorktreeId,\n }\n : {};\n}\n\nfunction questionMatchesWorkflowLink(\n meta: Record<string, unknown>,\n workflow: {\n worktreeId?: string | null;\n sprintId?: string | null;\n }\n): boolean {\n const linkedWorktreeId = resolveLinkedWorktreeId(meta);\n return Boolean(\n linkedWorktreeId &&\n (linkedWorktreeId === workflow.worktreeId ||\n linkedWorktreeId === workflow.sprintId)\n );\n}\n\nasync function resolveQuestionLinkedSprintId(\n ctx: {\n db: { get: (...args: any[]) => Promise<unknown>; query?: (...args: any[]) => any };\n },\n args: {\n sprintId?: string | null;\n worktreeId?: string | null;\n },\n meta: Record<string, unknown>\n): Promise<string | null> {\n const workflowId =\n args.sprintId ?? args.worktreeId ?? resolveLinkedWorktreeId(meta);\n if (!workflowId) {\n return null;\n }\n\n const workflow = await resolveWorkflowBridgeDoc(ctx, workflowId);\n return workflow.sprintId;\n}\n\nexport function flattenQuestionNode(n: QuestionNodeDoc) {\n const meta = (n.metadata || {}) as Record<string, unknown>;\n const linkedWorktreeId = resolveLinkedWorktreeId(meta);\n return {\n ...n,\n question: n.canonicalText || \"\",\n category: (meta.category as string) || \"other\",\n priority: (meta.priority as string) || \"medium\",\n status:\n (meta.questionStatus as string) || (meta.status as string) || \"open\",\n beliefId: meta.linkedBeliefNodeId || meta.beliefId || null,\n relatedBeliefIds: (meta.relatedBeliefIds as string[]) || [],\n relatedInsightIds: (meta.relatedInsightIds as string[]) || [],\n linkedWorktreeId,\n sprintIndex: (meta.sprintIndex as number) || undefined,\n linkedBeliefId: meta.linkedBeliefNodeId || null,\n testType: (meta.testType as string) || \"validates\",\n importance: (meta.importance as number) || 5,\n isKeyQuestion: (meta.isKeyQuestion as boolean) || false,\n answer: (meta.answer as string) || null,\n convictionStage: (meta.convictionStage as string) || null,\n conviction: meta.conviction ?? null,\n source: (meta.source as string) || \"ai_suggested\",\n };\n}\n\nfunction flattenInternalQuestionNode(n: QuestionNodeDoc) {\n const meta = (n.metadata || {}) as Record<string, unknown>;\n const flattened = flattenQuestionNode(n);\n return {\n ...flattened,\n _epistemicNodeId: n._id,\n questionType:\n n.questionType || (meta.questionType as string) || flattened.testType,\n linkedBeliefIds: flattened.relatedBeliefIds,\n audienceLabel: n.audienceLabel,\n policyTags: n.policyTags,\n sensitivityTier: n.sensitivityTier,\n exportClass: n.exportClass,\n anonymizationClass: n.anonymizationClass,\n };\n}\n\nconst INACTIVE_NODE_STATUSES = new Set([\"archived\", \"superseded\", \"deleted\"]);\n\nfunction requireScopeId(...ids: (string | undefined)[]): string {\n for (const id of ids) {\n if (typeof id === \"string\" && id.trim().length > 0) return id;\n }\n throw new Error(\"No scope identifier provided (topicId or projectId required)\");\n}\n\nconst INACTIVE_METADATA_STATUSES = new Set([\n \"archived\",\n \"superseded\",\n \"deleted\",\n]);\n\nfunction getQuestionStatusCandidates(node: QuestionNodeDoc): string[] {\n const meta = (node.metadata || {}) as Record<string, unknown>;\n return [meta.questionStatus, meta.status, node.status].filter(\n (value): value is string => typeof value === \"string\"\n );\n}\n\nexport function isActiveQuestionNode(node: QuestionNodeDoc): boolean {\n if (INACTIVE_NODE_STATUSES.has(node.status)) {\n return false;\n }\n return !getQuestionStatusCandidates(node).some((status) =>\n INACTIVE_METADATA_STATUSES.has(status.toLowerCase())\n );\n}\n\nexport function matchesRequestedQuestionStatus(\n node: QuestionNodeDoc,\n requestedStatus: string\n): boolean {\n const normalizedStatus = requestedStatus.toLowerCase();\n return getQuestionStatusCandidates(node).some(\n (status) => status.toLowerCase() === normalizedStatus\n );\n}\n\n// =============================================================================\n// CREATE\n// =============================================================================\n\n/**\n * Create a new question in the epistemic spine.\n * Returns the epistemicNodes ID directly (not a questions ID).\n */\nexport const create = mutation({\n args: {\n ...optionalScopeArgs,\n question: v.string(),\n category: v.optional(v.string()),\n priority: v.optional(\n v.union(v.literal(\"high\"), v.literal(\"medium\"), v.literal(\"low\"))\n ),\n source: v.optional(v.string()),\n userId: v.string(),\n // Optional linking\n linkedBeliefNodeId: v.optional(v.id(\"epistemicNodes\")),\n testType: v.optional(\n v.union(\n v.literal(\"validates\"),\n v.literal(\"invalidates\"),\n v.literal(\"clarifies\")\n )\n ),\n // Optional metadata\n importance: v.optional(v.number()),\n epistemicUnlock: v.optional(v.string()),\n // === SOURCE QUESTIONS (for key question derivation) ===\n // When a key question is synthesized from raw questions, track the source\n sourceQuestionIds: v.optional(v.array(v.string())), // globalIds of source questions\n // === WORKTREE LINKAGE ===\n linkedWorktreeId: v.optional(v.string()),\n // === CLASSIFICATION FIELDS ===\n questionType: v.optional(\n v.union(\n v.literal(\"validation\"),\n v.literal(\"falsification\"),\n v.literal(\"assumption_probe\"),\n v.literal(\"prediction_test\"),\n v.literal(\"counterfactual\"),\n v.literal(\"discovery\"),\n v.literal(\"clarification\"),\n v.literal(\"comparison\"),\n v.literal(\"causal\"),\n v.literal(\"mechanism\"),\n v.literal(\"general\")\n )\n ),\n questionPriority: v.optional(\n v.union(\n v.literal(\"critical\"),\n v.literal(\"high\"),\n v.literal(\"medium\"),\n v.literal(\"low\")\n )\n ),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const scope = await resolveTopicProjectScope(ctx, {\n topicId: args.topicId,\n projectId: args.projectId,\n });\n assertWorkspaceScopedEpistemicNodeScope({\n scope,\n nodeType: \"question\",\n mutationName: \"epistemicQuestions.create\",\n });\n if (scope.projectId) {\n await checkProjectAccess(ctx, scope.projectId, args.userId);\n }\n\n const now = Date.now();\n const globalId = generateGlobalId();\n const contentHash = generateContentHash(args.question);\n const category = normalizeCategory(args.category);\n\n // Create ONLY in epistemicNodes (no questions table!)\n const nodeId = await ctx.db.insert(\"epistemicNodes\", {\n globalId,\n topicId: scope.topicId,\n projectId: scope.projectId,\n tenantId: scope.tenantId,\n workspaceId: scope.workspaceId,\n nodeType: \"question\",\n canonicalText: args.question,\n contentHash,\n status: \"active\",\n epistemicLayer: \"L3\", // L3: Traversal Anchors (Questions)\n sourceType: args.source === \"user\" ? \"human\" : \"ai_generated\",\n // Classification fields\n questionType: args.questionType ?? \"general\",\n questionPriority: args.questionPriority ?? \"medium\",\n answerQuality: \"unanswered\", // New questions start unanswered\n createdAt: now,\n updatedAt: now,\n createdBy: args.userId,\n metadata: {\n category,\n priority: args.priority || \"medium\",\n source: args.source || \"ai_suggested\",\n questionStatus: \"open\",\n linkedBeliefNodeId: args.linkedBeliefNodeId,\n ...buildLinkedWorktreeMetadata(\n args.linkedWorktreeId\n ),\n testType: args.testType,\n importance: args.importance,\n epistemicUnlock: args.epistemicUnlock,\n // Track source questions for key question derivation\n prerequisiteQuestions: args.sourceQuestionIds,\n },\n });\n\n // Schedule Neo4j sync for the new node.\n await ctx.scheduler.runAfter(0, internal.neo4jSync.syncNodeToNeo4j, {\n nodeId,\n operation: \"upsert\",\n });\n\n // Schedule embedding generation\n await scheduleEmbeddingGeneration({\n ctx, nodeId, projectId: scope.projectId, topicId: scope.topicId,\n createdBy: args.userId, nodeType: \"question\", text: args.question,\n });\n\n // NOTE: We no longer create prerequisite_for edges between questions.\n // Raw questions are excluded from the graph once key questions exist,\n // so the edges create unnecessary noise without providing value.\n // The sourceQuestionIds are still tracked in metadata for reference only.\n\n // If linked to a belief, create tests edge through Neo4j authority path.\n if (args.linkedBeliefNodeId) {\n const beliefNode = await ctx.db.get(args.linkedBeliefNodeId);\n if (beliefNode?.globalId) {\n await ctx.scheduler.runAfter(100, internal.neo4jSync.syncNodeToNeo4j, {\n nodeId: args.linkedBeliefNodeId,\n operation: \"upsert\",\n });\n\n const edgeGlobalId = buildTestsEdgeGlobalId(\n beliefNode.globalId,\n globalId\n );\n await ctx.scheduler.runAfter(250, internal.neo4jEdgeAPI.createEdge, {\n globalId: edgeGlobalId,\n fromGlobalId: beliefNode.globalId,\n toGlobalId: globalId,\n edgeType: \"tests\",\n weight: 1.0,\n context: args.testType || \"tests\",\n createdBy: args.userId,\n topicId: scope.projectId ? String(scope.projectId) : undefined,\n fromNodeType: \"belief\",\n toNodeType: \"question\",\n fromLayer: \"L3\",\n toLayer: \"L3\",\n });\n }\n }\n\n // Log to audit\n await ctx.db.insert(\"epistemicAudit\", {\n entityType: \"question\",\n entityId: nodeId,\n changeType: \"created\",\n changedAt: now,\n changedBy: args.userId,\n isAgent: false,\n projectId: scope.projectId,\n newState: {\n question: args.question,\n category,\n priority: args.priority || \"medium\",\n },\n });\n\n // Schedule embedding generation for semantic search.\n // topicId alone is sufficient for Lucern deployments (no projects table).\n if (scope.projectId || scope.topicId) {\n await ctx.scheduler.runAfter(\n 0,\n \"embeddingActions:generateEpistemicNodeEmbedding\" as any,\n {\n nodeId,\n projectId: scope.projectId,\n topicId: scope.topicId ? String(scope.topicId) : undefined,\n createdBy: args.userId,\n nodeType: \"question\" as const,\n text: args.question,\n hasAnswer: false,\n }\n );\n }\n\n // ==========================================================================\n // ONTOLOGY: Schedule question classification for entity extraction\n // ==========================================================================\n if (scope.projectId || scope.topicId) {\n await ctx.scheduler.runAfter(\n 2000, // 2 second delay\n internal.nodeClassification.scheduleClassification,\n {\n nodeId,\n nodeType: \"question\",\n projectId: scope.projectId,\n topicId: normalizeQuestionTopicId(scope.topicId),\n }\n );\n }\n\n await markProjectGraphDirty(\n ctx,\n scope.projectId,\n normalizeQuestionTopicId(scope.topicId)\n );\n\n return { nodeId };\n },\n});\n\n/**\n * Create multiple questions in batch (for efficiency)\n */\nexport const createBatch = mutation({\n args: {\n ...optionalScopeArgs,\n questions: v.array(\n v.object({\n question: v.string(),\n category: v.optional(v.string()),\n priority: v.optional(\n v.union(v.literal(\"high\"), v.literal(\"medium\"), v.literal(\"low\"))\n ),\n linkedBeliefNodeId: v.optional(v.id(\"epistemicNodes\")),\n testType: v.optional(\n v.union(\n v.literal(\"validates\"),\n v.literal(\"invalidates\"),\n v.literal(\"clarifies\")\n )\n ),\n })\n ),\n source: v.optional(v.string()),\n userId: v.string(),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const scope = await resolveTopicProjectScope(ctx, {\n topicId: args.topicId,\n projectId: args.projectId,\n });\n const scopeId = resolveQuestionScopeId(scope);\n if (!scopeId) {\n throw new Error(\"No scope identifier provided\");\n }\n const hasAccess = await checkScopeAccess(ctx, scopeId, args.userId);\n if (!hasAccess) {\n throw new Error(\"Access denied\");\n }\n\n const now = Date.now();\n const nodeIds: Id<\"epistemicNodes\">[] = [];\n\n for (const q of args.questions) {\n const globalId = generateGlobalId();\n const contentHash = generateContentHash(q.question);\n const category = normalizeCategory(q.category);\n\n const nodeId = await ctx.db.insert(\"epistemicNodes\", {\n globalId,\n topicId: scope.topicId,\n projectId: scope.projectId,\n tenantId: scope.tenantId,\n workspaceId: scope.workspaceId,\n nodeType: \"question\",\n canonicalText: q.question,\n contentHash,\n status: \"active\",\n epistemicLayer: \"L3\",\n sourceType: args.source === \"user\" ? \"human\" : \"ai_generated\",\n createdAt: now,\n updatedAt: now,\n createdBy: args.userId,\n metadata: {\n category,\n priority: q.priority || \"medium\",\n source: args.source || \"ai_suggested\",\n questionStatus: \"open\",\n linkedBeliefNodeId: q.linkedBeliefNodeId,\n testType: q.testType,\n },\n });\n\n nodeIds.push(nodeId);\n\n await ctx.db.insert(\"epistemicAudit\", {\n entityType: \"question\",\n entityId: String(nodeId),\n changeType: \"created\",\n changedAt: now,\n changedBy: args.userId,\n isAgent: false,\n projectId: scope.projectId,\n topicId: normalizeQuestionTopicId(scope.topicId),\n newState: {\n question: q.question,\n category,\n priority: q.priority || \"medium\",\n source: args.source || \"ai_suggested\",\n linkedBeliefNodeId: q.linkedBeliefNodeId,\n testType: q.testType,\n },\n triggeringAction: \"epistemicQuestions.createBatch\",\n });\n\n // Schedule Neo4j sync\n await ctx.scheduler.runAfter(0, internal.neo4jSync.syncNodeToNeo4j, {\n nodeId,\n operation: \"upsert\",\n });\n\n // Create edge if linked to belief (directly in Neo4j)\n if (q.linkedBeliefNodeId) {\n const beliefNode = await ctx.db.get(q.linkedBeliefNodeId);\n if (beliefNode) {\n await ctx.scheduler.runAfter(0, internal.neo4jEdgeAPI.createEdge, {\n globalId: crypto.randomUUID(),\n fromGlobalId: beliefNode.globalId,\n toGlobalId: globalId,\n edgeType: \"tests\",\n weight: 1.0,\n createdBy: args.userId,\n topicId: scope.projectId,\n fromNodeType: \"belief\",\n toNodeType: \"question\",\n fromLayer: \"L3\",\n toLayer: \"L3\",\n });\n }\n }\n }\n\n await markProjectGraphDirty(\n ctx,\n scope.projectId,\n normalizeQuestionTopicId(scope.topicId)\n );\n\n return { nodeIds, count: nodeIds.length };\n },\n});\n\n// =============================================================================\n// UPDATE\n// =============================================================================\n\n/**\n * Update a question's status (open, researching, answered, etc.)\n */\nexport const updateStatus = mutation({\n args: {\n nodeId: v.optional(v.id(\"epistemicNodes\")),\n // Backward compatibility for older callers still sending questionId.\n questionId: v.optional(v.union(v.id(\"epistemicNodes\"), v.string())),\n status: v.union(\n v.literal(\"open\"),\n v.literal(\"researching\"),\n v.literal(\"answered\"),\n v.literal(\"parked\"),\n v.literal(\"closed\")\n ),\n userId: v.optional(v.string()),\n answer: v.optional(v.string()),\n answerStatus: v.optional(\n v.union(\n v.literal(\"ai_draft\"),\n v.literal(\"user_draft\"),\n v.literal(\"final\")\n )\n ),\n runtimeToolName: v.optional(v.string()),\n runtimePackKey: v.optional(v.string()),\n runtimePackInstallScope: v.optional(\n v.union(v.literal(\"tenant\"), v.literal(\"workspace\"))\n ),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const resolvedNodeId = (args.nodeId ?? args.questionId) as\n | Id<\"epistemicNodes\">\n | undefined;\n if (!resolvedNodeId) {\n throw new Error(\"Missing nodeId/questionId\");\n }\n const resolvedUserId = args.userId || (await getCurrentUserId(ctx));\n if (!resolvedUserId) {\n throw new Error(\"Not authenticated\");\n }\n\n const node = await ctx.db.get(resolvedNodeId);\n if (!node || node.nodeType !== \"question\") {\n throw new Error(\"Question not found\");\n }\n assertTenantPackWorkspaceMutationAllowed({\n runtime: resolveRuntimePackMutationContext(args),\n target: await resolveNodeScopeForWorkspaceIsolation(ctx, node),\n mutationName: \"epistemicQuestions.updateStatus\",\n });\n\n const now = Date.now();\n const metadata = (node.metadata || {}) as Record<string, unknown>;\n const previousStatus = metadata.questionStatus || \"open\";\n\n await ctx.db.patch(resolvedNodeId, {\n updatedAt: now,\n metadata: {\n ...metadata,\n questionStatus: args.status,\n answer: args.answer || metadata.answer,\n answerStatus: args.answerStatus || metadata.answerStatus,\n answeredAt: args.status === \"answered\" ? now : metadata.answeredAt,\n answeredBy:\n args.status === \"answered\" ? resolvedUserId : metadata.answeredBy,\n },\n });\n\n // If answered with answer text, schedule answer node creation\n if (args.status === \"answered\" && args.answer) {\n await ctx.scheduler.runAfter(\n 0,\n internal.epistemicAnswers.createInternal,\n {\n projectId: node.projectId,\n topicId: normalizeQuestionTopicId(node.topicId),\n questionNodeId: resolvedNodeId,\n answerText: args.answer,\n answerSource: \"human\",\n userId: resolvedUserId,\n }\n );\n }\n\n // Log to audit\n await ctx.db.insert(\"epistemicAudit\", {\n entityType: \"question\",\n entityId: resolvedNodeId,\n changeType: \"status_changed\",\n changedAt: now,\n changedBy: resolvedUserId,\n isAgent: false,\n projectId: node.projectId,\n previousState: { status: previousStatus },\n newState: { status: args.status },\n });\n\n // Sync to Neo4j\n await ctx.scheduler.runAfter(0, internal.neo4jSync.syncNodeToNeo4j, {\n nodeId: resolvedNodeId,\n operation: \"upsert\",\n });\n\n await markProjectGraphDirty(ctx, node.projectId, node.topicId);\n\n return { nodeId: resolvedNodeId, previousStatus, newStatus: args.status };\n },\n});\n\n/**\n * Update question priority\n *\n * Note: Convex mutations are serialized per-document, so concurrent updates\n * to the same question will be processed sequentially, not in parallel.\n */\nexport const updatePriority = mutation({\n args: {\n nodeId: v.id(\"epistemicNodes\"),\n priority: v.union(v.literal(\"high\"), v.literal(\"medium\"), v.literal(\"low\")),\n userId: v.string(),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const node = await ctx.db.get(args.nodeId);\n if (!node || node.nodeType !== \"question\") {\n throw new Error(\"Question not found\");\n }\n\n const now = Date.now();\n const metadata = (node.metadata || {}) as Record<string, unknown>;\n const previousPriority = metadata.priority || \"medium\";\n\n await ctx.db.patch(args.nodeId, {\n updatedAt: now,\n metadata: {\n ...metadata,\n priority: args.priority,\n },\n });\n\n // Log to audit (was missing)\n await ctx.db.insert(\"epistemicAudit\", {\n entityType: \"question\",\n entityId: args.nodeId,\n changeType: \"priority_changed\" as any,\n changedAt: now,\n changedBy: args.userId,\n isAgent: false,\n projectId: node.projectId,\n previousState: { priority: previousPriority },\n newState: { priority: args.priority },\n });\n\n await markProjectGraphDirty(ctx, node.projectId, node.topicId);\n\n return { nodeId: args.nodeId };\n },\n});\n\n// =============================================================================\n// QUERIES\n// =============================================================================\n\n/**\n * Get a question by ID\n */\nexport const getById = query({\n args: {\n nodeId: v.optional(v.id(\"epistemicNodes\")),\n questionId: v.optional(v.string()),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const id = args.nodeId ?? (args.questionId as any);\n if (!id) {\n return null;\n }\n const node = (await ctx.db.get(\n id as Id<\"epistemicNodes\">\n )) as QuestionNodeDoc | null;\n if (!node || node.nodeType !== \"question\") {\n return null;\n }\n return flattenQuestionNode(node);\n },\n});\n\n/**\n * Get all questions for a project\n */\nexport const getByProject = query({\n args: {\n ...optionalScopeArgs,\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) => {\n const scope = await resolveQuestionScopeOrNull(ctx, args);\n if (!scope) {\n return [];\n }\n\n const pageSize = clampQuestionLimit(args.limit);\n const scanLimit = Math.min(pageSize * 3, MAX_QUESTION_PAGE_SIZE);\n\n if (args.userId) {\n const scopeId = resolveQuestionScopeId(scope);\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 workspaceScopedNodes = await getQuestionNodesForScope(ctx, scope, {\n scanLimit,\n });\n\n const scopedNodes = args.status\n ? workspaceScopedNodes.filter((node) =>\n matchesRequestedQuestionStatus(node, args.status!)\n )\n : workspaceScopedNodes.filter(isActiveQuestionNode);\n\n return scopedNodes.map(flattenQuestionNode).slice(0, pageSize);\n },\n});\n\n/**\n * Get all questions for a topic.\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) => {\n const pageSize = clampQuestionLimit(args.limit);\n const scanLimit = Math.min(pageSize * 3, MAX_QUESTION_PAGE_SIZE);\n const scope = await resolveTopicProjectScope(ctx, { topicId: args.topicId });\n const scopedNodes = await getQuestionNodesForScope(ctx, scope, {\n scanLimit,\n });\n\n const filteredNodes = args.status\n ? scopedNodes.filter((node) =>\n matchesRequestedQuestionStatus(node, args.status!)\n )\n : scopedNodes.filter(isActiveQuestionNode);\n\n return filteredNodes.map(flattenQuestionNode).slice(0, pageSize);\n },\n});\n\n/**\n * Get questions by category/pillar\n */\nexport const getByCategory = query({\n args: {\n ...optionalScopeArgs,\n category: v.string(),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const scope = await resolveQuestionScopeOrNull(ctx, args);\n if (!scope) {\n return [];\n }\n\n const nodes = await getQuestionNodesForScope(ctx, scope);\n\n return nodes.filter((n) => {\n const metadata = (n.metadata || {}) as Record<string, unknown>;\n return questionMatchesScope(n, scope) && (\n isActiveQuestionNode(n) &&\n metadata.category === normalizeCategory(args.category)\n );\n });\n },\n});\n\n/**\n * Get questions linked to a specific belief\n */\nexport const getForBelief = query({\n args: {\n beliefNodeId: v.id(\"epistemicNodes\"),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n // Find edges from the belief to questions\n const edges = await ctx.db\n .query(\"epistemicEdges\")\n .withIndex(\"by_from_type\", (q) =>\n q.eq(\"fromNodeId\", args.beliefNodeId).eq(\"edgeType\", \"tests\")\n )\n .collect();\n\n // Get the question nodes\n const questionNodeIds = edges\n .map((e) => e.toNodeId)\n .filter(Boolean) as Id<\"epistemicNodes\">[];\n const questions = await Promise.all(\n questionNodeIds.map((id) => ctx.db.get(id))\n );\n\n return questions.filter(\n (q) =>\n q !== null &&\n (q as any).nodeType === \"question\" &&\n isActiveQuestionNode(q as QuestionNodeDoc)\n );\n },\n});\n\n// =============================================================================\n// INTERNAL QUERIES (for other Convex modules)\n// =============================================================================\n\n/**\n * Internal query to get questions for a project\n */\nexport const internalGetByProject = internalQuery({\n args: {\n ...optionalScopeArgs,\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) => {\n const pageSize = clampQuestionLimit(args.limit, 500);\n const scanLimit = Math.min(pageSize * 3, MAX_QUESTION_PAGE_SIZE);\n const audienceMode = args.audienceMode ?? \"internal\";\n const scope = await resolveTopicProjectScope(ctx, {\n projectId: args.projectId,\n topicId: args.topicId,\n });\n const projectScopeId = resolveQuestionScopeId(scope);\n if (!projectScopeId) {\n return [];\n }\n const project = await resolveGraphPrimitivesAppResolvers(ctx).getProject(\n ctx,\n projectScopeId\n );\n const registryRows = await listAudienceRegistryRows(ctx, {\n tenantId: project?.tenantId,\n workspaceId: project?.workspaceId,\n });\n const audienceClassByKey = new Map(\n registryRows.map((row) => [\n normalizeAudienceKey(row.audienceKey),\n row.audienceClass,\n ])\n );\n const resolveAudienceClass = (\n audienceKey: string | undefined | null,\n fallback: \"public\" | \"internal\"\n ) => {\n const key = normalizeAudienceKey(audienceKey);\n if (!key) {\n return fallback;\n }\n return audienceClassByKey.get(key) ?? classFromAudienceKey(key, fallback);\n };\n const viewerClass = resolveAudienceClass(audienceMode, \"public\");\n\n const nodes = await getQuestionNodesForScope(ctx, scope, { scanLimit });\n const workspaceScopedNodes = nodes.filter((node) =>\n nodeMatchesWorkspaceReasoningScope(node, {\n tenantId: project?.tenantId,\n workspaceId: project?.workspaceId,\n })\n );\n\n const visibleNodes = workspaceScopedNodes.filter((node) =>\n canAudienceClassAccess(\n viewerClass,\n resolveAudienceClass(node.audienceLabel, \"internal\")\n )\n );\n\n const scopedNodes = args.status\n ? visibleNodes.filter((node) =>\n matchesRequestedQuestionStatus(node, args.status!)\n )\n : visibleNodes.filter(isActiveQuestionNode);\n\n // Map to flattened format for internal callers\n return scopedNodes.slice(0, pageSize).map(flattenInternalQuestionNode);\n },\n});\n\n/**\n * Internal query to get questions for a topic.\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) => {\n const pageSize = clampQuestionLimit(args.limit, 500);\n const scanLimit = Math.min(pageSize * 3, MAX_QUESTION_PAGE_SIZE);\n const audienceMode = args.audienceMode ?? \"internal\";\n const scope = await resolveTopicProjectScope(ctx, { topicId: args.topicId });\n const registryRows = await listAudienceRegistryRows(ctx, {\n tenantId: scope.tenantId,\n workspaceId: scope.workspaceId,\n });\n const audienceClassByKey = new Map(\n registryRows.map((row) => [\n normalizeAudienceKey(row.audienceKey),\n row.audienceClass,\n ])\n );\n const resolveAudienceClass = (\n audienceKey: string | undefined | null,\n fallback: \"public\" | \"internal\"\n ) => {\n const key = normalizeAudienceKey(audienceKey);\n if (!key) {\n return fallback;\n }\n return audienceClassByKey.get(key) ?? classFromAudienceKey(key, fallback);\n };\n const viewerClass = resolveAudienceClass(audienceMode, \"public\");\n\n const nodes = await getQuestionNodesForScope(ctx, scope, { scanLimit });\n const workspaceScopedNodes = nodes.filter((node) =>\n nodeMatchesWorkspaceReasoningScope(node, {\n tenantId: scope.tenantId,\n workspaceId: scope.workspaceId,\n })\n );\n\n const visibleNodes = workspaceScopedNodes.filter((node) =>\n canAudienceClassAccess(\n viewerClass,\n resolveAudienceClass(node.audienceLabel, \"internal\")\n )\n );\n\n const scopedNodes = args.status\n ? visibleNodes.filter((node) =>\n matchesRequestedQuestionStatus(node, args.status!)\n )\n : visibleNodes.filter(isActiveQuestionNode);\n\n return scopedNodes.slice(0, pageSize).map(flattenInternalQuestionNode);\n },\n});\n\n/**\n * Internal mutation to create a question (for other Convex modules)\n */\nexport const internalCreate = internalMutation({\n args: {\n ...optionalScopeArgs,\n question: v.string(),\n category: v.optional(v.string()),\n priority: v.optional(v.string()),\n source: v.optional(v.string()),\n userId: v.string(),\n linkedBeliefNodeId: v.optional(v.id(\"epistemicNodes\")),\n testType: v.optional(v.string()),\n runtimeToolName: v.optional(v.string()),\n runtimePackKey: v.optional(v.string()),\n runtimePackInstallScope: v.optional(\n v.union(v.literal(\"tenant\"), v.literal(\"workspace\"))\n ),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const now = Date.now();\n const scope = await resolveTopicProjectScope(ctx, {\n topicId: args.topicId,\n projectId: args.projectId,\n });\n assertWorkspaceScopedEpistemicNodeScope({\n scope,\n nodeType: \"question\",\n mutationName: \"epistemicQuestions.internalCreate\",\n });\n assertTenantPackWorkspaceMutationAllowed({\n runtime: resolveRuntimePackMutationContext(args),\n target: {\n tenantId: scope.tenantId,\n workspaceId: scope.workspaceId,\n nodeType: \"question\",\n epistemicLayer: \"L3\",\n },\n mutationName: \"epistemicQuestions.internalCreate\",\n });\n const globalId = generateGlobalId();\n const contentHash = generateContentHash(args.question);\n const category = normalizeCategory(args.category);\n\n const nodeId = await ctx.db.insert(\"epistemicNodes\", {\n globalId,\n topicId: scope.topicId,\n projectId: scope.projectId,\n tenantId: scope.tenantId,\n workspaceId: scope.workspaceId,\n nodeType: \"question\",\n canonicalText: args.question,\n contentHash,\n status: \"active\",\n epistemicLayer: \"L3\",\n sourceType: args.source === \"user\" ? \"human\" : \"ai_generated\",\n createdAt: now,\n updatedAt: now,\n createdBy: args.userId,\n metadata: {\n category,\n priority: args.priority || \"medium\",\n source: args.source || \"ai_suggested\",\n questionStatus: \"open\",\n linkedBeliefNodeId: args.linkedBeliefNodeId,\n testType: args.testType,\n },\n });\n\n // Schedule Neo4j sync\n await ctx.scheduler.runAfter(0, internal.neo4jSync.syncNodeToNeo4j, {\n nodeId,\n operation: \"upsert\",\n });\n\n // Create edge if linked to belief (directly in Neo4j)\n if (args.linkedBeliefNodeId) {\n const beliefNode = await ctx.db.get(args.linkedBeliefNodeId);\n if (beliefNode) {\n await ctx.scheduler.runAfter(0, internal.neo4jEdgeAPI.createEdge, {\n globalId: crypto.randomUUID(),\n fromGlobalId: beliefNode.globalId,\n toGlobalId: globalId,\n edgeType: \"tests\",\n weight: 1.0,\n createdBy: args.userId,\n topicId: scope.projectId ? String(scope.projectId) : undefined,\n fromNodeType: \"belief\",\n toNodeType: \"question\",\n fromLayer: \"L3\",\n toLayer: \"L3\",\n });\n }\n }\n\n // Schedule embedding generation for semantic search.\n // topicId alone is sufficient for Lucern deployments (no projects table).\n if (scope.projectId || scope.topicId) {\n await ctx.scheduler.runAfter(\n 0,\n \"embeddingActions:generateEpistemicNodeEmbedding\" as any,\n {\n nodeId,\n projectId: scope.projectId,\n topicId: scope.topicId ? String(scope.topicId) : undefined,\n createdBy: args.userId,\n nodeType: \"question\" as const,\n text: args.question,\n hasAnswer: false,\n }\n );\n }\n\n await markProjectGraphDirty(\n ctx,\n scope.projectId,\n normalizeQuestionTopicId(scope.topicId)\n );\n\n return { nodeId };\n },\n});\n\n// =============================================================================\n// MUTATIONS\n// =============================================================================\n\n/**\n * Add a question to the epistemic graph\n */\nexport const addQuestion = mutation({\n args: {\n ...optionalScopeArgs,\n question: v.string(),\n category: v.optional(v.string()),\n priority: v.optional(v.string()),\n source: v.optional(v.string()),\n userId: v.string(),\n beliefId: v.optional(v.string()),\n chatId: v.optional(v.string()),\n importance: v.optional(v.number()),\n epistemicUnlock: v.optional(v.string()),\n metadata: v.optional(v.any()),\n questionType: v.optional(v.string()),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const scope = await resolveTopicProjectScope(ctx, {\n topicId: args.topicId,\n projectId: args.projectId,\n });\n const scopeId = resolveQuestionScopeId(scope);\n if (!scopeId) {\n throw new Error(\"No scope identifier provided\");\n }\n const hasAccess = await checkScopeAccess(ctx, scopeId, args.userId);\n if (!hasAccess) {\n throw new Error(\"Access denied\");\n }\n\n const now = Date.now();\n const globalId = generateGlobalId();\n const contentHash = generateContentHash(args.question);\n const category = normalizeCategory(args.category);\n const additionalMetadata =\n args.metadata && typeof args.metadata === \"object\"\n ? (args.metadata as Record<string, unknown>)\n : {};\n\n // Create in epistemicNodes\n const nodeId = await ctx.db.insert(\"epistemicNodes\", {\n globalId,\n topicId: scope.topicId,\n projectId: scope.projectId,\n tenantId: scope.tenantId,\n workspaceId: scope.workspaceId,\n nodeType: \"question\",\n canonicalText: args.question,\n contentHash,\n status: \"active\",\n epistemicLayer: \"L3\",\n sourceType: args.source === \"user\" ? \"human\" : \"ai_generated\",\n createdAt: now,\n updatedAt: now,\n createdBy: args.userId,\n metadata: {\n ...additionalMetadata,\n category,\n priority: args.priority || \"medium\",\n source: args.source || \"ai_suggested\",\n questionStatus: \"open\",\n beliefId: args.beliefId,\n linkedBeliefId: args.beliefId,\n chatId: args.chatId,\n importance: args.importance,\n epistemicUnlock: args.epistemicUnlock,\n },\n });\n\n await ctx.db.insert(\"epistemicAudit\", {\n entityType: \"question\",\n entityId: String(nodeId),\n changeType: \"created\",\n changedAt: now,\n changedBy: args.userId,\n isAgent: false,\n projectId: scope.projectId,\n topicId: normalizeQuestionTopicId(scope.topicId),\n newState: {\n ...additionalMetadata,\n question: args.question,\n category,\n priority: args.priority || \"medium\",\n source: args.source || \"ai_suggested\",\n beliefId: args.beliefId,\n chatId: args.chatId,\n importance: args.importance,\n epistemicUnlock: args.epistemicUnlock,\n },\n triggeringAction: \"epistemicQuestions.addQuestion\",\n });\n\n // Sync to Neo4j\n await ctx.scheduler.runAfter(0, internal.neo4jSync.syncNodeToNeo4j, {\n nodeId,\n operation: \"upsert\",\n });\n\n // Generate embedding\n await ctx.scheduler.runAfter(\n 0,\n \"embeddingActions:generateEpistemicNodeEmbedding\" as any,\n {\n nodeId,\n projectId: scope.projectId,\n topicId: normalizeQuestionTopicId(scope.topicId),\n createdBy: args.userId,\n nodeType: \"question\" as const,\n text: args.question,\n hasAnswer: false,\n }\n );\n\n await markProjectGraphDirty(\n ctx,\n scope.projectId,\n normalizeQuestionTopicId(scope.topicId)\n );\n\n return nodeId;\n },\n});\n\n// =============================================================================\n// EVIDENCE CREATION FROM SCORED QUESTIONS\n// =============================================================================\n\n/**\n * Create an L2 evidence node from a scored question's answer and link it to\n * the tested belief(s) via INFORMS edges. This bridges the sprint question\n * workflow to the evidence graph so computeSprintConviction can score beliefs.\n *\n * Called as a side-effect when a question is finalized with conviction scoring.\n */\nexport const createEvidenceFromScoredQuestion = internalMutation({\n args: {\n questionNodeId: v.id(\"epistemicNodes\"),\n questionText: v.string(),\n answerText: v.string(),\n beliefId: v.string(),\n relatedBeliefIds: v.array(v.string()),\n conviction: v.number(),\n rationale: v.string(),\n ...optionalScopeArgs,\n userId: v.string(),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const now = Date.now();\n\n // Check if evidence was already created for this question (idempotent)\n const questionNode = await ctx.db.get(args.questionNodeId);\n if (!questionNode) {\n return;\n }\n const qMeta = (questionNode.metadata || {}) as Record<string, unknown>;\n if (qMeta.evidenceNodeId) {\n return; // Already created\n }\n\n // Build evidence text from Q&A\n const evidenceText = `Q: ${args.questionText}\\n\\nA: ${args.answerText}`;\n const globalId = generateGlobalId();\n const contentHash = `evidence:${args.questionNodeId}:scored`;\n\n // Create L2 evidence node\n const evidenceNodeId = await ctx.db.insert(\"epistemicNodes\", {\n globalId,\n projectId: args.projectId,\n topicId: normalizeQuestionTopicId(args.topicId),\n nodeType: \"evidence\",\n canonicalText: evidenceText,\n contentHash,\n status: \"active\",\n epistemicLayer: \"L2\",\n sourceType: \"verified\", // Human-scored sprint answer\n createdAt: now,\n updatedAt: now,\n createdBy: args.userId,\n metadata: {\n kind: \"observation\",\n sourceQuestionId: args.questionNodeId,\n sprintConviction: args.conviction,\n rationale: args.rationale,\n origin: \"sprint_question_scoring\",\n },\n });\n\n // Mark the question with the evidence node ID (for idempotency)\n await ctx.db.patch(args.questionNodeId, {\n metadata: {\n ...qMeta,\n evidenceNodeId,\n },\n updatedAt: now,\n });\n\n // Schedule Neo4j sync for the evidence node\n await ctx.scheduler.runAfter(0, internal.neo4jSync.syncNodeToNeo4j, {\n nodeId: evidenceNodeId,\n operation: \"upsert\",\n });\n\n // Collect all belief IDs to link (primary + related)\n const allBeliefIds = new Set<string>();\n allBeliefIds.add(args.beliefId);\n for (const id of args.relatedBeliefIds) {\n allBeliefIds.add(id);\n }\n\n // Create INFORMS edges: Evidence → Belief(s)\n // Weight based on conviction: high conviction (>0.7) = supports, low (<0.3) = contradicts\n const weight =\n args.conviction >= 0.5 ? args.conviction : -(1 - args.conviction);\n\n // Helper: resolve belief ID to a canonical epistemic belief node.\n async function resolveBeliefNode(bId: string) {\n try {\n const node = await ctx.db.get(bId as Id<\"epistemicNodes\">);\n if (node?.nodeType === \"belief\") {\n return node;\n }\n } catch {\n return null;\n }\n return null;\n }\n\n for (const bId of allBeliefIds) {\n const beliefNode = await resolveBeliefNode(bId);\n if (!beliefNode) {\n continue;\n }\n\n const edgeGlobalId = generateGlobalId();\n await ctx.scheduler.runAfter(0, internal.neo4jEdgeAPI.createEdge, {\n globalId: edgeGlobalId,\n fromGlobalId: globalId,\n toGlobalId: beliefNode.globalId,\n edgeType: \"informs\",\n weight,\n confidence: Math.abs(weight),\n context: `origin=sprint_question_scoring | relation=${weight >= 0 ? \"supports\" : \"contradicts\"} | sourceQuestionId=${String(args.questionNodeId)}`,\n createdBy: args.userId,\n topicId: args.projectId ? String(args.projectId) : undefined,\n fromNodeType: \"evidence\",\n toNodeType: \"belief\",\n fromLayer: \"L2\",\n toLayer: \"L3\",\n });\n }\n\n // Create DERIVED_FROM edge: Evidence → Question (answer is derived from question — provenance)\n const answersEdgeGlobalId = generateGlobalId();\n await ctx.scheduler.runAfter(0, internal.neo4jEdgeAPI.createEdge, {\n globalId: answersEdgeGlobalId,\n fromGlobalId: globalId,\n toGlobalId: questionNode.globalId,\n edgeType: \"derived_from\",\n weight: 1.0,\n confidence: 1.0,\n context: `origin=sprint_question_scoring | sourceQuestionId=${String(args.questionNodeId)}`,\n createdBy: args.userId,\n topicId: args.projectId ? String(args.projectId) : undefined,\n fromNodeType: \"evidence\",\n toNodeType: \"question\",\n fromLayer: \"L2\",\n toLayer: \"L3\",\n });\n\n // Audit log\n await ctx.db.insert(\"epistemicAudit\", {\n entityType: \"evidence\",\n entityId: evidenceNodeId,\n changeType: \"created\",\n changedAt: now,\n changedBy: args.userId,\n isAgent: false,\n projectId: args.projectId,\n topicId: normalizeQuestionTopicId(args.topicId),\n newState: {\n text: evidenceText.slice(0, 200),\n kind: \"observation\",\n sourceType: \"verified\",\n origin: \"sprint_question_scoring\",\n linkedBeliefIds: [...allBeliefIds],\n },\n });\n\n await markProjectGraphDirty(\n ctx,\n args.projectId,\n normalizeQuestionTopicId(args.topicId)\n );\n\n return { evidenceNodeId };\n },\n});\n\n/**\n * Backfill: Create evidence nodes + INFORMS edges for all scored questions\n * that are missing them. Run once to fix existing sprint data.\n */\nexport const backfillScoredQuestionEvidence = internalMutation({\n args: {\n ...optionalScopeArgs,\n userId: v.string(),\n dryRun: v.optional(v.boolean()),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const dryRun = args.dryRun ?? false;\n const scope = await resolveQuestionScopeOrNull(ctx, args);\n if (!scope) {\n return {\n dryRun,\n totalQuestions: 0,\n candidateCount: 0,\n scheduled: 0,\n skipped: 0,\n candidates: [],\n };\n }\n\n const allQuestions = await getQuestionNodesForScope(ctx, scope);\n\n // Filter to scored questions with answers that don't yet have evidence\n const candidates = allQuestions.filter((n) => {\n const meta = (n.metadata || {}) as Record<string, unknown>;\n return (\n meta.convictionStage === \"scored\" &&\n meta.answer &&\n !meta.evidenceNodeId &&\n (meta.linkedBeliefId || meta.beliefId)\n );\n });\n\n if (dryRun) {\n return {\n dryRun: true,\n candidateCount: candidates.length,\n candidates: candidates.map((n) => {\n const meta = (n.metadata || {}) as Record<string, unknown>;\n return {\n questionId: n._id,\n questionText: n.canonicalText?.slice(0, 80),\n beliefId: meta.linkedBeliefId || meta.beliefId,\n conviction: meta.conviction,\n hasAnswer: !!meta.answer,\n };\n }),\n };\n }\n\n let created = 0;\n let skipped = 0;\n\n for (const questionNode of candidates) {\n const meta = (questionNode.metadata || {}) as Record<string, unknown>;\n const beliefId =\n (meta.linkedBeliefId as string) ?? (meta.beliefId as string);\n const answerText = meta.answer as string;\n const conviction = (meta.conviction as number) ?? 0.5;\n\n if (!beliefId || !answerText) {\n skipped++;\n continue;\n }\n\n await ctx.scheduler.runAfter(\n created * 100, // Stagger to avoid overwhelming Neo4j\n internal.epistemicQuestions.createEvidenceFromScoredQuestion,\n {\n questionNodeId: questionNode._id,\n questionText: questionNode.canonicalText || \"\",\n answerText,\n beliefId,\n relatedBeliefIds: (meta.relatedBeliefIds as string[]) || [],\n conviction,\n rationale: (meta.convictionRationale as string) || \"\",\n projectId: scope.projectId,\n topicId: normalizeQuestionTopicId(scope.topicId),\n userId: args.userId,\n }\n );\n created++;\n }\n\n if (created > 0) {\n await markProjectGraphDirty(\n ctx,\n scope.projectId,\n normalizeQuestionTopicId(scope.topicId)\n );\n }\n\n return {\n dryRun: false,\n totalQuestions: allQuestions.length,\n candidateCount: candidates.length,\n scheduled: created,\n skipped,\n };\n },\n});\n\n// =============================================================================\n// SPRINT CLUSTER QUERIES\n// =============================================================================\n\n/**\n * Get ALL questions for a sprint cluster, with linked belief details.\n * This is the main query for the Questions phase UI.\n *\n * CLUSTER = Hypotheses + Conditionals ONLY (no raw beliefs!)\n */\nexport const getForSprintCluster = query({\n args: {\n sprintId: v.optional(v.string()),\n worktreeId: v.optional(v.string()),\n userId: v.string(),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const docId = args.sprintId || args.worktreeId;\n if (!docId) return [];\n const workflow = await resolveWorkflowBridgeDoc(ctx, docId);\n const scopeDoc = workflow.worktree ?? workflow.sprint;\n if (!scopeDoc) {\n return [];\n }\n const scope = await resolveQuestionScopeOrNull(ctx, {\n projectId: workflow.projectId,\n topicId: workflow.topicId,\n });\n const scopeId = scope ? resolveQuestionScopeId(scope) : undefined;\n if (!scope || !scopeId) {\n return [];\n }\n\n const hasAccess = await checkScopeAccess(ctx, scopeId, args.userId);\n if (!hasAccess) {\n return [];\n }\n\n // Get hypothesis and raw belief IDs from sprint synthesis state\n const synthesisState = scopeDoc.synthesisState as\n | Record<string, unknown>\n | undefined;\n const hypothesisIds = new Set(\n ((synthesisState?.synthesizedBeliefIds as string[]) || []).map(\n (id: unknown) => String(id)\n )\n );\n const rawBeliefIds = new Set(\n ((synthesisState?.originalBeliefIds as string[]) || []).map(\n (id: unknown) => String(id)\n )\n );\n\n // Cluster = hypotheses + conditionals (exclude raw beliefs)\n const clusterBeliefIds = new Set<string>(hypothesisIds);\n\n // Find conditionals via edges connected to hypotheses\n const edges = await getQuestionEdgesForScope(ctx, scope);\n\n for (const edge of edges) {\n const fromStr = String(edge.fromNodeId || \"\");\n const toStr = String(edge.toNodeId || \"\");\n\n if (hypothesisIds.has(fromStr) && !rawBeliefIds.has(toStr)) {\n clusterBeliefIds.add(toStr);\n }\n if (hypothesisIds.has(toStr) && !rawBeliefIds.has(fromStr)) {\n clusterBeliefIds.add(fromStr);\n }\n }\n\n // Get all question-type epistemicNodes in the project\n const questionNodes = await getQuestionNodesForScope(ctx, scope);\n\n // Include questions explicitly linked to the sprint via targetQuestionIds\n const sprintQuestionIds = new Set(\n (((workflow.worktree?.targetQuestionIds as unknown[]) ||\n (workflow.sprint?.targetQuestionIds as unknown[]) ||\n []) as unknown[]).map((id: unknown) => String(id))\n );\n\n // Filter to questions linked to cluster beliefs OR explicitly in sprint\n const clusterQuestions = questionNodes.filter((q) => {\n // Always include questions explicitly added to this sprint\n if (sprintQuestionIds.has(String(q._id))) {\n return true;\n }\n // Include questions linked to cluster beliefs via metadata\n const meta = (q.metadata || {}) as Record<string, unknown>;\n const linkedId = String(meta.linkedBeliefNodeId || \"\");\n if (linkedId && clusterBeliefIds.has(linkedId)) {\n return true;\n }\n // Also check edges connecting this question to cluster beliefs\n return edges.some(\n (e) =>\n (String(e.fromNodeId) === String(q._id) &&\n clusterBeliefIds.has(String(e.toNodeId || \"\"))) ||\n (String(e.toNodeId) === String(q._id) &&\n clusterBeliefIds.has(String(e.fromNodeId || \"\")))\n );\n });\n\n // Enrich with linked belief details\n const enrichedQuestions = await Promise.all(\n clusterQuestions.map(async (q) => {\n const meta = (q.metadata || {}) as Record<string, unknown>;\n\n // Collect all belief IDs this question is linked to\n const linkedBeliefNodeIds = new Set<string>();\n const primaryBeliefId = String(meta.linkedBeliefNodeId || \"\");\n if (primaryBeliefId) {\n linkedBeliefNodeIds.add(primaryBeliefId);\n }\n\n for (const edge of edges) {\n if (String(edge.fromNodeId) === String(q._id)) {\n linkedBeliefNodeIds.add(String(edge.toNodeId || \"\"));\n }\n if (String(edge.toNodeId) === String(q._id)) {\n linkedBeliefNodeIds.add(String(edge.fromNodeId || \"\"));\n }\n }\n // Remove empty strings\n linkedBeliefNodeIds.delete(\"\");\n\n // Fetch belief details\n const linkedBeliefs = (\n await Promise.all(\n Array.from(linkedBeliefNodeIds).map(async (nodeId) => {\n const node = await ctx.db.get(nodeId as Id<\"epistemicNodes\">);\n if (!node || node.nodeType !== \"belief\") {\n return null;\n }\n\n const isHypothesis = hypothesisIds.has(nodeId);\n const isRaw = rawBeliefIds.has(nodeId);\n const isConditional =\n !isHypothesis && !isRaw && clusterBeliefIds.has(nodeId);\n\n return {\n beliefId: node._id,\n beliefText: node.canonicalText || \"\",\n isHypothesis,\n isConditional,\n isRaw,\n isPrimaryTarget: isHypothesis,\n };\n })\n )\n ).filter(Boolean);\n\n return {\n _id: q._id,\n _creationTime: q._creationTime,\n projectId: q.projectId,\n topicId: q.topicId,\n canonicalText: q.canonicalText,\n question: q.canonicalText, // legacy field name\n questionType:\n q.questionType || (meta.questionType as string) || \"general\",\n priority: (meta.priority as string) || \"medium\",\n isKeyQuestion: (meta.isKeyQuestion as boolean) || false,\n testType: (meta.testType as string) || \"validates\",\n category: (meta.category as string) || \"other\",\n status: q.status,\n linkedBeliefs,\n testLogic: (meta.testType as string) || \"validates\",\n testRationale: (meta.rationale as string) || null,\n beliefId: meta.linkedBeliefNodeId || null,\n relatedBeliefIds: Array.from(linkedBeliefNodeIds),\n // Conviction stage fields — needed by UI to show/hide action buttons\n convictionStage: (meta.convictionStage as string) || null,\n answer: (meta.answer as string) || null,\n conviction: (meta.conviction as number) ?? null,\n linkedWorktreeId: resolveLinkedWorktreeId(meta),\n metadata: q.metadata,\n };\n })\n );\n\n // Dedupe by question ID\n const seen = new Set<string>();\n return enrichedQuestions.filter((q) => {\n if (seen.has(String(q._id))) {\n return false;\n }\n seen.add(String(q._id));\n return true;\n });\n },\n});\n\n// =============================================================================\n// PORTED FROM questions.ts — 15 functions migrated to epistemicNodes\n// =============================================================================\n\n/**\n * 1. getInConviction - Get questions in conviction stage for a sprint\n * Ported from questions.ts lines 1008-1157\n */\nexport const getInConviction = query({\n args: {\n sprintId: v.optional(v.string()),\n worktreeId: v.optional(v.string()),\n userId: v.string(),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const docId = args.sprintId || args.worktreeId;\n if (!docId) return [];\n const workflow = await resolveWorkflowBridgeDoc(ctx, docId);\n const scopeDoc = workflow.worktree ?? workflow.sprint;\n if (!scopeDoc) {\n return [];\n }\n const scope = await resolveQuestionScopeOrNull(ctx, {\n projectId: workflow.projectId,\n topicId: workflow.topicId,\n });\n const scopeId = scope ? resolveQuestionScopeId(scope) : undefined;\n if (!scope || !scopeId) {\n return [];\n }\n\n const hasAccess = await checkScopeAccess(ctx, scopeId, args.userId);\n if (!hasAccess) {\n return [];\n }\n\n const allQuestions = await getQuestionNodesForScope(ctx, scope);\n\n // Filter to questions in conviction stages\n const convictionQuestions = allQuestions.filter((q) => {\n const meta = (q.metadata || {}) as Record<string, unknown>;\n return (\n meta.convictionStage === \"in_conviction\" ||\n meta.convictionStage === \"scored\"\n );\n });\n\n // Get synthesized belief IDs from sprint\n const sprintBeliefIds = new Set([\n ...((scopeDoc.synthesisState as any)?.synthesizedBeliefIds || []).map(\n String\n ),\n ...(((workflow.worktree?.targetBeliefIds as unknown[]) ||\n (workflow.sprint?.targetBeliefIds as unknown[]) ||\n []) as unknown[]).map(String),\n ]);\n\n // Filter to questions relevant to this sprint\n const sprintQuestions = convictionQuestions.filter((q) => {\n const meta = (q.metadata || {}) as Record<string, unknown>;\n\n // Direct sprint link\n if (questionMatchesWorkflowLink(meta, workflow)) {\n return true;\n }\n\n // Linked to sprint beliefs via linkedBeliefNodeId\n if (\n meta.linkedBeliefNodeId &&\n sprintBeliefIds.has(String(meta.linkedBeliefNodeId))\n ) {\n return true;\n }\n if (\n meta.linkedBeliefId &&\n sprintBeliefIds.has(String(meta.linkedBeliefId))\n ) {\n return true;\n }\n if (meta.beliefId && sprintBeliefIds.has(String(meta.beliefId))) {\n return true;\n }\n\n // Linked via relatedBeliefIds\n const relatedIds = (meta.relatedBeliefIds as string[]) || [];\n if (relatedIds.some((id) => sprintBeliefIds.has(String(id)))) {\n return true;\n }\n\n return false;\n });\n\n // Enrich with evidence and belief details\n const questionsWithDetails = await Promise.all(\n sprintQuestions.map(async (q) => {\n const meta = (q.metadata || {}) as Record<string, unknown>;\n\n // Fetch evidence from questionEvidenceLinks\n const evidenceLinks = await ctx.db\n .query(\"questionEvidenceLinks\")\n .withIndex(\"by_questionId\", (qb) => qb.eq(\"questionId\", q._id as any))\n .collect();\n\n const evidenceWithDetails = await Promise.all(\n evidenceLinks.map(async (link) => {\n const insight = await ctx.db.get(link.insightId);\n const insightMeta =\n ((insight as any)?.metadata as\n | Record<string, unknown>\n | undefined) || {};\n const canonicalText = (insight as any)?.canonicalText;\n const legacyText = (insight as any)?.text;\n const contentText = (insight as any)?.content;\n const titleText = (insight as any)?.title;\n const snippetText = insightMeta.snippet;\n return {\n ...link,\n insightText:\n (typeof canonicalText === \"string\" && canonicalText.trim()) ||\n (typeof legacyText === \"string\" && legacyText.trim()) ||\n (typeof contentText === \"string\" && contentText.trim()) ||\n (typeof titleText === \"string\" && titleText.trim()) ||\n (typeof snippetText === \"string\" && snippetText.trim()) ||\n \"\",\n insightSource: insight?.sourceType || \"unknown\",\n };\n })\n );\n\n // Fetch beliefs this question tests\n const beliefIds: string[] = [];\n const relatedIds = (meta.relatedBeliefIds as string[]) || [];\n if (meta.linkedBeliefNodeId) {\n beliefIds.push(String(meta.linkedBeliefNodeId));\n }\n if (meta.linkedBeliefId) {\n beliefIds.push(String(meta.linkedBeliefId));\n }\n if (meta.beliefId) {\n beliefIds.push(String(meta.beliefId));\n }\n for (const id of relatedIds) {\n if (!beliefIds.includes(String(id))) {\n beliefIds.push(String(id));\n }\n }\n\n const beliefsWithDetails = await Promise.all(\n beliefIds.map(async (beliefId) => {\n // Try as epistemicNodes ID first\n try {\n const node = await ctx.db.get(beliefId as Id<\"epistemicNodes\">);\n if (node && node.nodeType === \"belief\") {\n return {\n _id: node._id,\n belief: node.canonicalText || \"\",\n confidence: (node.metadata as any)?.confidence,\n pillar: (node.metadata as any)?.category,\n beliefType: node.status,\n dependsOnCount: 0,\n cascadesToCount: 0,\n exclusiveWithCount: 0,\n };\n }\n } catch {\n // Not a valid epistemicNodes ID\n }\n return null;\n })\n );\n\n return {\n _id: q._id,\n _creationTime: q._creationTime,\n projectId: q.projectId,\n question: q.canonicalText,\n canonicalText: q.canonicalText,\n category: (meta.category as string) || \"other\",\n priority: (meta.priority as string) || \"medium\",\n status: (meta.questionStatus as string) || q.status,\n questionType:\n q.questionType || (meta.questionType as string) || \"general\",\n testType: (meta.testType as string) || undefined,\n importance: (meta.importance as number) || undefined,\n isKeyQuestion: (meta.isKeyQuestion as boolean) || false,\n conviction: meta.conviction as number | undefined,\n convictionStage: meta.convictionStage as string,\n convictionRationale: meta.convictionRationale as string | undefined,\n convictionAdvancedAt: meta.convictionAdvancedAt as number | undefined,\n convictionAdvancedBy: meta.convictionAdvancedBy as string | undefined,\n convictionUpdatedAt: meta.convictionUpdatedAt as number | undefined,\n convictionUpdatedBy: meta.convictionUpdatedBy as string | undefined,\n answer: meta.answer as string | undefined,\n answerStatus: meta.answerStatus as string | undefined,\n answerCompleteness: meta.answerCompleteness as string | undefined,\n whatWeNeed: meta.whatWeNeed as string | undefined,\n linkedWorktreeId: resolveLinkedWorktreeId(meta) || undefined,\n beliefId: meta.linkedBeliefNodeId || meta.beliefId || null,\n linkedBeliefId: meta.linkedBeliefNodeId || meta.linkedBeliefId,\n relatedBeliefIds: relatedIds,\n evidenceCount: evidenceWithDetails.length,\n evidence: evidenceWithDetails,\n testedBeliefs: beliefsWithDetails.filter(Boolean),\n createdAt: q.createdAt,\n createdBy: q.createdBy,\n updatedAt: q.updatedAt,\n metadata: q.metadata,\n };\n })\n );\n\n // Sort: in_conviction first, then scored, then by importance\n return questionsWithDetails.sort((a, b) => {\n if (\n a.convictionStage === \"in_conviction\" &&\n b.convictionStage === \"scored\"\n ) {\n return -1;\n }\n if (\n a.convictionStage === \"scored\" &&\n b.convictionStage === \"in_conviction\"\n ) {\n return 1;\n }\n return (a.importance || 5) - (b.importance || 5);\n });\n },\n});\n\n/**\n * 2. advanceToConviction - Move a question to the conviction stage\n * Ported from questions.ts line 830\n */\nexport const advanceToConviction = mutation({\n args: {\n questionId: v.id(\"epistemicNodes\"),\n userId: v.string(),\n sprintId: v.optional(v.string()),\n worktreeId: v.optional(v.string()),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const node = await ctx.db.get(args.questionId);\n if (!node || node.nodeType !== \"question\") {\n throw new Error(\"Question not found\");\n }\n\n const meta = (node.metadata || {}) as Record<string, unknown>;\n\n // Only allow advancing questions that aren't already in conviction or scored\n if (\n meta.convictionStage === \"in_conviction\" ||\n meta.convictionStage === \"scored\"\n ) {\n throw new Error(\"Question is already in conviction stage\");\n }\n\n const now = Date.now();\n\n await ctx.db.patch(args.questionId, {\n updatedAt: now,\n metadata: {\n ...meta,\n convictionStage: \"in_conviction\",\n convictionAdvancedAt: now,\n convictionAdvancedBy: args.userId,\n ...buildLinkedWorktreeMetadata(args.worktreeId ?? args.sprintId),\n },\n });\n\n // Log to epistemic audit\n try {\n await ctx.db.insert(\"epistemicAudit\", {\n entityType: \"question\",\n entityId: args.questionId,\n changeType: \"status_changed\",\n changedAt: now,\n changedBy: args.userId,\n isAgent: false,\n projectId: node.projectId,\n previousState: {\n convictionStage: meta.convictionStage || \"researching\",\n },\n newState: { convictionStage: \"in_conviction\" },\n triggeringAction: \"question_advanced_to_conviction\",\n });\n } catch (e) {\n console.error(\"[EpistemicAudit] Failed to log advanceToConviction:\", e);\n }\n\n await markProjectGraphDirty(ctx, node.projectId, node.topicId);\n\n return {\n questionId: args.questionId,\n convictionStage: \"in_conviction\",\n advancedAt: now,\n };\n },\n});\n\n/**\n * 3. updateConviction - Update conviction score for a question\n * Ported from questions.ts line 775\n */\nexport const updateConviction = mutation({\n args: {\n questionId: v.id(\"epistemicNodes\"),\n conviction: v.optional(v.number()),\n answerCompleteness: v.optional(\n v.union(\n v.literal(\"unanswered\"),\n v.literal(\"partial\"),\n v.literal(\"sufficient\"),\n v.literal(\"comprehensive\")\n )\n ),\n convictionRationale: v.optional(v.string()),\n userId: v.string(),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const node = await ctx.db.get(args.questionId);\n if (!node || node.nodeType !== \"question\") {\n throw new Error(\"Question not found\");\n }\n\n const now = Date.now();\n const meta = (node.metadata || {}) as Record<string, unknown>;\n const updates: Record<string, unknown> = { ...meta };\n\n if (args.conviction !== undefined) {\n updates.conviction = Math.max(0, Math.min(1, args.conviction));\n }\n if (args.answerCompleteness !== undefined) {\n updates.answerCompleteness = args.answerCompleteness;\n }\n if (args.convictionRationale !== undefined) {\n updates.convictionRationale = args.convictionRationale;\n }\n\n updates.convictionUpdatedAt = now;\n updates.convictionUpdatedBy = args.userId;\n\n await ctx.db.patch(args.questionId, {\n updatedAt: now,\n metadata: updates,\n });\n\n await markProjectGraphDirty(ctx, node.projectId, node.topicId);\n\n return {\n questionId: args.questionId,\n conviction: updates.conviction ?? meta.conviction,\n answerCompleteness: updates.answerCompleteness ?? meta.answerCompleteness,\n };\n },\n});\n\n/**\n * 4. finalizeConviction - Finalize conviction scoring for a question\n * Ported from questions.ts line 893\n */\nexport const finalizeConviction = mutation({\n args: {\n questionId: v.id(\"epistemicNodes\"),\n conviction: v.number(),\n answer: v.string(),\n convictionRationale: v.optional(v.string()),\n userId: v.string(),\n answerCompleteness: v.optional(\n v.union(\n v.literal(\"unanswered\"),\n v.literal(\"partial\"),\n v.literal(\"sufficient\"),\n v.literal(\"comprehensive\"),\n v.literal(\"unanswerable\")\n )\n ),\n whatWeNeed: v.optional(v.string()),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const node = await ctx.db.get(args.questionId);\n if (!node || node.nodeType !== \"question\") {\n throw new Error(\"Question not found\");\n }\n\n const now = Date.now();\n const clampedConviction = Math.max(0, Math.min(1, args.conviction));\n const isUnanswerable = args.answerCompleteness === \"unanswerable\";\n const meta = (node.metadata || {}) as Record<string, unknown>;\n\n // Determine answer completeness\n let completeness = args.answerCompleteness;\n if (!completeness) {\n completeness =\n clampedConviction >= 0.8\n ? \"comprehensive\"\n : clampedConviction >= 0.6\n ? \"sufficient\"\n : clampedConviction >= 0.3\n ? \"partial\"\n : \"unanswered\";\n }\n\n await ctx.db.patch(args.questionId, {\n updatedAt: now,\n metadata: {\n ...meta,\n convictionStage: \"scored\",\n conviction: clampedConviction,\n convictionRationale: args.convictionRationale,\n convictionUpdatedAt: now,\n convictionUpdatedBy: args.userId,\n answer: args.answer,\n answerStatus: \"final\",\n questionStatus: isUnanswerable ? \"blocked\" : \"answered\",\n answeredAt: now,\n answeredBy: args.userId,\n answerCompleteness: completeness,\n whatWeNeed: args.whatWeNeed,\n },\n });\n\n // Log to epistemic audit\n try {\n await ctx.db.insert(\"epistemicAudit\", {\n entityType: \"question\",\n entityId: args.questionId,\n changeType: \"status_changed\",\n changedAt: now,\n changedBy: args.userId,\n isAgent: false,\n projectId: node.projectId,\n previousState: {\n convictionStage: meta.convictionStage || \"in_conviction\",\n },\n newState: {\n convictionStage: \"scored\",\n conviction: clampedConviction,\n },\n triggeringAction: \"question_conviction_finalized\",\n });\n } catch (e) {\n console.error(\"[EpistemicAudit] Failed to log finalizeConviction:\", e);\n }\n\n // Schedule evidence creation from scored question\n if (node.projectId || node.topicId) {\n const beliefId =\n (meta.linkedBeliefNodeId as string) ||\n (meta.linkedBeliefId as string) ||\n (meta.beliefId as string);\n if (beliefId) {\n try {\n await ctx.scheduler.runAfter(\n 0,\n internal.epistemicQuestions.createEvidenceFromScoredQuestion,\n {\n questionNodeId: args.questionId,\n questionText: node.canonicalText || \"\",\n answerText: args.answer,\n beliefId,\n relatedBeliefIds: (meta.relatedBeliefIds as string[]) || [],\n conviction: clampedConviction,\n rationale: args.convictionRationale || \"\",\n projectId: node.projectId,\n topicId: normalizeQuestionTopicId(node.topicId),\n userId: args.userId,\n }\n );\n } catch (e) {\n console.error(\n \"[finalizeConviction] Failed to schedule evidence creation:\",\n e\n );\n }\n }\n }\n\n // Sync to Neo4j\n await ctx.scheduler.runAfter(0, internal.neo4jSync.syncNodeToNeo4j, {\n nodeId: args.questionId,\n operation: \"upsert\",\n });\n\n await markProjectGraphDirty(ctx, node.projectId, node.topicId);\n\n return {\n questionId: args.questionId,\n convictionStage: \"scored\",\n conviction: clampedConviction,\n };\n },\n});\n\n/**\n * 5. getByBeliefWithAccess - Get questions linked to a belief with access check\n * Ported from questions.ts line 1806\n */\nexport const getByBeliefWithAccess = query({\n args: {\n beliefId: v.string(),\n userId: v.string(),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n // Try to get the belief node to find its project\n let beliefNode: any = null;\n try {\n beliefNode = await ctx.db.get(args.beliefId as Id<\"epistemicNodes\">);\n } catch {\n // Not a valid epistemicNodes ID - try legacy beliefs table\n try {\n beliefNode = await ctx.db.get(args.beliefId as Id<\"epistemicNodes\">);\n } catch {\n return [];\n }\n }\n\n if (!beliefNode) {\n return [];\n }\n\n const scope = await resolveQuestionScopeOrNull(ctx, {\n projectId: beliefNode.projectId,\n topicId: normalizeQuestionTopicId(beliefNode.topicId),\n });\n const scopeId = scope ? resolveQuestionScopeId(scope) : undefined;\n if (!scope || !scopeId) {\n return [];\n }\n\n const hasAccess = await checkScopeAccess(ctx, scopeId, args.userId);\n if (!hasAccess) {\n return [];\n }\n\n const questionNodes = await getQuestionNodesForScope(ctx, scope);\n\n // Filter to those linked to this belief\n const beliefIdStr = String(args.beliefId);\n return questionNodes.filter((q) => {\n const meta = (q.metadata || {}) as Record<string, unknown>;\n // Check primary belief link\n if (String(meta.linkedBeliefNodeId || \"\") === beliefIdStr) {\n return true;\n }\n if (String(meta.linkedBeliefId || \"\") === beliefIdStr) {\n return true;\n }\n if (String(meta.beliefId || \"\") === beliefIdStr) {\n return true;\n }\n // Check related belief IDs array\n const relatedIds = (meta.relatedBeliefIds as string[]) || [];\n if (relatedIds.some((id) => String(id) === beliefIdStr)) {\n return true;\n }\n return false;\n });\n },\n});\n\n/**\n * 6. updateQuestion - Update question text and properties\n * Ported from questions.ts line 655\n */\nexport const updateQuestion = mutation({\n args: {\n questionId: v.id(\"epistemicNodes\"),\n question: v.optional(v.string()),\n category: v.optional(\n v.union(\n v.literal(\"market\"),\n v.literal(\"competition\"),\n v.literal(\"product\"),\n v.literal(\"team\"),\n v.literal(\"financials\"),\n v.literal(\"financial\"),\n v.literal(\"regulatory\"),\n v.literal(\"timing\"),\n v.literal(\"customer\"),\n v.literal(\"technology\"),\n v.literal(\"distribution\"),\n v.literal(\"strategic\"),\n v.literal(\"other\")\n )\n ),\n priority: v.optional(\n v.union(v.literal(\"high\"), v.literal(\"medium\"), v.literal(\"low\"))\n ),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const node = await ctx.db.get(args.questionId);\n if (!node || node.nodeType !== \"question\") {\n throw new Error(\"Question not found\");\n }\n\n const now = Date.now();\n const meta = (node.metadata || {}) as Record<string, unknown>;\n const metaUpdates: Record<string, unknown> = { ...meta };\n\n // Update category if provided\n if (args.category) {\n const category =\n args.category === \"financial\" ? \"financials\" : args.category;\n metaUpdates.category = category;\n }\n\n // Update priority if provided\n if (args.priority) {\n metaUpdates.priority = args.priority;\n }\n\n // SOURCE CERTIFICATION: Re-tag as proprietary if user edits text\n const patchData: Record<string, unknown> = {\n updatedAt: now,\n metadata: metaUpdates,\n };\n\n if (args.question !== undefined) {\n patchData.canonicalText = args.question;\n patchData.contentHash = generateContentHash(args.question);\n if (node.sourceType === \"ai_generated\") {\n patchData.sourceType = \"human\";\n }\n }\n\n await ctx.db.patch(args.questionId, patchData);\n\n // Sync to Neo4j\n await ctx.scheduler.runAfter(0, internal.neo4jSync.syncNodeToNeo4j, {\n nodeId: args.questionId,\n operation: \"upsert\",\n });\n\n await markProjectGraphDirty(ctx, node.projectId, node.topicId);\n },\n});\n\n/**\n * 7. linkToBelief - Link a question to a belief\n * Ported from questions.ts line 1298\n */\nexport const linkToBelief = mutation({\n args: {\n questionId: v.id(\"epistemicNodes\"),\n beliefId: v.string(), // Accept string for backward compat\n userId: v.string(),\n testType: v.optional(\n v.union(\n v.literal(\"validates\"),\n v.literal(\"invalidates\"),\n v.literal(\"clarifies\")\n )\n ),\n answerImpact: v.optional(\n v.object({\n ifYes: v.string(),\n ifNo: v.string(),\n })\n ),\n isPrimaryBelief: v.optional(v.boolean()),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const questionNode = await ctx.db.get(args.questionId);\n if (!questionNode || questionNode.nodeType !== \"question\") {\n throw new Error(\"Question not found\");\n }\n\n // Verify project access\n const questionScopeId = resolveQuestionScopeId({\n projectId: questionNode.projectId,\n topicId: normalizeQuestionTopicId(questionNode.topicId),\n });\n if (questionScopeId) {\n const hasAccess = await checkScopeAccess(\n ctx,\n questionScopeId,\n args.userId\n );\n if (!hasAccess) {\n throw new Error(\"Access denied\");\n }\n }\n\n // Resolve belief node\n let beliefNode: any = null;\n try {\n beliefNode = await ctx.db.get(args.beliefId as Id<\"epistemicNodes\">);\n } catch {\n // Try legacy beliefs table\n try {\n beliefNode = await ctx.db.get(args.beliefId as Id<\"epistemicNodes\">);\n } catch {\n throw new Error(\"Belief not found\");\n }\n }\n if (!beliefNode) {\n throw new Error(\"Belief not found\");\n }\n\n const now = Date.now();\n const meta = (questionNode.metadata || {}) as Record<string, unknown>;\n\n // Add to related beliefs (avoid duplicates)\n const currentBeliefs = (meta.relatedBeliefIds as string[]) || [];\n const beliefIdStr = String(args.beliefId);\n const newRelated = currentBeliefs.includes(beliefIdStr)\n ? currentBeliefs\n : [...currentBeliefs, beliefIdStr];\n\n const metaUpdates: Record<string, unknown> = {\n ...meta,\n relatedBeliefIds: newRelated,\n };\n\n // If this is the primary belief being tested\n if (args.isPrimaryBelief || args.testType) {\n metaUpdates.linkedBeliefNodeId = args.beliefId;\n metaUpdates.linkedBeliefId = args.beliefId;\n metaUpdates.questionType = \"belief_test\";\n if (args.testType) {\n metaUpdates.testType = args.testType;\n }\n if (args.answerImpact) {\n metaUpdates.answerImpact = args.answerImpact;\n }\n }\n\n await ctx.db.patch(args.questionId, {\n updatedAt: now,\n metadata: metaUpdates,\n });\n\n // Create edge in Neo4j (Question → Belief via \"tests\")\n try {\n const beliefGlobalId = beliefNode.globalId;\n if (beliefGlobalId && questionNode.globalId) {\n await ctx.scheduler.runAfter(0, internal.neo4jSync.syncNodeToNeo4j, {\n nodeId: args.questionId,\n operation: \"upsert\",\n });\n await ctx.scheduler.runAfter(100, internal.neo4jSync.syncNodeToNeo4j, {\n nodeId: args.beliefId as Id<\"epistemicNodes\">,\n operation: \"upsert\",\n });\n\n const edgeGlobalId = buildTestsEdgeGlobalId(\n questionNode.globalId,\n beliefGlobalId\n );\n await ctx.scheduler.runAfter(250, internal.neo4jEdgeAPI.createEdge, {\n globalId: edgeGlobalId,\n fromGlobalId: questionNode.globalId,\n toGlobalId: beliefGlobalId,\n edgeType: \"tests\",\n context: args.testType || \"tests\",\n topicId: questionNode.projectId\n ? String(questionNode.projectId)\n : undefined,\n createdBy: args.userId,\n fromNodeType: \"question\",\n toNodeType: \"belief\",\n fromLayer: \"L3\",\n toLayer: \"L3\",\n });\n }\n } catch (e) {\n console.error(\"[linkToBelief] Failed to create tests edge:\", e);\n }\n\n await markProjectGraphDirty(\n ctx,\n questionNode.projectId,\n questionNode.topicId\n );\n },\n});\n\n/**\n * 8. linkToInsight - Link a question to an insight/evidence\n * Ported from questions.ts line 1437\n */\nexport const linkToInsight = mutation({\n args: {\n questionId: v.id(\"epistemicNodes\"),\n insightId: v.id(\"epistemicNodes\"),\n userId: v.string(),\n sprintId: v.optional(v.string()),\n worktreeId: v.optional(v.string()),\n relevance: v.optional(v.number()),\n rationale: v.optional(v.string()),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const questionNode = await ctx.db.get(args.questionId);\n if (!questionNode || questionNode.nodeType !== \"question\") {\n throw new Error(\"Question not found\");\n }\n\n // Verify insight exists\n const insight = await ctx.db.get(args.insightId);\n if (!insight) {\n throw new Error(\"Insight not found\");\n }\n\n // Verify project access\n const questionScopeId = resolveQuestionScopeId({\n projectId: questionNode.projectId,\n topicId: normalizeQuestionTopicId(questionNode.topicId),\n });\n if (questionScopeId) {\n const hasAccess = await checkScopeAccess(\n ctx,\n questionScopeId,\n args.userId\n );\n if (!hasAccess) {\n throw new Error(\"Access denied\");\n }\n }\n\n const now = Date.now();\n const meta = (questionNode.metadata || {}) as Record<string, unknown>;\n\n // Add to related insights (avoid duplicates)\n const currentInsights = (meta.relatedInsightIds as string[]) || [];\n const insightIdStr = String(args.insightId);\n\n if (!currentInsights.includes(insightIdStr)) {\n await ctx.db.patch(args.questionId, {\n updatedAt: now,\n metadata: {\n ...meta,\n relatedInsightIds: [...currentInsights, insightIdStr],\n },\n });\n\n // Create questionEvidenceLinks record\n try {\n const existingLinks = await ctx.db\n .query(\"questionEvidenceLinks\")\n .withIndex(\"by_questionId\", (q) =>\n q.eq(\"questionId\", args.questionId as any)\n )\n .collect();\n\n const duplicate = existingLinks.find(\n (link) => String(link.insightId) === String(args.insightId)\n );\n\n if (!duplicate) {\n await ctx.db.insert(\"questionEvidenceLinks\", {\n questionId: args.questionId as any,\n insightId: args.insightId,\n helpsAnswer: true,\n relevance: args.relevance ?? 0.7,\n rationale: args.rationale || \"Linked from research results\",\n createdBy: args.userId,\n createdAt: now,\n });\n }\n } catch (e) {\n console.error(\n \"[linkToInsight] Failed to create questionEvidenceLink:\",\n e\n );\n }\n\n // Evidence linking now goes through graph edges (epistemicEdges),\n // not denormalized sprint.linkedEvidenceIds. Sprint table removed from K-tier.\n }\n\n await markProjectGraphDirty(\n ctx,\n questionNode.projectId,\n questionNode.topicId\n );\n },\n});\n\n/**\n * 9. unlinkInsight - Unlink an insight from a question\n * Ported from questions.ts line 1647\n */\nexport const unlinkInsight = mutation({\n args: {\n questionId: v.id(\"epistemicNodes\"),\n insightId: v.id(\"epistemicNodes\"),\n userId: v.string(),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const questionNode = await ctx.db.get(args.questionId);\n if (!questionNode || questionNode.nodeType !== \"question\") {\n throw new Error(\"Question not found\");\n }\n\n // Verify project access\n const questionScopeId = resolveQuestionScopeId({\n projectId: questionNode.projectId,\n topicId: normalizeQuestionTopicId(questionNode.topicId),\n });\n if (questionScopeId) {\n const hasAccess = await checkScopeAccess(\n ctx,\n questionScopeId,\n args.userId\n );\n if (!hasAccess) {\n throw new Error(\"Access denied\");\n }\n }\n\n const now = Date.now();\n const meta = (questionNode.metadata || {}) as Record<string, unknown>;\n\n // Remove from related insights\n const currentInsights = (meta.relatedInsightIds as string[]) || [];\n const newInsights = currentInsights.filter(\n (id) => String(id) !== String(args.insightId)\n );\n\n await ctx.db.patch(args.questionId, {\n updatedAt: now,\n metadata: {\n ...meta,\n relatedInsightIds: newInsights,\n },\n });\n\n // Remove questionEvidenceLink\n try {\n const links = await ctx.db\n .query(\"questionEvidenceLinks\")\n .withIndex(\"by_questionId\", (q) =>\n q.eq(\"questionId\", args.questionId as any)\n )\n .collect();\n\n for (const link of links) {\n if (String(link.insightId) === String(args.insightId)) {\n await ctx.db.delete(link._id);\n }\n }\n } catch (e) {\n console.error(\n \"[unlinkInsight] Failed to remove questionEvidenceLink:\",\n e\n );\n }\n\n // Remove epistemic edge if exists\n try {\n const evidenceNode = await ctx.db.get(args.insightId);\n\n if (evidenceNode && evidenceNode.nodeType === \"evidence\") {\n const edges = await ctx.db\n .query(\"epistemicEdges\")\n .withIndex(\"by_from_to\", (q) =>\n q.eq(\"fromNodeId\", evidenceNode._id).eq(\"toNodeId\", args.questionId)\n )\n .collect();\n\n for (const edge of edges) {\n if (edge.edgeType === \"derived_from\") {\n await ctx.scheduler.runAfter(0, internal.neo4jEdgeAPI.deleteEdge, {\n globalId: edge.globalId,\n });\n await ctx.db.delete(edge._id);\n }\n }\n }\n } catch (e) {\n console.error(\"[unlinkInsight] Failed to remove edge:\", e);\n }\n\n await markProjectGraphDirty(\n ctx,\n questionNode.projectId,\n questionNode.topicId\n );\n },\n});\n\n/**\n * 10. list - List questions for a project (simple query for AI tools)\n * New function that maps to getByProject semantics for callers expecting `list`\n */\nexport const list = query({\n args: {\n ...optionalScopeArgs,\n userId: v.string(),\n status: v.optional(v.string()),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const scope = await resolveQuestionScopeOrNull(ctx, args);\n if (!scope) {\n return [];\n }\n\n const scopeId = resolveQuestionScopeId(scope);\n if (!scopeId) {\n return [];\n }\n\n const hasAccess = await checkScopeAccess(ctx, scopeId, args.userId);\n if (!hasAccess) {\n return [];\n }\n\n const nodes = await getQuestionNodesForScope(ctx, scope);\n\n const filtered = args.status\n ? nodes.filter((node) =>\n matchesRequestedQuestionStatus(node, args.status!)\n )\n : nodes.filter(isActiveQuestionNode);\n\n // Map to a flattened format that callers expect\n return filtered.map(flattenInternalQuestionNode);\n },\n});\n\n/**\n * 11. getByPillar - Get questions by pillar/category with linked beliefs\n * Ported from questions.ts line 2526\n */\nexport const getByPillar = query({\n args: {\n ...optionalScopeArgs,\n pillar: v.string(),\n includeAnswered: v.optional(v.boolean()),\n userId: v.string(),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const scope = await resolveQuestionScopeOrNull(ctx, args);\n if (!scope) {\n return { questions: [], beliefs: [] };\n }\n\n const scopeId = resolveQuestionScopeId(scope);\n if (!scopeId) {\n return { questions: [], beliefs: [] };\n }\n\n const hasAccess = await checkScopeAccess(ctx, scopeId, args.userId);\n if (!hasAccess) {\n return { questions: [], beliefs: [] };\n }\n\n // Get all belief nodes in this pillar\n const allBeliefNodes = await ctx.db\n .query(\"epistemicNodes\")\n .withIndex(\"by_topic_type\", (q) =>\n q.eq(\"topicId\", scope.topicId).eq(\"nodeType\", \"belief\")\n )\n .collect();\n\n const beliefs = allBeliefNodes.filter((n) => {\n const meta = (n.metadata || {}) as Record<string, unknown>;\n return (\n (meta.category === args.pillar ||\n meta.topic === args.pillar ||\n meta.pillar === args.pillar) &&\n n.status !== \"archived\"\n );\n });\n\n if (beliefs.length === 0) {\n return { questions: [], beliefs: [] };\n }\n\n const beliefIds = new Set(beliefs.map((b) => String(b._id)));\n const beliefMap = new Map(\n beliefs.map((b) => [String(b._id), b.canonicalText || \"\"])\n );\n\n // Get all question nodes in the project\n const questionNodes = await getQuestionNodesForScope(ctx, scope);\n\n // Filter to questions linked to these beliefs\n const pillarQuestions = questionNodes.filter((q) => {\n const meta = (q.metadata || {}) as Record<string, unknown>;\n const linkedId = String(\n meta.linkedBeliefNodeId || meta.linkedBeliefId || meta.beliefId || \"\"\n );\n if (linkedId && beliefIds.has(linkedId)) {\n return true;\n }\n const relatedIds = (meta.relatedBeliefIds as string[]) || [];\n return relatedIds.some((id) => beliefIds.has(String(id)));\n });\n\n // Optionally filter out answered questions\n const includeAnswered = args.includeAnswered ?? true;\n const filteredQuestions = includeAnswered\n ? pillarQuestions\n : pillarQuestions.filter((q) => {\n const meta = (q.metadata || {}) as Record<string, unknown>;\n return meta.questionStatus !== \"answered\";\n });\n\n // Enrich with belief text\n const enrichedQuestions = filteredQuestions.map((q) => {\n const meta = (q.metadata || {}) as Record<string, unknown>;\n const linkedId = String(\n meta.linkedBeliefNodeId || meta.linkedBeliefId || meta.beliefId || \"\"\n );\n return {\n _id: q._id,\n _creationTime: q._creationTime,\n projectId: q.projectId,\n question: q.canonicalText,\n canonicalText: q.canonicalText,\n category: (meta.category as string) || \"other\",\n priority: (meta.priority as string) || \"medium\",\n status: (meta.questionStatus as string) || q.status,\n questionType:\n q.questionType || (meta.questionType as string) || \"general\",\n beliefId: linkedId || undefined,\n beliefText: linkedId ? beliefMap.get(linkedId) : undefined,\n createdAt: q.createdAt,\n createdBy: q.createdBy,\n updatedAt: q.updatedAt,\n };\n });\n\n // Sort by priority then creation date\n const priorityOrder: Record<string, number> = {\n high: 0,\n medium: 1,\n low: 2,\n };\n enrichedQuestions.sort((a, b) => {\n const aPriority = priorityOrder[a.priority || \"medium\"] ?? 1;\n const bPriority = priorityOrder[b.priority || \"medium\"] ?? 1;\n if (aPriority !== bPriority) {\n return aPriority - bPriority;\n }\n return (b.createdAt || 0) - (a.createdAt || 0);\n });\n\n return {\n questions: enrichedQuestions,\n beliefs: beliefs.map((b) => ({\n _id: b._id,\n belief: b.canonicalText,\n pillar:\n ((b.metadata as any)?.category as string) ||\n ((b.metadata as any)?.pillar as string),\n confidence: (b.metadata as any)?.confidence,\n })),\n };\n },\n});\n\n/**\n * 12. consolidate - Consolidate multiple questions into one\n * Ported from questions.ts line 2619\n */\nexport const consolidate = mutation({\n args: {\n ...optionalScopeArgs,\n questionIds: v.array(v.string()), // Accept string[] for backward compat\n consolidatedQuestion: v.string(),\n consolidationRationale: v.optional(v.string()),\n linkedBeliefIds: v.optional(v.array(v.string())),\n priority: v.optional(\n v.union(v.literal(\"high\"), v.literal(\"medium\"), v.literal(\"low\"))\n ),\n sprintId: v.optional(v.string()),\n consolidatedBy: v.string(),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const scope = await resolveTopicProjectScope(ctx, {\n projectId: args.projectId,\n topicId: args.topicId,\n });\n const scopeId = resolveQuestionScopeId(scope);\n if (!scopeId) {\n return [] as any; // graceful: topicId migration\n }\n const hasAccess = await checkScopeAccess(ctx, scopeId, args.consolidatedBy);\n if (!hasAccess) {\n throw new Error(\"Access denied\");\n }\n\n if (args.questionIds.length < 2) {\n throw new Error(\"At least 2 questions required for consolidation\");\n }\n\n // Fetch the original questions\n const originalQuestions = await Promise.all(\n args.questionIds.map(async (qid) => {\n try {\n return await ctx.db.get(qid as Id<\"epistemicNodes\">);\n } catch {\n return null;\n }\n })\n );\n\n // Validate all questions exist and belong to this scope\n const validQuestions = originalQuestions.filter((q) => {\n if (!q || q.nodeType !== \"question\") {\n return false;\n }\n if (scope.topicId) {\n return (\n String(q.topicId) === String(scope.topicId) ||\n (!q.topicId &&\n scope.projectId !== undefined &&\n String(q.projectId) === String(scope.projectId))\n );\n }\n return String(q.projectId) === String(scope.projectId);\n });\n if (validQuestions.length !== args.questionIds.length) {\n throw new Error(\n \"Some questions not found or do not belong to this topic scope\"\n );\n }\n\n // Determine priority\n const priorityOrder: Record<string, number> = {\n high: 0,\n medium: 1,\n low: 2,\n };\n let bestPriority = args.priority;\n if (!bestPriority) {\n let bestScore = 2;\n for (const q of validQuestions) {\n const meta = (q?.metadata || {}) as Record<string, unknown>;\n const score = priorityOrder[(meta.priority as string) || \"medium\"] ?? 1;\n if (score < bestScore) {\n bestScore = score;\n bestPriority =\n (meta.priority as \"high\" | \"medium\" | \"low\") || \"medium\";\n }\n }\n }\n\n // Collect linked beliefs\n const linkedBeliefSet = new Set<string>();\n if (args.linkedBeliefIds) {\n for (const bid of args.linkedBeliefIds) {\n linkedBeliefSet.add(String(bid));\n }\n } else {\n for (const q of validQuestions) {\n const meta = (q?.metadata || {}) as Record<string, unknown>;\n if (meta.linkedBeliefNodeId) {\n linkedBeliefSet.add(String(meta.linkedBeliefNodeId));\n }\n if (meta.linkedBeliefId) {\n linkedBeliefSet.add(String(meta.linkedBeliefId));\n }\n }\n }\n\n // Determine category\n let category = \"other\";\n if (linkedBeliefSet.size > 0) {\n const firstBeliefId = Array.from(linkedBeliefSet)[0];\n try {\n const belief = await ctx.db.get(firstBeliefId as Id<\"epistemicNodes\">);\n if (belief) {\n const bMeta = (belief.metadata || {}) as Record<string, unknown>;\n category =\n (bMeta.category as string) || (bMeta.pillar as string) || \"other\";\n }\n } catch {\n // Ignore\n }\n }\n\n // Create the new consolidated question in epistemicNodes\n const now = Date.now();\n const globalId = generateGlobalId();\n const contentHash = generateContentHash(args.consolidatedQuestion);\n\n const newNodeId = await ctx.db.insert(\"epistemicNodes\", {\n globalId,\n projectId: scope.projectId,\n topicId: scope.topicId,\n nodeType: \"question\",\n canonicalText: args.consolidatedQuestion,\n contentHash,\n status: \"active\",\n epistemicLayer: \"L3\",\n sourceType: \"human\",\n createdAt: now,\n updatedAt: now,\n createdBy: args.consolidatedBy,\n metadata: {\n category,\n priority: bestPriority || \"medium\",\n source: \"consolidated\",\n questionStatus: \"open\",\n linkedBeliefNodeId:\n linkedBeliefSet.size > 0 ? Array.from(linkedBeliefSet)[0] : undefined,\n consolidationMetadata: {\n originalQuestionIds: args.questionIds,\n rationale: args.consolidationRationale,\n consolidatedAt: now,\n consolidatedBy: args.consolidatedBy,\n },\n },\n });\n\n // Archive the original questions\n for (const qid of args.questionIds) {\n try {\n const node = await ctx.db.get(qid as Id<\"epistemicNodes\">);\n if (node) {\n const meta = (node.metadata || {}) as Record<string, unknown>;\n await ctx.db.patch(qid as Id<\"epistemicNodes\">, {\n status: \"archived\",\n updatedAt: now,\n metadata: {\n ...meta,\n questionStatus: \"archived\",\n archivedAt: now,\n archivedReason: `Consolidated into question ${newNodeId}`,\n consolidatedIntoId: newNodeId,\n },\n });\n }\n } catch {\n // Ignore invalid IDs\n }\n }\n\n // Sprint linking removed — K-tier uses worktrees exclusively.\n // Worktree question targets are managed via worktree.targetQuestionIds.\n\n // Schedule Neo4j sync\n await ctx.scheduler.runAfter(0, internal.neo4jSync.syncNodeToNeo4j, {\n nodeId: newNodeId,\n operation: \"upsert\",\n });\n\n await markProjectGraphDirty(\n ctx,\n scope.projectId,\n normalizeQuestionTopicId(scope.topicId)\n );\n\n return {\n newQuestionId: newNodeId,\n archivedCount: args.questionIds.length,\n linkedBeliefs: Array.from(linkedBeliefSet),\n };\n },\n});\n\n/**\n * 13. deleteQuestion - Archive a question (soft delete)\n * Ported from questions.ts line 1257\n */\nexport const deleteQuestion = mutation({\n args: {\n questionId: v.id(\"epistemicNodes\"),\n userId: v.string(),\n runtimeToolName: v.optional(v.string()),\n runtimePackKey: v.optional(v.string()),\n runtimePackInstallScope: v.optional(\n v.union(v.literal(\"tenant\"), v.literal(\"workspace\"))\n ),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const node = await ctx.db.get(args.questionId);\n if (!node || node.nodeType !== \"question\") {\n throw new Error(\"Question not found\");\n }\n assertTenantPackWorkspaceMutationAllowed({\n runtime: resolveRuntimePackMutationContext(args),\n target: await resolveNodeScopeForWorkspaceIsolation(ctx, node),\n mutationName: \"epistemicQuestions.deleteQuestion\",\n });\n\n const now = Date.now();\n const meta = (node.metadata || {}) as Record<string, unknown>;\n\n // Soft-delete: set status to archived (never hard-delete)\n await ctx.db.patch(args.questionId, {\n status: \"archived\",\n updatedAt: now,\n metadata: {\n ...meta,\n questionStatus: \"archived\",\n archivedAt: now,\n archivedBy: args.userId,\n },\n });\n\n // Log to audit\n await ctx.db.insert(\"epistemicAudit\", {\n entityType: \"question\",\n entityId: args.questionId,\n changeType: \"status_changed\",\n changedAt: now,\n changedBy: args.userId,\n isAgent: false,\n projectId: node.projectId,\n previousState: {\n status: meta.questionStatus || node.status,\n },\n newState: { status: \"archived\" },\n });\n\n // Sync to Neo4j\n await ctx.scheduler.runAfter(0, internal.neo4jSync.syncNodeToNeo4j, {\n nodeId: args.questionId,\n operation: \"upsert\",\n });\n\n await markProjectGraphDirty(ctx, node.projectId, node.topicId);\n },\n});\n\n/**\n * 14. markAnsweredWithArtifact - Mark question as answered with a specific artifact\n * Ported from questions.ts line 1728\n */\nexport const markAnsweredWithArtifact = mutation({\n args: {\n questionId: v.id(\"epistemicNodes\"),\n artifactId: v.id(\"finalArtifacts\"),\n answer: v.optional(v.string()),\n userId: v.string(),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const node = await ctx.db.get(args.questionId);\n if (!node || node.nodeType !== \"question\") {\n throw new Error(\"Question not found\");\n }\n\n // Verify artifact exists\n const artifact = await resolveGraphPrimitivesAppResolvers(\n ctx\n ).getFinalArtifact(ctx, args.artifactId);\n if (!artifact) {\n throw new Error(\"Artifact not found\");\n }\n\n // Verify project access\n const scopeId = resolveQuestionScopeId({\n projectId: node.projectId,\n topicId: normalizeQuestionTopicId(node.topicId),\n });\n if (scopeId) {\n const hasAccess = await checkScopeAccess(ctx, scopeId, args.userId);\n if (!hasAccess) {\n throw new Error(\"Access denied\");\n }\n }\n\n const now = Date.now();\n const meta = (node.metadata || {}) as Record<string, unknown>;\n\n await ctx.db.patch(args.questionId, {\n updatedAt: now,\n metadata: {\n ...meta,\n questionStatus: \"answered\",\n answeringArtifactId: args.artifactId,\n answer: args.answer,\n answeredAt: now,\n answeredBy: args.userId,\n },\n });\n\n // Sync to Neo4j\n await ctx.scheduler.runAfter(0, internal.neo4jSync.syncNodeToNeo4j, {\n nodeId: args.questionId,\n operation: \"upsert\",\n });\n\n await markProjectGraphDirty(ctx, node.projectId, node.topicId);\n },\n});\n\n/**\n * 15. getQuestionClusterPositions - Get cluster positions for visualization\n * Ported from questions.ts line 2788\n */\nexport const getQuestionClusterPositions = query({\n args: {\n ...optionalScopeArgs,\n userId: v.string(),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n let scope:\n | Awaited<ReturnType<typeof resolveTopicProjectScope>>\n | null = null;\n try {\n scope = await resolveTopicProjectScope(ctx, {\n projectId: args.projectId,\n topicId: args.topicId,\n });\n } catch {\n return {\n positions: {},\n counts: {\n cluster: 0,\n sprintLinked: 0,\n baseline: 0,\n total: 0,\n },\n };\n }\n\n // Get all question nodes for this project\n const questionNodes = await ctx.db\n .query(\"epistemicNodes\")\n .withIndex(\"by_topic_type\", (q) =>\n q.eq(\"topicId\", scope.topicId).eq(\"nodeType\", \"question\")\n )\n .collect();\n const activeQuestionNodes = questionNodes.filter(isActiveQuestionNode);\n\n // Build result mapping\n const positions: Record<string, \"cluster\" | \"sprint_linked\" | \"baseline\"> =\n {};\n let clusterCount = 0;\n let sprintLinkedCount = 0;\n let baselineCount = 0;\n\n for (const question of activeQuestionNodes) {\n const id = question._id.toString();\n const meta = (question.metadata || {}) as Record<string, unknown>;\n const questionType =\n typeof (question as any).questionType === \"string\"\n ? (question as any).questionType\n : typeof meta.questionType === \"string\"\n ? meta.questionType\n : undefined;\n\n // Questions with questionType === \"belief_test\" or testType set are cluster questions\n if (questionType === \"belief_test\" || meta.testType) {\n positions[id] = \"cluster\";\n clusterCount++;\n }\n // Questions linked to a sprint but not belief_test are sprint_linked\n else if (resolveLinkedWorktreeId(meta)) {\n positions[id] = \"sprint_linked\";\n sprintLinkedCount++;\n }\n // Everything else is baseline/raw\n else {\n positions[id] = \"baseline\";\n baselineCount++;\n }\n }\n\n return {\n positions,\n counts: {\n cluster: clusterCount,\n sprintLinked: sprintLinkedCount,\n baseline: baselineCount,\n total: activeQuestionNodes.length,\n },\n };\n },\n});\n"]}
|